Version 2.15.0-66.0.dev

Merge commit 'c63c1e5cf7ee2437698283633e63beab14865fc5' into 'dev'
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index dd94f01..4a5235a 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -93,6 +93,9 @@
   CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
   CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IS_NOT_SWITCH_EXPRESSION_SUBTYPE,
   CompileTimeErrorCode.CAST_TO_NON_TYPE,
+  CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER,
+  CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER,
+  CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER,
   CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 433fcaa..1063912 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 174;
+  static const int DATA_VERSION = 175;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index de1d124..b5bdf0d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
@@ -694,8 +693,8 @@
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
-    FlowAnalysisHelper flowAnalysisHelper = FlowAnalysisHelper(_typeSystem,
-        _testingData != null, unit.featureSet.isEnabled(Feature.non_nullable));
+    FlowAnalysisHelper flowAnalysisHelper =
+        FlowAnalysisHelper(_typeSystem, _testingData != null, unit.featureSet);
     _testingData?.recordFlowAnalysisDataForTesting(
         file.uri, flowAnalysisHelper.dataForTesting!);
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 0ea9f43..3050f37 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -761,24 +761,21 @@
 
   @override
   E? getProperty<E>(String name) {
-    if (_propertyMap == null) {
-      return null;
-    }
-    return _propertyMap![name] as E?;
+    return _propertyMap?[name] as E?;
   }
 
   @override
   void setProperty(String name, Object? value) {
     if (value == null) {
-      if (_propertyMap != null) {
-        _propertyMap!.remove(name);
-        if (_propertyMap!.isEmpty) {
+      final propertyMap = _propertyMap;
+      if (propertyMap != null) {
+        propertyMap.remove(name);
+        if (propertyMap.isEmpty) {
           _propertyMap = null;
         }
       }
     } else {
-      _propertyMap ??= HashMap<String, Object>();
-      _propertyMap![name] = value;
+      (_propertyMap ??= HashMap<String, Object>())[name] = value;
     }
   }
 
@@ -10032,7 +10029,7 @@
   Token? question;
 
   /// The type being named, or `null` if the AST structure has not been
-  /// resolved.
+  /// resolved, or if this is part of a [ConstructorReference].
   @override
   DartType? type;
 
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 3df0bb6..6ca554a 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
 Element? _readElement(AstNode node) {
@@ -91,6 +92,13 @@
   }
 }
 
+extension FieldDeclarationExtension on FieldDeclaration {
+  /// Return the element of the first field.
+  FieldElementImpl get firstElement {
+    return fields.variables.first.declaredElement as FieldElementImpl;
+  }
+}
+
 extension FormalParameterExtension on FormalParameter {
   bool get isOfLocalFunction {
     return thisOrAncestorOfType<FunctionBody>() != null;
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index b29a139..c4bf424 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -1091,6 +1091,11 @@
   }
 
   @override
+  DartObjectImpl? visitConstructorReference(ConstructorReference node) {
+    return _getConstantValue(node, node.constructorName.staticElement);
+  }
+
+  @override
   DartObjectImpl visitDoubleLiteral(DoubleLiteral node) {
     return DartObjectImpl(
       typeSystem,
@@ -1349,10 +1354,11 @@
 
   @override
   DartObjectImpl? visitSimpleIdentifier(SimpleIdentifier node) {
-    if (_lexicalEnvironment != null &&
-        _lexicalEnvironment!.containsKey(node.name)) {
-      return _lexicalEnvironment![node.name];
+    var value = _lexicalEnvironment?[node.name];
+    if (value != null) {
+      return value;
     }
+
     return _getConstantValue(node, node.staticElement);
   }
 
@@ -1594,6 +1600,12 @@
       if (variableElement.isConst && value != null) {
         return value.value;
       }
+    } else if (variableElement is ConstructorElement) {
+      return DartObjectImpl(
+        typeSystem,
+        node.typeOrThrow,
+        FunctionState(variableElement),
+      );
     } else if (variableElement is ExecutableElement) {
       var function = element as ExecutableElement;
       if (function.isStatic) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 57d2d82..446a47a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -417,7 +417,7 @@
 
 /// An [AbstractClassElementImpl] which is a class.
 class ClassElementImpl extends AbstractClassElementImpl
-    with TypeParameterizedElementMixin {
+    with TypeParameterizedElementMixin, HasMacroExecutionErrors {
   /// The superclass of the class, or `null` for [Object].
   InterfaceType? _supertype;
 
@@ -448,10 +448,6 @@
   /// TODO(scheglov) implement as modifier
   bool _isSimplyBounded = true;
 
-  /// The list of errors recorded during execution of macro builders
-  /// over this class.
-  List<macro.MacroExecutionError> macroExecutionErrors = [];
-
   ElementLinkedData? linkedData;
 
   /// Initialize a newly created class element to have the given [name] at the
@@ -3300,6 +3296,7 @@
 
 /// A concrete implementation of a [FieldElement].
 class FieldElementImpl extends PropertyInducingElementImpl
+    with HasMacroExecutionErrors
     implements FieldElement {
   /// True if this field inherits from a covariant parameter. This happens
   /// when it overrides a field in a supertype that is covariant.
@@ -3548,6 +3545,12 @@
   }
 }
 
+mixin HasMacroExecutionErrors {
+  /// The list of errors recorded during execution of macro builders
+  /// over this element.
+  List<macro.MacroExecutionError> macroExecutionErrors = [];
+}
+
 /// This interface is implemented by [Element]s that can be added by macros.
 abstract class HasMacroGenerationData {
   /// If this element was added by a macro, the code of a declaration that
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 70109d0..359d754 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -700,8 +700,8 @@
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
-    FlowAnalysisHelper flowAnalysisHelper = FlowAnalysisHelper(
-        _typeSystem, false, unit.featureSet.isEnabled(Feature.non_nullable));
+    FlowAnalysisHelper flowAnalysisHelper =
+        FlowAnalysisHelper(_typeSystem, false, unit.featureSet);
 
     var resolverVisitor = ResolverVisitor(
         _inheritance, _libraryElement, source, _typeProvider, errorListener,
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index 4fd6268..4066201 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -390,20 +390,12 @@
     return constructorReference;
   }
 
-  AstNode _toConstructorReference_propertyAccess({
+  ConstructorReference _toConstructorReference_propertyAccess({
     required PropertyAccess node,
     required Identifier receiver,
     required TypeArgumentList typeArguments,
     required ClassElement classElement,
   }) {
-    var name = node.propertyName.name;
-    var constructorElement = name == 'new'
-        ? classElement.unnamedConstructor
-        : classElement.getNamedConstructor(name);
-    if (constructorElement == null) {
-      return node;
-    }
-
     var operator = node.operator;
 
     var typeName = astFactory.typeName(receiver, typeArguments);
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index d569e12..6ec66b7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -69,8 +69,10 @@
 
     // Report an error if not already reported by the parser.
     if (operator != TokenType.BANG_EQ_EQ && operator != TokenType.EQ_EQ_EQ) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.NOT_BINARY_OPERATOR, node, [operator.lexeme]);
+      _errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.NOT_BINARY_OPERATOR,
+          node.operator,
+          [operator.lexeme]);
     }
 
     _resolveUnsupportedOperator(node);
diff --git a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
index 35706f4..e70c49d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -3,9 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
@@ -36,12 +38,47 @@
         [],
       );
     }
+    var name = node.constructorName.name;
+    if (element == null && name != null) {
+      // The illegal construction, which looks like a type-instantiated
+      // constructor tearoff, may be an attempt to reference a member on
+      // [enclosingElement]. Try to provide a helpful error, and fall back to
+      // "unknown constructor."
+      var enclosingElement = node.constructorName.type.name.staticElement;
+      if (enclosingElement is TypeAliasElement) {
+        enclosingElement = enclosingElement.aliasedType.element;
+      }
+      // TODO(srawlins): Handle `enclosingElement` being a functio typedef:
+      // typedef F<T> = void Function(); var a = F<int>.extensionOnType;`.
+      // This is illegal.
+      if (enclosingElement is ClassElement) {
+        var method = enclosingElement.getMethod(name.name) ??
+            enclosingElement.getGetter(name.name) ??
+            enclosingElement.getSetter(name.name);
+        if (method != null) {
+          var error = method.isStatic
+              ? CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER
+              : CompileTimeErrorCode
+                  .CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER;
+          _resolver.errorReporter.reportErrorForNode(
+            error,
+            node,
+            [name.name],
+          );
+        } else {
+          _resolver.errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER,
+            node,
+            [enclosingElement.name, name.name],
+          );
+        }
+      }
+    }
     _inferArgumentTypes(node);
   }
 
   void _inferArgumentTypes(ConstructorReferenceImpl node) {
     var constructorName = node.constructorName;
-    var typeName = constructorName.type;
     var elementToInfer = _resolver.inferenceHelper.constructorElementToInfer(
       constructorName: constructorName,
       definingLibrary: _resolver.definingLibrary,
@@ -71,20 +108,34 @@
           node, constructorName.name!, constructorType) as FunctionType?;
 
       if (inferred != null) {
-        typeName.type = inferred.returnType;
+        var inferredReturnType = inferred.returnType as InterfaceType;
 
         // Update the static element as well. This is used in some cases, such
         // as computing constant values. It is stored in two places.
-        var constructorElement = ConstructorMember.from(
-          rawElement,
-          inferred.returnType as InterfaceType,
-        );
-        constructorName.staticElement = constructorElement;
-        constructorName.name?.staticElement = constructorElement;
+        var constructorElement =
+            ConstructorMember.from(rawElement, inferredReturnType);
+
+        constructorName.staticElement = constructorElement.declaration;
+        constructorName.name?.staticElement = constructorElement.declaration;
         node.staticType = inferred;
+        // TODO(srawlins): Always set the TypeName's type to `null`, here, and
+        // in the "else" case below, at the very end of [_inferArgumentTypes].
+        // This requires refactoring how type arguments are checked against
+        // bounds, as this is currently always done with the [TypeName], in
+        // type_argument_verifier.dart.
+        if (inferred.typeFormals.isNotEmpty) {
+          constructorName.type.type = null;
+        } else {
+          constructorName.type.type = inferredReturnType;
+        }
       }
     } else {
-      node.staticType = node.constructorName.staticElement!.type;
+      var constructorElement = constructorName.staticElement;
+      if (constructorElement == null) {
+        node.staticType = DynamicTypeImpl.instance;
+      } else {
+        node.staticType = constructorElement.type;
+      }
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index 5b6a4fb..ee6db4b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -13,7 +14,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart' show TypeSystemImpl;
 import 'package:analyzer/src/generated/migration.dart';
-import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
 
 /// Data gathered by flow analysis, retained for testing purposes.
@@ -69,19 +69,28 @@
 
   final bool isNonNullableByDefault;
 
+  /// Indicates whether initializers of implicitly typed variables should be
+  /// accounted for by SSA analysis.  (In an ideal world, they always would be,
+  /// but due to https://github.com/dart-lang/language/issues/1785, they weren't
+  /// always, and we need to be able to replicate the old behavior when
+  /// analyzing old language versions).
+  final bool respectImplicitlyTypedVarInitializers;
+
   /// The current flow, when resolving a function body, or `null` otherwise.
   FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>?
       flow;
 
   FlowAnalysisHelper(TypeSystemImpl typeSystem, bool retainDataForTesting,
-      bool isNonNullableByDefault)
-      : this._(
-            TypeSystemTypeOperations(typeSystem),
+      FeatureSet featureSet)
+      : this._(TypeSystemTypeOperations(typeSystem),
             retainDataForTesting ? FlowAnalysisDataForTesting() : null,
-            isNonNullableByDefault);
+            isNonNullableByDefault: featureSet.isEnabled(Feature.non_nullable),
+            respectImplicitlyTypedVarInitializers:
+                featureSet.isEnabled(Feature.constructor_tearoffs));
 
-  FlowAnalysisHelper._(
-      this._typeOperations, this.dataForTesting, this.isNonNullableByDefault);
+  FlowAnalysisHelper._(this._typeOperations, this.dataForTesting,
+      {required this.isNonNullableByDefault,
+      required this.respectImplicitlyTypedVarInitializers});
 
   LocalVariableTypeProvider get localVariableTypeProvider {
     return _LocalVariableTypeProvider(this);
@@ -223,8 +232,7 @@
     flow!.labeledStatement_end();
   }
 
-  void topLevelDeclaration_enter(
-      ResolverVisitor resolver, AstNode node, FormalParameterList? parameters,
+  void topLevelDeclaration_enter(AstNode node, FormalParameterList? parameters,
       {void Function(AstVisitor<Object?> visitor)? visit}) {
     assert(flow == null);
     assignedVariables = computeAssignedVariables(node, parameters,
@@ -237,7 +245,7 @@
         ? FlowAnalysis<AstNode, Statement, Expression, PromotableElement,
                 DartType>(_typeOperations, assignedVariables!,
             respectImplicitlyTypedVarInitializers:
-                resolver.isConstructorTearoffsEnabled)
+                respectImplicitlyTypedVarInitializers)
         : FlowAnalysis<AstNode, Statement, Expression, PromotableElement,
             DartType>.legacy(_typeOperations, assignedVariables!);
   }
@@ -349,14 +357,13 @@
   final MigrationResolutionHooks migrationResolutionHooks;
 
   FlowAnalysisHelperForMigration(TypeSystemImpl typeSystem,
-      this.migrationResolutionHooks, bool isNonNullableByDefault)
-      : super(typeSystem, false, isNonNullableByDefault);
+      this.migrationResolutionHooks, FeatureSet featureSet)
+      : super(typeSystem, false, featureSet);
 
   @override
-  void topLevelDeclaration_enter(
-      ResolverVisitor resolver, AstNode node, FormalParameterList? parameters,
+  void topLevelDeclaration_enter(AstNode node, FormalParameterList? parameters,
       {void Function(AstVisitor<Object?> visitor)? visit}) {
-    super.topLevelDeclaration_enter(resolver, node, parameters, visit: visit);
+    super.topLevelDeclaration_enter(node, parameters, visit: visit);
     migrationResolutionHooks.setFlowAnalysis(flow);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
index 3654269..1e41759 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
@@ -45,7 +45,7 @@
 
     InferenceContext.setTypeFromNode(initializer, node);
     if (isTopLevel) {
-      _resolver.flowAnalysis.topLevelDeclaration_enter(_resolver, node, null);
+      _resolver.flowAnalysis.topLevelDeclaration_enter(node, null);
     } else if (element.isLate) {
       _resolver.flowAnalysis.flow?.lateInitializer_begin(node);
     }
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 5425f5e..d77a5bb 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -1585,11 +1585,9 @@
       }
 
       for (var param in parameterList.parameters) {
-        if (param is FormalParameter) {
-          // Param is defined.
-          if (param.identifier?.name == unlessParam) {
-            return null;
-          }
+        // Param is defined.
+        if (param.identifier?.name == unlessParam) {
+          return null;
         }
       }
 
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index e2e2151..0ea830f 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1518,6 +1518,43 @@
 
   /**
    * Parameters:
+   * 0: the name of the member
+   */
+  static const CompileTimeErrorCode
+      CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER = CompileTimeErrorCode(
+          'CLASS_INSTANTIATION_ACCESS_TO_MEMBER',
+          "The instance member '{0}' can't be accessed on a class "
+              "instantiation.",
+          correction:
+              "Try changing the member name to the name of a constructor.",
+          uniqueName: 'CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER');
+
+  /**
+   * Parameters:
+   * 0: the name of the member
+   */
+  static const CompileTimeErrorCode
+      CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER = CompileTimeErrorCode(
+          'CLASS_INSTANTIATION_ACCESS_TO_MEMBER',
+          "The static member '{0}' can't be accessed on a class instantiation.",
+          correction: "Try removing the type arguments from the class name, or "
+              "changing the member name to the name of a constructor.",
+          uniqueName: 'CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER');
+
+  /**
+   * Parameters:
+   * 0: the name of the member
+   */
+  static const CompileTimeErrorCode
+      CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER = CompileTimeErrorCode(
+          'CLASS_INSTANTIATION_ACCESS_TO_MEMBER',
+          "The class '{0} doesn't have a constructor named '{1}.",
+          correction: "Try invoking a different constructor, or defining a "
+              "constructor named '{1}'.",
+          uniqueName: 'CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER');
+
+  /**
+   * Parameters:
    * 0: the name of the abstract method
    * 1: the name of the enclosing class
    */
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 7ad7ac9..9415a30 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -261,6 +261,10 @@
 
     for (ClassMember member in members) {
       if (member is ConstructorDeclaration) {
+        if (member.returnType.name != element.name) {
+          // [member] is erroneous; do not count it as a possible duplicate.
+          continue;
+        }
         var name = member.name?.name ?? '';
         if (name == 'new') {
           name = '';
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 55d66ce..1bdea4c 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -206,7 +206,10 @@
   /// Verify that the type arguments in the given [typeName] are all within
   /// their bounds.
   void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
-    var type = typeName.typeOrThrow;
+    var type = typeName.type;
+    if (type == null) {
+      return;
+    }
 
     List<TypeParameterElement> typeParameters;
     List<DartType> typeArguments;
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index f716e8e..7785699 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
@@ -239,7 +238,10 @@
 
   @override
   void visitConstructorName(covariant ConstructorNameImpl node) {
-    DartType type = node.type.typeOrThrow;
+    var type = node.type.type;
+    if (type == null) {
+      return;
+    }
     if (type.isDynamic) {
       // Nothing to do.
     } else if (type is InterfaceType) {
@@ -255,18 +257,6 @@
         name.staticElement = constructor;
       }
       node.staticElement = constructor;
-    } else {
-// TODO(brianwilkerson) Report these errors.
-//      ASTNode parent = node.getParent();
-//      if (parent instanceof InstanceCreationExpression) {
-//        if (((InstanceCreationExpression) parent).isConst()) {
-//          // CompileTimeErrorCode.CONST_WITH_NON_TYPE
-//        } else {
-//          // CompileTimeErrorCode.NEW_WITH_NON_TYPE
-//        }
-//      } else {
-//        // This is part of a redirecting factory constructor; not sure which error code to use
-//      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index f68eea7..a702c1c 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -649,6 +649,10 @@
       _checkForNotInitializedNonNullableStaticField(node);
       _checkForWrongTypeParameterVarianceInField(node);
       _checkForLateFinalFieldWithConstConstructor(node);
+      _reportMacroExecutionErrors(
+        node.metadata,
+        node.firstElement.macroExecutionErrors,
+      );
       super.visitFieldDeclaration(node);
     } finally {
       _isInStaticVariableDeclaration = false;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 4fc7f04..3b579a5 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1185,7 +1185,7 @@
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
-    flowAnalysis.topLevelDeclaration_enter(this, node, node.parameters);
+    flowAnalysis.topLevelDeclaration_enter(node, node.parameters);
     flowAnalysis.executableDeclaration_enter(node, node.parameters, false);
 
     var returnType = node.declaredElement!.type.returnType;
@@ -1409,7 +1409,7 @@
       flowAnalysis.flow!.functionExpression_begin(node);
     } else {
       flowAnalysis.topLevelDeclaration_enter(
-          this, node, node.functionExpression.parameters);
+          node, node.functionExpression.parameters);
     }
     flowAnalysis.executableDeclaration_enter(
       node,
@@ -1638,7 +1638,7 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    flowAnalysis.topLevelDeclaration_enter(this, node, node.parameters);
+    flowAnalysis.topLevelDeclaration_enter(node, node.parameters);
     flowAnalysis.executableDeclaration_enter(node, node.parameters, false);
 
     DartType returnType = node.declaredElement!.returnType;
@@ -2246,7 +2246,7 @@
             errorListener,
             featureSet,
             FlowAnalysisHelperForMigration(
-                typeSystem, migrationResolutionHooks, true),
+                typeSystem, migrationResolutionHooks, featureSet),
             migrationResolutionHooks,
             migrationResolutionHooks);
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index 04523e4..411f10f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -38,8 +38,8 @@
     _errorListener,
     nameScope: _nameScope,
   );
-  late final _flowAnalysis = FlowAnalysisHelper(_unitElement.library.typeSystem,
-      false, _unitElement.library.isNonNullableByDefault);
+  late final _flowAnalysis =
+      FlowAnalysisHelper(_unitElement.library.typeSystem, false, _featureSet);
   late final _resolverVisitor = ResolverVisitor(
     _linker.inheritance,
     _unitElement.library,
@@ -58,7 +58,7 @@
     node.accept(_resolutionVisitor);
     node.accept(_scopeResolverVisitor);
     _prepareEnclosingDeclarations();
-    _flowAnalysis.topLevelDeclaration_enter(_resolverVisitor, node, null);
+    _flowAnalysis.topLevelDeclaration_enter(node, null);
     node.accept(_resolverVisitor);
     _flowAnalysis.topLevelDeclaration_exit();
   }
@@ -76,8 +76,7 @@
     visit(_scopeResolverVisitor);
 
     _prepareEnclosingDeclarations();
-    _flowAnalysis.topLevelDeclaration_enter(
-        _resolverVisitor, node, node.parameters,
+    _flowAnalysis.topLevelDeclaration_enter(node, node.parameters,
         visit: visit);
     visit(_resolverVisitor);
     _flowAnalysis.topLevelDeclaration_exit();
@@ -96,8 +95,7 @@
       node.accept(_scopeResolverVisitor);
     }
     _prepareEnclosingDeclarations();
-    _flowAnalysis.topLevelDeclaration_enter(
-        _resolverVisitor, node.parent!, null);
+    _flowAnalysis.topLevelDeclaration_enter(node.parent!, null);
     node.accept(_resolverVisitor);
     _flowAnalysis.topLevelDeclaration_exit();
   }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index f406b41..129e709 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -765,6 +765,9 @@
 
     FieldElementFlags.read(_reader, element);
     element.typeInferenceError = _readTopLevelInferenceError();
+    element.macroExecutionErrors = _reader.readTypedList(
+      _readMacroExecutionError,
+    );
     element.createImplicitAccessors(classReference, name);
 
     return element;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 44dcc92..3103c35 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -231,6 +231,10 @@
     _sink.writeBool(element is ConstFieldElementImpl);
     FieldElementFlags.write(_sink, element);
     _sink._writeTopLevelInferenceError(element.typeInferenceError);
+    _writeList(
+      element.macroExecutionErrors,
+      _sink._writeMacroExecutionError,
+    );
     _resolutionSink._writeAnnotationList(element.metadata);
     _resolutionSink.writeType(element.type);
     _resolutionSink._writeOptionalNode(element.constantInitializer);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 4b894a9..10620eb 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/ast/ast.dart' as ast;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart' as ast;
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -286,16 +287,30 @@
 
           for (var member in members) {
             if (member is ast.FieldDeclarationImpl) {
-              var annotationIndex = hasMacroAnnotation(
-                member,
-                'observable',
-              );
-              if (annotationIndex != null) {
-                macro.ObservableMacro().visitFieldDeclaration(
-                  member,
-                  classBuilder,
-                );
+              var macroExecutionErrors = <macro.MacroExecutionError>[];
+
+              void runFieldMacro(
+                String name,
+                macro.FieldDeclarationMacro Function() newInstance,
+              ) {
+                var annotationIndex = hasMacroAnnotation(member, name);
+                if (annotationIndex != null) {
+                  try {
+                    newInstance().visitFieldDeclaration(member, classBuilder);
+                  } catch (e) {
+                    macroExecutionErrors.add(
+                      macro.MacroExecutionError(
+                        annotationIndex: annotationIndex,
+                        macroName: name,
+                        message: e.toString(),
+                      ),
+                    );
+                  }
+                }
               }
+
+              runFieldMacro('observable', () => macro.ObservableMacro());
+              member.firstElement.macroExecutionErrors = macroExecutionErrors;
             }
           }
 
diff --git a/pkg/analyzer/lib/src/summary2/reference.dart b/pkg/analyzer/lib/src/summary2/reference.dart
index 23c3836..e73b634 100644
--- a/pkg/analyzer/lib/src/summary2/reference.dart
+++ b/pkg/analyzer/lib/src/summary2/reference.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/summary2/scope.dart';
 
 /// Indirection between a name and the corresponding [Element].
 ///
@@ -39,31 +38,25 @@
 
   Map<String, Reference>? _children;
 
-  /// If this reference is an import prefix, the scope of this prefix.
-  Scope? prefixScope;
-
   Reference.root() : this._(null, '');
 
   Reference._(this.parent, this.name);
 
   Iterable<Reference> get children {
-    if (_children != null) {
-      return _children!.values;
-    }
-    return const [];
+    return _children?.values ?? const [];
   }
 
-  bool get isLibrary => parent != null && parent!.isRoot;
+  bool get isLibrary => parent?.isRoot == true;
 
-  bool get isPrefix => parent != null && parent!.name == '@prefix';
+  bool get isPrefix => parent?.name == '@prefix';
 
   bool get isRoot => parent == null;
 
-  bool get isSetter => parent != null && parent!.name == '@setter';
+  bool get isSetter => parent?.name == '@setter';
 
   /// Return the child with the given name, or `null` if does not exist.
   Reference? operator [](String name) {
-    return _children != null ? _children![name] : null;
+    return _children?[name];
   }
 
   /// Return the child with the given name, create if does not exist yet.
@@ -73,7 +66,7 @@
   }
 
   void removeChild(String name) {
-    _children!.remove(name);
+    _children?.remove(name);
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index a79005d..1d3df59 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -724,11 +724,12 @@
     _definingLibrary.typeSystem = context.typeSystemLegacy;
     var inheritance = InheritanceManager3();
 
+    var featureSet = FeatureSet.forTesting();
     _visitor = ResolverVisitor(
         inheritance, _definingLibrary, source, _typeProvider, _listener,
-        featureSet: FeatureSet.forTesting(),
+        featureSet: featureSet,
         flowAnalysisHelper:
-            FlowAnalysisHelper(context.typeSystemLegacy, false, false));
+            FlowAnalysisHelper(context.typeSystemLegacy, false, featureSet));
     _resolver = _visitor.elementResolver;
   }
 
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 18d6b1a..0e2c9d5 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -517,7 +517,7 @@
         inheritance, _definingLibrary, source, _typeProvider, _listener,
         featureSet: featureSet,
         flowAnalysisHelper:
-            FlowAnalysisHelper(context.typeSystemLegacy, false, false));
+            FlowAnalysisHelper(context.typeSystemLegacy, false, featureSet));
     _analyzer = _visitor.typeAnalyzer;
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index c59ee4f..0dd6db7 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -327,7 +327,30 @@
     ]);
   }
 
-  test_error_duplicateConstructorDefault() async {
+  test_error_duplicateConstructorNamed() async {
+    await assertErrorsInCode(r'''
+class C {
+  C.foo();
+  C.foo();
+}
+''', [
+      error(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, 23, 5),
+    ]);
+  }
+
+  test_error_duplicateConstructorNamed_oneIsInvalid() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C {
+  A.foo();
+  C.foo();
+}
+''', [
+      error(ParserErrorCode.INVALID_CONSTRUCTOR_NAME, 23, 1),
+    ]);
+  }
+
+  test_error_duplicateConstructorUnnamed() async {
     await assertErrorsInCode(r'''
 class C {
   C();
@@ -338,7 +361,7 @@
     ]);
   }
 
-  test_error_duplicateConstructorDefault_bothNew() async {
+  test_error_duplicateConstructorUnnamed_bothNew() async {
     await assertErrorsInCode(r'''
 class C {
   C.new();
@@ -349,7 +372,19 @@
     ]);
   }
 
-  test_error_duplicateConstructorDefault_oneNew() async {
+  test_error_duplicateConstructorUnnamed_oneIsInvalid() async {
+    await assertErrorsInCode(r'''
+class A {}
+class C {
+  A.new();
+  C();
+}
+''', [
+      error(ParserErrorCode.INVALID_CONSTRUCTOR_NAME, 23, 1),
+    ]);
+  }
+
+  test_error_duplicateConstructorUnnamed_oneNew() async {
     await assertErrorsInCode(r'''
 class C {
   C();
@@ -360,17 +395,6 @@
     ]);
   }
 
-  test_error_duplicateConstructorName() async {
-    await assertErrorsInCode(r'''
-class C {
-  C.foo();
-  C.foo();
-}
-''', [
-      error(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, 23, 5),
-    ]);
-  }
-
   test_error_extendsNonClass_dynamic() async {
     await assertErrorsInCode(r'''
 class A extends dynamic {}
diff --git a/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
index eba7e07..087615a 100644
--- a/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
@@ -20,6 +20,28 @@
 @reflectiveTest
 class ConstructorReferenceResolution_TypeArgsTest
     extends PubPackageResolutionTest {
+  test_alias_generic_const() async {
+    await assertNoErrorsInCode('''
+class A<T, U> {
+  A.foo();
+}
+typedef TA<T, U> = A<U, T>;
+
+const a = TA<int, String>.foo;
+''');
+
+    var classElement = findElement.class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('TA<int, String>.foo;'),
+      elementMatcher(classElement.getNamedConstructor('foo')!,
+          substitution: {'T': 'String', 'U': 'int'}),
+      classElement,
+      'A<String, int> Function()',
+      expectedTypeNameType: 'A<String, int>',
+      expectedTypeNameElement: findElement.typeAlias('TA'),
+    );
+  }
+
   test_alias_generic_named() async {
     await assertNoErrorsInCode('''
 class A<T, U> {
@@ -118,6 +140,26 @@
     );
   }
 
+  test_class_generic_const() async {
+    await assertNoErrorsInCode('''
+class A<T> {
+  const A();
+}
+
+const a = A<int>.new;
+''');
+
+    var classElement = findElement.class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('A<int>.new;'),
+      elementMatcher(classElement.unnamedConstructor,
+          substitution: {'T': 'int'}),
+      classElement,
+      'A<int> Function()',
+      expectedTypeNameType: 'A<int>',
+    );
+  }
+
   test_class_generic_named() async {
     await assertNoErrorsInCode('''
 class A<T> {
@@ -210,6 +252,30 @@
     );
   }
 
+  test_class_generic_nonConstructor() async {
+    await assertErrorsInCode('''
+class A<T> {
+  static int i = 1;
+}
+
+void bar() {
+  A<int>.i;
+}
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER,
+          51, 8),
+    ]);
+
+    var classElement = findElement.class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('A<int>.i;'),
+      null,
+      classElement,
+      'dynamic',
+      expectedTypeNameType: 'A<int>',
+    );
+  }
+
   test_class_generic_unnamed() async {
     await assertNoErrorsInCode('''
 class A<T> {
@@ -509,7 +575,7 @@
     var constructorElement = classElement.getNamedConstructor('foo')!;
     assertConstructorReference(
       findNode.constructorReference('A.foo;'),
-      elementMatcher(constructorElement, substitution: {'T': 'Never'}),
+      constructorElement,
       classElement,
       'A<Never> Function()',
       expectedTypeNameType: 'A<Never>',
@@ -531,7 +597,7 @@
     var constructorElement = classElement.getNamedConstructor('foo')!;
     assertConstructorReference(
       findNode.constructorReference('A.foo;'),
-      elementMatcher(constructorElement, substitution: {'T': 'int'}),
+      constructorElement,
       classElement,
       'A<int> Function()',
       expectedTypeNameType: 'A<int>',
@@ -553,10 +619,10 @@
     var constructorElement = classElement.getNamedConstructor('foo')!;
     assertConstructorReference(
       findNode.constructorReference('A.foo;'),
-      elementMatcher(constructorElement, substitution: {'T': 'T'}),
+      constructorElement,
       classElement,
       'A<T> Function<T>()',
-      expectedTypeNameType: 'A<T>',
+      expectedTypeNameType: null,
     );
   }
 
@@ -575,10 +641,29 @@
     var constructorElement = classElement.getNamedConstructor('foo')!;
     assertConstructorReference(
       findNode.constructorReference('A.foo;'),
-      elementMatcher(constructorElement, substitution: {'T': 'T'}),
+      constructorElement,
       classElement,
       'A<T> Function<T extends num>()',
-      expectedTypeNameType: 'A<T>',
+      expectedTypeNameType: null,
+    );
+  }
+
+  test_class_nonGeneric_const() async {
+    await assertNoErrorsInCode('''
+class A {
+  const A();
+}
+
+const a1 = A.new;
+''');
+
+    var classElement = findElement.class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('A.new;'),
+      classElement.unnamedConstructor,
+      classElement,
+      'A Function()',
+      expectedTypeNameType: 'A',
     );
   }
 
@@ -624,6 +709,28 @@
     );
   }
 
+  test_typeAlias_generic_const() async {
+    await assertNoErrorsInCode('''
+class A<T> {
+  const A();
+}
+typedef TA<T> = A<T>;
+
+const a = TA.new;
+''');
+
+    var classElement = findElement.class_('A');
+    var constructorElement = classElement.unnamedConstructor!;
+    assertConstructorReference(
+      findNode.constructorReference('TA.new;'),
+      constructorElement,
+      classElement,
+      'A<T> Function<T>()',
+      expectedTypeNameType: null,
+      expectedTypeNameElement: findElement.typeAlias('TA'),
+    );
+  }
+
   test_typeAlias_generic_named_uninstantiated() async {
     await assertNoErrorsInCode('''
 class A<T, U> {
@@ -640,11 +747,32 @@
     var constructorElement = classElement.getNamedConstructor('foo')!;
     assertConstructorReference(
       findNode.constructorReference('TA.foo;'),
-      elementMatcher(constructorElement,
-          substitution: {'T': 'String', 'U': 'U'}),
+      constructorElement,
       findElement.class_('A'),
       'A<String, U> Function<U>()',
-      expectedTypeNameType: 'A<String, U>',
+      expectedTypeNameType: null,
+      expectedTypeNameElement: findElement.typeAlias('TA'),
+    );
+  }
+
+  test_typeAlias_instantiated_const() async {
+    await assertNoErrorsInCode('''
+class A<T> {
+  const A();
+}
+typedef TA = A<int>;
+
+const a = TA.new;
+''');
+
+    var classElement = findElement.class_('A');
+    var constructorElement = classElement.unnamedConstructor!;
+    assertConstructorReference(
+      findNode.constructorReference('TA.new;'),
+      elementMatcher(constructorElement, substitution: {'T': 'int'}),
+      classElement,
+      'A<int> Function()',
+      expectedTypeNameType: 'A<int>',
       expectedTypeNameElement: findElement.typeAlias('TA'),
     );
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/macro_test.dart b/pkg/analyzer/test/src/dart/resolution/macro_test.dart
index a2e3aa4..c4607c4 100644
--- a/pkg/analyzer/test/src/dart/resolution/macro_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/macro_test.dart
@@ -115,6 +115,20 @@
     ]);
   }
 
+  test_executionError_observable_implicitlyTyped() async {
+    await assertErrorsInCode(r'''
+import 'macro_annotations.dart';
+
+class A {
+  @observable
+  var _a = 0;
+}
+''', [
+      error(CompileTimeErrorCode.MACRO_EXECUTION_ERROR, 46, 11),
+      error(HintCode.UNUSED_FIELD, 64, 2),
+    ]);
+  }
+
   test_observable() async {
     var code = r'''
 import 'macro_annotations.dart';
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 45fd9a6..11dce12 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -166,7 +166,7 @@
     Object? expectedConstructorElement,
     ClassElement expectedClassElement,
     String expectedType, {
-    required String expectedTypeNameType,
+    required String? expectedTypeNameType,
     PrefixElement? expectedPrefix,
     Element? expectedTypeNameElement,
   }) {
@@ -814,7 +814,7 @@
   }
 
   void assertTypeName(
-      TypeName node, Element? expectedElement, String expectedType,
+      TypeName node, Element? expectedElement, String? expectedType,
       {Element? expectedPrefix}) {
     assertType(node, expectedType);
 
diff --git a/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart b/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart
new file mode 100644
index 0000000..a996659
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ClassInstantiationAccessToMemberTest);
+  });
+}
+
+@reflectiveTest
+class ClassInstantiationAccessToMemberTest extends PubPackageResolutionTest {
+  test_alias() async {
+    await assertErrorsInCode('''
+class A<T> {
+  int i = 1;
+}
+
+typedef TA<T> = A<T>;
+
+var x = TA<int>.i;
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER,
+          60, 9),
+    ]);
+  }
+
+  test_extensionMember() async {
+    await assertErrorsInCode('''
+class A<T> {}
+
+extension E on A {
+  int get i => 1;
+}
+
+var x = A<int>.i;
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER,
+          63, 8),
+    ]);
+  }
+
+  test_instanceMember() async {
+    await assertErrorsInCode('''
+class A<T> {
+  int i = 1;
+}
+
+var x = A<int>.i;
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER,
+          37, 8),
+    ]);
+  }
+
+  test_instanceSetter() async {
+    await assertErrorsInCode('''
+class A<T> {
+  set i(int value) {}
+}
+
+void foo() {
+  A<int>.i = 7;
+}
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER,
+          53, 8),
+    ]);
+  }
+
+  test_staticMember() async {
+    await assertErrorsInCode('''
+class A<T> {
+  static int i = 1;
+}
+
+var x = A<int>.i;
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER,
+          44, 8),
+    ]);
+  }
+
+  test_staticSetter() async {
+    await assertErrorsInCode('''
+class A<T> {
+  static set i(int value) {}
+}
+
+void bar() {
+  A<int>.i = 7;
+}
+''', [
+      error(CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER,
+          60, 8),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_binary_operator_test.dart b/pkg/analyzer/test/src/diagnostics/not_binary_operator_test.dart
index 8d80332..1b75e2d 100644
--- a/pkg/analyzer/test/src/diagnostics/not_binary_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_binary_operator_test.dart
@@ -17,7 +17,7 @@
 class NonBinaryOperatorTest extends PubPackageResolutionTest {
   test_unaryTilde() async {
     await assertErrorsInCode('var a = 5 ~ 3;', [
-      error(CompileTimeErrorCode.NOT_BINARY_OPERATOR, 8, 5),
+      error(CompileTimeErrorCode.NOT_BINARY_OPERATOR, 10, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 2d3ff59..81c9971 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -57,6 +57,8 @@
 import 'case_expression_type_is_not_switch_expression_subtype_test.dart'
     as case_expression_type_is_not_switch_expression_subtype;
 import 'cast_to_non_type_test.dart' as cast_to_non_type;
+import 'class_instantiation_access_to_member_test.dart'
+    as class_instantiation_access_to_member;
 import 'concrete_class_with_abstract_member_test.dart'
     as concrete_class_with_abstract_member;
 import 'conflicting_generic_interfaces_test.dart'
@@ -758,6 +760,7 @@
     case_expression_type_implements_equals.main();
     case_expression_type_is_not_switch_expression_subtype.main();
     cast_to_non_type.main();
+    class_instantiation_access_to_member.main();
     concrete_class_with_abstract_member.main();
     conflicting_generic_interfaces.main();
     conflicting_static_and_instance.main();
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index d2d5b8f..4c3a3e7 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -12,37 +12,37 @@
 import '../elements/types.dart';
 import 'values.dart';
 
-final _BITS32 = new BigInt.from(0xFFFFFFFF);
+final _BITS32 = BigInt.from(0xFFFFFFFF);
 
-const add = const AddOperation();
-const bitAnd = const BitAndOperation();
-const bitNot = const BitNotOperation();
-const bitOr = const BitOrOperation();
-const bitXor = const BitXorOperation();
-const booleanAnd = const BooleanAndOperation();
-const booleanOr = const BooleanOrOperation();
-const divide = const DivideOperation();
-const equal = const EqualsOperation();
-const greaterEqual = const GreaterEqualOperation();
-const greater = const GreaterOperation();
-const identity = const IdentityOperation();
-const ifNull = const IfNullOperation();
-const lessEqual = const LessEqualOperation();
-const less = const LessOperation();
-const modulo = const ModuloOperation();
-const multiply = const MultiplyOperation();
-const negate = const NegateOperation();
-const not = const NotOperation();
-const remainder = const RemainderOperation();
-const shiftLeft = const ShiftLeftOperation();
-const shiftRight = const ShiftRightOperation();
-const shiftRightUnsigned = const ShiftRightUnsignedOperation();
-const subtract = const SubtractOperation();
-const truncatingDivide = const TruncatingDivideOperation();
-const codeUnitAt = const CodeUnitAtOperation();
-const round = const RoundOperation();
-const toInt = const ToIntOperation();
-const abs = const UnfoldedUnaryOperation('abs');
+const add = AddOperation();
+const bitAnd = BitAndOperation();
+const bitNot = BitNotOperation();
+const bitOr = BitOrOperation();
+const bitXor = BitXorOperation();
+const booleanAnd = BooleanAndOperation();
+const booleanOr = BooleanOrOperation();
+const divide = DivideOperation();
+const equal = EqualsOperation();
+const greaterEqual = GreaterEqualOperation();
+const greater = GreaterOperation();
+const identity = IdentityOperation();
+const ifNull = IfNullOperation();
+const lessEqual = LessEqualOperation();
+const less = LessOperation();
+const modulo = ModuloOperation();
+const multiply = MultiplyOperation();
+const negate = NegateOperation();
+const not = NotOperation();
+const remainder = RemainderOperation();
+const shiftLeft = ShiftLeftOperation();
+const shiftRight = ShiftRightOperation();
+const shiftRightUnsigned = ShiftRightUnsignedOperation();
+const subtract = SubtractOperation();
+const truncatingDivide = TruncatingDivideOperation();
+const codeUnitAt = CodeUnitAtOperation();
+const round = RoundOperation();
+const toInt = ToIntOperation();
+const abs = UnfoldedUnaryOperation('abs');
 
 /// Returns true if [value] will turn into NaN or infinity
 /// at runtime.
@@ -56,13 +56,13 @@
     IntConstantValue intConstant = constant;
     BigInt intValue = intConstant.intValue;
     if (_integerBecomesNanOrInfinity(intValue)) {
-      return new DoubleConstantValue(intValue.toDouble());
+      return DoubleConstantValue(intValue.toDouble());
     }
     // If the integer loses precision with JavaScript numbers, use
     // the floored version JavaScript will use.
-    BigInt floorValue = new BigInt.from(intValue.toDouble());
+    BigInt floorValue = BigInt.from(intValue.toDouble());
     if (floorValue != intValue) {
-      return new IntConstantValue(floorValue);
+      return IntConstantValue(floorValue);
     }
   } else if (constant.isDouble) {
     DoubleConstantValue doubleResult = constant;
@@ -72,7 +72,7 @@
         !constant.isMinusZero) {
       double truncated = doubleValue.truncateToDouble();
       if (truncated == doubleValue) {
-        return new IntConstantValue(new BigInt.from(truncated));
+        return IntConstantValue(BigInt.from(truncated));
       }
     }
   }
@@ -80,15 +80,14 @@
 }
 
 NumConstantValue createInt(BigInt i) =>
-    _convertToJavaScriptConstant(new IntConstantValue(i));
-NumConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
-NumConstantValue _createInt32(BigInt i) => new IntConstantValue(i & _BITS32);
+    _convertToJavaScriptConstant(IntConstantValue(i));
+NumConstantValue createIntFromInt(int i) => createInt(BigInt.from(i));
+NumConstantValue _createInt32(BigInt i) => IntConstantValue(i & _BITS32);
 NumConstantValue createDouble(double d) =>
-    _convertToJavaScriptConstant(new DoubleConstantValue(d));
-StringConstantValue createString(String string) =>
-    new StringConstantValue(string);
-BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
-NullConstantValue createNull() => new NullConstantValue();
+    _convertToJavaScriptConstant(DoubleConstantValue(d));
+StringConstantValue createString(String string) => StringConstantValue(string);
+BoolConstantValue createBool(bool value) => BoolConstantValue(value);
+NullConstantValue createNull() => NullConstantValue();
 
 ListConstantValue createList(CommonElements commonElements,
     InterfaceType sourceType, List<ConstantValue> values) {
@@ -98,7 +97,7 @@
 
 ConstantValue createType(CommonElements commonElements, DartType type) {
   InterfaceType instanceType = commonElements.typeLiteralType;
-  return new TypeConstantValue(type, instanceType);
+  return TypeConstantValue(type, instanceType);
 }
 
 /// Returns true if the [constant] is an integer at runtime.
@@ -146,10 +145,10 @@
   DartType elementType = type.typeArguments.first;
   InterfaceType mapType =
       commonElements.mapType(elementType, commonElements.nullType);
-  List<NullConstantValue> nulls = new List<NullConstantValue>.filled(
-      values.length, const NullConstantValue());
+  List<NullConstantValue> nulls =
+      List<NullConstantValue>.filled(values.length, const NullConstantValue());
   MapConstantValue entries = createMap(commonElements, mapType, values, nulls);
-  return new JavaScriptSetConstant(type, entries);
+  return JavaScriptSetConstant(type, entries);
 }
 
 MapConstantValue createMap(
@@ -180,7 +179,7 @@
   // TODO(johnniwinther): Use type arguments when all uses no longer expect
   // a [FieldElement].
   var fields = <FieldEntity, ConstantValue>{field: argument};
-  return new ConstructedConstantValue(type, fields);
+  return ConstructedConstantValue(type, fields);
 }
 
 UnaryOperation lookupUnary(UnaryOperator operator) {
@@ -407,7 +406,7 @@
   BigInt foldInts(BigInt left, BigInt right) {
     // TODO(floitsch): find a better way to guard against excessive shifts to
     // the left.
-    if (right > new BigInt.from(100) || right < BigInt.zero) return null;
+    if (right > BigInt.from(100) || right < BigInt.zero) return null;
     return left << right.toInt();
   }
 
@@ -439,7 +438,7 @@
         // Example: 0xFFFFFFFF - 0x100000000 => -1.
         // We simply and with the sign-bit and multiply by two. If the sign-bit
         // was set, then the result is 0. Otherwise it will become 2^32.
-        final BigInt SIGN_BIT = new BigInt.from(0x80000000);
+        final BigInt SIGN_BIT = BigInt.from(0x80000000);
         truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
       }
       if (value != truncatedValue) {
@@ -646,7 +645,7 @@
   BigInt foldNums(num left, num right) {
     num ratio = left / right;
     if (ratio.isNaN || ratio.isInfinite) return null;
-    return new BigInt.from(ratio.truncateToDouble());
+    return BigInt.from(ratio.truncateToDouble());
   }
 
   @override
@@ -855,7 +854,7 @@
       // In order to preserve runtime semantics which says that NaN !== NaN
       // don't constant fold NaN === NaN. Otherwise the output depends on
       // inlined variables and other optimizations.
-      if (left.isNaN && right.isNaN) return new FalseConstantValue();
+      if (left.isNaN && right.isNaN) return FalseConstantValue();
       return createBool(left == right);
     }
 
@@ -866,14 +865,14 @@
     if (left.isInt && right.isInt) {
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
-      return new BoolConstantValue(leftInt.intValue == rightInt.intValue);
+      return BoolConstantValue(leftInt.intValue == rightInt.intValue);
     }
     if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
       NumConstantValue rightNum = right;
       double leftDouble = leftNum.doubleValue;
       double rightDouble = rightNum.doubleValue;
-      return new BoolConstantValue(leftDouble == rightDouble);
+      return BoolConstantValue(leftDouble == rightDouble);
     }
     return result;
   }
@@ -943,7 +942,7 @@
       double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
       if (rounded != rounded1 || rounded != rounded2) return null;
       return _convertToJavaScriptConstant(
-          new IntConstantValue(new BigInt.from(value.round())));
+          IntConstantValue(BigInt.from(value.round())));
     }
 
     if (constant.isInt) {
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 45c6f40..9972eb6 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -187,11 +187,11 @@
   @override
   bool operator ==(var other) {
     // Making this method abstract does not give us an error.
-    throw new UnsupportedError('PrimitiveConstant.==');
+    throw UnsupportedError('PrimitiveConstant.==');
   }
 
   @override
-  int get hashCode => throw new UnsupportedError('PrimitiveConstant.hashCode');
+  int get hashCode => throw UnsupportedError('PrimitiveConstant.hashCode');
 
   // Primitive constants don't have dependencies.
   @override
@@ -254,7 +254,7 @@
   factory IntConstantValue(BigInt value) {
     var existing = _cachedValues[value];
     if (existing != null) return existing;
-    var intConstantVal = new IntConstantValue._internal(value);
+    var intConstantVal = IntConstantValue._internal(value);
     var intValue = value.toInt();
     if (intValue <= -2 && intValue >= 10) {
       _cachedValues[value] = intConstantVal;
@@ -323,7 +323,7 @@
     } else if (value == 1.0) {
       return const DoubleConstantValue._internal(1.0);
     } else {
-      return new DoubleConstantValue._internal(value);
+      return DoubleConstantValue._internal(value);
     }
   }
 
@@ -387,7 +387,7 @@
 
 abstract class BoolConstantValue extends PrimitiveConstantValue {
   factory BoolConstantValue(value) {
-    return value ? new TrueConstantValue() : new FalseConstantValue();
+    return value ? TrueConstantValue() : FalseConstantValue();
   }
 
   const BoolConstantValue._internal();
@@ -425,7 +425,7 @@
   bool get boolValue => true;
 
   @override
-  FalseConstantValue negate() => new FalseConstantValue();
+  FalseConstantValue negate() => FalseConstantValue();
 
   @override
   bool operator ==(var other) => identical(this, other);
@@ -451,7 +451,7 @@
   bool get boolValue => false;
 
   @override
-  TrueConstantValue negate() => new TrueConstantValue();
+  TrueConstantValue negate() => TrueConstantValue();
 
   @override
   bool operator ==(var other) => identical(this, other);
@@ -605,7 +605,7 @@
 
   @override
   String toDartText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     _unparseTypeArguments(dartTypes, sb);
     sb.write('[');
     for (int i = 0; i < length; i++) {
@@ -618,7 +618,7 @@
 
   @override
   String toStructuredText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('ListConstant(');
     _unparseTypeArguments(dartTypes, sb);
     sb.write('[');
@@ -668,7 +668,7 @@
 
   @override
   String toDartText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     _unparseTypeArguments(dartTypes, sb);
     sb.write('{');
     sb.writeAll(values.map((v) => v.toDartText(dartTypes)), ',');
@@ -678,7 +678,7 @@
 
   @override
   String toStructuredText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('SetConstant(');
     _unparseTypeArguments(dartTypes, sb);
     sb.write('{');
@@ -753,7 +753,7 @@
 
   @override
   String toDartText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     _unparseTypeArguments(dartTypes, sb);
     sb.write('{');
     for (int i = 0; i < length; i++) {
@@ -768,7 +768,7 @@
 
   @override
   String toStructuredText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('MapConstant(');
     _unparseTypeArguments(dartTypes, sb);
     sb.write('{');
@@ -1006,7 +1006,7 @@
 
   @override
   String toDartText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write(type.element.name);
     _unparseTypeArguments(dartTypes, sb);
     sb.write('(');
@@ -1025,7 +1025,7 @@
 
   @override
   String toStructuredText(DartTypes dartTypes) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('ConstructedConstant(');
     sb.write(type);
     sb.write('(');
diff --git a/pkg/compiler/lib/src/diagnostics/code_location.dart b/pkg/compiler/lib/src/diagnostics/code_location.dart
index 17b48f6..58bc177 100644
--- a/pkg/compiler/lib/src/diagnostics/code_location.dart
+++ b/pkg/compiler/lib/src/diagnostics/code_location.dart
@@ -22,12 +22,12 @@
       int slashPos = uri.path.indexOf('/');
       if (slashPos != -1) {
         String packageName = uri.path.substring(0, slashPos);
-        return new PackageLocation(packageName);
+        return PackageLocation(packageName);
       } else {
-        return new UriLocation(uri);
+        return UriLocation(uri);
       }
     } else {
-      return new SchemeLocation(uri);
+      return SchemeLocation(uri);
     }
   }
 }
diff --git a/pkg/compiler/lib/src/diagnostics/invariant.dart b/pkg/compiler/lib/src/diagnostics/invariant.dart
index 11b446c..04a7947 100644
--- a/pkg/compiler/lib/src/diagnostics/invariant.dart
+++ b/pkg/compiler/lib/src/diagnostics/invariant.dart
@@ -43,8 +43,8 @@
   // TODO(johnniwinther): Use [spannable] and [message] to provide better
   // information on assertion errors.
   if (spannable == null) {
-    throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
+    throw SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
         'Spannable was null for failedAt. Use CURRENT_ELEMENT_SPANNABLE.');
   }
-  throw new SpannableAssertionFailure(spannable, message);
+  throw SpannableAssertionFailure(spannable, message);
 }
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index ae4793a..ffffde6 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -137,7 +137,7 @@
   final List<String> options;
 
   const MessageTemplate(this.kind, this.template,
-      {this.howToFix, this.examples, this.options: const <String>[]});
+      {this.howToFix, this.examples, this.options = const <String>[]});
 
   /// All templates used by the compiler.
   ///
@@ -150,58 +150,55 @@
     ..addAll(const <MessageKind, MessageTemplate>{
       /// Do not use this. It is here for legacy and debugging. It violates item
       /// 4 of the guide lines for error messages in the beginning of the file.
-      MessageKind.GENERIC:
-          const MessageTemplate(MessageKind.GENERIC, '#{text}'),
+      MessageKind.GENERIC: MessageTemplate(MessageKind.GENERIC, '#{text}'),
 
-      MessageKind.CANNOT_RESOLVE: const MessageTemplate(
+      MessageKind.CANNOT_RESOLVE: MessageTemplate(
           MessageKind.CANNOT_RESOLVE, "Cannot resolve '#{name}'."),
 
-      MessageKind.NOT_A_COMPILE_TIME_CONSTANT: const MessageTemplate(
+      MessageKind.NOT_A_COMPILE_TIME_CONSTANT: MessageTemplate(
           MessageKind.NOT_A_COMPILE_TIME_CONSTANT,
           "Not a compile-time constant."),
 
-      MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS: const MessageTemplate(
+      MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS: MessageTemplate(
           MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS,
           "Cycle in the compile-time constant computation."),
 
-      MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER: const MessageTemplate(
+      MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER: MessageTemplate(
           MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
           "Cannot resolve setter."),
 
-      MessageKind.STRING_EXPECTED: const MessageTemplate(
-          MessageKind.STRING_EXPECTED,
+      MessageKind.STRING_EXPECTED: MessageTemplate(MessageKind.STRING_EXPECTED,
           "Expected a 'String', but got an instance of '#{type}'."),
 
-      MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER: const MessageTemplate(
+      MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER: MessageTemplate(
           MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER,
           "Js-interop members must be 'external'."),
 
-      MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED:
-          const MessageTemplate(
-              MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED,
-              "Fields in js-interop classes are not supported.",
-              howToFix: "Try replacing the field with an "
-                  "external getter and/or setter."),
-      MessageKind.JS_INTEROP_FIELD_NOT_SUPPORTED: const MessageTemplate(
+      MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED: MessageTemplate(
+          MessageKind.IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED,
+          "Fields in js-interop classes are not supported.",
+          howToFix: "Try replacing the field with an "
+              "external getter and/or setter."),
+      MessageKind.JS_INTEROP_FIELD_NOT_SUPPORTED: MessageTemplate(
           MessageKind.JS_INTEROP_FIELD_NOT_SUPPORTED,
           "Field can't be marked as js-interop.",
           howToFix: "Try replacing the field with an "
               "external getter and/or setter."),
 
-      MessageKind.LIBRARY_NOT_FOUND: const MessageTemplate(
+      MessageKind.LIBRARY_NOT_FOUND: MessageTemplate(
           MessageKind.LIBRARY_NOT_FOUND, "Library not found '#{resolvedUri}'."),
 
-      MessageKind.INVALID_PACKAGE_CONFIG: const MessageTemplate(
+      MessageKind.INVALID_PACKAGE_CONFIG: MessageTemplate(
           MessageKind.INVALID_PACKAGE_CONFIG,
           """Package config file '#{uri}' is invalid.
 #{exception}""",
           howToFix: DONT_KNOW_HOW_TO_FIX),
 
-      MessageKind.INVALID_PACKAGE_URI: const MessageTemplate(
+      MessageKind.INVALID_PACKAGE_URI: MessageTemplate(
           MessageKind.INVALID_PACKAGE_URI,
           "'#{uri}' is not a valid package URI (#{exception}).",
           howToFix: DONT_KNOW_HOW_TO_FIX,
-          examples: const [
+          examples: [
             """
 // can't have a 'top level' package URI
 import 'package:foo.dart';
@@ -222,37 +219,36 @@
 """
           ]),
 
-      MessageKind.JS_PLACEHOLDER_CAPTURE: const MessageTemplate(
+      MessageKind.JS_PLACEHOLDER_CAPTURE: MessageTemplate(
           MessageKind.JS_PLACEHOLDER_CAPTURE,
           "JS code must not use '#' placeholders inside functions.",
           howToFix:
               "Use an immediately called JavaScript function to capture the"
               " the placeholder values as JavaScript function parameters."),
 
-      MessageKind.WRONG_ARGUMENT_FOR_JS: const MessageTemplate(
+      MessageKind.WRONG_ARGUMENT_FOR_JS: MessageTemplate(
           MessageKind.WRONG_ARGUMENT_FOR_JS,
           "JS expression must take two or more arguments."),
 
-      MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST: const MessageTemplate(
+      MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST: MessageTemplate(
           MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST,
           "JS expression must take two or more arguments."),
 
-      MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND: const MessageTemplate(
+      MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND: MessageTemplate(
           MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND,
           "JS second argument must be a string literal."),
 
-      MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT:
-          const MessageTemplate(
-              MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT,
-              "Argument for 'JS_INTERCEPTOR_CONSTANT' must be a type constant."),
+      MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT: MessageTemplate(
+          MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT,
+          "Argument for 'JS_INTERCEPTOR_CONSTANT' must be a type constant."),
 
-      MessageKind.ABSTRACT_GETTER: const MessageTemplate(
+      MessageKind.ABSTRACT_GETTER: MessageTemplate(
           MessageKind.ABSTRACT_GETTER,
           "The getter '#{name}' has no implementation in "
           "class '#{class}'.",
           howToFix: "Try adding a body to '#{name}' or declaring "
               "'#{class}' to be 'abstract'.",
-          examples: const [
+          examples: [
             """
 class Class {
   get getter;
@@ -261,23 +257,23 @@
 """
           ]),
 
-      MessageKind.INVALID_METADATA: const MessageTemplate(
+      MessageKind.INVALID_METADATA: MessageTemplate(
           MessageKind.INVALID_METADATA,
           "A metadata annotation must be either a reference to a compile-time "
           "constant variable or a call to a constant constructor.",
           howToFix:
               "Try using a different constant value or referencing it through a "
               "constant variable.",
-          examples: const ['@Object main() {}', '@print main() {}']),
+          examples: ['@Object main() {}', '@print main() {}']),
 
-      MessageKind.INVALID_METADATA_GENERIC: const MessageTemplate(
+      MessageKind.INVALID_METADATA_GENERIC: MessageTemplate(
           MessageKind.INVALID_METADATA_GENERIC,
           "A metadata annotation using a constant constructor cannot use type "
           "arguments.",
           howToFix:
               "Try removing the type arguments or referencing the constant "
               "through a constant variable.",
-          examples: const [
+          examples: [
             '''
 class C<T> {
   const C();
@@ -286,35 +282,35 @@
 '''
           ]),
 
-      MessageKind.EQUAL_MAP_ENTRY_KEY: const MessageTemplate(
+      MessageKind.EQUAL_MAP_ENTRY_KEY: MessageTemplate(
           MessageKind.EQUAL_MAP_ENTRY_KEY,
           "An entry with the same key already exists in the map.",
           howToFix:
               "Try removing the previous entry or changing the key in one "
               "of the entries.",
-          examples: const [
+          examples: [
             """
 main() {
   var m = const {'foo': 1, 'foo': 2};
 }"""
           ]),
 
-      MessageKind.EQUAL_SET_ENTRY: const MessageTemplate(
+      MessageKind.EQUAL_SET_ENTRY: MessageTemplate(
           MessageKind.EQUAL_SET_ENTRY, "An entry appears twice in the set.",
           howToFix: "Try removing one of the entries.",
-          examples: const [
+          examples: [
             """
 main() {
   var m = const {'foo', 'bar', 'foo'};
 }"""
           ]),
 
-      MessageKind.COMPILER_CRASHED: const MessageTemplate(
+      MessageKind.COMPILER_CRASHED: MessageTemplate(
           MessageKind.COMPILER_CRASHED,
           "The compiler crashed when compiling this element."),
 
       MessageKind.PLEASE_REPORT_THE_CRASH:
-          const MessageTemplate(MessageKind.PLEASE_REPORT_THE_CRASH, '''
+          MessageTemplate(MessageKind.PLEASE_REPORT_THE_CRASH, '''
 The compiler is broken.
 
 When compiling the above element, the compiler crashed. It is not
@@ -334,167 +330,166 @@
   below as well as the source location above).
 '''),
 
-      MessageKind.HIDDEN_WARNINGS_HINTS: const MessageTemplate(
+      MessageKind.HIDDEN_WARNINGS_HINTS: MessageTemplate(
           MessageKind.HIDDEN_WARNINGS_HINTS,
           "#{warnings} warning(s) and #{hints} hint(s) suppressed in #{uri}."),
 
-      MessageKind.HIDDEN_WARNINGS: const MessageTemplate(
-          MessageKind.HIDDEN_WARNINGS,
+      MessageKind.HIDDEN_WARNINGS: MessageTemplate(MessageKind.HIDDEN_WARNINGS,
           "#{warnings} warning(s) suppressed in #{uri}."),
 
-      MessageKind.HIDDEN_HINTS: const MessageTemplate(
+      MessageKind.HIDDEN_HINTS: MessageTemplate(
           MessageKind.HIDDEN_HINTS, "#{hints} hint(s) suppressed in #{uri}."),
 
-      MessageKind.PREAMBLE: const MessageTemplate(
+      MessageKind.PREAMBLE: MessageTemplate(
           MessageKind.PREAMBLE,
           "When run on the command-line, the compiled output might"
           " require a preamble file located in:\n"
           "  <sdk>/lib/_internal/js_runtime/lib/preambles."),
 
-      MessageKind.INVALID_CONSTANT_CONDITIONAL_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_CONDITIONAL_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_CONDITIONAL_TYPE,
           "`#{constant}` of type '#{type}' is not a valid constant condition. "
           "Must be a value of type 'bool'."),
 
-      MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE,
           "`#{constant}` of type '#{type}' is not valid in constant string "
           "interpolation. Must be a value of type 'bool', 'int', 'double', "
           "or 'String'."),
 
-      MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant binary #{operator} expression. Must be a value of type "
           "'bool', 'int', 'double', 'String', or 'Null'."),
 
-      MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant binary + expression on 'String'. Must be a value of type "
           "'String'."),
 
-      MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand for a "
           ".length expression. Must be a value of type 'String'."),
 
-      MessageKind.INVALID_CONSTANT_SHIFT: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_SHIFT: MessageTemplate(
           MessageKind.INVALID_CONSTANT_SHIFT,
           "Shift amount must be non-negative in "
           "`#{left} #{operator} #{right}`."),
 
-      MessageKind.INVALID_CONSTANT_DIV: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_DIV: MessageTemplate(
           MessageKind.INVALID_CONSTANT_DIV,
           "Divisor must be non-zero in `#{left} #{operator} #{right}`."),
 
-      MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant binary + expression on 'num'. Must be a value of type "
           "'int' or 'double'."),
 
-      MessageKind.INVALID_CONSTANT_CAST: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_CAST: MessageTemplate(
           MessageKind.INVALID_CONSTANT_CAST,
           "`#{constant}` of type '#{type}' is not a subtype of #{castType}."),
 
-      MessageKind.INVALID_CONSTANT_ADD_TYPES: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_ADD_TYPES: MessageTemplate(
           MessageKind.INVALID_CONSTANT_ADD_TYPES,
           "`#{leftConstant}` of type '#{leftType}' and "
           "`#{rightConstant}` of type '#{rightType}' are not valid operands "
           "of a constant binary + expression. Must both be either of "
           "type 'String', or of types 'int' or 'double'."),
 
-      MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant binary #{operator} expression. Must be a value of type "
           "'int' or 'double'."),
 
-      MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant binary #{operator} expression. Must be a value of type "
           "'int'."),
 
-      MessageKind.INVALID_CONSTANT_NOT_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_NOT_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_NOT_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant unary #{operator} expression. Must be a value of type "
           "'bool'."),
 
-      MessageKind.INVALID_CONSTANT_NEGATE_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_NEGATE_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_NEGATE_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant unary #{operator} expression. Must be a value of type "
           "'int' or 'double'."),
 
-      MessageKind.INVALID_CONSTANT_COMPLEMENT_TYPE: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_COMPLEMENT_TYPE: MessageTemplate(
           MessageKind.INVALID_CONSTANT_COMPLEMENT_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
           "constant unary #{operator} expression. Must be a value of type "
           "'int'."),
 
-      MessageKind.INVALID_CONSTANT_INDEX: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_INDEX: MessageTemplate(
           MessageKind.INVALID_CONSTANT_INDEX,
           "Index expressions are not allowed in constant expressions."),
 
-      MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE: const MessageTemplate(
+      MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE: MessageTemplate(
           MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE,
           "`#{constant}` of type '#{type}' is not a valid environment name "
           "constant. Must be a value of type 'String'."),
 
       MessageKind.INVALID_BOOL_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE:
-          const MessageTemplate(
+          MessageTemplate(
               MessageKind.INVALID_BOOL_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
               "`#{constant}` of type '#{type}' is not a valid "
               "`bool.fromEnvironment` default value constant. "
               "Must be a value of type 'bool' or `null`."),
 
       MessageKind.INVALID_INT_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE:
-          const MessageTemplate(
+          MessageTemplate(
               MessageKind.INVALID_INT_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
               "`#{constant}` of type '#{type}' is not a valid "
               "`int.fromEnvironment` default value constant. "
               "Must be a value of type 'int' or `null`."),
 
       MessageKind.INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE:
-          const MessageTemplate(
+          MessageTemplate(
               MessageKind.INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
               "`#{constant}` of type '#{type}' is not a valid "
               "`String.fromEnvironment` default value constant. "
               "Must be a value of type 'String' or `null`."),
 
-      MessageKind.INVALID_LOGICAL_AND_OPERAND_TYPE: const MessageTemplate(
+      MessageKind.INVALID_LOGICAL_AND_OPERAND_TYPE: MessageTemplate(
           MessageKind.INVALID_LOGICAL_AND_OPERAND_TYPE,
           "`#{constant}` of type '#{type}' is not a valid logical and operand. "
           "Must be a value of type 'bool'."),
 
-      MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE: const MessageTemplate(
+      MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE: MessageTemplate(
           MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE,
           "`#{constant}` of type '#{type}' is not a valid logical or operand. "
           "Must be a value of type 'bool'."),
 
-      MessageKind.INVALID_CONSTANT_CONSTRUCTOR: const MessageTemplate(
+      MessageKind.INVALID_CONSTANT_CONSTRUCTOR: MessageTemplate(
           MessageKind.INVALID_CONSTANT_CONSTRUCTOR,
           "Constructor '#{constructorName}' is not a valid constant "
           "constructor."),
 
-      MessageKind.INVALID_ASSERT_VALUE: const MessageTemplate(
+      MessageKind.INVALID_ASSERT_VALUE: MessageTemplate(
           MessageKind.INVALID_ASSERT_VALUE, "Assertion '#{assertion}' failed."),
 
-      MessageKind.INVALID_ASSERT_VALUE_MESSAGE: const MessageTemplate(
+      MessageKind.INVALID_ASSERT_VALUE_MESSAGE: MessageTemplate(
           MessageKind.INVALID_ASSERT_VALUE_MESSAGE,
           "Assertion failed: #{message}"),
 
-      MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE: const MessageTemplate(
-          MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE, """
+      MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE:
+          MessageTemplate(MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE, """
 dart2js no longer supports the dart:mirrors library.
 
 APIs from this library will throw a runtime error at this time, but they will
 become a compile-time error in the future."""),
 
-      MessageKind.DIRECTLY_THROWING_NSM: const MessageTemplate(
+      MessageKind.DIRECTLY_THROWING_NSM: MessageTemplate(
           MessageKind.DIRECTLY_THROWING_NSM,
           "This 'noSuchMethod' implementation is guaranteed to throw an "
           "exception. The generated code will be smaller if it is "
@@ -502,7 +497,7 @@
           howToFix: "Rewrite to "
               "'noSuchMethod(Invocation i) => super.noSuchMethod(i);'."),
 
-      MessageKind.COMPLEX_THROWING_NSM: const MessageTemplate(
+      MessageKind.COMPLEX_THROWING_NSM: MessageTemplate(
           MessageKind.COMPLEX_THROWING_NSM,
           "This 'noSuchMethod' implementation is guaranteed to throw an "
           "exception. The generated code will be smaller and the compiler "
@@ -510,13 +505,13 @@
           howToFix: "Rewrite to "
               "'noSuchMethod(Invocation i) => super.noSuchMethod(i);'."),
 
-      MessageKind.COMPLEX_RETURNING_NSM: const MessageTemplate(
+      MessageKind.COMPLEX_RETURNING_NSM: MessageTemplate(
           MessageKind.COMPLEX_RETURNING_NSM,
           "Overriding 'noSuchMethod' causes the compiler to generate "
           "more code and prevents the compiler from doing some optimizations.",
           howToFix: "Consider removing this 'noSuchMethod' implementation."),
 
-      MessageKind.RUNTIME_TYPE_TO_STRING: const MessageTemplate(
+      MessageKind.RUNTIME_TYPE_TO_STRING: MessageTemplate(
           MessageKind.RUNTIME_TYPE_TO_STRING,
           "Using '.runtimeType.toString()' causes the compiler to generate "
           "more code because it needs to preserve type arguments on "
@@ -525,28 +520,28 @@
               "${Flags.laxRuntimeTypeToString} to reduce the code size "
               "impact."),
 
-      MessageKind.NON_NATIVE_EXTERNAL: const MessageTemplate(
+      MessageKind.NON_NATIVE_EXTERNAL: MessageTemplate(
           MessageKind.NON_NATIVE_EXTERNAL,
           "Non-native external members must be js-interop.",
           howToFix:
               "Try removing the 'external' keyword, making it 'native', or "
               "annotating the function as a js-interop function."),
 
-      MessageKind.NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS: const MessageTemplate(
+      MessageKind.NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS: MessageTemplate(
           MessageKind.NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS,
           "Native non-instance members are only allowed in native classes."),
 
       // TODO(32557): Remove these when issue 32557 is fixed.
-      MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS: const MessageTemplate(
+      MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS: MessageTemplate(
           MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
           "'case' expression type '#{type}' overrides 'operator =='."),
-      MessageKind.SWITCH_CASE_FORBIDDEN: const MessageTemplate(
+      MessageKind.SWITCH_CASE_FORBIDDEN: MessageTemplate(
           MessageKind.SWITCH_CASE_FORBIDDEN,
           "'case' expression may not be of type '#{type}'."),
-      MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL: const MessageTemplate(
+      MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL: MessageTemplate(
           MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
           "'case' expressions do not all have type '#{type}'."),
-      MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE: const MessageTemplate(
+      MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE: MessageTemplate(
           MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
           "'case' expression of type '#{type}'."),
     }); // End of TEMPLATES.
@@ -555,7 +550,7 @@
   String toString() => template;
 
   Message message(Map<String, String> arguments, CompilerOptions options) {
-    return new Message(this, arguments, options);
+    return Message(this, arguments, options);
   }
 
   bool get hasHowToFix => howToFix != null && howToFix != DONT_KNOW_HOW_TO_FIX;
@@ -584,8 +579,7 @@
         message = message.replaceAll('#{$key}', value);
       });
       assert(
-          kind == MessageKind.GENERIC ||
-              !message.contains(new RegExp(r'#\{.+\}')),
+          kind == MessageKind.GENERIC || !message.contains(RegExp(r'#\{.+\}')),
           failedAt(CURRENT_ELEMENT_SPANNABLE,
               'Missing arguments in error message: "$message"'));
       if (!terse && template.hasHowToFix) {
@@ -611,5 +605,5 @@
   }
 
   @override
-  int get hashCode => throw new UnsupportedError('Message.hashCode');
+  int get hashCode => throw UnsupportedError('Message.hashCode');
 }
diff --git a/pkg/compiler/lib/src/diagnostics/spannable.dart b/pkg/compiler/lib/src/diagnostics/spannable.dart
index 356e2e4..3bb9bf0 100644
--- a/pkg/compiler/lib/src/diagnostics/spannable.dart
+++ b/pkg/compiler/lib/src/diagnostics/spannable.dart
@@ -22,12 +22,12 @@
 /// current element. Note that the diagnostic reporting will fail if the current
 /// element is `null`.
 const Spannable CURRENT_ELEMENT_SPANNABLE =
-    const _SpannableSentinel("Current element");
+    _SpannableSentinel("Current element");
 
 /// Sentinel spannable used to mark that there might be no location for the
 /// diagnostic. Use this only when it is not an error not to have a current
 /// element.
-const Spannable NO_LOCATION_SPANNABLE = const _SpannableSentinel("No location");
+const Spannable NO_LOCATION_SPANNABLE = _SpannableSentinel("No location");
 
 class SpannableAssertionFailure {
   final Spannable node;
diff --git a/pkg/compiler/lib/src/helpers/debug_collection.dart b/pkg/compiler/lib/src/helpers/debug_collection.dart
index 1636e9e..de9a857e 100644
--- a/pkg/compiler/lib/src/helpers/debug_collection.dart
+++ b/pkg/compiler/lib/src/helpers/debug_collection.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-typedef void DebugCallback(String methodName, var arg1, var arg2);
+typedef DebugCallback = void Function(
+    String methodName, dynamic arg1, dynamic arg2);
 
 class DebugMap<K, V> implements Map<K, V> {
   final Map<K, V> sourceMap;
@@ -160,7 +161,7 @@
   bool any(bool test(E element)) => iterable.any(test);
 
   @override
-  List<E> toList({bool growable: true}) {
+  List<E> toList({bool growable = true}) {
     return iterable.toList(growable: growable);
   }
 
@@ -431,7 +432,7 @@
 /// at the call site by running test programs and adding to [runtimeTypes] when
 /// new type are found.
 void assertType(String name, List<String> runtimeTypes, var object,
-    {bool showObjects: false}) {
+    {bool showObjects = false}) {
   String runtimeType = '${object.runtimeType}';
   if (runtimeTypes != null && runtimeTypes.contains(runtimeType)) return;
   throw '$name: $runtimeType'
@@ -450,7 +451,7 @@
   final bool showObjects;
 
   const MapTypeAsserter(this.name, this.runtimeTypes,
-      {bool this.showObjects: false});
+      {bool this.showObjects = false});
 
   void call(String methodName, var key, var value) {
     check(key, value, '$methodName: ');
@@ -478,7 +479,7 @@
   final bool showObjects;
 
   const CollectionTypeAsserter(this.name, this.runtimeTypes,
-      {bool this.showObjects: false});
+      {bool this.showObjects = false});
 
   void call(String methodName, var element, _) {
     check(element, '$methodName: ');
diff --git a/pkg/compiler/lib/src/helpers/expensive_map.dart b/pkg/compiler/lib/src/helpers/expensive_map.dart
index 91098f5..3161d64 100644
--- a/pkg/compiler/lib/src/helpers/expensive_map.dart
+++ b/pkg/compiler/lib/src/helpers/expensive_map.dart
@@ -10,10 +10,10 @@
 class ExpensiveMap<K, V> extends MapBase<K, V> {
   final List _maps;
 
-  ExpensiveMap([int copies = 10]) : _maps = new List.filled(copies, null) {
+  ExpensiveMap([int copies = 10]) : _maps = List.filled(copies, null) {
     assert(copies > 0);
     for (int i = 0; i < _maps.length; i++) {
-      _maps[i] = new Map<K, V>();
+      _maps[i] = Map<K, V>();
     }
   }
 
diff --git a/pkg/compiler/lib/src/helpers/expensive_set.dart b/pkg/compiler/lib/src/helpers/expensive_set.dart
index cc41f8b..80163cd 100644
--- a/pkg/compiler/lib/src/helpers/expensive_set.dart
+++ b/pkg/compiler/lib/src/helpers/expensive_set.dart
@@ -10,10 +10,10 @@
 class ExpensiveSet<E> extends SetBase<E> {
   final List _sets;
 
-  ExpensiveSet([int copies = 10]) : _sets = new List.filled(copies, null) {
+  ExpensiveSet([int copies = 10]) : _sets = List.filled(copies, null) {
     assert(copies > 0);
     for (int i = 0; i < _sets.length; i++) {
-      _sets[i] = new Set<E>();
+      _sets[i] = Set<E>();
     }
   }
 
@@ -94,7 +94,7 @@
     return true;
   }
 
-  Set _newSet() => new ExpensiveSet(_sets.length);
+  Set _newSet() => ExpensiveSet(_sets.length);
 
   @override
   Set<E> intersection(Set<Object> other) {
@@ -113,7 +113,9 @@
 
   @override
   Set<E> union(Set<E> other) {
-    return _newSet()..addAll(this)..addAll(other);
+    return _newSet()
+      ..addAll(this)
+      ..addAll(other);
   }
 
   @override
@@ -138,7 +140,7 @@
 
   @override
   Set<E> toSet() {
-    var result = new ExpensiveSet<E>(_sets.length);
+    var result = ExpensiveSet<E>(_sets.length);
     for (int i = 0; i < _sets.length; i++) {
       result._sets[i] = _sets[i].toSet();
     }
diff --git a/pkg/compiler/lib/src/helpers/helpers.dart b/pkg/compiler/lib/src/helpers/helpers.dart
index 9828b7f..4661c1f 100644
--- a/pkg/compiler/lib/src/helpers/helpers.dart
+++ b/pkg/compiler/lib/src/helpers/helpers.dart
@@ -36,10 +36,10 @@
   final String indentationUnit = " ";
 }
 
-_DebugIndentation _indentation = new _DebugIndentation();
+_DebugIndentation _indentation = _DebugIndentation();
 
 /// Function signature of [debugPrint].
-typedef DebugPrint(s);
+typedef DebugPrint = Function(dynamic s);
 
 /// If [DEBUG_PRINT_ENABLED] is `true` print [s] using the current indentation.
 DebugPrint get debugPrint {
@@ -54,7 +54,7 @@
 }
 
 /// Function signature of [debugWrapPrint].
-typedef DebugWrapPrint(s, f());
+typedef DebugWrapPrint = Function(dynamic s, Function() f);
 
 /// Wraps the call to [f] with a print of 'start:$s' and 'end:$s' incrementing
 /// the current indentation used by [debugPrint] during the execution of [f].
@@ -79,7 +79,7 @@
 }
 
 /// Function signature of [reportHere].
-typedef ReportHere(
+typedef ReportHere = Function(
     DiagnosticReporter reporter, Spannable node, String debugMessage);
 
 /// Print a message with a source location.
@@ -96,7 +96,7 @@
 }
 
 /// Set of tracked objects used by [track] and [ifTracked].
-var _trackedObjects = new Set<Object>();
+var _trackedObjects = Set<Object>();
 
 /// Global default value for the `printTrace` option of [track] and [ifTracked].
 bool trackWithTrace = false;
diff --git a/pkg/compiler/lib/src/helpers/stats.dart b/pkg/compiler/lib/src/helpers/stats.dart
index 7ca7960..a356c93 100644
--- a/pkg/compiler/lib/src/helpers/stats.dart
+++ b/pkg/compiler/lib/src/helpers/stats.dart
@@ -38,12 +38,12 @@
 /// extension of 'log'.
 void enableStatsOutput(
     {CompilerOutputProvider outputProvider,
-    bool xml: true,
-    String name: 'stats',
+    bool xml = true,
+    String name = 'stats',
     String extension,
-    int examples: 10}) {
+    int examples = 10}) {
   if (_stats != null) {
-    throw new StateError('Stats have already been initialized.');
+    throw StateError('Stats have already been initialized.');
   }
   enableDebugMode();
 
@@ -52,17 +52,17 @@
     if (extension == null) {
       extension = xml ? 'xml' : 'log';
     }
-    output = new SinkOutput(outputProvider(name, extension));
+    output = SinkOutput(outputProvider(name, extension));
   } else {
     output = const DebugOutput();
   }
   StatsPrinter printer;
   if (xml) {
-    printer = new XMLPrinter(output: output, examples: examples);
+    printer = XMLPrinter(output: output, examples: examples);
   } else {
-    printer = new ConsolePrinter(output: output, examples: examples);
+    printer = ConsolePrinter(output: output, examples: examples);
   }
-  _stats = new ActiveStats(printer);
+  _stats = ActiveStats(printer);
 }
 
 /// Interface for gathering and display of statistical information.
@@ -280,7 +280,7 @@
   final int examples;
   final StatsOutput output;
 
-  BasePrinter({this.output: const DebugOutput(), this.examples: 10}) {
+  BasePrinter({this.output = const DebugOutput(), this.examples = 10}) {
     indentationUnit = " ";
   }
 }
@@ -289,7 +289,7 @@
 class ConsolePrinter extends BasePrinter {
   int extraLevel = 0;
 
-  ConsolePrinter({StatsOutput output: const DebugOutput(), int examples: 10})
+  ConsolePrinter({StatsOutput output = const DebugOutput(), int examples = 10})
       : super(output: output, examples: examples);
 
   @override
@@ -297,7 +297,7 @@
       [Map<String, dynamic> data = const <String, dynamic>{}]) {
     if (extraLevel > 0) return;
 
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write(indentation);
     String space = '';
     if (data['title'] != null) {
@@ -343,10 +343,10 @@
 
 /// [StatsPrinter] that displays stats in XML format.
 class XMLPrinter extends BasePrinter {
-  static const HtmlEscape escape = const HtmlEscape();
+  static const HtmlEscape escape = HtmlEscape();
   bool opened = false;
 
-  XMLPrinter({output: const DebugOutput(), int examples: 10})
+  XMLPrinter({output = const DebugOutput(), int examples = 10})
       : super(output: output, examples: examples);
 
   @override
@@ -366,7 +366,7 @@
   @override
   void open(String id,
       [Map<String, dynamic> data = const <String, dynamic>{}]) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write(indentation);
     sb.write('<$id');
     data.forEach((key, value) {
@@ -434,15 +434,15 @@
           subtrace.commonPrefix =
               subtrace.commonPrefix.sublist(commonPrefixLength);
           subtraces.remove(subtrace);
-          subtraces.add(new _StackTraceNode.node(
+          subtraces.add(_StackTraceNode.node(
               lines.sublist(0, commonPrefixLength),
               subtrace,
-              new _StackTraceNode.leaf(stackTrace)));
+              _StackTraceNode.leaf(stackTrace)));
         }
         return;
       }
     }
-    subtraces.add(new _StackTraceNode.leaf(stackTrace));
+    subtraces.add(_StackTraceNode.leaf(stackTrace));
   }
 
   void dumpTraces(StatsPrinter printer) {
@@ -497,7 +497,7 @@
 
   @override
   String toString() {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     printOn(sb, '');
     return sb.toString();
   }
@@ -590,7 +590,7 @@
 
   @override
   void recordElement(key, element, {data}) {
-    setsMap.putIfAbsent(key, () => new Map())[element] = data;
+    setsMap.putIfAbsent(key, () => Map())[element] = data;
   }
 
   @override
@@ -599,7 +599,7 @@
       sampleFrequency = stackTraceSampleFrequency;
     }
     traceMap
-        .putIfAbsent(key, () => new _StackTraceTree(key, sampleFrequency))
+        .putIfAbsent(key, () => _StackTraceTree(key, sampleFrequency))
         .sample();
   }
 
@@ -734,7 +734,7 @@
   }
 
   void dumpIterable(String tag, String title, Iterable iterable,
-      {int limit, Map dataMap, bool includeCount: true}) {
+      {int limit, Map dataMap, bool includeCount = true}) {
     if (limit == 0) return;
 
     Map<String, dynamic> childData = {};
@@ -782,11 +782,11 @@
     {bool equals(V key1, V key2),
     int hashCode(V key),
     bool isValidKey(V potentialKey)}) {
-  Map<V, Set<K>> result = new LinkedHashMap<V, Set<K>>(
+  Map<V, Set<K>> result = LinkedHashMap<V, Set<K>>(
       equals: equals, hashCode: hashCode, isValidKey: isValidKey);
   map.forEach((k, v) {
     if (isValidKey == null || isValidKey(v)) {
-      result.putIfAbsent(v, () => new Set()).add(k);
+      result.putIfAbsent(v, () => Set()).add(k);
     }
   });
   return result;
@@ -812,7 +812,7 @@
 Map<K, V> sortMap<K, V>(Map<K, V> map, [int compare(K a, K b)]) {
   List<K> keys = map.keys.toList();
   keys.sort(compare);
-  Map<K, V> sortedMap = new Map<K, V>();
+  Map<K, V> sortedMap = Map<K, V>();
   keys.forEach((K k) => sortedMap[k] = map[k]);
   return sortedMap;
 }
diff --git a/pkg/compiler/lib/src/helpers/trace.dart b/pkg/compiler/lib/src/helpers/trace.dart
index 51022cd..3bdb6b3 100644
--- a/pkg/compiler/lib/src/helpers/trace.dart
+++ b/pkg/compiler/lib/src/helpers/trace.dart
@@ -6,8 +6,8 @@
 import '../util/util.dart';
 
 /// Function signature for [trace].
-typedef void Trace(String message,
-    {bool condition(String stackTrace), int limit, bool throwOnPrint});
+typedef Trace = void Function(String message,
+    {bool Function(String stackTrace) condition, int limit, bool throwOnPrint});
 
 /// Helper method for printing stack traces for debugging.
 ///
@@ -30,7 +30,7 @@
 }
 
 void _trace(String message,
-    {bool condition(String stackTrace), int limit, bool throwOnPrint: false}) {
+    {bool condition(String stackTrace), int limit, bool throwOnPrint = false}) {
   try {
     throw '';
   } catch (e, s) {
@@ -57,9 +57,9 @@
 }
 
 /// Function signature of [traceAndReport].
-typedef void TraceAndReport(
+typedef TraceAndReport = void Function(
     DiagnosticReporter reporter, Spannable node, String message,
-    {bool condition(String stackTrace), int limit, bool throwOnPrint});
+    {bool Function(String stackTrace) condition, int limit, bool throwOnPrint});
 
 /// Calls [reportHere] and [trace] with the same message.
 TraceAndReport get traceAndReport {
@@ -73,7 +73,7 @@
 /// Implementation of [traceAndReport].
 void _traceAndReport(
     DiagnosticReporter reporter, Spannable node, String message,
-    {bool condition(String stackTrace), int limit, bool throwOnPrint: false}) {
+    {bool condition(String stackTrace), int limit, bool throwOnPrint = false}) {
   trace(message, limit: limit, throwOnPrint: throwOnPrint,
       condition: (String stackTrace) {
     bool result = condition != null ? condition(stackTrace) : true;
@@ -89,13 +89,13 @@
 /// Use [offset] to discard the first [offset] calls of the call stack. Defaults
 /// to `1`, that is, discard the call to [stackTrace] itself. Use [limit] to
 /// limit the length of the stack trace lines.
-StackTraceLines stackTrace({int offset: 1, int limit: null}) {
+StackTraceLines stackTrace({int offset = 1, int limit = null}) {
   int rangeStart = offset;
   int rangeEnd = limit == null ? null : rangeStart + limit;
   try {
     throw '';
   } catch (_, stackTrace) {
-    return new StackTraceLines.fromTrace(stackTrace,
+    return StackTraceLines.fromTrace(stackTrace,
         rangeStart: offset,
         rangeEnd: rangeEnd,
         filePrefix: stackTraceFilePrefix);
@@ -110,8 +110,8 @@
   final int maxColumnNoLength;
 
   factory StackTraceLines.fromTrace(StackTrace s,
-      {int rangeStart, int rangeEnd, String filePrefix, String lambda: r'?'}) {
-    final RegExp indexPattern = new RegExp(r'#\d+\s*');
+      {int rangeStart, int rangeEnd, String filePrefix, String lambda = r'?'}) {
+    final RegExp indexPattern = RegExp(r'#\d+\s*');
     int index = -1;
     int maxFileLength = 0;
     int maxLineNoLength = 0;
@@ -136,7 +136,7 @@
         // Strip index.
         line = line.replaceFirst(indexPattern, '');
         if (line == '<asynchronous suspension>') {
-          lines.add(new StackTraceLine(index, '', '', '', line));
+          lines.add(StackTraceLine(index, '', '', '', line));
           continue;
         }
 
@@ -198,12 +198,12 @@
         if (lambda != null) {
           method = method.replaceAll('<anonymous closure>', lambda);
         }
-        lines.add(new StackTraceLine(index, file, lineNo, columnNo, method));
+        lines.add(StackTraceLine(index, file, lineNo, columnNo, method));
       } catch (e) {
         throw 'Error prettifying "$line": $e';
       }
     }
-    return new StackTraceLines.fromLines(
+    return StackTraceLines.fromLines(
         lines, maxFileLength, maxLineNoLength, maxColumnNoLength);
   }
 
@@ -211,12 +211,12 @@
       this.maxLineNoLength, this.maxColumnNoLength);
 
   StackTraceLines subtrace(int offset) {
-    return new StackTraceLines.fromLines(lines.sublist(offset), maxFileLength,
+    return StackTraceLines.fromLines(lines.sublist(offset), maxFileLength,
         maxLineNoLength, maxColumnNoLength);
   }
 
-  String prettify({bool showColumnNo: false, bool showDots: true}) {
-    StringBuffer sb = new StringBuffer();
+  String prettify({bool showColumnNo = false, bool showDots = true}) {
+    StringBuffer sb = StringBuffer();
     bool dots = true;
     for (StackTraceLine line in lines) {
       sb.write('  ');
@@ -250,11 +250,11 @@
       this.index, this.file, this.lineNo, this.columnNo, this.method);
 
   void printOn(StringBuffer sb,
-      {String padding: ' ',
+      {String padding = ' ',
       int fileLength,
       int lineNoLength,
       int columnNoLength,
-      bool showColumnNo: false}) {
+      bool showColumnNo = false}) {
     String fileText = '${file} ';
     if (fileLength != null) {
       fileText = pad(fileText, fileLength, dots: padding);
@@ -312,11 +312,11 @@
 String prettifyStackTrace(StackTrace stackTrace,
     {int rangeStart,
     int rangeEnd,
-    bool showColumnNo: false,
-    bool showDots: true,
+    bool showColumnNo = false,
+    bool showDots = true,
     String filePrefix,
-    String lambda: r'?'}) {
-  return new StackTraceLines.fromTrace(stackTrace,
+    String lambda = r'?'}) {
+  return StackTraceLines.fromTrace(stackTrace,
           rangeStart: rangeStart,
           rangeEnd: rangeEnd,
           filePrefix: filePrefix,
@@ -329,12 +329,12 @@
 /// If [padLeft] is [:true:] the text is padding inserted to the left of [text].
 /// A repetition of the [dots] text is used for padding.
 String pad(String text, int intendedLength,
-    {bool padLeft: false, String dots: ' '}) {
+    {bool padLeft = false, String dots = ' '}) {
   if (text.length == intendedLength) return text;
   if (text.length > intendedLength) return text.substring(0, intendedLength);
   if (dots == null || dots.isEmpty) dots = ' ';
   int dotsLength = dots.length;
-  StringBuffer sb = new StringBuffer();
+  StringBuffer sb = StringBuffer();
   if (!padLeft) {
     sb.write(text);
   }
diff --git a/pkg/compiler/lib/src/helpers/track_map.dart b/pkg/compiler/lib/src/helpers/track_map.dart
index 23d3ce4..8a24420 100644
--- a/pkg/compiler/lib/src/helpers/track_map.dart
+++ b/pkg/compiler/lib/src/helpers/track_map.dart
@@ -16,11 +16,11 @@
   final List _counts;
   static final Map<String, List<int>> _countsMap = {};
 
-  TrackMap._internal(this._counts) : _map = new Map<K, V>();
+  TrackMap._internal(this._counts) : _map = Map<K, V>();
 
   factory TrackMap(String description) {
     List counts = _countsMap.putIfAbsent(description, () => [0]);
-    Map result = new TrackMap<K, V>._internal(counts);
+    Map result = TrackMap<K, V>._internal(counts);
     counts[0]++;
     return result;
   }
diff --git a/pkg/compiler/lib/src/io/code_output.dart b/pkg/compiler/lib/src/io/code_output.dart
index 70ad22c..cc5a9b3 100644
--- a/pkg/compiler/lib/src/io/code_output.dart
+++ b/pkg/compiler/lib/src/io/code_output.dart
@@ -72,14 +72,14 @@
       String inlinedMethodName) {
     assert(targetOffset <= codeOutput.length);
     List<FrameEntry> frames = frameMarkers[targetOffset] ??= [];
-    frames.add(new FrameEntry.push(sourceLocation, inlinedMethodName));
+    frames.add(FrameEntry.push(sourceLocation, inlinedMethodName));
   }
 
   @override
   void addPop(int targetOffset, bool isEmpty) {
     assert(targetOffset <= codeOutput.length);
     List<FrameEntry> frames = frameMarkers[targetOffset] ??= [];
-    frames.add(new FrameEntry.pop(isEmpty));
+    frames.add(FrameEntry.pop(isEmpty));
   }
 
   @override
@@ -162,7 +162,7 @@
   @override
   void add(String text) {
     if (isClosed) {
-      throw new StateError("Code output is closed. Trying to write '$text'.");
+      throw StateError("Code output is closed. Trying to write '$text'.");
     }
     _add(text);
   }
@@ -181,7 +181,7 @@
   @override
   void close() {
     if (isClosed) {
-      throw new StateError("Code output is already closed.");
+      throw StateError("Code output is already closed.");
     }
     isClosed = true;
     _listeners?.forEach((listener) => listener.onDone(length));
@@ -192,7 +192,7 @@
 
   @override
   _SourceLocationsImpl createSourceLocations(String name) {
-    return sourceLocationsMap[name] ??= new _SourceLocationsImpl(name, this);
+    return sourceLocationsMap[name] ??= _SourceLocationsImpl(name, this);
   }
 }
 
@@ -202,7 +202,7 @@
 
 /// [CodeOutput] using a [StringBuffer] as backend.
 class CodeBuffer extends AbstractCodeOutput implements BufferedCodeOutput {
-  StringBuffer buffer = new StringBuffer();
+  StringBuffer buffer = StringBuffer();
 
   CodeBuffer([List<CodeOutputListener> listeners]) : super(listeners);
 
diff --git a/pkg/compiler/lib/src/io/kernel_source_information.dart b/pkg/compiler/lib/src/io/kernel_source_information.dart
index 6600d21..2993f94 100644
--- a/pkg/compiler/lib/src/io/kernel_source_information.dart
+++ b/pkg/compiler/lib/src/io/kernel_source_information.dart
@@ -23,7 +23,7 @@
 
   @override
   SourceInformationBuilder createBuilderForContext(MemberEntity member) {
-    return new KernelSourceInformationBuilder(
+    return KernelSourceInformationBuilder(
         _backendStrategy
             // ignore:deprecated_member_use_from_same_package
             .elementMap,
@@ -142,7 +142,7 @@
     }
     assert(
         location != null, "No location found for $node (${node.runtimeType})");
-    return new KernelSourceLocation(location, offset, name);
+    return KernelSourceLocation(location, offset, name);
   }
 
   /// Creates the source information for a function definition defined by the
@@ -152,7 +152,7 @@
   SourceInformation _buildFunction(
       String name, ir.TreeNode node, ir.FunctionNode functionNode) {
     if (functionNode.fileEndOffset != ir.TreeNode.noOffset) {
-      return new PositionSourceInformation(
+      return PositionSourceInformation(
           _getSourceLocation(name, node),
           _getSourceLocation(name, functionNode, functionNode.fileEndOffset),
           this.inliningContext);
@@ -195,7 +195,7 @@
   SourceInformation _buildFunctionExit(
       ir.TreeNode node, ir.FunctionNode functionNode) {
     if (functionNode.fileEndOffset != ir.TreeNode.noOffset) {
-      return new PositionSourceInformation(
+      return PositionSourceInformation(
           _getSourceLocation(_name, functionNode, functionNode.fileEndOffset),
           null,
           this.inliningContext);
@@ -218,7 +218,7 @@
     } else {
       location = _getSourceLocation(_name, node);
     }
-    return new PositionSourceInformation(location, null, inliningContext);
+    return PositionSourceInformation(location, null, inliningContext);
   }
 
   /// Creates source information for the body of the current member.
@@ -283,10 +283,8 @@
   /// Creates source information based on the location of [node].
   SourceInformation _buildTreeNode(ir.TreeNode node,
       {SourceLocation closingPosition, String name}) {
-    return new PositionSourceInformation(
-        _getSourceLocation(name ?? _name, node),
-        closingPosition,
-        inliningContext);
+    return PositionSourceInformation(_getSourceLocation(name ?? _name, node),
+        closingPosition, inliningContext);
   }
 
   @override
@@ -294,7 +292,7 @@
       MemberEntity member, SourceInformation context) {
     List<FrameContext> newContext = inliningContext?.toList() ?? [];
     if (context != null) {
-      newContext.add(new FrameContext(context, member.name));
+      newContext.add(FrameContext(context, member.name));
     } else {
       // TODO(sigmund): investigate whether we have any more cases where context
       // is null.
@@ -302,7 +300,7 @@
     }
 
     String name = computeKernelElementNameForSourceMaps(_elementMap, _member);
-    return new KernelSourceInformationBuilder.withContext(
+    return KernelSourceInformationBuilder.withContext(
         _elementMap, member, newContext, name);
   }
 
@@ -429,7 +427,7 @@
   @override
   SourceInformation buildCall(
       covariant ir.TreeNode receiver, covariant ir.TreeNode call) {
-    return new PositionSourceInformation(_getSourceLocation(_name, receiver),
+    return PositionSourceInformation(_getSourceLocation(_name, receiver),
         _getSourceLocation(_name, call), inliningContext);
   }
 
diff --git a/pkg/compiler/lib/src/io/location_provider.dart b/pkg/compiler/lib/src/io/location_provider.dart
index 4f36c5e..c16d811 100644
--- a/pkg/compiler/lib/src/io/location_provider.dart
+++ b/pkg/compiler/lib/src/io/location_provider.dart
@@ -40,7 +40,7 @@
   @override
   Location getLocation(int offset) {
     RangeError.checkValueInInterval(offset, 0, length, 'offset');
-    return new Source(lineStarts, const <int>[], null, null)
+    return Source(lineStarts, const <int>[], null, null)
         .getLocation(null, offset);
   }
 
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index cb895de..e26ced0 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -43,7 +43,7 @@
         () => FrameContext.readFromDataSource(source),
         emptyAsNull: true);
     source.end(tag);
-    return new PositionSourceInformation(
+    return PositionSourceInformation(
         startPosition, innerPosition, inliningContext);
   }
 
@@ -81,7 +81,7 @@
         startPosition != null ? startPosition : innerPosition;
     Uri uri = location.sourceUri;
     int offset = location.offset;
-    return new SourceSpan(uri, offset, offset);
+    return SourceSpan(uri, offset, offset);
   }
 
   @override
@@ -102,7 +102,7 @@
   /// Create a textual representation of the source information using [uriText]
   /// as the Uri representation.
   String _computeText(String uriText) {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('$uriText:');
     // Use 1-based line/column info to match usual dart tool output.
     if (startPosition != null) {
@@ -142,7 +142,7 @@
   @override
   SourceInformationProcessor createProcessor(
       SourceMapperProvider provider, SourceInformationReader reader) {
-    return new PositionSourceInformationProcessor(provider, reader);
+    return PositionSourceInformationProcessor(provider, reader);
   }
 
   @override
@@ -169,7 +169,7 @@
   List<SourceLocation> get sourceLocations => const <SourceLocation>[];
 
   @override
-  SourceSpan get sourceSpan => new SourceSpan(null, null, null);
+  SourceSpan get sourceSpan => SourceSpan(null, null, null);
 }
 
 /// The start, end and closing offsets for a [js.Node].
@@ -207,12 +207,12 @@
 /// Registry for mapping [js.Node]s to their [CodePosition].
 class CodePositionRecorder implements CodePositionMap {
   Map<js.Node, CodePosition> _codePositionMap =
-      new Map<js.Node, CodePosition>.identity();
+      Map<js.Node, CodePosition>.identity();
 
   void registerPositions(
       js.Node node, int startPosition, int endPosition, int closingPosition) {
     registerCodePosition(
-        node, new CodePosition(startPosition, endPosition, closingPosition));
+        node, CodePosition(startPosition, endPosition, closingPosition));
   }
 
   void registerCodePosition(js.Node node, CodePosition codePosition) {
@@ -316,7 +316,7 @@
   ///   v2: The initial version with an id.
   static const String id = 'v2';
 
-  final CodePositionRecorder codePositionRecorder = new CodePositionRecorder();
+  final CodePositionRecorder codePositionRecorder = CodePositionRecorder();
   final SourceInformationReader reader;
   CodePositionMap codePositionMap;
   List<TraceListener> traceListeners;
@@ -325,21 +325,21 @@
   PositionSourceInformationProcessor(SourceMapperProvider provider, this.reader,
       [Coverage coverage]) {
     codePositionMap = coverage != null
-        ? new CodePositionCoverage(codePositionRecorder, coverage)
+        ? CodePositionCoverage(codePositionRecorder, coverage)
         : codePositionRecorder;
     var sourceMapper = provider.createSourceMapper(id);
     traceListeners = [
-      new PositionTraceListener(sourceMapper, reader),
-      inliningListener = new InliningTraceListener(sourceMapper, reader),
+      PositionTraceListener(sourceMapper, reader),
+      inliningListener = InliningTraceListener(sourceMapper, reader),
     ];
     if (coverage != null) {
-      traceListeners.add(new CoverageListener(coverage, reader));
+      traceListeners.add(CoverageListener(coverage, reader));
     }
   }
 
   @override
   void process(js.Node node, BufferedCodeOutput code) {
-    new JavaScriptTracer(codePositionMap, reader, traceListeners).apply(node);
+    JavaScriptTracer(codePositionMap, reader, traceListeners).apply(node);
     inliningListener?.finish();
   }
 
@@ -414,7 +414,7 @@
   SourceInformationReader get reader;
 
   SourceInformation computeSourceInformation(js.Node node) {
-    return new NodeSourceInformation(reader).visit(node);
+    return NodeSourceInformation(reader).visit(node);
   }
 }
 
@@ -699,18 +699,18 @@
       if (pureAccess) {
         // a.m()   this.m()  a.b.c.d.m()
         // ^       ^         ^
-        return new CallPosition(
+        return CallPosition(
             node, CodePositionKind.START, SourcePositionKind.START);
       } else {
         // *.m()  *.a.b.c.d.m()
         //   ^              ^
-        return new CallPosition(
+        return CallPosition(
             access.selector, CodePositionKind.START, SourcePositionKind.INNER);
       }
     } else if (access is js.VariableUse || access is js.This) {
       // m()   this()
       // ^     ^
-      return new CallPosition(
+      return CallPosition(
           node, CodePositionKind.START, SourcePositionKind.START);
     } else if (access is js.FunctionExpression ||
         access is js.New ||
@@ -725,12 +725,12 @@
       //               ^                         ^                      ^
       // (()=>{})()
       //         ^
-      return new CallPosition(
+      return CallPosition(
           node.target, CodePositionKind.END, SourcePositionKind.INNER);
     } else if (access is js.Binary || access is js.Call) {
       // (0,a)()   m()()
       //      ^       ^
-      return new CallPosition(
+      return CallPosition(
           node.target, CodePositionKind.END, SourcePositionKind.INNER);
     } else {
       // TODO(johnniwinther): Maybe remove this assertion.
@@ -741,7 +741,7 @@
               "Unexpected property access ${nodeToString(node)}:\n"
               "${DebugPrinter.prettyPrint(node)}"));
       // Don't know....
-      return new CallPosition(
+      return CallPosition(
           node, CodePositionKind.START, SourcePositionKind.START);
     }
   }
@@ -885,7 +885,7 @@
   bool active;
 
   JavaScriptTracer(this.codePositions, this.reader, this.listeners,
-      {this.active: false});
+      {this.active = false});
 
   void notifyStart(js.Node node) {
     listeners.forEach((listener) => listener.onStart(node));
@@ -908,7 +908,7 @@
   }
 
   void notifyStep(js.Node node, Offset offset, StepKind kind,
-      {bool force: false}) {
+      {bool force = false}) {
     if (active || force) {
       listeners.forEach((listener) => listener.onStep(node, offset, kind));
     }
@@ -992,7 +992,7 @@
   }
 
   int getSyntaxOffset(js.Node node,
-      {CodePositionKind kind: CodePositionKind.START}) {
+      {CodePositionKind kind = CodePositionKind.START}) {
     CodePosition codePosition = codePositions[node];
     if (codePosition != null) {
       return codePosition.getPosition(kind);
@@ -1334,17 +1334,17 @@
     if (leftToRightOffset == null) {
       leftToRightOffset = statementOffset;
     }
-    return new Offset(statementOffset, leftToRightOffset, codeOffset);
+    return Offset(statementOffset, leftToRightOffset, codeOffset);
   }
 }
 
 class Coverage {
-  Set<js.Node> _nodesWithInfo = new Set<js.Node>();
+  Set<js.Node> _nodesWithInfo = Set<js.Node>();
   int _nodesWithInfoCount = 0;
-  Set<js.Node> _nodesWithoutInfo = new Set<js.Node>();
+  Set<js.Node> _nodesWithoutInfo = Set<js.Node>();
   int _nodesWithoutInfoCount = 0;
   Map<Type, int> _nodesWithoutInfoCountByType = <Type, int>{};
-  Set<js.Node> _nodesWithoutOffset = new Set<js.Node>();
+  Set<js.Node> _nodesWithoutOffset = Set<js.Node>();
   int _nodesWithoutOffsetCount = 0;
 
   void registerNodeWithInfo(js.Node node) {
@@ -1381,7 +1381,7 @@
 
   String getCoverageReport() {
     collapse();
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     int total = _nodesWithInfoCount + _nodesWithoutInfoCount;
     if (total > 0) {
       sb.write(_nodesWithInfoCount);
diff --git a/pkg/compiler/lib/src/io/source_file.dart b/pkg/compiler/lib/src/io/source_file.dart
index f091dee..49b27d8 100644
--- a/pkg/compiler/lib/src/io/source_file.dart
+++ b/pkg/compiler/lib/src/io/source_file.dart
@@ -28,7 +28,7 @@
   kernel.Source get kernelSource {
     // TODO(johnniwinther): Instead of creating a new Source object,
     // we should use the one provided by the front-end.
-    return cachedKernelSource ??= new kernel.Source(
+    return cachedKernelSource ??= kernel.Source(
         lineStarts,
         slowUtf8ZeroTerminatedBytes(),
         uri /* TODO(jensj): What is the import URI? */,
@@ -107,7 +107,7 @@
   /// Use [colorize] to wrap source code text and marker characters in color
   /// escape codes.
   String getLocationMessage(String message, int start, int end,
-      {bool includeSourceLine: true, String colorize(String text)}) {
+      {bool includeSourceLine = true, String colorize(String text)}) {
     if (colorize == null) {
       colorize = (text) => text;
     }
@@ -119,7 +119,7 @@
     int lineEnd = endLocation.line - 1;
     int columnEnd = endLocation.column - 1;
 
-    StringBuffer buf = new StringBuffer('${filename}:');
+    StringBuffer buf = StringBuffer('${filename}:');
     if (start != end || start != 0) {
       // Line/column info is relevant.
       buf.write('${lineStart + 1}:${columnStart + 1}:');
@@ -173,7 +173,7 @@
 
 List<int> _zeroTerminateIfNecessary(List<int> bytes) {
   if (bytes.length > 0 && bytes.last == 0) return bytes;
-  List<int> result = new Uint8List(bytes.length + 1);
+  List<int> result = Uint8List(bytes.length + 1);
   result.setRange(0, bytes.length, bytes);
   result[result.length - 1] = 0;
   return result;
@@ -266,7 +266,7 @@
       : this(uri, uri.toString(), text);
 
   StringSourceFile.fromName(String filename, String text)
-      : this(new Uri(path: filename), filename, text);
+      : this(Uri(path: filename), filename, text);
 
   @override
   List<int> get data => utf8.encode(text);
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index 0034fb5..d31486b 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -88,7 +88,7 @@
         () => SourceInformation.readFromDataSource(source));
     String inlinedMethodName = source.readString();
     source.end(tag);
-    return new FrameContext(callInformation, inlinedMethodName);
+    return FrameContext(callInformation, inlinedMethodName);
   }
 
   void writeToDataSink(DataSink sink) {
@@ -112,7 +112,7 @@
   /// Create a [SourceInformationBuilder] for [member].
   SourceInformationBuilder createBuilderForContext(
       covariant MemberEntity member) {
-    return new SourceInformationBuilder();
+    return SourceInformationBuilder();
   }
 
   /// Generate [SourceInformation] marker for non-preamble code.
@@ -288,8 +288,7 @@
       int column = source.readInt();
       String sourceName = source.readString();
       source.end(tag);
-      return new DirectSourceLocation(
-          sourceUri, offset, line, column, sourceName);
+      return DirectSourceLocation(sourceUri, offset, line, column, sourceName);
     }
   }
 
@@ -361,7 +360,7 @@
     assert(
         offset < _sourceFile.length,
         failedAt(
-            new SourceSpan(sourceUri, 0, 0),
+            SourceSpan(sourceUri, 0, 0),
             "Invalid source location in ${sourceUri}: "
             "offset=$offset, length=${_sourceFile.length}."));
   }
@@ -442,7 +441,7 @@
 /// Compute the suffix used for a parameter stub for [callStructure].
 String computeStubSuffix(CallStructure callStructure) {
   if (callStructure == null) return '';
-  StringBuffer sb = new StringBuffer();
+  StringBuffer sb = StringBuffer();
   sb.write(r'[function-entry$');
   sb.write(callStructure.positionalArgumentCount);
   if (callStructure.namedArguments.isNotEmpty) {
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index a630dd5..aad5b6e 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -41,7 +41,7 @@
       this.frames);
 
   void addMapping(int targetOffset, SourceLocation sourceLocation) {
-    entries.add(new SourceMapEntry(sourceLocation, targetOffset));
+    entries.add(SourceMapEntry(sourceLocation, targetOffset));
   }
 
   void printStringListOn(Iterable<String> strings, StringBuffer buffer) {
@@ -59,7 +59,7 @@
 
   String build() {
     LineColumnMap<SourceMapEntry> lineColumnMap =
-        new LineColumnMap<SourceMapEntry>();
+        LineColumnMap<SourceMapEntry>();
     Map<Uri, LineColumnMap<SourceMapEntry>> sourceLocationMap =
         <Uri, LineColumnMap<SourceMapEntry>>{};
     entries.forEach((SourceMapEntry sourceMapEntry) {
@@ -73,8 +73,8 @@
       if (location != null) {
         if (location.sourceUri != null) {
           LineColumnMap<SourceMapEntry> sourceLineColumnMap =
-              sourceLocationMap.putIfAbsent(location.sourceUri,
-                  () => new LineColumnMap<SourceMapEntry>());
+              sourceLocationMap.putIfAbsent(
+                  location.sourceUri, () => LineColumnMap<SourceMapEntry>());
           sourceLineColumnMap.add(
               location.line - 1, location.column - 1, sourceMapEntry);
         }
@@ -85,8 +85,8 @@
   }
 
   String _build(LineColumnMap<SourceMapEntry> lineColumnMap) {
-    IndexMap<Uri> uriMap = new IndexMap<Uri>();
-    IndexMap<String> nameMap = new IndexMap<String>();
+    IndexMap<Uri> uriMap = IndexMap<Uri>();
+    IndexMap<String> nameMap = IndexMap<String>();
 
     void registerLocation(SourceLocation sourceLocation) {
       if (sourceLocation != null) {
@@ -114,10 +114,10 @@
       }
     }
 
-    StringBuffer mappingsBuffer = new StringBuffer();
+    StringBuffer mappingsBuffer = StringBuffer();
     writeEntries(lineColumnMap, uriMap, nameMap, mappingsBuffer);
 
-    StringBuffer buffer = new StringBuffer();
+    StringBuffer buffer = StringBuffer();
     buffer.write('{\n');
     buffer.write('  "version": 3,\n');
     buffer.write('  "engine": "$version",\n');
@@ -158,12 +158,12 @@
       IndexMap<String> nameMap, StringBuffer output) {
     SourceLocation previousSourceLocation;
     int previousTargetLine = 0;
-    DeltaEncoder targetColumnEncoder = new DeltaEncoder();
+    DeltaEncoder targetColumnEncoder = DeltaEncoder();
     bool firstEntryInLine = true;
-    DeltaEncoder sourceUriIndexEncoder = new DeltaEncoder();
-    DeltaEncoder sourceLineEncoder = new DeltaEncoder();
-    DeltaEncoder sourceColumnEncoder = new DeltaEncoder();
-    DeltaEncoder sourceNameIndexEncoder = new DeltaEncoder();
+    DeltaEncoder sourceUriIndexEncoder = DeltaEncoder();
+    DeltaEncoder sourceLineEncoder = DeltaEncoder();
+    DeltaEncoder sourceColumnEncoder = DeltaEncoder();
+    DeltaEncoder sourceNameIndexEncoder = DeltaEncoder();
 
     entries.forEach((int targetLine, int targetColumn, SourceMapEntry entry) {
       SourceLocation sourceLocation = entry.sourceLocation;
@@ -283,7 +283,7 @@
     int index = 0;
     sourceLocationsProvider.sourceLocations
         .forEach((SourceLocations sourceLocations) {
-      SourceMapBuilder sourceMapBuilder = new SourceMapBuilder(
+      SourceMapBuilder sourceMapBuilder = SourceMapBuilder(
           sourceLocations.name,
           sourceMapUri,
           fileUri,
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 9c8328e..1b1ac8e 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -16,18 +16,17 @@
 export 'js_debug.dart';
 
 String prettyPrint(Node node,
-    {bool enableMinification: false,
-    bool allowVariableMinification: true,
-    bool preferSemicolonToNewlineInMinifiedOutput: false}) {
+    {bool enableMinification = false,
+    bool allowVariableMinification = true,
+    bool preferSemicolonToNewlineInMinifiedOutput = false}) {
   // TODO(johnniwinther): Do we need all the options here?
-  JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
+  JavaScriptPrintingOptions options = JavaScriptPrintingOptions(
       shouldCompressOutput: enableMinification,
       minifyLocalVariables: allowVariableMinification,
       preferSemicolonToNewlineInMinifiedOutput:
           preferSemicolonToNewlineInMinifiedOutput);
-  SimpleJavaScriptPrintingContext context =
-      new SimpleJavaScriptPrintingContext();
-  Printer printer = new Printer(options, context);
+  SimpleJavaScriptPrintingContext context = SimpleJavaScriptPrintingContext();
+  Printer printer = Printer(options, context);
   printer.visit(node);
   return context.getText();
 }
@@ -35,20 +34,18 @@
 CodeBuffer createCodeBuffer(Node node, CompilerOptions compilerOptions,
     JavaScriptSourceInformationStrategy sourceInformationStrategy,
     {DumpInfoTask monitor,
-    bool allowVariableMinification: true,
-    List<CodeOutputListener> listeners: const []}) {
-  JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
+    bool allowVariableMinification = true,
+    List<CodeOutputListener> listeners = const []}) {
+  JavaScriptPrintingOptions options = JavaScriptPrintingOptions(
       shouldCompressOutput: compilerOptions.enableMinification,
       minifyLocalVariables: allowVariableMinification);
-  CodeBuffer outBuffer = new CodeBuffer(listeners);
+  CodeBuffer outBuffer = CodeBuffer(listeners);
   SourceInformationProcessor sourceInformationProcessor =
       sourceInformationStrategy.createProcessor(
-          new SourceMapperProviderImpl(outBuffer),
-          const SourceInformationReader());
-  Dart2JSJavaScriptPrintingContext context =
-      new Dart2JSJavaScriptPrintingContext(
-          monitor, outBuffer, sourceInformationProcessor);
-  Printer printer = new Printer(options, context);
+          SourceMapperProviderImpl(outBuffer), const SourceInformationReader());
+  Dart2JSJavaScriptPrintingContext context = Dart2JSJavaScriptPrintingContext(
+      monitor, outBuffer, sourceInformationProcessor);
+  Printer printer = Printer(options, context);
   printer.visit(node);
   sourceInformationProcessor.process(node, outBuffer);
   return outBuffer;
diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
index f37ce23..11b3b83 100644
--- a/pkg/compiler/lib/src/js/js_debug.dart
+++ b/pkg/compiler/lib/src/js/js_debug.dart
@@ -12,12 +12,12 @@
 import '../io/code_output.dart' show BufferedCodeOutput;
 
 /// Unparse the JavaScript [node].
-String nodeToString(Node node, {bool pretty: false}) {
-  JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
+String nodeToString(Node node, {bool pretty = false}) {
+  JavaScriptPrintingOptions options = JavaScriptPrintingOptions(
       shouldCompressOutput: !pretty,
       preferSemicolonToNewlineInMinifiedOutput: !pretty);
-  LenientPrintingContext printingContext = new LenientPrintingContext();
-  new Printer(options, printingContext).visit(node);
+  LenientPrintingContext printingContext = LenientPrintingContext();
+  Printer(options, printingContext).visit(node);
   return printingContext.getText();
 }
 
@@ -25,7 +25,7 @@
 /// JavaScript [Node].
 class DebugPrinter extends BaseVisitor with Indentation, Tagging<Node> {
   @override
-  StringBuffer sb = new StringBuffer();
+  StringBuffer sb = StringBuffer();
 
   void visitNodeWithChildren(Node node, String type, [Map params]) {
     openNode(node, type, params);
@@ -55,7 +55,7 @@
 
   /// Pretty-prints given node tree into string.
   static String prettyPrint(Node node) {
-    var p = new DebugPrinter();
+    var p = DebugPrinter();
     node.accept(p);
     return p.sb.toString();
   }
diff --git a/pkg/compiler/lib/src/js/js_source_mapping.dart b/pkg/compiler/lib/src/js/js_source_mapping.dart
index ff8a155..8b53feb 100644
--- a/pkg/compiler/lib/src/js/js_source_mapping.dart
+++ b/pkg/compiler/lib/src/js/js_source_mapping.dart
@@ -65,7 +65,7 @@
 
   @override
   SourceMapper createSourceMapper(String name) {
-    return new SourceLocationsMapper(provider.createSourceLocations(name));
+    return SourceLocationsMapper(provider.createSourceLocations(name));
   }
 }
 
@@ -83,7 +83,7 @@
   ///
   /// If [isEmpty] is true, also associate that the inlining stack is empty at
   /// [codeOffset].
-  void registerPop(int codeOffset, {bool isEmpty: false});
+  void registerPop(int codeOffset, {bool isEmpty = false});
 }
 
 /// An implementation of [SourceMapper] that stores the information directly
@@ -105,7 +105,7 @@
   }
 
   @override
-  void registerPop(int codeOffset, {bool isEmpty: false}) {
+  void registerPop(int codeOffset, {bool isEmpty = false}) {
     sourceLocations.addPop(codeOffset, isEmpty);
   }
 }
diff --git a/pkg/compiler/lib/src/js/placeholder_safety.dart b/pkg/compiler/lib/src/js/placeholder_safety.dart
index a83a708..dc5d7a7 100644
--- a/pkg/compiler/lib/src/js/placeholder_safety.dart
+++ b/pkg/compiler/lib/src/js/placeholder_safety.dart
@@ -6,7 +6,7 @@
 
 import "js.dart" as js;
 
-typedef bool PositionPredicate(int position);
+typedef PositionPredicate = bool Function(int position);
 
 /// PlaceholderSafetyAnalysis determines which placeholders in a JavaScript
 /// template may be replaced with an arbitrary expression. Placeholders may be
@@ -40,7 +40,7 @@
   /// `false` if the value is never null.
   static int analyze(js.Node node, PositionPredicate isNullableInput) {
     PlaceholderSafetyAnalysis analysis =
-        new PlaceholderSafetyAnalysis._(isNullableInput);
+        PlaceholderSafetyAnalysis._(isNullableInput);
     analysis.visit(node);
     return analysis.maxSafePosition + 1;
   }
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index ae05423..03f8c93 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -30,11 +30,11 @@
   // collected here.
   List<js.VariableDeclaration> localVariables = <js.VariableDeclaration>[];
 
-  Map<js.Node, int> continueLabels = new Map<js.Node, int>();
-  Map<js.Node, int> breakLabels = new Map<js.Node, int>();
+  Map<js.Node, int> continueLabels = Map<js.Node, int>();
+  Map<js.Node, int> breakLabels = Map<js.Node, int>();
 
   /// The label of a finally part.
-  Map<js.Block, int> finallyLabels = new Map<js.Block, int>();
+  Map<js.Block, int> finallyLabels = Map<js.Block, int>();
 
   /// The label of the catch handler of a [js.Try] or a [js.Fun] or [js.Catch].
   ///
@@ -45,7 +45,7 @@
   /// - The handler of a [js.Catch] is a synthetic handler that ensures the
   ///   right finally blocks are run if an error is thrown inside a
   ///   catch-handler.
-  Map<js.Node, int> handlerLabels = new Map<js.Node, int>();
+  Map<js.Node, int> handlerLabels = Map<js.Node, int>();
 
   int exitLabel;
   int rethrowLabel;
@@ -105,7 +105,7 @@
   ///
   /// It is a parameter to the [body] function, so that [awaitStatement] can
   /// call [body] with the result of an awaited Future.
-  js.VariableUse get result => new js.VariableUse(resultName);
+  js.VariableUse get result => js.VariableUse(resultName);
   String resultName;
 
   /// A parameter to the [bodyName] function. Indicating if we are in success
@@ -120,11 +120,11 @@
   ///
   /// To "goto" a label, the label is assigned to this variable, and break out
   /// of the switch to take another iteration in the while loop. See [addGoto]
-  js.VariableUse get goto => new js.VariableUse(gotoName);
+  js.VariableUse get goto => js.VariableUse(gotoName);
   String gotoName;
 
   /// Variable containing the label of the current error handler.
-  js.VariableUse get handler => new js.VariableUse(handlerName);
+  js.VariableUse get handler => js.VariableUse(handlerName);
   String handlerName;
 
   /// Set to `true` if any of the switch statement labels is a handler. At the
@@ -137,15 +137,15 @@
 
   /// A stack of labels of finally blocks to visit, and the label to go to after
   /// the last.
-  js.VariableUse get next => new js.VariableUse(nextName);
+  js.VariableUse get next => js.VariableUse(nextName);
   String nextName;
 
   /// The current returned value (a finally block may overwrite it).
-  js.VariableUse get returnValue => new js.VariableUse(returnValueName);
+  js.VariableUse get returnValue => js.VariableUse(returnValueName);
   String returnValueName;
 
   /// Stores the current error when we are in the process of handling an error.
-  js.VariableUse get currentError => new js.VariableUse(currentErrorName);
+  js.VariableUse get currentError => js.VariableUse(currentErrorName);
   String currentErrorName;
 
   /// The label of the outer loop.
@@ -156,7 +156,7 @@
 
   /// If javascript `this` is used, it is accessed via this variable, in the
   /// [bodyName] function.
-  js.VariableUse get self => new js.VariableUse(selfName);
+  js.VariableUse get self => js.VariableUse(selfName);
   String selfName;
 
   /// The rewritten code can take type arguments. These are added if needed.
@@ -176,7 +176,7 @@
   int currentTempVarIndex = 0;
   // The highest temporary variable index ever in use in this function.
   int tempVarHighWaterMark = 0;
-  Map<int, js.Expression> tempVarNames = new Map<int, js.Expression>();
+  Map<int, js.Expression> tempVarNames = Map<int, js.Expression>();
 
   bool get isAsync => false;
   bool get isSyncStar => false;
@@ -197,7 +197,7 @@
       [Spannable spannable]) {
     _spannable = spannable;
 
-    analysis = new PreTranslationAnalysis(unsupported);
+    analysis = PreTranslationAnalysis(unsupported);
     analysis.analyze(node);
 
     // To avoid name collisions with existing names, the fresh names are
@@ -231,7 +231,7 @@
 
   js.VariableUse useTempVar(int i) {
     return tempVarNames.putIfAbsent(
-        i, () => new js.VariableUse(freshName("temp$i")));
+        i, () => js.VariableUse(freshName("temp$i")));
   }
 
   /// Generates a variable name with [safeVariableName] based on [originalName]
@@ -252,7 +252,7 @@
     if (types == null) {
       String name = freshName('type');
       typeArgumentNames.add(name);
-      return <js.Expression>[new js.VariableUse(name)];
+      return <js.Expression>[js.VariableUse(name)];
     }
     return types;
   }
@@ -262,10 +262,10 @@
   ///
   /// The order is important, therefore the type is explicitly LinkedHashMap.
   LinkedHashMap<int, List<js.Statement>> labelledParts =
-      new LinkedHashMap<int, List<js.Statement>>();
+      LinkedHashMap<int, List<js.Statement>>();
 
   /// Description of each label for readability of the non-minified output.
-  Map<int, String> labelComments = new Map<int, String>();
+  Map<int, String> labelComments = Map<int, String>();
 
   /// True if the function has any try blocks containing await.
   bool hasTryBlocks = false;
@@ -305,14 +305,14 @@
     assert(!labelledParts.containsKey(label));
     currentStatementBuffer = <js.Statement>[];
     labelledParts[label] = currentStatementBuffer;
-    addStatement(new js.Comment(labelComments[label]));
+    addStatement(js.Comment(labelComments[label]));
   }
 
   /// Returns a statement assigning to the variable named [gotoName].
   /// This should be followed by a break for the goto to be executed. Use
   /// [gotoWithBreak] or [addGoto] for this.
   js.Statement setGotoVariable(int label, SourceInformation sourceInformation) {
-    return new js.ExpressionStatement(js.js('# = #',
+    return js.ExpressionStatement(js.js('# = #',
         [goto, js.number(label)]).withSourceInformation(sourceInformation));
   }
 
@@ -322,18 +322,17 @@
   js.Block gotoAndBreak(int label, SourceInformation sourceInformation) {
     List<js.Statement> statements = <js.Statement>[];
     if (labelComments.containsKey(label)) {
-      statements.add(new js.Comment("goto ${labelComments[label]}"));
+      statements.add(js.Comment("goto ${labelComments[label]}"));
     }
     statements.add(setGotoVariable(label, sourceInformation));
     if (insideUntranslatedBreakable) {
       hasJumpThoughOuterLabel = true;
-      statements.add(new js.Break(outerLabelName)
-          .withSourceInformation(sourceInformation));
+      statements.add(
+          js.Break(outerLabelName).withSourceInformation(sourceInformation));
     } else {
-      statements
-          .add(new js.Break(null).withSourceInformation(sourceInformation));
+      statements.add(js.Break(null).withSourceInformation(sourceInformation));
     }
-    return new js.Block(statements);
+    return js.Block(statements);
   }
 
   /// Adds a goto to [label] including the break.
@@ -341,7 +340,7 @@
   /// Also inserts a comment describing the label if available.
   void addGoto(int label, SourceInformation sourceInformation) {
     if (labelComments.containsKey(label)) {
-      addStatement(new js.Comment("goto ${labelComments[label]}"));
+      addStatement(js.Comment("goto ${labelComments[label]}"));
     }
     addStatement(setGotoVariable(label, sourceInformation));
 
@@ -353,7 +352,7 @@
   }
 
   void addExpressionStatement(js.Expression node) {
-    addStatement(new js.ExpressionStatement(node));
+    addStatement(js.ExpressionStatement(node));
   }
 
   /// True if there is an await or yield in [node] or some subexpression.
@@ -362,7 +361,7 @@
   }
 
   void unsupported(js.Node node) {
-    throw new UnsupportedError(
+    throw UnsupportedError(
         "Node $node cannot be transformed by the await-sync transformer");
   }
 
@@ -470,7 +469,7 @@
     if (selector == null) {
       result = fn(storedIfNeeded);
     } else {
-      result = fn(new js.PropertyAccess(storedIfNeeded, selector));
+      result = fn(js.PropertyAccess(storedIfNeeded, selector));
     }
     currentTempVarIndex = oldTempVarIndex;
     return result;
@@ -714,12 +713,12 @@
     addFunctionExits(exitSourceInformation);
 
     List<js.SwitchClause> clauses = labelledParts.keys.map((label) {
-      return new js.Case(js.number(label), new js.Block(labelledParts[label]));
+      return js.Case(js.number(label), js.Block(labelledParts[label]));
     }).toList();
-    js.Statement rewrittenBody = new js.Switch(goto, clauses)
-        .withSourceInformation(bodySourceInformation);
+    js.Statement rewrittenBody =
+        js.Switch(goto, clauses).withSourceInformation(bodySourceInformation);
     if (hasJumpThoughOuterLabel) {
-      rewrittenBody = new js.LabeledStatement(outerLabelName, rewrittenBody);
+      rewrittenBody = js.LabeledStatement(outerLabelName, rewrittenBody);
     }
     rewrittenBody = js.js
         .statement('while (true) {#}', rewrittenBody)
@@ -736,8 +735,8 @@
           _makeVariableInitializer(currentError, null, bodySourceInformation));
     }
     if (analysis.hasFinally || (isAsyncStar && analysis.hasYield)) {
-      variables.add(_makeVariableInitializer(next,
-          new js.ArrayInitializer(<js.Expression>[]), bodySourceInformation));
+      variables.add(_makeVariableInitializer(
+          next, js.ArrayInitializer(<js.Expression>[]), bodySourceInformation));
     }
     if (analysis.hasThis && !isSyncStar) {
       // Sync* functions must remember `this` on the level of the outer
@@ -746,18 +745,18 @@
           _makeVariableInitializer(self, js.js('this'), bodySourceInformation));
     }
     variables.addAll(localVariables.map((js.VariableDeclaration declaration) {
-      return new js.VariableInitialization(declaration, null);
+      return js.VariableInitialization(declaration, null);
     }));
-    variables.addAll(new Iterable.generate(
+    variables.addAll(Iterable.generate(
         tempVarHighWaterMark,
         (int i) => _makeVariableInitializer(
             useTempVar(i + 1).name, null, bodySourceInformation)));
     js.VariableDeclarationList variableDeclarations =
-        new js.VariableDeclarationList(variables);
+        js.VariableDeclarationList(variables);
 
     // Names are already safe when added.
     List<js.Parameter> typeParameters =
-        typeArgumentNames.map((name) => new js.Parameter(name)).toList();
+        typeArgumentNames.map((name) => js.Parameter(name)).toList();
     return finishFunction(node.params, typeParameters, rewrittenBody,
         variableDeclarations, node.sourceInformation, bodySourceInformation);
   }
@@ -797,15 +796,15 @@
   @override
   js.Expression visitArrayInitializer(js.ArrayInitializer node) {
     return withExpressions(node.elements, (elements) {
-      return new js.ArrayInitializer(elements);
+      return js.ArrayInitializer(elements);
     });
   }
 
   @override
   js.Expression visitAssignment(js.Assignment node) {
     if (!shouldTransform(node)) {
-      return new js.Assignment.compound(visitExpression(node.leftHandSide),
-          node.op, visitExpression(node.value));
+      return js.Assignment.compound(visitExpression(node.leftHandSide), node.op,
+          visitExpression(node.value));
     }
     js.Expression leftHandSide = node.leftHandSide;
     if (leftHandSide is js.VariableUse) {
@@ -813,15 +812,15 @@
         // A non-compound [js.Assignment] has `op==null`. So it works out to
         // use [js.Assignment.compound] for all cases.
         // Visit the [js.VariableUse] to ensure renaming is done correctly.
-        return new js.Assignment.compound(
+        return js.Assignment.compound(
             visitExpression(leftHandSide), node.op, value);
       }, store: false);
     } else if (leftHandSide is js.PropertyAccess) {
       return withExpressions(
           [leftHandSide.receiver, leftHandSide.selector, node.value],
           (evaluated) {
-        return new js.Assignment.compound(
-            new js.PropertyAccess(evaluated[0], evaluated[1]),
+        return js.Assignment.compound(
+            js.PropertyAccess(evaluated[0], evaluated[1]),
             node.op,
             evaluated[2]);
       });
@@ -867,7 +866,7 @@
       int joinLabel = newLabel("join");
       withExpression(node.left, (js.Expression left) {
         js.Statement assignLeft = isResult(left)
-            ? new js.Block.empty()
+            ? js.Block.empty()
             : js.js.statement('# = #;', [result, left]);
         if (node.op == "&&") {
           addStatement(js.js.statement('if (#) {#} else #', [
@@ -896,7 +895,7 @@
     }
 
     return withExpression2(node.left, node.right,
-        (left, right) => new js.Binary(node.op, left, right));
+        (left, right) => js.Binary(node.op, left, right));
   }
 
   @override
@@ -921,7 +920,7 @@
     bool storeTarget = node.arguments.any(shouldTransform);
     return withCallTargetExpression(node.target, (target) {
       return withExpressions(node.arguments, (List<js.Expression> arguments) {
-        return new js.Call(target, arguments)
+        return js.Call(target, arguments)
             .withSourceInformation(node.sourceInformation);
       });
     }, store: storeTarget);
@@ -990,10 +989,10 @@
   void addBreak(SourceInformation sourceInformation) {
     if (insideUntranslatedBreakable) {
       hasJumpThoughOuterLabel = true;
-      addStatement(new js.Break(outerLabelName)
-          .withSourceInformation(sourceInformation));
+      addStatement(
+          js.Break(outerLabelName).withSourceInformation(sourceInformation));
     } else {
-      addStatement(new js.Break(null).withSourceInformation(sourceInformation));
+      addStatement(js.Break(null).withSourceInformation(sourceInformation));
     }
   }
 
@@ -1023,9 +1022,9 @@
     // now.
     int firstTarget = jumpStack.removeLast();
     if (jumpStack.isNotEmpty) {
-      js.Expression jsJumpStack = new js.ArrayInitializer(
+      js.Expression jsJumpStack = js.ArrayInitializer(
           jumpStack.map((int label) => js.number(label)).toList());
-      addStatement(new js.ExpressionStatement(js.js("# = #",
+      addStatement(js.ExpressionStatement(js.js("# = #",
           [next, jsJumpStack]).withSourceInformation(sourceInformation)));
     }
     addGoto(firstTarget, sourceInformation);
@@ -1085,7 +1084,7 @@
       // withExpressions handles that.
       withExpressions([node.init, node.condition, node.update],
           (List<js.Expression> transformed) {
-        addStatement(new js.For(transformed[0], transformed[1], transformed[2],
+        addStatement(js.For(transformed[0], transformed[1], transformed[2],
             translateToStatement(node.body)));
       });
       insideUntranslatedBreakable = oldInsideUntranslated;
@@ -1107,10 +1106,10 @@
     js.Expression condition = node.condition;
     if (condition == null ||
         (condition is js.LiteralBool && condition.value == true)) {
-      addStatement(new js.Comment("trivial condition"));
+      addStatement(js.Comment("trivial condition"));
     } else {
       withExpression(condition, (js.Expression condition) {
-        addStatement(new js.If.noElse(new js.Prefix("!", condition),
+        addStatement(js.If.noElse(js.Prefix("!", condition),
             gotoAndBreak(afterLabel, node.sourceInformation)));
       }, store: false);
     }
@@ -1149,11 +1148,11 @@
   js.Statement translateToStatement(js.Statement node) {
     List<js.Statement> statements = translateToStatementSequence(node);
     if (statements.length == 1) return statements.single;
-    return new js.Block(statements);
+    return js.Block(statements);
   }
 
   js.Block translateToBlock(js.Statement node) {
-    return new js.Block(translateToStatementSequence(node));
+    return js.Block(translateToStatementSequence(node));
   }
 
   @override
@@ -1162,7 +1161,7 @@
       withExpression(node.condition, (js.Expression condition) {
         js.Statement translatedThen = translateToStatement(node.then);
         js.Statement translatedElse = translateToStatement(node.otherwise);
-        addStatement(new js.If(condition, translatedThen, translatedElse));
+        addStatement(js.If(condition, translatedThen, translatedElse));
       }, store: false);
       return;
     }
@@ -1172,9 +1171,9 @@
         (node.otherwise is js.EmptyStatement) ? joinLabel : newLabel("else");
 
     withExpression(node.condition, (js.Expression condition) {
-      addExpressionStatement(new js.Assignment(
+      addExpressionStatement(js.Assignment(
           goto,
-          new js.Conditional(
+          js.Conditional(
               condition, js.number(thenLabel), js.number(elseLabel))));
     }, store: false);
     addBreak(node.sourceInformation);
@@ -1220,7 +1219,7 @@
   void visitLabeledStatement(js.LabeledStatement node) {
     if (!shouldTransform(node)) {
       addStatement(
-          new js.LabeledStatement(node.label, translateToStatement(node.body)));
+          js.LabeledStatement(node.label, translateToStatement(node.body)));
       return;
     }
     // `continue label` is really continuing the nested loop.
@@ -1287,7 +1286,7 @@
     bool storeTarget = node.arguments.any(shouldTransform);
     return withCallTargetExpression(node.target, (target) {
       return withExpressions(node.arguments, (List<js.Expression> arguments) {
-        return new js.New(target, arguments);
+        return js.New(target, arguments);
       });
     }, store: storeTarget);
   }
@@ -1298,13 +1297,13 @@
     return withExpressions(
         node.properties.map((js.Property property) => property.value).toList(),
         (List<js.Node> values) {
-      List<js.Property> properties = new List.generate(values.length, (int i) {
+      List<js.Property> properties = List.generate(values.length, (int i) {
         if (node.properties[i] is js.MethodDefinition) {
-          return new js.MethodDefinition(node.properties[i].name, values[i]);
+          return js.MethodDefinition(node.properties[i].name, values[i]);
         }
-        return new js.Property(node.properties[i].name, values[i]);
+        return js.Property(node.properties[i].name, values[i]);
       });
-      return new js.ObjectInitializer(properties);
+      return js.ObjectInitializer(properties);
     });
   }
 
@@ -1316,12 +1315,11 @@
     if (node.op == "++" || node.op == "--") {
       js.Expression argument = node.argument;
       if (argument is js.VariableUse) {
-        return new js.Postfix(node.op, visitExpression(argument));
+        return js.Postfix(node.op, visitExpression(argument));
       } else if (argument is js.PropertyAccess) {
         return withExpression2(argument.receiver, argument.selector,
             (receiver, selector) {
-          return new js.Postfix(
-              node.op, new js.PropertyAccess(receiver, selector));
+          return js.Postfix(node.op, js.PropertyAccess(receiver, selector));
         });
       } else {
         throw "Unexpected postfix ${node.op} "
@@ -1329,7 +1327,7 @@
       }
     }
     return withExpression(node.argument,
-        (js.Expression argument) => new js.Postfix(node.op, argument),
+        (js.Expression argument) => js.Postfix(node.op, argument),
         store: false);
   }
 
@@ -1338,20 +1336,19 @@
     if (node.op == "++" || node.op == "--") {
       js.Expression argument = node.argument;
       if (argument is js.VariableUse) {
-        return new js.Prefix(node.op, visitExpression(argument));
+        return js.Prefix(node.op, visitExpression(argument));
       } else if (argument is js.PropertyAccess) {
         return withExpression2(argument.receiver, argument.selector,
             (receiver, selector) {
-          return new js.Prefix(
-              node.op, new js.PropertyAccess(receiver, selector));
+          return js.Prefix(node.op, js.PropertyAccess(receiver, selector));
         });
       } else {
         throw "Unexpected prefix ${node.op} operator "
             "argument ${node.argument}";
       }
     }
-    return withExpression(node.argument,
-        (js.Expression argument) => new js.Prefix(node.op, argument),
+    return withExpression(
+        node.argument, (js.Expression argument) => js.Prefix(node.op, argument),
         store: false);
   }
 
@@ -1362,14 +1359,14 @@
   js.Property visitProperty(js.Property node) {
     assert(node.runtimeType == js.Property);
     return withExpression(
-        node.value, (js.Expression value) => new js.Property(node.name, value),
+        node.value, (js.Expression value) => js.Property(node.name, value),
         store: false);
   }
 
   @override
   js.MethodDefinition visitMethodDefinition(js.MethodDefinition node) {
     return withExpression(node.function,
-        (js.Expression value) => new js.MethodDefinition(node.name, value),
+        (js.Expression value) => js.MethodDefinition(node.name, value),
         store: false);
   }
 
@@ -1407,14 +1404,12 @@
       withExpression(node.key, (js.Expression key) {
         List<js.SwitchClause> cases = node.cases.map((js.SwitchClause clause) {
           if (clause is js.Case) {
-            return new js.Case(
-                clause.expression, translateToBlock(clause.body));
+            return js.Case(clause.expression, translateToBlock(clause.body));
           } else {
-            return new js.Default(
-                translateToBlock((clause as js.Default).body));
+            return js.Default(translateToBlock((clause as js.Default).body));
           }
         }).toList();
-        addStatement(new js.Switch(key, cases));
+        addStatement(js.Switch(key, cases));
       }, store: false);
       insideUntranslatedBreakable = oldInsideUntranslated;
       return;
@@ -1424,7 +1419,7 @@
     breakLabels[node] = after;
 
     beginLabel(before);
-    List<int> labels = new List<int>.filled(node.cases.length, null);
+    List<int> labels = List<int>.filled(node.cases.length, null);
 
     bool anyCaseExpressionTransformed = node.cases.any(
         (js.SwitchClause x) => x is js.Case && shouldTransform(x.expression));
@@ -1444,8 +1439,7 @@
           } else if (clause is js.Case) {
             labels[i] = newLabel("case");
             withExpression(clause.expression, (expression) {
-              addStatement(new js.If.noElse(
-                  new js.Binary("===", key, expression),
+              addStatement(js.If.noElse(js.Binary("===", key, expression),
                   gotoAndBreak(labels[i], clause.sourceInformation)));
             }, store: false);
           }
@@ -1465,12 +1459,12 @@
       for (js.SwitchClause clause in node.cases) {
         if (clause is js.Case) {
           labels[i] = newLabel("case");
-          clauses.add(new js.Case(visitExpression(clause.expression),
+          clauses.add(js.Case(visitExpression(clause.expression),
               gotoAndBreak(labels[i], clause.sourceInformation)));
         } else if (clause is js.Default) {
           labels[i] = newLabel("default");
-          clauses.add(new js.Default(
-              gotoAndBreak(labels[i], clause.sourceInformation)));
+          clauses.add(
+              js.Default(gotoAndBreak(labels[i], clause.sourceInformation)));
           hasDefault = true;
         } else {
           reporter.internalError(spannable, "Unknown clause type $clause");
@@ -1478,11 +1472,10 @@
         i++;
       }
       if (!hasDefault) {
-        clauses
-            .add(new js.Default(gotoAndBreak(after, node.sourceInformation)));
+        clauses.add(js.Default(gotoAndBreak(after, node.sourceInformation)));
       }
       withExpression(node.key, (js.Expression key) {
-        addStatement(new js.Switch(key, clauses));
+        addStatement(js.Switch(key, clauses));
       }, store: false);
 
       addBreak(node.sourceInformation);
@@ -1505,8 +1498,8 @@
   @override
   void visitThrow(js.Throw node) {
     withExpression(node.expression, (js.Expression expression) {
-      addStatement(new js.Throw(expression)
-          .withSourceInformation(node.sourceInformation));
+      addStatement(
+          js.Throw(expression).withSourceInformation(node.sourceInformation));
     }, store: false);
   }
 
@@ -1541,12 +1534,12 @@
       js.Block body = translateToBlock(node.body);
       js.Catch catchPart = (node.catchPart == null)
           ? null
-          : new js.Catch(node.catchPart.declaration,
+          : js.Catch(node.catchPart.declaration,
               translateToBlock(node.catchPart.body));
       js.Block finallyPart = (node.finallyPart == null)
           ? null
           : translateToBlock(node.finallyPart);
-      addStatement(new js.Try(body, catchPart, finallyPart));
+      addStatement(js.Try(body, catchPart, finallyPart));
       return;
     }
 
@@ -1595,9 +1588,8 @@
       // is needed to avoid collisions.  See Ecma 262, 3rd edition,
       // section 12.14.
       String errorRename = freshName(node.catchPart.declaration.name);
-      localVariables.add(new js.VariableDeclaration(errorRename));
-      variableRenamings
-          .add(new Pair(node.catchPart.declaration.name, errorRename));
+      localVariables.add(js.VariableDeclaration(errorRename));
+      variableRenamings.add(Pair(node.catchPart.declaration.name, errorRename));
       addStatement(js.js.statement("# = #;", [errorRename, currentError]));
       visitStatement(node.catchPart.body);
       variableRenamings.removeLast();
@@ -1626,7 +1618,7 @@
       // blocks. Then [nextLabel] will be [rethrowLabel].
       addStatement(js.js.statement("# = #;", [
         next,
-        new js.ArrayInitializer(enclosingFinallies.map(js.number).toList())
+        js.ArrayInitializer(enclosingFinallies.map(js.number).toList())
       ]));
     }
     if (node.finallyPart == null) {
@@ -1641,7 +1633,7 @@
       beginLabel(finallyLabel);
       setErrorHandler();
       visitStatement(node.finallyPart);
-      addStatement(new js.Comment("// goto the next finally handler"));
+      addStatement(js.Comment("// goto the next finally handler"));
       addStatement(js.js.statement("# = #.pop();", [goto, next]));
       addBreak(node.sourceInformation);
     }
@@ -1661,7 +1653,7 @@
       if (initialization.value != null) {
         withExpression(initialization.value, (js.Expression value) {
           addExpressionStatement(
-              new js.Assignment(new js.VariableUse(declaration.name), value));
+              js.Assignment(js.VariableUse(declaration.name), value));
         }, store: false);
       }
     }
@@ -1679,7 +1671,7 @@
         (Pair renaming) => renaming.a == node.name,
         orElse: () => null);
     if (renaming == null) return node;
-    return new js.VariableUse(renaming.b);
+    return js.VariableUse(renaming.b);
   }
 
   @override
@@ -1688,7 +1680,7 @@
       bool oldInsideUntranslated = insideUntranslatedBreakable;
       insideUntranslatedBreakable = true;
       withExpression(node.condition, (js.Expression condition) {
-        addStatement(new js.While(condition, translateToStatement(node.body)));
+        addStatement(js.While(condition, translateToStatement(node.body)));
       }, store: false);
       insideUntranslatedBreakable = oldInsideUntranslated;
       return;
@@ -1703,7 +1695,7 @@
     // If the condition is `true`, a test is not needed.
     if (!(condition is js.LiteralBool && condition.value == true)) {
       withExpression(node.condition, (js.Expression condition) {
-        addStatement(new js.If.noElse(new js.Prefix("!", condition),
+        addStatement(js.If.noElse(js.Prefix("!", condition),
             gotoAndBreak(afterLabel, node.sourceInformation)));
       }, store: false);
     }
@@ -1735,14 +1727,14 @@
     js.Expression initValue, SourceInformation sourceInformation) {
   js.VariableDeclaration declaration;
   if (variable is js.VariableUse) {
-    declaration = new js.VariableDeclaration(variable.name);
+    declaration = js.VariableDeclaration(variable.name);
   } else if (variable is String) {
-    declaration = new js.VariableDeclaration(variable);
+    declaration = js.VariableDeclaration(variable);
   } else {
     assert(variable is js.VariableDeclaration);
     declaration = variable;
   }
-  return new js.VariableInitialization(declaration, initValue)
+  return js.VariableInitialization(declaration, initValue)
       .withSourceInformation(sourceInformation);
 }
 
@@ -1754,7 +1746,7 @@
   ///
   /// Not used for sync* or async* functions.
   String completerName;
-  js.VariableUse get completer => new js.VariableUse(completerName);
+  js.VariableUse get completer => js.VariableUse(completerName);
 
   /// The function called by an async function to initiate asynchronous
   /// execution of the body.  This is called with:
@@ -1825,7 +1817,7 @@
       "completer": completer
     }).withSourceInformation(sourceInformation);
     addStatement(
-        new js.Return(thenHelperCall).withSourceInformation(sourceInformation));
+        js.Return(thenHelperCall).withSourceInformation(sourceInformation));
   }
 
   /// Returning from an async method calls [asyncStarHelper] with the result.
@@ -1836,18 +1828,18 @@
     if (analysis.hasExplicitReturns) {
       beginLabel(exitLabel);
     } else {
-      addStatement(new js.Comment("implicit return"));
+      addStatement(js.Comment("implicit return"));
     }
 
     js.Expression runtimeHelperCall =
         js.js("#runtimeHelper(#returnValue, #completer)", {
       "runtimeHelper": asyncReturn,
       "returnValue":
-          analysis.hasExplicitReturns ? returnValue : new js.LiteralNull(),
+          analysis.hasExplicitReturns ? returnValue : js.LiteralNull(),
       "completer": completer
     }).withSourceInformation(sourceInformation);
-    addStatement(new js.Return(runtimeHelperCall)
-        .withSourceInformation(sourceInformation));
+    addStatement(
+        js.Return(runtimeHelperCall).withSourceInformation(sourceInformation));
   }
 
   @override
@@ -1883,8 +1875,7 @@
       "value": value,
       "bodyName": bodyName,
     }).withSourceInformation(sourceInformation);
-    return new js.Return(asyncHelperCall)
-        .withSourceInformation(sourceInformation);
+    return js.Return(asyncHelperCall).withSourceInformation(sourceInformation);
   }
 
   @override
@@ -1901,7 +1892,7 @@
       "asyncRethrow": asyncRethrow,
       "completer": completer,
     }).withSourceInformation(bodySourceInformation);
-    js.Return returnAsyncRethrow = new js.Return(asyncRethrowCall)
+    js.Return returnAsyncRethrow = js.Return(asyncRethrowCall)
         .withSourceInformation(bodySourceInformation);
     js.Statement errorCheck = js.js.statement("""
       if (#errorCode === #ERROR) {
@@ -1935,8 +1926,8 @@
       "bodyName": bodyName,
       "completer": completer,
     }).withSourceInformation(bodySourceInformation);
-    js.Return returnAsyncStart = new js.Return(asyncStartCall)
-        .withSourceInformation(bodySourceInformation);
+    js.Return returnAsyncStart =
+        js.Return(asyncStartCall).withSourceInformation(bodySourceInformation);
     js.Expression wrapBodyCall = js.js("#wrapBody(#innerFunction)", {
       "wrapBody": wrapBody,
       "innerFunction": innerFunction,
@@ -1997,12 +1988,12 @@
   void addYield(js.DartYield node, js.Expression expression,
       SourceInformation sourceInformation) {
     if (node.hasStar) {
-      addStatement(new js.Return(new js.Call(yieldStarExpression, [expression])
+      addStatement(js.Return(js.Call(yieldStarExpression, [expression])
               .withSourceInformation(sourceInformation))
           .withSourceInformation(sourceInformation));
     } else {
       addStatement(
-          new js.Return(expression).withSourceInformation(sourceInformation));
+          js.Return(expression).withSourceInformation(sourceInformation));
     }
   }
 
@@ -2024,12 +2015,12 @@
     for (js.Parameter parameter in parameters) {
       String name = parameter.name;
       String renamedName = freshName(name);
-      renamedParameters.add(new js.Parameter(renamedName));
-      declarations.add(new js.VariableInitialization(
-          new js.VariableDeclaration(name), new js.VariableUse(renamedName)));
+      renamedParameters.add(js.Parameter(renamedName));
+      declarations.add(js.VariableInitialization(
+          js.VariableDeclaration(name), js.VariableUse(renamedName)));
     }
     js.VariableDeclarationList copyParameters =
-        new js.VariableDeclarationList(declarations);
+        js.VariableDeclarationList(declarations);
 
     js.Expression setCurrentError = js.js("#currentError = #result", {
       "result": resultName,
@@ -2060,7 +2051,7 @@
       "result": resultName,
       "checkErrorCode": checkErrorCode,
     }).withSourceInformation(functionSourceInformation);
-    js.Return returnInnerInnerFunction = new js.Return(innerInnerFunction)
+    js.Return returnInnerInnerFunction = js.Return(innerInnerFunction)
         .withSourceInformation(bodySourceInformation);
     js.Fun innerFunction = js.js("""
           function () {
@@ -2081,7 +2072,7 @@
       "type": iterableFactoryTypeArguments,
       "innerFunction": innerFunction,
     }).withSourceInformation(bodySourceInformation);
-    js.Statement returnCallIterableFactory = new js.Return(callIterableFactory)
+    js.Statement returnCallIterableFactory = js.Return(callIterableFactory)
         .withSourceInformation(bodySourceInformation);
     return js.js("""
           function (#renamedParameters, #typeParameters) {
@@ -2106,7 +2097,7 @@
       uncaughtErrorExpression,
       currentError
     ]).withSourceInformation(sourceInformation);
-    addStatement(new js.Return(uncaughtErrorExpressionCall)
+    addStatement(js.Return(uncaughtErrorExpressionCall)
         .withSourceInformation(sourceInformation));
   }
 
@@ -2116,12 +2107,12 @@
     if (analysis.hasExplicitReturns) {
       beginLabel(exitLabel);
     } else {
-      addStatement(new js.Comment("implicit return"));
+      addStatement(js.Comment("implicit return"));
     }
     js.Expression endOfIterationCall =
         js.js('#()', [endOfIteration]).withSourceInformation(sourceInformation);
-    addStatement(new js.Return(endOfIterationCall)
-        .withSourceInformation(sourceInformation));
+    addStatement(
+        js.Return(endOfIterationCall).withSourceInformation(sourceInformation));
   }
 
   @override
@@ -2152,14 +2143,14 @@
   /// The stack of labels of finally blocks to assign to [next] if the
   /// async* [StreamSubscription] was canceled during a yield.
   js.VariableUse get nextWhenCanceled {
-    return new js.VariableUse(nextWhenCanceledName);
+    return js.VariableUse(nextWhenCanceledName);
   }
 
   String nextWhenCanceledName;
 
   /// The StreamController that controls an async* function.
   String controllerName;
-  js.VariableUse get controller => new js.VariableUse(controllerName);
+  js.VariableUse get controller => js.VariableUse(controllerName);
 
   /// The function called by an async* function to simulate an await, yield or
   /// yield*.
@@ -2232,7 +2223,7 @@
         .map((js.Node node) => finallyLabels[node]));
     addStatement(js.js.statement("# = #;", [
       nextWhenCanceled,
-      new js.ArrayInitializer(enclosingFinallyLabels.map(js.number).toList())
+      js.ArrayInitializer(enclosingFinallyLabels.map(js.number).toList())
     ]).withSourceInformation(sourceInformation));
     js.Expression yieldExpressionCall = js.js("#yieldExpression(#expression)", {
       "yieldExpression": node.hasStar ? yieldStarExpression : yieldExpression,
@@ -2245,7 +2236,7 @@
       "bodyName": bodyName,
       "controller": controllerName,
     }).withSourceInformation(sourceInformation);
-    addStatement(new js.Return(asyncStarHelperCall)
+    addStatement(js.Return(asyncStarHelperCall)
         .withSourceInformation(sourceInformation));
   }
 
@@ -2277,7 +2268,7 @@
       "handler": handler,
     }).withSourceInformation(bodySourceInformation);
     js.Statement breakStatement =
-        new js.Break(null).withSourceInformation(bodySourceInformation);
+        js.Break(null).withSourceInformation(bodySourceInformation);
     js.Statement switchCase = js.js.statement("""
         switch (#errorCode) {
           case #STREAM_WAS_CANCELED:
@@ -2342,9 +2333,8 @@
       "streamOfController": streamOfController,
       "controller": controllerName,
     }).withSourceInformation(bodySourceInformation);
-    js.Return returnStreamOfControllerCall =
-        new js.Return(streamOfControllerCall)
-            .withSourceInformation(bodySourceInformation);
+    js.Return returnStreamOfControllerCall = js.Return(streamOfControllerCall)
+        .withSourceInformation(bodySourceInformation);
     return js.js("""
         function (#parameters, #typeParameters) {
           #declareBodyName;
@@ -2370,8 +2360,8 @@
       "currentError": currentError,
       "controller": controllerName
     }).withSourceInformation(sourceInformation);
-    addStatement(new js.Return(asyncHelperCall)
-        .withSourceInformation(sourceInformation));
+    addStatement(
+        js.Return(asyncHelperCall).withSourceInformation(sourceInformation));
   }
 
   /// Returning from an async* function calls the [streamHelper] with an
@@ -2386,8 +2376,8 @@
       "successCode": js.number(error_codes.SUCCESS),
       "controller": controllerName
     }).withSourceInformation(sourceInformation);
-    addStatement(new js.Return(streamHelperCall)
-        .withSourceInformation(sourceInformation));
+    addStatement(
+        js.Return(streamHelperCall).withSourceInformation(sourceInformation));
   }
 
   @override
@@ -2427,8 +2417,7 @@
       "bodyName": bodyName,
       "controller": controllerName
     }).withSourceInformation(sourceInformation);
-    return new js.Return(asyncHelperCall)
-        .withSourceInformation(sourceInformation);
+    return js.Return(asyncHelperCall).withSourceInformation(sourceInformation);
   }
 }
 
@@ -2439,12 +2428,12 @@
 /// - a set of used names.
 /// - if any [This]-expressions are used.
 class PreTranslationAnalysis extends js.BaseVisitor<bool> {
-  Set<js.Node> hasAwaitOrYield = new Set<js.Node>();
+  Set<js.Node> hasAwaitOrYield = Set<js.Node>();
 
-  Map<js.Node, js.Node> targets = new Map<js.Node, js.Node>();
+  Map<js.Node, js.Node> targets = Map<js.Node, js.Node>();
   List<js.Node> loopsAndSwitches = <js.Node>[];
   List<js.LabeledStatement> labelledStatements = <js.LabeledStatement>[];
-  Set<String> usedNames = new Set<String>();
+  Set<String> usedNames = Set<String>();
 
   bool hasExplicitReturns = false;
 
diff --git a/pkg/compiler/lib/src/js/size_estimator.dart b/pkg/compiler/lib/src/js/size_estimator.dart
index 5af9fc1..022c4c2 100644
--- a/pkg/compiler/lib/src/js/size_estimator.dart
+++ b/pkg/compiler/lib/src/js/size_estimator.dart
@@ -391,7 +391,7 @@
     // See:
     // https://connect.microsoft.com/IE/feedback/details/891889/parser-bugs
     if (body is Break && body.targetLabel == node.label) {
-      visit(new EmptyStatement());
+      visit(EmptyStatement());
       return;
     }
     out('${node.label}:');
@@ -431,7 +431,7 @@
 
   @override
   visitFunctionDeclaration(FunctionDeclaration declaration) {
-    VarCollector vars = new VarCollector();
+    VarCollector vars = VarCollector();
     vars.visitFunctionDeclaration(declaration);
     functionOut(declaration.function, declaration.name, vars);
   }
@@ -808,21 +808,21 @@
 
   @override
   void visitNamedFunction(NamedFunction namedFunction) {
-    VarCollector vars = new VarCollector();
+    VarCollector vars = VarCollector();
     vars.visitNamedFunction(namedFunction);
     functionOut(namedFunction.function, namedFunction.name, vars);
   }
 
   @override
   void visitFun(Fun fun) {
-    VarCollector vars = new VarCollector();
+    VarCollector vars = VarCollector();
     vars.visitFun(fun);
     functionOut(fun, null, vars);
   }
 
   @override
   void visitArrowFunction(ArrowFunction fun) {
-    VarCollector vars = new VarCollector();
+    VarCollector vars = VarCollector();
     vars.visitArrowFunction(fun);
     arrowFunctionOut(fun, vars);
   }
@@ -1015,7 +1015,7 @@
   @override
   void visitMethodDefinition(MethodDefinition node) {
     propertyNameOut(node);
-    VarCollector vars = new VarCollector();
+    VarCollector vars = VarCollector();
     vars.visitMethodDefinition(node);
     methodOut(node, vars);
   }
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 022bb9c..e60b4d0 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -23,7 +23,7 @@
 import 'invocation_mirror_constants.dart';
 import 'transformations/lowering.dart' as lowering show transformLibraries;
 
-const Iterable<String> _allowedDartSchemePaths = const <String>[
+const Iterable<String> _allowedDartSchemePaths = [
   'async',
   'html',
   'html_common',
@@ -105,7 +105,7 @@
   bool get supportsExplicitGetterCalls => false;
 
   @override
-  int get enabledConstructorTearOffLowerings => ConstructorTearOffLowering.none;
+  int get enabledConstructorTearOffLowerings => ConstructorTearOffLowering.all;
 
   @override
   List<String> get extraRequiredLibraries => _requiredLibraries[name]!;
@@ -236,7 +236,7 @@
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
 // compile-platform should just specify which libraries to compile instead.
 const _requiredLibraries = const <String, List<String>>{
-  'dart2js': const <String>[
+  'dart2js': [
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
     'dart:_interceptors',
@@ -260,7 +260,7 @@
     'dart:web_gl',
     'dart:web_sql',
   ],
-  'dart2js_server': const <String>[
+  'dart2js_server': [
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
     'dart:_interceptors',
diff --git a/pkg/compiler/lib/src/util/command_line.dart b/pkg/compiler/lib/src/util/command_line.dart
index 6930227..8e27fc3 100644
--- a/pkg/compiler/lib/src/util/command_line.dart
+++ b/pkg/compiler/lib/src/util/command_line.dart
@@ -32,7 +32,7 @@
   List<String> result = <String>[];
   bool inQuotes = false;
   String? openingQuote;
-  StringBuffer buffer = new StringBuffer();
+  StringBuffer buffer = StringBuffer();
   for (int i = 0; i < line.length; i++) {
     String c = line[i];
     if (inQuotes && c == openingQuote) {
@@ -46,7 +46,7 @@
     }
     if (c == '\\') {
       if (i == line.length - 1) {
-        throw new FormatException('Unfinished escape: $line');
+        throw FormatException('Unfinished escape: $line');
       }
       if (windows) {
         String next = line[i + 1];
@@ -73,7 +73,7 @@
     }
     buffer.write(c);
   }
-  if (inQuotes) throw new FormatException('Unclosed quotes: $line');
+  if (inQuotes) throw FormatException('Unclosed quotes: $line');
   if (buffer.isNotEmpty) result.add(buffer.toString());
   return result;
 }
diff --git a/pkg/compiler/lib/src/util/maplet.dart b/pkg/compiler/lib/src/util/maplet.dart
index bfe74b5..05d7c4c 100644
--- a/pkg/compiler/lib/src/util/maplet.dart
+++ b/pkg/compiler/lib/src/util/maplet.dart
@@ -9,7 +9,7 @@
 import 'dart:collection' show MapBase, IterableBase;
 
 class Maplet<K, V> extends MapBase<K, V> {
-  static const _MapletMarker _MARKER = const _MapletMarker();
+  static const _MapletMarker _MARKER = _MapletMarker();
   static const int CAPACITY = 8;
 
 // The maplet can be in one of four states:
@@ -101,7 +101,7 @@
       } else if (_key == key) {
         _value = value;
       } else {
-        List list = new List.filled(CAPACITY * 2, null);
+        List list = List.filled(CAPACITY * 2, null);
         list[0] = _key;
         list[1] = key;
         list[CAPACITY] = _value;
@@ -165,7 +165,7 @@
           copyTo++;
         }
       } else {
-        var map = new Map<K, V>();
+        var map = Map<K, V>();
         forEach((eachKey, eachValue) => map[eachKey] = eachValue);
         map[key] = value;
         _key = map;
@@ -225,7 +225,7 @@
   }
 
   @override
-  Iterable<K> get keys => new _MapletKeyIterable<K>(this);
+  Iterable<K> get keys => _MapletKeyIterable<K>(this);
 }
 
 class _MapletMarker {
@@ -240,11 +240,11 @@
   @override
   Iterator<K> get iterator {
     if (maplet._extra == null) {
-      return new _MapletSingleIterator<K>(maplet._key);
+      return _MapletSingleIterator<K>(maplet._key);
     } else if (Maplet._MARKER == maplet._extra) {
       return maplet._key.keys.iterator;
     } else {
-      return new _MapletListIterator<K>(maplet._key, maplet._extra);
+      return _MapletListIterator<K>(maplet._key, maplet._extra);
     }
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index e898f39..9493fde 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -423,9 +423,8 @@
           bodyBuilder,
           fieldType,
           bodyBuilder.parseFieldInitializer(_constInitializerToken!));
-      if (library.loader is SourceLoader &&
-          (bodyBuilder.transformSetLiterals ||
-              bodyBuilder.transformCollections)) {
+      if (bodyBuilder.transformSetLiterals ||
+          bodyBuilder.transformCollections) {
         // Wrap the initializer in a temporary parent expression; the
         // transformations need a parent relation.
         Not wrapper = new Not(initializer);
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index cf242da..e4fb075 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -28,8 +28,6 @@
 
 import '../source/source_library_builder.dart';
 
-import '../source/source_loader.dart' show SourceLoader;
-
 import '../kernel/body_builder.dart' show BodyBuilder;
 
 import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
@@ -221,14 +219,11 @@
         initializer = bodyBuilder.typeInferrer.inferParameterInitializer(
             bodyBuilder, initializer, variable!.type, hasDeclaredInitializer);
         variable!.initializer = initializer..parent = variable;
-        if (library.loader is SourceLoader) {
-          SourceLoader loader = library.loader;
-          loader.transformPostInference(
-              variable!,
-              bodyBuilder.transformSetLiterals,
-              bodyBuilder.transformCollections,
-              library.library);
-        }
+        library.loader.transformPostInference(
+            variable!,
+            bodyBuilder.transformSetLiterals,
+            bodyBuilder.transformCollections,
+            library.library);
         initializerWasInferred = true;
         bodyBuilder.resolveRedirectingFactoryTargets();
         if (bodyBuilder.hasDelayedActions) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 8ab26bf..df886e2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1799,8 +1799,7 @@
     bool isInForest = arguments is Arguments &&
         typeArguments != null &&
         (receiver is! TypeUseGenerator ||
-            (receiver is TypeUseGenerator &&
-                receiver.declaration is! TypeAliasBuilder));
+            receiver.declaration is! TypeAliasBuilder);
     if (isInForest) {
       assert(forest.argumentsTypeArguments(arguments).isEmpty);
       forest.argumentsSetTypeArguments(
@@ -5219,9 +5218,7 @@
           node = forest.createIfMapEntry(offsetForToken(ifToken),
               toValue(condition), thenEntry, elseMapEntry);
         } else {
-          int offset = elseEntry is Expression
-              ? elseEntry.fileOffset
-              : offsetForToken(ifToken);
+          int offset = elseEntry.fileOffset;
           node = new MapLiteralEntry(
               buildProblem(
                   fasta.messageCantDisambiguateAmbiguousInformation, offset, 1),
@@ -5246,9 +5243,7 @@
           node = forest.createIfMapEntry(offsetForToken(ifToken),
               toValue(condition), thenMapEntry, elseEntry);
         } else {
-          int offset = thenEntry is Expression
-              ? thenEntry.fileOffset
-              : offsetForToken(ifToken);
+          int offset = thenEntry.fileOffset;
           node = new MapLiteralEntry(
               buildProblem(
                   fasta.messageCantDisambiguateAmbiguousInformation, offset, 1),
@@ -6224,9 +6219,7 @@
     if (target == null && name == null) {
       push(problemInLoopOrSwitch = buildProblemStatement(
           fasta.messageBreakOutsideOfLoop, breakKeyword.charOffset));
-    } else if (target == null ||
-        target is! JumpTarget ||
-        !target.isBreakTarget) {
+    } else if (target == null || !target.isBreakTarget) {
       Token labelToken = breakKeyword.next!;
       push(problemInLoopOrSwitch = buildProblemStatement(
           fasta.templateInvalidBreakTarget.withArguments(name!),
@@ -6787,12 +6780,8 @@
           allowPotentiallyConstantType: allowPotentiallyConstantType);
       if (message == null) return unresolved;
       return new UnresolvedType(
-          new NamedTypeBuilder(
-              typeParameter.name!,
-              builder.nullabilityBuilder,
-              /* arguments = */ null,
-              unresolved.fileUri,
-              unresolved.charOffset)
+          new NamedTypeBuilder(typeParameter.name!, builder.nullabilityBuilder,
+              /* arguments = */ null, unresolved.fileUri, unresolved.charOffset)
             ..bind(new InvalidTypeDeclarationBuilder(
                 typeParameter.name!, message)),
           unresolved.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 1449f34..b244b87 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -2892,12 +2892,8 @@
               _uri, charOffset, lengthOfSpan(prefixGenerator.token, token));
     }
     // TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
-    NamedTypeBuilder result = new NamedTypeBuilder(
-        name,
-        nullabilityBuilder,
-        /* arguments = */ null,
-        /* fileUri = */ null,
-        /* charOffset = */ null);
+    NamedTypeBuilder result = new NamedTypeBuilder(name, nullabilityBuilder,
+        /* arguments = */ null, /* fileUri = */ null, /* charOffset = */ null);
     _helper.libraryBuilder.addProblem(
         message.messageObject, message.charOffset, message.length, message.uri);
     result.bind(result.buildInvalidTypeDeclarationBuilder(message));
@@ -4017,25 +4013,21 @@
   @override
   /* Expression | Generator */ buildPropertyAccess(
       IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
-    if (send is IncompleteSendGenerator) {
-      assert(send.name.text == send.token.lexeme,
-          "'${send.name.text}' != ${send.token.lexeme}");
-      Object result = qualifiedLookup(send.token);
-      if (send is SendAccessGenerator) {
-        result = _helper.finishSend(
-            result, send.typeArguments, send.arguments, send.fileOffset,
-            isTypeArgumentsInForest: send.isTypeArgumentsInForest);
-      }
-      if (isNullAware) {
-        result = _helper.wrapInLocatedProblem(
-            _helper.toValue(result),
-            messageCantUsePrefixWithNullAware.withLocation(
-                _helper.uri, fileOffset, lengthForToken(token)));
-      }
-      return result;
-    } else {
-      return buildSimpleRead();
+    assert(send.name.text == send.token.lexeme,
+        "'${send.name.text}' != ${send.token.lexeme}");
+    Object result = qualifiedLookup(send.token);
+    if (send is SendAccessGenerator) {
+      result = _helper.finishSend(
+          result, send.typeArguments, send.arguments, send.fileOffset,
+          isTypeArgumentsInForest: send.isTypeArgumentsInForest);
     }
+    if (isNullAware) {
+      result = _helper.wrapInLocatedProblem(
+          _helper.toValue(result),
+          messageCantUsePrefixWithNullAware.withLocation(
+              _helper.uri, fileOffset, lengthForToken(token)));
+    }
+    return result;
   }
 
   @override
@@ -4742,12 +4734,7 @@
     sink.write(", name: ");
     sink.write(name.text);
     sink.write(", arguments: ");
-    Arguments node = arguments;
-    if (node is Node) {
-      printNodeOn(node, sink);
-    } else {
-      sink.write(node);
-    }
+    printNodeOn(arguments, sink);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 28f7373..d8b2fdb 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -559,7 +559,7 @@
       } else {
         assert(
             // This is a synthesized constructor.
-            builder is DillConstructorBuilder && builder.member is Constructor,
+            builder is DillConstructorBuilder,
             "Unexpected constructor: $builder.");
       }
     }, includeInjectedConstructors: true);
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 8ff9315..41166bc 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
@@ -3232,7 +3232,7 @@
 
     // TODO(johnniwinther): This is inconsistent with the handling below. Remove
     // this or add handling similar to [_inferMethodInvocation].
-    if (receiverType == const DynamicType() && getter is Procedure) {
+    if (receiverType == const DynamicType()) {
       FunctionNode signature = getter.function;
       if (arguments.positional.length < signature.requiredParameterCount ||
           arguments.positional.length > signature.positionalParameters.length) {
diff --git a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.expect b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.expect
index d463dc9..d249938 100644
--- a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.expect
@@ -10,6 +10,8 @@
     return #C1;
   get dynFunction() → dynamic
     return #C1;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
 }
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   return t;
diff --git a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.transformed.expect
index 977003e..e06ef9e 100644
--- a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.strong.transformed.expect
@@ -10,6 +10,8 @@
     return #C1;
   get dynFunction() → dynamic
     return #C1;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
 }
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   return t;
@@ -28,4 +30,4 @@
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_getter_invocation.dart:14:16 -> DoubleConstant(0.0)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_getter_invocation.dart:15:21 -> DoubleConstant(0.0)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_getter_invocation.dart:16:17 -> DoubleConstant(0.0)
-Extra constant evaluation: evaluated: 20, effectively constant: 3
+Extra constant evaluation: evaluated: 21, effectively constant: 3
diff --git a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.expect b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.expect
index d463dc9..d249938 100644
--- a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.expect
+++ b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.expect
@@ -10,6 +10,8 @@
     return #C1;
   get dynFunction() → dynamic
     return #C1;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
 }
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   return t;
diff --git a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.outline.expect
index 85f75fa..41de7ee 100644
--- a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.outline.expect
@@ -9,6 +9,8 @@
     ;
   get dynFunction() → dynamic
     ;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
 }
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   ;
diff --git a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.transformed.expect
index 977003e..e06ef9e 100644
--- a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.transformed.expect
@@ -10,6 +10,8 @@
     return #C1;
   get dynFunction() → dynamic
     return #C1;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
 }
 static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
   return t;
@@ -28,4 +30,4 @@
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_getter_invocation.dart:14:16 -> DoubleConstant(0.0)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_getter_invocation.dart:15:21 -> DoubleConstant(0.0)
 Evaluated: VariableGet @ org-dartlang-testcase:///instance_getter_invocation.dart:16:17 -> DoubleConstant(0.0)
-Extra constant evaluation: evaluated: 20, effectively constant: 3
+Extra constant evaluation: evaluated: 21, effectively constant: 3
diff --git a/pkg/front_end/testcases/dart2js/late_fields.dart.strong.expect b/pkg/front_end/testcases/dart2js/late_fields.dart.strong.expect
index 0c0fa5a..02d73bd 100644
--- a/pkg/front_end/testcases/dart2js/late_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/dart2js/late_fields.dart.strong.expect
@@ -28,6 +28,8 @@
     this.{self::C::_#C#c} = #t6;
   get d() → core::int
     return let final core::int? #t7 = this.{self::C::_#C#d}{core::int?} in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in this.{self::C::_#C#d}{core::int?} == null ?{core::int} this.{self::C::_#C#d} = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
+  static method _#new#tearOff() → self::C
+    return new self::C::•();
 }
 static field self::C c = new self::C::•();
 static method main() → void {
diff --git a/pkg/front_end/testcases/dart2js/late_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/late_fields.dart.strong.transformed.expect
index e162d20..bf9c284 100644
--- a/pkg/front_end/testcases/dart2js/late_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/late_fields.dart.strong.transformed.expect
@@ -28,6 +28,8 @@
     this.{self::C::_#C#c} = #t6;
   get d() → core::int
     return let final core::int? #t7 = this.{self::C::_#C#d}{core::int?} in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in this.{self::C::_#C#d}{core::int?} == null ?{core::int} this.{self::C::_#C#d} = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
+  static method _#new#tearOff() → self::C
+    return new self::C::•();
 }
 static field self::C c = new self::C::•();
 static method main() → void {
@@ -60,4 +62,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_fields.dart:15:16 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_fields.dart:16:22 -> DoubleConstant(-1.0)
 Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:16:18 -> DoubleConstant(-1.0)
-Extra constant evaluation: evaluated: 92, effectively constant: 3
+Extra constant evaluation: evaluated: 93, effectively constant: 3
diff --git a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.expect b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.expect
index ca585bf..95a7e38 100644
--- a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.expect
+++ b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.expect
@@ -28,6 +28,8 @@
     this.{self::C::_#C#c} = #t6;
   get d() → core::int
     return let final core::int #t7 = this.{self::C::_#C#d}{core::int?} in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(this.{self::C::_#C#d}{core::int?}) ?{core::int} this.{self::C::_#C#d} = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
+  static method _#new#tearOff() → self::C
+    return new self::C::•();
 }
 static field self::C c = new self::C::•();
 static method main() → void {
diff --git a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.outline.expect
index 09228574..57eb7ff 100644
--- a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.outline.expect
@@ -16,6 +16,8 @@
   get c() → core::int;
   set c(core::int #t3) → void;
   get d() → core::int;
+  static method _#new#tearOff() → self::C
+    return new self::C::•();
 }
 static field self::C c;
 static method main() → void
diff --git a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.transformed.expect
index 06e4c45..15df6e5 100644
--- a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.transformed.expect
@@ -28,6 +28,8 @@
     this.{self::C::_#C#c} = #t6;
   get d() → core::int
     return let final core::int #t7 = this.{self::C::_#C#d}{core::int?} in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(this.{self::C::_#C#d}{core::int?}) ?{core::int} this.{self::C::_#C#d} = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
+  static method _#new#tearOff() → self::C
+    return new self::C::•();
 }
 static field self::C c = new self::C::•();
 static method main() → void {
@@ -60,4 +62,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_fields.dart:15:16 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_fields.dart:16:22 -> DoubleConstant(-1.0)
 Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:16:18 -> DoubleConstant(-1.0)
-Extra constant evaluation: evaluated: 96, effectively constant: 3
+Extra constant evaluation: evaluated: 97, effectively constant: 3
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect
index 766e7f1..c2128f7 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect
@@ -21,6 +21,8 @@
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::Statics
+    return new self::Statics::•();
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect
index 39d75e1..209cdb6 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect
@@ -20,6 +20,8 @@
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::Statics
+    return new self::Statics::•();
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
@@ -84,4 +86,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:23:29 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:7:14 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:8:20 -> DoubleConstant(-1.0)
-Extra constant evaluation: evaluated: 62, effectively constant: 4
+Extra constant evaluation: evaluated: 63, effectively constant: 4
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect
index 766e7f1..c2128f7 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect
@@ -21,6 +21,8 @@
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::Statics
+    return new self::Statics::•();
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect
index 76913dc..2b97609 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect
@@ -20,6 +20,8 @@
   late static final field core::int d;
   synthetic constructor •() → self::Statics
     ;
+  static method _#new#tearOff() → self::Statics
+    return new self::Statics::•();
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect
index 39d75e1..209cdb6 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect
@@ -20,6 +20,8 @@
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::Statics
+    return new self::Statics::•();
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
@@ -84,4 +86,4 @@
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:23:29 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:7:14 -> DoubleConstant(-1.0)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:8:20 -> DoubleConstant(-1.0)
-Extra constant evaluation: evaluated: 62, effectively constant: 4
+Extra constant evaluation: evaluated: 63, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.expect
index bdbea12..966e5dd 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.expect
@@ -8,6 +8,8 @@
   const constructor •(dynamic i1, dynamic i2) → self::MyClass
     : self::MyClass::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, self::MyClass::b = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
+  static method _#new#tearOff(dynamic i1, dynamic i2) → self::MyClass
+    return new self::MyClass::•(i1, i2);
 }
 static method test() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.outline.expect
index dcdb486..58a7c1f 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.outline.expect
@@ -8,6 +8,8 @@
   const constructor •(dynamic i1, dynamic i2) → self::MyClass
     : self::MyClass::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, self::MyClass::b = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
+  static method _#new#tearOff(dynamic i1, dynamic i2) → self::MyClass
+    return new self::MyClass::•(i1, i2);
 }
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.transformed.expect
index bdbea12..966e5dd 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.transformed.expect
@@ -8,6 +8,8 @@
   const constructor •(dynamic i1, dynamic i2) → self::MyClass
     : self::MyClass::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, self::MyClass::b = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
+  static method _#new#tearOff(dynamic i1, dynamic i2) → self::MyClass
+    return new self::MyClass::•(i1, i2);
 }
 static method test() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect
index c1c307d..c62f518 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect
@@ -19,6 +19,8 @@
 @#C3
 class ParallaxOptions extends core::Object {
   external static factory •() → self::ParallaxOptions;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return self::ParallaxOptions::•();
 }
 static method test() → dynamic
   return invalid-expression "External factory constructors can't be evaluated in constant expressions.";
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect
index d5602f8..d79fbe5 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect
@@ -9,6 +9,8 @@
 @js::anonymous
 class ParallaxOptions extends core::Object {
   external static factory •() → self::ParallaxOptions;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return self::ParallaxOptions::•();
 }
 static method test() → dynamic
   ;
@@ -19,4 +21,4 @@
 Extra constant evaluation status:
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue46123.dart:7:2 -> InstanceConstant(const JS{JS.name: null})
 Evaluated: StaticGet @ org-dartlang-testcase:///issue46123.dart:8:2 -> InstanceConstant(const _Anonymous{})
-Extra constant evaluation: evaluated: 2, effectively constant: 2
+Extra constant evaluation: evaluated: 3, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect
index c1c307d..c62f518 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect
@@ -19,6 +19,8 @@
 @#C3
 class ParallaxOptions extends core::Object {
   external static factory •() → self::ParallaxOptions;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return self::ParallaxOptions::•();
 }
 static method test() → dynamic
   return invalid-expression "External factory constructors can't be evaluated in constant expressions.";
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect
index 29f09a1..215e011 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect
@@ -21,6 +21,8 @@
   external const constructor •() → self::ParallaxOptions
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return new self::ParallaxOptions::•();
 }
 static method test() → dynamic
   return invalid-expression "External constructors can't be evaluated in constant expressions.";
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect
index 78273bc..5576ed1 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect
@@ -11,6 +11,8 @@
   external const constructor •() → self::ParallaxOptions
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return new self::ParallaxOptions::•();
 }
 static method test() → dynamic
   ;
@@ -21,4 +23,4 @@
 Extra constant evaluation status:
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue46123b.dart:7:2 -> InstanceConstant(const JS{JS.name: null})
 Evaluated: StaticGet @ org-dartlang-testcase:///issue46123b.dart:8:2 -> InstanceConstant(const _Anonymous{})
-Extra constant evaluation: evaluated: 2, effectively constant: 2
+Extra constant evaluation: evaluated: 3, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect
index 29f09a1..215e011 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect
@@ -21,6 +21,8 @@
   external const constructor •() → self::ParallaxOptions
     : super core::Object::•()
     ;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return new self::ParallaxOptions::•();
 }
 static method test() → dynamic
   return invalid-expression "External constructors can't be evaluated in constant expressions.";
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.expect
index 2573a35..03c80f1 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.expect
@@ -113,6 +113,10 @@
   const constructor tripleShift(dynamic i1, dynamic i2) → self::Class
     : self::Class::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
+  static method _#doubleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::doubleShift(i1, i2);
+  static method _#tripleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::tripleShift(i1, i2);
 }
 static const field dynamic a = #C1;
 static const field dynamic b = #C2;
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.outline.expect
index c94c041..fcbc46f 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.outline.expect
@@ -10,6 +10,10 @@
   const constructor tripleShift(dynamic i1, dynamic i2) → self::Class
     : self::Class::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
+  static method _#doubleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::doubleShift(i1, i2);
+  static method _#tripleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::tripleShift(i1, i2);
 }
 static const field dynamic a = 1.0;
 static const field dynamic b = 1.5;
@@ -34,4 +38,4 @@
 Evaluated: StaticGet @ org-dartlang-testcase:///on_double.dart:14:25 -> DoubleConstant(1.5)
 Evaluated: InstanceInvocation @ org-dartlang-testcase:///on_double.dart:15:22 -> DoubleConstant(0.0)
 Evaluated: StaticGet @ org-dartlang-testcase:///on_double.dart:16:26 -> DoubleConstant(1.5)
-Extra constant evaluation: evaluated: 22, effectively constant: 8
+Extra constant evaluation: evaluated: 28, effectively constant: 8
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.transformed.expect
index 2573a35..03c80f1 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.transformed.expect
@@ -113,6 +113,10 @@
   const constructor tripleShift(dynamic i1, dynamic i2) → self::Class
     : self::Class::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
+  static method _#doubleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::doubleShift(i1, i2);
+  static method _#tripleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::tripleShift(i1, i2);
 }
 static const field dynamic a = #C1;
 static const field dynamic b = #C2;
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index b0e55fc..f271dcf 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -82,7 +82,6 @@
   /// made.
   const AtomicEdit.delete(this.length, {this.info, this.isInformative = false})
       : assert(length > 0),
-        assert(isInformative is bool),
         replacement = '';
 
   /// Initialize an edit to insert the [replacement] characters.
@@ -92,7 +91,6 @@
   const AtomicEdit.insert(this.replacement,
       {this.info, this.isInformative = false})
       : assert(replacement.length > 0),
-        assert(isInformative is bool),
         length = 0;
 
   /// Initialize an edit to replace [length] characters with the [replacement]
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 26f57f1..53dc64a 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
@@ -7708,7 +7708,7 @@
 ''';
 
 String? _migration_js;
-// migration_dart md5 is 'cbfeac5f79f12f2862fc0d4bc569f58a'
+// migration_dart md5 is 'b415a0a8e74e830025f1153f10871ddd'
 String _migration_js_base64 = '''
 KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgcz1P
 YmplY3Qua2V5cyhhKQpmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIHE9c1tyXQpiW3FdPWFb
@@ -7747,7 +7747,7 @@
 CmlmKGEpcmV0dXJuIG5ldyBGdW5jdGlvbigicGFyYW1ldGVycywgY3JlYXRlVGVhck9mZkNsYXNzLCBj
 YWNoZSIsInJldHVybiBmdW5jdGlvbiB0ZWFyT2ZmXyIrcyt5KysrIihyZWNlaXZlcikgeyIrImlmIChj
 YWNoZSA9PT0gbnVsbCkgY2FjaGUgPSBjcmVhdGVUZWFyT2ZmQ2xhc3MocGFyYW1ldGVycyk7IisicmV0
-dXJuIG5ldyBjYWNoZSh0aGlzLCByZWNlaXZlcik7IisifSIpKGIsSC5VMixudWxsKQplbHNlIHJldHVy
+dXJuIG5ldyBjYWNoZShyZWNlaXZlciwgdGhpcyk7IisifSIpKGIsSC5VMixudWxsKQplbHNlIHJldHVy
 biBuZXcgRnVuY3Rpb24oInBhcmFtZXRlcnMsIGNyZWF0ZVRlYXJPZmZDbGFzcywgY2FjaGUiLCJyZXR1
 cm4gZnVuY3Rpb24gdGVhck9mZl8iK3MreSsrKyIoKSB7IisiaWYgKGNhY2hlID09PSBudWxsKSBjYWNo
 ZSA9IGNyZWF0ZVRlYXJPZmZDbGFzcyhwYXJhbWV0ZXJzKTsiKyJyZXR1cm4gbmV3IGNhY2hlKHRoaXMs
@@ -7784,4029 +7784,3853 @@
 dGVUeXBlcyxzZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnOnNldE9yVXBkYXRlSW50ZXJjZXB0b3Jz
 QnlUYWcsc2V0T3JVcGRhdGVMZWFmVGFnczpzZXRPclVwZGF0ZUxlYWZUYWdzfX0oKQpmdW5jdGlvbiBp
 bml0aWFsaXplRGVmZXJyZWRIdW5rKGEpe3g9di50eXBlcy5sZW5ndGgKYShodW5rSGVscGVycyx2LHcs
-JCl9dmFyIEI9ewp3UjpmdW5jdGlvbigpe3JldHVybiBuZXcgQi5xcCgiIiwiIiwiIixDLkR4KX0sCllm
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsaz1ILmsoYS5xKDAsInJlZ2lvbnMiKSksaj1I
-LmsoYS5xKDAsIm5hdmlnYXRpb25Db250ZW50IikpLGk9SC5rKGEucSgwLCJzb3VyY2VDb2RlIikpLGg9
-UC5GbCh0Lk4sdC5mNCkKZm9yKHM9dC5HLmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdt
-KHMpLHI9dC5SLHE9dC5naTtzLkYoKTspe3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1K
-LklUKHIuYShwLmIpKTtwLkYoKTspe209cC5nbCgpCmw9Si5VNihtKQpuLnB1c2gobmV3IEIuajgoSC5V
-YyhsLnEobSwibGluZSIpKSxILmsobC5xKG0sImV4cGxhbmF0aW9uIikpLEguVWMobC5xKG0sIm9mZnNl
-dCIpKSkpfWguWTUoMCxvLG4pfXJldHVybiBuZXcgQi5xcChrLGosaSxoKX0sCmo4OmZ1bmN0aW9uIGo4
-KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnFwOmZ1bmN0aW9uIHFwKGEsYixjLGQp
-e3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApmdjpmdW5jdGlvbiBmdigpe30sCk9T
-OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKCEoYT49NjUmJmE8PTkwKSlzPWE+PTk3JiZhPD0xMjIKZWxzZSBz
-PSEwCnJldHVybiBzfSwKWXU6ZnVuY3Rpb24oYSxiKXt2YXIgcz1hLmxlbmd0aCxyPWIrMgppZihzPHIp
-cmV0dXJuITEKaWYoIUIuT1MoQy54Qi5PKGEsYikpKXJldHVybiExCmlmKEMueEIuTyhhLGIrMSkhPT01
-OClyZXR1cm4hMQppZihzPT09cilyZXR1cm4hMApyZXR1cm4gQy54Qi5PKGEscik9PT00N319LEM9e30s
-RD17CmFiOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz1udWxsCnRyeXtvPVAudW8oKX1jYXRjaChzKXtp
-Zih0Lmc4LmIoSC5SdShzKSkpe3I9JC5GZgppZihyIT1udWxsKXJldHVybiByCnRocm93IHN9ZWxzZSB0
-aHJvdyBzfWlmKEouUk0obywkLkk2KSl7cj0kLkZmCnIudG9TdHJpbmcKcmV0dXJuIHJ9JC5JNj1vCmlm
-KCQuSGsoKT09JC5FYigpKXI9JC5GZj1vLlpJKCIuIikudygwKQplbHNle3E9by50NCgpCnA9cS5sZW5n
-dGgtMQpyPSQuRmY9cD09PTA/cTpDLnhCLk5qKHEsMCxwKX1yZXR1cm4gcn19LEU9e09GOmZ1bmN0aW9u
-IE9GKGEsYixjKXt0aGlzLmQ9YQp0aGlzLmU9Ygp0aGlzLmY9Y319LEY9e3J1OmZ1bmN0aW9uIHJ1KGEs
-YixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxIPXtGSzpmdW5jdGlvbiBG
-Sygpe30sCkdKOmZ1bmN0aW9uKGEsYixjKXtpZihiLkMoImJRPDA+IikuYihhKSlyZXR1cm4gbmV3IEgu
-b2woYSxiLkMoIkA8MD4iKS5LcShjKS5DKCJvbDwxLDI+IikpCnJldHVybiBuZXcgSC5aeShhLGIuQygi
-QDwwPiIpLktxKGMpLkMoIlp5PDEsMj4iKSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5jKCJG
-aWVsZCAnIithKyInIGhhcyBiZWVuIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKX0sCm9v
-OmZ1bmN0aW9uKGEpe3ZhciBzLHI9YV40OAppZihyPD05KXJldHVybiByCnM9YXwzMgppZig5Nzw9cyYm
-czw9MTAyKXJldHVybiBzLTg3CnJldHVybi0xfSwKY2I6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhfSwK
-cUM6ZnVuY3Rpb24oYSxiLGMsZCl7UC5rMShiLCJzdGFydCIpCmlmKGMhPW51bGwpe1AuazEoYywiZW5k
-IikKaWYoYj5jKUgudihQLlRFKGIsMCxjLCJzdGFydCIsbnVsbCkpfXJldHVybiBuZXcgSC5uSChhLGIs
-YyxkLkMoIm5IPDA+IikpfSwKSzE6ZnVuY3Rpb24oYSxiLGMsZCl7aWYodC5XLmIoYSkpcmV0dXJuIG5l
-dyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+IikpCnJldHVybiBuZXcgSC5pMShh
-LGIsYy5DKCJAPDA+IikuS3EoZCkuQygiaTE8MSwyPiIpKX0sCmJLOmZ1bmN0aW9uKGEsYixjKXtpZih0
-LlcuYihhKSl7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNShhLGIsYy5DKCJkNTwwPiIpKX1Q
-LmsxKGIsImNvdW50IikKcmV0dXJuIG5ldyBILkFNKGEsYixjLkMoIkFNPDA+IikpfSwKV3A6ZnVuY3Rp
-b24oKXtyZXR1cm4gbmV3IFAubGooIk5vIGVsZW1lbnQiKX0sCkFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5l
-dyBQLmxqKCJUb28gbWFueSBlbGVtZW50cyIpfSwKYXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFAubGoo
-IlRvbyBmZXcgZWxlbWVudHMiKX0sCkJSOmZ1bmN0aW9uIEJSKCl7fSwKZVQ6ZnVuY3Rpb24gZVQoYSxi
-KXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKWnk6ZnVuY3Rpb24gWnkoYSxiKXt0aGlzLmE9YQp0aGlzLiR0
-aT1ifSwKb2w6ZnVuY3Rpb24gb2woYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKVXE6ZnVuY3Rpb24g
-VXEoKXt9LApqVjpmdW5jdGlvbiBqVihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApjOmZ1bmN0aW9u
-IGMoYSl7dGhpcy5hPWF9LApxajpmdW5jdGlvbiBxaihhKXt0aGlzLmE9YX0sCmJROmZ1bmN0aW9uIGJR
-KCl7fSwKYUw6ZnVuY3Rpb24gYUwoKXt9LApuSDpmdW5jdGlvbiBuSChhLGIsYyxkKXt2YXIgXz10aGlz
-Cl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAphNzpmdW5jdGlvbiBhNyhhLGIsYyl7dmFyIF89dGhp
-cwpfLmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKaTE6ZnVuY3Rpb24gaTEoYSxiLGMp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LAp4eTpmdW5jdGlvbiB4eShhLGIsYyl7dGhpcy5h
-PWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCk1IOmZ1bmN0aW9uIE1IKGEsYixjKXt2YXIgXz10aGlzCl8u
-YT1udWxsCl8uYj1hCl8uYz1iCl8uJHRpPWN9LApsSjpmdW5jdGlvbiBsSihhLGIsYyl7dGhpcy5hPWEK
-dGhpcy5iPWIKdGhpcy4kdGk9Y30sClU1OmZ1bmN0aW9uIFU1KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLiR0aT1jfSwKU086ZnVuY3Rpb24gU08oYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMu
-JHRpPWN9LApBTTpmdW5jdGlvbiBBTShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30s
-CmQ1OmZ1bmN0aW9uIGQ1KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKVTE6ZnVu
-Y3Rpb24gVTEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApNQjpmdW5jdGlvbiBN
-QihhKXt0aGlzLiR0aT1hfSwKRnU6ZnVuY3Rpb24gRnUoYSl7dGhpcy4kdGk9YX0sCnU2OmZ1bmN0aW9u
-IHU2KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkpCOmZ1bmN0aW9uIEpCKGEsYil7dGhpcy5hPWEK
-dGhpcy4kdGk9Yn0sClNVOmZ1bmN0aW9uIFNVKCl7fSwKUmU6ZnVuY3Rpb24gUmUoKXt9LAp3MjpmdW5j
-dGlvbiB3Migpe30sCnd2OmZ1bmN0aW9uIHd2KGEpe3RoaXMuYT1hfSwKUUM6ZnVuY3Rpb24gUUMoKXt9
-LApkYzpmdW5jdGlvbigpe3Rocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBN
-YXAiKSl9LApOUTpmdW5jdGlvbihhKXt2YXIgcyxyPXYubWFuZ2xlZEdsb2JhbE5hbWVzW2FdCmlmKHIh
-PW51bGwpcmV0dXJuIHIKcz0ibWluaWZpZWQ6IithCnJldHVybiBzfSwKd1Y6ZnVuY3Rpb24oYSxiKXt2
-YXIgcwppZihiIT1udWxsKXtzPWIueAppZihzIT1udWxsKXJldHVybiBzfXJldHVybiB0LmFVLmIoYSl9
-LApFajpmdW5jdGlvbihhKXt2YXIgcwppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYodHlw
-ZW9mIGE9PSJudW1iZXIiKXtpZihhIT09MClyZXR1cm4iIithfWVsc2UgaWYoITA9PT1hKXJldHVybiJ0
-cnVlIgplbHNlIGlmKCExPT09YSlyZXR1cm4iZmFsc2UiCmVsc2UgaWYoYT09bnVsbClyZXR1cm4ibnVs
-bCIKcz1KLncoYSkKcmV0dXJuIHN9LAplUTpmdW5jdGlvbihhKXt2YXIgcz1hLiRpZGVudGl0eUhhc2gK
+JCl9dmFyIEI9ewp3Uigpe3JldHVybiBuZXcgQi5xcCgiIiwiIiwiIixDLkR4KX0sCllmKGEpe3ZhciBz
+LHIscSxwLG8sbixtLGwsaz1ILmsoYS5xKDAsInJlZ2lvbnMiKSksaj1ILmsoYS5xKDAsIm5hdmlnYXRp
+b25Db250ZW50IikpLGk9SC5rKGEucSgwLCJzb3VyY2VDb2RlIikpLGg9UC5GbCh0Lk4sdC5mNCkKZm9y
+KHM9dC5HLmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdtKHMpLHI9dC5SLHE9dC5naTtz
+LkYoKTspe3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklUKHIuYShwLmIpKTtwLkYo
+KTspe209cC5nbCgpCmw9Si5VNihtKQpuLnB1c2gobmV3IEIuajgoSC5VYyhsLnEobSwibGluZSIpKSxI
+LmsobC5xKG0sImV4cGxhbmF0aW9uIikpLEguVWMobC5xKG0sIm9mZnNldCIpKSkpfWguWTUoMCxvLG4p
+fXJldHVybiBuZXcgQi5xcChrLGosaSxoKX0sCmo4OmZ1bmN0aW9uIGo4KGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sCnFwOmZ1bmN0aW9uIHFwKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEK
+Xy5iPWIKXy5jPWMKXy5kPWR9LApmdjpmdW5jdGlvbiBmdigpe30sCk9TKGEpe3ZhciBzCmlmKCEoYT49
+NjUmJmE8PTkwKSlzPWE+PTk3JiZhPD0xMjIKZWxzZSBzPSEwCnJldHVybiBzfSwKWXUoYSxiKXt2YXIg
+cz1hLmxlbmd0aCxyPWIrMgppZihzPHIpcmV0dXJuITEKaWYoIUIuT1MoQy54Qi5PKGEsYikpKXJldHVy
+biExCmlmKEMueEIuTyhhLGIrMSkhPT01OClyZXR1cm4hMQppZihzPT09cilyZXR1cm4hMApyZXR1cm4g
+Qy54Qi5PKGEscik9PT00N319LEM9e30sRD17CmFiKCl7dmFyIHMscixxLHAsbz1udWxsCnRyeXtvPVAu
+dW8oKX1jYXRjaChzKXtpZih0Lmc4LmIoSC5SdShzKSkpe3I9JC5GZgppZihyIT1udWxsKXJldHVybiBy
+CnRocm93IHN9ZWxzZSB0aHJvdyBzfWlmKEouUk0obywkLkk2KSl7cj0kLkZmCnIudG9TdHJpbmcKcmV0
+dXJuIHJ9JC5JNj1vCmlmKCQuSGsoKT09JC5FYigpKXI9JC5GZj1vLlpJKCIuIikudygwKQplbHNle3E9
+by50NCgpCnA9cS5sZW5ndGgtMQpyPSQuRmY9cD09PTA/cTpDLnhCLk5qKHEsMCxwKX1yZXR1cm4gcn19
+LEU9e09GOmZ1bmN0aW9uIE9GKGEsYixjKXt0aGlzLmQ9YQp0aGlzLmU9Ygp0aGlzLmY9Y319LEY9e3J1
+OmZ1bmN0aW9uIHJ1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxI
+PXtGSzpmdW5jdGlvbiBGSygpe30sCkdKKGEsYixjKXtpZihiLkMoImJRPDA+IikuYihhKSlyZXR1cm4g
+bmV3IEgub2woYSxiLkMoIkA8MD4iKS5LcShjKS5DKCJvbDwxLDI+IikpCnJldHVybiBuZXcgSC5aeShh
+LGIuQygiQDwwPiIpLktxKGMpLkMoIlp5PDEsMj4iKSl9LApqKGEpe3JldHVybiBuZXcgSC5jKCJGaWVs
+ZCAnIithKyInIGhhcyBiZWVuIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKX0sCm9vKGEp
+e3ZhciBzLHI9YV40OAppZihyPD05KXJldHVybiByCnM9YXwzMgppZig5Nzw9cyYmczw9MTAyKXJldHVy
+biBzLTg3CnJldHVybi0xfSwKY2IoYSxiLGMpe3JldHVybiBhfSwKcUMoYSxiLGMsZCl7UC5rMShiLCJz
+dGFydCIpCmlmKGMhPW51bGwpe1AuazEoYywiZW5kIikKaWYoYj5jKUgudihQLlRFKGIsMCxjLCJzdGFy
+dCIsbnVsbCkpfXJldHVybiBuZXcgSC5uSChhLGIsYyxkLkMoIm5IPDA+IikpfSwKSzEoYSxiLGMsZCl7
+aWYodC5XLmIoYSkpcmV0dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+
+IikpCnJldHVybiBuZXcgSC5pMShhLGIsYy5DKCJAPDA+IikuS3EoZCkuQygiaTE8MSwyPiIpKX0sCmJL
+KGEsYixjKXtpZih0LlcuYihhKSl7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNShhLGIsYy5D
+KCJkNTwwPiIpKX1QLmsxKGIsImNvdW50IikKcmV0dXJuIG5ldyBILkFNKGEsYixjLkMoIkFNPDA+Iikp
+fSwKV3AoKXtyZXR1cm4gbmV3IFAubGooIk5vIGVsZW1lbnQiKX0sCkFtKCl7cmV0dXJuIG5ldyBQLmxq
+KCJUb28gbWFueSBlbGVtZW50cyIpfSwKYXIoKXtyZXR1cm4gbmV3IFAubGooIlRvbyBmZXcgZWxlbWVu
+dHMiKX0sCkJSOmZ1bmN0aW9uIEJSKCl7fSwKZVQ6ZnVuY3Rpb24gZVQoYSxiKXt0aGlzLmE9YQp0aGlz
+LiR0aT1ifSwKWnk6ZnVuY3Rpb24gWnkoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKb2w6ZnVuY3Rp
+b24gb2woYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKVXE6ZnVuY3Rpb24gVXEoKXt9LApqVjpmdW5j
+dGlvbiBqVihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApjOmZ1bmN0aW9uIGMoYSl7dGhpcy5hPWF9
+LApxajpmdW5jdGlvbiBxaihhKXt0aGlzLmE9YX0sCmJROmZ1bmN0aW9uIGJRKCl7fSwKYUw6ZnVuY3Rp
+b24gYUwoKXt9LApuSDpmdW5jdGlvbiBuSChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
+Yz1jCl8uJHRpPWR9LAphNzpmdW5jdGlvbiBhNyhhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9Ygpf
+LmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKaTE6ZnVuY3Rpb24gaTEoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuJHRpPWN9LAp4eTpmdW5jdGlvbiB4eShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
+cy4kdGk9Y30sCk1IOmZ1bmN0aW9uIE1IKGEsYixjKXt2YXIgXz10aGlzCl8uYT1udWxsCl8uYj1hCl8u
+Yz1iCl8uJHRpPWN9LApsSjpmdW5jdGlvbiBsSihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4k
+dGk9Y30sClU1OmZ1bmN0aW9uIFU1KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwK
+U086ZnVuY3Rpb24gU08oYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApBTTpmdW5j
+dGlvbiBBTShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmQ1OmZ1bmN0aW9uIGQ1
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKVTE6ZnVuY3Rpb24gVTEoYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApNQjpmdW5jdGlvbiBNQihhKXt0aGlzLiR0aT1h
+fSwKRnU6ZnVuY3Rpb24gRnUoYSl7dGhpcy4kdGk9YX0sCnU2OmZ1bmN0aW9uIHU2KGEsYil7dGhpcy5h
+PWEKdGhpcy4kdGk9Yn0sCkpCOmZ1bmN0aW9uIEpCKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClNV
+OmZ1bmN0aW9uIFNVKCl7fSwKUmU6ZnVuY3Rpb24gUmUoKXt9LAp3MjpmdW5jdGlvbiB3Migpe30sCnd2
+OmZ1bmN0aW9uIHd2KGEpe3RoaXMuYT1hfSwKUUM6ZnVuY3Rpb24gUUMoKXt9LApkYygpe3Rocm93IEgu
+YihQLkw0KCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBNYXAiKSl9LApOUShhKXt2YXIgcyxyPXYu
+bWFuZ2xlZEdsb2JhbE5hbWVzW2FdCmlmKHIhPW51bGwpcmV0dXJuIHIKcz0ibWluaWZpZWQ6IithCnJl
+dHVybiBzfSwKd1YoYSxiKXt2YXIgcwppZihiIT1udWxsKXtzPWIueAppZihzIT1udWxsKXJldHVybiBz
+fXJldHVybiB0LmFVLmIoYSl9LApFaihhKXt2YXIgcwppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJu
+IGEKaWYodHlwZW9mIGE9PSJudW1iZXIiKXtpZihhIT09MClyZXR1cm4iIithfWVsc2UgaWYoITA9PT1h
+KXJldHVybiJ0cnVlIgplbHNlIGlmKCExPT09YSlyZXR1cm4iZmFsc2UiCmVsc2UgaWYoYT09bnVsbCly
+ZXR1cm4ibnVsbCIKcz1KLncoYSkKcmV0dXJuIHN9LAplUShhKXt2YXIgcz1hLiRpZGVudGl0eUhhc2gK
 aWYocz09bnVsbCl7cz1NYXRoLnJhbmRvbSgpKjB4M2ZmZmZmZmZ8MAphLiRpZGVudGl0eUhhc2g9c31y
-ZXR1cm4gc30sCkhwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuPW51bGwsbT0vXlxzKlsrLV0/
-KCgweFthLWYwLTldKyl8KFxkKyl8KFthLXowLTldKykpXHMqJC9pLmV4ZWMoYSkKaWYobT09bnVsbCly
-ZXR1cm4gbgppZigzPj1tLmxlbmd0aClyZXR1cm4gSC5PSChtLDMpCnM9bVszXQppZihiPT1udWxsKXtp
-ZihzIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQppZihtWzJdIT1udWxsKXJldHVybiBwYXJzZUlu
-dChhLDE2KQpyZXR1cm4gbn1pZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuVEUoYiwyLDM2LCJyYWRpeCIs
-bikpCmlmKGI9PT0xMCYmcyE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYoYjwxMHx8cz09bnVs
-bCl7cj1iPD0xMD80NytiOjg2K2IKcT1tWzFdCmZvcihwPXEubGVuZ3RoLG89MDtvPHA7KytvKWlmKChD
-LnhCLlcocSxvKXwzMik+cilyZXR1cm4gbn1yZXR1cm4gcGFyc2VJbnQoYSxiKX0sCmxoOmZ1bmN0aW9u
-KGEpe3JldHVybiBILkg1KGEpfSwKSDU6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKaWYoYSBpbnN0YW5j
-ZW9mIFAuTWgpcmV0dXJuIEguZG0oSC56SyhhKSxudWxsKQppZihKLmlhKGEpPT09Qy5Pa3x8dC5iSi5i
-KGEpKXtzPUMuTzQoYSkKcj1zIT09Ik9iamVjdCImJnMhPT0iIgppZihyKXJldHVybiBzCnE9YS5jb25z
-dHJ1Y3RvcgppZih0eXBlb2YgcT09ImZ1bmN0aW9uIil7cD1xLm5hbWUKaWYodHlwZW9mIHA9PSJzdHJp
-bmciKXI9cCE9PSJPYmplY3QiJiZwIT09IiIKZWxzZSByPSExCmlmKHIpcmV0dXJuIHB9fXJldHVybiBI
-LmRtKEgueksoYSksbnVsbCl9LApNMDpmdW5jdGlvbigpe2lmKCEhc2VsZi5sb2NhdGlvbilyZXR1cm4g
-c2VsZi5sb2NhdGlvbi5ocmVmCnJldHVybiBudWxsfSwKZnc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIs
-cSxwCmlmKGM8PTUwMCYmYj09PTAmJmM9PT1hLmxlbmd0aClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29k
-ZS5hcHBseShudWxsLGEpCmZvcihzPWIscj0iIjtzPGM7cz1xKXtxPXMrNTAwCnA9cTxjP3E6YwpyKz1T
-dHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYS5zdWJhcnJheShzLHApKX1yZXR1cm4gcn0sCkx3
-OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKDA8PWEpe2lmKGE8PTY1NTM1KXJldHVybiBTdHJpbmcuZnJvbUNo
-YXJDb2RlKGEpCmlmKGE8PTExMTQxMTEpe3M9YS02NTUzNgpyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29k
-ZSgoQy5qbi53RyhzLDEwKXw1NTI5Nik+Pj4wLHMmMTAyM3w1NjMyMCl9fXRocm93IEguYihQLlRFKGEs
-MCwxMTE0MTExLG51bGwsbnVsbCkpfSwKbzI6ZnVuY3Rpb24oYSl7aWYoYS5kYXRlPT09dm9pZCAwKWEu
-ZGF0ZT1uZXcgRGF0ZShhLmEpCnJldHVybiBhLmRhdGV9LAp0SjpmdW5jdGlvbihhKXt2YXIgcz1ILm8y
-KGEpLmdldEZ1bGxZZWFyKCkrMApyZXR1cm4gc30sCk5TOmZ1bmN0aW9uKGEpe3ZhciBzPUgubzIoYSku
-Z2V0TW9udGgoKSsxCnJldHVybiBzfSwKakE6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXREYXRl
-KCkrMApyZXR1cm4gc30sCklYOmZ1bmN0aW9uKGEpe3ZhciBzPUgubzIoYSkuZ2V0SG91cnMoKSswCnJl
-dHVybiBzfSwKY2g6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXRNaW51dGVzKCkrMApyZXR1cm4g
-c30sCkpkOmZ1bmN0aW9uKGEpe3ZhciBzPUgubzIoYSkuZ2V0U2Vjb25kcygpKzAKcmV0dXJuIHN9LApv
-MTpmdW5jdGlvbihhKXt2YXIgcz1ILm8yKGEpLmdldE1pbGxpc2Vjb25kcygpKzAKcmV0dXJuIHN9LAp6
-bzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxPXt9CnEuYT0wCnM9W10Kcj1bXQpxLmE9Yi5sZW5ndGgK
-Qy5ObS5GVihzLGIpCnEuYj0iIgppZihjIT1udWxsJiZjLmEhPT0wKWMuSygwLG5ldyBILkNqKHEscixz
-KSkKIiIrcS5hCnJldHVybiBKLkp5KGEsbmV3IEguTEkoQy5UZSwwLHMsciwwKSl9LApFazpmdW5jdGlv
-bihhLGIsYyl7dmFyIHMscixxLHAKaWYoYiBpbnN0YW5jZW9mIEFycmF5KXM9Yz09bnVsbHx8Yy5hPT09
-MAplbHNlIHM9ITEKaWYocyl7cj1iCnE9ci5sZW5ndGgKaWYocT09PTApe2lmKCEhYS4kMClyZXR1cm4g
-YS4kMCgpfWVsc2UgaWYocT09PTEpe2lmKCEhYS4kMSlyZXR1cm4gYS4kMShyWzBdKX1lbHNlIGlmKHE9
-PT0yKXtpZighIWEuJDIpcmV0dXJuIGEuJDIoclswXSxyWzFdKX1lbHNlIGlmKHE9PT0zKXtpZighIWEu
-JDMpcmV0dXJuIGEuJDMoclswXSxyWzFdLHJbMl0pfWVsc2UgaWYocT09PTQpe2lmKCEhYS4kNClyZXR1
-cm4gYS4kNChyWzBdLHJbMV0sclsyXSxyWzNdKX1lbHNlIGlmKHE9PT01KWlmKCEhYS4kNSlyZXR1cm4g
-YS4kNShyWzBdLHJbMV0sclsyXSxyWzNdLHJbNF0pCnA9YVsiIisiJCIrcV0KaWYocCE9bnVsbClyZXR1
-cm4gcC5hcHBseShhLHIpfXJldHVybiBILmUxKGEsYixjKX0sCmUxOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cyxyLHEscCxvLG4sbSxsLGssaixpPWIgaW5zdGFuY2VvZiBBcnJheT9iOlAuQ0goYiwhMCx0LnopLGg9
-aS5sZW5ndGgsZz1hLiRSCmlmKGg8ZylyZXR1cm4gSC56byhhLGksYykKcz1hLiRECnI9cz09bnVsbApx
-PSFyP3MoKTpudWxsCnA9Si5pYShhKQpvPXAuJEMKaWYodHlwZW9mIG89PSJzdHJpbmciKW89cFtvXQpp
-ZihyKXtpZihjIT1udWxsJiZjLmEhPT0wKXJldHVybiBILnpvKGEsaSxjKQppZihoPT09ZylyZXR1cm4g
-by5hcHBseShhLGkpCnJldHVybiBILnpvKGEsaSxjKX1pZihxIGluc3RhbmNlb2YgQXJyYXkpe2lmKGMh
-PW51bGwmJmMuYSE9PTApcmV0dXJuIEguem8oYSxpLGMpCmlmKGg+ZytxLmxlbmd0aClyZXR1cm4gSC56
-byhhLGksbnVsbCkKQy5ObS5GVihpLHEuc2xpY2UoaC1nKSkKcmV0dXJuIG8uYXBwbHkoYSxpKX1lbHNl
-e2lmKGg+ZylyZXR1cm4gSC56byhhLGksYykKbj1PYmplY3Qua2V5cyhxKQppZihjPT1udWxsKWZvcihy
-PW4ubGVuZ3RoLG09MDttPG4ubGVuZ3RoO24ubGVuZ3RoPT09cnx8KDAsSC5saykobiksKyttKXtsPXFb
-SC5uKG5bbV0pXQppZihDLk52PT09bClyZXR1cm4gSC56byhhLGksYykKQy5ObS5pKGksbCl9ZWxzZXtm
-b3Iocj1uLmxlbmd0aCxrPTAsbT0wO208bi5sZW5ndGg7bi5sZW5ndGg9PT1yfHwoMCxILmxrKShuKSwr
-K20pe2o9SC5uKG5bbV0pCmlmKGMueDQoaikpeysrawpDLk5tLmkoaSxjLnEoMCxqKSl9ZWxzZXtsPXFb
-al0KaWYoQy5Odj09PWwpcmV0dXJuIEguem8oYSxpLGMpCkMuTm0uaShpLGwpfX1pZihrIT09Yy5hKXJl
-dHVybiBILnpvKGEsaSxjKX1yZXR1cm4gby5hcHBseShhLGkpfX0sCnBZOmZ1bmN0aW9uKGEpe3Rocm93
-IEguYihILnRMKGEpKX0sCk9IOmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClKLkhtKGEpCnRocm93IEgu
-YihILnUoYSxiKSl9LAp1OmZ1bmN0aW9uKGEsYil7dmFyIHMscj0iaW5kZXgiCmlmKCFILm9rKGIpKXJl
-dHVybiBuZXcgUC5BVCghMCxiLHIsbnVsbCkKcz1ILklaKEouSG0oYSkpCmlmKGI8MHx8Yj49cylyZXR1
-cm4gUC5DZihiLGEscixudWxsLHMpCnJldHVybiBQLk83KGIscil9LAphdTpmdW5jdGlvbihhLGIsYyl7
-aWYoYT5jKXJldHVybiBQLlRFKGEsMCxjLCJzdGFydCIsbnVsbCkKaWYoYiE9bnVsbClpZihiPGF8fGI+
-YylyZXR1cm4gUC5URShiLGEsYywiZW5kIixudWxsKQpyZXR1cm4gbmV3IFAuQVQoITAsYiwiZW5kIixu
-dWxsKX0sCnRMOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5BVCghMCxhLG51bGwsbnVsbCl9LApiOmZ1
-bmN0aW9uKGEpe3ZhciBzLHIKaWYoYT09bnVsbClhPW5ldyBQLkYoKQpzPW5ldyBFcnJvcigpCnMuZGFy
-dEV4Y2VwdGlvbj1hCnI9SC5oCmlmKCJkZWZpbmVQcm9wZXJ0eSIgaW4gT2JqZWN0KXtPYmplY3QuZGVm
-aW5lUHJvcGVydHkocywibWVzc2FnZSIse2dldDpyfSkKcy5uYW1lPSIifWVsc2Ugcy50b1N0cmluZz1y
-CnJldHVybiBzfSwKaDpmdW5jdGlvbigpe3JldHVybiBKLncodGhpcy5kYXJ0RXhjZXB0aW9uKX0sCnY6
-ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKGEpfSwKbGs6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuYTQoYSkp
-fSwKY006ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuCmE9SC5lQShhLnJlcGxhY2UoU3RyaW5nKHt9
-KSwiJHJlY2VpdmVyJCIpKQpzPWEubWF0Y2goL1xcXCRbYS16QS1aXStcXFwkL2cpCmlmKHM9PW51bGwp
-cz1ILlFJKFtdLHQucykKcj1zLmluZGV4T2YoIlxcJGFyZ3VtZW50c1xcJCIpCnE9cy5pbmRleE9mKCJc
-XCRhcmd1bWVudHNFeHByXFwkIikKcD1zLmluZGV4T2YoIlxcJGV4cHJcXCQiKQpvPXMuaW5kZXhPZigi
-XFwkbWV0aG9kXFwkIikKbj1zLmluZGV4T2YoIlxcJHJlY2VpdmVyXFwkIikKcmV0dXJuIG5ldyBILmY5
-KGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXFxcXFwkYXJndW1lbnRzXFxcXFxcJCIsImciKSwiKCg/Onh8
-W154XSkqKSIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxcXFxcJGFyZ3VtZW50c0V4cHJcXFxcXFwkIiwi
-ZyIpLCIoKD86eHxbXnhdKSopIikucmVwbGFjZShuZXcgUmVnRXhwKCJcXFxcXFwkZXhwclxcXFxcXCQi
-LCJnIiksIigoPzp4fFteeF0pKikiKS5yZXBsYWNlKG5ldyBSZWdFeHAoIlxcXFxcXCRtZXRob2RcXFxc
-XFwkIiwiZyIpLCIoKD86eHxbXnhdKSopIikucmVwbGFjZShuZXcgUmVnRXhwKCJcXFxcXFwkcmVjZWl2
-ZXJcXFxcXFwkIiwiZyIpLCIoKD86eHxbXnhdKSopIikscixxLHAsbyxuKX0sClM3OmZ1bmN0aW9uKGEp
-e3JldHVybiBmdW5jdGlvbigkZXhwciQpe3ZhciAkYXJndW1lbnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0
-cnl7JGV4cHIkLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2Fn
-ZX19KGEpfSwKTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4k
-bWV0aG9kJH1jYXRjaChzKXtyZXR1cm4gcy5tZXNzYWdlfX0oYSl9LApUMzpmdW5jdGlvbihhLGIpe3Zh
-ciBzPWI9PW51bGwscj1zP251bGw6Yi5tZXRob2QKcmV0dXJuIG5ldyBILmF6KGEscixzP251bGw6Yi5y
-ZWNlaXZlcil9LApSdTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBuZXcgSC50ZShhKQppZihh
-IGluc3RhbmNlb2YgSC5icSlyZXR1cm4gSC50VyhhLHQuSy5hKGEuYSkpCmlmKHR5cGVvZiBhIT09Im9i
-amVjdCIpcmV0dXJuIGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJuIEgudFcoYSxhLmRhcnRF
-eGNlcHRpb24pCnJldHVybiBILnRsKGEpfSwKdFc6ZnVuY3Rpb24oYSxiKXtpZih0Lm0uYihiKSlpZihi
-LiR0aHJvd25Kc0Vycm9yPT1udWxsKWIuJHRocm93bkpzRXJyb3I9YQpyZXR1cm4gYn0sCnRsOmZ1bmN0
-aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsCmlmKCEoIm1lc3NhZ2Ui
-IGluIGEpKXJldHVybiBhCnM9YS5tZXNzYWdlCmlmKCJudW1iZXIiIGluIGEmJnR5cGVvZiBhLm51bWJl
-cj09Im51bWJlciIpe3I9YS5udW1iZXIKcT1yJjY1NTM1CmlmKChDLmpuLndHKHIsMTYpJjgxOTEpPT09
-MTApc3dpdGNoKHEpe2Nhc2UgNDM4OnJldHVybiBILnRXKGEsSC5UMyhILkVqKHMpKyIgKEVycm9yICIr
-cSsiKSIsZSkpCmNhc2UgNDQ1OmNhc2UgNTAwNzpwPUguRWoocykrIiAoRXJyb3IgIitxKyIpIgpyZXR1
-cm4gSC50VyhhLG5ldyBILlcwKHAsZSkpfX1pZihhIGluc3RhbmNlb2YgVHlwZUVycm9yKXtvPSQuU24o
-KQpuPSQubHEoKQptPSQuTjkoKQpsPSQuaUkoKQprPSQuVU4oKQpqPSQuWmgoKQppPSQuck4oKQokLmMz
-KCkKaD0kLkhLKCkKZz0kLnIxKCkKZj1vLnFTKHMpCmlmKGYhPW51bGwpcmV0dXJuIEgudFcoYSxILlQz
-KEgubihzKSxmKSkKZWxzZXtmPW4ucVMocykKaWYoZiE9bnVsbCl7Zi5tZXRob2Q9ImNhbGwiCnJldHVy
-biBILnRXKGEsSC5UMyhILm4ocyksZikpfWVsc2V7Zj1tLnFTKHMpCmlmKGY9PW51bGwpe2Y9bC5xUyhz
-KQppZihmPT1udWxsKXtmPWsucVMocykKaWYoZj09bnVsbCl7Zj1qLnFTKHMpCmlmKGY9PW51bGwpe2Y9
-aS5xUyhzKQppZihmPT1udWxsKXtmPWwucVMocykKaWYoZj09bnVsbCl7Zj1oLnFTKHMpCmlmKGY9PW51
-bGwpe2Y9Zy5xUyhzKQpwPWYhPW51bGx9ZWxzZSBwPSEwfWVsc2UgcD0hMH1lbHNlIHA9ITB9ZWxzZSBw
-PSEwfWVsc2UgcD0hMH1lbHNlIHA9ITB9ZWxzZSBwPSEwCmlmKHApe0gubihzKQpyZXR1cm4gSC50Vyhh
-LG5ldyBILlcwKHMsZj09bnVsbD9lOmYubWV0aG9kKSl9fX1yZXR1cm4gSC50VyhhLG5ldyBILnZWKHR5
-cGVvZiBzPT0ic3RyaW5nIj9zOiIiKSl9aWYoYSBpbnN0YW5jZW9mIFJhbmdlRXJyb3Ipe2lmKHR5cGVv
-ZiBzPT0ic3RyaW5nIiYmcy5pbmRleE9mKCJjYWxsIHN0YWNrIikhPT0tMSlyZXR1cm4gbmV3IFAuS1ko
-KQpzPWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gU3RyaW5nKGIpfWNhdGNoKGQpe31yZXR1cm4gbnVsbH0o
-YSkKcmV0dXJuIEgudFcoYSxuZXcgUC5BVCghMSxlLGUsdHlwZW9mIHM9PSJzdHJpbmciP3MucmVwbGFj
-ZSgvXlJhbmdlRXJyb3I6XHMqLywiIik6cykpfWlmKHR5cGVvZiBJbnRlcm5hbEVycm9yPT0iZnVuY3Rp
-b24iJiZhIGluc3RhbmNlb2YgSW50ZXJuYWxFcnJvcilpZih0eXBlb2Ygcz09InN0cmluZyImJnM9PT0i
-dG9vIG11Y2ggcmVjdXJzaW9uIilyZXR1cm4gbmV3IFAuS1koKQpyZXR1cm4gYX0sCnRzOmZ1bmN0aW9u
-KGEpe3ZhciBzCmlmKGEgaW5zdGFuY2VvZiBILmJxKXJldHVybiBhLmIKaWYoYT09bnVsbClyZXR1cm4g
-bmV3IEguWE8oYSkKcz1hLiRjYWNoZWRUcmFjZQppZihzIT1udWxsKXJldHVybiBzCnJldHVybiBhLiRj
-YWNoZWRUcmFjZT1uZXcgSC5YTyhhKX0sCkI3OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHA9YS5sZW5n
-dGgKZm9yKHM9MDtzPHA7cz1xKXtyPXMrMQpxPXIrMQpiLlk1KDAsYVtzXSxhW3JdKX1yZXR1cm4gYn0s
-CmZ0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0LlkuYShhKQpzd2l0Y2goSC5JWihiKSl7Y2FzZSAwOnJl
-dHVybiBhLiQwKCkKY2FzZSAxOnJldHVybiBhLiQxKGMpCmNhc2UgMjpyZXR1cm4gYS4kMihjLGQpCmNh
-c2UgMzpyZXR1cm4gYS4kMyhjLGQsZSkKY2FzZSA0OnJldHVybiBhLiQ0KGMsZCxlLGYpfXRocm93IEgu
-YihuZXcgUC5DRCgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3Igd3JhcHBlZCBjbG9z
-dXJlIikpfSwKdFI6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihhPT1udWxsKXJldHVybiBudWxsCnM9YS4k
-aWRlbnRpdHkKaWYoISFzKXJldHVybiBzCnM9ZnVuY3Rpb24oYyxkLGUpe3JldHVybiBmdW5jdGlvbihm
-LGcsaCxpKXtyZXR1cm4gZShjLGQsZixnLGgsaSl9fShhLGIsSC5mdCkKYS4kaWRlbnRpdHk9cwpyZXR1
-cm4gc30sCmlBOmZ1bmN0aW9uKGEyKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPWEyLmNvLGg9YTIu
-aVMsZz1hMi5pSSxmPWEyLm5EQSxlPWEyLmFJLGQ9YTIuZnMsYz1hMi5jcyxiPWRbMF0sYT1jWzBdLGEw
-PWlbYl0sYTE9YTIuZlQKYTEudG9TdHJpbmcKcz1oP09iamVjdC5jcmVhdGUobmV3IEguengoKS5jb25z
-dHJ1Y3Rvci5wcm90b3R5cGUpOk9iamVjdC5jcmVhdGUobmV3IEguclQobnVsbCxudWxsKS5jb25zdHJ1
-Y3Rvci5wcm90b3R5cGUpCnMuJGluaXRpYWxpemU9cy5jb25zdHJ1Y3RvcgppZihoKXI9ZnVuY3Rpb24g
-c3RhdGljX3RlYXJfb2ZmKCl7dGhpcy4kaW5pdGlhbGl6ZSgpfQplbHNle3E9JC55agppZih0eXBlb2Yg
-cSE9PSJudW1iZXIiKXJldHVybiBxLmgoKQokLnlqPXErMQpxPW5ldyBGdW5jdGlvbigiYSxiIitxLCJ0
-aGlzLiRpbml0aWFsaXplKGEsYiIrcSsiKSIpCnI9cX1zLmNvbnN0cnVjdG9yPXIKci5wcm90b3R5cGU9
-cwpzLiRfbmFtZT1iCnMuJF90YXJnZXQ9YTAKcT0haAppZihxKXA9SC5ieChiLGEwLGcsZikKZWxzZXtz
-LiRzdGF0aWNfbmFtZT1iCnA9YTB9cy4kUz1ILmltKGExLGgsZykKc1thXT1wCmZvcihvPXAsbj0xO248
-ZC5sZW5ndGg7KytuKXttPWRbbl0KaWYodHlwZW9mIG09PSJzdHJpbmciKXtsPWlbbV0Kaz1tCm09bH1l
-bHNlIGs9IiIKaj1jW25dCmlmKGohPW51bGwpe2lmKHEpbT1ILmJ4KGssbSxnLGYpCnNbal09bX1pZihu
-PT09ZSlvPW19cy4kQz1vCnMuJFI9YTIuckMKcy4kRD1hMi5kVgpyZXR1cm4gcn0sCmltOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcwppZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGZ1bmN0aW9uKGQsZSl7cmV0
-dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQoZSl9fShILkJwLGEpCmlmKHR5cGVvZiBhPT0ic3RyaW5nIil7
-aWYoYil0aHJvdyBILmIoIkNhbm5vdCBjb21wdXRlIHNpZ25hdHVyZSBmb3Igc3RhdGljIHRlYXJvZmYu
-IikKcz1jP0guUFc6SC5UbgpyZXR1cm4gZnVuY3Rpb24oZCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1
-cm4gZSh0aGlzLGQpfX0oYSxzKX10aHJvdyBILmIoIkVycm9yIGluIGZ1bmN0aW9uVHlwZSBvZiB0ZWFy
-b2ZmIil9LAp2cTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1ILkRWCnN3aXRjaChiPy0xOmEpe2Nhc2Ug
-MDpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKVtlXSgp
-fX0oYyxzKQpjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcpe3JldHVy
-biBmKHRoaXMpW2VdKGcpfX0oYyxzKQpjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1
-bmN0aW9uKGcsaCl7cmV0dXJuIGYodGhpcylbZV0oZyxoKX19KGMscykKY2FzZSAzOnJldHVybiBmdW5j
-dGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyxoLGkpfX0o
-YyxzKQpjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpLGope3Jl
-dHVybiBmKHRoaXMpW2VdKGcsaCxpLGopfX0oYyxzKQpjYXNlIDU6cmV0dXJuIGZ1bmN0aW9uKGUsZil7
-cmV0dXJuIGZ1bmN0aW9uKGcsaCxpLGosayl7cmV0dXJuIGYodGhpcylbZV0oZyxoLGksaixrKX19KGMs
-cykKZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5h
-cHBseShmKHRoaXMpLGFyZ3VtZW50cyl9fShkLHMpfX0sCmJ4OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBz
-LHIscSxwLG8KaWYoYylyZXR1cm4gSC5IZihhLGIsZCkKcz1iLmxlbmd0aApyPWR8fHM+PTI3CmlmKHIp
-cmV0dXJuIEgudnEocyxkLGEsYikKaWYocz09PTApe3I9JC55agppZih0eXBlb2YgciE9PSJudW1iZXIi
-KXJldHVybiByLmgoKQokLnlqPXIrMQpxPSJzZWxmIityCnI9InJldHVybiBmdW5jdGlvbigpe3ZhciAi
-K3ErIiA9IHRoaXMuIgpwPSQuV1cKcmV0dXJuIG5ldyBGdW5jdGlvbihyKyhwPT1udWxsPyQuV1c9SC5t
-OSgic2VsZiIpOnApKyI7cmV0dXJuICIrcSsiLiIrYSsiKCk7fSIpKCl9bz0iYWJjZGVmZ2hpamtsbW5v
-cHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxzKS5qb2luKCIsIikKcj0kLnlqCmlmKHR5cGVv
-ZiByIT09Im51bWJlciIpcmV0dXJuIHIuaCgpCiQueWo9cisxCm8rPXIKcj0icmV0dXJuIGZ1bmN0aW9u
-KCIrbysiKXtyZXR1cm4gdGhpcy4iCnA9JC5XVwpyZXR1cm4gbmV3IEZ1bmN0aW9uKHIrKHA9PW51bGw/
-JC5XVz1ILm05KCJzZWxmIik6cCkrIi4iK2ErIigiK28rIik7fSIpKCl9LApaNDpmdW5jdGlvbihhLGIs
-YyxkKXt2YXIgcz1ILkRWLHI9SC55Uwpzd2l0Y2goYj8tMTphKXtjYXNlIDA6dGhyb3cgSC5iKG5ldyBI
-LkVxKCJJbnRlcmNlcHRlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKY2FzZSAxOnJldHVy
-biBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlz
-KSl9fShjLHMscikKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgp
-e3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCl9fShjLHMscikKY2FzZSAzOnJldHVybiBmdW5jdGlv
-bihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGkp
-fX0oYyxzLHIpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGks
-ail7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksail9fShjLHMscikKY2FzZSA1OnJldHVybiBm
-dW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGco
-dGhpcyksaCxpLGosayl9fShjLHMscikKY2FzZSA2OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJu
-IGZ1bmN0aW9uKGgsaSxqLGssbCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrLGwpfX0o
-YyxzLHIpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZixnLGgpe3JldHVybiBmdW5jdGlvbigpe2g9
-W2codGhpcyldCkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsYXJndW1lbnRzKQpyZXR1cm4gZS5h
-cHBseShmKHRoaXMpLGgpfX0oZCxzLHIpfX0sCkhmOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxv
-LG49JC5XVwppZihuPT1udWxsKW49JC5XVz1ILm05KCJzZWxmIikKcz0kLmkwCmlmKHM9PW51bGwpcz0k
-LmkwPUgubTkoInJlY2VpdmVyIikKcj1iLmxlbmd0aApxPWN8fHI+PTI4CmlmKHEpcmV0dXJuIEguWjQo
-cixjLGEsYikKaWYocj09PTEpe3E9InJldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLiIrbisiLiIr
-YSsiKHRoaXMuIitzKyIpOyIKcD0kLnlqCmlmKHR5cGVvZiBwIT09Im51bWJlciIpcmV0dXJuIHAuaCgp
-CiQueWo9cCsxCnJldHVybiBuZXcgRnVuY3Rpb24ocStwKyJ9IikoKX1vPSJhYmNkZWZnaGlqa2xtbm9w
-cXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNwbGljZSgwLHItMSkuam9pbigiLCIpCnE9InJldHVybiBmdW5j
-dGlvbigiK28rIil7cmV0dXJuIHRoaXMuIituKyIuIithKyIodGhpcy4iK3MrIiwgIitvKyIpOyIKcD0k
-LnlqCmlmKHR5cGVvZiBwIT09Im51bWJlciIpcmV0dXJuIHAuaCgpCiQueWo9cCsxCnJldHVybiBuZXcg
-RnVuY3Rpb24ocStwKyJ9IikoKX0sClUyOmZ1bmN0aW9uKGEpe3JldHVybiBILmlBKGEpfSwKVG46ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSxILnpLKGEuYSksYil9LApQVzpmdW5j
-dGlvbihhLGIpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLEgueksoYS5iKSxiKX0sCkRWOmZ1bmN0
-aW9uKGEpe3JldHVybiBhLmF9LAp5UzpmdW5jdGlvbihhKXtyZXR1cm4gYS5ifSwKbTk6ZnVuY3Rpb24o
-YSl7dmFyIHMscixxLHA9bmV3IEguclQoInNlbGYiLCJyZWNlaXZlciIpLG89Si5FcChPYmplY3QuZ2V0
-T3duUHJvcGVydHlOYW1lcyhwKSx0LlgpCmZvcihzPW8ubGVuZ3RoLHI9MDtyPHM7KytyKXtxPW9bcl0K
-aWYocFtxXT09PWEpcmV0dXJuIHF9dGhyb3cgSC5iKFAueFkoIkZpZWxkIG5hbWUgIithKyIgbm90IGZv
-dW5kLiIpKX0sCm9UOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpSC5mTygiYm9vbGVhbiBleHByZXNzaW9u
-IG11c3Qgbm90IGJlIG51bGwiKQpyZXR1cm4gYX0sCmZPOmZ1bmN0aW9uKGEpe3Rocm93IEguYihuZXcg
-SC5rWShhKSl9LAphZzpmdW5jdGlvbihhKXt0aHJvdyBILmIobmV3IFAucChhKSl9LApZZzpmdW5jdGlv
-bihhKXtyZXR1cm4gdi5nZXRJc29sYXRlVGFnKGEpfSwKaXc6ZnVuY3Rpb24oYSxiLGMpe09iamVjdC5k
-ZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmMsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNv
-bmZpZ3VyYWJsZTp0cnVlfSl9LAp3MzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG49SC5uKCQuTkYu
-JDEoYSkpLG09JC5ud1tuXQppZihtIT1udWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRpc3Bh
-dGNoUHJvcGVydHlOYW1lLHt2YWx1ZTptLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25m
-aWd1cmFibGU6dHJ1ZX0pCnJldHVybiBtLml9cz0kLnZ2W25dCmlmKHMhPW51bGwpcmV0dXJuIHMKcj12
-LmludGVyY2VwdG9yc0J5VGFnW25dCmlmKHI9PW51bGwpe3E9SC5rKCQuVFguJDIoYSxuKSkKaWYocSE9
-bnVsbCl7bT0kLm53W3FdCmlmKG0hPW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHYuZGlzcGF0
-Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm0sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZp
-Z3VyYWJsZTp0cnVlfSkKcmV0dXJuIG0uaX1zPSQudnZbcV0KaWYocyE9bnVsbClyZXR1cm4gcwpyPXYu
-aW50ZXJjZXB0b3JzQnlUYWdbcV0Kbj1xfX1pZihyPT1udWxsKXJldHVybiBudWxsCnM9ci5wcm90b3R5
-cGUKcD1uWzBdCmlmKHA9PT0iISIpe209SC5WYShzKQokLm53W25dPW0KT2JqZWN0LmRlZmluZVByb3Bl
-cnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6bSxlbnVtZXJhYmxlOmZhbHNlLHdyaXRh
-YmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gbS5pfWlmKHA9PT0ifiIpeyQudnZbbl09
-cwpyZXR1cm4gc31pZihwPT09Ii0iKXtvPUguVmEocykKT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVj
-dC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1lcmFi
-bGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9aWYocD09
-PSIrIilyZXR1cm4gSC5MYyhhLHMpCmlmKHA9PT0iKiIpdGhyb3cgSC5iKFAuU1kobikpCmlmKHYubGVh
-ZlRhZ3Nbbl09PT10cnVlKXtvPUguVmEocykKT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5nZXRQ
-cm90b3R5cGVPZihhKSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1lcmFibGU6ZmFs
-c2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9ZWxzZSByZXR1cm4g
-SC5MYyhhLHMpfSwKTGM6ZnVuY3Rpb24oYSxiKXt2YXIgcz1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkK
-T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6Si5RdShi
-LHMsbnVsbCxudWxsKSxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRy
-dWV9KQpyZXR1cm4gYn0sClZhOmZ1bmN0aW9uKGEpe3JldHVybiBKLlF1KGEsITEsbnVsbCwhIWEuJGlY
-ail9LApWRjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Yi5wcm90b3R5cGUKaWYodi5sZWFmVGFnc1thXT09
-PXRydWUpcmV0dXJuIEguVmEocykKZWxzZSByZXR1cm4gSi5RdShzLGMsbnVsbCxudWxsKX0sClhEOmZ1
-bmN0aW9uKCl7aWYoITA9PT0kLkJ2KXJldHVybgokLkJ2PSEwCkguWjEoKX0sCloxOmZ1bmN0aW9uKCl7
-dmFyIHMscixxLHAsbyxuLG0sbAokLm53PU9iamVjdC5jcmVhdGUobnVsbCkKJC52dj1PYmplY3QuY3Jl
-YXRlKG51bGwpCkgua08oKQpzPXYuaW50ZXJjZXB0b3JzQnlUYWcKcj1PYmplY3QuZ2V0T3duUHJvcGVy
-dHlOYW1lcyhzKQppZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIil7d2luZG93CnE9ZnVuY3Rpb24o
-KXt9CmZvcihwPTA7cDxyLmxlbmd0aDsrK3Ape289cltwXQpuPSQueDcuJDEobykKaWYobiE9bnVsbCl7
-bT1ILlZGKG8sc1tvXSxuKQppZihtIT1udWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkobix2LmRpc3Bh
-dGNoUHJvcGVydHlOYW1lLHt2YWx1ZTptLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25m
-aWd1cmFibGU6dHJ1ZX0pCnEucHJvdG90eXBlPW59fX19Zm9yKHA9MDtwPHIubGVuZ3RoOysrcCl7bz1y
-W3BdCmlmKC9eW0EtWmEtel9dLy50ZXN0KG8pKXtsPXNbb10Kc1siISIrb109bApzWyJ+IitvXT1sCnNb
-Ii0iK29dPWwKc1siKyIrb109bApzWyIqIitvXT1sfX19LAprTzpmdW5jdGlvbigpe3ZhciBzLHIscSxw
-LG8sbixtPUMuWXEoKQptPUgudWQoQy5LVSxILnVkKEMuZlEsSC51ZChDLmk3LEgudWQoQy5pNyxILnVk
-KEMueGksSC51ZChDLmRrLEgudWQoQy53YihDLk80KSxtKSkpKSkpKQppZih0eXBlb2YgZGFydE5hdGl2
-ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lciE9InVuZGVmaW5lZCIpe3M9ZGFydE5hdGl2ZURpc3BhdGNo
-SG9va3NUcmFuc2Zvcm1lcgppZih0eXBlb2Ygcz09ImZ1bmN0aW9uIilzPVtzXQppZihzLmNvbnN0cnVj
-dG9yPT1BcnJheSlmb3Iocj0wO3I8cy5sZW5ndGg7KytyKXtxPXNbcl0KaWYodHlwZW9mIHE9PSJmdW5j
-dGlvbiIpbT1xKG0pfHxtfX1wPW0uZ2V0VGFnCm89bS5nZXRVbmtub3duVGFnCm49bS5wcm90b3R5cGVG
-b3JUYWcKJC5ORj1uZXcgSC5kQyhwKQokLlRYPW5ldyBILndOKG8pCiQueDc9bmV3IEguVlgobil9LAp1
-ZDpmdW5jdGlvbihhLGIpe3JldHVybiBhKGIpfHxifSwKdjQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3Zh
-ciBzPWI/Im0iOiIiLHI9Yz8iIjoiaSIscT1kPyJ1IjoiIixwPWU/InMiOiIiLG89Zj8iZyI6IiIsbj1m
-dW5jdGlvbihnLGgpe3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChnLGgpfWNhdGNoKG0pe3JldHVybiBtfX0o
-YSxzK3IrcStwK28pCmlmKG4gaW5zdGFuY2VvZiBSZWdFeHApcmV0dXJuIG4KdGhyb3cgSC5iKFAucnIo
-IklsbGVnYWwgUmVnRXhwIHBhdHRlcm4gKCIrU3RyaW5nKG4pKyIpIixhLG51bGwpKX0sClNROmZ1bmN0
-aW9uKGEsYixjKXt2YXIgcwppZih0eXBlb2YgYj09InN0cmluZyIpcmV0dXJuIGEuaW5kZXhPZihiLGMp
-Pj0wCmVsc2UgaWYoYiBpbnN0YW5jZW9mIEguVlIpe3M9Qy54Qi55bihhLGMpCnJldHVybiBiLmIudGVz
-dChzKX1lbHNle3M9Si5GTChiLEMueEIueW4oYSxjKSkKcmV0dXJuIXMuZ2wwKHMpfX0sCkE0OmZ1bmN0
-aW9uKGEpe2lmKGEuaW5kZXhPZigiJCIsMCk+PTApcmV0dXJuIGEucmVwbGFjZSgvXCQvZywiJCQkJCIp
-CnJldHVybiBhfSwKZUE6ZnVuY3Rpb24oYSl7aWYoL1tbXF17fSgpKis/LlxcXiR8XS8udGVzdChhKSly
-ZXR1cm4gYS5yZXBsYWNlKC9bW1xde30oKSorPy5cXF4kfF0vZywiXFwkJiIpCnJldHVybiBhfSwKeXM6
-ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUgubk0oYSxiLGMpCnJldHVybiBzfSwKbk06ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBzLHIscSxwCmlmKGI9PT0iIil7aWYoYT09PSIiKXJldHVybiBjCnM9YS5sZW5ndGgKcj0i
-IitjCmZvcihxPTA7cTxzOysrcSlyPXIrYVtxXStjCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpy
-fXA9YS5pbmRleE9mKGIsMCkKaWYocDwwKXJldHVybiBhCmlmKGEubGVuZ3RoPDUwMHx8Yy5pbmRleE9m
-KCIkIiwwKT49MClyZXR1cm4gYS5zcGxpdChiKS5qb2luKGMpCnJldHVybiBhLnJlcGxhY2UobmV3IFJl
-Z0V4cChILmVBKGIpLCJnIiksSC5BNChjKSl9LApQRDpmdW5jdGlvbiBQRChhLGIpe3RoaXMuYT1hCnRo
-aXMuJHRpPWJ9LApXVTpmdW5jdGlvbiBXVSgpe30sCkxQOmZ1bmN0aW9uIExQKGEsYixjLGQpe3ZhciBf
-PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sClhSOmZ1bmN0aW9uIFhSKGEsYil7dGhpcy5h
-PWEKdGhpcy4kdGk9Yn0sCkxJOmZ1bmN0aW9uIExJKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9YQpf
-LmM9YgpfLmQ9YwpfLmU9ZApfLmY9ZX0sCkNqOmZ1bmN0aW9uIENqKGEsYixjKXt0aGlzLmE9YQp0aGlz
-LmI9Ygp0aGlzLmM9Y30sCmY5OmZ1bmN0aW9uIGY5KGEsYixjLGQsZSxmKXt2YXIgXz10aGlzCl8uYT1h
-Cl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKVzA6ZnVuY3Rpb24gVzAoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCmF6OmZ1bmN0aW9uIGF6KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sCnZWOmZ1bmN0aW9uIHZWKGEpe3RoaXMuYT1hfSwKdGU6ZnVuY3Rpb24gdGUoYSl7dGhpcy5hPWF9
-LApicTpmdW5jdGlvbiBicShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWE86ZnVuY3Rpb24gWE8oYSl7
-dGhpcy5hPWEKdGhpcy5iPW51bGx9LApUcDpmdW5jdGlvbiBUcCgpe30sCmxjOmZ1bmN0aW9uIGxjKCl7
-fSwKeng6ZnVuY3Rpb24gengoKXt9LApyVDpmdW5jdGlvbiByVChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKRXE6ZnVuY3Rpb24gRXEoYSl7dGhpcy5hPWF9LAprWTpmdW5jdGlvbiBrWShhKXt0aGlzLmE9YX0s
-CmtyOmZ1bmN0aW9uIGtyKCl7fSwKTjU6ZnVuY3Rpb24gTjUoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9
-Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCnZoOmZ1bmN0aW9uIHZoKGEsYil7dmFy
-IF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGx9LAppNTpmdW5jdGlvbiBpNShhLGIpe3RoaXMu
-YT1hCnRoaXMuJHRpPWJ9LApONjpmdW5jdGlvbiBONihhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
-YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCmRDOmZ1bmN0aW9uIGRDKGEpe3RoaXMuYT1hfSwKd046ZnVu
-Y3Rpb24gd04oYSl7dGhpcy5hPWF9LApWWDpmdW5jdGlvbiBWWChhKXt0aGlzLmE9YX0sClZSOmZ1bmN0
-aW9uIFZSKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGx9LApFSzpmdW5jdGlv
-biBFSyhhKXt0aGlzLmI9YX0sCktXOmZ1bmN0aW9uIEtXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0
-aGlzLmM9Y30sClBiOmZ1bmN0aW9uIFBiKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1j
-Cl8uZD1udWxsfSwKdFE6ZnVuY3Rpb24gdFEoYSxiKXt0aGlzLmE9YQp0aGlzLmM9Yn0sCnVuOmZ1bmN0
-aW9uIHVuKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClNkOmZ1bmN0aW9uIFNkKGEs
-YixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1udWxsfSwKWEY6ZnVuY3Rpb24oYSl7
-cmV0dXJuIGF9LApvZDpmdW5jdGlvbihhLGIsYyl7aWYoYT4+PjAhPT1hfHxhPj1jKXRocm93IEguYihI
-LnUoYixhKSl9LApyTTpmdW5jdGlvbihhLGIsYyl7dmFyIHMKaWYoIShhPj4+MCE9PWEpKXM9Yj4+PjAh
-PT1ifHxhPmJ8fGI+YwplbHNlIHM9ITAKaWYocyl0aHJvdyBILmIoSC5hdShhLGIsYykpCnJldHVybiBi
-fSwKRVQ6ZnVuY3Rpb24gRVQoKXt9LApMWjpmdW5jdGlvbiBMWigpe30sCkRnOmZ1bmN0aW9uIERnKCl7
-fSwKUGc6ZnVuY3Rpb24gUGcoKXt9LAp4ajpmdW5jdGlvbiB4aigpe30sCmRFOmZ1bmN0aW9uIGRFKCl7
-fSwKWkE6ZnVuY3Rpb24gWkEoKXt9LApkVDpmdW5jdGlvbiBkVCgpe30sClBxOmZ1bmN0aW9uIFBxKCl7
-fSwKZUU6ZnVuY3Rpb24gZUUoKXt9LApWNjpmdW5jdGlvbiBWNigpe30sClJHOmZ1bmN0aW9uIFJHKCl7
-fSwKVlA6ZnVuY3Rpb24gVlAoKXt9LApXQjpmdW5jdGlvbiBXQigpe30sClpHOmZ1bmN0aW9uIFpHKCl7
-fSwKY3o6ZnVuY3Rpb24oYSxiKXt2YXIgcz1iLmMKcmV0dXJuIHM9PW51bGw/Yi5jPUguQihhLGIueiwh
-MCk6c30sCnhaOmZ1bmN0aW9uKGEsYil7dmFyIHM9Yi5jCnJldHVybiBzPT1udWxsP2IuYz1ILkooYSwi
-YjgiLFtiLnpdKTpzfSwKUTE6ZnVuY3Rpb24oYSl7dmFyIHM9YS55CmlmKHM9PT02fHxzPT09N3x8cz09
-PTgpcmV0dXJuIEguUTEoYS56KQpyZXR1cm4gcz09PTExfHxzPT09MTJ9LAptRDpmdW5jdGlvbihhKXty
-ZXR1cm4gYS5jeX0sCk4wOmZ1bmN0aW9uKGEpe3JldHVybiBILkUodi50eXBlVW5pdmVyc2UsYSwhMSl9
-LApQTDpmdW5jdGlvbihhLGIsYTAsYTEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxk
-LGM9Yi55CnN3aXRjaChjKXtjYXNlIDU6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OnJldHVybiBi
-CmNhc2UgNjpzPWIuegpyPUguUEwoYSxzLGEwLGExKQppZihyPT09cylyZXR1cm4gYgpyZXR1cm4gSC5D
-KGEsciwhMCkKY2FzZSA3OnM9Yi56CnI9SC5QTChhLHMsYTAsYTEpCmlmKHI9PT1zKXJldHVybiBiCnJl
-dHVybiBILkIoYSxyLCEwKQpjYXNlIDg6cz1iLnoKcj1ILlBMKGEscyxhMCxhMSkKaWYocj09PXMpcmV0
-dXJuIGIKcmV0dXJuIEguZihhLHIsITApCmNhc2UgOTpxPWIuUQpwPUguYlooYSxxLGEwLGExKQppZihw
-PT09cSlyZXR1cm4gYgpyZXR1cm4gSC5KKGEsYi56LHApCmNhc2UgMTA6bz1iLnoKbj1ILlBMKGEsbyxh
-MCxhMSkKbT1iLlEKbD1ILmJaKGEsbSxhMCxhMSkKaWYobj09PW8mJmw9PT1tKXJldHVybiBiCnJldHVy
-biBILmEoYSxuLGwpCmNhc2UgMTE6az1iLnoKaj1ILlBMKGEsayxhMCxhMSkKaT1iLlEKaD1ILnFUKGEs
-aSxhMCxhMSkKaWYoaj09PWsmJmg9PT1pKXJldHVybiBiCnJldHVybiBILmQoYSxqLGgpCmNhc2UgMTI6
-Zz1iLlEKYTErPWcubGVuZ3RoCmY9SC5iWihhLGcsYTAsYTEpCm89Yi56Cm49SC5QTChhLG8sYTAsYTEp
-CmlmKGY9PT1nJiZuPT09bylyZXR1cm4gYgpyZXR1cm4gSC5EKGEsbixmLCEwKQpjYXNlIDEzOmU9Yi56
-CmlmKGU8YTEpcmV0dXJuIGIKZD1hMFtlLWExXQppZihkPT1udWxsKXJldHVybiBiCnJldHVybiBkCmRl
-ZmF1bHQ6dGhyb3cgSC5iKFAuaFYoIkF0dGVtcHRlZCB0byBzdWJzdGl0dXRlIHVuZXhwZWN0ZWQgUlRJ
-IGtpbmQgIitjKSl9fSwKYlo6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbz1iLmxlbmd0aCxu
-PVtdCmZvcihzPSExLHI9MDtyPG87KytyKXtxPWJbcl0KcD1ILlBMKGEscSxjLGQpCmlmKHAhPT1xKXM9
-ITAKbi5wdXNoKHApfXJldHVybiBzP246Yn0sCnZPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxw
-LG8sbixtPWIubGVuZ3RoLGw9W10KZm9yKHM9ITEscj0wO3I8bTtyKz0zKXtxPWJbcl0KcD1iW3IrMV0K
-bz1iW3IrMl0Kbj1ILlBMKGEsbyxjLGQpCmlmKG4hPT1vKXM9ITAKbC5wdXNoKHEpCmwucHVzaChwKQps
-LnB1c2gobil9cmV0dXJuIHM/bDpifSwKcVQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj1iLmEscT1I
-LmJaKGEscixjLGQpLHA9Yi5iLG89SC5iWihhLHAsYyxkKSxuPWIuYyxtPUgudk8oYSxuLGMsZCkKaWYo
-cT09PXImJm89PT1wJiZtPT09bilyZXR1cm4gYgpzPW5ldyBILkcoKQpzLmE9cQpzLmI9bwpzLmM9bQpy
-ZXR1cm4gc30sClFJOmZ1bmN0aW9uKGEsYil7YVt2LmFycmF5UnRpXT1iCnJldHVybiBhfSwKSlM6ZnVu
-Y3Rpb24oYSl7dmFyIHM9YS4kUwppZihzIT1udWxsKXtpZih0eXBlb2Ygcz09Im51bWJlciIpcmV0dXJu
-IEguQnAocykKcmV0dXJuIGEuJFMoKX1yZXR1cm4gbnVsbH0sClVlOmZ1bmN0aW9uKGEsYil7dmFyIHMK
-aWYoSC5RMShiKSlpZihhIGluc3RhbmNlb2YgSC5UcCl7cz1ILkpTKGEpCmlmKHMhPW51bGwpcmV0dXJu
-IHN9cmV0dXJuIEgueksoYSl9LAp6SzpmdW5jdGlvbihhKXt2YXIgcwppZihhIGluc3RhbmNlb2YgUC5N
-aCl7cz1hLiR0aQpyZXR1cm4gcyE9bnVsbD9zOkguVlUoYSl9aWYoQXJyYXkuaXNBcnJheShhKSlyZXR1
-cm4gSC50NihhKQpyZXR1cm4gSC5WVShKLmlhKGEpKX0sCnQ2OmZ1bmN0aW9uKGEpe3ZhciBzPWFbdi5h
-cnJheVJ0aV0scj10LmIKaWYocz09bnVsbClyZXR1cm4gcgppZihzLmNvbnN0cnVjdG9yIT09ci5jb25z
-dHJ1Y3RvcilyZXR1cm4gcgpyZXR1cm4gc30sCkxoOmZ1bmN0aW9uKGEpe3ZhciBzPWEuJHRpCnJldHVy
-biBzIT1udWxsP3M6SC5WVShhKX0sClZVOmZ1bmN0aW9uKGEpe3ZhciBzPWEuY29uc3RydWN0b3Iscj1z
-LiRjY2FjaGUKaWYociE9bnVsbClyZXR1cm4gcgpyZXR1cm4gSC5yOShhLHMpfSwKcjk6ZnVuY3Rpb24o
-YSxiKXt2YXIgcz1hIGluc3RhbmNlb2YgSC5UcD9hLl9fcHJvdG9fXy5fX3Byb3RvX18uY29uc3RydWN0
-b3I6YixyPUguYWkodi50eXBlVW5pdmVyc2Uscy5uYW1lKQpiLiRjY2FjaGU9cgpyZXR1cm4gcn0sCkJw
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIscQpILklaKGEpCnM9di50eXBlcwpyPXNbYV0KaWYodHlwZW9mIHI9
-PSJzdHJpbmciKXtxPUguRSh2LnR5cGVVbml2ZXJzZSxyLCExKQpzW2FdPXEKcmV0dXJuIHF9cmV0dXJu
-IHJ9LApKSjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYobz09PXQuSylyZXR1cm4gSC5S
-RShvLGEsSC5rZSkKaWYoIUguQTgobykpaWYoIShvPT09dC5fKSlzPSExCmVsc2Ugcz0hMAplbHNlIHM9
-ITAKaWYocylyZXR1cm4gSC5SRShvLGEsSC5JdykKcz1vLnkKcj1zPT09Nj9vLno6bwppZihyPT09dC5T
-KXE9SC5vawplbHNlIGlmKHI9PT10LmdSfHxyPT09dC5kaSlxPUguS0gKZWxzZSBpZihyPT09dC5OKXE9
-SC5NTQplbHNlIHE9cj09PXQueT9ILnJROm51bGwKaWYocSE9bnVsbClyZXR1cm4gSC5SRShvLGEscSkK
-aWYoci55PT09OSl7cD1yLnoKaWYoci5RLmV2ZXJ5KEguY2MpKXtvLnI9IiRpIitwCmlmKHA9PT0iek0i
-KXJldHVybiBILlJFKG8sYSxILnlNKQpyZXR1cm4gSC5SRShvLGEsSC50NCl9fWVsc2UgaWYocz09PTcp
-cmV0dXJuIEguUkUobyxhLEguQVEpCnJldHVybiBILlJFKG8sYSxILllPKX0sClJFOmZ1bmN0aW9uKGEs
-YixjKXthLmI9YwpyZXR1cm4gYS5iKGIpfSwKQXU6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLHE9SC5P
-egppZighSC5BOChyKSlpZighKHI9PT10Ll8pKXM9ITEKZWxzZSBzPSEwCmVsc2Ugcz0hMAppZihzKXE9
-SC5obgplbHNlIGlmKHI9PT10LkspcT1ILlRpCmVsc2V7cz1ILmxSKHIpCmlmKHMpcT1ILmw0fXIuYT1x
-CnJldHVybiByLmEoYSl9LApRajpmdW5jdGlvbihhKXt2YXIgcyxyPWEueQppZighSC5BOChhKSlpZigh
-KGE9PT10Ll8pKWlmKCEoYT09PXQuYXcpKWlmKHIhPT03KXM9cj09PTgmJkguUWooYS56KXx8YT09PXQu
-UHx8YT09PXQuVAplbHNlIHM9ITAKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKcmV0dXJuIHN9
-LApZTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKGE9PW51bGwpcmV0dXJuIEguUWoocykKcmV0dXJu
-IEguV2Uodi50eXBlVW5pdmVyc2UsSC5VZShhLHMpLG51bGwscyxudWxsKX0sCkFROmZ1bmN0aW9uKGEp
-e2lmKGE9PW51bGwpcmV0dXJuITAKcmV0dXJuIHRoaXMuei5iKGEpfSwKdDQ6ZnVuY3Rpb24oYSl7dmFy
-IHMscj10aGlzCmlmKGE9PW51bGwpcmV0dXJuIEguUWoocikKcz1yLnIKaWYoYSBpbnN0YW5jZW9mIFAu
-TWgpcmV0dXJuISFhW3NdCnJldHVybiEhSi5pYShhKVtzXX0sCnlNOmZ1bmN0aW9uKGEpe3ZhciBzLHI9
-dGhpcwppZihhPT1udWxsKXJldHVybiBILlFqKHIpCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4h
-MQppZihBcnJheS5pc0FycmF5KGEpKXJldHVybiEwCnM9ci5yCmlmKGEgaW5zdGFuY2VvZiBQLk1oKXJl
-dHVybiEhYVtzXQpyZXR1cm4hIUouaWEoYSlbc119LApPejpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMK
-aWYoYT09bnVsbCl7cz1ILmxSKHIpCmlmKHMpcmV0dXJuIGF9ZWxzZSBpZihyLmIoYSkpcmV0dXJuIGEK
-SC5tNChhLHIpfSwKbDQ6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcwppZihhPT1udWxsKXJldHVybiBhCmVs
-c2UgaWYocy5iKGEpKXJldHVybiBhCkgubTQoYSxzKX0sCm00OmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5i
-KEguWmMoSC5XSyhhLEguVWUoYSxiKSxILmRtKGIsbnVsbCkpKSl9LApEaDpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcz1udWxsCmlmKEguV2Uodi50eXBlVW5pdmVyc2UsYSxzLGIscykpcmV0dXJuIGEKdGhyb3cg
-SC5iKEguWmMoIlRoZSB0eXBlIGFyZ3VtZW50ICciK0guZG0oYSxzKSsiJyBpcyBub3QgYSBzdWJ0eXBl
-IG9mIHRoZSB0eXBlIHZhcmlhYmxlIGJvdW5kICciK0guZG0oYixzKSsiJyBvZiB0eXBlIHZhcmlhYmxl
-ICciK2MrIicgaW4gJyIrZCsiJy4iKSl9LApXSzpmdW5jdGlvbihhLGIsYyl7dmFyIHM9UC5obChhKSxy
-PUguZG0oYj09bnVsbD9ILnpLKGEpOmIsbnVsbCkKcmV0dXJuIHMrIjogdHlwZSAnIityKyInIGlzIG5v
-dCBhIHN1YnR5cGUgb2YgdHlwZSAnIitjKyInIn0sClpjOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5p
-TSgiVHlwZUVycm9yOiAiK2EpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5pTSgiVHlwZUVy
-cm9yOiAiK0guV0soYSxudWxsLGIpKX0sCmtlOmZ1bmN0aW9uKGEpe3JldHVybiBhIT1udWxsfSwKVGk6
-ZnVuY3Rpb24oYSl7aWYoYSE9bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIk9iamVjdCIpKX0s
-Ckl3OmZ1bmN0aW9uKGEpe3JldHVybiEwfSwKaG46ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApyUTpmdW5j
-dGlvbihhKXtyZXR1cm4hMD09PWF8fCExPT09YX0sCnA4OmZ1bmN0aW9uKGEpe2lmKCEwPT09YSlyZXR1
-cm4hMAppZighMT09PWEpcmV0dXJuITEKdGhyb3cgSC5iKEgucShhLCJib29sIikpfSwKbUw6ZnVuY3Rp
-b24oYSl7aWYoITA9PT1hKXJldHVybiEwCmlmKCExPT09YSlyZXR1cm4hMQppZihhPT1udWxsKXJldHVy
-biBhCnRocm93IEguYihILnEoYSwiYm9vbCIpKX0sCk00OmZ1bmN0aW9uKGEpe2lmKCEwPT09YSlyZXR1
-cm4hMAppZighMT09PWEpcmV0dXJuITEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEs
-ImJvb2w/IikpfSwKclY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCnRo
-cm93IEguYihILnEoYSwiZG91YmxlIikpfSwKdEY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1i
-ZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJkb3VibGUiKSl9
-LApRazpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbCly
-ZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsImRvdWJsZT8iKSl9LApvazpmdW5jdGlvbihhKXtyZXR1cm4g
-dHlwZW9mIGE9PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YX0sCklaOmZ1bmN0aW9uKGEpe2lmKHR5
-cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWEpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShh
-LCJpbnQiKSl9LAp1UDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3Io
-YSk9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQiKSl9
-LApVYzpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1hKXJl
-dHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQ/IikpfSwKS0g6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIn0sCno1OmZ1bmN0aW9uKGEpe2lmKHR5cGVv
-ZiBhPT0ibnVtYmVyIilyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIm51bSIpKX0sClcxOmZ1bmN0aW9u
-KGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93
-IEguYihILnEoYSwibnVtIikpfSwKY1U6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJl
-dHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJudW0/IikpfSwKTU06ZnVu
-Y3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIn0sCm46ZnVuY3Rpb24oYSl7aWYodHlwZW9m
-IGE9PSJzdHJpbmciKXJldHVybiBhCnRocm93IEguYihILnEoYSwiU3RyaW5nIikpfSwKaE46ZnVuY3Rp
-b24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhy
-b3cgSC5iKEgucShhLCJTdHJpbmciKSl9LAprOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5n
-IilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwiU3RyaW5nPyIpKX0s
-CmlvOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmZvcihzPSIiLHI9IiIscT0wO3E8YS5sZW5ndGg7Kytx
-LHI9IiwgIilzKz1yK0guZG0oYVtxXSxiKQpyZXR1cm4gc30sCmJJOmZ1bmN0aW9uKGE0LGE1LGE2KXt2
-YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYSxhMCxhMSxhMixhMz0iLCAiCmlm
-KGE2IT1udWxsKXtzPWE2Lmxlbmd0aAppZihhNT09bnVsbCl7YTU9SC5RSShbXSx0LnMpCnI9bnVsbH1l
-bHNlIHI9YTUubGVuZ3RoCnE9YTUubGVuZ3RoCmZvcihwPXM7cD4wOy0tcClDLk5tLmkoYTUsIlQiKyhx
-K3ApKQpmb3Iobz10Llgsbj10Ll8sbT0iPCIsbD0iIixwPTA7cDxzOysrcCxsPWEzKXttKz1sCms9YTUu
-bGVuZ3RoCmo9ay0xLXAKaWYoajwwKXJldHVybiBILk9IKGE1LGopCm09Qy54Qi5oKG0sYTVbal0pCmk9
-YTZbcF0KaD1pLnkKaWYoIShoPT09Mnx8aD09PTN8fGg9PT00fHxoPT09NXx8aT09PW8pKWlmKCEoaT09
-PW4pKWs9ITEKZWxzZSBrPSEwCmVsc2Ugaz0hMAppZighayltKz0iIGV4dGVuZHMgIitILmRtKGksYTUp
-fW0rPSI+In1lbHNle209IiIKcj1udWxsfW89YTQuegpnPWE0LlEKZj1nLmEKZT1mLmxlbmd0aApkPWcu
-YgpjPWQubGVuZ3RoCmI9Zy5jCmE9Yi5sZW5ndGgKYTA9SC5kbShvLGE1KQpmb3IoYTE9IiIsYTI9IiIs
-cD0wO3A8ZTsrK3AsYTI9YTMpYTErPWEyK0guZG0oZltwXSxhNSkKaWYoYz4wKXthMSs9YTIrIlsiCmZv
-cihhMj0iIixwPTA7cDxjOysrcCxhMj1hMylhMSs9YTIrSC5kbShkW3BdLGE1KQphMSs9Il0ifWlmKGE+
-MCl7YTErPWEyKyJ7Igpmb3IoYTI9IiIscD0wO3A8YTtwKz0zLGEyPWEzKXthMSs9YTIKaWYoYltwKzFd
-KWExKz0icmVxdWlyZWQgIgphMSs9SC5kbShiW3ArMl0sYTUpKyIgIitiW3BdfWExKz0ifSJ9aWYociE9
-bnVsbCl7YTUudG9TdHJpbmcKYTUubGVuZ3RoPXJ9cmV0dXJuIG0rIigiK2ExKyIpID0+ICIrYTB9LApk
-bTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9YS55CmlmKGw9PT01KXJldHVybiJlcmFz
-ZWQiCmlmKGw9PT0yKXJldHVybiJkeW5hbWljIgppZihsPT09MylyZXR1cm4idm9pZCIKaWYobD09PTEp
-cmV0dXJuIk5ldmVyIgppZihsPT09NClyZXR1cm4iYW55IgppZihsPT09Nil7cz1ILmRtKGEueixiKQpy
-ZXR1cm4gc31pZihsPT09Nyl7cj1hLnoKcz1ILmRtKHIsYikKcT1yLnkKcmV0dXJuKHE9PT0xMXx8cT09
-PTEyPyIoIitzKyIpIjpzKSsiPyJ9aWYobD09PTgpcmV0dXJuIkZ1dHVyZU9yPCIrSC5kbShhLnosYikr
-Ij4iCmlmKGw9PT05KXtwPUgubzMoYS56KQpvPWEuUQpyZXR1cm4gby5sZW5ndGghPT0wP3ArKCI8IitI
-LmlvKG8sYikrIj4iKTpwfWlmKGw9PT0xMSlyZXR1cm4gSC5iSShhLGIsbnVsbCkKaWYobD09PTEyKXJl
-dHVybiBILmJJKGEueixiLGEuUSkKaWYobD09PTEzKXtuPWEuegptPWIubGVuZ3RoCm49bS0xLW4KaWYo
-bjwwfHxuPj1tKXJldHVybiBILk9IKGIsbikKcmV0dXJuIGJbbl19cmV0dXJuIj8ifSwKbzM6ZnVuY3Rp
-b24oYSl7dmFyIHMscj12Lm1hbmdsZWRHbG9iYWxOYW1lc1thXQppZihyIT1udWxsKXJldHVybiByCnM9
-Im1pbmlmaWVkOiIrYQpyZXR1cm4gc30sClFvOmZ1bmN0aW9uKGEsYil7dmFyIHM9YS50UltiXQpmb3Io
-O3R5cGVvZiBzPT0ic3RyaW5nIjspcz1hLnRSW3NdCnJldHVybiBzfSwKYWk6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvLG49YS5lVCxtPW5bYl0KaWYobT09bnVsbClyZXR1cm4gSC5FKGEsYiwhMSkKZWxz
-ZSBpZih0eXBlb2YgbT09Im51bWJlciIpe3M9bQpyPUgubShhLDUsIiMiKQpxPVtdCmZvcihwPTA7cDxz
-OysrcClxLnB1c2gocikKbz1ILkooYSxiLHEpCm5bYl09bwpyZXR1cm4gb31lbHNlIHJldHVybiBtfSwK
-eGI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5JeChhLnRSLGIpfSwKRkY6ZnVuY3Rpb24oYSxiKXtyZXR1
-cm4gSC5JeChhLmVULGIpfSwKRTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj1hLmVDLHE9ci5nZXQoYikK
-aWYocSE9bnVsbClyZXR1cm4gcQpzPUguaShILm8oYSxudWxsLGIsYykpCnIuc2V0KGIscykKcmV0dXJu
-IHN9LApjRTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxPWIuY2gKaWYocT09bnVsbClxPWIuY2g9bmV3
-IE1hcCgpCnM9cS5nZXQoYykKaWYocyE9bnVsbClyZXR1cm4gcwpyPUguaShILm8oYSxiLGMsITApKQpx
-LnNldChjLHIpCnJldHVybiByfSwKdjU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwPWIuY3gKaWYo
-cD09bnVsbClwPWIuY3g9bmV3IE1hcCgpCnM9Yy5jeQpyPXAuZ2V0KHMpCmlmKHIhPW51bGwpcmV0dXJu
-IHIKcT1ILmEoYSxiLGMueT09PTEwP2MuUTpbY10pCnAuc2V0KHMscSkKcmV0dXJuIHF9LApCRDpmdW5j
-dGlvbihhLGIpe2IuYT1ILkF1CmIuYj1ILkpKCnJldHVybiBifSwKbTpmdW5jdGlvbihhLGIsYyl7dmFy
-IHMscixxPWEuZUMuZ2V0KGMpCmlmKHEhPW51bGwpcmV0dXJuIHEKcz1uZXcgSC5KYyhudWxsLG51bGwp
-CnMueT1iCnMuY3k9YwpyPUguQkQoYSxzKQphLmVDLnNldChjLHIpCnJldHVybiByfSwKQzpmdW5jdGlv
-bihhLGIsYyl7dmFyIHMscj1iLmN5KyIqIixxPWEuZUMuZ2V0KHIpCmlmKHEhPW51bGwpcmV0dXJuIHEK
-cz1ILlo3KGEsYixyLGMpCmEuZUMuc2V0KHIscykKcmV0dXJuIHN9LApaNzpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcyxyLHEKaWYoZCl7cz1iLnkKaWYoIUguQTgoYikpcj1iPT09dC5QfHxiPT09dC5UfHxzPT09
-N3x8cz09PTYKZWxzZSByPSEwCmlmKHIpcmV0dXJuIGJ9cT1uZXcgSC5KYyhudWxsLG51bGwpCnEueT02
-CnEuej1iCnEuY3k9YwpyZXR1cm4gSC5CRChhLHEpfSwKQjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj1i
-LmN5KyI/IixxPWEuZUMuZ2V0KHIpCmlmKHEhPW51bGwpcmV0dXJuIHEKcz1ILmxsKGEsYixyLGMpCmEu
-ZUMuc2V0KHIscykKcmV0dXJuIHN9LApsbDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscAppZihk
-KXtzPWIueQppZighSC5BOChiKSlpZighKGI9PT10LlB8fGI9PT10LlQpKWlmKHMhPT03KXI9cz09PTgm
-JkgubFIoYi56KQplbHNlIHI9ITAKZWxzZSByPSEwCmVsc2Ugcj0hMAppZihyKXJldHVybiBiCmVsc2Ug
-aWYocz09PTF8fGI9PT10LmF3KXJldHVybiB0LlAKZWxzZSBpZihzPT09Nil7cT1iLnoKaWYocS55PT09
-OCYmSC5sUihxLnopKXJldHVybiBxCmVsc2UgcmV0dXJuIEguY3ooYSxiKX19cD1uZXcgSC5KYyhudWxs
-LG51bGwpCnAueT03CnAuej1iCnAuY3k9YwpyZXR1cm4gSC5CRChhLHApfSwKZjpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHMscj1iLmN5KyIvIixxPWEuZUMuZ2V0KHIpCmlmKHEhPW51bGwpcmV0dXJuIHEKcz1ILmVW
-KGEsYixyLGMpCmEuZUMuc2V0KHIscykKcmV0dXJuIHN9LAplVjpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
-cyxyLHEKaWYoZCl7cz1iLnkKaWYoIUguQTgoYikpaWYoIShiPT09dC5fKSlyPSExCmVsc2Ugcj0hMApl
-bHNlIHI9ITAKaWYocnx8Yj09PXQuSylyZXR1cm4gYgplbHNlIGlmKHM9PT0xKXJldHVybiBILkooYSwi
-YjgiLFtiXSkKZWxzZSBpZihiPT09dC5QfHxiPT09dC5UKXJldHVybiB0LmJHfXE9bmV3IEguSmMobnVs
-bCxudWxsKQpxLnk9OApxLno9YgpxLmN5PWMKcmV0dXJuIEguQkQoYSxxKX0sCkg6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyLHE9IiIrYisiXiIscD1hLmVDLmdldChxKQppZihwIT1udWxsKXJldHVybiBwCnM9bmV3
-IEguSmMobnVsbCxudWxsKQpzLnk9MTMKcy56PWIKcy5jeT1xCnI9SC5CRChhLHMpCmEuZUMuc2V0KHEs
-cikKcmV0dXJuIHJ9LApVeDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLmxlbmd0aApmb3Iocz0iIixy
-PSIiLHE9MDtxPHA7KytxLHI9IiwiKXMrPXIrYVtxXS5jeQpyZXR1cm4gc30sClM0OmZ1bmN0aW9uKGEp
-e3ZhciBzLHIscSxwLG8sbixtPWEubGVuZ3RoCmZvcihzPSIiLHI9IiIscT0wO3E8bTtxKz0zLHI9Iiwi
-KXtwPWFbcV0Kbz1hW3ErMV0/IiEiOiI6IgpuPWFbcSsyXS5jeQpzKz1yK3ArbytufXJldHVybiBzfSwK
-SjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9YgppZihjLmxlbmd0aCE9PTApcCs9IjwiK0guVXgo
-YykrIj4iCnM9YS5lQy5nZXQocCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPW5ldyBILkpjKG51bGwsbnVs
-bCkKci55PTkKci56PWIKci5RPWMKaWYoYy5sZW5ndGg+MClyLmM9Y1swXQpyLmN5PXAKcT1ILkJEKGEs
-cikKYS5lQy5zZXQocCxxKQpyZXR1cm4gcX0sCmE6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8s
-bgppZihiLnk9PT0xMCl7cz1iLnoKcj1iLlEuY29uY2F0KGMpfWVsc2V7cj1jCnM9Yn1xPXMuY3krKCI7
-PCIrSC5VeChyKSsiPiIpCnA9YS5lQy5nZXQocSkKaWYocCE9bnVsbClyZXR1cm4gcApvPW5ldyBILkpj
-KG51bGwsbnVsbCkKby55PTEwCm8uej1zCm8uUT1yCm8uY3k9cQpuPUguQkQoYSxvKQphLmVDLnNldChx
-LG4pCnJldHVybiBufSwKZDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIuY3ksbT1jLmEs
-bD1tLmxlbmd0aCxrPWMuYixqPWsubGVuZ3RoLGk9Yy5jLGg9aS5sZW5ndGgsZz0iKCIrSC5VeChtKQpp
-ZihqPjApe3M9bD4wPyIsIjoiIgpyPUguVXgoaykKZys9cysiWyIrcisiXSJ9aWYoaD4wKXtzPWw+MD8i
-LCI6IiIKcj1ILlM0KGkpCmcrPXMrInsiK3IrIn0ifXE9bisoZysiKSIpCnA9YS5lQy5nZXQocSkKaWYo
-cCE9bnVsbClyZXR1cm4gcApvPW5ldyBILkpjKG51bGwsbnVsbCkKby55PTExCm8uej1iCm8uUT1jCm8u
-Y3k9cQpyPUguQkQoYSxvKQphLmVDLnNldChxLHIpCnJldHVybiByfSwKRDpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcyxyPWIuY3krKCI8IitILlV4KGMpKyI+IikscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJl
-dHVybiBxCnM9SC5odyhhLGIsYyxyLGQpCmEuZUMuc2V0KHIscykKcmV0dXJuIHN9LApodzpmdW5jdGlv
-bihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwKaWYoZSl7cz1jLmxlbmd0aApyPW5ldyBBcnJh
-eShzKQpmb3IocT0wLHA9MDtwPHM7KytwKXtvPWNbcF0KaWYoby55PT09MSl7cltwXT1vOysrcX19aWYo
-cT4wKXtuPUguUEwoYSxiLHIsMCkKbT1ILmJaKGEsYyxyLDApCnJldHVybiBILkQoYSxuLG0sYyE9PW0p
-fX1sPW5ldyBILkpjKG51bGwsbnVsbCkKbC55PTEyCmwuej1iCmwuUT1jCmwuY3k9ZApyZXR1cm4gSC5C
-RChhLGwpfSwKbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm57dTphLGU6YixyOmMsczpbXSxwOjAsbjpk
-fX0sCmk6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoPWEucixnPWEucwpmb3Io
-cz1oLmxlbmd0aCxyPTA7cjxzOyl7cT1oLmNoYXJDb2RlQXQocikKaWYocT49NDgmJnE8PTU3KXI9SC5B
-KHIrMSxxLGgsZykKZWxzZSBpZigoKChxfDMyKT4+PjApLTk3JjY1NTM1KTwyNnx8cT09PTk1fHxxPT09
-MzYpcj1ILnQoYSxyLGgsZywhMSkKZWxzZSBpZihxPT09NDYpcj1ILnQoYSxyLGgsZywhMCkKZWxzZXsr
-K3IKc3dpdGNoKHEpe2Nhc2UgNDQ6YnJlYWsKY2FzZSA1ODpnLnB1c2goITEpCmJyZWFrCmNhc2UgMzM6
-Zy5wdXNoKCEwKQpicmVhawpjYXNlIDU5OmcucHVzaChILksoYS51LGEuZSxnLnBvcCgpKSkKYnJlYWsK
-Y2FzZSA5NDpnLnB1c2goSC5IKGEudSxnLnBvcCgpKSkKYnJlYWsKY2FzZSAzNTpnLnB1c2goSC5tKGEu
-dSw1LCIjIikpCmJyZWFrCmNhc2UgNjQ6Zy5wdXNoKEgubShhLnUsMiwiQCIpKQpicmVhawpjYXNlIDEy
-NjpnLnB1c2goSC5tKGEudSwzLCJ+IikpCmJyZWFrCmNhc2UgNjA6Zy5wdXNoKGEucCkKYS5wPWcubGVu
-Z3RoCmJyZWFrCmNhc2UgNjI6cD1hLnUKbz1nLnNwbGljZShhLnApCkgucihhLnUsYS5lLG8pCmEucD1n
-LnBvcCgpCm49Zy5wb3AoKQppZih0eXBlb2Ygbj09InN0cmluZyIpZy5wdXNoKEguSihwLG4sbykpCmVs
-c2V7bT1ILksocCxhLmUsbikKc3dpdGNoKG0ueSl7Y2FzZSAxMTpnLnB1c2goSC5EKHAsbSxvLGEubikp
-CmJyZWFrCmRlZmF1bHQ6Zy5wdXNoKEguYShwLG0sbykpCmJyZWFrfX1icmVhawpjYXNlIDM4OkguSShh
-LGcpCmJyZWFrCmNhc2UgNDI6cD1hLnUKZy5wdXNoKEguQyhwLEguSyhwLGEuZSxnLnBvcCgpKSxhLm4p
-KQpicmVhawpjYXNlIDYzOnA9YS51CmcucHVzaChILkIocCxILksocCxhLmUsZy5wb3AoKSksYS5uKSkK
-YnJlYWsKY2FzZSA0NzpwPWEudQpnLnB1c2goSC5mKHAsSC5LKHAsYS5lLGcucG9wKCkpLGEubikpCmJy
-ZWFrCmNhc2UgNDA6Zy5wdXNoKGEucCkKYS5wPWcubGVuZ3RoCmJyZWFrCmNhc2UgNDE6cD1hLnUKbD1u
-ZXcgSC5HKCkKaz1wLnNFQQpqPXAuc0VBCm49Zy5wb3AoKQppZih0eXBlb2Ygbj09Im51bWJlciIpc3dp
-dGNoKG4pe2Nhc2UtMTprPWcucG9wKCkKYnJlYWsKY2FzZS0yOmo9Zy5wb3AoKQpicmVhawpkZWZhdWx0
-OmcucHVzaChuKQpicmVha31lbHNlIGcucHVzaChuKQpvPWcuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUs
-bykKYS5wPWcucG9wKCkKbC5hPW8KbC5iPWsKbC5jPWoKZy5wdXNoKEguZChwLEguSyhwLGEuZSxnLnBv
-cCgpKSxsKSkKYnJlYWsKY2FzZSA5MTpnLnB1c2goYS5wKQphLnA9Zy5sZW5ndGgKYnJlYWsKY2FzZSA5
-MzpvPWcuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUsbykKYS5wPWcucG9wKCkKZy5wdXNoKG8pCmcucHVz
-aCgtMSkKYnJlYWsKY2FzZSAxMjM6Zy5wdXNoKGEucCkKYS5wPWcubGVuZ3RoCmJyZWFrCmNhc2UgMTI1
-Om89Zy5zcGxpY2UoYS5wKQpILnkoYS51LGEuZSxvKQphLnA9Zy5wb3AoKQpnLnB1c2gobykKZy5wdXNo
-KC0yKQpicmVhawpkZWZhdWx0OnRocm93IkJhZCBjaGFyYWN0ZXIgIitxfX19aT1nLnBvcCgpCnJldHVy
-biBILksoYS51LGEuZSxpKX0sCkE6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxPWItNDgKZm9yKHM9
-Yy5sZW5ndGg7YTxzOysrYSl7cj1jLmNoYXJDb2RlQXQoYSkKaWYoIShyPj00OCYmcjw9NTcpKWJyZWFr
-CnE9cSoxMCsoci00OCl9ZC5wdXNoKHEpCnJldHVybiBhfSwKdDpmdW5jdGlvbihhLGIsYyxkLGUpe3Zh
-ciBzLHIscSxwLG8sbixtPWIrMQpmb3Iocz1jLmxlbmd0aDttPHM7KyttKXtyPWMuY2hhckNvZGVBdCht
-KQppZihyPT09NDYpe2lmKGUpYnJlYWsKZT0hMH1lbHNle2lmKCEoKCgocnwzMik+Pj4wKS05NyY2NTUz
-NSk8MjZ8fHI9PT05NXx8cj09PTM2KSlxPXI+PTQ4JiZyPD01NwplbHNlIHE9ITAKaWYoIXEpYnJlYWt9
-fXA9Yy5zdWJzdHJpbmcoYixtKQppZihlKXtzPWEudQpvPWEuZQppZihvLnk9PT0xMClvPW8uegpuPUgu
-UW8ocyxvLnopW3BdCmlmKG49PW51bGwpSC52KCdObyAiJytwKyciIGluICInK0gubUQobykrJyInKQpk
-LnB1c2goSC5jRShzLG8sbikpfWVsc2UgZC5wdXNoKHApCnJldHVybiBtfSwKSTpmdW5jdGlvbihhLGIp
+ZXR1cm4gc30sCkhwKGEsYil7dmFyIHMscixxLHAsbyxuPW51bGwsbT0vXlxzKlsrLV0/KCgweFthLWYw
+LTldKyl8KFxkKyl8KFthLXowLTldKykpXHMqJC9pLmV4ZWMoYSkKaWYobT09bnVsbClyZXR1cm4gbgpp
+ZigzPj1tLmxlbmd0aClyZXR1cm4gSC5PSChtLDMpCnM9bVszXQppZihiPT1udWxsKXtpZihzIT1udWxs
+KXJldHVybiBwYXJzZUludChhLDEwKQppZihtWzJdIT1udWxsKXJldHVybiBwYXJzZUludChhLDE2KQpy
+ZXR1cm4gbn1pZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuVEUoYiwyLDM2LCJyYWRpeCIsbikpCmlmKGI9
+PT0xMCYmcyE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYoYjwxMHx8cz09bnVsbCl7cj1iPD0x
+MD80NytiOjg2K2IKcT1tWzFdCmZvcihwPXEubGVuZ3RoLG89MDtvPHA7KytvKWlmKChDLnhCLlcocSxv
+KXwzMik+cilyZXR1cm4gbn1yZXR1cm4gcGFyc2VJbnQoYSxiKX0sCmxoKGEpe3JldHVybiBILkg1KGEp
+fSwKSDUoYSl7dmFyIHMscixxLHAKaWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIEguZG0oSC56Syhh
+KSxudWxsKQppZihKLmlhKGEpPT09Qy5Pa3x8dC5iSS5iKGEpKXtzPUMuTzQoYSkKcj1zIT09Ik9iamVj
+dCImJnMhPT0iIgppZihyKXJldHVybiBzCnE9YS5jb25zdHJ1Y3RvcgppZih0eXBlb2YgcT09ImZ1bmN0
+aW9uIil7cD1xLm5hbWUKaWYodHlwZW9mIHA9PSJzdHJpbmciKXI9cCE9PSJPYmplY3QiJiZwIT09IiIK
+ZWxzZSByPSExCmlmKHIpcmV0dXJuIHB9fXJldHVybiBILmRtKEgueksoYSksbnVsbCl9LApNMCgpe2lm
+KCEhc2VsZi5sb2NhdGlvbilyZXR1cm4gc2VsZi5sb2NhdGlvbi5ocmVmCnJldHVybiBudWxsfSwKZnco
+YSxiLGMpe3ZhciBzLHIscSxwCmlmKGM8PTUwMCYmYj09PTAmJmM9PT1hLmxlbmd0aClyZXR1cm4gU3Ry
+aW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEpCmZvcihzPWIscj0iIjtzPGM7cz1xKXtxPXMrNTAw
+CnA9cTxjP3E6YwpyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYS5zdWJhcnJheShzLHAp
+KX1yZXR1cm4gcn0sCkx3KGEpe3ZhciBzCmlmKDA8PWEpe2lmKGE8PTY1NTM1KXJldHVybiBTdHJpbmcu
+ZnJvbUNoYXJDb2RlKGEpCmlmKGE8PTExMTQxMTEpe3M9YS02NTUzNgpyZXR1cm4gU3RyaW5nLmZyb21D
+aGFyQ29kZSgoQy5qbi53RyhzLDEwKXw1NTI5Nik+Pj4wLHMmMTAyM3w1NjMyMCl9fXRocm93IEguYihQ
+LlRFKGEsMCwxMTE0MTExLG51bGwsbnVsbCkpfSwKbzIoYSl7aWYoYS5kYXRlPT09dm9pZCAwKWEuZGF0
+ZT1uZXcgRGF0ZShhLmEpCnJldHVybiBhLmRhdGV9LAp0SihhKXt2YXIgcz1ILm8yKGEpLmdldEZ1bGxZ
+ZWFyKCkrMApyZXR1cm4gc30sCk5TKGEpe3ZhciBzPUgubzIoYSkuZ2V0TW9udGgoKSsxCnJldHVybiBz
+fSwKakEoYSl7dmFyIHM9SC5vMihhKS5nZXREYXRlKCkrMApyZXR1cm4gc30sCklYKGEpe3ZhciBzPUgu
+bzIoYSkuZ2V0SG91cnMoKSswCnJldHVybiBzfSwKY2goYSl7dmFyIHM9SC5vMihhKS5nZXRNaW51dGVz
+KCkrMApyZXR1cm4gc30sCkpkKGEpe3ZhciBzPUgubzIoYSkuZ2V0U2Vjb25kcygpKzAKcmV0dXJuIHN9
+LApvMShhKXt2YXIgcz1ILm8yKGEpLmdldE1pbGxpc2Vjb25kcygpKzAKcmV0dXJuIHN9LAp6byhhLGIs
+Yyl7dmFyIHMscixxPXt9CnEuYT0wCnM9W10Kcj1bXQpxLmE9Yi5sZW5ndGgKQy5ObS5GVihzLGIpCnEu
+Yj0iIgppZihjIT1udWxsJiYhYy5nbDAoYykpYy5LKDAsbmV3IEguQ2oocSxyLHMpKQoiIitxLmEKcmV0
+dXJuIEouSnkoYSxuZXcgSC5MSShDLlRlLDAscyxyLDApKX0sCkVrKGEsYixjKXt2YXIgcyxyLHE9Yz09
+bnVsbHx8Yy5nbDAoYykKaWYocSl7cz1iLmxlbmd0aAppZihzPT09MCl7aWYoISFhLiQwKXJldHVybiBh
+LiQwKCl9ZWxzZSBpZihzPT09MSl7aWYoISFhLiQxKXJldHVybiBhLiQxKGJbMF0pfWVsc2UgaWYocz09
+PTIpe2lmKCEhYS4kMilyZXR1cm4gYS4kMihiWzBdLGJbMV0pfWVsc2UgaWYocz09PTMpe2lmKCEhYS4k
+MylyZXR1cm4gYS4kMyhiWzBdLGJbMV0sYlsyXSl9ZWxzZSBpZihzPT09NCl7aWYoISFhLiQ0KXJldHVy
+biBhLiQ0KGJbMF0sYlsxXSxiWzJdLGJbM10pfWVsc2UgaWYocz09PTUpaWYoISFhLiQ1KXJldHVybiBh
+LiQ1KGJbMF0sYlsxXSxiWzJdLGJbM10sYls0XSkKcj1hWyIiKyIkIitzXQppZihyIT1udWxsKXJldHVy
+biByLmFwcGx5KGEsYil9cmV0dXJuIEguWlQoYSxiLGMpfSwKWlQoYSxiLGMpe3ZhciBzLHIscSxwLG8s
+bixtLGwsayxqLGksaCxnLGY9Yi5sZW5ndGgsZT1hLiRSCmlmKGY8ZSlyZXR1cm4gSC56byhhLGIsYykK
+cz1hLiRECnI9cz09bnVsbApxPSFyP3MoKTpudWxsCnA9Si5pYShhKQpvPXAuJEMKaWYodHlwZW9mIG89
+PSJzdHJpbmciKW89cFtvXQppZihyKXtpZihjIT1udWxsJiZjLmdvcihjKSlyZXR1cm4gSC56byhhLGIs
+YykKaWYoZj09PWUpcmV0dXJuIG8uYXBwbHkoYSxiKQpyZXR1cm4gSC56byhhLGIsYyl9aWYoQXJyYXku
+aXNBcnJheShxKSl7aWYoYyE9bnVsbCYmYy5nb3IoYykpcmV0dXJuIEguem8oYSxiLGMpCm49ZStxLmxl
+bmd0aAppZihmPm4pcmV0dXJuIEguem8oYSxiLG51bGwpCmlmKGY8bil7bT1xLnNsaWNlKGYtZSkKbD1Q
+LlkxKGIsITAsdC56KQpDLk5tLkZWKGwsbSl9ZWxzZSBsPWIKcmV0dXJuIG8uYXBwbHkoYSxsKX1lbHNl
+e2lmKGY+ZSlyZXR1cm4gSC56byhhLGIsYykKbD1QLlkxKGIsITAsdC56KQprPU9iamVjdC5rZXlzKHEp
+CmlmKGM9PW51bGwpZm9yKHI9ay5sZW5ndGgsaj0wO2o8ay5sZW5ndGg7ay5sZW5ndGg9PT1yfHwoMCxI
+LmxrKShrKSwrK2ope2k9cVtILm4oa1tqXSldCmlmKEMuTnY9PT1pKXJldHVybiBILnpvKGEsbCxjKQpD
+Lk5tLmkobCxpKX1lbHNle2ZvcihyPWsubGVuZ3RoLGg9MCxqPTA7ajxrLmxlbmd0aDtrLmxlbmd0aD09
+PXJ8fCgwLEgubGspKGspLCsrail7Zz1ILm4oa1tqXSkKaWYoYy54NChnKSl7KytoCkMuTm0uaShsLGMu
+cSgwLGcpKX1lbHNle2k9cVtnXQppZihDLk52PT09aSlyZXR1cm4gSC56byhhLGwsYykKQy5ObS5pKGws
+aSl9fWlmKGghPT1jLmdBKGMpKXJldHVybiBILnpvKGEsbCxjKX1yZXR1cm4gby5hcHBseShhLGwpfX0s
+CnBZKGEpe3Rocm93IEguYihILnRMKGEpKX0sCk9IKGEsYil7aWYoYT09bnVsbClKLkhtKGEpCnRocm93
+IEguYihILnUoYSxiKSl9LAp1KGEsYil7dmFyIHMscj0iaW5kZXgiCmlmKCFILm9rKGIpKXJldHVybiBu
+ZXcgUC5BVCghMCxiLHIsbnVsbCkKcz1ILklaKEouSG0oYSkpCmlmKGI8MHx8Yj49cylyZXR1cm4gUC5D
+ZihiLGEscixudWxsLHMpCnJldHVybiBQLk83KGIscil9LAphdShhLGIsYyl7aWYoYT5jKXJldHVybiBQ
+LlRFKGEsMCxjLCJzdGFydCIsbnVsbCkKaWYoYiE9bnVsbClpZihiPGF8fGI+YylyZXR1cm4gUC5URShi
+LGEsYywiZW5kIixudWxsKQpyZXR1cm4gbmV3IFAuQVQoITAsYiwiZW5kIixudWxsKX0sCnRMKGEpe3Jl
+dHVybiBuZXcgUC5BVCghMCxhLG51bGwsbnVsbCl9LApiKGEpe3ZhciBzLHIKaWYoYT09bnVsbClhPW5l
+dyBQLkYoKQpzPW5ldyBFcnJvcigpCnMuZGFydEV4Y2VwdGlvbj1hCnI9SC5oCmlmKCJkZWZpbmVQcm9w
+ZXJ0eSIgaW4gT2JqZWN0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkocywibWVzc2FnZSIse2dldDpyfSkK
+cy5uYW1lPSIifWVsc2Ugcy50b1N0cmluZz1yCnJldHVybiBzfSwKaCgpe3JldHVybiBKLncodGhpcy5k
+YXJ0RXhjZXB0aW9uKX0sCnYoYSl7dGhyb3cgSC5iKGEpfSwKbGsoYSl7dGhyb3cgSC5iKFAuYTQoYSkp
+fSwKY00oYSl7dmFyIHMscixxLHAsbyxuCmE9SC5lQShhLnJlcGxhY2UoU3RyaW5nKHt9KSwiJHJlY2Vp
+dmVyJCIpKQpzPWEubWF0Y2goL1xcXCRbYS16QS1aXStcXFwkL2cpCmlmKHM9PW51bGwpcz1ILlFJKFtd
+LHQucykKcj1zLmluZGV4T2YoIlxcJGFyZ3VtZW50c1xcJCIpCnE9cy5pbmRleE9mKCJcXCRhcmd1bWVu
+dHNFeHByXFwkIikKcD1zLmluZGV4T2YoIlxcJGV4cHJcXCQiKQpvPXMuaW5kZXhPZigiXFwkbWV0aG9k
+XFwkIikKbj1zLmluZGV4T2YoIlxcJHJlY2VpdmVyXFwkIikKcmV0dXJuIG5ldyBILmY5KGEucmVwbGFj
+ZShuZXcgUmVnRXhwKCJcXFxcXFwkYXJndW1lbnRzXFxcXFxcJCIsImciKSwiKCg/Onh8W154XSkqKSIp
+LnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxcXFxcJGFyZ3VtZW50c0V4cHJcXFxcXFwkIiwiZyIpLCIoKD86
+eHxbXnhdKSopIikucmVwbGFjZShuZXcgUmVnRXhwKCJcXFxcXFwkZXhwclxcXFxcXCQiLCJnIiksIigo
+Pzp4fFteeF0pKikiKS5yZXBsYWNlKG5ldyBSZWdFeHAoIlxcXFxcXCRtZXRob2RcXFxcXFwkIiwiZyIp
+LCIoKD86eHxbXnhdKSopIikucmVwbGFjZShuZXcgUmVnRXhwKCJcXFxcXFwkcmVjZWl2ZXJcXFxcXFwk
+IiwiZyIpLCIoKD86eHxbXnhdKSopIikscixxLHAsbyxuKX0sClM3KGEpe3JldHVybiBmdW5jdGlvbigk
+ZXhwciQpe3ZhciAkYXJndW1lbnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0cnl7JGV4cHIkLiRtZXRob2Qk
+KCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KGEpfSwKTWooYSl7cmV0
+dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4kbWV0aG9kJH1jYXRjaChzKXtyZXR1cm4gcy5t
+ZXNzYWdlfX0oYSl9LApUMyhhLGIpe3ZhciBzPWI9PW51bGwscj1zP251bGw6Yi5tZXRob2QKcmV0dXJu
+IG5ldyBILmF6KGEscixzP251bGw6Yi5yZWNlaXZlcil9LApSdShhKXtpZihhPT1udWxsKXJldHVybiBu
+ZXcgSC50ZShhKQppZihhIGluc3RhbmNlb2YgSC5icSlyZXR1cm4gSC50VyhhLHQuSy5hKGEuYSkpCmlm
+KHR5cGVvZiBhIT09Im9iamVjdCIpcmV0dXJuIGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJu
+IEgudFcoYSxhLmRhcnRFeGNlcHRpb24pCnJldHVybiBILnRsKGEpfSwKdFcoYSxiKXtpZih0Lm0uYihi
+KSlpZihiLiR0aHJvd25Kc0Vycm9yPT1udWxsKWIuJHRocm93bkpzRXJyb3I9YQpyZXR1cm4gYn0sCnRs
+KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsCmlmKCEoIm1lc3NhZ2UiIGlu
+IGEpKXJldHVybiBhCnM9YS5tZXNzYWdlCmlmKCJudW1iZXIiIGluIGEmJnR5cGVvZiBhLm51bWJlcj09
+Im51bWJlciIpe3I9YS5udW1iZXIKcT1yJjY1NTM1CmlmKChDLmpuLndHKHIsMTYpJjgxOTEpPT09MTAp
+c3dpdGNoKHEpe2Nhc2UgNDM4OnJldHVybiBILnRXKGEsSC5UMyhILkVqKHMpKyIgKEVycm9yICIrcSsi
+KSIsZSkpCmNhc2UgNDQ1OmNhc2UgNTAwNzpwPUguRWoocykrIiAoRXJyb3IgIitxKyIpIgpyZXR1cm4g
+SC50VyhhLG5ldyBILlcwKHAsZSkpfX1pZihhIGluc3RhbmNlb2YgVHlwZUVycm9yKXtvPSQuU24oKQpu
+PSQubHEoKQptPSQuTjkoKQpsPSQuaUkoKQprPSQuVU4oKQpqPSQuWmgoKQppPSQuck4oKQokLmMzKCkK
+aD0kLkhLKCkKZz0kLnIxKCkKZj1vLnFTKHMpCmlmKGYhPW51bGwpcmV0dXJuIEgudFcoYSxILlQzKEgu
+bihzKSxmKSkKZWxzZXtmPW4ucVMocykKaWYoZiE9bnVsbCl7Zi5tZXRob2Q9ImNhbGwiCnJldHVybiBI
+LnRXKGEsSC5UMyhILm4ocyksZikpfWVsc2V7Zj1tLnFTKHMpCmlmKGY9PW51bGwpe2Y9bC5xUyhzKQpp
+ZihmPT1udWxsKXtmPWsucVMocykKaWYoZj09bnVsbCl7Zj1qLnFTKHMpCmlmKGY9PW51bGwpe2Y9aS5x
+UyhzKQppZihmPT1udWxsKXtmPWwucVMocykKaWYoZj09bnVsbCl7Zj1oLnFTKHMpCmlmKGY9PW51bGwp
+e2Y9Zy5xUyhzKQpwPWYhPW51bGx9ZWxzZSBwPSEwfWVsc2UgcD0hMH1lbHNlIHA9ITB9ZWxzZSBwPSEw
+fWVsc2UgcD0hMH1lbHNlIHA9ITB9ZWxzZSBwPSEwCmlmKHApe0gubihzKQpyZXR1cm4gSC50VyhhLG5l
+dyBILlcwKHMsZj09bnVsbD9lOmYubWV0aG9kKSl9fX1yZXR1cm4gSC50VyhhLG5ldyBILnZWKHR5cGVv
+ZiBzPT0ic3RyaW5nIj9zOiIiKSl9aWYoYSBpbnN0YW5jZW9mIFJhbmdlRXJyb3Ipe2lmKHR5cGVvZiBz
+PT0ic3RyaW5nIiYmcy5pbmRleE9mKCJjYWxsIHN0YWNrIikhPT0tMSlyZXR1cm4gbmV3IFAuS1koKQpz
+PWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gU3RyaW5nKGIpfWNhdGNoKGQpe31yZXR1cm4gbnVsbH0oYSkK
+cmV0dXJuIEgudFcoYSxuZXcgUC5BVCghMSxlLGUsdHlwZW9mIHM9PSJzdHJpbmciP3MucmVwbGFjZSgv
+XlJhbmdlRXJyb3I6XHMqLywiIik6cykpfWlmKHR5cGVvZiBJbnRlcm5hbEVycm9yPT0iZnVuY3Rpb24i
+JiZhIGluc3RhbmNlb2YgSW50ZXJuYWxFcnJvcilpZih0eXBlb2Ygcz09InN0cmluZyImJnM9PT0idG9v
+IG11Y2ggcmVjdXJzaW9uIilyZXR1cm4gbmV3IFAuS1koKQpyZXR1cm4gYX0sCnRzKGEpe3ZhciBzCmlm
+KGEgaW5zdGFuY2VvZiBILmJxKXJldHVybiBhLmIKaWYoYT09bnVsbClyZXR1cm4gbmV3IEguWE8oYSkK
+cz1hLiRjYWNoZWRUcmFjZQppZihzIT1udWxsKXJldHVybiBzCnJldHVybiBhLiRjYWNoZWRUcmFjZT1u
+ZXcgSC5YTyhhKX0sCkNVKGEpe2lmKGE9PW51bGx8fHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gSi5o
+ZihhKQplbHNlIHJldHVybiBILmVRKGEpfSwKQjcoYSxiKXt2YXIgcyxyLHEscD1hLmxlbmd0aApmb3Io
+cz0wO3M8cDtzPXEpe3I9cysxCnE9cisxCmIuWTUoMCxhW3NdLGFbcl0pfXJldHVybiBifSwKZnQoYSxi
+LGMsZCxlLGYpe3QuWS5hKGEpCnN3aXRjaChILklaKGIpKXtjYXNlIDA6cmV0dXJuIGEuJDAoKQpjYXNl
+IDE6cmV0dXJuIGEuJDEoYykKY2FzZSAyOnJldHVybiBhLiQyKGMsZCkKY2FzZSAzOnJldHVybiBhLiQz
+KGMsZCxlKQpjYXNlIDQ6cmV0dXJuIGEuJDQoYyxkLGUsZil9dGhyb3cgSC5iKG5ldyBQLkNEKCJVbnN1
+cHBvcnRlZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB3cmFwcGVkIGNsb3N1cmUiKSl9LAp0UihhLGIp
+e3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKcz1hLiRpZGVudGl0eQppZighIXMpcmV0dXJuIHMK
+cz1mdW5jdGlvbihjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKGYsZyxoLGkpe3JldHVybiBlKGMsZCxmLGcs
+aCxpKX19KGEsYixILmZ0KQphLiRpZGVudGl0eT1zCnJldHVybiBzfSwKaUEoYTIpe3ZhciBzLHIscSxw
+LG8sbixtLGwsayxqLGk9YTIuY28saD1hMi5pUyxnPWEyLmlJLGY9YTIubkRBLGU9YTIuYUksZD1hMi5m
+cyxjPWEyLmNzLGI9ZFswXSxhPWNbMF0sYTA9aVtiXSxhMT1hMi5mVAphMS50b1N0cmluZwpzPWg/T2Jq
+ZWN0LmNyZWF0ZShuZXcgSC56eCgpLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk6T2JqZWN0LmNyZWF0ZShu
+ZXcgSC5yVChudWxsLG51bGwpLmNvbnN0cnVjdG9yLnByb3RvdHlwZSkKcy4kaW5pdGlhbGl6ZT1zLmNv
+bnN0cnVjdG9yCmlmKGgpcj1mdW5jdGlvbiBzdGF0aWNfdGVhcl9vZmYoKXt0aGlzLiRpbml0aWFsaXpl
+KCl9CmVsc2V7cT0kLnlqCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIHEuaCgpCiQueWo9cSsx
+CnE9bmV3IEZ1bmN0aW9uKCJhLGIiK3EsInRoaXMuJGluaXRpYWxpemUoYSxiIitxKyIpIikKcj1xfXMu
+Y29uc3RydWN0b3I9cgpyLnByb3RvdHlwZT1zCnMuJF9uYW1lPWIKcy4kX3RhcmdldD1hMApxPSFoCmlm
+KHEpcD1ILmJ4KGIsYTAsZyxmKQplbHNle3MuJHN0YXRpY19uYW1lPWIKcD1hMH1zLiRTPUguaW0oYTEs
+aCxnKQpzW2FdPXAKZm9yKG89cCxuPTE7bjxkLmxlbmd0aDsrK24pe209ZFtuXQppZih0eXBlb2YgbT09
+InN0cmluZyIpe2w9aVttXQprPW0KbT1sfWVsc2Ugaz0iIgpqPWNbbl0KaWYoaiE9bnVsbCl7aWYocSlt
+PUguYngoayxtLGcsZikKc1tqXT1tfWlmKG49PT1lKW89bX1zLiRDPW8Kcy4kUj1hMi5yQwpzLiREPWEy
+LmRWCnJldHVybiByfSwKaW0oYSxiLGMpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZih0
+eXBlb2YgYT09InN0cmluZyIpe2lmKGIpdGhyb3cgSC5iKCJDYW5ub3QgY29tcHV0ZSBzaWduYXR1cmUg
+Zm9yIHN0YXRpYyB0ZWFyb2ZmLiIpCnJldHVybiBmdW5jdGlvbihkLGUpe3JldHVybiBmdW5jdGlvbigp
+e3JldHVybiBlKHRoaXMsZCl9fShhLEguVG4pfXRocm93IEguYigiRXJyb3IgaW4gZnVuY3Rpb25UeXBl
+IG9mIHRlYXJvZmYiKX0sCnZxKGEsYixjLGQpe3ZhciBzPUgueVMKc3dpdGNoKGI/LTE6YSl7Y2FzZSAw
+OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmKHRoaXMpW2VdKCl9
+fShjLHMpCmNhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJu
+IGYodGhpcylbZV0oZyl9fShjLHMpCmNhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVu
+Y3Rpb24oZyxoKXtyZXR1cm4gZih0aGlzKVtlXShnLGgpfX0oYyxzKQpjYXNlIDM6cmV0dXJuIGZ1bmN0
+aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSl9fShj
+LHMpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksail7cmV0
+dXJuIGYodGhpcylbZV0oZyxoLGksail9fShjLHMpCmNhc2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmKXty
+ZXR1cm4gZnVuY3Rpb24oZyxoLGksaixrKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqLGspfX0oYyxz
+KQpkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFw
+cGx5KGYodGhpcyksYXJndW1lbnRzKX19KGQscyl9fSwKYngoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxu
+PSJyZWNlaXZlciIKaWYoYylyZXR1cm4gSC5IZihhLGIsZCkKcz1iLmxlbmd0aApyPWR8fHM+PTI3Cmlm
+KHIpcmV0dXJuIEgudnEocyxkLGEsYikKaWYocz09PTApe3I9JC55agppZih0eXBlb2YgciE9PSJudW1i
+ZXIiKXJldHVybiByLmgoKQokLnlqPXIrMQpxPSJzZWxmIityCnI9InJldHVybiBmdW5jdGlvbigpe3Zh
+ciAiK3ErIiA9IHRoaXMuIgpwPSQuaTAKcmV0dXJuIG5ldyBGdW5jdGlvbihyKyhwPT1udWxsPyQuaTA9
+SC5tOShuKTpwKSsiO3JldHVybiAiK3ErIi4iK2ErIigpO30iKSgpfW89ImFiY2RlZmdoaWprbG1ub3Bx
+cnN0dXZ3eHl6Ii5zcGxpdCgiIikuc3BsaWNlKDAscykuam9pbigiLCIpCnI9JC55agppZih0eXBlb2Yg
+ciE9PSJudW1iZXIiKXJldHVybiByLmgoKQokLnlqPXIrMQpvKz1yCnI9InJldHVybiBmdW5jdGlvbigi
+K28rIil7cmV0dXJuIHRoaXMuIgpwPSQuaTAKcmV0dXJuIG5ldyBGdW5jdGlvbihyKyhwPT1udWxsPyQu
+aTA9SC5tOShuKTpwKSsiLiIrYSsiKCIrbysiKTt9IikoKX0sClo0KGEsYixjLGQpe3ZhciBzPUgueVMs
+cj1ILkFPCnN3aXRjaChiPy0xOmEpe2Nhc2UgMDp0aHJvdyBILmIobmV3IEguRXEoIkludGVyY2VwdGVk
+IGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzLiIpKQpjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUsZixn
+KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpKX19KGMscixzKQpjYXNl
+IDI6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIGYodGhpcylb
+ZV0oZyh0aGlzKSxoKX19KGMscixzKQpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1cm4g
+ZnVuY3Rpb24oaCxpKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgsaSl9fShjLHIscykKY2FzZSA0
+OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqKXtyZXR1cm4gZih0aGlz
+KVtlXShnKHRoaXMpLGgsaSxqKX19KGMscixzKQpjYXNlIDU6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXty
+ZXR1cm4gZnVuY3Rpb24oaCxpLGosayl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrKX19
+KGMscixzKQpjYXNlIDY6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1cm4gZnVuY3Rpb24oaCxpLGos
+ayxsKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgsaSxqLGssbCl9fShjLHIscykKZGVmYXVsdDpy
+ZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbigpe3ZhciBxPVtnKHRoaXMpXQpBcnJh
+eS5wcm90b3R5cGUucHVzaC5hcHBseShxLGFyZ3VtZW50cykKcmV0dXJuIGUuYXBwbHkoZih0aGlzKSxx
+KX19KGQscixzKX19LApIZihhLGIsYyl7dmFyIHMscixxLHAsbyxuPSQuQWwKaWYobj09bnVsbCluPSQu
+QWw9SC5tOSgiaW50ZXJjZXB0b3IiKQpzPSQuaTAKaWYocz09bnVsbClzPSQuaTA9SC5tOSgicmVjZWl2
+ZXIiKQpyPWIubGVuZ3RoCnE9Y3x8cj49MjgKaWYocSlyZXR1cm4gSC5aNChyLGMsYSxiKQppZihyPT09
+MSl7cT0icmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuIituKyIuIithKyIodGhpcy4iK3MrIik7
+IgpwPSQueWoKaWYodHlwZW9mIHAhPT0ibnVtYmVyIilyZXR1cm4gcC5oKCkKJC55aj1wKzEKcmV0dXJu
+IG5ldyBGdW5jdGlvbihxK3ArIn0iKSgpfW89ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxp
+dCgiIikuc3BsaWNlKDAsci0xKS5qb2luKCIsIikKcT0icmV0dXJuIGZ1bmN0aW9uKCIrbysiKXtyZXR1
+cm4gdGhpcy4iK24rIi4iK2ErIih0aGlzLiIrcysiLCAiK28rIik7IgpwPSQueWoKaWYodHlwZW9mIHAh
+PT0ibnVtYmVyIilyZXR1cm4gcC5oKCkKJC55aj1wKzEKcmV0dXJuIG5ldyBGdW5jdGlvbihxK3ArIn0i
+KSgpfSwKVTIoYSl7cmV0dXJuIEguaUEoYSl9LApUbihhLGIpe3JldHVybiBILmNFKHYudHlwZVVuaXZl
+cnNlLEgueksoYS5hKSxiKX0sCnlTKGEpe3JldHVybiBhLmF9LApBTyhhKXtyZXR1cm4gYS5ifSwKbTko
+YSl7dmFyIHMscixxLHA9bmV3IEguclQoInJlY2VpdmVyIiwiaW50ZXJjZXB0b3IiKSxvPUouRXAoT2Jq
+ZWN0LmdldE93blByb3BlcnR5TmFtZXMocCksdC5YKQpmb3Iocz1vLmxlbmd0aCxyPTA7cjxzOysrcil7
+cT1vW3JdCmlmKHBbcV09PT1hKXJldHVybiBxfXRocm93IEguYihQLnhZKCJGaWVsZCBuYW1lICIrYSsi
+IG5vdCBmb3VuZC4iLG51bGwpKX0sCm9UKGEpe2lmKGE9PW51bGwpSC5mTygiYm9vbGVhbiBleHByZXNz
+aW9uIG11c3Qgbm90IGJlIG51bGwiKQpyZXR1cm4gYX0sCmZPKGEpe3Rocm93IEguYihuZXcgSC5rWShh
+KSl9LAphZyhhKXt0aHJvdyBILmIobmV3IFAucChhKSl9LApZZyhhKXtyZXR1cm4gdi5nZXRJc29sYXRl
+VGFnKGEpfSwKaXcoYSxiLGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmMsZW51bWVy
+YWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSl9LAp3MyhhKXt2YXIgcyxy
+LHEscCxvLG49SC5uKCQuTkYuJDEoYSkpLG09JC5ud1tuXQppZihtIT1udWxsKXtPYmplY3QuZGVmaW5l
+UHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTptLGVudW1lcmFibGU6ZmFsc2Us
+d3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBtLml9cz0kLnZ2W25dCmlmKHMh
+PW51bGwpcmV0dXJuIHMKcj12LmludGVyY2VwdG9yc0J5VGFnW25dCmlmKHI9PW51bGwpe3E9SC5rKCQu
+VFguJDIoYSxuKSkKaWYocSE9bnVsbCl7bT0kLm53W3FdCmlmKG0hPW51bGwpe09iamVjdC5kZWZpbmVQ
+cm9wZXJ0eShhLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm0sZW51bWVyYWJsZTpmYWxzZSx3
+cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIG0uaX1zPSQudnZbcV0KaWYocyE9
+bnVsbClyZXR1cm4gcwpyPXYuaW50ZXJjZXB0b3JzQnlUYWdbcV0Kbj1xfX1pZihyPT1udWxsKXJldHVy
+biBudWxsCnM9ci5wcm90b3R5cGUKcD1uWzBdCmlmKHA9PT0iISIpe209SC5WYShzKQokLm53W25dPW0K
+T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6bSxlbnVt
+ZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gbS5pfWlm
+KHA9PT0ifiIpeyQudnZbbl09cwpyZXR1cm4gc31pZihwPT09Ii0iKXtvPUguVmEocykKT2JqZWN0LmRl
+ZmluZVByb3BlcnR5KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3BhdGNoUHJvcGVydHlOYW1l
+LHt2YWx1ZTpvLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0p
+CnJldHVybiBvLml9aWYocD09PSIrIilyZXR1cm4gSC5MYyhhLHMpCmlmKHA9PT0iKiIpdGhyb3cgSC5i
+KFAuU1kobikpCmlmKHYubGVhZlRhZ3Nbbl09PT10cnVlKXtvPUguVmEocykKT2JqZWN0LmRlZmluZVBy
+b3BlcnR5KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1
+ZTpvLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVy
+biBvLml9ZWxzZSByZXR1cm4gSC5MYyhhLHMpfSwKTGMoYSxiKXt2YXIgcz1PYmplY3QuZ2V0UHJvdG90
+eXBlT2YoYSkKT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFs
+dWU6Si5RdShiLHMsbnVsbCxudWxsKSxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmln
+dXJhYmxlOnRydWV9KQpyZXR1cm4gYn0sClZhKGEpe3JldHVybiBKLlF1KGEsITEsbnVsbCwhIWEuJGlY
+ail9LApWRihhLGIsYyl7dmFyIHM9Yi5wcm90b3R5cGUKaWYodi5sZWFmVGFnc1thXT09PXRydWUpcmV0
+dXJuIEguVmEocykKZWxzZSByZXR1cm4gSi5RdShzLGMsbnVsbCxudWxsKX0sClhEKCl7aWYoITA9PT0k
+LkJ2KXJldHVybgokLkJ2PSEwCkguWjEoKX0sCloxKCl7dmFyIHMscixxLHAsbyxuLG0sbAokLm53PU9i
+amVjdC5jcmVhdGUobnVsbCkKJC52dj1PYmplY3QuY3JlYXRlKG51bGwpCkgua08oKQpzPXYuaW50ZXJj
+ZXB0b3JzQnlUYWcKcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzKQppZih0eXBlb2Ygd2luZG93
+IT0idW5kZWZpbmVkIil7d2luZG93CnE9ZnVuY3Rpb24oKXt9CmZvcihwPTA7cDxyLmxlbmd0aDsrK3Ap
+e289cltwXQpuPSQueDcuJDEobykKaWYobiE9bnVsbCl7bT1ILlZGKG8sc1tvXSxuKQppZihtIT1udWxs
+KXtPYmplY3QuZGVmaW5lUHJvcGVydHkobix2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTptLGVu
+dW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnEucHJvdG90eXBl
+PW59fX19Zm9yKHA9MDtwPHIubGVuZ3RoOysrcCl7bz1yW3BdCmlmKC9eW0EtWmEtel9dLy50ZXN0KG8p
+KXtsPXNbb10Kc1siISIrb109bApzWyJ+IitvXT1sCnNbIi0iK29dPWwKc1siKyIrb109bApzWyIqIitv
+XT1sfX19LAprTygpe3ZhciBzLHIscSxwLG8sbixtPUMuWXEoKQptPUgudWQoQy5LVSxILnVkKEMuZlEs
+SC51ZChDLmk3LEgudWQoQy5pNyxILnVkKEMueGksSC51ZChDLmRrLEgudWQoQy53YihDLk80KSxtKSkp
+KSkpKQppZih0eXBlb2YgZGFydE5hdGl2ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lciE9InVuZGVmaW5l
+ZCIpe3M9ZGFydE5hdGl2ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lcgppZih0eXBlb2Ygcz09ImZ1bmN0
+aW9uIilzPVtzXQppZihzLmNvbnN0cnVjdG9yPT1BcnJheSlmb3Iocj0wO3I8cy5sZW5ndGg7KytyKXtx
+PXNbcl0KaWYodHlwZW9mIHE9PSJmdW5jdGlvbiIpbT1xKG0pfHxtfX1wPW0uZ2V0VGFnCm89bS5nZXRV
+bmtub3duVGFnCm49bS5wcm90b3R5cGVGb3JUYWcKJC5ORj1uZXcgSC5kQyhwKQokLlRYPW5ldyBILndO
+KG8pCiQueDc9bmV3IEguVlgobil9LAp1ZChhLGIpe3JldHVybiBhKGIpfHxifSwKdjQoYSxiLGMsZCxl
+LGYpe3ZhciBzPWI/Im0iOiIiLHI9Yz8iIjoiaSIscT1kPyJ1IjoiIixwPWU/InMiOiIiLG89Zj8iZyI6
+IiIsbj1mdW5jdGlvbihnLGgpe3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChnLGgpfWNhdGNoKG0pe3JldHVy
+biBtfX0oYSxzK3IrcStwK28pCmlmKG4gaW5zdGFuY2VvZiBSZWdFeHApcmV0dXJuIG4KdGhyb3cgSC5i
+KFAucnIoIklsbGVnYWwgUmVnRXhwIHBhdHRlcm4gKCIrU3RyaW5nKG4pKyIpIixhLG51bGwpKX0sClNR
+KGEsYixjKXt2YXIgcwppZih0eXBlb2YgYj09InN0cmluZyIpcmV0dXJuIGEuaW5kZXhPZihiLGMpPj0w
+CmVsc2UgaWYoYiBpbnN0YW5jZW9mIEguVlIpe3M9Qy54Qi55bihhLGMpCnJldHVybiBiLmIudGVzdChz
+KX1lbHNle3M9Si5GTChiLEMueEIueW4oYSxjKSkKcmV0dXJuIXMuZ2wwKHMpfX0sCkE0KGEpe2lmKGEu
+aW5kZXhPZigiJCIsMCk+PTApcmV0dXJuIGEucmVwbGFjZSgvXCQvZywiJCQkJCIpCnJldHVybiBhfSwK
+ZUEoYSl7aWYoL1tbXF17fSgpKis/LlxcXiR8XS8udGVzdChhKSlyZXR1cm4gYS5yZXBsYWNlKC9bW1xd
+e30oKSorPy5cXF4kfF0vZywiXFwkJiIpCnJldHVybiBhfSwKeXMoYSxiLGMpe3ZhciBzPUgubk0oYSxi
+LGMpCnJldHVybiBzfSwKbk0oYSxiLGMpe3ZhciBzLHIscSxwCmlmKGI9PT0iIil7aWYoYT09PSIiKXJl
+dHVybiBjCnM9YS5sZW5ndGgKcj0iIitjCmZvcihxPTA7cTxzOysrcSlyPXIrYVtxXStjCnJldHVybiBy
+LmNoYXJDb2RlQXQoMCk9PTA/cjpyfXA9YS5pbmRleE9mKGIsMCkKaWYocDwwKXJldHVybiBhCmlmKGEu
+bGVuZ3RoPDUwMHx8Yy5pbmRleE9mKCIkIiwwKT49MClyZXR1cm4gYS5zcGxpdChiKS5qb2luKGMpCnJl
+dHVybiBhLnJlcGxhY2UobmV3IFJlZ0V4cChILmVBKGIpLCJnIiksSC5BNChjKSl9LApQRDpmdW5jdGlv
+biBQRChhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApXVTpmdW5jdGlvbiBXVSgpe30sCkxQOmZ1bmN0
+aW9uIExQKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sClhSOmZ1
+bmN0aW9uIFhSKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkxJOmZ1bmN0aW9uIExJKGEsYixjLGQs
+ZSl7dmFyIF89dGhpcwpfLmE9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLmY9ZX0sCkNqOmZ1bmN0aW9uIENq
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmY5OmZ1bmN0aW9uIGY5KGEsYixjLGQs
+ZSxmKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKVzA6ZnVu
+Y3Rpb24gVzAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmF6OmZ1bmN0aW9uIGF6KGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnZWOmZ1bmN0aW9uIHZWKGEpe3RoaXMuYT1hfSwKdGU6ZnVu
+Y3Rpb24gdGUoYSl7dGhpcy5hPWF9LApicTpmdW5jdGlvbiBicShhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
+fSwKWE86ZnVuY3Rpb24gWE8oYSl7dGhpcy5hPWEKdGhpcy5iPW51bGx9LApUcDpmdW5jdGlvbiBUcCgp
+e30sCkF5OmZ1bmN0aW9uIEF5KCl7fSwKRTE6ZnVuY3Rpb24gRTEoKXt9LApsYzpmdW5jdGlvbiBsYygp
+e30sCnp4OmZ1bmN0aW9uIHp4KCl7fSwKclQ6ZnVuY3Rpb24gclQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
+Yn0sCkVxOmZ1bmN0aW9uIEVxKGEpe3RoaXMuYT1hfSwKa1k6ZnVuY3Rpb24ga1koYSl7dGhpcy5hPWF9
+LAprcjpmdW5jdGlvbiBrcigpe30sCk41OmZ1bmN0aW9uIE41KGEpe3ZhciBfPXRoaXMKXy5hPTAKXy5m
+PV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LAp2aDpmdW5jdGlvbiB2aChhLGIpe3Zh
+ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsfSwKaTU6ZnVuY3Rpb24gaTUoYSxiKXt0aGlz
+LmE9YQp0aGlzLiR0aT1ifSwKTjY6ZnVuY3Rpb24gTjYoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5i
+PWIKXy5kPV8uYz1udWxsCl8uJHRpPWN9LApkQzpmdW5jdGlvbiBkQyhhKXt0aGlzLmE9YX0sCndOOmZ1
+bmN0aW9uIHdOKGEpe3RoaXMuYT1hfSwKVlg6ZnVuY3Rpb24gVlgoYSl7dGhpcy5hPWF9LApWUjpmdW5j
+dGlvbiBWUihhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsfSwKRUs6ZnVuY3Rp
+b24gRUsoYSl7dGhpcy5iPWF9LApLVzpmdW5jdGlvbiBLVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIK
+dGhpcy5jPWN9LApQYjpmdW5jdGlvbiBQYihhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
+YwpfLmQ9bnVsbH0sCnRROmZ1bmN0aW9uIHRRKGEsYil7dGhpcy5hPWEKdGhpcy5jPWJ9LAp1bjpmdW5j
+dGlvbiB1bihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApTZDpmdW5jdGlvbiBTZChh
+LGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9bnVsbH0sClhGKGEpe3JldHVybiBh
+fSwKb2QoYSxiLGMpe2lmKGE+Pj4wIT09YXx8YT49Yyl0aHJvdyBILmIoSC51KGIsYSkpfSwKck0oYSxi
+LGMpe3ZhciBzCmlmKCEoYT4+PjAhPT1hKSlzPWI+Pj4wIT09Ynx8YT5ifHxiPmMKZWxzZSBzPSEwCmlm
+KHMpdGhyb3cgSC5iKEguYXUoYSxiLGMpKQpyZXR1cm4gYn0sCkVUOmZ1bmN0aW9uIEVUKCl7fSwKTFo6
+ZnVuY3Rpb24gTFooKXt9LApEZzpmdW5jdGlvbiBEZygpe30sClBnOmZ1bmN0aW9uIFBnKCl7fSwKeGo6
+ZnVuY3Rpb24geGooKXt9LApkRTpmdW5jdGlvbiBkRSgpe30sClpBOmZ1bmN0aW9uIFpBKCl7fSwKZFQ6
+ZnVuY3Rpb24gZFQoKXt9LApQcTpmdW5jdGlvbiBQcSgpe30sCmVFOmZ1bmN0aW9uIGVFKCl7fSwKVjY6
+ZnVuY3Rpb24gVjYoKXt9LApSRzpmdW5jdGlvbiBSRygpe30sClZQOmZ1bmN0aW9uIFZQKCl7fSwKV0I6
+ZnVuY3Rpb24gV0IoKXt9LApaRzpmdW5jdGlvbiBaRygpe30sCmN6KGEsYil7dmFyIHM9Yi5jCnJldHVy
+biBzPT1udWxsP2IuYz1ILkIoYSxiLnosITApOnN9LAp4WihhLGIpe3ZhciBzPWIuYwpyZXR1cm4gcz09
+bnVsbD9iLmM9SC5KKGEsImI4IixbYi56XSk6c30sClExKGEpe3ZhciBzPWEueQppZihzPT09Nnx8cz09
+PTd8fHM9PT04KXJldHVybiBILlExKGEueikKcmV0dXJuIHM9PT0xMXx8cz09PTEyfSwKbUQoYSl7cmV0
+dXJuIGEuY3l9LApOMChhKXtyZXR1cm4gSC5FKHYudHlwZVVuaXZlcnNlLGEsITEpfSwKUEwoYSxiLGEw
+LGExKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjPWIueQpzd2l0Y2goYyl7Y2Fz
+ZSA1OmNhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpyZXR1cm4gYgpjYXNlIDY6cz1iLnoKcj1ILlBM
+KGEscyxhMCxhMSkKaWYocj09PXMpcmV0dXJuIGIKcmV0dXJuIEguQyhhLHIsITApCmNhc2UgNzpzPWIu
+egpyPUguUEwoYSxzLGEwLGExKQppZihyPT09cylyZXR1cm4gYgpyZXR1cm4gSC5CKGEsciwhMCkKY2Fz
+ZSA4OnM9Yi56CnI9SC5QTChhLHMsYTAsYTEpCmlmKHI9PT1zKXJldHVybiBiCnJldHVybiBILmYoYSxy
+LCEwKQpjYXNlIDk6cT1iLlEKcD1ILmJaKGEscSxhMCxhMSkKaWYocD09PXEpcmV0dXJuIGIKcmV0dXJu
+IEguSihhLGIueixwKQpjYXNlIDEwOm89Yi56Cm49SC5QTChhLG8sYTAsYTEpCm09Yi5RCmw9SC5iWihh
+LG0sYTAsYTEpCmlmKG49PT1vJiZsPT09bSlyZXR1cm4gYgpyZXR1cm4gSC5hKGEsbixsKQpjYXNlIDEx
+Oms9Yi56Cmo9SC5QTChhLGssYTAsYTEpCmk9Yi5RCmg9SC5xVChhLGksYTAsYTEpCmlmKGo9PT1rJiZo
+PT09aSlyZXR1cm4gYgpyZXR1cm4gSC5kKGEsaixoKQpjYXNlIDEyOmc9Yi5RCmExKz1nLmxlbmd0aApm
+PUguYlooYSxnLGEwLGExKQpvPWIuegpuPUguUEwoYSxvLGEwLGExKQppZihmPT09ZyYmbj09PW8pcmV0
+dXJuIGIKcmV0dXJuIEguRChhLG4sZiwhMCkKY2FzZSAxMzplPWIuegppZihlPGExKXJldHVybiBiCmQ9
+YTBbZS1hMV0KaWYoZD09bnVsbClyZXR1cm4gYgpyZXR1cm4gZApkZWZhdWx0OnRocm93IEguYihQLmhW
+KCJBdHRlbXB0ZWQgdG8gc3Vic3RpdHV0ZSB1bmV4cGVjdGVkIFJUSSBraW5kICIrYykpfX0sCmJaKGEs
+YixjLGQpe3ZhciBzLHIscSxwLG89Yi5sZW5ndGgsbj1ILnZVKG8pCmZvcihzPSExLHI9MDtyPG87Kyty
+KXtxPWJbcl0KcD1ILlBMKGEscSxjLGQpCmlmKHAhPT1xKXM9ITAKbltyXT1wfXJldHVybiBzP246Yn0s
+CnZPKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbixtPWIubGVuZ3RoLGw9SC52VShtKQpmb3Iocz0hMSxy
+PTA7cjxtO3IrPTMpe3E9YltyXQpwPWJbcisxXQpvPWJbcisyXQpuPUguUEwoYSxvLGMsZCkKaWYobiE9
+PW8pcz0hMApsLnNwbGljZShyLDMscSxwLG4pfXJldHVybiBzP2w6Yn0sCnFUKGEsYixjLGQpe3ZhciBz
+LHI9Yi5hLHE9SC5iWihhLHIsYyxkKSxwPWIuYixvPUguYlooYSxwLGMsZCksbj1iLmMsbT1ILnZPKGEs
+bixjLGQpCmlmKHE9PT1yJiZvPT09cCYmbT09PW4pcmV0dXJuIGIKcz1uZXcgSC5HKCkKcy5hPXEKcy5i
+PW8Kcy5jPW0KcmV0dXJuIHN9LApRSShhLGIpe2Fbdi5hcnJheVJ0aV09YgpyZXR1cm4gYX0sCkpTKGEp
+e3ZhciBzPWEuJFMKaWYocyE9bnVsbCl7aWYodHlwZW9mIHM9PSJudW1iZXIiKXJldHVybiBILkJwKHMp
+CnJldHVybiBhLiRTKCl9cmV0dXJuIG51bGx9LApVZShhLGIpe3ZhciBzCmlmKEguUTEoYikpaWYoYSBp
+bnN0YW5jZW9mIEguVHApe3M9SC5KUyhhKQppZihzIT1udWxsKXJldHVybiBzfXJldHVybiBILnpLKGEp
+fSwKeksoYSl7dmFyIHMKaWYoYSBpbnN0YW5jZW9mIFAuTWgpe3M9YS4kdGkKcmV0dXJuIHMhPW51bGw/
+czpILlZVKGEpfWlmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIEgudDYoYSkKcmV0dXJuIEguVlUoSi5p
+YShhKSl9LAp0NihhKXt2YXIgcz1hW3YuYXJyYXlSdGldLHI9dC5iCmlmKHM9PW51bGwpcmV0dXJuIHIK
+aWYocy5jb25zdHJ1Y3RvciE9PXIuY29uc3RydWN0b3IpcmV0dXJuIHIKcmV0dXJuIHN9LApMaChhKXt2
+YXIgcz1hLiR0aQpyZXR1cm4gcyE9bnVsbD9zOkguVlUoYSl9LApWVShhKXt2YXIgcz1hLmNvbnN0cnVj
+dG9yLHI9cy4kY2NhY2hlCmlmKHIhPW51bGwpcmV0dXJuIHIKcmV0dXJuIEgucjkoYSxzKX0sCnI5KGEs
+Yil7dmFyIHM9YSBpbnN0YW5jZW9mIEguVHA/YS5fX3Byb3RvX18uX19wcm90b19fLmNvbnN0cnVjdG9y
+OmIscj1ILmFpKHYudHlwZVVuaXZlcnNlLHMubmFtZSkKYi4kY2NhY2hlPXIKcmV0dXJuIHJ9LApCcChh
+KXt2YXIgcyxyPXYudHlwZXMscT1yW2FdCmlmKHR5cGVvZiBxPT0ic3RyaW5nIil7cz1ILkUodi50eXBl
+VW5pdmVyc2UscSwhMSkKclthXT1zCnJldHVybiBzfXJldHVybiBxfSwKSkooYSl7dmFyIHMscixxLHAs
+bz10aGlzCmlmKG89PT10LkspcmV0dXJuIEguUkUobyxhLEgua2UpCmlmKCFILkE4KG8pKWlmKCEobz09
+PXQuXykpcz0hMQplbHNlIHM9ITAKZWxzZSBzPSEwCmlmKHMpcmV0dXJuIEguUkUobyxhLEguSXcpCnM9
+by55CnI9cz09PTY/by56Om8KaWYocj09PXQuUylxPUgub2sKZWxzZSBpZihyPT09dC5nUnx8cj09PXQu
+ZGkpcT1ILktICmVsc2UgaWYocj09PXQuTilxPUguTU0KZWxzZSBxPXI9PT10Lnk/SC5yUTpudWxsCmlm
+KHEhPW51bGwpcmV0dXJuIEguUkUobyxhLHEpCmlmKHIueT09PTkpe3A9ci56CmlmKHIuUS5ldmVyeShI
+LmNjKSl7by5yPSIkaSIrcAppZihwPT09InpNIilyZXR1cm4gSC5SRShvLGEsSC55TSkKcmV0dXJuIEgu
+UkUobyxhLEgudDQpfX1lbHNlIGlmKHM9PT03KXJldHVybiBILlJFKG8sYSxILkFRKQpyZXR1cm4gSC5S
+RShvLGEsSC5ZTyl9LApSRShhLGIsYyl7YS5iPWMKcmV0dXJuIGEuYihiKX0sCkF1KGEpe3ZhciBzLHI9
+dGhpcyxxPUguT3oKaWYoIUguQTgocikpaWYoIShyPT09dC5fKSlzPSExCmVsc2Ugcz0hMAplbHNlIHM9
+ITAKaWYocylxPUguaG4KZWxzZSBpZihyPT09dC5LKXE9SC5UaQplbHNle3M9SC5sUihyKQppZihzKXE9
+SC5sNH1yLmE9cQpyZXR1cm4gci5hKGEpfSwKUWooYSl7dmFyIHMscj1hLnkKaWYoIUguQTgoYSkpaWYo
+IShhPT09dC5fKSlpZighKGE9PT10LmF3KSlpZihyIT09NylzPXI9PT04JiZILlFqKGEueil8fGE9PT10
+LlB8fGE9PT10LlQKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBz
+fSwKWU8oYSl7dmFyIHM9dGhpcwppZihhPT1udWxsKXJldHVybiBILlFqKHMpCnJldHVybiBILldlKHYu
+dHlwZVVuaXZlcnNlLEguVWUoYSxzKSxudWxsLHMsbnVsbCl9LApBUShhKXtpZihhPT1udWxsKXJldHVy
+biEwCnJldHVybiB0aGlzLnouYihhKX0sCnQ0KGEpe3ZhciBzLHI9dGhpcwppZihhPT1udWxsKXJldHVy
+biBILlFqKHIpCnM9ci5yCmlmKGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiEhYVtzXQpyZXR1cm4hIUou
+aWEoYSlbc119LAp5TShhKXt2YXIgcyxyPXRoaXMKaWYoYT09bnVsbClyZXR1cm4gSC5RaihyKQppZih0
+eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuITEKaWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4hMApzPXIu
+cgppZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4hIWFbc10KcmV0dXJuISFKLmlhKGEpW3NdfSwKT3oo
+YSl7dmFyIHMscj10aGlzCmlmKGE9PW51bGwpe3M9SC5sUihyKQppZihzKXJldHVybiBhfWVsc2UgaWYo
+ci5iKGEpKXJldHVybiBhCkgubTQoYSxyKX0sCmw0KGEpe3ZhciBzPXRoaXMKaWYoYT09bnVsbClyZXR1
+cm4gYQplbHNlIGlmKHMuYihhKSlyZXR1cm4gYQpILm00KGEscyl9LAptNChhLGIpe3Rocm93IEguYihI
+LlpjKEguV0soYSxILlVlKGEsYiksSC5kbShiLG51bGwpKSkpfSwKRGgoYSxiLGMsZCl7dmFyIHM9bnVs
+bAppZihILldlKHYudHlwZVVuaXZlcnNlLGEscyxiLHMpKXJldHVybiBhCnRocm93IEguYihILlpjKCJU
+aGUgdHlwZSBhcmd1bWVudCAnIitILmRtKGEscykrIicgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgdHlw
+ZSB2YXJpYWJsZSBib3VuZCAnIitILmRtKGIscykrIicgb2YgdHlwZSB2YXJpYWJsZSAnIitjKyInIGlu
+ICciK2QrIicuIikpfSwKV0soYSxiLGMpe3ZhciBzPVAuaGwoYSkscj1ILmRtKGI9PW51bGw/SC56Syhh
+KTpiLG51bGwpCnJldHVybiBzKyI6IHR5cGUgJyIrcisiJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHR5cGUg
+JyIrYysiJyJ9LApaYyhhKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIithKX0sCnEoYSxiKXty
+ZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIitILldLKGEsbnVsbCxiKSl9LAprZShhKXtyZXR1cm4g
+YSE9bnVsbH0sClRpKGEpe2lmKGEhPW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJPYmplY3Qi
+KSl9LApJdyhhKXtyZXR1cm4hMH0sCmhuKGEpe3JldHVybiBhfSwKclEoYSl7cmV0dXJuITA9PT1hfHwh
+MT09PWF9LApwOChhKXtpZighMD09PWEpcmV0dXJuITAKaWYoITE9PT1hKXJldHVybiExCnRocm93IEgu
+YihILnEoYSwiYm9vbCIpKX0sCm1MKGEpe2lmKCEwPT09YSlyZXR1cm4hMAppZighMT09PWEpcmV0dXJu
+ITEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsImJvb2wiKSl9LApNNChhKXtpZigh
+MD09PWEpcmV0dXJuITAKaWYoITE9PT1hKXJldHVybiExCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cg
+SC5iKEgucShhLCJib29sPyIpKX0sCnJWKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQp0
+aHJvdyBILmIoSC5xKGEsImRvdWJsZSIpKX0sCnRGKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1
+cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwiZG91YmxlIikpfSwKUWsoYSl7
+aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5i
+KEgucShhLCJkb3VibGU/IikpfSwKb2soYSl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5m
+bG9vcihhKT09PWF9LApJWihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1h
+KXJldHVybiBhCnRocm93IEguYihILnEoYSwiaW50IikpfSwKdVAoYSl7aWYodHlwZW9mIGE9PSJudW1i
+ZXIiJiZNYXRoLmZsb29yKGEpPT09YSlyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEgu
+YihILnEoYSwiaW50IikpfSwKVWMoYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZNYXRoLmZsb29yKGEp
+PT09YSlyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwiaW50PyIpKX0s
+CktIKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJlciJ9LAp6NShhKXtpZih0eXBlb2YgYT09Im51bWJl
+ciIpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJudW0iKSl9LApXMShhKXtpZih0eXBlb2YgYT09Im51
+bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIm51bSIpKX0s
+CmNVKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRo
+cm93IEguYihILnEoYSwibnVtPyIpKX0sCk1NKGEpe3JldHVybiB0eXBlb2YgYT09InN0cmluZyJ9LApu
+KGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmluZyIp
+KX0sCmhOKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBh
+CnRocm93IEguYihILnEoYSwiU3RyaW5nIikpfSwKayhhKXtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0
+dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmluZz8iKSl9LAppbyhh
+LGIpe3ZhciBzLHIscQpmb3Iocz0iIixyPSIiLHE9MDtxPGEubGVuZ3RoOysrcSxyPSIsICIpcys9citI
+LmRtKGFbcV0sYikKcmV0dXJuIHN9LApiSShhNCxhNSxhNil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGos
+aSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTM9IiwgIgppZihhNiE9bnVsbCl7cz1hNi5sZW5ndGgK
+aWYoYTU9PW51bGwpe2E1PUguUUkoW10sdC5zKQpyPW51bGx9ZWxzZSByPWE1Lmxlbmd0aApxPWE1Lmxl
+bmd0aApmb3IocD1zO3A+MDstLXApQy5ObS5pKGE1LCJUIisocStwKSkKZm9yKG89dC5YLG49dC5fLG09
+IjwiLGw9IiIscD0wO3A8czsrK3AsbD1hMyl7bSs9bAprPWE1Lmxlbmd0aApqPWstMS1wCmlmKGo8MCly
+ZXR1cm4gSC5PSChhNSxqKQptPUMueEIuaChtLGE1W2pdKQppPWE2W3BdCmg9aS55CmlmKCEoaD09PTJ8
+fGg9PT0zfHxoPT09NHx8aD09PTV8fGk9PT1vKSlpZighKGk9PT1uKSlrPSExCmVsc2Ugaz0hMAplbHNl
+IGs9ITAKaWYoIWspbSs9IiBleHRlbmRzICIrSC5kbShpLGE1KX1tKz0iPiJ9ZWxzZXttPSIiCnI9bnVs
+bH1vPWE0LnoKZz1hNC5RCmY9Zy5hCmU9Zi5sZW5ndGgKZD1nLmIKYz1kLmxlbmd0aApiPWcuYwphPWIu
+bGVuZ3RoCmEwPUguZG0obyxhNSkKZm9yKGExPSIiLGEyPSIiLHA9MDtwPGU7KytwLGEyPWEzKWExKz1h
+MitILmRtKGZbcF0sYTUpCmlmKGM+MCl7YTErPWEyKyJbIgpmb3IoYTI9IiIscD0wO3A8YzsrK3AsYTI9
+YTMpYTErPWEyK0guZG0oZFtwXSxhNSkKYTErPSJdIn1pZihhPjApe2ExKz1hMisieyIKZm9yKGEyPSIi
+LHA9MDtwPGE7cCs9MyxhMj1hMyl7YTErPWEyCmlmKGJbcCsxXSlhMSs9InJlcXVpcmVkICIKYTErPUgu
+ZG0oYltwKzJdLGE1KSsiICIrYltwXX1hMSs9In0ifWlmKHIhPW51bGwpe2E1LnRvU3RyaW5nCmE1Lmxl
+bmd0aD1yfXJldHVybiBtKyIoIithMSsiKSA9PiAiK2EwfSwKZG0oYSxiKXt2YXIgcyxyLHEscCxvLG4s
+bSxsPWEueQppZihsPT09NSlyZXR1cm4iZXJhc2VkIgppZihsPT09MilyZXR1cm4iZHluYW1pYyIKaWYo
+bD09PTMpcmV0dXJuInZvaWQiCmlmKGw9PT0xKXJldHVybiJOZXZlciIKaWYobD09PTQpcmV0dXJuImFu
+eSIKaWYobD09PTYpe3M9SC5kbShhLnosYikKcmV0dXJuIHN9aWYobD09PTcpe3I9YS56CnM9SC5kbShy
+LGIpCnE9ci55CnJldHVybihxPT09MTF8fHE9PT0xMj8iKCIrcysiKSI6cykrIj8ifWlmKGw9PT04KXJl
+dHVybiJGdXR1cmVPcjwiK0guZG0oYS56LGIpKyI+IgppZihsPT09OSl7cD1ILm8zKGEueikKbz1hLlEK
+cmV0dXJuIG8ubGVuZ3RoPjA/cCsoIjwiK0guaW8obyxiKSsiPiIpOnB9aWYobD09PTExKXJldHVybiBI
+LmJJKGEsYixudWxsKQppZihsPT09MTIpcmV0dXJuIEguYkkoYS56LGIsYS5RKQppZihsPT09MTMpe249
+YS56Cm09Yi5sZW5ndGgKbj1tLTEtbgppZihuPDB8fG4+PW0pcmV0dXJuIEguT0goYixuKQpyZXR1cm4g
+YltuXX1yZXR1cm4iPyJ9LApvMyhhKXt2YXIgcyxyPXYubWFuZ2xlZEdsb2JhbE5hbWVzW2FdCmlmKHIh
+PW51bGwpcmV0dXJuIHIKcz0ibWluaWZpZWQ6IithCnJldHVybiBzfSwKUW8oYSxiKXt2YXIgcz1hLnRS
+W2JdCmZvcig7dHlwZW9mIHM9PSJzdHJpbmciOylzPWEudFJbc10KcmV0dXJuIHN9LAphaShhLGIpe3Zh
+ciBzLHIscSxwLG8sbj1hLmVULG09bltiXQppZihtPT1udWxsKXJldHVybiBILkUoYSxiLCExKQplbHNl
+IGlmKHR5cGVvZiBtPT0ibnVtYmVyIil7cz1tCnI9SC5tKGEsNSwiIyIpCnE9SC52VShzKQpmb3IocD0w
+O3A8czsrK3ApcVtwXT1yCm89SC5KKGEsYixxKQpuW2JdPW8KcmV0dXJuIG99ZWxzZSByZXR1cm4gbX0s
+CnhiKGEsYil7cmV0dXJuIEguSXgoYS50UixiKX0sCkZGKGEsYil7cmV0dXJuIEguSXgoYS5lVCxiKX0s
+CkUoYSxiLGMpe3ZhciBzLHI9YS5lQyxxPXIuZ2V0KGIpCmlmKHEhPW51bGwpcmV0dXJuIHEKcz1ILmko
+SC5vKGEsbnVsbCxiLGMpKQpyLnNldChiLHMpCnJldHVybiBzfSwKY0UoYSxiLGMpe3ZhciBzLHIscT1i
+LmNoCmlmKHE9PW51bGwpcT1iLmNoPW5ldyBNYXAoKQpzPXEuZ2V0KGMpCmlmKHMhPW51bGwpcmV0dXJu
+IHMKcj1ILmkoSC5vKGEsYixjLCEwKSkKcS5zZXQoYyxyKQpyZXR1cm4gcn0sCnY1KGEsYixjKXt2YXIg
+cyxyLHEscD1iLmN4CmlmKHA9PW51bGwpcD1iLmN4PW5ldyBNYXAoKQpzPWMuY3kKcj1wLmdldChzKQpp
+ZihyIT1udWxsKXJldHVybiByCnE9SC5hKGEsYixjLnk9PT0xMD9jLlE6W2NdKQpwLnNldChzLHEpCnJl
+dHVybiBxfSwKQkQoYSxiKXtiLmE9SC5BdQpiLmI9SC5KSgpyZXR1cm4gYn0sCm0oYSxiLGMpe3ZhciBz
+LHIscT1hLmVDLmdldChjKQppZihxIT1udWxsKXJldHVybiBxCnM9bmV3IEguSmMobnVsbCxudWxsKQpz
+Lnk9YgpzLmN5PWMKcj1ILkJEKGEscykKYS5lQy5zZXQoYyxyKQpyZXR1cm4gcn0sCkMoYSxiLGMpe3Zh
+ciBzLHI9Yi5jeSsiKiIscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJldHVybiBxCnM9SC5aNyhhLGIs
+cixjKQphLmVDLnNldChyLHMpCnJldHVybiBzfSwKWjcoYSxiLGMsZCl7dmFyIHMscixxCmlmKGQpe3M9
+Yi55CmlmKCFILkE4KGIpKXI9Yj09PXQuUHx8Yj09PXQuVHx8cz09PTd8fHM9PT02CmVsc2Ugcj0hMApp
+ZihyKXJldHVybiBifXE9bmV3IEguSmMobnVsbCxudWxsKQpxLnk9NgpxLno9YgpxLmN5PWMKcmV0dXJu
+IEguQkQoYSxxKX0sCkIoYSxiLGMpe3ZhciBzLHI9Yi5jeSsiPyIscT1hLmVDLmdldChyKQppZihxIT1u
+dWxsKXJldHVybiBxCnM9SC5sbChhLGIscixjKQphLmVDLnNldChyLHMpCnJldHVybiBzfSwKbGwoYSxi
+LGMsZCl7dmFyIHMscixxLHAKaWYoZCl7cz1iLnkKaWYoIUguQTgoYikpaWYoIShiPT09dC5QfHxiPT09
+dC5UKSlpZihzIT09NylyPXM9PT04JiZILmxSKGIueikKZWxzZSByPSEwCmVsc2Ugcj0hMAplbHNlIHI9
+ITAKaWYocilyZXR1cm4gYgplbHNlIGlmKHM9PT0xfHxiPT09dC5hdylyZXR1cm4gdC5QCmVsc2UgaWYo
+cz09PTYpe3E9Yi56CmlmKHEueT09PTgmJkgubFIocS56KSlyZXR1cm4gcQplbHNlIHJldHVybiBILmN6
+KGEsYil9fXA9bmV3IEguSmMobnVsbCxudWxsKQpwLnk9NwpwLno9YgpwLmN5PWMKcmV0dXJuIEguQkQo
+YSxwKX0sCmYoYSxiLGMpe3ZhciBzLHI9Yi5jeSsiLyIscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJl
+dHVybiBxCnM9SC5lVihhLGIscixjKQphLmVDLnNldChyLHMpCnJldHVybiBzfSwKZVYoYSxiLGMsZCl7
+dmFyIHMscixxCmlmKGQpe3M9Yi55CmlmKCFILkE4KGIpKWlmKCEoYj09PXQuXykpcj0hMQplbHNlIHI9
+ITAKZWxzZSByPSEwCmlmKHJ8fGI9PT10LkspcmV0dXJuIGIKZWxzZSBpZihzPT09MSlyZXR1cm4gSC5K
+KGEsImI4IixbYl0pCmVsc2UgaWYoYj09PXQuUHx8Yj09PXQuVClyZXR1cm4gdC5iR31xPW5ldyBILkpj
+KG51bGwsbnVsbCkKcS55PTgKcS56PWIKcS5jeT1jCnJldHVybiBILkJEKGEscSl9LApIKGEsYil7dmFy
+IHMscixxPSIiK2IrIl4iLHA9YS5lQy5nZXQocSkKaWYocCE9bnVsbClyZXR1cm4gcApzPW5ldyBILkpj
+KG51bGwsbnVsbCkKcy55PTEzCnMuej1iCnMuY3k9cQpyPUguQkQoYSxzKQphLmVDLnNldChxLHIpCnJl
+dHVybiByfSwKVXgoYSl7dmFyIHMscixxLHA9YS5sZW5ndGgKZm9yKHM9IiIscj0iIixxPTA7cTxwOysr
+cSxyPSIsIilzKz1yK2FbcV0uY3kKcmV0dXJuIHN9LApTNChhKXt2YXIgcyxyLHEscCxvLG4sbT1hLmxl
+bmd0aApmb3Iocz0iIixyPSIiLHE9MDtxPG07cSs9MyxyPSIsIil7cD1hW3FdCm89YVtxKzFdPyIhIjoi
+OiIKbj1hW3ErMl0uY3kKcys9citwK28rbn1yZXR1cm4gc30sCkooYSxiLGMpe3ZhciBzLHIscSxwPWIK
+aWYoYy5sZW5ndGg+MClwKz0iPCIrSC5VeChjKSsiPiIKcz1hLmVDLmdldChwKQppZihzIT1udWxsKXJl
+dHVybiBzCnI9bmV3IEguSmMobnVsbCxudWxsKQpyLnk9OQpyLno9YgpyLlE9YwppZihjLmxlbmd0aD4w
+KXIuYz1jWzBdCnIuY3k9cApxPUguQkQoYSxyKQphLmVDLnNldChwLHEpCnJldHVybiBxfSwKYShhLGIs
+Yyl7dmFyIHMscixxLHAsbyxuCmlmKGIueT09PTEwKXtzPWIuegpyPWIuUS5jb25jYXQoYyl9ZWxzZXty
+PWMKcz1ifXE9cy5jeSsoIjs8IitILlV4KHIpKyI+IikKcD1hLmVDLmdldChxKQppZihwIT1udWxsKXJl
+dHVybiBwCm89bmV3IEguSmMobnVsbCxudWxsKQpvLnk9MTAKby56PXMKby5RPXIKby5jeT1xCm49SC5C
+RChhLG8pCmEuZUMuc2V0KHEsbikKcmV0dXJuIG59LApkKGEsYixjKXt2YXIgcyxyLHEscCxvLG49Yi5j
+eSxtPWMuYSxsPW0ubGVuZ3RoLGs9Yy5iLGo9ay5sZW5ndGgsaT1jLmMsaD1pLmxlbmd0aCxnPSIoIitI
+LlV4KG0pCmlmKGo+MCl7cz1sPjA/IiwiOiIiCnI9SC5VeChrKQpnKz1zKyJbIityKyJdIn1pZihoPjAp
+e3M9bD4wPyIsIjoiIgpyPUguUzQoaSkKZys9cysieyIrcisifSJ9cT1uKyhnKyIpIikKcD1hLmVDLmdl
+dChxKQppZihwIT1udWxsKXJldHVybiBwCm89bmV3IEguSmMobnVsbCxudWxsKQpvLnk9MTEKby56PWIK
+by5RPWMKby5jeT1xCnI9SC5CRChhLG8pCmEuZUMuc2V0KHEscikKcmV0dXJuIHJ9LApEKGEsYixjLGQp
+e3ZhciBzLHI9Yi5jeSsoIjwiK0guVXgoYykrIj4iKSxxPWEuZUMuZ2V0KHIpCmlmKHEhPW51bGwpcmV0
+dXJuIHEKcz1ILmh3KGEsYixjLHIsZCkKYS5lQy5zZXQocixzKQpyZXR1cm4gc30sCmh3KGEsYixjLGQs
+ZSl7dmFyIHMscixxLHAsbyxuLG0sbAppZihlKXtzPWMubGVuZ3RoCnI9SC52VShzKQpmb3IocT0wLHA9
+MDtwPHM7KytwKXtvPWNbcF0KaWYoby55PT09MSl7cltwXT1vOysrcX19aWYocT4wKXtuPUguUEwoYSxi
+LHIsMCkKbT1ILmJaKGEsYyxyLDApCnJldHVybiBILkQoYSxuLG0sYyE9PW0pfX1sPW5ldyBILkpjKG51
+bGwsbnVsbCkKbC55PTEyCmwuej1iCmwuUT1jCmwuY3k9ZApyZXR1cm4gSC5CRChhLGwpfSwKbyhhLGIs
+YyxkKXtyZXR1cm57dTphLGU6YixyOmMsczpbXSxwOjAsbjpkfX0sCmkoYSl7dmFyIHMscixxLHAsbyxu
+LG0sbCxrLGosaSxoPWEucixnPWEucwpmb3Iocz1oLmxlbmd0aCxyPTA7cjxzOyl7cT1oLmNoYXJDb2Rl
+QXQocikKaWYocT49NDgmJnE8PTU3KXI9SC5BKHIrMSxxLGgsZykKZWxzZSBpZigoKChxfDMyKT4+PjAp
+LTk3JjY1NTM1KTwyNnx8cT09PTk1fHxxPT09MzYpcj1ILnQoYSxyLGgsZywhMSkKZWxzZSBpZihxPT09
+NDYpcj1ILnQoYSxyLGgsZywhMCkKZWxzZXsrK3IKc3dpdGNoKHEpe2Nhc2UgNDQ6YnJlYWsKY2FzZSA1
+ODpnLnB1c2goITEpCmJyZWFrCmNhc2UgMzM6Zy5wdXNoKCEwKQpicmVhawpjYXNlIDU5OmcucHVzaChI
+LksoYS51LGEuZSxnLnBvcCgpKSkKYnJlYWsKY2FzZSA5NDpnLnB1c2goSC5IKGEudSxnLnBvcCgpKSkK
+YnJlYWsKY2FzZSAzNTpnLnB1c2goSC5tKGEudSw1LCIjIikpCmJyZWFrCmNhc2UgNjQ6Zy5wdXNoKEgu
+bShhLnUsMiwiQCIpKQpicmVhawpjYXNlIDEyNjpnLnB1c2goSC5tKGEudSwzLCJ+IikpCmJyZWFrCmNh
+c2UgNjA6Zy5wdXNoKGEucCkKYS5wPWcubGVuZ3RoCmJyZWFrCmNhc2UgNjI6cD1hLnUKbz1nLnNwbGlj
+ZShhLnApCkgucihhLnUsYS5lLG8pCmEucD1nLnBvcCgpCm49Zy5wb3AoKQppZih0eXBlb2Ygbj09InN0
+cmluZyIpZy5wdXNoKEguSihwLG4sbykpCmVsc2V7bT1ILksocCxhLmUsbikKc3dpdGNoKG0ueSl7Y2Fz
+ZSAxMTpnLnB1c2goSC5EKHAsbSxvLGEubikpCmJyZWFrCmRlZmF1bHQ6Zy5wdXNoKEguYShwLG0sbykp
+CmJyZWFrfX1icmVhawpjYXNlIDM4OkguSShhLGcpCmJyZWFrCmNhc2UgNDI6cD1hLnUKZy5wdXNoKEgu
+QyhwLEguSyhwLGEuZSxnLnBvcCgpKSxhLm4pKQpicmVhawpjYXNlIDYzOnA9YS51CmcucHVzaChILkIo
+cCxILksocCxhLmUsZy5wb3AoKSksYS5uKSkKYnJlYWsKY2FzZSA0NzpwPWEudQpnLnB1c2goSC5mKHAs
+SC5LKHAsYS5lLGcucG9wKCkpLGEubikpCmJyZWFrCmNhc2UgNDA6Zy5wdXNoKGEucCkKYS5wPWcubGVu
+Z3RoCmJyZWFrCmNhc2UgNDE6cD1hLnUKbD1uZXcgSC5HKCkKaz1wLnNFQQpqPXAuc0VBCm49Zy5wb3Ao
+KQppZih0eXBlb2Ygbj09Im51bWJlciIpc3dpdGNoKG4pe2Nhc2UtMTprPWcucG9wKCkKYnJlYWsKY2Fz
+ZS0yOmo9Zy5wb3AoKQpicmVhawpkZWZhdWx0OmcucHVzaChuKQpicmVha31lbHNlIGcucHVzaChuKQpv
+PWcuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUsbykKYS5wPWcucG9wKCkKbC5hPW8KbC5iPWsKbC5jPWoK
+Zy5wdXNoKEguZChwLEguSyhwLGEuZSxnLnBvcCgpKSxsKSkKYnJlYWsKY2FzZSA5MTpnLnB1c2goYS5w
+KQphLnA9Zy5sZW5ndGgKYnJlYWsKY2FzZSA5MzpvPWcuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUsbykK
+YS5wPWcucG9wKCkKZy5wdXNoKG8pCmcucHVzaCgtMSkKYnJlYWsKY2FzZSAxMjM6Zy5wdXNoKGEucCkK
+YS5wPWcubGVuZ3RoCmJyZWFrCmNhc2UgMTI1Om89Zy5zcGxpY2UoYS5wKQpILnkoYS51LGEuZSxvKQph
+LnA9Zy5wb3AoKQpnLnB1c2gobykKZy5wdXNoKC0yKQpicmVhawpkZWZhdWx0OnRocm93IkJhZCBjaGFy
+YWN0ZXIgIitxfX19aT1nLnBvcCgpCnJldHVybiBILksoYS51LGEuZSxpKX0sCkEoYSxiLGMsZCl7dmFy
+IHMscixxPWItNDgKZm9yKHM9Yy5sZW5ndGg7YTxzOysrYSl7cj1jLmNoYXJDb2RlQXQoYSkKaWYoIShy
+Pj00OCYmcjw9NTcpKWJyZWFrCnE9cSoxMCsoci00OCl9ZC5wdXNoKHEpCnJldHVybiBhfSwKdChhLGIs
+YyxkLGUpe3ZhciBzLHIscSxwLG8sbixtPWIrMQpmb3Iocz1jLmxlbmd0aDttPHM7KyttKXtyPWMuY2hh
+ckNvZGVBdChtKQppZihyPT09NDYpe2lmKGUpYnJlYWsKZT0hMH1lbHNle2lmKCEoKCgocnwzMik+Pj4w
+KS05NyY2NTUzNSk8MjZ8fHI9PT05NXx8cj09PTM2KSlxPXI+PTQ4JiZyPD01NwplbHNlIHE9ITAKaWYo
+IXEpYnJlYWt9fXA9Yy5zdWJzdHJpbmcoYixtKQppZihlKXtzPWEudQpvPWEuZQppZihvLnk9PT0xMClv
+PW8uegpuPUguUW8ocyxvLnopW3BdCmlmKG49PW51bGwpSC52KCdObyAiJytwKyciIGluICInK0gubUQo
+bykrJyInKQpkLnB1c2goSC5jRShzLG8sbikpfWVsc2UgZC5wdXNoKHApCnJldHVybiBtfSwKSShhLGIp
 e3ZhciBzPWIucG9wKCkKaWYoMD09PXMpe2IucHVzaChILm0oYS51LDEsIjAmIikpCnJldHVybn1pZigx
 PT09cyl7Yi5wdXNoKEgubShhLnUsNCwiMSYiKSkKcmV0dXJufXRocm93IEguYihQLmhWKCJVbmV4cGVj
-dGVkIGV4dGVuZGVkIG9wZXJhdGlvbiAiK0guRWoocykpKX0sCks6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5
-cGVvZiBjPT0ic3RyaW5nIilyZXR1cm4gSC5KKGEsYyxhLnNFQSkKZWxzZSBpZih0eXBlb2YgYz09Im51
-bWJlciIpcmV0dXJuIEguVFYoYSxiLGMpCmVsc2UgcmV0dXJuIGN9LApyOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgcyxyPWMubGVuZ3RoCmZvcihzPTA7czxyOysrcyljW3NdPUguSyhhLGIsY1tzXSl9LAp5OmZ1bmN0
-aW9uKGEsYixjKXt2YXIgcyxyPWMubGVuZ3RoCmZvcihzPTI7czxyO3MrPTMpY1tzXT1ILksoYSxiLGNb
-c10pfSwKVFY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscT1iLnkKaWYocT09PTEwKXtpZihjPT09MCly
-ZXR1cm4gYi56CnM9Yi5RCnI9cy5sZW5ndGgKaWYoYzw9cilyZXR1cm4gc1tjLTFdCmMtPXIKYj1iLnoK
-cT1iLnl9ZWxzZSBpZihjPT09MClyZXR1cm4gYgppZihxIT09OSl0aHJvdyBILmIoUC5oVigiSW5kZXhl
-ZCBiYXNlIG11c3QgYmUgYW4gaW50ZXJmYWNlIHR5cGUiKSkKcz1iLlEKaWYoYzw9cy5sZW5ndGgpcmV0
-dXJuIHNbYy0xXQp0aHJvdyBILmIoUC5oVigiQmFkIGluZGV4ICIrYysiIGZvciAiK2IudygwKSkpfSwK
-V2U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssagppZihiPT09ZClyZXR1
-cm4hMAppZighSC5BOChkKSlpZighKGQ9PT10Ll8pKXM9ITEKZWxzZSBzPSEwCmVsc2Ugcz0hMAppZihz
-KXJldHVybiEwCnI9Yi55CmlmKHI9PT00KXJldHVybiEwCmlmKEguQTgoYikpcmV0dXJuITEKaWYoYi55
-IT09MSlzPSExCmVsc2Ugcz0hMAppZihzKXJldHVybiEwCnE9cj09PTEzCmlmKHEpaWYoSC5XZShhLGNb
-Yi56XSxjLGQsZSkpcmV0dXJuITAKcD1kLnkKcz1iPT09dC5QfHxiPT09dC5UCmlmKHMpe2lmKHA9PT04
-KXJldHVybiBILldlKGEsYixjLGQueixlKQpyZXR1cm4gZD09PXQuUHx8ZD09PXQuVHx8cD09PTd8fHA9
-PT02fWlmKGQ9PT10Lkspe2lmKHI9PT04KXJldHVybiBILldlKGEsYi56LGMsZCxlKQppZihyPT09Nily
-ZXR1cm4gSC5XZShhLGIueixjLGQsZSkKcmV0dXJuIHIhPT03fWlmKHI9PT02KXJldHVybiBILldlKGEs
-Yi56LGMsZCxlKQppZihwPT09Nil7cz1ILmN6KGEsZCkKcmV0dXJuIEguV2UoYSxiLGMscyxlKX1pZihy
-PT09OCl7aWYoIUguV2UoYSxiLnosYyxkLGUpKXJldHVybiExCnJldHVybiBILldlKGEsSC54WihhLGIp
-LGMsZCxlKX1pZihyPT09Nyl7cz1ILldlKGEsdC5QLGMsZCxlKQpyZXR1cm4gcyYmSC5XZShhLGIueixj
-LGQsZSl9aWYocD09PTgpe2lmKEguV2UoYSxiLGMsZC56LGUpKXJldHVybiEwCnJldHVybiBILldlKGEs
-YixjLEgueFooYSxkKSxlKX1pZihwPT09Nyl7cz1ILldlKGEsYixjLHQuUCxlKQpyZXR1cm4gc3x8SC5X
-ZShhLGIsYyxkLnosZSl9aWYocSlyZXR1cm4hMQpzPXIhPT0xMQppZigoIXN8fHI9PT0xMikmJmQ9PT10
-LlkpcmV0dXJuITAKaWYocD09PTEyKXtpZihiPT09dC51KXJldHVybiEwCmlmKHIhPT0xMilyZXR1cm4h
-MQpvPWIuUQpuPWQuUQptPW8ubGVuZ3RoCmlmKG0hPT1uLmxlbmd0aClyZXR1cm4hMQpjPWM9PW51bGw/
-bzpvLmNvbmNhdChjKQplPWU9PW51bGw/bjpuLmNvbmNhdChlKQpmb3IobD0wO2w8bTsrK2wpe2s9b1ts
-XQpqPW5bbF0KaWYoIUguV2UoYSxrLGMsaixlKXx8IUguV2UoYSxqLGUsayxjKSlyZXR1cm4hMX1yZXR1
-cm4gSC5iTyhhLGIueixjLGQueixlKX1pZihwPT09MTEpe2lmKGI9PT10LnUpcmV0dXJuITAKaWYocyly
-ZXR1cm4hMQpyZXR1cm4gSC5iTyhhLGIsYyxkLGUpfWlmKHI9PT05KXtpZihwIT09OSlyZXR1cm4hMQpy
-ZXR1cm4gSC5wRyhhLGIsYyxkLGUpfXJldHVybiExfSwKYk86ZnVuY3Rpb24oYTMsYTQsYTUsYTYsYTcp
-e3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyCmlmKCFILldl
-KGEzLGE0LnosYTUsYTYueixhNykpcmV0dXJuITEKcz1hNC5RCnI9YTYuUQpxPXMuYQpwPXIuYQpvPXEu
-bGVuZ3RoCm49cC5sZW5ndGgKaWYobz5uKXJldHVybiExCm09bi1vCmw9cy5iCms9ci5iCmo9bC5sZW5n
-dGgKaT1rLmxlbmd0aAppZihvK2o8bitpKXJldHVybiExCmZvcihoPTA7aDxvOysraCl7Zz1xW2hdCmlm
-KCFILldlKGEzLHBbaF0sYTcsZyxhNSkpcmV0dXJuITF9Zm9yKGg9MDtoPG07KytoKXtnPWxbaF0KaWYo
-IUguV2UoYTMscFtvK2hdLGE3LGcsYTUpKXJldHVybiExfWZvcihoPTA7aDxpOysraCl7Zz1sW20raF0K
-aWYoIUguV2UoYTMsa1toXSxhNyxnLGE1KSlyZXR1cm4hMX1mPXMuYwplPXIuYwpkPWYubGVuZ3RoCmM9
-ZS5sZW5ndGgKZm9yKGI9MCxhPTA7YTxjO2ErPTMpe2EwPWVbYV0KZm9yKDshMDspe2lmKGI+PWQpcmV0
-dXJuITEKYTE9ZltiXQpiKz0zCmlmKGEwPGExKXJldHVybiExCmEyPWZbYi0yXQppZihhMTxhMCl7aWYo
-YTIpcmV0dXJuITEKY29udGludWV9Zz1lW2ErMV0KaWYoYTImJiFnKXJldHVybiExCmc9ZltiLTFdCmlm
-KCFILldlKGEzLGVbYSsyXSxhNyxnLGE1KSlyZXR1cm4hMQpicmVha319Zm9yKDtiPGQ7KXtpZihmW2Ir
-MV0pcmV0dXJuITEKYis9M31yZXR1cm4hMH0sCnBHOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixx
-LHAsbyxuLG0sbCxrPWIueixqPWQuegppZihrPT09ail7cz1iLlEKcj1kLlEKcT1zLmxlbmd0aApmb3Io
-cD0wO3A8cTsrK3Ape289c1twXQpuPXJbcF0KaWYoIUguV2UoYSxvLGMsbixlKSlyZXR1cm4hMX1yZXR1
-cm4hMH1pZihkPT09dC5LKXJldHVybiEwCm09SC5RbyhhLGspCmlmKG09PW51bGwpcmV0dXJuITEKbD1t
-W2pdCmlmKGw9PW51bGwpcmV0dXJuITEKcT1sLmxlbmd0aApyPWQuUQpmb3IocD0wO3A8cTsrK3ApaWYo
-IUguV2UoYSxILmNFKGEsYixsW3BdKSxjLHJbcF0sZSkpcmV0dXJuITEKcmV0dXJuITB9LApsUjpmdW5j
-dGlvbihhKXt2YXIgcyxyPWEueQppZighKGE9PT10LlB8fGE9PT10LlQpKWlmKCFILkE4KGEpKWlmKHIh
-PT03KWlmKCEocj09PTYmJkgubFIoYS56KSkpcz1yPT09OCYmSC5sUihhLnopCmVsc2Ugcz0hMAplbHNl
-IHM9ITAKZWxzZSBzPSEwCmVsc2Ugcz0hMApyZXR1cm4gc30sCmNjOmZ1bmN0aW9uKGEpe3ZhciBzCmlm
-KCFILkE4KGEpKWlmKCEoYT09PXQuXykpcz0hMQplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBzfSwK
-QTg6ZnVuY3Rpb24oYSl7dmFyIHM9YS55CnJldHVybiBzPT09Mnx8cz09PTN8fHM9PT00fHxzPT09NXx8
-YT09PXQuWH0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPU9iamVjdC5rZXlzKGIpLHA9cS5sZW5n
-dGgKZm9yKHM9MDtzPHA7KytzKXtyPXFbc10KYVtyXT1iW3JdfX0sCkpjOmZ1bmN0aW9uIEpjKGEsYil7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLng9Xy5yPV8uYz1udWxsCl8ueT0wCl8uY3k9Xy5jeD1fLmNo
-PV8uUT1fLno9bnVsbH0sCkc6ZnVuY3Rpb24gRygpe3RoaXMuYz10aGlzLmI9dGhpcy5hPW51bGx9LApr
-UzpmdW5jdGlvbiBrUygpe30sCmlNOmZ1bmN0aW9uIGlNKGEpe3RoaXMuYT1hfSwKUjk6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHQudy5iKGEpfHx0LkIuYihhKXx8dC5kei5iKGEpfHx0LkkuYihhKXx8dC5BLmIoYSl8
-fHQuZzQuYihhKXx8dC5nMi5iKGEpfSwKRlA6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudihILmooYSkpfX0s
-Sj17ClF1OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybntpOmEscDpiLGU6Yyx4OmR9fSwKa3M6ZnVuY3Rp
-b24oYSl7dmFyIHMscixxLHAsbyxuPWFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV0KaWYobj09bnVsbClp
-ZigkLkJ2PT1udWxsKXtILlhEKCkKbj1hW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdfWlmKG4hPW51bGwp
-e3M9bi5wCmlmKCExPT09cylyZXR1cm4gbi5pCmlmKCEwPT09cylyZXR1cm4gYQpyPU9iamVjdC5nZXRQ
-cm90b3R5cGVPZihhKQppZihzPT09cilyZXR1cm4gbi5pCmlmKG4uZT09PXIpdGhyb3cgSC5iKFAuU1ko
-IlJldHVybiBpbnRlcmNlcHRvciBmb3IgIitILkVqKHMoYSxuKSkpKX1xPWEuY29uc3RydWN0b3IKaWYo
-cT09bnVsbClwPW51bGwKZWxzZXtvPSQuem0KaWYobz09bnVsbClvPSQuem09di5nZXRJc29sYXRlVGFn
-KCJfJGRhcnRfanMiKQpwPXFbb119aWYocCE9bnVsbClyZXR1cm4gcApwPUgudzMoYSkKaWYocCE9bnVs
-bClyZXR1cm4gcAppZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gQy5ERwpzPU9iamVjdC5nZXRQ
-cm90b3R5cGVPZihhKQppZihzPT1udWxsKXJldHVybiBDLlpRCmlmKHM9PT1PYmplY3QucHJvdG90eXBl
-KXJldHVybiBDLlpRCmlmKHR5cGVvZiBxPT0iZnVuY3Rpb24iKXtvPSQuem0KaWYobz09bnVsbClvPSQu
-em09di5nZXRJc29sYXRlVGFnKCJfJGRhcnRfanMiKQpPYmplY3QuZGVmaW5lUHJvcGVydHkocSxvLHt2
-YWx1ZTpDLnZCLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0p
-CnJldHVybiBDLnZCfXJldHVybiBDLnZCfSwKUWk6ZnVuY3Rpb24oYSxiKXtpZihhPDB8fGE+NDI5NDk2
-NzI5NSl0aHJvdyBILmIoUC5URShhLDAsNDI5NDk2NzI5NSwibGVuZ3RoIixudWxsKSkKcmV0dXJuIEou
-cHkobmV3IEFycmF5KGEpLGIpfSwKS2g6ZnVuY3Rpb24oYSxiKXtpZihhPDApdGhyb3cgSC5iKFAueFko
-Ikxlbmd0aCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXI6ICIrYSkpCnJldHVybiBILlFJKG5l
-dyBBcnJheShhKSxiLkMoImpkPDA+IikpfSwKcHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5FcChILlFJ
-KGEsYi5DKCJqZDwwPiIpKSxiKX0sCkVwOmZ1bmN0aW9uKGEsYil7YS5maXhlZCRsZW5ndGg9QXJyYXkK
-cmV0dXJuIGF9LAp6QzpmdW5jdGlvbihhKXthLmZpeGVkJGxlbmd0aD1BcnJheQphLmltbXV0YWJsZSRs
-aXN0PUFycmF5CnJldHVybiBhfSwKR2E6ZnVuY3Rpb24oYSl7aWYoYTwyNTYpc3dpdGNoKGEpe2Nhc2Ug
-OTpjYXNlIDEwOmNhc2UgMTE6Y2FzZSAxMjpjYXNlIDEzOmNhc2UgMzI6Y2FzZSAxMzM6Y2FzZSAxNjA6
-cmV0dXJuITAKZGVmYXVsdDpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSA1NzYwOmNhc2UgODE5MjpjYXNl
-IDgxOTM6Y2FzZSA4MTk0OmNhc2UgODE5NTpjYXNlIDgxOTY6Y2FzZSA4MTk3OmNhc2UgODE5ODpjYXNl
-IDgxOTk6Y2FzZSA4MjAwOmNhc2UgODIwMTpjYXNlIDgyMDI6Y2FzZSA4MjMyOmNhc2UgODIzMzpjYXNl
-IDgyMzk6Y2FzZSA4Mjg3OmNhc2UgMTIyODg6Y2FzZSA2NTI3OTpyZXR1cm4hMApkZWZhdWx0OnJldHVy
-biExfX0sCm1tOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpmb3Iocz1hLmxlbmd0aDtiPHM7KXtyPUMueEIu
-VyhhLGIpCmlmKHIhPT0zMiYmciE9PTEzJiYhSi5HYShyKSlicmVhazsrK2J9cmV0dXJuIGJ9LApjMTpm
-dW5jdGlvbihhLGIpe3ZhciBzLHIKZm9yKDtiPjA7Yj1zKXtzPWItMQpyPUMueEIuTyhhLHMpCmlmKHIh
-PT0zMiYmciE9PTEzJiYhSi5HYShyKSlicmVha31yZXR1cm4gYn0sClU2OmZ1bmN0aW9uKGEpe2lmKHR5
-cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQpp
-ZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJv
-YmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJu
-IGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApZRTpmdW5jdGlv
-bihhKXtpZihhPT1udWxsKXJldHVybiBhCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9
-PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQ
-Lk1oKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKaWE6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJu
-dW1iZXIiKXtpZihNYXRoLmZsb29yKGEpPT1hKXJldHVybiBKLmJVLnByb3RvdHlwZQpyZXR1cm4gSi5r
-RC5wcm90b3R5cGV9aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihh
-PT1udWxsKXJldHVybiBKLndlLnByb3RvdHlwZQppZih0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVybiBK
-LnlFLnByb3RvdHlwZQppZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUK
-aWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5w
-cm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3Mo
-YSl9LApyWTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90
-eXBlCmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoIShhIGluc3RhbmNlb2YgUC5NaCkpcmV0dXJuIEoua2Qu
-cHJvdG90eXBlCnJldHVybiBhfSwKdzE6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gYQppZihh
-LmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJvYmpl
-Y3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9
-aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApBNTpmdW5jdGlvbihh
-LGIpe3JldHVybiBKLncxKGEpLmVSKGEsYil9LApFaDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouWUUo
-YSkubUsoYSxiLGMpfSwKRWw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5kcihhLGIpfSwKRjc6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ29yKGEpfSwKRkw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-Si5yWShhKS5kZChhLGIpfSwKR0E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5FKGEsYil9LApI
-bTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nQShhKX0sCklUOmZ1bmN0aW9uKGEpe3JldHVybiBK
-LncxKGEpLmdtKGEpfSwKSnk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5pYShhKS5lNyhhLGIpfSwKTHQ6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkud2coYSl9LApNMTpmdW5jdGlvbihhLGIsYyl7cmV0dXJu
-IEoudzEoYSkuRTIoYSxiLGMpfSwKTXU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zUChhLGIp
-fSwKUk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxsCmlmKHR5cGVvZiBhIT0i
-b2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEouaWEoYSkuRE4oYSxiKX0sClJYOmZ1
-bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmJyKGEpfSwKVDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEouclko
-YSkuYlMoYSl9LAphNjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLk8oYSxiKX0sCmJUOmZ1bmN0
-aW9uKGEpe3JldHVybiBKLllFKGEpLkQ0KGEpfSwKY0g6ZnVuY3Rpb24oYSl7cmV0dXJuIEouclkoYSku
-aGMoYSl9LApkUjpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZRShhKS5nUChhKX0sCmRaOmZ1bmN0aW9uKGEs
-YixjLGQpe3JldHVybiBKLllFKGEpLk9uKGEsYixjLGQpfSwKZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
-WUUoYSkuRkYoYSl9LApkcjpmdW5jdGlvbihhLGIpe3JldHVybiBKLllFKGEpLnNhNChhLGIpfSwKaGY6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkuZ2lPKGEpfSwKaWc6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
-WUUoYSkuZ1FnKGEpfSwKbDU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zaGYoYSxiKX0sCnFG
-OmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdWbChhKX0sCnRIOmZ1bmN0aW9uKGEsYixjKXtyZXR1
-cm4gSi5ZRShhKS5wayhhLGIsYyl9LAp1OTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEoudzEoYSkuWTUo
-YSxiLGMpfSwKdVU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ2wwKGEpfSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4gSi5pYShhKS53KGEpfSwKd2Y6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zUk4o
-YSxiKX0sCng5OmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PT0ibnVtYmVyIilpZihhLmNvbnN0cnVj
-dG9yPT1BcnJheXx8dHlwZW9mIGE9PSJzdHJpbmcifHxILndWKGEsYVt2LmRpc3BhdGNoUHJvcGVydHlO
-YW1lXSkpaWYoYj4+PjA9PT1iJiZiPGEubGVuZ3RoKXJldHVybiBhW2JdCnJldHVybiBKLlU2KGEpLnEo
-YSxiKX0sCnpsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxiKX0sCkd2OmZ1bmN0aW9u
-IEd2KCl7fSwKeUU6ZnVuY3Rpb24geUUoKXt9LAp3ZTpmdW5jdGlvbiB3ZSgpe30sCk1GOmZ1bmN0aW9u
-IE1GKCl7fSwKaUM6ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgpe30sCmM1OmZ1bmN0aW9u
-IGM1KCl7fSwKamQ6ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1bmN0aW9uIFBvKGEpe3Ro
-aXMuJHRpPWF9LAptMTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
-MApfLmQ9bnVsbApfLiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LApiVTpmdW5jdGlvbiBiVSgpe30s
-CmtEOmZ1bmN0aW9uIGtEKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxMPXsKSXE6ZnVuY3Rpb24oKXtD
-LkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkKQy5vbC5CKHdpbmRvdywi
-cG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgcyxyPXQuaC5hKGEucGFyZW50
-Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxxPXIuc3R5bGUscD0iIitDLkNELnpRKHIu
-b2Zmc2V0SGVpZ2h0KSoyKyJweCIKcS5tYXhIZWlnaHQ9cApxPUoucUYoYSkKcD1xLiR0aQpzPXAuQygi
-figxKT8iKS5hKG5ldyBMLld4KHIsYSkpCnQuWi5hKG51bGwpClcuSkUocS5hLHEuYixzLCExLHAuYyl9
-LAp5WDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPSJxdWVyeVNlbGVjdG9yQWxsIixsPWRv
-Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSkKbC50b1N0cmluZwpzPXQuaApILkRoKHMscywiVCIsbSkKcj10
-LlUKcT1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtbGluayIpLHIpCnEuSyhxLG5ldyBM
-LkFPKGIpKQpILkRoKHMscywiVCIsbSkKcD1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdp
-b24iKSxyKQppZighcC5nbDAocCkpe289bC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikK
-by50b1N0cmluZwpwLksocCxuZXcgTC5IbyhvLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5l
-dyBXLmk3KG8pKS5PVSgicGF0aCIpKSkpfUguRGgocyxzLCJUIixtKQpuPW5ldyBXLnd6KGwucXVlcnlT
-ZWxlY3RvckFsbCgiLmFkZC1oaW50LWxpbmsiKSxyKQpuLksobixuZXcgTC5JQygpKX0sClE2OmZ1bmN0
-aW9uKGEsYixjKXt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3QoKQpDLkR0LmVvKHMsIkdFVCIsTC5RNChh
-LGIpLCEwKQpzLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL2pzb247
-IGNoYXJzZXQ9VVRGLTgiKQpyZXR1cm4gTC5MVShzLG51bGwsYyl9LAp0eTpmdW5jdGlvbihhLGIpe3Zh
-ciBzPW5ldyBYTUxIdHRwUmVxdWVzdCgpLHI9dC5OCkMuRHQuZW8ocywiUE9TVCIsTC5RNChhLFAuRmwo
-cixyKSksITApCnMuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24vanNv
-bjsgY2hhcnNldD1VVEYtOCIpCnJldHVybiBMLkxVKHMsYix0LkcpfSwKTFU6ZnVuY3Rpb24oYSxiLGMp
-e3JldHVybiBMLlRnKGEsYixjLGMuQygiMD8iKSl9LApUZzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz0w
-LHI9UC5GWChkKSxxLHA9MixvLG49W10sbSxsLGssaixpLGgsZyxmLGUKdmFyICRhc3luYyRMVT1QLmx6
-KGZ1bmN0aW9uKGEwLGExKXtpZihhMD09PTEpe289YTEKcz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nh
-c2UgMDpoPW5ldyBQLlpmKG5ldyBQLnZzKCQuWDMsdC5hbyksdC5iaikKZz10Lmd4CmY9Zy5hKG5ldyBM
-LmZDKGgsYSkpCnQuWi5hKG51bGwpCms9dC5wClcuSkUoYSwibG9hZCIsZiwhMSxrKQpXLkpFKGEsImVy
-cm9yIixnLmEoaC5nWUooKSksITEsaykKYS5zZW5kKGI9PW51bGw/bnVsbDpDLkN0Lk9CKGIsbnVsbCkp
-CnA9NApzPTcKcmV0dXJuIFAualEoaC5hLCRhc3luYyRMVSkKY2FzZSA3OnA9MgpzPTYKYnJlYWsKY2Fz
-ZSA0OnA9MwplPW8KSC5SdShlKQptPUgudHMoZSkKZz1hLnJlYWR5U3RhdGUKaWYoZz09PTQmJmEuc3Rh
-dHVzPT09MCl0aHJvdyBILmIoTC5URygiRXJyb3IgcmVhY2hpbmcgbWlncmF0aW9uIHByZXZpZXcgc2Vy
-dmVyIiwiVGhpcyB1c3VhbGx5IGhhcHBlbnMgYmVjYXVzZSB0aGUgbWlncmF0aW9uIHByZXZpZXcgc2Vy
-dmVyIGhhcyBleGl0ZWQuICBGb3JcbmV4YW1wbGUgaXQgbWF5IGhhdmUgYmVlbiBhYm9ydGVkIHdpdGgg
-Q3RybC1DLCBvciB5b3UgbWF5IGhhdmUgY29tcGxldGVkIHRoaXNcbm1pZ3JhdGlvbiwgb3IgYW4gZXhj
-ZXB0aW9uIG1heSBoYXZlIG9jY3VycmVkLiAgUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIHdoZXJlXG55
-b3UgaW52b2tlZCBgZGFydCBtaWdyYXRlYCB0byB2ZXJpZnkgdGhhdCB0aGUgcHJldmlldyBzZXJ2ZXIg
-aXMgc3RpbGwgcnVubmluZy5cbiIpKQplbHNle2w9bmV3IEgubEooSC5RSShbInJlYWR5U3RhdGU9Iitn
-LCJyZXNwb25zZVRleHQ9IitDLkN0Lk9CKGEucmVzcG9uc2VUZXh0LG51bGwpLCJyZXNwb25zZVR5cGU9
-IitDLkN0Lk9CKGEucmVzcG9uc2VUeXBlLG51bGwpLCJyZXNwb25zZVVybD0iK0MuQ3QuT0IoYS5yZXNw
-b25zZVVSTCxudWxsKSwic3RhdHVzPSIrSC5FaihhLnN0YXR1cyksInN0YXR1c1RleHQ9IitDLkN0Lk9C
-KGEuc3RhdHVzVGV4dCxudWxsKV0sdC5zKSx0LmRHLmEobmV3IEwuVG0oKSksdC5EKS5rKDAsIiwgIikK
-dGhyb3cgSC5iKFAuVGwoIkVycm9yIHJlYWNoaW5nIG1pZ3JhdGlvbiBwcmV2aWV3IHNlcnZlcjogIitI
-LkVqKGwpLG0pKX1zPTYKYnJlYWsKY2FzZSAzOnM9MgpicmVhawpjYXNlIDY6aWYoYS5zdGF0dXM9PT00
-MDEpdGhyb3cgSC5iKEwuVEcoIlVuYXV0aG9yaXplZCByZXNwb25zZSBmcm9tIG1pZ3JhdGlvbiBwcmV2
-aWV3IHNlcnZlciIsIlRoZSBtaWdyYXRpb24gcHJldmlldyBzZXJ2ZXIgaGFzIGRldGVjdGVkIGEgbWlz
-bWF0Y2ggYmV0d2VlbiB0aGUgYXV0aFRva2VuIGluXG55b3VyIFVSTCBhbmQgdGhlIHRva2VuIHRoYXQg
-d2FzIGdlbmVyYXRlZCBhdCB0aGUgdGltZSB0aGF0IGBkYXJ0IG1pZ3JhdGVgIHdhc1xucnVuLiAgSGF2
-ZSB5b3UgcmVzdGFydGVkIHRoZSBtaWdyYXRpb24gc2VydmVyIHJlY2VudGx5PyAgSWYgc28sIHlvdSds
-bCBuZWVkIHRvXG5jaGVjayBpdHMgb3V0cHV0IGZvciBhIGZyZXNoIFVSTCwgYW5kIHVzZSB0aGF0IFVS
-TCB0byBwZXJmb3JtIHlvdXIgbWlncmF0aW9uLlxuIikpCmc9YS5yZXNwb25zZVRleHQKZy50b1N0cmlu
-ZwppPUMuQ3QucFcoMCxnLG51bGwpCmlmKGEuc3RhdHVzPT09MjAwKXtxPWMuQygiMD8iKS5hKGkpCnM9
-MQpicmVha31lbHNle2kudG9TdHJpbmcKdGhyb3cgSC5iKGkpfWNhc2UgMTpyZXR1cm4gUC55QyhxLHIp
-CmNhc2UgMjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRMVSxyKX0sCmFLOmZ1
-bmN0aW9uKGEpe3ZhciBzPVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0dXJuIHM9PW51bGw/bnVs
-bDpILkhwKHMsbnVsbCl9LApHNjpmdW5jdGlvbihhKXt2YXIgcz1QLmhLKGEpLmdoWSgpLnEoMCwib2Zm
-c2V0IikKcmV0dXJuIHM9PW51bGw/bnVsbDpILkhwKHMsbnVsbCl9LAppNjpmdW5jdGlvbihhKXtyZXR1
-cm4gTC5uVyh0LlYuYShhKSl9LApuVzpmdW5jdGlvbihhKXt2YXIgcz0wLHI9UC5GWCh0LnopLHE9MSxw
-LG89W10sbixtLGwsayxqLGksaCxnCnZhciAkYXN5bmMkaTY9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9
-PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpoPXQuaC5hKFcucWMoYS5jdXJy
-ZW50VGFyZ2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKaC50b1N0cmluZwpuPWgKYS5wcmV2ZW50RGVm
-YXVsdCgpCnE9MwpoPWRvY3VtZW50Cm09Qy5DRC56UShoLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50Iiku
-c2Nyb2xsVG9wKQpzPTYKcmV0dXJuIFAualEoTC50eShuLG51bGwpLCRhc3luYyRpNikKY2FzZSA2Omo9
-dC5GLmEod2luZG93LmxvY2F0aW9uKS5wYXRobmFtZQpqLnRvU3RyaW5nCnM9NwpyZXR1cm4gUC5qUShM
-Lkc3KGosbnVsbCxudWxsLCExLG51bGwpLCRhc3luYyRpNikKY2FzZSA3OmguYm9keS5jbGFzc0xpc3Qu
-YWRkKCJuZWVkcy1yZXJ1biIpCmg9aC5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpCmgudG9TdHJpbmcK
-aC5zY3JvbGxUb3A9Qy5qbi56UShtKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShn
-KQprPUgudHMoZykKTC5DMigiY291bGRuJ3QgYWRkL3JlbW92ZSBoaW50IixsLGspCnM9NQpicmVhawpj
-YXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5m
-MyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRpNixyKX0sCkMyOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cyxyLHEscCxvLG4sbT0iZXhjZXB0aW9uIixsPSJzdGFja1RyYWNlIgppZih0Lmg2LmIoYikmJkouUk0o
-Yi5xKDAsInN1Y2Nlc3MiKSwhMSkmJmIueDQobSkmJmIueDQobCkpe3M9Si5VNihiKQpyPUguayhzLnEo
-YixtKSkKYz1zLnEoYixsKQpxPW51bGx9ZWxzZSBpZihiIGluc3RhbmNlb2YgTC5RVyl7cj1iLmEKcT1i
-LmJ9ZWxzZXtyPUoudyhiKQpxPW51bGx9aWYocT09bnVsbClxPWMKcz1kb2N1bWVudApwPXMucXVlcnlT
-ZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpwLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PWEKbz1w
-LnF1ZXJ5U2VsZWN0b3IoInAiKQpvLnRvU3RyaW5nCnIudG9TdHJpbmcKby5pbm5lclRleHQ9cgpvPXAu
-cXVlcnlTZWxlY3RvcigicHJlIikKby50b1N0cmluZwpvLmlubmVyVGV4dD1KLncocSkKbj10LmJxLmEo
-cC5xdWVyeVNlbGVjdG9yKCJhLmJvdHRvbSIpKQpDLnhuLnNMVShuLFAuWGQoImh0dHBzIiwiZ2l0aHVi
-LmNvbSIsImRhcnQtbGFuZy9zZGsvaXNzdWVzL25ldyIsUC5FRihbInRpdGxlIiwiQ3VzdG9tZXItcmVw
-b3J0ZWQgaXNzdWUgd2l0aCBOTkJEIG1pZ3JhdGlvbiB0b29sOiAiK2EsImxhYmVscyIsdS5kLCJib2R5
-IixhKyJcblxuRXJyb3I6ICIrcisiXG5cblBsZWFzZSBmaWxsIGluIHRoZSBmb2xsb3dpbmc6XG5cbioq
-TmFtZSBvZiBwYWNrYWdlIGJlaW5nIG1pZ3JhdGVkIChpZiBwdWJsaWMpKio6XG4qKldoYXQgSSB3YXMg
-ZG9pbmcgd2hlbiB0aGlzIGlzc3VlIG9jY3VycmVkKio6XG4qKklzIGl0IHBvc3NpYmxlIHRvIHdvcmsg
-YXJvdW5kIHRoaXMgaXNzdWUqKjpcbioqSGFzIHRoaXMgaXNzdWUgaGFwcGVuZWQgYmVmb3JlLCBhbmQg
-aWYgc28sIGhvdyBvZnRlbioqOlxuKipEYXJ0IFNESyB2ZXJzaW9uKio6ICIrSC5FaihzLmdldEVsZW1l
-bnRCeUlkKCJzZGstdmVyc2lvbiIpLnRleHRDb250ZW50KSsiXG4qKkFkZGl0aW9uYWwgZGV0YWlscyoq
-OlxuXG5UaGFua3MgZm9yIGZpbGluZyFcblxuU3RhY2t0cmFjZTogX2F1dG8gcG9wdWxhdGVkIGJ5IG1p
-Z3JhdGlvbiBwcmV2aWV3IHRvb2wuX1xuXG5gYGBcbiIrSC5FaihjKSsiXG5gYGBcbiJdLHQuTix0Lnop
-KS5nbkQoKSkKcz1uLnN0eWxlCnMuZGlzcGxheT0iaW5pdGlhbCIKcz1wLnN0eWxlCnMuZGlzcGxheT0i
-aW5pdGlhbCIKcz1hKyI6ICIrSC5FaihiKQp3aW5kb3cKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmlu
-ZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKHMpCndpbmRvdwpzPUguRWooYykKaWYodHlwZW9mIGNvbnNv
-bGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKHMpfSwKdDI6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvPXQuaC5hKFcucWMoYS5jdXJyZW50VGFyZ2V0KSkKYS5wcmV2ZW50RGVmYXVsdCgp
-CnM9by5nZXRBdHRyaWJ1dGUoImhyZWYiKQpzLnRvU3RyaW5nCnI9TC5VcyhzKQpxPUwuRzYocykKcD1M
-LmFLKHMpCmlmKHEhPW51bGwpTC5hZihyLHEscCxiLG5ldyBMLm5UKHIscSxwKSkKZWxzZSBMLmFmKHIs
-bnVsbCxudWxsLGIsbmV3IEwuTlkocikpfSwKSzA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9ZG9jdW1l
-bnQucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpwLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJU
-ZXh0PSJGYWlsZWQgdG8gcmVydW4gZnJvbSBzb3VyY2VzIgpwLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5l
-clRleHQ9IlNvdXJjZXMgY29udGFpbiBzdGF0aWMgYW5hbHlzaXMgZXJyb3JzOiIKcz1wLnF1ZXJ5U2Vs
-ZWN0b3IoInByZSIpCnMudG9TdHJpbmcKcj1KLkVsKGEsdC5mKQpxPUguTGgocikKcy5pbm5lclRleHQ9
-bmV3IEgubEoocixxLkMoInFVKGxELkUpIikuYShuZXcgTC51ZSgpKSxxLkMoImxKPGxELkUscVU+Iikp
-LmsoMCwiXG4iKQpxPXAucXVlcnlTZWxlY3RvcigiYS5ib3R0b20iKS5zdHlsZQpxLmRpc3BsYXk9Im5v
-bmUiCnM9cC5zdHlsZQpzLmRpc3BsYXk9ImluaXRpYWwifSwKdlU6ZnVuY3Rpb24oKXt2YXIgcz1kb2N1
-bWVudCxyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMucXVl
-cnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlUpCnMuSyhzLG5ldyBMLkdIKCkpfSwKaFg6ZnVuY3Rpb24o
-YSxiLGMpe3JldHVybiBMLll3KGEsYixjKX0sCll3OmZ1bmN0aW9uKGEsYixjKXt2YXIgcz0wLHI9UC5G
-WCh0LnopLHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnCnZhciAkYXN5bmMkaFg9UC5seihmdW5jdGlv
-bihkLGUpe2lmKGQ9PT0xKXtwPWUKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaj10
-Lk4Kcz02CnJldHVybiBQLmpRKEwuUTYoYSxQLkVGKFsicmVnaW9uIiwicmVnaW9uIiwib2Zmc2V0IixI
-LkVqKGIpXSxqLGopLHQuRyksJGFzeW5jJGhYKQpjYXNlIDY6bj1lCmo9bgppPUouVTYoaikKbT1uZXcg
-VS5kMihVLmpmKGkucShqLCJlZGl0cyIpKSxILmsoaS5xKGosImV4cGxhbmF0aW9uIikpLEguVWMoaS5x
-KGosImxpbmUiKSksSC5rKGkucShqLCJkaXNwbGF5UGF0aCIpKSxILmsoaS5xKGosInVyaVBhdGgiKSks
-VS5OZChpLnEoaiwidHJhY2VzIikpKQpMLlQxKG0pCkwuRnIoYSxiLGMpCkwueVgoIi5lZGl0LXBhbmVs
-IC5wYW5lbC1jb250ZW50IiwhMSkKcT0xCnM9NQpicmVhawpjYXNlIDM6cT0yCmc9cApsPUguUnUoZykK
-az1ILnRzKGcpCkwuQzIoImNvdWxkbid0IGxvYWQgZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpj
-YXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5m
-MyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRoWCxyKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQsZSl7
-cmV0dXJuIEwuTDUoYSxiLGMsZCxlKX0sCkw1OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9MCxyPVAu
-RlgodC5IKSxxLHA9MixvLG49W10sbSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rp
-b24oZixhMCl7aWYoZj09PTEpe289YTAKcz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZigh
-Qy54Qi5UYyhhLCIuZGFydCIpKXtMLkJFKGEsQi53UigpLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxs
-KWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9dC5OCnM9NwpyZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlu
-bGluZSIsInRydWUiXSxpLGkpLHQuRyksJGFzeW5jJEc3KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZiht
-KSxkKQpMLmZHKGIsYykKbD1MLlVzKGEpCkwuQlgobCxiKQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02
-CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9SC5SdShnKQpqPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9h
-ZCBkYXJ0IGZpbGUgIithLGssaikKcz02CmJyZWFrCmNhc2UgMzpzPTIKYnJlYWsKY2FzZSA2OmNhc2Ug
-MTpyZXR1cm4gUC55QyhxLHIpCmNhc2UgMjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQLkRJKCRh
-c3luYyRHNyxyKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIHM9MCxyPVAuRlgodC56KSxxPTEscCxvPVtdLG4s
-bSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEdlPVAubHooZnVuY3Rpb24oYSxiKXtpZihhPT09MSl7cD1i
-CnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aD0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVl
-Lmpzb24iCnE9MwpzPTYKcmV0dXJuIFAualEoTC5RNihoLEMuQ00sdC5lZSksJGFzeW5jJEdlKQpjYXNl
-IDY6bj1iCmo9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10cmVlIikKai50b1N0cmluZwptPWoK
-Si5sNShtLCIiKQpqPUwubUsobikKJC5JUj1qCkwudFgobSxqLCEwKQpxPTEKcz01CmJyZWFrCmNhc2Ug
-MzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9hZCBuYXZpZ2F0aW9u
-IHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51
-bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwK
-cU86ZnVuY3Rpb24oYSl7dmFyIHMscixxPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscD1DLkNELnpR
-KCQuZmkoKS5vZmZzZXRIZWlnaHQpLG89d2luZG93LmlubmVySGVpZ2h0Cm8udG9TdHJpbmcKcz1DLkNE
-LnpRKCQuRFcoKS5vZmZzZXRIZWlnaHQpCnI9cS5ib3R0b20Kci50b1N0cmluZwppZihyPm8tKHMrMTQp
-KUouZGgoYSkKZWxzZXtvPXEudG9wCm8udG9TdHJpbmcKaWYobzxwKzE0KUouZGgoYSl9fSwKZkc6ZnVu
-Y3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1zLmdldEVsZW1l
-bnRCeUlkKCJvIitILkVqKGEpKQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVqKGIpKQppZihy
-IT1udWxsKXtMLnFPKHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51bGwpe3M9cS5w
-YXJlbnRFbGVtZW50CnMudG9TdHJpbmcKTC5xTyhzKX1pZihxIT1udWxsKUouZFIodC5oLmEocS5wYXJl
-bnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmgKSC5EaChwLHAsIlQi
-LCJxdWVyeVNlbGVjdG9yQWxsIikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5vIikKbz1uZXcg
-Vy53eihzLHQuVSkKaWYoby5nQShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RIKHMpKSl9fSwK
-YWY6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscD10LkYsbz1MLkc2KHAuYSh3aW5kb3cubG9j
+dGVkIGV4dGVuZGVkIG9wZXJhdGlvbiAiK0guRWoocykpKX0sCksoYSxiLGMpe2lmKHR5cGVvZiBjPT0i
+c3RyaW5nIilyZXR1cm4gSC5KKGEsYyxhLnNFQSkKZWxzZSBpZih0eXBlb2YgYz09Im51bWJlciIpcmV0
+dXJuIEguVFYoYSxiLGMpCmVsc2UgcmV0dXJuIGN9LApyKGEsYixjKXt2YXIgcyxyPWMubGVuZ3RoCmZv
+cihzPTA7czxyOysrcyljW3NdPUguSyhhLGIsY1tzXSl9LAp5KGEsYixjKXt2YXIgcyxyPWMubGVuZ3Ro
+CmZvcihzPTI7czxyO3MrPTMpY1tzXT1ILksoYSxiLGNbc10pfSwKVFYoYSxiLGMpe3ZhciBzLHIscT1i
+LnkKaWYocT09PTEwKXtpZihjPT09MClyZXR1cm4gYi56CnM9Yi5RCnI9cy5sZW5ndGgKaWYoYzw9cily
+ZXR1cm4gc1tjLTFdCmMtPXIKYj1iLnoKcT1iLnl9ZWxzZSBpZihjPT09MClyZXR1cm4gYgppZihxIT09
+OSl0aHJvdyBILmIoUC5oVigiSW5kZXhlZCBiYXNlIG11c3QgYmUgYW4gaW50ZXJmYWNlIHR5cGUiKSkK
+cz1iLlEKaWYoYzw9cy5sZW5ndGgpcmV0dXJuIHNbYy0xXQp0aHJvdyBILmIoUC5oVigiQmFkIGluZGV4
+ICIrYysiIGZvciAiK2IudygwKSkpfSwKV2UoYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
+agppZihiPT09ZClyZXR1cm4hMAppZighSC5BOChkKSlpZighKGQ9PT10Ll8pKXM9ITEKZWxzZSBzPSEw
+CmVsc2Ugcz0hMAppZihzKXJldHVybiEwCnI9Yi55CmlmKHI9PT00KXJldHVybiEwCmlmKEguQTgoYikp
+cmV0dXJuITEKaWYoYi55IT09MSlzPSExCmVsc2Ugcz0hMAppZihzKXJldHVybiEwCnE9cj09PTEzCmlm
+KHEpaWYoSC5XZShhLGNbYi56XSxjLGQsZSkpcmV0dXJuITAKcD1kLnkKcz1iPT09dC5QfHxiPT09dC5U
+CmlmKHMpe2lmKHA9PT04KXJldHVybiBILldlKGEsYixjLGQueixlKQpyZXR1cm4gZD09PXQuUHx8ZD09
+PXQuVHx8cD09PTd8fHA9PT02fWlmKGQ9PT10Lkspe2lmKHI9PT04KXJldHVybiBILldlKGEsYi56LGMs
+ZCxlKQppZihyPT09NilyZXR1cm4gSC5XZShhLGIueixjLGQsZSkKcmV0dXJuIHIhPT03fWlmKHI9PT02
+KXJldHVybiBILldlKGEsYi56LGMsZCxlKQppZihwPT09Nil7cz1ILmN6KGEsZCkKcmV0dXJuIEguV2Uo
+YSxiLGMscyxlKX1pZihyPT09OCl7aWYoIUguV2UoYSxiLnosYyxkLGUpKXJldHVybiExCnJldHVybiBI
+LldlKGEsSC54WihhLGIpLGMsZCxlKX1pZihyPT09Nyl7cz1ILldlKGEsdC5QLGMsZCxlKQpyZXR1cm4g
+cyYmSC5XZShhLGIueixjLGQsZSl9aWYocD09PTgpe2lmKEguV2UoYSxiLGMsZC56LGUpKXJldHVybiEw
+CnJldHVybiBILldlKGEsYixjLEgueFooYSxkKSxlKX1pZihwPT09Nyl7cz1ILldlKGEsYixjLHQuUCxl
+KQpyZXR1cm4gc3x8SC5XZShhLGIsYyxkLnosZSl9aWYocSlyZXR1cm4hMQpzPXIhPT0xMQppZigoIXN8
+fHI9PT0xMikmJmQ9PT10LlkpcmV0dXJuITAKaWYocD09PTEyKXtpZihiPT09dC51KXJldHVybiEwCmlm
+KHIhPT0xMilyZXR1cm4hMQpvPWIuUQpuPWQuUQptPW8ubGVuZ3RoCmlmKG0hPT1uLmxlbmd0aClyZXR1
+cm4hMQpjPWM9PW51bGw/bzpvLmNvbmNhdChjKQplPWU9PW51bGw/bjpuLmNvbmNhdChlKQpmb3IobD0w
+O2w8bTsrK2wpe2s9b1tsXQpqPW5bbF0KaWYoIUguV2UoYSxrLGMsaixlKXx8IUguV2UoYSxqLGUsayxj
+KSlyZXR1cm4hMX1yZXR1cm4gSC5iTyhhLGIueixjLGQueixlKX1pZihwPT09MTEpe2lmKGI9PT10LnUp
+cmV0dXJuITAKaWYocylyZXR1cm4hMQpyZXR1cm4gSC5iTyhhLGIsYyxkLGUpfWlmKHI9PT05KXtpZihw
+IT09OSlyZXR1cm4hMQpyZXR1cm4gSC5wRyhhLGIsYyxkLGUpfXJldHVybiExfSwKYk8oYTMsYTQsYTUs
+YTYsYTcpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyCmlm
+KCFILldlKGEzLGE0LnosYTUsYTYueixhNykpcmV0dXJuITEKcz1hNC5RCnI9YTYuUQpxPXMuYQpwPXIu
+YQpvPXEubGVuZ3RoCm49cC5sZW5ndGgKaWYobz5uKXJldHVybiExCm09bi1vCmw9cy5iCms9ci5iCmo9
+bC5sZW5ndGgKaT1rLmxlbmd0aAppZihvK2o8bitpKXJldHVybiExCmZvcihoPTA7aDxvOysraCl7Zz1x
+W2hdCmlmKCFILldlKGEzLHBbaF0sYTcsZyxhNSkpcmV0dXJuITF9Zm9yKGg9MDtoPG07KytoKXtnPWxb
+aF0KaWYoIUguV2UoYTMscFtvK2hdLGE3LGcsYTUpKXJldHVybiExfWZvcihoPTA7aDxpOysraCl7Zz1s
+W20raF0KaWYoIUguV2UoYTMsa1toXSxhNyxnLGE1KSlyZXR1cm4hMX1mPXMuYwplPXIuYwpkPWYubGVu
+Z3RoCmM9ZS5sZW5ndGgKZm9yKGI9MCxhPTA7YTxjO2ErPTMpe2EwPWVbYV0KZm9yKDshMDspe2lmKGI+
+PWQpcmV0dXJuITEKYTE9ZltiXQpiKz0zCmlmKGEwPGExKXJldHVybiExCmEyPWZbYi0yXQppZihhMTxh
+MCl7aWYoYTIpcmV0dXJuITEKY29udGludWV9Zz1lW2ErMV0KaWYoYTImJiFnKXJldHVybiExCmc9Zlti
+LTFdCmlmKCFILldlKGEzLGVbYSsyXSxhNyxnLGE1KSlyZXR1cm4hMQpicmVha319Zm9yKDtiPGQ7KXtp
+ZihmW2IrMV0pcmV0dXJuITEKYis9M31yZXR1cm4hMH0sCnBHKGEsYixjLGQsZSl7dmFyIHMscixxLHAs
+byxuLG0sbD1iLnosaz1kLnoKZm9yKDtsIT09azspe3M9YS50UltsXQppZihzPT1udWxsKXJldHVybiEx
+CmlmKHR5cGVvZiBzPT0ic3RyaW5nIil7bD1zCmNvbnRpbnVlfXI9c1trXQppZihyPT1udWxsKXJldHVy
+biExCnE9ci5sZW5ndGgKcD1xPjA/bmV3IEFycmF5KHEpOnYudHlwZVVuaXZlcnNlLnNFQQpmb3Iobz0w
+O288cTsrK28pcFtvXT1ILmNFKGEsYixyW29dKQpyZXR1cm4gSC5TVyhhLHAsbnVsbCxjLGQuUSxlKX1u
+PWIuUQptPWQuUQpyZXR1cm4gSC5TVyhhLG4sbnVsbCxjLG0sZSl9LApTVyhhLGIsYyxkLGUsZil7dmFy
+IHMscixxLHA9Yi5sZW5ndGgKZm9yKHM9MDtzPHA7KytzKXtyPWJbc10KcT1lW3NdCmlmKCFILldlKGEs
+cixkLHEsZikpcmV0dXJuITF9cmV0dXJuITB9LApsUihhKXt2YXIgcyxyPWEueQppZighKGE9PT10LlB8
+fGE9PT10LlQpKWlmKCFILkE4KGEpKWlmKHIhPT03KWlmKCEocj09PTYmJkgubFIoYS56KSkpcz1yPT09
+OCYmSC5sUihhLnopCmVsc2Ugcz0hMAplbHNlIHM9ITAKZWxzZSBzPSEwCmVsc2Ugcz0hMApyZXR1cm4g
+c30sCmNjKGEpe3ZhciBzCmlmKCFILkE4KGEpKWlmKCEoYT09PXQuXykpcz0hMQplbHNlIHM9ITAKZWxz
+ZSBzPSEwCnJldHVybiBzfSwKQTgoYSl7dmFyIHM9YS55CnJldHVybiBzPT09Mnx8cz09PTN8fHM9PT00
+fHxzPT09NXx8YT09PXQuWH0sCkl4KGEsYil7dmFyIHMscixxPU9iamVjdC5rZXlzKGIpLHA9cS5sZW5n
+dGgKZm9yKHM9MDtzPHA7KytzKXtyPXFbc10KYVtyXT1iW3JdfX0sCnZVKGEpe3JldHVybiBhPjA/bmV3
+IEFycmF5KGEpOnYudHlwZVVuaXZlcnNlLnNFQX0sCkpjOmZ1bmN0aW9uIEpjKGEsYil7dmFyIF89dGhp
+cwpfLmE9YQpfLmI9YgpfLng9Xy5yPV8uYz1udWxsCl8ueT0wCl8uY3k9Xy5jeD1fLmNoPV8uUT1fLno9
+bnVsbH0sCkc6ZnVuY3Rpb24gRygpe3RoaXMuYz10aGlzLmI9dGhpcy5hPW51bGx9LAprUzpmdW5jdGlv
+biBrUygpe30sCmlNOmZ1bmN0aW9uIGlNKGEpe3RoaXMuYT1hfSwKUjkoYSl7cmV0dXJuIHQudy5iKGEp
+fHx0LkIuYihhKXx8dC5kei5iKGEpfHx0LkkuYihhKXx8dC5BLmIoYSl8fHQuZzQuYihhKXx8dC5nMi5i
+KGEpfSwKRlAoYSl7cmV0dXJuIEgudihILmooYSkpfX0sSj17ClF1KGEsYixjLGQpe3JldHVybntpOmEs
+cDpiLGU6Yyx4OmR9fSwKa3MoYSl7dmFyIHMscixxLHAsbyxuPWFbdi5kaXNwYXRjaFByb3BlcnR5TmFt
+ZV0KaWYobj09bnVsbClpZigkLkJ2PT1udWxsKXtILlhEKCkKbj1hW3YuZGlzcGF0Y2hQcm9wZXJ0eU5h
+bWVdfWlmKG4hPW51bGwpe3M9bi5wCmlmKCExPT09cylyZXR1cm4gbi5pCmlmKCEwPT09cylyZXR1cm4g
+YQpyPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQppZihzPT09cilyZXR1cm4gbi5pCmlmKG4uZT09PXIp
+dGhyb3cgSC5iKFAuU1koIlJldHVybiBpbnRlcmNlcHRvciBmb3IgIitILkVqKHMoYSxuKSkpKX1xPWEu
+Y29uc3RydWN0b3IKaWYocT09bnVsbClwPW51bGwKZWxzZXtvPSQuem0KaWYobz09bnVsbClvPSQuem09
+di5nZXRJc29sYXRlVGFnKCJfJGRhcnRfanMiKQpwPXFbb119aWYocCE9bnVsbClyZXR1cm4gcApwPUgu
+dzMoYSkKaWYocCE9bnVsbClyZXR1cm4gcAppZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gQy5E
+RwpzPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQppZihzPT1udWxsKXJldHVybiBDLlpRCmlmKHM9PT1P
+YmplY3QucHJvdG90eXBlKXJldHVybiBDLlpRCmlmKHR5cGVvZiBxPT0iZnVuY3Rpb24iKXtvPSQuem0K
+aWYobz09bnVsbClvPSQuem09di5nZXRJc29sYXRlVGFnKCJfJGRhcnRfanMiKQpPYmplY3QuZGVmaW5l
+UHJvcGVydHkocSxvLHt2YWx1ZTpDLnZCLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25m
+aWd1cmFibGU6dHJ1ZX0pCnJldHVybiBDLnZCfXJldHVybiBDLnZCfSwKUWkoYSxiKXtpZihhPDB8fGE+
+NDI5NDk2NzI5NSl0aHJvdyBILmIoUC5URShhLDAsNDI5NDk2NzI5NSwibGVuZ3RoIixudWxsKSkKcmV0
+dXJuIEoucHkobmV3IEFycmF5KGEpLGIpfSwKS2goYSxiKXtpZihhPDApdGhyb3cgSC5iKFAueFkoIkxl
+bmd0aCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXI6ICIrYSxudWxsKSkKcmV0dXJuIEguUUko
+bmV3IEFycmF5KGEpLGIuQygiamQ8MD4iKSl9LApweShhLGIpe3JldHVybiBKLkVwKEguUUkoYSxiLkMo
+ImpkPDA+IikpLGIpfSwKRXAoYSxiKXthLmZpeGVkJGxlbmd0aD1BcnJheQpyZXR1cm4gYX0sCnpDKGEp
+e2EuZml4ZWQkbGVuZ3RoPUFycmF5CmEuaW1tdXRhYmxlJGxpc3Q9QXJyYXkKcmV0dXJuIGF9LApHYShh
+KXtpZihhPDI1Nilzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTA6Y2FzZSAxMTpjYXNlIDEyOmNhc2UgMTM6
+Y2FzZSAzMjpjYXNlIDEzMzpjYXNlIDE2MDpyZXR1cm4hMApkZWZhdWx0OnJldHVybiExfXN3aXRjaChh
+KXtjYXNlIDU3NjA6Y2FzZSA4MTkyOmNhc2UgODE5MzpjYXNlIDgxOTQ6Y2FzZSA4MTk1OmNhc2UgODE5
+NjpjYXNlIDgxOTc6Y2FzZSA4MTk4OmNhc2UgODE5OTpjYXNlIDgyMDA6Y2FzZSA4MjAxOmNhc2UgODIw
+MjpjYXNlIDgyMzI6Y2FzZSA4MjMzOmNhc2UgODIzOTpjYXNlIDgyODc6Y2FzZSAxMjI4ODpjYXNlIDY1
+Mjc5OnJldHVybiEwCmRlZmF1bHQ6cmV0dXJuITF9fSwKbW0oYSxiKXt2YXIgcyxyCmZvcihzPWEubGVu
+Z3RoO2I8czspe3I9Qy54Qi5XKGEsYikKaWYociE9PTMyJiZyIT09MTMmJiFKLkdhKHIpKWJyZWFrOysr
+Yn1yZXR1cm4gYn0sCmMxKGEsYil7dmFyIHMscgpmb3IoO2I+MDtiPXMpe3M9Yi0xCnI9Qy54Qi5PKGEs
+cykKaWYociE9PTMyJiZyIT09MTMmJiFKLkdhKHIpKWJyZWFrfXJldHVybiBifSwKVTYoYSl7aWYodHlw
+ZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBhCmlm
+KGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9i
+amVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4g
+YX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCllFKGEpe2lmKGE9
+PW51bGwpcmV0dXJuIGEKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9u
+IilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJu
+IGEKcmV0dXJuIEoua3MoYSl9LAppYShhKXtpZih0eXBlb2YgYT09Im51bWJlciIpe2lmKE1hdGguZmxv
+b3IoYSk9PWEpcmV0dXJuIEouYlUucHJvdG90eXBlCnJldHVybiBKLmtELnByb3RvdHlwZX1pZih0eXBl
+b2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJuIEoud2Uu
+cHJvdG90eXBlCmlmKHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIEoueUUucHJvdG90eXBlCmlmKGEu
+Y29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVj
+dCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1p
+ZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCnJZKGEpe2lmKHR5cGVv
+ZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZigh
+KGEgaW5zdGFuY2VvZiBQLk1oKSlyZXR1cm4gSi5rZC5wcm90b3R5cGUKcmV0dXJuIGF9LAp3MShhKXtp
+ZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3Rv
+dHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBK
+LmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4g
+Si5rcyhhKX0sCkE1KGEsYil7cmV0dXJuIEoudzEoYSkuZVIoYSxiKX0sCkVoKGEsYixjKXtyZXR1cm4g
+Si5ZRShhKS5tSyhhLGIsYyl9LApFbChhLGIpe3JldHVybiBKLncxKGEpLmRyKGEsYil9LApGNyhhKXty
+ZXR1cm4gSi5VNihhKS5nb3IoYSl9LApGTChhLGIpe3JldHVybiBKLnJZKGEpLmRkKGEsYil9LApHQShh
+LGIpe3JldHVybiBKLncxKGEpLkUoYSxiKX0sCkhtKGEpe3JldHVybiBKLlU2KGEpLmdBKGEpfSwKSVQo
+YSl7cmV0dXJuIEoudzEoYSkuZ20oYSl9LApKeShhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEsYil9LApM
+dChhKXtyZXR1cm4gSi5ZRShhKS53ZyhhKX0sCk0xKGEsYixjKXtyZXR1cm4gSi53MShhKS5FMihhLGIs
+Yyl9LApNdShhLGIpe3JldHVybiBKLllFKGEpLnNQKGEsYil9LApSTShhLGIpe2lmKGE9PW51bGwpcmV0
+dXJuIGI9PW51bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBiIT1udWxsJiZhPT09YgpyZXR1
+cm4gSi5pYShhKS5ETihhLGIpfSwKUlgoYSl7cmV0dXJuIEoudzEoYSkuYnIoYSl9LApUMChhKXtyZXR1
+cm4gSi5yWShhKS5iUyhhKX0sCmE2KGEsYil7cmV0dXJuIEouclkoYSkuTyhhLGIpfSwKYlQoYSl7cmV0
+dXJuIEouWUUoYSkuRDQoYSl9LApjSChhKXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSKGEpe3JldHVy
+biBKLllFKGEpLmdQKGEpfSwKZFooYSxiLGMsZCl7cmV0dXJuIEouWUUoYSkuT24oYSxiLGMsZCl9LApk
+aChhKXtyZXR1cm4gSi5ZRShhKS5GRihhKX0sCmRyKGEsYil7cmV0dXJuIEouWUUoYSkuc2E0KGEsYil9
+LApoZihhKXtyZXR1cm4gSi5pYShhKS5naU8oYSl9LAppZyhhKXtyZXR1cm4gSi5ZRShhKS5nUWcoYSl9
+LApsNShhLGIpe3JldHVybiBKLllFKGEpLnNoZihhLGIpfSwKcUYoYSl7cmV0dXJuIEouWUUoYSkuZ1Zs
+KGEpfSwKdEgoYSxiLGMpe3JldHVybiBKLllFKGEpLnBrKGEsYixjKX0sCnU5KGEsYixjKXtyZXR1cm4g
+Si53MShhKS5ZNShhLGIsYyl9LAp1VShhKXtyZXR1cm4gSi5VNihhKS5nbDAoYSl9LAp3KGEpe3JldHVy
+biBKLmlhKGEpLncoYSl9LAp3ZihhLGIpe3JldHVybiBKLllFKGEpLnNSTihhLGIpfSwKeDkoYSxiKXtp
+Zih0eXBlb2YgYj09PSJudW1iZXIiKWlmKGEuY29uc3RydWN0b3I9PUFycmF5fHx0eXBlb2YgYT09InN0
+cmluZyJ8fEgud1YoYSxhW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdKSlpZihiPj4+MD09PWImJmI8YS5s
+ZW5ndGgpcmV0dXJuIGFbYl0KcmV0dXJuIEouVTYoYSkucShhLGIpfSwKemwoYSxiKXtyZXR1cm4gSi5V
+NihhKS50ZyhhLGIpfSwKR3Y6ZnVuY3Rpb24gR3YoKXt9LAp5RTpmdW5jdGlvbiB5RSgpe30sCndlOmZ1
+bmN0aW9uIHdlKCl7fSwKTUY6ZnVuY3Rpb24gTUYoKXt9LAppQzpmdW5jdGlvbiBpQygpe30sCmtkOmZ1
+bmN0aW9uIGtkKCl7fSwKYzU6ZnVuY3Rpb24gYzUoKXt9LApqZDpmdW5jdGlvbiBqZChhKXt0aGlzLiR0
+aT1hfSwKUG86ZnVuY3Rpb24gUG8oYSl7dGhpcy4kdGk9YX0sCm0xOmZ1bmN0aW9uIG0xKGEsYixjKXt2
+YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz0wCl8uZD1udWxsCl8uJHRpPWN9LApxSTpmdW5jdGlvbiBx
+SSgpe30sCmJVOmZ1bmN0aW9uIGJVKCl7fSwKa0Q6ZnVuY3Rpb24ga0QoKXt9LApEcjpmdW5jdGlvbiBE
+cigpe319LEw9ewpJcSgpe0MuQlouQihkb2N1bWVudCwiRE9NQ29udGVudExvYWRlZCIsbmV3IEwuZSgp
+KQpDLm9sLkIod2luZG93LCJwb3BzdGF0ZSIsbmV3IEwuTCgpKX0sCmt6KGEpe3ZhciBzLHI9dC5oLmEo
+YS5wYXJlbnROb2RlKS5xdWVyeVNlbGVjdG9yKCI6c2NvcGUgPiB1bCIpLHE9ci5zdHlsZSxwPSIiK0Mu
+Q0QuelEoci5vZmZzZXRIZWlnaHQpKjIrInB4IgpxLm1heEhlaWdodD1wCnE9Si5xRihhKQpwPXEuJHRp
+CnM9cC5DKCJ+KDEpPyIpLmEobmV3IEwuV3gocixhKSkKdC5aLmEobnVsbCkKVy5KRShxLmEscS5iLHMs
+ITEscC5jKX0sCnlYKGEsYil7dmFyIHMscixxLHAsbyxuLG09InF1ZXJ5U2VsZWN0b3JBbGwiLGw9ZG9j
+dW1lbnQucXVlcnlTZWxlY3RvcihhKQpsLnRvU3RyaW5nCnM9dC5oCkguRGgocyxzLCJUIixtKQpyPXQu
+VQpxPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1saW5rIikscikKcS5LKHEsbmV3IEwu
+SG8oYikpCkguRGgocyxzLCJUIixtKQpwPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLnJlZ2lv
+biIpLHIpCmlmKCFwLmdsMChwKSl7bz1sLnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQpv
+LnRvU3RyaW5nCnAuSyhwLG5ldyBMLklDKG8uZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3
+IFcuaTcobykpLk9VKCJwYXRoIikpKSl9SC5EaChzLHMsIlQiLG0pCm49bmV3IFcud3oobC5xdWVyeVNl
+bGVjdG9yQWxsKCIuYWRkLWhpbnQtbGluayIpLHIpCm4uSyhuLG5ldyBMLkJOKCkpfSwKUTYoYSxiLGMp
+e3ZhciBzPW5ldyBYTUxIdHRwUmVxdWVzdCgpCkMuRHQuZW8ocywiR0VUIixMLlE0KGEsYiksITApCnMu
+c2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1V
+VEYtOCIpCnJldHVybiBMLkxVKHMsbnVsbCxjKX0sCnR5KGEsYil7dmFyIHM9bmV3IFhNTEh0dHBSZXF1
+ZXN0KCkscj10Lk4KQy5EdC5lbyhzLCJQT1NUIixMLlE0KGEsUC5GbChyLHIpKSwhMCkKcy5zZXRSZXF1
+ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04IikK
+cmV0dXJuIEwuTFUocyxiLHQuRyl9LApMVShhLGIsYyl7cmV0dXJuIEwuVGcoYSxiLGMsYy5DKCIwPyIp
+KX0sClRnKGEsYixjLGQpe3ZhciBzPTAscj1QLkZYKGQpLHEscD0yLG8sbj1bXSxtLGwsayxqLGksaCxn
+LGYsZQp2YXIgJGFzeW5jJExVPVAubHooZnVuY3Rpb24oYTAsYTEpe2lmKGEwPT09MSl7bz1hMQpzPXB9
+d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOmg9bmV3IFAuWmYobmV3IFAudnMoJC5YMyx0LmFvKSx0
+LmJqKQpnPXQuZ3gKZj1nLmEobmV3IEwuZkMoaCxhKSkKdC5aLmEobnVsbCkKaz10LnAKVy5KRShhLCJs
+b2FkIixmLCExLGspClcuSkUoYSwiZXJyb3IiLGcuYShoLmdZSigpKSwhMSxrKQphLnNlbmQoYj09bnVs
+bD9udWxsOkMuQ3QuT0IoYixudWxsKSkKcD00CnM9NwpyZXR1cm4gUC5qUShoLmEsJGFzeW5jJExVKQpj
+YXNlIDc6cD0yCnM9NgpicmVhawpjYXNlIDQ6cD0zCmU9bwpILlJ1KGUpCm09SC50cyhlKQpnPWEucmVh
+ZHlTdGF0ZQppZihnPT09NCYmYS5zdGF0dXM9PT0wKXRocm93IEguYihMLlRHKCJFcnJvciByZWFjaGlu
+ZyBtaWdyYXRpb24gcHJldmlldyBzZXJ2ZXIiLCJUaGlzIHVzdWFsbHkgaGFwcGVucyBiZWNhdXNlIHRo
+ZSBtaWdyYXRpb24gcHJldmlldyBzZXJ2ZXIgaGFzIGV4aXRlZC4gIEZvclxuZXhhbXBsZSBpdCBtYXkg
+aGF2ZSBiZWVuIGFib3J0ZWQgd2l0aCBDdHJsLUMsIG9yIHlvdSBtYXkgaGF2ZSBjb21wbGV0ZWQgdGhp
+c1xubWlncmF0aW9uLCBvciBhbiBleGNlcHRpb24gbWF5IGhhdmUgb2NjdXJyZWQuICBQbGVhc2UgY2hl
+Y2sgdGhlIGNvbnNvbGUgd2hlcmVcbnlvdSBpbnZva2VkIGBkYXJ0IG1pZ3JhdGVgIHRvIHZlcmlmeSB0
+aGF0IHRoZSBwcmV2aWV3IHNlcnZlciBpcyBzdGlsbCBydW5uaW5nLlxuIikpCmVsc2V7bD1uZXcgSC5s
+SihILlFJKFsicmVhZHlTdGF0ZT0iK2csInJlc3BvbnNlVGV4dD0iK0MuQ3QuT0IoYS5yZXNwb25zZVRl
+eHQsbnVsbCksInJlc3BvbnNlVHlwZT0iK0MuQ3QuT0IoYS5yZXNwb25zZVR5cGUsbnVsbCksInJlc3Bv
+bnNlVXJsPSIrQy5DdC5PQihhLnJlc3BvbnNlVVJMLG51bGwpLCJzdGF0dXM9IitILkVqKGEuc3RhdHVz
+KSwic3RhdHVzVGV4dD0iK0MuQ3QuT0IoYS5zdGF0dXNUZXh0LG51bGwpXSx0LnMpLHQuZEcuYShuZXcg
+TC5UbSgpKSx0LmR2KS5rKDAsIiwgIikKdGhyb3cgSC5iKFAuVGwoIkVycm9yIHJlYWNoaW5nIG1pZ3Jh
+dGlvbiBwcmV2aWV3IHNlcnZlcjogIitILkVqKGwpLG0pKX1zPTYKYnJlYWsKY2FzZSAzOnM9MgpicmVh
+awpjYXNlIDY6aWYoYS5zdGF0dXM9PT00MDEpdGhyb3cgSC5iKEwuVEcoIlVuYXV0aG9yaXplZCByZXNw
+b25zZSBmcm9tIG1pZ3JhdGlvbiBwcmV2aWV3IHNlcnZlciIsIlRoZSBtaWdyYXRpb24gcHJldmlldyBz
+ZXJ2ZXIgaGFzIGRldGVjdGVkIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgYXV0aFRva2VuIGluXG55b3Vy
+IFVSTCBhbmQgdGhlIHRva2VuIHRoYXQgd2FzIGdlbmVyYXRlZCBhdCB0aGUgdGltZSB0aGF0IGBkYXJ0
+IG1pZ3JhdGVgIHdhc1xucnVuLiAgSGF2ZSB5b3UgcmVzdGFydGVkIHRoZSBtaWdyYXRpb24gc2VydmVy
+IHJlY2VudGx5PyAgSWYgc28sIHlvdSdsbCBuZWVkIHRvXG5jaGVjayBpdHMgb3V0cHV0IGZvciBhIGZy
+ZXNoIFVSTCwgYW5kIHVzZSB0aGF0IFVSTCB0byBwZXJmb3JtIHlvdXIgbWlncmF0aW9uLlxuIikpCmc9
+YS5yZXNwb25zZVRleHQKZy50b1N0cmluZwppPUMuQ3QucFcoMCxnLG51bGwpCmlmKGEuc3RhdHVzPT09
+MjAwKXtxPWMuQygiMD8iKS5hKGkpCnM9MQpicmVha31lbHNle2kudG9TdHJpbmcKdGhyb3cgSC5iKGkp
+fWNhc2UgMTpyZXR1cm4gUC55QyhxLHIpCmNhc2UgMjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQ
+LkRJKCRhc3luYyRMVSxyKX0sCmFLKGEpe3ZhciBzPVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0
+dXJuIHM9PW51bGw/bnVsbDpILkhwKHMsbnVsbCl9LApHNihhKXt2YXIgcz1QLmhLKGEpLmdoWSgpLnEo
+MCwib2Zmc2V0IikKcmV0dXJuIHM9PW51bGw/bnVsbDpILkhwKHMsbnVsbCl9LAppNihhKXtyZXR1cm4g
+TC5uVyh0LlYuYShhKSl9LApuVyhhKXt2YXIgcz0wLHI9UC5GWCh0LnopLHE9MSxwLG89W10sbixtLGws
+ayxqLGksaCxnCnZhciAkYXN5bmMkaTY9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1x
+fXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpoPXQuaC5hKFcucWMoYS5jdXJyZW50VGFyZ2V0KSku
+Z2V0QXR0cmlidXRlKCJocmVmIikKaC50b1N0cmluZwpuPWgKYS5wcmV2ZW50RGVmYXVsdCgpCnE9Mwpo
+PWRvY3VtZW50Cm09Qy5DRC56UShoLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50Iikuc2Nyb2xsVG9wKQpz
+PTYKcmV0dXJuIFAualEoTC50eShuLG51bGwpLCRhc3luYyRpNikKY2FzZSA2Omo9dC5GLmEod2luZG93
+LmxvY2F0aW9uKS5wYXRobmFtZQpqLnRvU3RyaW5nCnM9NwpyZXR1cm4gUC5qUShMLkc3KGosbnVsbCxu
+dWxsLCExLG51bGwpLCRhc3luYyRpNikKY2FzZSA3OmguYm9keS5jbGFzc0xpc3QuYWRkKCJuZWVkcy1y
+ZXJ1biIpCmg9aC5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpCmgudG9TdHJpbmcKaC5zY3JvbGxUb3A9
+Qy5qbi56UShtKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykK
+TC5DMigiY291bGRuJ3QgYWRkL3JlbW92ZSBoaW50IixsLGspCnM9NQpicmVhawpjYXNlIDI6cz0xCmJy
+ZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJl
+dHVybiBQLkRJKCRhc3luYyRpNixyKX0sCkMyKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT0iZXhjZXB0
+aW9uIixsPSJzdGFja1RyYWNlIgppZih0Lmg2LmIoYikmJkouUk0oYi5xKDAsInN1Y2Nlc3MiKSwhMSkm
+JmIueDQobSkmJmIueDQobCkpe3M9Si5VNihiKQpyPUguayhzLnEoYixtKSkKYz1zLnEoYixsKQpxPW51
+bGx9ZWxzZSBpZihiIGluc3RhbmNlb2YgTC5RVyl7cj1iLmEKcT1iLmJ9ZWxzZXtyPUoudyhiKQpxPW51
+bGx9aWYocT09bnVsbClxPWMKcz1kb2N1bWVudApwPXMucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUi
+KQpwLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PWEKbz1wLnF1ZXJ5U2VsZWN0b3IoInAiKQpv
+LnRvU3RyaW5nCnIudG9TdHJpbmcKby5pbm5lclRleHQ9cgpvPXAucXVlcnlTZWxlY3RvcigicHJlIikK
+by50b1N0cmluZwpvLmlubmVyVGV4dD1KLncocSkKbj10LmJxLmEocC5xdWVyeVNlbGVjdG9yKCJhLmJv
+dHRvbSIpKQpDLnhuLnNMVShuLFAuWGQoImh0dHBzIiwiZ2l0aHViLmNvbSIsImRhcnQtbGFuZy9zZGsv
+aXNzdWVzL25ldyIsUC5FRihbInRpdGxlIiwiQ3VzdG9tZXItcmVwb3J0ZWQgaXNzdWUgd2l0aCBOTkJE
+IG1pZ3JhdGlvbiB0b29sOiAiK2EsImxhYmVscyIsdS5kLCJib2R5IixhKyJcblxuRXJyb3I6ICIrcisi
+XG5cblBsZWFzZSBmaWxsIGluIHRoZSBmb2xsb3dpbmc6XG5cbioqTmFtZSBvZiBwYWNrYWdlIGJlaW5n
+IG1pZ3JhdGVkIChpZiBwdWJsaWMpKio6XG4qKldoYXQgSSB3YXMgZG9pbmcgd2hlbiB0aGlzIGlzc3Vl
+IG9jY3VycmVkKio6XG4qKklzIGl0IHBvc3NpYmxlIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUqKjpc
+bioqSGFzIHRoaXMgaXNzdWUgaGFwcGVuZWQgYmVmb3JlLCBhbmQgaWYgc28sIGhvdyBvZnRlbioqOlxu
+KipEYXJ0IFNESyB2ZXJzaW9uKio6ICIrSC5FaihzLmdldEVsZW1lbnRCeUlkKCJzZGstdmVyc2lvbiIp
+LnRleHRDb250ZW50KSsiXG4qKkFkZGl0aW9uYWwgZGV0YWlscyoqOlxuXG5UaGFua3MgZm9yIGZpbGlu
+ZyFcblxuU3RhY2t0cmFjZTogX2F1dG8gcG9wdWxhdGVkIGJ5IG1pZ3JhdGlvbiBwcmV2aWV3IHRvb2wu
+X1xuXG5gYGBcbiIrSC5FaihjKSsiXG5gYGBcbiJdLHQuTix0LnopKS5nbkQoKSkKcz1uLnN0eWxlCnMu
+ZGlzcGxheT0iaW5pdGlhbCIKcz1wLnN0eWxlCnMuZGlzcGxheT0iaW5pdGlhbCIKcz1hKyI6ICIrSC5F
+aihiKQp3aW5kb3cKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVy
+cm9yKHMpCndpbmRvdwpzPUguRWooYykKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRv
+dy5jb25zb2xlLmVycm9yKHMpfSwKdDIoYSxiKXt2YXIgcyxyLHEscCxvPXQuaC5hKFcucWMoYS5jdXJy
+ZW50VGFyZ2V0KSkKYS5wcmV2ZW50RGVmYXVsdCgpCnM9by5nZXRBdHRyaWJ1dGUoImhyZWYiKQpzLnRv
+U3RyaW5nCnI9TC5VcyhzKQpxPUwuRzYocykKcD1MLmFLKHMpCmlmKHEhPW51bGwpTC5hZihyLHEscCxi
+LG5ldyBMLm5UKHIscSxwKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxsLGIsbmV3IEwuTlkocikpfSwKSzAo
+YSl7dmFyIHMscixxLHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpwLnF1ZXJ5
+U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PSJGYWlsZWQgdG8gcmVydW4gZnJvbSBzb3VyY2VzIgpwLnF1
+ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9IlNvdXJjZXMgY29udGFpbiBzdGF0aWMgYW5hbHlzaXMg
+ZXJyb3JzOiIKcz1wLnF1ZXJ5U2VsZWN0b3IoInByZSIpCnMudG9TdHJpbmcKcj1KLkVsKGEsdC5mKQpx
+PUguTGgocikKcy5pbm5lclRleHQ9bmV3IEgubEoocixxLkMoInFVKGxELkUpIikuYShuZXcgTC51ZSgp
+KSxxLkMoImxKPGxELkUscVU+IikpLmsoMCwiXG4iKQpxPXAucXVlcnlTZWxlY3RvcigiYS5ib3R0b20i
+KS5zdHlsZQpxLmRpc3BsYXk9Im5vbmUiCnM9cC5zdHlsZQpzLmRpc3BsYXk9ImluaXRpYWwifSwKR2co
+KXt2YXIgcz1kb2N1bWVudCxyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5l
+dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlUpCnMuSyhzLG5ldyBMLkdIKCkpfSwK
+aFgoYSxiLGMpe3JldHVybiBMLll3KGEsYixjKX0sCll3KGEsYixjKXt2YXIgcz0wLHI9UC5GWCh0Lnop
+LHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnCnZhciAkYXN5bmMkaFg9UC5seihmdW5jdGlvbihkLGUp
+e2lmKGQ9PT0xKXtwPWUKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaj10Lk4Kcz02
+CnJldHVybiBQLmpRKEwuUTYoYSxQLkVGKFsicmVnaW9uIiwicmVnaW9uIiwib2Zmc2V0IixILkVqKGIp
+XSxqLGopLHQuRyksJGFzeW5jJGhYKQpjYXNlIDY6bj1lCmo9bgppPUouVTYoaikKbT1uZXcgVS5kMihV
+LmpmKGkucShqLCJlZGl0cyIpKSxILmsoaS5xKGosImV4cGxhbmF0aW9uIikpLEguVWMoaS5xKGosImxp
+bmUiKSksSC5rKGkucShqLCJkaXNwbGF5UGF0aCIpKSxILmsoaS5xKGosInVyaVBhdGgiKSksVS5OZChp
+LnEoaiwidHJhY2VzIikpKQpMLlQxKG0pCkwuRnIoYSxiLGMpCkwueVgoIi5lZGl0LXBhbmVsIC5wYW5l
+bC1jb250ZW50IiwhMSkKcT0xCnM9NQpicmVhawpjYXNlIDM6cT0yCmc9cApsPUguUnUoZykKaz1ILnRz
+KGcpCkwuQzIoImNvdWxkbid0IGxvYWQgZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNlIDI6
+cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIp
+fX0pCnJldHVybiBQLkRJKCRhc3luYyRoWCxyKX0sCkc3KGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxi
+LGMsZCxlKX0sCkw1KGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49W10sbSxs
+LGssaixpLGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEpe289YTAK
+cz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighQy54Qi5UYyhhLCIuZGFydCIpKXtMLkJF
+KGEsQi53UigpLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9
+dC5OCnM9NwpyZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQuRyks
+JGFzeW5jJEc3KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVzKGEp
+CkwuQlgobCxiKQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9
+SC5SdShnKQpqPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9hZCBkYXJ0IGZpbGUgIithLGssaikKcz02
+CmJyZWFrCmNhc2UgMzpzPTIKYnJlYWsKY2FzZSA2OmNhc2UgMTpyZXR1cm4gUC55QyhxLHIpCmNhc2Ug
+MjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRHNyxyKX0sCkdlKCl7dmFyIHM9
+MCxyPVAuRlgodC56KSxxPTEscCxvPVtdLG4sbSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEdlPVAubHoo
+ZnVuY3Rpb24oYSxiKXtpZihhPT09MSl7cD1iCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
+aD0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVlLmpzb24iCnE9MwpzPTYKcmV0dXJuIFAualEoTC5RNiho
+LEMuQ00sdC5lZSksJGFzeW5jJEdlKQpjYXNlIDY6bj1iCmo9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigi
+Lm5hdi10cmVlIikKai50b1N0cmluZwptPWoKSi5sNShtLCIiKQpqPUwubUsobikKJC5JUj1qCkwudFgo
+bSxqLCEwKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5D
+MigiY291bGRuJ3QgbG9hZCBuYXZpZ2F0aW9uIHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEK
+YnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkK
+cmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwKcU8oYSl7dmFyIHMscixxPWEuZ2V0Qm91bmRpbmdDbGll
+bnRSZWN0KCkscD1DLkNELnpRKCQuZmkoKS5vZmZzZXRIZWlnaHQpLG89d2luZG93LmlubmVySGVpZ2h0
+Cm8udG9TdHJpbmcKcz1DLkNELnpRKCQuRFcoKS5vZmZzZXRIZWlnaHQpCnI9cS5ib3R0b20Kci50b1N0
+cmluZwppZihyPm8tKHMrMTQpKUouZGgoYSkKZWxzZXtvPXEudG9wCm8udG9TdHJpbmcKaWYobzxwKzE0
+KUouZGgoYSl9fSwKZkcoYSxiKXt2YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1z
+LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEpKQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVq
+KGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51
+bGwpe3M9cS5wYXJlbnRFbGVtZW50CnMudG9TdHJpbmcKTC5xTyhzKX1pZihxIT1udWxsKUouZFIodC5o
+LmEocS5wYXJlbnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmgKSC5E
+aChwLHAsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5v
+IikKbz1uZXcgVy53eihzLHQuVSkKaWYoby5nQShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RI
+KHMpKSl9fSwKYWYoYSxiLGMsZCxlKXt2YXIgcyxyLHEscD10LkYsbz1MLkc2KHAuYSh3aW5kb3cubG9j
 YXRpb24pLmhyZWYpLG49TC5hSyhwLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQppZihvIT1udWxsKXtz
 PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKG8pKQppZihzIT1udWxsKUouZFIocykuUigw
 LCJ0YXJnZXQiKX1pZihuIT1udWxsKXtyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5F
 aihuKSkKaWYociE9bnVsbCl7cT1yLnBhcmVudEVsZW1lbnQKcS50b1N0cmluZwpKLmRSKHEpLlIoMCwi
 aGlnaGxpZ2h0Iil9fWlmKGE9PXAuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lKXtMLmZHKGIsYykK
-ZS4kMCgpfWVsc2V7YS50b1N0cmluZwpMLkc3KGEsYixjLGQsZSl9fSwKUTQ6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHE9UC5oSyhhKSxwPVAuRmwodC5OLHQuZGspCmZvcihzPXEuZ2hZKCkscz1zLmdQdShzKSxz
-PXMuZ20ocyk7cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5hLHIuYil9Zm9yKHM9Yi5nUHUoYikscz1z
-LmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxyLmIpfXAuWTUoMCwiYXV0aFRva2VuIiwk
-LlVFKCkpCnJldHVybiBxLm5tKDAscCkuZ25EKCl9LApUMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxv
-LG4sbSxsLGssaixpPSQuaEwoKQppLnRvU3RyaW5nCkoubDUoaSwiIikKaWYoYT09bnVsbCl7cz1kb2N1
-bWVudC5jcmVhdGVFbGVtZW50KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9w
-b3NlZCBlZGl0LiIpCkMuTHQuc1AocyxILlFJKFsicGxhY2Vob2xkZXIiXSx0LnMpKQppLmFwcGVuZENo
-aWxkKHMpCkMuTHQuRkYocykKcmV0dXJufXI9YS5kCnIudG9TdHJpbmcKcT0kLm5VKCkKcD1xLnpmKHIp
-Cm89YS5iCm49ZG9jdW1lbnQKbT1uLnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQKbS50
-b1N0cmluZwpsPXEuSFAocixDLnhCLmJTKG0pKQprPWEuYwpqPW4uY3JlYXRlRWxlbWVudCgicCIpCmku
-YXBwZW5kQ2hpbGQoaikKai5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobykrIiBhdCAi
-KSkKcj1hLmUKci50b1N0cmluZwpxPXQuTgpxPVcuSjYoTC5RNChyLFAuRUYoWyJsaW5lIixKLncoayld
-LHEscSkpKQpxLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUobCsiOiIrSC5FaihrKSsiLiIpKQpq
-LmFwcGVuZENoaWxkKHEpCkouZGgoaikKTC5DQyhhLGkscCkKTC5GeihhLGkpfSwKTEg6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPSQueVAoKQpkLnRvU3RyaW5n
-CkoubDUoZCwiIikKaWYoYi5nQShiKT09PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAi
-KQpkLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9z
-ZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZD1iLmdQdShiKSxkPWQuZ20oZCkscz10LkYscT10Lk4scD10LlEs
-bz1wLkMoIn4oMSk/Iiksbj10LloscD1wLmM7ZC5GKCk7KXttPWQuZ2woKQpsPWRvY3VtZW50CnI9bC5j
-cmVhdGVFbGVtZW50KCJwIikKaz0kLnlQKCkKay5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxkKGwu
-Y3JlYXRlVGV4dE5vZGUoSC5FaihtLmEpKyI6IikpCmo9bC5jcmVhdGVFbGVtZW50KCJ1bCIpCmsuYXBw
-ZW5kQ2hpbGQoaikKZm9yKG09Si5JVChtLmIpO20uRigpOyl7az1tLmdsKCkKaT1sLmNyZWF0ZUVsZW1l
-bnQoImxpIikKai5hcHBlbmRDaGlsZChpKQpKLmRSKGkpLmkoMCwiZWRpdCIpCmg9bC5jcmVhdGVFbGVt
-ZW50KCJhIikKaS5hcHBlbmRDaGlsZChoKQpoLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmc9ay5j
-CmY9SC5FaihnKQpoLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGgpKS5PVSgi
-b2Zmc2V0IiksZikKZT1rLmEKZj1ILkVqKGUpCmguc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
-bmV3IFcuaTcoaCkpLk9VKCJsaW5lIiksZikKaC5hcHBlbmRDaGlsZChsLmNyZWF0ZVRleHROb2RlKCJs
-aW5lICIrSC5FaihlKSkpCmY9cy5hKHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKZi50b1N0cmluZwpo
-LnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChmLFAuRUYoWyJsaW5lIixILkVqKGUpLCJvZmZzZXQiLEgu
-RWooZyldLHEscSkpKQpmPW8uYShuZXcgTC5FRShnLGUsYSkpCm4uYShudWxsKQpXLkpFKGgsImNsaWNr
-IixmLCExLHApCmkuYXBwZW5kQ2hpbGQobC5jcmVhdGVUZXh0Tm9kZSgiOiAiK0guRWooay5iKSkpfX1p
-ZihjKUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxPVAuaEsoQy5FeC5nRHIo
-dC5GLmEod2luZG93LmxvY2F0aW9uKSkrSC5FaihhKSkscD1QLkZsKHQuTix0LmRrKQppZihiIT1udWxs
-KXAuWTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxsKXAuWTUoMCwibGluZSIsSC5FaihjKSkK
-cC5ZNSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAscCkKcD13aW5kb3cuaGlzdG9yeQpzPXQu
-egpyPXEuZ25EKCkKcC5wdXNoU3RhdGUobmV3IFAuQmYoW10sW10pLlB2KFAuRmwocyxzKSksIiIscil9
-LApFbjpmdW5jdGlvbihhKXt2YXIgcyxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4
-dENvbnRlbnQKci50b1N0cmluZwpzPXIrIi8iCmlmKEMueEIubihhLHMpKXJldHVybiBDLnhCLnluKGEs
-cy5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApPdDpmdW5jdGlvbihhKXtzd2l0Y2goYS5yKXtjYXNlIEMu
-Y3c6YnJlYWsKY2FzZSBDLldEOmEucj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApicmVhawpj
-YXNlIEMuZGM6dGhyb3cgSC5iKFAuUFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90IGhhdmUg
-aW5kZXRlcm1pbmF0ZSBtaWdyYXRpb24gc3RhdHVzIikpCmRlZmF1bHQ6YnJlYWt9fSwKdGE6ZnVuY3Rp
-b24oYSxiKXt2YXIgcyxyPSJjaGVja19ib3giLHE9InRpdGxlIixwPSJvcHRlZC1vdXQiLG89Im1pZ3Jh
-dGluZyIKc3dpdGNoKGIpe2Nhc2UgQy5jdzphLmlubmVyVGV4dD1yCnM9Si5ZRShhKQpzLmdQKGEpLmko
-MCwiYWxyZWFkeS1taWdyYXRlZCIpCnMuZ1AoYSkuaSgwLCJkaXNhYmxlZCIpCmEuc2V0QXR0cmlidXRl
-KHEsIkFscmVhZHkgbWlncmF0ZWQiKQpicmVhawpjYXNlIEMuV0Q6YS5pbm5lclRleHQ9cgpzPUouWUUo
-YSkKcy5nUChhKS5SKDAscCkKcy5nUChhKS5pKDAsbykKYS5zZXRBdHRyaWJ1dGUocSwiTWlncmF0aW5n
-IHRvIG51bGwgc2FmZXR5IikKYnJlYWsKY2FzZSBDLlhqOmEuaW5uZXJUZXh0PSJjaGVja19ib3hfb3V0
-bGluZV9ibGFuayIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0
-cmlidXRlKHEsIk9wdGluZyBvdXQgb2YgbnVsbCBzYWZldHkiKQpicmVhawpkZWZhdWx0OmEuaW5uZXJU
-ZXh0PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1Ao
-YSkuaSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk1peGVkIHN0YXR1c2VzIG9mICdtaWdyYXRpbmcnIGFu
-ZCAnb3B0aW5nIG91dCciKQpicmVha319LAp4bjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9ImRpc2FibGVk
-IixxPWIuZ0woKQpMLnRhKGEscSkKaWYoYi5jPT09JC5EOSgpLmlubmVyVGV4dCl7aWYoYiBpbnN0YW5j
-ZW9mIEwuY0Qpe3M9Yi54CnMudG9TdHJpbmcKcz0hc31lbHNlIHM9ITEKaWYocyl7YS50b1N0cmluZwpK
-LmRSKGEpLmkoMCxyKX1lbHNle2EudG9TdHJpbmcKSi5kUihhKS5SKDAscil9TC50YSgkLmMwKCkscSl9
-fSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD17fQpwLmE9YQphPUwuRW4oYSkKcC5hPWEKcz0k
-LkQ5KCkKcy50b1N0cmluZwpKLmRyKHMsYSkKcz1kb2N1bWVudApyPXQuaApILkRoKHIsciwiVCIsInF1
-ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAu
-bmF2LWxpbmsiKSx0LlUpCnMuSyhzLG5ldyBMLlZTKHApKQpzPSQuSVIKcT1zPT1udWxsP251bGw6TC55
-dyhzLHAuYSkKaWYocT09bnVsbCl7cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLlIoMCwidmlzaWJs
-ZSIpfWVsc2V7cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLmkoMCwidmlzaWJsZSIpCkwudGEoJC5j
-MCgpLHEuZ0woKSl9fSwKQVI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9Yi5iCmlmKHE9PT0kKXE9SC52
-KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iKSkKaWYocSE9
-bnVsbCl7cz10LmgKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50Tm9kZSkKTC54bihyLnF1ZXJ5
-U2VsZWN0b3IoIjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIocixxKX19LApiTDpmdW5jdGlv
-bihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9IjpzY29wZSA+IC5zdGF0dXMtaWNvbiIKZm9yKHM9Yi5k
-LHI9cy5sZW5ndGgscT10LmgscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwr
-K3Ape289c1twXQphLnRvU3RyaW5nCm49by5jCm4udG9TdHJpbmcKbT1hLnF1ZXJ5U2VsZWN0b3IoJ1tk
-YXRhLW5hbWUqPSInK1cuTGoobikrJyJdJykKaWYobyBpbnN0YW5jZW9mIEwudnQpe0wuYkwobSxvKQpM
-LnhuKG0ucXVlcnlTZWxlY3RvcihsKSxiKX1lbHNlIEwueG4ocS5hKG0ucGFyZW50Tm9kZSkucXVlcnlT
-ZWxlY3RvcihsKSxvKX19LApCRTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Ii5yZWdpb25zIixyPWRvY3Vt
-ZW50LHE9ci5xdWVyeVNlbGVjdG9yKHMpCnEudG9TdHJpbmcKcj1yLnF1ZXJ5U2VsZWN0b3IoIi5jb2Rl
-IikKci50b1N0cmluZwpKLnRIKHEsYi5hLCQuS0coKSkKSi50SChyLGIuYiwkLktHKCkpCkwuTEgoYSxi
-LmQsYykKaWYoYi5jLmxlbmd0aDwyZTUpTC52VSgpCkwueVgoIi5jb2RlIiwhMCkKTC55WChzLCEwKX0s
-CnRYOmZ1bmN0aW9uKGEwLGExLGEyKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD0i
-bWF0ZXJpYWwtaWNvbnMiLGM9InN0YXR1cy1pY29uIixiPWRvY3VtZW50LGE9Yi5jcmVhdGVFbGVtZW50
-KCJ1bCIpCmEwLmFwcGVuZENoaWxkKGEpCmZvcihzPWExLmxlbmd0aCxyPXQuTixxPXQuWixwPTA7cDxh
-MS5sZW5ndGg7YTEubGVuZ3RoPT09c3x8KDAsSC5saykoYTEpLCsrcCl7bz1hMVtwXQpuPWIuY3JlYXRl
-RWxlbWVudCgibGkiKQphLmFwcGVuZENoaWxkKG4pCmlmKG8gaW5zdGFuY2VvZiBMLnZ0KXttPUouWUUo
-bikKbS5nUChuKS5pKDAsImRpciIpCmw9by5jCmwudG9TdHJpbmcKbi5zZXRBdHRyaWJ1dGUoImRhdGEt
-IituZXcgVy5TeShuZXcgVy5pNyhuKSkuT1UoIm5hbWUiKSxsKQprPWIuY3JlYXRlRWxlbWVudCgic3Bh
-biIpCm4uYXBwZW5kQ2hpbGQoaykKbD1KLllFKGspCmwuZ1AoaykuaSgwLCJhcnJvdyIpCmwuc2hmKGss
-IiYjeDI1QkM7IikKaj1iLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpKLmRSKGopLmkoMCxkKQpqLmlubmVy
-VGV4dD0iZm9sZGVyX29wZW4iCm4uYXBwZW5kQ2hpbGQoaikKbD1vLmEKbC50b1N0cmluZwpuLmFwcGVu
-ZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUobCkpCmw9by5kCmwudG9TdHJpbmcKTC50WChuLGwsITApCmk9
-Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbD1KLllFKGkpCmwuZ1AoaSkuaSgwLGQpCmkuaW5uZXJUZXh0
-PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIKbC5nUChpKS5pKDAsYykKTC54bihpLG8pCmw9bC5nVmwo
-aSkKaD1sLiR0aQpnPWguQygifigxKT8iKS5hKG5ldyBMLlREKG8sbixpKSkKcS5hKG51bGwpClcuSkUo
-bC5hLGwuYixnLCExLGguYykKbS5tSyhuLGksaikKTC5reihrKX1lbHNlIGlmKG8gaW5zdGFuY2VvZiBM
-LmNEKXtpPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCm09Si5ZRShpKQptLmdQKGkpLmkoMCxkKQppLmlu
-bmVyVGV4dD0iIgptLmdQKGkpLmkoMCxjKQpsPW8ueApsLnRvU3RyaW5nCmg9IWwKaWYoaCltLmdQKGkp
-LmkoMCwiZGlzYWJsZWQiKQpMLnhuKGksbykKbC50b1N0cmluZwppZihsKXttPW0uZ1ZsKGkpCmw9bS4k
-dGkKaD1sLkMoIn4oMSk/IikuYShuZXcgTC5JZihvLGksbikpCnEuYShudWxsKQpXLkpFKG0uYSxtLmIs
-aCwhMSxsLmMpfW4uYXBwZW5kQ2hpbGQoaSkKbT1iLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpKLmRSKG0p
-LmkoMCxkKQptLmlubmVyVGV4dD0iaW5zZXJ0X2RyaXZlX2ZpbGUiCm4uYXBwZW5kQ2hpbGQobSkKZj1i
-LmNyZWF0ZUVsZW1lbnQoImEiKQpuLmFwcGVuZENoaWxkKGYpCm09Si5ZRShmKQptLmdQKGYpLmkoMCwi
-bmF2LWxpbmsiKQpsPW8uYwpsLnRvU3RyaW5nCmYuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
-bmV3IFcuaTcoZikpLk9VKCJuYW1lIiksbCkKbD1vLmQKbC50b1N0cmluZwpmLnNldEF0dHJpYnV0ZSgi
-aHJlZiIsTC5RNChsLFAuRmwocixyKSkpCmw9by5hCmwudG9TdHJpbmcKZi5hcHBlbmRDaGlsZChiLmNy
-ZWF0ZVRleHROb2RlKGwpKQptPW0uZ1ZsKGYpCmw9bS4kdGkKaD1sLkMoIn4oMSk/IikuYShuZXcgTC50
-QigpKQpxLmEobnVsbCkKVy5KRShtLmEsbS5iLGgsITEsbC5jKQpsPW8uZQpsLnRvU3RyaW5nCmlmKGw+
-MCl7ZT1iLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLmFwcGVuZENoaWxkKGUpCkouZFIoZSkuaSgwLCJl
-ZGl0LWNvdW50IikKbT0iIitsKyIgIgppZihsPT09MSloPSJwcm9wb3NlZCBlZGl0IgplbHNlIGg9InBy
-b3Bvc2VkIGVkaXRzIgplLnNldEF0dHJpYnV0ZSgidGl0bGUiLG0raCkKZS5hcHBlbmRDaGlsZChiLmNy
-ZWF0ZVRleHROb2RlKEMuam4udyhsKSkpfX19fSwKdXo6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWRvY3Vt
-ZW50LHI9cy5jcmVhdGVFbGVtZW50KCJidXR0b24iKSxxPXQuUSxwPXEuQygifigxKT8iKS5hKG5ldyBM
-Lm0yKGEsYykpCnQuWi5hKG51bGwpClcuSkUociwiY2xpY2siLHAsITEscS5jKQpxPVIuT1goYS5hKQpx
-LnRvU3RyaW5nCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZShxKSkKYi5hcHBlbmRDaGlsZChy
-KX0sCkZ6OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoPWEuYQppZihoPT1u
-dWxsKXJldHVybgpiLnRvU3RyaW5nCnM9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAiKQpxPWIu
-YXBwZW5kQ2hpbGQocikKcj1zLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpwPXQucwpKLk11KHIsSC5RSShb
-InR5cGUtZGVzY3JpcHRpb24iXSxwKSkKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJBY3Rp
-b25zIikpCnEuYXBwZW5kQ2hpbGQocikKcS5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCI6Iikp
-Cm89cy5jcmVhdGVFbGVtZW50KCJwIikKYi5hcHBlbmRDaGlsZChvKQpmb3Iocj1oLmxlbmd0aCxuPXQu
-TyxtPTA7bTxoLmxlbmd0aDtoLmxlbmd0aD09PXJ8fCgwLEgubGspKGgpLCsrbSl7bD1oW21dCms9cy5j
-cmVhdGVFbGVtZW50KCJhIikKby5hcHBlbmRDaGlsZChrKQpqPWwuYQpqLnRvU3RyaW5nCmsuYXBwZW5k
-Q2hpbGQocy5jcmVhdGVUZXh0Tm9kZShqKSkKaj1sLmIKai50b1N0cmluZwprLnNldEF0dHJpYnV0ZSgi
-aHJlZiIsaikKaj1uLmEoSC5RSShbImFkZC1oaW50LWxpbmsiLCJiZWZvcmUtYXBwbHkiLCJidXR0b24i
-XSxwKSkKaT1KLmRSKGspCmkuVjEoMCkKaS5GVigwLGopfX0sCkNDOmZ1bmN0aW9uKGE0LGE1LGE2KXt2
-YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYSxhMCxhMSxhMixhMwpmb3Iocz1h
-NC5mLHI9cy5sZW5ndGgscT10LnMscD10Lk8sbz0wO288cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxI
-LmxrKShzKSwrK28pe249c1tvXQphNS50b1N0cmluZwptPWRvY3VtZW50Cmw9bS5jcmVhdGVFbGVtZW50
-KCJwIikKaz1wLmEoSC5RSShbInRyYWNlIl0scSkpCmo9Si5kUihsKQpqLlYxKDApCmouRlYoMCxrKQpp
-PWE1LmFwcGVuZENoaWxkKGwpCmw9bS5jcmVhdGVFbGVtZW50KCJzcGFuIikKaz1wLmEoSC5RSShbInR5
-cGUtZGVzY3JpcHRpb24iXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5GVigwLGspCms9bi5hCmsudG9T
-dHJpbmcKbC5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKGspKQppLmFwcGVuZENoaWxkKGwpCmku
-YXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiOiIpKQpsPW0uY3JlYXRlRWxlbWVudCgidWwiKQpr
-PXAuYShILlFJKFsidHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5GVigwLGspCmg9aS5hcHBl
-bmRDaGlsZChsKQpmb3IobD1uLmIsaz1sLmxlbmd0aCxnPTA7ZzxsLmxlbmd0aDtsLmxlbmd0aD09PWt8
-fCgwLEgubGspKGwpLCsrZyl7Zj1sW2ddCmU9bS5jcmVhdGVFbGVtZW50KCJsaSIpCmguYXBwZW5kQ2hp
-bGQoZSkKZD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpjPXAuYShILlFJKFsiZnVuY3Rpb24iXSxxKSkK
-aj1KLmRSKGQpCmouVjEoMCkKai5GVigwLGMpCmM9Zi5iCkwuV2ooZCxjPT1udWxsPyJ1bmtub3duIjpj
-KQplLmFwcGVuZENoaWxkKGQpCmI9Zi5jCmlmKGIhPW51bGwpe2UuYXBwZW5kQ2hpbGQobS5jcmVhdGVU
-ZXh0Tm9kZSgiICgiKSkKYT1iLmIKYTA9bS5jcmVhdGVFbGVtZW50KCJhIikKYTAuYXBwZW5kQ2hpbGQo
-bS5jcmVhdGVUZXh0Tm9kZShILkVqKGIuYykrIjoiK0guRWooYSkpKQpkPWIuYQpkLnRvU3RyaW5nCmEw
-LnNldEF0dHJpYnV0ZSgiaHJlZiIsZCkKYTAuY2xhc3NMaXN0LmFkZCgibmF2LWxpbmsiKQplLmFwcGVu
-ZENoaWxkKGEwKQplLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIikiKSl9ZS5hcHBlbmRDaGls
-ZChtLmNyZWF0ZVRleHROb2RlKCI6ICIpKQpkPWYuYQpMLldqKGUsZD09bnVsbD8idW5rbm93biI6ZCkK
-ZD1mLmQKaWYoZC5sZW5ndGghPT0wKXtjPW0uY3JlYXRlRWxlbWVudCgicCIpCmExPXAuYShILlFJKFsi
-ZHJhd2VyIiwiYmVmb3JlLWFwcGx5Il0scSkpCmo9Si5kUihjKQpqLlYxKDApCmouRlYoMCxhMSkKYTI9
-ZS5hcHBlbmRDaGlsZChjKQpmb3IoYz1kLmxlbmd0aCxhMz0wO2EzPGQubGVuZ3RoO2QubGVuZ3RoPT09
-Y3x8KDAsSC5saykoZCksKythMylMLnV6KGRbYTNdLGEyLGIpfX19fSwKVXM6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEMueEIudGcoYSwiPyIpP0MueEIuTmooYSwwLEMueEIuT1koYSwiPyIpKTphfSwKVEc6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gbmV3IEwuUVcoYSxiKX0sCnl3OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAs
-bwpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsr
-cil7cT1hW3JdCmlmKHEgaW5zdGFuY2VvZiBMLnZ0KXtwPXEuZApwLnRvU3RyaW5nCm89TC55dyhwLGIp
-CmlmKG8hPW51bGwpcmV0dXJuIG99ZWxzZSBpZihxLmM9PT1iKXJldHVybiBxfXJldHVybiBudWxsfSwK
-V2o6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD1ILlFJKGIuc3BsaXQoIi4iKSx0LnMpLG89Qy5ObS5n
-dEgocCksbj1kb2N1bWVudAphLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUobykpCmZvcihvPUgu
-cUMocCwxLG51bGwsdC5OKSxzPW8uJHRpLG89bmV3IEguYTcobyxvLmdBKG8pLHMuQygiYTc8YUwuRT4i
-KSkscz1zLkMoImFMLkUiKSxyPUouWUUoYSk7by5GKCk7KXtxPXMuYShvLmQpCnIubnooYSwiYmVmb3Jl
-ZW5kIiwiJiM4MjAzOy4iLG51bGwsbnVsbCkKYS5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKHEp
-KX19LAplOmZ1bmN0aW9uIGUoKXt9LApWVzpmdW5jdGlvbiBWVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
-PWIKdGhpcy5jPWN9LApvWjpmdW5jdGlvbiBvWigpe30sCmpyOmZ1bmN0aW9uIGpyKCl7fSwKcWw6ZnVu
-Y3Rpb24gcWwoKXt9LAp5ODpmdW5jdGlvbiB5OCgpe30sCkhpOmZ1bmN0aW9uIEhpKCl7fSwKQlQ6ZnVu
-Y3Rpb24gQlQoKXt9LApQWTpmdW5jdGlvbiBQWSgpe30sCkw6ZnVuY3Rpb24gTCgpe30sCld4OmZ1bmN0
-aW9uIFd4KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBTzpmdW5jdGlvbiBBTyhhKXt0aGlzLmE9YX0s
-CmROOmZ1bmN0aW9uIGROKGEpe3RoaXMuYT1hfSwKSG86ZnVuY3Rpb24gSG8oYSl7dGhpcy5hPWF9LAp4
-ejpmdW5jdGlvbiB4eihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSUM6ZnVuY3Rpb24gSUMoKXt9LApm
-QzpmdW5jdGlvbiBmQyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVG06ZnVuY3Rpb24gVG0oKXt9LApu
-VDpmdW5jdGlvbiBuVChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApOWTpmdW5jdGlv
-biBOWShhKXt0aGlzLmE9YX0sCnVlOmZ1bmN0aW9uIHVlKCl7fSwKR0g6ZnVuY3Rpb24gR0goKXt9LApF
-RTpmdW5jdGlvbiBFRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApRTDpmdW5jdGlv
-biBRTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVlM6ZnVuY3Rpb24gVlMoYSl7dGhpcy5hPWF9LApU
-RDpmdW5jdGlvbiBURChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApJZjpmdW5jdGlv
-biBJZihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp0QjpmdW5jdGlvbiB0Qigpe30s
-Cm0yOmZ1bmN0aW9uIG0yKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApRVzpmdW5jdGlvbiBRVyhhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKWEE6ZnVuY3Rpb24gWEEoKXt9LApaczpmdW5jdGlvbihhKXt2YXIg
-cyxyLHE9Si5VNihhKQppZihMLnAyKEguayhxLnEoYSwidHlwZSIpKSk9PT1DLlkyKXtzPUguayhxLnEo
-YSwibmFtZSIpKQpyPUguayhxLnEoYSwicGF0aCIpKQpxPXEucShhLCJzdWJ0cmVlIikKcT1uZXcgTC52
-dChxPT1udWxsP251bGw6TC5tSyhxKSxzLHIpCnEuTFYoKQpyZXR1cm4gcX1lbHNle3M9SC5rKHEucShh
-LCJuYW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnJldHVybiBuZXcgTC5jRChILmsocS5xKGEsImhy
-ZWYiKSksSC5VYyhxLnEoYSwiZWRpdENvdW50IikpLEguTTQocS5xKGEsIndhc0V4cGxpY2l0bHlPcHRl
-ZE91dCIpKSxMLnZCKEguVWMocS5xKGEsIm1pZ3JhdGlvblN0YXR1cyIpKSksSC5NNChxLnEoYSwibWln
-cmF0aW9uU3RhdHVzQ2FuQmVDaGFuZ2VkIikpLHMscil9fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHMscj1I
-LlFJKFtdLHQuZmgpCmZvcihzPUouSVQodC5SLmEoYSkpO3MuRigpOylyLnB1c2goTC5acyhzLmdsKCkp
-KQpyZXR1cm4gcn0sClZEOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1ILlFJKFtdLHQuZCkKZm9yKHM9YS5s
-ZW5ndGgscj0wO3I8YS5sZW5ndGg7YS5sZW5ndGg9PT1zfHwoMCxILmxrKShhKSwrK3IpcS5wdXNoKGFb
-cl0uTHQoKSkKcmV0dXJuIHF9LAp2QjpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBudWxsCmlm
-KGE+Pj4wIT09YXx8YT49NClyZXR1cm4gSC5PSChDLmwwLGEpCnJldHVybiBDLmwwW2FdfSwKcDI6ZnVu
-Y3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZpbGUiOnJl
-dHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRy
-ZWUgbm9kZSB0eXBlOiAiK0guRWooYSkpKX19LAp2dDpmdW5jdGlvbiB2dChhLGIsYyl7dmFyIF89dGhp
-cwpfLmQ9YQpfLmE9YgpfLmI9JApfLmM9Y30sCmNEOmZ1bmN0aW9uIGNEKGEsYixjLGQsZSxmLGcpe3Zh
-ciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWQKXy54PWUKXy5hPWYKXy5iPSQKXy5jPWd9LApE
-ODpmdW5jdGlvbiBEOCgpe30sCk85OmZ1bmN0aW9uIE85KGEpe3RoaXMuYj1hfSwKR2I6ZnVuY3Rpb24g
-R2IoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCklWOmZ1bmN0aW9uIElWKGEsYixjLGQpe3ZhciBfPXRo
-aXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxNPXsKWUY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEs
-cCxvLG4sbSxsCmZvcihzPWIubGVuZ3RoLHI9MTtyPHM7KytyKXtpZihiW3JdPT1udWxsfHxiW3ItMV0h
-PW51bGwpY29udGludWUKZm9yKDtzPj0xO3M9cSl7cT1zLTEKaWYoYltxXSE9bnVsbClicmVha31wPW5l
-dyBQLk0oIiIpCm89IiIrKGErIigiKQpwLmE9bwpuPUgudDYoYikKbT1uLkMoIm5IPDE+IikKbD1uZXcg
-SC5uSChiLDAscyxtKQpsLkhkKGIsMCxzLG4uYykKbT1vK25ldyBILmxKKGwsbS5DKCJxVShhTC5FKSIp
-LmEobmV3IE0uTm8oKSksbS5DKCJsSjxhTC5FLHFVPiIpKS5rKDAsIiwgIikKcC5hPW0KcC5hPW0rKCIp
-OiBwYXJ0ICIrKHItMSkrIiB3YXMgbnVsbCwgYnV0IHBhcnQgIityKyIgd2FzIG5vdC4iKQp0aHJvdyBI
-LmIoUC54WShwLncoMCkpKX19LApsSTpmdW5jdGlvbiBsSShhKXt0aGlzLmE9YX0sCnE3OmZ1bmN0aW9u
-IHE3KCl7fSwKTm86ZnVuY3Rpb24gTm8oKXt9fSxPPXsKUmg6ZnVuY3Rpb24oKXt2YXIgcyxyPW51bGwK
-aWYoUC51bygpLmdGaSgpIT09ImZpbGUiKXJldHVybiAkLkViKCkKcz1QLnVvKCkKaWYoIUMueEIuVGMo
-cy5nSWkocyksIi8iKSlyZXR1cm4gJC5FYigpCmlmKFAuS0wociwiYS9iIixyLHIscixyLHIpLnQ0KCk9
-PT0iYVxcYiIpcmV0dXJuICQuS2soKQpyZXR1cm4gJC5iRCgpfSwKekw6ZnVuY3Rpb24gekwoKXt9fSxQ
-PXsKT2o6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9e30KaWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVs
-bClyZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRpb25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVu
-dCE9bnVsbCl7cz1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCnI9c2VsZi5kb2N1bWVu
-dC5jcmVhdGVFbGVtZW50KCJzcGFuIikKcS5hPW51bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihI
-LnRSKG5ldyBQLnRoKHEpLDEpKS5vYnNlcnZlKHMse2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQ
-LmhhKHEscyxyKX1lbHNlIGlmKHNlbGYuc2V0SW1tZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0
-dXJuIFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3NlbGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcg
-UC5Wcyh0Lk0uYShhKSksMCkpfSwKb0E6ZnVuY3Rpb24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50Uihu
-ZXcgUC5GdCh0Lk0uYShhKSksMCkpfSwKQno6ZnVuY3Rpb24oYSl7dC5NLmEoYSkKUC5RTigwLGEpfSwK
-UU46ZnVuY3Rpb24oYSxiKXt2YXIgcz1uZXcgUC5XMygpCnMuQ1koYSxiKQpyZXR1cm4gc30sCkZYOmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcgUC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJp
-aDwwPiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4kMigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwK
-alE6ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYz
-OmZ1bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgudHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIg
-cyxyLHE9bmV3IFAuV00oYikscD1uZXcgUC5TWChiKQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHEs
-cCx0LnopCmVsc2V7cz10LnoKaWYodC5pLmIoYSkpYS5TcShxLHAscykKZWxzZXtyPW5ldyBQLnZzKCQu
-WDMsdC5jKQpyLmE9NApyLmM9YQpyLlFkKHEscCxzKX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHM9ZnVu
-Y3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9
-Y2F0Y2gocil7ZT1yCmQ9Y319fShhLDEpCnJldHVybiAkLlgzLkxqKG5ldyBQLkdzKHMpLHQuSCx0LlMs
-dC56KX0sCkdROmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5GeShhLDEpfSwKVGg6ZnVuY3Rpb24oKXty
-ZXR1cm4gQy53UX0sClltOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5GeShhLDMpfSwKbDA6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gbmV3IFAucTQoYSxiLkMoInE0PDA+IikpfSwKVGw6ZnVuY3Rpb24oYSxiKXt2
-YXIgcz1ILmNiKGEsImVycm9yIix0LkspCnJldHVybiBuZXcgUC5DdyhzLGI9PW51bGw/UC52MChhKTpi
-KX0sCnYwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQubS5iKGEpKXtzPWEuZ0lJKCkKaWYocyE9bnVsbCly
-ZXR1cm4gc31yZXR1cm4gQy5wZH0sCkE5OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmZvcihzPXQuYzty
-PWEuYSxyPT09MjspYT1zLmEoYS5jKQppZihyPj00KXtxPWIuYWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5I
-WihiLHEpfWVsc2V7cT10LmUuYShiLmMpCmIuYT0yCmIuYz1hCmEualEocSl9fSwKSFo6ZnVuY3Rpb24o
-YSxhMCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz17fSxiPWMuYT1hCmZvcihz
-PXQubixyPXQuZSxxPXQuaTshMDspe3A9e30Kbz1iLmE9PT04CmlmKGEwPT1udWxsKXtpZihvKXtuPXMu
-YShiLmMpClAuU2kobi5hLG4uYil9cmV0dXJufXAuYT1hMAptPWEwLmEKZm9yKGI9YTA7bSE9bnVsbDti
-PW0sbT1sKXtiLmE9bnVsbApQLkhaKGMuYSxiKQpwLmE9bQpsPW0uYX1rPWMuYQpqPWsuYwpwLmI9bwpw
-LmM9agppPSFvCmlmKGkpe2g9Yi5jCmg9KGgmMSkhPT0wfHwoaCYxNSk9PT04fWVsc2UgaD0hMAppZiho
-KXtnPWIuYi5iCmlmKG8pe2s9ay5iPT09ZwprPSEoa3x8ayl9ZWxzZSBrPSExCmlmKGspe3MuYShqKQpQ
-LlNpKGouYSxqLmIpCnJldHVybn1mPSQuWDMKaWYoZiE9PWcpJC5YMz1nCmVsc2UgZj1udWxsCmI9Yi5j
-CmlmKChiJjE1KT09PTgpbmV3IFAuUlQocCxjLG8pLiQwKCkKZWxzZSBpZihpKXtpZigoYiYxKSE9PTAp
-bmV3IFAucnEocCxqKS4kMCgpfWVsc2UgaWYoKGImMikhPT0wKW5ldyBQLlJXKGMscCkuJDAoKQppZihm
-IT1udWxsKSQuWDM9ZgpiPXAuYwppZihxLmIoYikpe2s9cC5hLiR0aQprPWsuQygiYjg8Mj4iKS5iKGIp
-fHwhay5RWzFdLmIoYil9ZWxzZSBrPSExCmlmKGspe3EuYShiKQplPXAuYS5iCmlmKGIuYT49NCl7ZD1y
-LmEoZS5jKQplLmM9bnVsbAphMD1lLk44KGQpCmUuYT1iLmEKZS5jPWIuYwpjLmE9Ygpjb250aW51ZX1l
-bHNlIFAuQTkoYixlKQpyZXR1cm59fWU9cC5hLmIKZD1yLmEoZS5jKQplLmM9bnVsbAphMD1lLk44KGQp
-CmI9cC5iCms9cC5jCmlmKCFiKXtlLiR0aS5jLmEoaykKZS5hPTQKZS5jPWt9ZWxzZXtzLmEoaykKZS5h
-PTgKZS5jPWt9Yy5hPWUKYj1lfX0sClZIOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYodC5hZy5iKGEpKXJl
-dHVybiBiLkxqKGEsdC56LHQuSyx0LmwpCnM9dC5iSQppZihzLmIoYSkpcmV0dXJuIHMuYShhKQp0aHJv
-dyBILmIoUC5MMyhhLCJvbkVycm9yIiwiRXJyb3IgaGFuZGxlciBtdXN0IGFjY2VwdCBvbmUgT2JqZWN0
-IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4gYSB2
-YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigpe3ZhciBzLHIKZm9yKHM9JC5TNjtzIT1udWxsO3M9
-JC5TNil7JC5tZz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxsKSQuazg9bnVsbApzLmEuJDAoKX19
-LAplTjpmdW5jdGlvbigpeyQuVUQ9ITAKdHJ5e1AucHUoKX1maW5hbGx5eyQubWc9bnVsbAokLlVEPSEx
-CmlmKCQuUzYhPW51bGwpJC51dCgpLiQxKFAuVUkoKSl9fSwKZVc6ZnVuY3Rpb24oYSl7dmFyIHM9bmV3
+ZS4kMCgpfWVsc2V7YS50b1N0cmluZwpMLkc3KGEsYixjLGQsZSl9fSwKUTQoYSxiKXt2YXIgcyxyLHE9
+UC5oSyhhKSxwPVAuRmwodC5OLHQuZGspCmZvcihzPXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7
+cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5hLHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3Mu
+RigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxyLmIpfXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJl
+dHVybiBxLm5tKDAscCkuZ25EKCl9LApUMShhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPSQuaEwo
+KQppLnRvU3RyaW5nCkoubDUoaSwiIikKaWYoYT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50
+KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQu
+c1AocyxILlFJKFsicGxhY2Vob2xkZXIiXSx0LnMpKQppLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykK
+cmV0dXJufXI9YS5kCnIudG9TdHJpbmcKcT0kLm5VKCkKcD1xLnpmKHIpCm89YS5iCm49ZG9jdW1lbnQK
+bT1uLnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQKbS50b1N0cmluZwpsPXEuSFAocixD
+LnhCLmJTKG0pKQprPWEuYwpqPW4uY3JlYXRlRWxlbWVudCgicCIpCmkuYXBwZW5kQ2hpbGQoaikKai5h
+cHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobykrIiBhdCAiKSkKcj1hLmUKci50b1N0cmlu
+ZwpxPXQuTgpxPVcuSjYoTC5RNChyLFAuRUYoWyJsaW5lIixKLncoayldLHEscSkpKQpxLmFwcGVuZENo
+aWxkKG4uY3JlYXRlVGV4dE5vZGUobCsiOiIrSC5FaihrKSsiLiIpKQpqLmFwcGVuZENoaWxkKHEpCkou
+ZGgoaikKTC5DQyhhLGkscCkKTC5GeihhLGkpfSwKTEgoYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZSxkPSQueVAoKQpkLnRvU3RyaW5nCkoubDUoZCwiIikKaWYoYi5nQShiKT09PTAp
+e3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAiKQpkLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5k
+Q2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZD1iLmdQ
+dShiKSxkPWQuZ20oZCkscz10LkYscT10Lk4scD10LlEsbz1wLkMoIn4oMSk/Iiksbj10LloscD1wLmM7
+ZC5GKCk7KXttPWQuZ2woKQpsPWRvY3VtZW50CnI9bC5jcmVhdGVFbGVtZW50KCJwIikKaz0kLnlQKCkK
+ay5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxkKGwuY3JlYXRlVGV4dE5vZGUoSC5FaihtLmEpKyI6
+IikpCmo9bC5jcmVhdGVFbGVtZW50KCJ1bCIpCmsuYXBwZW5kQ2hpbGQoaikKZm9yKG09Si5JVChtLmIp
+O20uRigpOyl7az1tLmdsKCkKaT1sLmNyZWF0ZUVsZW1lbnQoImxpIikKai5hcHBlbmRDaGlsZChpKQpK
+LmRSKGkpLmkoMCwiZWRpdCIpCmg9bC5jcmVhdGVFbGVtZW50KCJhIikKaS5hcHBlbmRDaGlsZChoKQpo
+LmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmc9ay5jCmY9SC5FaihnKQpoLnNldEF0dHJpYnV0ZSgi
+ZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGgpKS5PVSgib2Zmc2V0IiksZikKZT1rLmEKZj1ILkVqKGUp
+Cmguc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoaCkpLk9VKCJsaW5lIiksZikK
+aC5hcHBlbmRDaGlsZChsLmNyZWF0ZVRleHROb2RlKCJsaW5lICIrSC5FaihlKSkpCmY9cy5hKHdpbmRv
+dy5sb2NhdGlvbikucGF0aG5hbWUKZi50b1N0cmluZwpoLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChm
+LFAuRUYoWyJsaW5lIixILkVqKGUpLCJvZmZzZXQiLEguRWooZyldLHEscSkpKQpmPW8uYShuZXcgTC5F
+RShnLGUsYSkpCm4uYShudWxsKQpXLkpFKGgsImNsaWNrIixmLCExLHApCmkuYXBwZW5kQ2hpbGQobC5j
+cmVhdGVUZXh0Tm9kZSgiOiAiK0guRWooay5iKSkpfX1pZihjKUwuVDEobnVsbCl9LApGcihhLGIsYyl7
+dmFyIHMscixxPVAuaEsoQy5FeC5nRHIodC5GLmEod2luZG93LmxvY2F0aW9uKSkrSC5FaihhKSkscD1Q
+LkZsKHQuTix0LmRrKQppZihiIT1udWxsKXAuWTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxs
+KXAuWTUoMCwibGluZSIsSC5FaihjKSkKcC5ZNSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAs
+cCkKcD13aW5kb3cuaGlzdG9yeQpzPXQuegpyPXEuZ25EKCkKcC5wdXNoU3RhdGUobmV3IFAuQmYoW10s
+W10pLlB2KFAuRmwocyxzKSksIiIscil9LApFbihhKXt2YXIgcyxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0
+b3IoIi5yb290IikudGV4dENvbnRlbnQKci50b1N0cmluZwpzPXIrIi8iCmlmKEMueEIubihhLHMpKXJl
+dHVybiBDLnhCLnluKGEscy5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApPdChhKXtzd2l0Y2goYS5yKXtj
+YXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOmEucj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApi
+cmVhawpjYXNlIEMuZGM6dGhyb3cgSC5iKFAuUFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90
+IGhhdmUgaW5kZXRlcm1pbmF0ZSBtaWdyYXRpb24gc3RhdHVzIikpCmRlZmF1bHQ6YnJlYWt9fSwKdGEo
+YSxiKXt2YXIgcyxyPSJjaGVja19ib3giLHE9InRpdGxlIixwPSJvcHRlZC1vdXQiLG89Im1pZ3JhdGlu
+ZyIKc3dpdGNoKGIpe2Nhc2UgQy5jdzphLmlubmVyVGV4dD1yCnM9Si5ZRShhKQpzLmdQKGEpLmkoMCwi
+YWxyZWFkeS1taWdyYXRlZCIpCnMuZ1AoYSkuaSgwLCJkaXNhYmxlZCIpCmEuc2V0QXR0cmlidXRlKHEs
+IkFscmVhZHkgbWlncmF0ZWQiKQpicmVhawpjYXNlIEMuV0Q6YS5pbm5lclRleHQ9cgpzPUouWUUoYSkK
+cy5nUChhKS5SKDAscCkKcy5nUChhKS5pKDAsbykKYS5zZXRBdHRyaWJ1dGUocSwiTWlncmF0aW5nIHRv
+IG51bGwgc2FmZXR5IikKYnJlYWsKY2FzZSBDLlhqOmEuaW5uZXJUZXh0PSJjaGVja19ib3hfb3V0bGlu
+ZV9ibGFuayIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmli
+dXRlKHEsIk9wdGluZyBvdXQgb2YgbnVsbCBzYWZldHkiKQpicmVhawpkZWZhdWx0OmEuaW5uZXJUZXh0
+PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSku
+aSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk1peGVkIHN0YXR1c2VzIG9mICdtaWdyYXRpbmcnIGFuZCAn
+b3B0aW5nIG91dCciKQpicmVha319LAp4bihhLGIpe3ZhciBzLHI9ImRpc2FibGVkIixxPWIuZ0woKQpM
+LnRhKGEscSkKaWYoYi5jPT09JC5EOSgpLmlubmVyVGV4dCl7aWYoYiBpbnN0YW5jZW9mIEwuY0Qpe3M9
+Yi54CnMudG9TdHJpbmcKcz0hc31lbHNlIHM9ITEKaWYocyl7YS50b1N0cmluZwpKLmRSKGEpLmkoMCxy
+KX1lbHNle2EudG9TdHJpbmcKSi5kUihhKS5SKDAscil9TC50YSgkLmMwKCkscSl9fSwKQlgoYSxiKXt2
+YXIgcyxyLHEscD17fQpwLmE9YQphPUwuRW4oYSkKcC5hPWEKcz0kLkQ5KCkKcy50b1N0cmluZwpKLmRy
+KHMsYSkKcz1kb2N1bWVudApyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5l
+dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlUpCnMuSyhz
+LG5ldyBMLlZTKHApKQpzPSQuSVIKcT1zPT1udWxsP251bGw6TC55dyhzLHAuYSkKaWYocT09bnVsbCl7
+cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLlIoMCwidmlzaWJsZSIpfWVsc2V7cD0kLmJOKCkKcC50
+b1N0cmluZwpKLmRSKHApLmkoMCwidmlzaWJsZSIpCkwudGEoJC5jMCgpLHEuZ0woKSl9fSwKQVIoYSxi
+KXt2YXIgcyxyLHE9Yi5iCmlmKHE9PT0kKXE9SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBu
+b3QgYmVlbiBpbml0aWFsaXplZC4iKSkKcz10LmgKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50
+Tm9kZSkKTC54bihyLnF1ZXJ5U2VsZWN0b3IoIjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIo
+cixxKX0sCmJMKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD0iOnNjb3BlID4gLnN0YXR1cy1pY29uIgpm
+b3Iocz1iLmQscj1zLmxlbmd0aCxxPXQuaCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgu
+bGspKHMpLCsrcCl7bz1zW3BdCmEudG9TdHJpbmcKbj1vLmMKbi50b1N0cmluZwptPWEucXVlcnlTZWxl
+Y3RvcignW2RhdGEtbmFtZSo9IicrVy5MaihuKSsnIl0nKQppZihvIGluc3RhbmNlb2YgTC52dCl7TC5i
+TChtLG8pCkwueG4obS5xdWVyeVNlbGVjdG9yKGwpLGIpfWVsc2UgTC54bihxLmEobS5wYXJlbnROb2Rl
+KS5xdWVyeVNlbGVjdG9yKGwpLG8pfX0sCkJFKGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1l
+bnQscT1yLnF1ZXJ5U2VsZWN0b3IocykKcS50b1N0cmluZwpyPXIucXVlcnlTZWxlY3RvcigiLmNvZGUi
+KQpyLnRvU3RyaW5nCkoudEgocSxiLmEsJC5LRygpKQpKLnRIKHIsYi5iLCQuS0coKSkKTC5MSChhLGIu
+ZCxjKQppZihiLmMubGVuZ3RoPDJlNSlMLkdnKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwK
+dFgoYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPSJtYXRlcmlhbC1p
+Y29ucyIsYz0ic3RhdHVzLWljb24iLGI9ZG9jdW1lbnQsYT1iLmNyZWF0ZUVsZW1lbnQoInVsIikKYTAu
+YXBwZW5kQ2hpbGQoYSkKZm9yKHM9YTEubGVuZ3RoLHI9dC5OLHE9dC5aLHA9MDtwPGExLmxlbmd0aDth
+MS5sZW5ndGg9PT1zfHwoMCxILmxrKShhMSksKytwKXtvPWExW3BdCm49Yi5jcmVhdGVFbGVtZW50KCJs
+aSIpCmEuYXBwZW5kQ2hpbGQobikKaWYobyBpbnN0YW5jZW9mIEwudnQpe209Si5ZRShuKQptLmdQKG4p
+LmkoMCwiZGlyIikKbD1vLmMKbC50b1N0cmluZwpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5
+KG5ldyBXLmk3KG4pKS5PVSgibmFtZSIpLGwpCms9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBl
+bmRDaGlsZChrKQpsPUouWUUoaykKbC5nUChrKS5pKDAsImFycm93IikKbC5zaGYoaywiJiN4MjVCQzsi
+KQpqPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIoaikuaSgwLGQpCmouaW5uZXJUZXh0PSJmb2xk
+ZXJfb3BlbiIKbi5hcHBlbmRDaGlsZChqKQpsPW8uYQpsLnRvU3RyaW5nCm4uYXBwZW5kQ2hpbGQoYi5j
+cmVhdGVUZXh0Tm9kZShsKSkKbD1vLmQKbC50b1N0cmluZwpMLnRYKG4sbCwhMCkKaT1iLmNyZWF0ZUVs
+ZW1lbnQoInNwYW4iKQpsPUouWUUoaSkKbC5nUChpKS5pKDAsZCkKaS5pbm5lclRleHQ9ImluZGV0ZXJt
+aW5hdGVfY2hlY2tfYm94IgpsLmdQKGkpLmkoMCxjKQpMLnhuKGksbykKbD1sLmdWbChpKQpoPWwuJHRp
+Cmc9aC5DKCJ+KDEpPyIpLmEobmV3IEwuVEQobyxuLGkpKQpxLmEobnVsbCkKVy5KRShsLmEsbC5iLGcs
+ITEsaC5jKQptLm1LKG4saSxqKQpMLmt6KGspfWVsc2UgaWYobyBpbnN0YW5jZW9mIEwuY0Qpe2k9Yi5j
+cmVhdGVFbGVtZW50KCJzcGFuIikKbT1KLllFKGkpCm0uZ1AoaSkuaSgwLGQpCmkuaW5uZXJUZXh0PSIi
+Cm0uZ1AoaSkuaSgwLGMpCmw9by54CmwudG9TdHJpbmcKaWYoIWwpbS5nUChpKS5pKDAsImRpc2FibGVk
+IikKTC54bihpLG8pCmlmKGwpe209bS5nVmwoaSkKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBM
+LklmKG8saSxuKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCExLGwuYyl9bi5hcHBlbmRDaGlsZChp
+KQptPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIobSkuaSgwLGQpCm0uaW5uZXJUZXh0PSJpbnNl
+cnRfZHJpdmVfZmlsZSIKbi5hcHBlbmRDaGlsZChtKQpmPWIuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBw
+ZW5kQ2hpbGQoZikKbT1KLllFKGYpCm0uZ1AoZikuaSgwLCJuYXYtbGluayIpCmw9by5jCmwudG9TdHJp
+bmcKZi5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhmKSkuT1UoIm5hbWUiKSxs
+KQpsPW8uZApsLnRvU3RyaW5nCmYuc2V0QXR0cmlidXRlKCJocmVmIixMLlE0KGwsUC5GbChyLHIpKSkK
+bD1vLmEKbC50b1N0cmluZwpmLmFwcGVuZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUobCkpCm09bS5nVmwo
+ZikKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBMLnRCKCkpCnEuYShudWxsKQpXLkpFKG0uYSxt
+LmIsaCwhMSxsLmMpCmw9by5lCmwudG9TdHJpbmcKaWYobD4wKXtlPWIuY3JlYXRlRWxlbWVudCgic3Bh
+biIpCm4uYXBwZW5kQ2hpbGQoZSkKSi5kUihlKS5pKDAsImVkaXQtY291bnQiKQptPSIiK2wrIiAiCmlm
+KGw9PT0xKWg9InByb3Bvc2VkIGVkaXQiCmVsc2UgaD0icHJvcG9zZWQgZWRpdHMiCmUuc2V0QXR0cmli
+dXRlKCJ0aXRsZSIsbStoKQplLmFwcGVuZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGwpKSl9
+fX19LAp1eihhLGIsYyl7dmFyIHM9ZG9jdW1lbnQscj1zLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpLHE9
+dC5RLHA9cS5DKCJ+KDEpPyIpLmEobmV3IEwubTIoYSxjKSkKdC5aLmEobnVsbCkKVy5KRShyLCJjbGlj
+ayIscCwhMSxxLmMpCnE9Ui5PWChhLmEpCnEudG9TdHJpbmcKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRl
+eHROb2RlKHEpKQpiLmFwcGVuZENoaWxkKHIpfSwKRnooYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
+aixpLGg9YS5hCmlmKGg9PW51bGwpcmV0dXJuCmIudG9TdHJpbmcKcz1kb2N1bWVudApyPXMuY3JlYXRl
+RWxlbWVudCgicCIpCnE9Yi5hcHBlbmRDaGlsZChyKQpyPXMuY3JlYXRlRWxlbWVudCgic3BhbiIpCnA9
+dC5zCkouTXUocixILlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHApKQpyLmFwcGVuZENoaWxkKHMuY3Jl
+YXRlVGV4dE5vZGUoIkFjdGlvbnMiKSkKcS5hcHBlbmRDaGlsZChyKQpxLmFwcGVuZENoaWxkKHMuY3Jl
+YXRlVGV4dE5vZGUoIjoiKSkKbz1zLmNyZWF0ZUVsZW1lbnQoInAiKQpiLmFwcGVuZENoaWxkKG8pCmZv
+cihyPWgubGVuZ3RoLG49dC5PLG09MDttPGgubGVuZ3RoO2gubGVuZ3RoPT09cnx8KDAsSC5saykoaCks
+KyttKXtsPWhbbV0Kaz1zLmNyZWF0ZUVsZW1lbnQoImEiKQpvLmFwcGVuZENoaWxkKGspCmo9bC5hCmou
+dG9TdHJpbmcKay5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGopKQpqPWwuYgpqLnRvU3RyaW5n
+Cmsuc2V0QXR0cmlidXRlKCJocmVmIixqKQpqPW4uYShILlFJKFsiYWRkLWhpbnQtbGluayIsImJlZm9y
+ZS1hcHBseSIsImJ1dHRvbiJdLHApKQppPUouZFIoaykKaS5WMSgwKQppLkZWKDAsail9fSwKQ0MoYTQs
+YTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEz
+CmZvcihzPWE0LmYscj1zLmxlbmd0aCxxPXQucyxwPXQuTyxvPTA7bzxzLmxlbmd0aDtzLmxlbmd0aD09
+PXJ8fCgwLEgubGspKHMpLCsrbyl7bj1zW29dCmE1LnRvU3RyaW5nCm09ZG9jdW1lbnQKbD1tLmNyZWF0
+ZUVsZW1lbnQoInAiKQprPXAuYShILlFJKFsidHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5G
+VigwLGspCmk9YTUuYXBwZW5kQ2hpbGQobCkKbD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQprPXAuYShI
+LlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaz1u
+LmEKay50b1N0cmluZwpsLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoaykpCmkuYXBwZW5kQ2hp
+bGQobCkKaS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCI6IikpCmw9bS5jcmVhdGVFbGVtZW50
+KCJ1bCIpCms9cC5hKEguUUkoWyJ0cmFjZSJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykK
+aD1pLmFwcGVuZENoaWxkKGwpCmZvcihsPW4uYixrPWwubGVuZ3RoLGc9MDtnPGwubGVuZ3RoO2wubGVu
+Z3RoPT09a3x8KDAsSC5saykobCksKytnKXtmPWxbZ10KZT1tLmNyZWF0ZUVsZW1lbnQoImxpIikKaC5h
+cHBlbmRDaGlsZChlKQpkPW0uY3JlYXRlRWxlbWVudCgic3BhbiIpCmM9cC5hKEguUUkoWyJmdW5jdGlv
+biJdLHEpKQpqPUouZFIoZCkKai5WMSgwKQpqLkZWKDAsYykKYz1mLmIKTC5XaihkLGM9PW51bGw/InVu
+a25vd24iOmMpCmUuYXBwZW5kQ2hpbGQoZCkKYj1mLmMKaWYoYiE9bnVsbCl7ZS5hcHBlbmRDaGlsZCht
+LmNyZWF0ZVRleHROb2RlKCIgKCIpKQphPWIuYgphMD1tLmNyZWF0ZUVsZW1lbnQoImEiKQphMC5hcHBl
+bmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKEguRWooYi5jKSsiOiIrSC5FaihhKSkpCmQ9Yi5hCmQudG9T
+dHJpbmcKYTAuc2V0QXR0cmlidXRlKCJocmVmIixkKQphMC5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIp
+CmUuYXBwZW5kQ2hpbGQoYTApCmUuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiKSIpKX1lLmFw
+cGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjogIikpCmQ9Zi5hCkwuV2ooZSxkPT1udWxsPyJ1bmtu
+b3duIjpkKQpkPWYuZAppZihkLmxlbmd0aCE9PTApe2M9bS5jcmVhdGVFbGVtZW50KCJwIikKYTE9cC5h
+KEguUUkoWyJkcmF3ZXIiLCJiZWZvcmUtYXBwbHkiXSxxKSkKaj1KLmRSKGMpCmouVjEoMCkKai5GVigw
+LGExKQphMj1lLmFwcGVuZENoaWxkKGMpCmZvcihjPWQubGVuZ3RoLGEzPTA7YTM8ZC5sZW5ndGg7ZC5s
+ZW5ndGg9PT1jfHwoMCxILmxrKShkKSwrK2EzKUwudXooZFthM10sYTIsYil9fX19LApVcyhhKXtyZXR1
+cm4gQy54Qi50ZyhhLCI/Iik/Qy54Qi5OaihhLDAsQy54Qi5PWShhLCI/IikpOmF9LApURyhhLGIpe3Jl
+dHVybiBuZXcgTC5RVyhhLGIpfSwKeXcoYSxiKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9
+MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXtxPWFbcl0KaWYocSBpbnN0
+YW5jZW9mIEwudnQpe3A9cS5kCnAudG9TdHJpbmcKbz1MLnl3KHAsYikKaWYobyE9bnVsbClyZXR1cm4g
+b31lbHNlIGlmKHEuYz09PWIpcmV0dXJuIHF9cmV0dXJuIG51bGx9LApXaihhLGIpe3ZhciBzLHIscSxw
+PUguUUkoYi5zcGxpdCgiLiIpLHQucyksbz1DLk5tLmd0SChwKSxuPWRvY3VtZW50CmEuYXBwZW5kQ2hp
+bGQobi5jcmVhdGVUZXh0Tm9kZShvKSkKZm9yKG89SC5xQyhwLDEsbnVsbCx0Lk4pLHM9by4kdGksbz1u
+ZXcgSC5hNyhvLG8uZ0Eobykscy5DKCJhNzxhTC5FPiIpKSxzPXMuQygiYUwuRSIpLHI9Si5ZRShhKTtv
+LkYoKTspe3E9cy5hKG8uZCkKci5ueihhLCJiZWZvcmVlbmQiLCImIzgyMDM7LiIsbnVsbCxudWxsKQph
+LmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUocSkpfX0sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1
+bmN0aW9uIFZXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9a
+KCl7fSwKanI6ZnVuY3Rpb24ganIoKXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCnk4OmZ1bmN0aW9uIHk4
+KCl7fSwKSGk6ZnVuY3Rpb24gSGkoKXt9LApCVDpmdW5jdGlvbiBCVCgpe30sClBZOmZ1bmN0aW9uIFBZ
+KCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9
+Yn0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9
+LApJQzpmdW5jdGlvbiBJQyhhKXt0aGlzLmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LApCTjpmdW5jdGlvbiBCTigpe30sCmZDOmZ1bmN0aW9uIGZDKGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LApUbTpmdW5jdGlvbiBUbSgpe30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9
+YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKdWU6ZnVuY3Rp
+b24gdWUoKXt9LApHSDpmdW5jdGlvbiBHSCgpe30sCkVFOmZ1bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9
+YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
+LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClREOmZ1bmN0aW9uIFREKGEsYixjKXt0aGlzLmE9
+YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCklmOmZ1bmN0aW9uIElmKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
+Ygp0aGlzLmM9Y30sCnRCOmZ1bmN0aW9uIHRCKCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9
+YQp0aGlzLmI9Yn0sClFXOmZ1bmN0aW9uIFFXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYQTpmdW5j
+dGlvbiBYQSgpe30sClpzKGEpe3ZhciBzLHIscT1KLlU2KGEpCmlmKEwucDIoSC5rKHEucShhLCJ0eXBl
+IikpKT09PUMuWTIpe3M9SC5rKHEucShhLCJuYW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnE9cS5x
+KGEsInN1YnRyZWUiKQpxPW5ldyBMLnZ0KHE9PW51bGw/bnVsbDpMLm1LKHEpLHMscikKcS5MVigpCnJl
+dHVybiBxfWVsc2V7cz1ILmsocS5xKGEsIm5hbWUiKSkKcj1ILmsocS5xKGEsInBhdGgiKSkKcmV0dXJu
+IG5ldyBMLmNEKEguayhxLnEoYSwiaHJlZiIpKSxILlVjKHEucShhLCJlZGl0Q291bnQiKSksSC5NNChx
+LnEoYSwid2FzRXhwbGljaXRseU9wdGVkT3V0IikpLEwudkIoSC5VYyhxLnEoYSwibWlncmF0aW9uU3Rh
+dHVzIikpKSxILk00KHEucShhLCJtaWdyYXRpb25TdGF0dXNDYW5CZUNoYW5nZWQiKSkscyxyKX19LApt
+SyhhKXt2YXIgcyxyPUguUUkoW10sdC5maCkKZm9yKHM9Si5JVCh0LlIuYShhKSk7cy5GKCk7KXIucHVz
+aChMLlpzKHMuZ2woKSkpCnJldHVybiByfSwKVkQoYSl7dmFyIHMscixxPUguUUkoW10sdC5kKQpmb3Io
+cz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLnB1
+c2goYVtyXS5MdCgpKQpyZXR1cm4gcX0sCnZCKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYT4+
+PjAhPT1hfHxhPj00KXJldHVybiBILk9IKEMubDAsYSkKcmV0dXJuIEMubDBbYV19LApwMihhKXtzd2l0
+Y2goYSl7Y2FzZSJkaXJlY3RvcnkiOnJldHVybiBDLlkyCmNhc2UiZmlsZSI6cmV0dXJuIEMucmYKZGVm
+YXVsdDp0aHJvdyBILmIoUC5QVigiVW5yZWNvZ25pemVkIG5hdmlnYXRpb24gdHJlZSBub2RlIHR5cGU6
+ICIrSC5FaihhKSkpfX0sCnZ0OmZ1bmN0aW9uIHZ0KGEsYixjKXt2YXIgXz10aGlzCl8uZD1hCl8uYT1i
+Cl8uYj0kCl8uYz1jfSwKY0Q6ZnVuY3Rpb24gY0QoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmQ9
+YQpfLmU9YgpfLmY9YwpfLnI9ZApfLng9ZQpfLmE9ZgpfLmI9JApfLmM9Z30sCkQ4OmZ1bmN0aW9uIEQ4
+KCl7fSwKTzk6ZnVuY3Rpb24gTzkoYSl7dGhpcy5iPWF9LApHYjpmdW5jdGlvbiBHYihhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1ifSwKSVY6ZnVuY3Rpb24gSVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9
+YgpfLmY9YwpfLnI9ZH19LE09ewpZRihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwKZm9yKHM9Yi5sZW5n
+dGgscj0xO3I8czsrK3Ipe2lmKGJbcl09PW51bGx8fGJbci0xXSE9bnVsbCljb250aW51ZQpmb3IoO3M+
+PTE7cz1xKXtxPXMtMQppZihiW3FdIT1udWxsKWJyZWFrfXA9bmV3IFAuTSgiIikKbz0iIisoYSsiKCIp
+CnAuYT1vCm49SC50NihiKQptPW4uQygibkg8MT4iKQpsPW5ldyBILm5IKGIsMCxzLG0pCmwuSGQoYiww
+LHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMoInFVKGFMLkUpIikuYShuZXcgTS5ObygpKSxtLkMoImxK
+PGFMLkUscVU+IikpLmsoMCwiLCAiKQpwLmE9bQpwLmE9bSsoIik6IHBhcnQgIisoci0xKSsiIHdhcyBu
+dWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90LiIpCnRocm93IEguYihQLnhZKHAudygwKSxudWxsKSl9
+fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0
+aW9uIE5vKCl7fX0sTz17ClJoKCl7dmFyIHMscj1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIily
+ZXR1cm4gJC5FYigpCnM9UC51bygpCmlmKCFDLnhCLlRjKHMuZ0lpKHMpLCIvIikpcmV0dXJuICQuRWIo
+KQppZihQLktMKHIsImEvYiIscixyLHIscixyKS50NCgpPT09ImFcXGIiKXJldHVybiAkLktrKCkKcmV0
+dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpMKCl7fX0sUD17Ck9qKCl7dmFyIHMscixxPXt9CmlmKHNl
+bGYuc2NoZWR1bGVJbW1lZGlhdGUhPW51bGwpcmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2Jz
+ZXJ2ZXIhPW51bGwmJnNlbGYuZG9jdW1lbnQhPW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVt
+ZW50KCJkaXYiKQpyPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5l
+dyBzZWxmLk11dGF0aW9uT2JzZXJ2ZXIoSC50UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGls
+ZExpc3Q6dHJ1ZX0pCnJldHVybiBuZXcgUC5oYShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0
+ZSE9bnVsbClyZXR1cm4gUC55dCgpCnJldHVybiBQLnFXKCl9LApaVihhKXtzZWxmLnNjaGVkdWxlSW1t
+ZWRpYXRlKEgudFIobmV3IFAuVnModC5NLmEoYSkpLDApKX0sCm9BKGEpe3NlbGYuc2V0SW1tZWRpYXRl
+KEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDApKX0sCkJ6KGEpe3QuTS5hKGEpClAuUU4oMCxhKX0sClFO
+KGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZKGEsYikKcmV0dXJuIHN9LApGWChhKXtyZXR1cm4gbmV3
+IFAuaWgobmV3IFAudnMoJC5YMyxhLkMoInZzPDA+IikpLGEuQygiaWg8MD4iKSl9LApESShhLGIpe2Eu
+JDIoMCxudWxsKQpiLmI9ITAKcmV0dXJuIGIuYX0sCmpRKGEsYil7UC5KZShhLGIpfSwKeUMoYSxiKXti
+LmFNKDAsYSl9LApmMyhhLGIpe2IudzAoSC5SdShhKSxILnRzKGEpKX0sCkplKGEsYil7dmFyIHMscixx
+PW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikKaWYoYSBpbnN0YW5jZW9mIFAudnMpYS5RZChxLHAsdC56
+KQplbHNle3M9dC56CmlmKHQuaS5iKGEpKWEuU3EocSxwLHMpCmVsc2V7cj1uZXcgUC52cygkLlgzLHQu
+YykKci5hPTgKci5jPWEKci5RZChxLHAscyl9fX0sCmx6KGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0
+dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1ZSl0cnl7YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpk
+PWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5MaihuZXcgUC5HcyhzKSx0LkgsdC5TLHQueil9LApHUShhKXty
+ZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRoKCl7cmV0dXJuIEMud1F9LApZbShhKXtyZXR1cm4gbmV3IFAu
+RnkoYSwzKX0sCmwwKGEsYil7cmV0dXJuIG5ldyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sClRsKGEsYil7
+dmFyIHM9SC5jYihhLCJlcnJvciIsdC5LKQpyZXR1cm4gbmV3IFAuQ3cocyxiPT1udWxsP1AudjAoYSk6
+Yil9LAp2MChhKXt2YXIgcwppZih0Lm0uYihhKSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9
+cmV0dXJuIEMucGR9LApBOShhLGIpe3ZhciBzLHIscQpmb3Iocz10LmM7cj1hLmEsKHImNCkhPT0wOylh
+PXMuYShhLmMpCmlmKChyJjI0KSE9PTApe3E9Yi5haCgpCmIudWcoYSkKUC5IWihiLHEpfWVsc2V7cT10
+LmUuYShiLmMpCmIuYT1iLmEmMXw0CmIuYz1hCmEualEocSl9fSwKSFooYSxhMCl7dmFyIHMscixxLHAs
+byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz17fSxiPWMuYT1hCmZvcihzPXQubixyPXQuZSxxPXQuaTsh
+MDspe3A9e30Kbz1iLmEKbj0obyYxNik9PT0wCm09IW4KaWYoYTA9PW51bGwpe2lmKG0mJihvJjEpPT09
+MCl7bD1zLmEoYi5jKQpQLlNpKGwuYSxsLmIpfXJldHVybn1wLmE9YTAKaz1hMC5hCmZvcihiPWEwO2sh
+PW51bGw7Yj1rLGs9ail7Yi5hPW51bGwKUC5IWihjLmEsYikKcC5hPWsKaj1rLmF9bz1jLmEKaT1vLmMK
+cC5iPW0KcC5jPWkKaWYobil7aD1iLmMKaD0oaCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEwCmlm
+KGgpe2c9Yi5iLmIKaWYobSl7bz1vLmI9PT1nCm89IShvfHxvKX1lbHNlIG89ITEKaWYobyl7cy5hKGkp
+ClAuU2koaS5hLGkuYikKcmV0dXJufWY9JC5YMwppZihmIT09ZykkLlgzPWcKZWxzZSBmPW51bGwKYj1i
+LmMKaWYoKGImMTUpPT09OCluZXcgUC5SVChwLGMsbSkuJDAoKQplbHNlIGlmKG4pe2lmKChiJjEpIT09
+MCluZXcgUC5ycShwLGkpLiQwKCl9ZWxzZSBpZigoYiYyKSE9PTApbmV3IFAuUlcoYyxwKS4kMCgpCmlm
+KGYhPW51bGwpJC5YMz1mCmI9cC5jCmlmKHEuYihiKSl7bz1wLmEuJHRpCm89by5DKCJiODwyPiIpLmIo
+Yil8fCFvLlFbMV0uYihiKX1lbHNlIG89ITEKaWYobyl7cS5hKGIpCmU9cC5hLmIKaWYoKGIuYSYyNCkh
+PT0wKXtkPXIuYShlLmMpCmUuYz1udWxsCmEwPWUuTjgoZCkKZS5hPWIuYSYzMHxlLmEmMQplLmM9Yi5j
+CmMuYT1iCmNvbnRpbnVlfWVsc2UgUC5BOShiLGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUu
+Yz1udWxsCmEwPWUuTjgoZCkKYj1wLmIKbz1wLmMKaWYoIWIpe2UuJHRpLmMuYShvKQplLmE9OAplLmM9
+b31lbHNle3MuYShvKQplLmE9ZS5hJjF8MTYKZS5jPW99Yy5hPWUKYj1lfX0sClZIKGEsYil7dmFyIHMK
+aWYodC5hLmIoYSkpcmV0dXJuIGIuTGooYSx0LnosdC5LLHQubCkKcz10LnYKaWYocy5iKGEpKXJldHVy
+biBzLmEoYSkKdGhyb3cgSC5iKFAuTDMoYSwib25FcnJvciIsdS5jKSl9LApwdSgpe3ZhciBzLHIKZm9y
+KHM9JC5TNjtzIT1udWxsO3M9JC5TNil7JC5tZz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxsKSQu
+azg9bnVsbApzLmEuJDAoKX19LAplTigpeyQuVUQ9ITAKdHJ5e1AucHUoKX1maW5hbGx5eyQubWc9bnVs
+bAokLlVEPSExCmlmKCQuUzYhPW51bGwpJC51dCgpLiQxKFAuVUkoKSl9fSwKZVcoYSl7dmFyIHM9bmV3
 IFAuT00oYSkscj0kLms4CmlmKHI9PW51bGwpeyQuUzY9JC5rOD1zCmlmKCEkLlVEKSQudXQoKS4kMShQ
-LlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJSOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPSQuUzYKaWYo
-cD09bnVsbCl7UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9bmV3IFAuT00oYSkKcj0kLm1nCmlmKHI9
-PW51bGwpe3MuYj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIKcy5iPXEKJC5tZz1yLmI9cwppZihxPT1u
-dWxsKSQuazg9c319LApyYjpmdW5jdGlvbihhKXt2YXIgcz1udWxsLHI9JC5YMwppZihDLk5VPT09cil7
-UC5UayhzLHMsQy5OVSxhKQpyZXR1cm59UC5UayhzLHMscix0Lk0uYShyLkdZKGEpKSl9LApRdzpmdW5j
-dGlvbihhLGIpe0guY2IoYSwic3RyZWFtIix0LkspCnJldHVybiBuZXcgUC54SShiLkMoInhJPDA+Iikp
-fSwKU2k6ZnVuY3Rpb24oYSxiKXtQLnJSKG5ldyBQLkV2KGEsYikpfSwKVDg6ZnVuY3Rpb24oYSxiLGMs
-ZCxlKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDAoKQokLlgzPWMKcz1yCnRyeXtyPWQu
-JDAoKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LAp5djpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2
-YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDEoZSkKJC5YMz1jCnM9cgp0cnl7cj1kLiQxKGUp
-CnJldHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClF4OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXt2
-YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDIoZSxmKQokLlgzPWMKcz1yCnRyeXtyPWQuJDIo
-ZSxmKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LApUazpmdW5jdGlvbihhLGIsYyxkKXt0Lk0uYShk
-KQppZihDLk5VIT09YylkPWMuR1koZCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1h
-fSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVu
-Y3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0
-aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0
-aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShh
-KXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7
-dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rp
-b24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1
-bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkN3OmZ1bmN0aW9uIEN3KGEsYil7dGhp
-cy5hPWEKdGhpcy5iPWJ9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhp
-cy5hPWEKdGhpcy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9
-bnVsbApfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2
-YXIgXz10aGlzCl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-CnBWOmZ1bmN0aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2
-cjpmdW5jdGlvbiB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApydDpmdW5jdGlv
-biBydChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30s
-ClJUOmZ1bmN0aW9uIFJUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0
-aW9uIGpaKGEpe3RoaXMuYT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-ClJXOmZ1bmN0aW9uIFJXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPTTpmdW5jdGlvbiBPTShhKXt0
-aGlzLmE9YQp0aGlzLmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVuY3Rpb24gQjUoYSxi
-KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
-LApNTzpmdW5jdGlvbiBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVuY3Rpb24geEkoYSl7
-dGhpcy4kdGk9YX0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwKRXY6ZnVuY3Rpb24gRXYoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sCkVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIp
-LmEoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9
-LApMczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjwwPiIpKX0sClQyOmZ1bmN0aW9u
-KCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJdPXMKZGVs
-ZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyajpmdW5jdGlvbihhLGIsYyl7
-dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQOmZ1bmN0
-aW9uKGEsYixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIigu
-Li4pIgpyZXR1cm4gYisiLi4uIitjfXM9SC5RSShbXSx0LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZy
-KGEscyl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBv
-cCgpfXI9UC5sKGIsdC5SLmEocyksIiwgIikrYwpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0s
-Cng6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1cm4gYisiLi4uIitjCnM9bmV3
-IFAuTShiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cj1zCnIuYT1QLmwoci5hLGEsIiwgIil9ZmluYWxseXtp
-ZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXMuYSs9YwpyPXMu
-YQpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCmhCOmZ1bmN0aW9uKGEpe3ZhciBzLHIKZm9y
-KHM9JC54Zy5sZW5ndGgscj0wO3I8czsrK3IpaWYoYT09PSQueGdbcl0pcmV0dXJuITAKcmV0dXJuITF9
-LApWcjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9YS5nbShhKSxrPTAsaj0wCndoaWxl
-KCEwKXtpZighKGs8ODB8fGo8MykpYnJlYWsKaWYoIWwuRigpKXJldHVybgpzPUguRWoobC5nbCgpKQpD
-Lk5tLmkoYixzKQprKz1zLmxlbmd0aCsyOysran1pZighbC5GKCkpe2lmKGo8PTUpcmV0dXJuCmlmKDA+
-PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnI9Yi5wb3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4g
-SC5PSChiLC0xKQpxPWIucG9wKCl9ZWxzZXtwPWwuZ2woKTsrK2oKaWYoIWwuRigpKXtpZihqPD00KXtD
-Lk5tLmkoYixILkVqKHApKQpyZXR1cm59cj1ILkVqKHApCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9I
-KGIsLTEpCnE9Yi5wb3AoKQprKz1yLmxlbmd0aCsyfWVsc2V7bz1sLmdsKCk7KytqCmZvcig7bC5GKCk7
-cD1vLG89bil7bj1sLmdsKCk7KytqCmlmKGo+MTAwKXt3aGlsZSghMCl7aWYoIShrPjc1JiZqPjMpKWJy
-ZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCmstPWIucG9wKCkubGVuZ3RoKzI7LS1q
-fUMuTm0uaShiLCIuLi4iKQpyZXR1cm59fXE9SC5FaihwKQpyPUguRWoobykKays9ci5sZW5ndGgrcS5s
-ZW5ndGgrNH19aWYoaj5iLmxlbmd0aCsyKXtrKz01Cm09Ii4uLiJ9ZWxzZSBtPW51bGwKd2hpbGUoITAp
-e2lmKCEoaz44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwt
-MSkKay09Yi5wb3AoKS5sZW5ndGgrMgppZihtPT1udWxsKXtrKz01Cm09Ii4uLiJ9fWlmKG0hPW51bGwp
-Qy5ObS5pKGIsbSkKQy5ObS5pKGIscSkKQy5ObS5pKGIscil9LAp0TTpmdW5jdGlvbihhLGIpe3ZhciBz
-LHIscT1QLkxzKGIpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAs
-SC5saykoYSksKytyKXEuaSgwLGIuYShhW3JdKSkKcmV0dXJuIHF9LApuTzpmdW5jdGlvbihhKXt2YXIg
-cyxyPXt9CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59IgpzPW5ldyBQLk0oIiIpCnRyeXtDLk5tLmkoJC54
-ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEocixzKSkKcy5hKz0ifSJ9ZmluYWxseXtp
-ZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9cy5hCnJldHVy
-biByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89dGhpcwpfLmE9
-MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0aW9uIGJuKGEp
-e3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixjKXt2YXIgXz10
-aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24gbVcoKXt9LAp1
-eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24gaWwoKXt9LApy
-YTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24gWWsoKXt9LAp5
-UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46ZnVuY3Rpb24g
-UG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApsZjpmdW5jdGlv
-biBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApuWTpmdW5jdGlv
-biBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApwUjpmdW5jdGlv
-biBwUigpe30sCkJTOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHA9bnVsbAp0cnl7cD1KU09OLnBhcnNl
+LlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJSKGEpe3ZhciBzLHIscSxwPSQuUzYKaWYocD09bnVsbCl7
+UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9bmV3IFAuT00oYSkKcj0kLm1nCmlmKHI9PW51bGwpe3Mu
+Yj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIKcy5iPXEKJC5tZz1yLmI9cwppZihxPT1udWxsKSQuazg9
+c319LApyYihhKXt2YXIgcz1udWxsLHI9JC5YMwppZihDLk5VPT09cil7UC5UayhzLHMsQy5OVSxhKQpy
+ZXR1cm59UC5UayhzLHMscix0Lk0uYShyLkdZKGEpKSl9LApRdyhhLGIpe0guY2IoYSwic3RyZWFtIix0
+LkspCnJldHVybiBuZXcgUC54SShiLkMoInhJPDA+IikpfSwKU2koYSxiKXtQLnJSKG5ldyBQLkV2KGEs
+YikpfSwKVDgoYSxiLGMsZCxlKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDAoKQokLlgz
+PWMKcz1yCnRyeXtyPWQuJDAoKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LAp5dihhLGIsYyxkLGUs
+ZixnKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDEoZSkKJC5YMz1jCnM9cgp0cnl7cj1k
+LiQxKGUpCnJldHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClF4KGEsYixjLGQsZSxmLGcsaCxpKXt2YXIg
+cyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDIoZSxmKQokLlgzPWMKcz1yCnRyeXtyPWQuJDIoZSxm
+KQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LApUayhhLGIsYyxkKXt0Lk0uYShkKQppZihDLk5VIT09
+YylkPWMuR1koZCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rp
+b24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7
+dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwK
+eUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7
+dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0s
+ClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApG
+eTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2
+YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEs
+Yil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkN3OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5i
+PWJ9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4k
+dGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpf
+LmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8u
+YT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRo
+aXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9u
+IHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2
+cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3Ro
+aXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpM
+OmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9u
+IFJUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3Ro
+aXMuYT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9u
+IFJXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlz
+LmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0
+aGlzLmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlv
+biBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0s
+Cm0wOmZ1bmN0aW9uIG0wKCl7fSwKRXY6ZnVuY3Rpb24gRXYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+CkppOmZ1bmN0aW9uIEppKCl7fSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+Ck9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGKGEsYixj
+KXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIu
+QygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsKGEsYil7cmV0dXJuIG5ldyBILk41KGEu
+QygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9LApMcyhhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJi
+NjwwPiIpKX0sClQyKCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIt
+a2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyaihhLGIs
+Yyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQKGEs
+YixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpy
+ZXR1cm4gYisiLi4uIitjfXM9SC5RSShbXSx0LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9
+ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9
+UC5sKGIsdC5SLmEocyksIiwgIikrYwpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCngoYSxi
+LGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1cm4gYisiLi4uIitjCnM9bmV3IFAuTShiKQpDLk5tLmko
+JC54ZyxhKQp0cnl7cj1zCnIuYT1QLmwoci5hLGEsIiwgIil9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0
+aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXMuYSs9YwpyPXMuYQpyZXR1cm4gci5jaGFy
+Q29kZUF0KDApPT0wP3I6cn0sCmhCKGEpe3ZhciBzLHIKZm9yKHM9JC54Zy5sZW5ndGgscj0wO3I8czsr
+K3IpaWYoYT09PSQueGdbcl0pcmV0dXJuITAKcmV0dXJuITF9LApWcihhLGIpe3ZhciBzLHIscSxwLG8s
+bixtLGw9YS5nbShhKSxrPTAsaj0wCndoaWxlKCEwKXtpZighKGs8ODB8fGo8MykpYnJlYWsKaWYoIWwu
+RigpKXJldHVybgpzPUguRWoobC5nbCgpKQpDLk5tLmkoYixzKQprKz1zLmxlbmd0aCsyOysran1pZigh
+bC5GKCkpe2lmKGo8PTUpcmV0dXJuCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnI9Yi5w
+b3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpxPWIucG9wKCl9ZWxzZXtwPWwuZ2wo
+KTsrK2oKaWYoIWwuRigpKXtpZihqPD00KXtDLk5tLmkoYixILkVqKHApKQpyZXR1cm59cj1ILkVqKHAp
+CmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKQprKz1yLmxlbmd0aCsyfWVs
+c2V7bz1sLmdsKCk7KytqCmZvcig7bC5GKCk7cD1vLG89bil7bj1sLmdsKCk7KytqCmlmKGo+MTAwKXt3
+aGlsZSghMCl7aWYoIShrPjc1JiZqPjMpKWJyZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIs
+LTEpCmstPWIucG9wKCkubGVuZ3RoKzI7LS1qfUMuTm0uaShiLCIuLi4iKQpyZXR1cm59fXE9SC5Faihw
+KQpyPUguRWoobykKays9ci5sZW5ndGgrcS5sZW5ndGgrNH19aWYoaj5iLmxlbmd0aCsyKXtrKz01Cm09
+Ii4uLiJ9ZWxzZSBtPW51bGwKd2hpbGUoITApe2lmKCEoaz44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYo
+MD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKay09Yi5wb3AoKS5sZW5ndGgrMgppZihtPT1udWxs
+KXtrKz01Cm09Ii4uLiJ9fWlmKG0hPW51bGwpQy5ObS5pKGIsbSkKQy5ObS5pKGIscSkKQy5ObS5pKGIs
+cil9LAp0TShhLGIpe3ZhciBzLHIscT1QLkxzKGIpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3Ro
+O2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXEuaSgwLGIuYShhW3JdKSkKcmV0dXJuIHF9LApu
+TyhhKXt2YXIgcyxyPXt9CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59IgpzPW5ldyBQLk0oIiIpCnRyeXtD
+Lk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEocixzKSkKcy5hKz0ifSJ9
+ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9
+cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89
+dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0
+aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixj
+KXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24g
+bVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24g
+aWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24g
+WWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46
+ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LAps
+ZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApu
+WTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApw
+UjpmdW5jdGlvbiBwUigpe30sCkJTKGEsYil7dmFyIHMscixxLHA9bnVsbAp0cnl7cD1KU09OLnBhcnNl
 KGEpfWNhdGNoKHIpe3M9SC5SdShyKQpxPVAucnIoU3RyaW5nKHMpLG51bGwsbnVsbCkKdGhyb3cgSC5i
-KHEpfXE9UC5RZShwKQpyZXR1cm4gcX0sClFlOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0
-dXJuIG51bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlmKE9iamVjdC5nZXRQcm90b3R5
-cGVPZihhKSE9PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXcoYSxPYmplY3QuY3JlYXRlKG51
-bGwpKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5RZShhW3NdKQpyZXR1cm4gYX0sCmt5OmZ1
-bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe3M9YgpkPXMu
-bGVuZ3RoCmlmKGQtYzwxNSlyZXR1cm4gbnVsbApyPVAuUlAoYSxzLGMsZCkKaWYociE9bnVsbCYmYSlp
-ZihyLmluZGV4T2YoIlx1ZmZmZCIpPj0wKXJldHVybiBudWxsCnJldHVybiByfXJldHVybiBudWxsfSwK
-UlA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHM9YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwpcmV0dXJu
-IG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQLlJiKHMs
-Yi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVuZ3RoKSkpfSwKUmI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
-CnRyeXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAp4
-TTpmdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0aHJvdyBILmIoUC5ycigi
-SW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZv
-dXIsIGlzICIrZixhLGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBw
-YWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJvdyBILmIoUC5ycigiSW52
-YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsYSxiKSl9LApH
-eTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLlVkKGEsYil9LApOQzpmdW5jdGlvbihhKXtyZXR1
-cm4gYS5MdCgpfSwKVWc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAudHUoYSxbXSxQLkN5KCkpfSwK
-dVg6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9bmV3IFAuTSgiIikscT1QLlVnKHIsYikKcS5pVShhKQpz
-PXIuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmo0OmZ1bmN0aW9uKGEpe3N3aXRjaChh
-KXtjYXNlIDY1OnJldHVybiJNaXNzaW5nIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJVbmV4
-cGVjdGVkIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY5OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUiCmNh
-c2UgNzE6cmV0dXJuIk92ZXJsb25nIGVuY29kaW5nIgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5pY29k
-ZSByYW5nZSIKY2FzZSA3NTpyZXR1cm4iRW5jb2RlZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJuIlVu
-ZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiCmRlZmF1bHQ6cmV0dXJuIiJ9fSwKank6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciBzLHIscSxwPWMtYixvPW5ldyBVaW50OEFycmF5KHApCmZvcihzPUouVTYoYSks
-cj0wO3I8cDsrK3Ipe3E9cy5xKGEsYityKQppZigocSY0Mjk0OTY3MDQwKT4+PjAhPT0wKXE9MjU1Cmlm
-KHI+PXApcmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99LAp1dzpmdW5jdGlvbiB1dyhhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhpcy5hPWF9
-LAp4cjpmdW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9
-LApVODpmdW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9
-LApaaTpmdW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
-LApLODpmdW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYnk6ZnVuY3Rpb24gYnkoKXt9
-LApvajpmdW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0aW9uIE14KGEpe3RoaXMuYT1hfSwK
-U2g6ZnVuY3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
-dHU6ZnVuY3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1iCnRoaXMuYj1jfSwKdTU6ZnVuY3Rp
-b24gdTUoKXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0aW9uIFJ3KGEpe3RoaXMuYj0wCnRo
-aXMuYz1hfSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApiejpmdW5jdGlvbiBieihhKXt0aGlz
-LmE9YQp0aGlzLmI9MTYKdGhpcy5jPTB9LApRQTpmdW5jdGlvbihhLGIpe3ZhciBzPUguSHAoYSxiKQpp
-ZihzIT1udWxsKXJldHVybiBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApvczpmdW5jdGlv
-bihhKXtpZihhIGluc3RhbmNlb2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBvZiAn
-IitILmxoKGEpKyInIn0sCk84OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHI9Yz9KLktoKGEsZCk6Si5R
-aShhLGQpCmlmKGEhPT0wJiZiIT1udWxsKWZvcihzPTA7czxyLmxlbmd0aDsrK3MpcltzXT1iCnJldHVy
-biByfSwKQ0g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9SC5RSShbXSxjLkMoImpkPDA+IikpCmZvcihz
-PUouSVQoYSk7cy5GKCk7KUMuTm0uaShyLGMuYShzLmdsKCkpKQppZihiKXJldHVybiByCnJldHVybiBK
-LkVwKHIsYyl9LApZMTpmdW5jdGlvbihhLGIsYyl7dmFyIHMKaWYoYilyZXR1cm4gUC5ldihhLGMpCnM9
-Si5FcChQLmV2KGEsYyksYykKcmV0dXJuIHN9LApldjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYoQXJy
-YXkuaXNBcnJheShhKSlyZXR1cm4gSC5RSShhLnNsaWNlKDApLGIuQygiamQ8MD4iKSkKcz1ILlFJKFtd
-LGIuQygiamQ8MD4iKSkKZm9yKHI9Si5JVChhKTtyLkYoKTspQy5ObS5pKHMsci5nbCgpKQpyZXR1cm4g
-c30sCkFGOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouekMoUC5DSChhLCExLGIpKX0sCkhNOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcz1ILmZ3KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJldHVybiBzfSwKT286ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEguTHcoYSl9LApudTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVlIoYSxI
-LnY0KGEsITEsITAsITEsITEsITEpKX0sCmw6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUouSVQoYikKaWYo
-IXMuRigpKXJldHVybiBhCmlmKGMubGVuZ3RoPT09MCl7ZG8gYSs9SC5FaihzLmdsKCkpCndoaWxlKHMu
-RigpKX1lbHNle2ErPUguRWoocy5nbCgpKQpmb3IoO3MuRigpOylhPWErYytILkVqKHMuZ2woKSl9cmV0
-dXJuIGF9LApscjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gbmV3IFAubXAoYSxiLGMsZCl9LAp1bzpm
-dW5jdGlvbigpe3ZhciBzPUguTTAoKQppZihzIT1udWxsKXJldHVybiBQLmhLKHMpCnRocm93IEguYihQ
-Lkw0KCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKSl9LAplUDpmdW5jdGlvbihhLGIsYyxkKXt2
-YXIgcyxyLHEscCxvLG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYz09PUMueE0pe3M9JC56NCgpLmIK
-cz1zLnRlc3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5DKCJVay5TIikuYShiKQpy
-PWMuZ1pFKCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysrcSl7bz1yW3FdCmlmKG88
-MTI4KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25dJjE8PChvJjE1KSkhPT0w
-fWVsc2Ugbj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9wKyIrIjpwKyIlIittW28+
-Pj40JjE1XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwKR3E6ZnVuY3Rpb24o
-YSl7dmFyIHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIrYQppZihz
-Pj0xMDApcmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiByKyIwMDAi
-K3N9LApWeDpmdW5jdGlvbihhKXtpZihhPj0xMDApcmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIr
-YQpyZXR1cm4iMDAiK2F9LApoMDpmdW5jdGlvbihhKXtpZihhPj0xMClyZXR1cm4iIithCnJldHVybiIw
-IithfSwKaGw6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIifHxILnJRKGEpfHxhPT1udWxs
-KXJldHVybiBKLncoYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmluZ2lmeShh
-KQpyZXR1cm4gUC5vcyhhKX0sCmhWOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5DNihhKX0sCnhZOmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgUC5BVCghMSxudWxsLG51bGwsYSl9LApMMzpmdW5jdGlvbihhLGIs
-Yyl7cmV0dXJuIG5ldyBQLkFUKCEwLGEsYixjKX0sCk83OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQ
-LmJKKG51bGwsbnVsbCwhMCxhLGIsIlZhbHVlIG5vdCBpbiByYW5nZSIpfSwKVEU6ZnVuY3Rpb24oYSxi
-LGMsZCxlKXtyZXR1cm4gbmV3IFAuYkooYixjLCEwLGEsZCwiSW52YWxpZCB2YWx1ZSIpfSwKd0E6ZnVu
-Y3Rpb24oYSxiLGMsZCl7aWYoYTxifHxhPmMpdGhyb3cgSC5iKFAuVEUoYSxiLGMsZCxudWxsKSkKcmV0
-dXJuIGF9LApqQjpmdW5jdGlvbihhLGIsYyl7aWYoMD5hfHxhPmMpdGhyb3cgSC5iKFAuVEUoYSwwLGMs
-InN0YXJ0IixudWxsKSkKaWYoYiE9bnVsbCl7aWYoYT5ifHxiPmMpdGhyb3cgSC5iKFAuVEUoYixhLGMs
-ImVuZCIsbnVsbCkpCnJldHVybiBifXJldHVybiBjfSwKazE6ZnVuY3Rpb24oYSxiKXtpZihhPDApdGhy
-b3cgSC5iKFAuVEUoYSwwLG51bGwsYixudWxsKSkKcmV0dXJuIGF9LApDZjpmdW5jdGlvbihhLGIsYyxk
-LGUpe3ZhciBzPUguSVooZT09bnVsbD9KLkhtKGIpOmUpCnJldHVybiBuZXcgUC5lWShzLCEwLGEsYywi
-SW5kZXggb3V0IG9mIHJhbmdlIil9LApMNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudWIoYSl9LApT
-WTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuZHMoYSl9LApQVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3
-IFAubGooYSl9LAphNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVVYoYSl9LApycjpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuIG5ldyBQLmFFKGEsYixjKX0sCmhLOmZ1bmN0aW9uKGE1KXt2YXIgcyxyLHEscCxv
-LG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYSxhMCxhMSxhMixhMz1udWxsLGE0PWE1Lmxlbmd0aApp
-ZihhND49NSl7cz0oKEMueEIuVyhhNSw0KV41OCkqM3xDLnhCLlcoYTUsMCleMTAwfEMueEIuVyhhNSwx
-KV45N3xDLnhCLlcoYTUsMileMTE2fEMueEIuVyhhNSwzKV45Nyk+Pj4wCmlmKHM9PT0wKXJldHVybiBQ
-LktEKGE0PGE0P0MueEIuTmooYTUsMCxhNCk6YTUsNSxhMykuZ2xSKCkKZWxzZSBpZihzPT09MzIpcmV0
-dXJuIFAuS0QoQy54Qi5OaihhNSw1LGE0KSwwLGEzKS5nbFIoKX1yPVAuTzgoOCwwLCExLHQuUykKQy5O
-bS5ZNShyLDAsMCkKQy5ObS5ZNShyLDEsLTEpCkMuTm0uWTUociwyLC0xKQpDLk5tLlk1KHIsNywtMSkK
-Qy5ObS5ZNShyLDMsMCkKQy5ObS5ZNShyLDQsMCkKQy5ObS5ZNShyLDUsYTQpCkMuTm0uWTUociw2LGE0
-KQppZihQLlVCKGE1LDAsYTQsMCxyKT49MTQpQy5ObS5ZNShyLDcsYTQpCnE9clsxXQppZihxPj0wKWlm
-KFAuVUIoYTUsMCxxLDIwLHIpPT09MjApcls3XT1xCnA9clsyXSsxCm89clszXQpuPXJbNF0KbT1yWzVd
-Cmw9cls2XQppZihsPG0pbT1sCmlmKG48cCluPW0KZWxzZSBpZihuPD1xKW49cSsxCmlmKG88cClvPW4K
-az1yWzddPDAKaWYoaylpZihwPnErMyl7aj1hMwprPSExfWVsc2V7aT1vPjAKaWYoaSYmbysxPT09bil7
-aj1hMwprPSExfWVsc2V7aWYoIShtPGE0JiZtPT09bisyJiZDLnhCLlFpKGE1LCIuLiIsbikpKWg9bT5u
-KzImJkMueEIuUWkoYTUsIi8uLiIsbS0zKQplbHNlIGg9ITAKaWYoaCl7aj1hMwprPSExfWVsc2V7aWYo
-cT09PTQpaWYoQy54Qi5RaShhNSwiZmlsZSIsMCkpe2lmKHA8PTApe2lmKCFDLnhCLlFpKGE1LCIvIixu
-KSl7Zz0iZmlsZTovLy8iCnM9M31lbHNle2c9ImZpbGU6Ly8iCnM9Mn1hNT1nK0MueEIuTmooYTUsbixh
-NCkKcS09MAppPXMtMAptKz1pCmwrPWkKYTQ9YTUubGVuZ3RoCnA9NwpvPTcKbj03fWVsc2UgaWYobj09
-PW0peysrbApmPW0rMQphNT1DLnhCLmk3KGE1LG4sbSwiLyIpOysrYTQKbT1mfWo9ImZpbGUifWVsc2Ug
-aWYoQy54Qi5RaShhNSwiaHR0cCIsMCkpe2lmKGkmJm8rMz09PW4mJkMueEIuUWkoYTUsIjgwIixvKzEp
-KXtsLT0zCmU9bi0zCm0tPTMKYTU9Qy54Qi5pNyhhNSxvLG4sIiIpCmE0LT0zCm49ZX1qPSJodHRwIn1l
-bHNlIGo9YTMKZWxzZSBpZihxPT09NSYmQy54Qi5RaShhNSwiaHR0cHMiLDApKXtpZihpJiZvKzQ9PT1u
-JiZDLnhCLlFpKGE1LCI0NDMiLG8rMSkpe2wtPTQKZT1uLTQKbS09NAphNT1DLnhCLmk3KGE1LG8sbiwi
-IikKYTQtPTMKbj1lfWo9Imh0dHBzIn1lbHNlIGo9YTMKaz0hMH19fWVsc2Ugaj1hMwppZihrKXtpZihh
-NDxhNS5sZW5ndGgpe2E1PUMueEIuTmooYTUsMCxhNCkKcS09MApwLT0wCm8tPTAKbi09MAptLT0wCmwt
-PTB9cmV0dXJuIG5ldyBQLlVmKGE1LHEscCxvLG4sbSxsLGopfWlmKGo9PW51bGwpaWYocT4wKWo9UC5Q
-aShhNSwwLHEpCmVsc2V7aWYocT09PTApUC5SMyhhNSwwLCJJbnZhbGlkIGVtcHR5IHNjaGVtZSIpCmo9
-IiJ9aWYocD4wKXtkPXErMwpjPWQ8cD9QLnpSKGE1LGQscC0xKToiIgpiPVAuT2UoYTUscCxvLCExKQpp
-PW8rMQppZihpPG4pe2E9SC5IcChDLnhCLk5qKGE1LGksbiksYTMpCmEwPVAud0IoYT09bnVsbD9ILnYo
-UC5ycigiSW52YWxpZCBwb3J0IixhNSxpKSk6YSxqKX1lbHNlIGEwPWEzfWVsc2V7YTA9YTMKYj1hMApj
-PSIifWExPVAua2EoYTUsbixtLGEzLGosYiE9bnVsbCkKYTI9bTxsP1AubGUoYTUsbSsxLGwsYTMpOmEz
-CnJldHVybiBuZXcgUC5EbihqLGMsYixhMCxhMSxhMixsPGE0P1AudEcoYTUsbCsxLGE0KTphMyl9LApN
-dDpmdW5jdGlvbihhKXtILm4oYSkKcmV0dXJuIFAua3UoYSwwLGEubGVuZ3RoLEMueE0sITEpfSwKV1g6
-ZnVuY3Rpb24oYSl7dmFyIHM9dC5OCnJldHVybiBDLk5tLk4wKEguUUkoYS5zcGxpdCgiJiIpLHQucyks
-UC5GbChzLHMpLG5ldyBQLm4xKEMueE0pLHQudil9LApIaDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
-LHAsbyxuLG09IklQdjQgYWRkcmVzcyBzaG91bGQgY29udGFpbiBleGFjdGx5IDQgcGFydHMiLGw9ImVh
-Y2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTUiLGs9bmV3IFAuY1MoYSksaj1uZXcgVWlu
-dDhBcnJheSg0KQpmb3Iocz1iLHI9cyxxPTA7czxjOysrcyl7cD1DLnhCLk8oYSxzKQppZihwIT09NDYp
-e2lmKChwXjQ4KT45KWsuJDIoImludmFsaWQgY2hhcmFjdGVyIixzKX1lbHNle2lmKHE9PT0zKWsuJDIo
-bSxzKQpvPVAuUUEoQy54Qi5OaihhLHIscyksbnVsbCkKaWYobz4yNTUpay4kMihsLHIpCm49cSsxCmlm
-KHE+PTQpcmV0dXJuIEguT0goaixxKQpqW3FdPW8Kcj1zKzEKcT1ufX1pZihxIT09MylrLiQyKG0sYykK
-bz1QLlFBKEMueEIuTmooYSxyLGMpLG51bGwpCmlmKG8+MjU1KWsuJDIobCxyKQppZihxPj00KXJldHVy
-biBILk9IKGoscSkKaltxXT1vCnJldHVybiBqfSwKZWc6ZnVuY3Rpb24oYSxiLGEwKXt2YXIgcyxyLHEs
-cCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxjPW5ldyBQLkpUKGQsYSkKaWYoYS5s
-ZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnM9SC5RSShbXSx0LnQpCmZvcihyPWIs
-cT1yLHA9ITEsbz0hMTtyPGEwOysrcil7bj1DLnhCLk8oYSxyKQppZihuPT09NTgpe2lmKHI9PT1iKXsr
-K3IKaWYoQy54Qi5PKGEscikhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNvbG9uLiIscikKcT1yfWlm
-KHI9PT1xKXtpZihwKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxsb3dlZCIscikKQy5O
-bS5pKHMsLTEpCnA9ITB9ZWxzZSBDLk5tLmkocyxjLiQyKHEscikpCnE9cisxfWVsc2UgaWYobj09PTQ2
-KW89ITB9aWYocy5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQptPXE9PT1hMApsPUMuTm0u
-Z3JaKHMpCmlmKG0mJmwhPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIgbGFzdCBgOmAiLGEw
-KQppZighbSlpZighbylDLk5tLmkocyxjLiQyKHEsYTApKQplbHNle2s9UC5IaChhLHEsYTApCkMuTm0u
-aShzLChrWzBdPDw4fGtbMV0pPj4+MCkKQy5ObS5pKHMsKGtbMl08PDh8a1szXSk+Pj4wKX1pZihwKXtp
-ZihzLmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11c3QgaGF2ZSBsZXNz
-IHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYocy5sZW5ndGghPT04KWQuJDEoImFuIGFkZHJlc3Mgd2l0aG91
-dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQpqPW5ldyBVaW50OEFycmF5
-KDE2KQpmb3IobD1zLmxlbmd0aCxpPTktbCxyPTAsaD0wO3I8bDsrK3Ipe2c9c1tyXQppZihnPT09LTEp
-Zm9yKGY9MDtmPGk7KytmKXtpZihoPDB8fGg+PTE2KXJldHVybiBILk9IKGosaCkKaltoXT0wCmU9aCsx
-CmlmKGU+PTE2KXJldHVybiBILk9IKGosZSkKaltlXT0wCmgrPTJ9ZWxzZXtlPUMuam4ud0coZyw4KQpp
-ZihoPDB8fGg+PTE2KXJldHVybiBILk9IKGosaCkKaltoXT1lCmU9aCsxCmlmKGU+PTE2KXJldHVybiBI
-Lk9IKGosZSkKaltlXT1nJjI1NQpoKz0yfX1yZXR1cm4gan0sCktMOmZ1bmN0aW9uKGEsYixjLGQsZSxm
-LGcpe3ZhciBzLHIscSxwLG8sbgpmPWY9PW51bGw/IiI6UC5QaShmLDAsZi5sZW5ndGgpCmc9UC56Uihn
-LDAsZz09bnVsbD8wOmcubGVuZ3RoKQphPVAuT2UoYSwwLGE9PW51bGw/MDphLmxlbmd0aCwhMSkKcz1Q
-LmxlKG51bGwsMCwwLGUpCnI9UC50RyhudWxsLDAsMCkKZD1QLndCKGQsZikKcT1mPT09ImZpbGUiCmlm
-KGE9PW51bGwpcD1nLmxlbmd0aCE9PTB8fGQhPW51bGx8fHEKZWxzZSBwPSExCmlmKHApYT0iIgpwPWE9
-PW51bGwKbz0hcApiPVAua2EoYiwwLGI9PW51bGw/MDpiLmxlbmd0aCxjLGYsbykKbj1mLmxlbmd0aD09
-PTAKaWYobiYmcCYmIUMueEIubihiLCIvIikpYj1QLndGKGIsIW58fG8pCmVsc2UgYj1QLnhlKGIpCnJl
-dHVybiBuZXcgUC5EbihmLGcscCYmQy54Qi5uKGIsIi8vIik/IiI6YSxkLGIscyxyKX0sCndLOmZ1bmN0
-aW9uKGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuIDgwCmlmKGE9PT0iaHR0cHMiKXJldHVybiA0NDMKcmV0
-dXJuIDB9LApOUjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbgpmb3Iocz1hLmxlbmd0aCxyPTA7
-cjxzOysrcil7cT1DLnhCLlcoYSxyKQpwPUMueEIuVyhiLHIpCm89cV5wCmlmKG8hPT0wKXtpZihvPT09
-MzIpe249cHxvCmlmKDk3PD1uJiZuPD0xMjIpY29udGludWV9cmV0dXJuITF9fXJldHVybiEwfSwKUjM6
-ZnVuY3Rpb24oYSxiLGMpe3Rocm93IEguYihQLnJyKGMsYSxiKSl9LApYZDpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGg9bnVsbCxnPWIubGVuZ3RoCmlmKGchPT0wKXtxPTAK
-d2hpbGUoITApe2lmKCEocTxnKSl7cz0iIgpyPTAKYnJlYWt9aWYoQy54Qi5XKGIscSk9PT02NCl7cz1D
-LnhCLk5qKGIsMCxxKQpyPXErMQpicmVha30rK3F9aWYocjxnJiZDLnhCLlcoYixyKT09PTkxKXtmb3Io
-cD1yLG89LTE7cDxnOysrcCl7bj1DLnhCLlcoYixwKQppZihuPT09MzcmJm88MCl7bT1DLnhCLlFpKGIs
-IjI1IixwKzEpP3ArMjpwCm89cApwPW19ZWxzZSBpZihuPT09OTMpYnJlYWt9aWYocD09PWcpdGhyb3cg
-SC5iKFAucnIoIkludmFsaWQgSVB2NiBob3N0IGVudHJ5LiIsYixyKSkKbD1vPDA/cDpvClAuZWcoYixy
-KzEsbCk7KytwCmlmKHAhPT1nJiZDLnhCLlcoYixwKSE9PTU4KXRocm93IEguYihQLnJyKCJJbnZhbGlk
-IGVuZCBvZiBhdXRob3JpdHkiLGIscCkpfWVsc2UgcD1yCndoaWxlKCEwKXtpZighKHA8Zykpe2s9aApi
-cmVha31pZihDLnhCLlcoYixwKT09PTU4KXtqPUMueEIueW4oYixwKzEpCms9ai5sZW5ndGghPT0wP1Au
-UUEoaixoKTpoCmJyZWFrfSsrcH1pPUMueEIuTmooYixyLHApfWVsc2V7az1oCmk9awpzPSIifXJldHVy
-biBQLktMKGksaCxILlFJKGMuc3BsaXQoIi8iKSx0LnMpLGssZCxhLHMpfSwKa0U6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9MDtyPHM7KytyKXtxPWFbcl0KcD1KLlU2KHEp
-Cm89cC5nQShxKQppZigwPm8pSC52KFAuVEUoMCwwLHAuZ0EocSksbnVsbCxudWxsKSkKaWYoSC5TUShx
-LCIvIiwwKSl7cz1QLkw0KCJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICIrSC5FaihxKSkKdGhyb3cgSC5i
-KHMpfX19LApITjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAKZm9yKHM9SC5xQyhhLGMsbnVsbCxI
-LnQ2KGEpLmMpLHI9cy4kdGkscz1uZXcgSC5hNyhzLHMuZ0Eocyksci5DKCJhNzxhTC5FPiIpKSxyPXIu
-QygiYUwuRSIpO3MuRigpOyl7cT1yLmEocy5kKQpwPVAubnUoJ1siKi86PD4/XFxcXHxdJykKaWYoSC5T
-UShxLHAsMCkpe3M9UC5MNCgiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogIitxKQp0aHJvdyBILmIo
-cyl9fX0sCnJnOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoISg2NTw9YSYmYTw9OTApKXM9OTc8PWEmJmE8
-PTEyMgplbHNlIHM9ITAKaWYocylyZXR1cm4Kcz1QLkw0KCJJbGxlZ2FsIGRyaXZlIGxldHRlciAiK1Au
-T28oYSkpCnRocm93IEguYihzKX0sCndCOmZ1bmN0aW9uKGEsYil7aWYoYSE9bnVsbCYmYT09PVAud0so
-YikpcmV0dXJuIG51bGwKcmV0dXJuIGF9LApPZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxv
-LG4KaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZihiPT09YylyZXR1cm4iIgppZihDLnhCLk8oYSxiKT09
-PTkxKXtzPWMtMQppZihDLnhCLk8oYSxzKSE9PTkzKVAuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8g
-bWF0Y2ggYFtgIGluIGhvc3QiKQpyPWIrMQpxPVAudG8oYSxyLHMpCmlmKHE8cyl7cD1xKzEKbz1QLk9B
-KGEsQy54Qi5RaShhLCIyNSIscCk/cSszOnAscywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxyLHEpCnJl
-dHVybiBDLnhCLk5qKGEsYixxKS50b0xvd2VyQ2FzZSgpK28rIl0ifWZvcihuPWI7bjxjOysrbilpZihD
-LnhCLk8oYSxuKT09PTU4KXtxPUMueEIuWFUoYSwiJSIsYikKcT1xPj1iJiZxPGM/cTpjCmlmKHE8Yyl7
-cD1xKzEKbz1QLk9BKGEsQy54Qi5RaShhLCIyNSIscCk/cSszOnAsYywiJTI1Iil9ZWxzZSBvPSIiClAu
-ZWcoYSxiLHEpCnJldHVybiJbIitDLnhCLk5qKGEsYixxKStvKyJdIn1yZXR1cm4gUC5PTChhLGIsYyl9
-LAp0bzpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Qy54Qi5YVShhLCIlIixiKQpyZXR1cm4gcz49YiYmczxj
-P3M6Y30sCk9BOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGk9ZCE9PSIi
-P25ldyBQLk0oZCk6bnVsbApmb3Iocz1iLHI9cyxxPSEwO3M8Yzspe3A9Qy54Qi5PKGEscykKaWYocD09
-PTM3KXtvPVAucnYoYSxzLCEwKQpuPW89PW51bGwKaWYobiYmcSl7cys9Mwpjb250aW51ZX1pZihpPT1u
-dWxsKWk9bmV3IFAuTSgiIikKbT1pLmErPUMueEIuTmooYSxyLHMpCmlmKG4pbz1DLnhCLk5qKGEscyxz
-KzMpCmVsc2UgaWYobz09PSIlIilQLlIzKGEscywiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFu
-eW1vcmUiKQppLmE9bStvCnMrPTMKcj1zCnE9ITB9ZWxzZXtpZihwPDEyNyl7bj1wPj4+NAppZihuPj04
-KXJldHVybiBILk9IKEMuRjMsbikKbj0oQy5GM1tuXSYxPDwocCYxNSkpIT09MH1lbHNlIG49ITEKaWYo
-bil7aWYocSYmNjU8PXAmJjkwPj1wKXtpZihpPT1udWxsKWk9bmV3IFAuTSgiIikKaWYocjxzKXtpLmEr
-PUMueEIuTmooYSxyLHMpCnI9c31xPSExfSsrc31lbHNle2lmKChwJjY0NTEyKT09PTU1Mjk2JiZzKzE8
-Yyl7bD1DLnhCLk8oYSxzKzEpCmlmKChsJjY0NTEyKT09PTU2MzIwKXtwPShwJjEwMjMpPDwxMHxsJjEw
-MjN8NjU1MzYKaz0yfWVsc2Ugaz0xfWVsc2Ugaz0xCmo9Qy54Qi5OaihhLHIscykKaWYoaT09bnVsbCl7
-aT1uZXcgUC5NKCIiKQpuPWl9ZWxzZSBuPWkKbi5hKz1qCm4uYSs9UC56WChwKQpzKz1rCnI9c319fWlm
-KGk9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMpCmlmKHI8YylpLmErPUMueEIuTmooYSxyLGMpCm49
-aS5hCnJldHVybiBuLmNoYXJDb2RlQXQoMCk9PTA/bjpufSwKT0w6ZnVuY3Rpb24oYSxiLGMpe3ZhciBz
-LHIscSxwLG8sbixtLGwsayxqLGkKZm9yKHM9YixyPXMscT1udWxsLHA9ITA7czxjOyl7bz1DLnhCLk8o
-YSxzKQppZihvPT09Mzcpe249UC5ydihhLHMsITApCm09bj09bnVsbAppZihtJiZwKXtzKz0zCmNvbnRp
-bnVlfWlmKHE9PW51bGwpcT1uZXcgUC5NKCIiKQpsPUMueEIuTmooYSxyLHMpCms9cS5hKz0hcD9sLnRv
-TG93ZXJDYXNlKCk6bAppZihtKXtuPUMueEIuTmooYSxzLHMrMykKaj0zfWVsc2UgaWYobj09PSIlIil7
-bj0iJTI1IgpqPTF9ZWxzZSBqPTMKcS5hPWsrbgpzKz1qCnI9cwpwPSEwfWVsc2V7aWYobzwxMjcpe209
-bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmVhLG0pCm09KEMuZWFbbV0mMTw8KG8mMTUpKSE9PTB9
-ZWxzZSBtPSExCmlmKG0pe2lmKHAmJjY1PD1vJiY5MD49byl7aWYocT09bnVsbClxPW5ldyBQLk0oIiIp
-CmlmKHI8cyl7cS5hKz1DLnhCLk5qKGEscixzKQpyPXN9cD0hMX0rK3N9ZWxzZXtpZihvPD05Myl7bT1v
-Pj4+NAppZihtPj04KXJldHVybiBILk9IKEMuYWssbSkKbT0oQy5ha1ttXSYxPDwobyYxNSkpIT09MH1l
-bHNlIG09ITEKaWYobSlQLlIzKGEscywiSW52YWxpZCBjaGFyYWN0ZXIiKQplbHNle2lmKChvJjY0NTEy
-KT09PTU1Mjk2JiZzKzE8Yyl7aT1DLnhCLk8oYSxzKzEpCmlmKChpJjY0NTEyKT09PTU2MzIwKXtvPShv
-JjEwMjMpPDwxMHxpJjEwMjN8NjU1MzYKaj0yfWVsc2Ugaj0xfWVsc2Ugaj0xCmw9Qy54Qi5OaihhLHIs
-cykKaWYoIXApbD1sLnRvTG93ZXJDYXNlKCkKaWYocT09bnVsbCl7cT1uZXcgUC5NKCIiKQptPXF9ZWxz
-ZSBtPXEKbS5hKz1sCm0uYSs9UC56WChvKQpzKz1qCnI9c319fX1pZihxPT1udWxsKXJldHVybiBDLnhC
-Lk5qKGEsYixjKQppZihyPGMpe2w9Qy54Qi5OaihhLHIsYykKcS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6
-bH1tPXEuYQpyZXR1cm4gbS5jaGFyQ29kZUF0KDApPT0wP206bX0sClBpOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgcyxyLHEscAppZihiPT09YylyZXR1cm4iIgppZighUC5FdChDLnhCLlcoYSxiKSkpUC5SMyhhLGIs
-IlNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3RlciIpCmZvcihzPWIscj0h
-MTtzPGM7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE8MTI4KXtwPXE+Pj40CmlmKHA+PTgpcmV0dXJuIEgu
-T0goQy5tSyxwKQpwPShDLm1LW3BdJjE8PChxJjE1KSkhPT0wfWVsc2UgcD0hMQppZighcClQLlIzKGEs
-cywiSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyIikKaWYoNjU8PXEmJnE8PTkwKXI9ITB9YT1DLnhCLk5q
-KGEsYixjKQpyZXR1cm4gUC5ZYShyP2EudG9Mb3dlckNhc2UoKTphKX0sCllhOmZ1bmN0aW9uKGEpe2lm
-KGE9PT0iaHR0cCIpcmV0dXJuImh0dHAiCmlmKGE9PT0iZmlsZSIpcmV0dXJuImZpbGUiCmlmKGE9PT0i
-aHR0cHMiKXJldHVybiJodHRwcyIKaWYoYT09PSJwYWNrYWdlIilyZXR1cm4icGFja2FnZSIKcmV0dXJu
-IGF9LAp6UjpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbClyZXR1cm4iIgpyZXR1cm4gUC5QSShhLGIs
-YyxDLnRvLCExKX0sCmthOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgcyxyLHE9ZT09PSJmaWxlIixw
-PXF8fGYKaWYoYT09bnVsbCl7aWYoZD09bnVsbClyZXR1cm4gcT8iLyI6IiIKcz1ILnQ2KGQpCnI9bmV3
-IEgubEooZCxzLkMoInFVKDEpIikuYShuZXcgUC5SWigpKSxzLkMoImxKPDEscVU+IikpLmsoMCwiLyIp
-fWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBwYXRoIGFuZCBwYXRoU2VnbWVudHMg
-c3BlY2lmaWVkIikpCmVsc2Ugcj1QLlBJKGEsYixjLEMuV2QsITApCmlmKHIubGVuZ3RoPT09MCl7aWYo
-cSlyZXR1cm4iLyJ9ZWxzZSBpZihwJiYhQy54Qi5uKHIsIi8iKSlyPSIvIityCnJldHVybiBQLkpyKHIs
-ZSxmKX0sCkpyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1iLmxlbmd0aD09PTAKaWYocyYmIWMmJiFDLnhC
-Lm4oYSwiLyIpKXJldHVybiBQLndGKGEsIXN8fGMpCnJldHVybiBQLnhlKGEpfSwKbGU6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHMscj17fQppZihhIT1udWxsKXtpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJC
-b3RoIHF1ZXJ5IGFuZCBxdWVyeVBhcmFtZXRlcnMgc3BlY2lmaWVkIikpCnJldHVybiBQLlBJKGEsYixj
-LEMuVkMsITApfWlmKGQ9PW51bGwpcmV0dXJuIG51bGwKcz1uZXcgUC5NKCIiKQpyLmE9IiIKZC5LKDAs
-bmV3IFAueTUobmV3IFAuTUUocixzKSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpy
-fSwKdEc6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxi
-LGMsQy5WQywhMCl9LApydjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1h
-Lmxlbmd0aClyZXR1cm4iJSIKcz1DLnhCLk8oYSxiKzEpCnI9Qy54Qi5PKGEsbikKcT1ILm9vKHMpCnA9
-SC5vbyhyKQppZihxPDB8fHA8MClyZXR1cm4iJSIKbz1xKjE2K3AKaWYobzwxMjcpe249Qy5qbi53Ryhv
-LDQpCmlmKG4+PTgpcmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChvJjE1KSkhPT0wfWVs
-c2Ugbj0hMQppZihuKXJldHVybiBILkx3KGMmJjY1PD1vJiY5MD49bz8ob3wzMik+Pj4wOm8pCmlmKHM+
-PTk3fHxyPj05NylyZXR1cm4gQy54Qi5OaihhLGIsYiszKS50b1VwcGVyQ2FzZSgpCnJldHVybiBudWxs
-fSwKelg6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrPSIwMTIzNDU2Nzg5QUJDREVGIgpp
-ZihhPDEyOCl7cz1uZXcgVWludDhBcnJheSgzKQpzWzBdPTM3CnNbMV09Qy54Qi5XKGssYT4+PjQpCnNb
-Ml09Qy54Qi5XKGssYSYxNSl9ZWxzZXtpZihhPjIwNDcpaWYoYT42NTUzNSl7cj0yNDAKcT00fWVsc2V7
-cj0yMjQKcT0zfWVsc2V7cj0xOTIKcT0yfXA9MypxCnM9bmV3IFVpbnQ4QXJyYXkocCkKZm9yKG89MDst
-LXEscT49MDtyPTEyOCl7bj1DLmpuLmJmKGEsNipxKSY2M3xyCmlmKG8+PXApcmV0dXJuIEguT0gocyxv
-KQpzW29dPTM3Cm09bysxCmw9Qy54Qi5XKGssbj4+PjQpCmlmKG0+PXApcmV0dXJuIEguT0gocyxtKQpz
-W21dPWwKbD1vKzIKbT1DLnhCLlcoayxuJjE1KQppZihsPj1wKXJldHVybiBILk9IKHMsbCkKc1tsXT1t
-Cm8rPTN9fXJldHVybiBQLkhNKHMsMCxudWxsKX0sClBJOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9
-UC5VbChhLGIsYyxkLGUpCnJldHVybiBzPT1udWxsP0MueEIuTmooYSxiLGMpOnN9LApVbDpmdW5jdGlv
-bihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPW51bGwKZm9yKHM9IWUscj1iLHE9cixw
-PWo7cjxjOyl7bz1DLnhCLk8oYSxyKQppZihvPDEyNyl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9I
-KGQsbikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobikrK3IKZWxzZXtpZihvPT09
-Mzcpe209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMKY29udGludWV9aWYoIiUiPT09bSl7bT0i
-JTI1IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkzKXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJu
-IEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQplbHNlIG49ITEK
-aWYobil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikKbD1qCm09bH1lbHNle2lmKChvJjY0NTEy
-KT09PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9Qy54Qi5PKGEsbikKaWYoKGsmNjQ1MTIpPT09NTYzMjAp
-e289KG8mMTAyMyk8PDEwfGsmMTAyM3w2NTUzNgpsPTJ9ZWxzZSBsPTF9ZWxzZSBsPTF9ZWxzZSBsPTEK
-bT1QLnpYKG8pfX1pZihwPT1udWxsKXtwPW5ldyBQLk0oIiIpCm49cH1lbHNlIG49cApuLmErPUMueEIu
-TmooYSxxLHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBILnBZKGwp
-CnIrPWwKcT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8YylwLmErPUMueEIuTmooYSxxLGMpCnM9
-cC5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUI6ZnVuY3Rpb24oYSl7aWYoQy54Qi5u
-KGEsIi4iKSlyZXR1cm4hMApyZXR1cm4gQy54Qi5PWShhLCIvLiIpIT09LTF9LAp4ZTpmdW5jdGlvbihh
-KXt2YXIgcyxyLHEscCxvLG4sbQppZighUC55QihhKSlyZXR1cm4gYQpzPUguUUkoW10sdC5zKQpmb3Io
-cj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtvPHE7KytvKXtuPXJbb10KaWYoSi5STShu
-LCIuLiIpKXttPXMubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1tKXJldHVybiBILk9IKHMsLTEpCnMucG9w
-KCkKaWYocy5sZW5ndGg9PT0wKUMuTm0uaShzLCIiKX1wPSEwfWVsc2UgaWYoIi4iPT09bilwPSEwCmVs
-c2V7Qy5ObS5pKHMsbikKcD0hMX19aWYocClDLk5tLmkocywiIikKcmV0dXJuIEMuTm0uayhzLCIvIil9
-LAp3RjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbgppZighUC55QihhKSlyZXR1cm4hYj9QLkMx
-KGEpOmEKcz1ILlFJKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgscD0hMSxvPTA7
-bzxxOysrbyl7bj1yW29dCmlmKCIuLiI9PT1uKWlmKHMubGVuZ3RoIT09MCYmQy5ObS5ncloocykhPT0i
-Li4iKXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnA9ITB9ZWxzZXtDLk5t
-LmkocywiLi4iKQpwPSExfWVsc2UgaWYoIi4iPT09bilwPSEwCmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19
-cj1zLmxlbmd0aAppZihyIT09MClpZihyPT09MSl7aWYoMD49cilyZXR1cm4gSC5PSChzLDApCnI9c1sw
-XS5sZW5ndGg9PT0wfWVsc2Ugcj0hMQplbHNlIHI9ITAKaWYocilyZXR1cm4iLi8iCmlmKHB8fEMuTm0u
-Z3JaKHMpPT09Ii4uIilDLk5tLmkocywiIikKaWYoIWIpe2lmKDA+PXMubGVuZ3RoKXJldHVybiBILk9I
-KHMsMCkKQy5ObS5ZNShzLDAsUC5DMShzWzBdKSl9cmV0dXJuIEMuTm0uayhzLCIvIil9LApDMTpmdW5j
-dGlvbihhKXt2YXIgcyxyLHEscD1hLmxlbmd0aAppZihwPj0yJiZQLkV0KEMueEIuVyhhLDApKSlmb3Io
-cz0xO3M8cDsrK3Mpe3I9Qy54Qi5XKGEscykKaWYocj09PTU4KXJldHVybiBDLnhCLk5qKGEsMCxzKSsi
-JTNBIitDLnhCLnluKGEscysxKQppZihyPD0xMjcpe3E9cj4+PjQKaWYocT49OClyZXR1cm4gSC5PSChD
-Lm1LLHEpCnE9KEMubUtbcV0mMTw8KHImMTUpKT09PTB9ZWxzZSBxPSEwCmlmKHEpYnJlYWt9cmV0dXJu
-IGF9LAp1ajpmdW5jdGlvbihhLGIpe2lmKGEuaEIoInBhY2thZ2UiKSYmYS5jPT1udWxsKXJldHVybiBQ
-LmZGKGIsMCxiLmxlbmd0aCkKcmV0dXJuLTF9LAptbjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLmdG
-aigpLG89cC5sZW5ndGgKaWYobz4wJiZKLkhtKHBbMF0pPT09MiYmSi5hNihwWzBdLDEpPT09NTgpe2lm
-KDA+PW8pcmV0dXJuIEguT0gocCwwKQpQLnJnKEouYTYocFswXSwwKSwhMSkKUC5ITihwLCExLDEpCnM9
-ITB9ZWxzZXtQLkhOKHAsITEsMCkKcz0hMX1yPWEuZ3RUKCkmJiFzPyIiKyJcXCI6IiIKaWYoYS5nY2oo
-KSl7cT1hLmdKZihhKQppZihxLmxlbmd0aCE9PTApcj1yKyJcXCIrcSsiXFwifXI9UC5sKHIscCwiXFwi
-KQpvPXMmJm89PT0xP3IrIlxcIjpyCnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/bzpvfSwKSWg6ZnVu
-Y3Rpb24oYSxiKXt2YXIgcyxyLHEKZm9yKHM9MCxyPTA7cjwyOysrcil7cT1DLnhCLlcoYSxiK3IpCmlm
-KDQ4PD1xJiZxPD01NylzPXMqMTYrcS00OAplbHNle3F8PTMyCmlmKDk3PD1xJiZxPD0xMDIpcz1zKjE2
-K3EtODcKZWxzZSB0aHJvdyBILmIoUC54WSgiSW52YWxpZCBVUkwgZW5jb2RpbmciKSl9fXJldHVybiBz
-fSwKa3U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvPWIKd2hpbGUoITApe2lmKCEobzxj
-KSl7cz0hMApicmVha31yPUMueEIuVyhhLG8pCmlmKHI8PTEyNylpZihyIT09MzcpcT1lJiZyPT09NDMK
-ZWxzZSBxPSEwCmVsc2UgcT0hMAppZihxKXtzPSExCmJyZWFrfSsrb31pZihzKXtpZihDLnhNIT09ZClx
-PSExCmVsc2UgcT0hMAppZihxKXJldHVybiBDLnhCLk5qKGEsYixjKQplbHNlIHA9bmV3IEgucWooQy54
-Qi5OaihhLGIsYykpfWVsc2V7cD1ILlFJKFtdLHQudCkKZm9yKHE9YS5sZW5ndGgsbz1iO288YzsrK28p
-e3I9Qy54Qi5XKGEsbykKaWYocj4xMjcpdGhyb3cgSC5iKFAueFkoIklsbGVnYWwgcGVyY2VudCBlbmNv
-ZGluZyBpbiBVUkkiKSkKaWYocj09PTM3KXtpZihvKzM+cSl0aHJvdyBILmIoUC54WSgiVHJ1bmNhdGVk
-IFVSSSIpKQpDLk5tLmkocCxQLkloKGEsbysxKSkKbys9Mn1lbHNlIGlmKGUmJnI9PT00MylDLk5tLmko
-cCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5MLmEocCkKcmV0dXJuIEMub0UuV0oocCl9LApFdDpmdW5j
-dGlvbihhKXt2YXIgcz1hfDMyCnJldHVybiA5Nzw9cyYmczw9MTIyfSwKS0Q6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52YWxpZCBNSU1FIHR5cGUiLGo9SC5RSShbYi0xXSx0LnQp
-CmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9
-PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhyb3cgSC5i
-KFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIpdGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3IoO3AhPT00
-NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0tMTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9PT02
-MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5ObS5pKGos
-bykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAhPT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwiYmFzZTY0
-IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5ObS5pKGos
-cikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1QLlVsKGEs
-bSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1DLnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcgUC5QRShh
-LGosYyl9LApLTjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtPSIwMTIzNDU2Nzg5QUJDREVGR0hJ
-SktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIs
-bD0iLiIsaz0iOiIsaj0iLyIsaT0iPyIsaD0iIyIsZz1ILlFJKG5ldyBBcnJheSgyMiksdC5nTikKZm9y
-KHM9MDtzPDIyOysrcylnW3NdPW5ldyBVaW50OEFycmF5KDk2KQpyPW5ldyBQLnlJKGcpCnE9bmV3IFAu
-YzYoKQpwPW5ldyBQLnFkKCkKbz10LmdjCm49by5hKHIuJDIoMCwyMjUpKQpxLiQzKG4sbSwxKQpxLiQz
-KG4sbCwxNCkKcS4kMyhuLGssMzQpCnEuJDMobixqLDMpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1
-KQpuPW8uYShyLiQyKDE0LDIyNSkpCnEuJDMobixtLDEpCnEuJDMobixsLDE1KQpxLiQzKG4saywzNCkK
-cS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNSwyMjUp
-KQpxLiQzKG4sbSwxKQpxLiQzKG4sIiUiLDIyNSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDkpCnEuJDMo
-bixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhu
-LGssMzQpCnEuJDMobixqLDEwKQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigy
-LDIzNSkpCnEuJDMobixtLDEzOSkKcS4kMyhuLGosMTMxKQpxLiQzKG4sbCwxNDYpCnEuJDMobixpLDE3
-MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDMsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDY4
-KQpxLiQzKG4sbCwxOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNCwyMjkp
-KQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4kMyhuLCJAIiw2OCkK
-cS4kMyhuLCJbIiwyMzIpCnEuJDMobixqLDEzOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49
-by5hKHIuJDIoNSwyMjkpKQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikK
-cS4kMyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1v
-LmEoci4kMig2LDIzMSkpCnAuJDMobiwiMTkiLDcpCnEuJDMobiwiQCIsNjgpCnEuJDMobixqLDEzOCkK
-cS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNywyMzEpKQpwLiQzKG4sIjA5Iiw3
-KQpxLiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpx
-LiQzKG8uYShyLiQyKDgsOCkpLCJdIiw1KQpuPW8uYShyLiQyKDksMjM1KSkKcS4kMyhuLG0sMTEpCnEu
-JDMobixsLDE2KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShy
-LiQyKDE2LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNykKcS4kMyhuLGosMjM0KQpxLiQzKG4s
-aSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNywyMzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhu
-LGosOSkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTAsMjM1KSkKcS4kMyhu
-LG0sMTEpCnEuJDMobixsLDE4KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1
-KQpuPW8uYShyLiQyKDE4LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxOSkKcS4kMyhuLGosMjM0
-KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxOSwyMzUpKQpxLiQzKG4sbSwx
-MSkKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMSwy
-MzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosMTApCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
-PW8uYShyLiQyKDEyLDIzNikpCnEuJDMobixtLDEyKQpxLiQzKG4saSwxMikKcS4kMyhuLGgsMjA1KQpu
-PW8uYShyLiQyKDEzLDIzNykpCnEuJDMobixtLDEzKQpxLiQzKG4saSwxMykKcC4kMyhvLmEoci4kMigy
-MCwyNDUpKSwiYXoiLDIxKQpyPW8uYShyLiQyKDIxLDI0NSkpCnAuJDMociwiYXoiLDIxKQpwLiQzKHIs
-IjA5IiwyMSkKcS4kMyhyLCIrLS4iLDIxKQpyZXR1cm4gZ30sClVCOmZ1bmN0aW9uKGEsYixjLGQsZSl7
-dmFyIHMscixxLHAsbz0kLnZaKCkKZm9yKHM9YjtzPGM7KytzKXtpZihkPDB8fGQ+PW8ubGVuZ3RoKXJl
-dHVybiBILk9IKG8sZCkKcj1vW2RdCnE9Qy54Qi5XKGEscyleOTYKcD1yW3E+OTU/MzE6cV0KZD1wJjMx
-CkMuTm0uWTUoZSxwPj4+NSxzKX1yZXR1cm4gZH0sClJ4OmZ1bmN0aW9uKGEpe2lmKGEuYj09PTcmJkMu
-eEIubihhLmEsInBhY2thZ2UiKSYmYS5jPD0wKXJldHVybiBQLmZGKGEuYSxhLmUsYS5mKQpyZXR1cm4t
-MX0sCmZGOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEKZm9yKHM9YixyPTA7czxjOysrcyl7cT1DLnhC
-Lk8oYSxzKQppZihxPT09NDcpcmV0dXJuIHIhPT0wP3M6LTEKaWYocT09PTM3fHxxPT09NTgpcmV0dXJu
-LTEKcnw9cV40Nn1yZXR1cm4tMX0sCldGOmZ1bmN0aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
-LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9
-LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlv
-biBGKCl7fSwKQVQ6ZnVuY3Rpb24gQVQoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
-YwpfLmQ9ZH0sCmJKOmZ1bmN0aW9uIGJKKGEsYixjLGQsZSxmKXt2YXIgXz10aGlzCl8uZT1hCl8uZj1i
-Cl8uYT1jCl8uYj1kCl8uYz1lCl8uZD1mfSwKZVk6ZnVuY3Rpb24gZVkoYSxiLGMsZCxlKXt2YXIgXz10
-aGlzCl8uZj1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKbXA6ZnVuY3Rpb24gbXAoYSxiLGMsZCl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCnViOmZ1bmN0aW9uIHViKGEpe3RoaXMu
-YT1hfSwKZHM6ZnVuY3Rpb24gZHMoYSl7dGhpcy5hPWF9LApsajpmdW5jdGlvbiBsaihhKXt0aGlzLmE9
-YX0sClVWOmZ1bmN0aW9uIFVWKGEpe3RoaXMuYT1hfSwKazU6ZnVuY3Rpb24gazUoKXt9LApLWTpmdW5j
-dGlvbiBLWSgpe30sCnA6ZnVuY3Rpb24gcChhKXt0aGlzLmE9YX0sCkNEOmZ1bmN0aW9uIENEKGEpe3Ro
-aXMuYT1hfSwKYUU6ZnVuY3Rpb24gYUUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwK
-Y1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlvbiBBbigpe30sCk4zOmZ1bmN0aW9uIE4zKGEsYixj
-KXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKYzg6ZnVuY3Rpb24gYzgoKXt9LApNaDpmdW5j
-dGlvbiBNaCgpe30sClpkOmZ1bmN0aW9uIFpkKCl7fSwKTTpmdW5jdGlvbiBNKGEpe3RoaXMuYT1hfSwK
-bjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApjUzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZD
-OmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlz
-LmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
-Xy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5RPV8uej1fLnk9Xy54PW51bGx9LApSWjpmdW5j
-dGlvbiBSWigpe30sCk1FOmZ1bmN0aW9uIE1FKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp5NTpmdW5j
-dGlvbiB5NShhKXt0aGlzLmE9YX0sClBFOmZ1bmN0aW9uIFBFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sCnlJOmZ1bmN0aW9uIHlJKGEpe3RoaXMuYT1hfSwKYzY6ZnVuY3Rpb24gYzYoKXt9
-LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0aW9uIFVmKGEsYixjLGQsZSxmLGcsaCl7dmFyIF89
-dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLng9aApfLnk9bnVs
-bH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5j
-PWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5RPV8uej1fLnk9Xy54PW51bGx9LAppSjpmdW5jdGlv
-biBpSigpe30sCkUyOmZ1bmN0aW9uIEUyKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApqZzpmdW5jdGlv
-biBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5hPWF9LApO
-NzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEoKXt9LApo
-RjpmdW5jdGlvbiBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQpILnA4KGIpCnQu
-ai5hKGQpCmlmKGIpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9cj10LnoKcT1QLkNIKEouTTEoZCxQLncw
-KCksciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5FayhhLHEsbnVsbCkpfSwKRG06ZnVuY3Rp
-b24oYSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYhT2JqZWN0LnByb3Rv
-dHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3Zh
-bHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4hMX0sCk9tOmZ1bmN0aW9uKGEs
-Yil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpcmV0dXJuIGFbYl0K
-cmV0dXJuIG51bGx9LAp3WTpmdW5jdGlvbihhKXtpZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8
-fHR5cGVvZiBhPT0ibnVtYmVyInx8SC5yUShhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNCly
-ZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5iKGEpKXJldHVybiBhCmlmKGEgaW5z
-dGFuY2VvZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEpKXJldHVybiBQLmhFKGEsIiRkYXJ0
-X2pzRnVuY3Rpb24iLG5ldyBQLlBDKCkpCnJldHVybiBQLmhFKGEsIl8kZGFydF9qc09iamVjdCIsbmV3
-IFAubXQoJC5rSSgpKSl9LApoRTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51
-bGwpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCmRVOmZ1bmN0aW9uKGEpe3ZhciBzLHIK
-aWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBh
-PT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZILlI5KGEpKXJl
-dHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYmdC5hay5iKGEpKXJldHVybiBhCmVsc2Ug
-aWYoYSBpbnN0YW5jZW9mIERhdGUpe3M9SC5JWihhLmdldFRpbWUoKSkKaWYoTWF0aC5hYnMocyk8PTg2
-NGUxMylyPSExCmVsc2Ugcj0hMAppZihyKUgudihQLnhZKCJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlk
-IHJhbmdlOiAiK3MpKQpILmNiKCExLCJpc1V0YyIsdC55KQpyZXR1cm4gbmV3IFAuaVAocywhMSl9ZWxz
-ZSBpZihhLmNvbnN0cnVjdG9yPT09JC5rSSgpKXJldHVybiBhLm8KZWxzZSByZXR1cm4gUC5ORChhKX0s
-Ck5EOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBQLmlRKGEsJC56KCks
-bmV3IFAuUVMoKSkKaWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQ
-Lm5wKCkpCnJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLlV0KCkpfSwKaVE6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciBzPVAuT20oYSxiKQppZihzPT1udWxsfHwhKGEgaW5zdGFuY2VvZiBPYmplY3QpKXtzPWMuJDEo
-YSkKUC5EbShhLGIscyl9cmV0dXJuIHN9LApQQzpmdW5jdGlvbiBQQygpe30sCm10OmZ1bmN0aW9uIG10
-KGEpe3RoaXMuYT1hfSwKUVM6ZnVuY3Rpb24gUVMoKXt9LApucDpmdW5jdGlvbiBucCgpe30sClV0OmZ1
-bmN0aW9uIFV0KCl7fSwKRTQ6ZnVuY3Rpb24gRTQoYSl7dGhpcy5hPWF9LApyNzpmdW5jdGlvbiByNyhh
-KXt0aGlzLmE9YX0sClR6OmZ1bmN0aW9uIFR6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCnZnOmZ1
-bmN0aW9uIHZnKCl7fSwKbmQ6ZnVuY3Rpb24gbmQoKXt9LApLZTpmdW5jdGlvbiBLZShhKXt0aGlzLmE9
-YX0sCmhpOmZ1bmN0aW9uIGhpKCl7fX0sUj17Cm56OmZ1bmN0aW9uKGEpe3ZhciBzPUguVWMoYS5xKDAs
-Im5vZGVJZCIpKQpyZXR1cm4gbmV3IFIuTEwoQy5ObS5IdChDLnJrLG5ldyBSLk1EKGEpKSxzKX0sCk9Y
-OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIEMuQWQ6cmV0dXJuIkFkZCAvKj8qLyBoaW50IgpjYXNl
-IEMubmU6cmV0dXJuIkFkZCAvKiEqLyBoaW50IgpjYXNlIEMud1Y6cmV0dXJuIlJlbW92ZSAvKj8qLyBo
-aW50IgpjYXNlIEMuZlI6cmV0dXJuIlJlbW92ZSAvKiEqLyBoaW50IgpjYXNlIEMubXk6cmV0dXJuIkNo
-YW5nZSB0byAvKj8qLyBoaW50IgpjYXNlIEMucng6cmV0dXJuIkNoYW5nZSB0byAvKiEqLyBoaW50In19
-LApMTDpmdW5jdGlvbiBMTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTUQ6ZnVuY3Rpb24gTUQoYSl7
-dGhpcy5hPWF9LApINzpmdW5jdGlvbiBINyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifX0sVD17bVE6ZnVu
-Y3Rpb24gbVEoKXt9fSxVPXsKamY6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKaWYoYT09bnVsbClzPW51
-bGwKZWxzZXtzPUguUUkoW10sdC5mQSkKZm9yKHI9Si5JVCh0LlIuYShhKSk7ci5GKCk7KXtxPXIuZ2wo
-KQpwPUouVTYocSkKcy5wdXNoKG5ldyBVLlNlKEguayhwLnEocSwiZGVzY3JpcHRpb24iKSksSC5rKHAu
-cShxLCJocmVmIikpKSl9fXJldHVybiBzfSwKTmQ6ZnVuY3Rpb24oYSl7dmFyIHMscgppZihhPT1udWxs
-KXM9bnVsbAplbHNle3M9SC5RSShbXSx0LmhoKQpmb3Iocj1KLklUKHQuUi5hKGEpKTtyLkYoKTspcy5w
-dXNoKFUuTmYoci5nbCgpKSl9cmV0dXJuIHN9LApOZjpmdW5jdGlvbihhKXt2YXIgcz1KLlU2KGEpLHI9
-SC5rKHMucShhLCJkZXNjcmlwdGlvbiIpKSxxPUguUUkoW10sdC5hSikKZm9yKHM9Si5JVCh0LlIuYShz
-LnEoYSwiZW50cmllcyIpKSk7cy5GKCk7KXEucHVzaChVLlJqKHMuZ2woKSkpCnJldHVybiBuZXcgVS55
-RChyLHEpfSwKUmo6ZnVuY3Rpb24oYSl7dmFyIHMscj1KLlU2KGEpLHE9SC5rKHIucShhLCJkZXNjcmlw
-dGlvbiIpKSxwPUguayhyLnEoYSwiZnVuY3Rpb24iKSksbz1yLnEoYSwibGluayIpCmlmKG89PW51bGwp
-bz1udWxsCmVsc2V7cz1KLlU2KG8pCm89bmV3IFUuTWwoSC5rKHMucShvLCJocmVmIikpLEguVWMocy5x
-KG8sImxpbmUiKSksSC5rKHMucShvLCJwYXRoIikpKX1yPXQuYk0uYShyLnEoYSwiaGludEFjdGlvbnMi
-KSkKcj1yPT1udWxsP251bGw6Si5NMShyLG5ldyBVLmFOKCksdC5KKS5icigwKQpyZXR1cm4gbmV3IFUu
-d2IocSxwLG8scj09bnVsbD9DLmRuOnIpfSwKZDI6ZnVuY3Rpb24gZDIoYSxiLGMsZCxlLGYpe3ZhciBf
-PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWZ9LApTZTpmdW5jdGlvbiBTZShh
-LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6ZnVuY3Rpb24gTWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
-Yj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24geUQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1
-bmN0aW9uIHdiKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAphTjpm
-dW5jdGlvbiBhTigpe30sCmIwOmZ1bmN0aW9uIGIwKCl7fX0sVz17CngzOmZ1bmN0aW9uKCl7cmV0dXJu
-IHdpbmRvd30sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50fSwKSjY6ZnVuY3Rpb24oYSl7dmFy
-IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCmlmKGEhPW51bGwpQy54bi5zTFUocyxhKQpyZXR1
-cm4gc30sCkxqOmZ1bmN0aW9uKGEpe3JldHVybiBDU1MuZXNjYXBlKGEpfSwKVTk6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBzLHI9ZG9jdW1lbnQuYm9keQpyLnRvU3RyaW5nCnM9dC5hYwpzPW5ldyBILlU1KG5ldyBX
-LmU3KEMuUlkucjYocixhLGIsYykpLHMuQygiYTIobEQuRSkiKS5hKG5ldyBXLkN2KCkpLHMuQygiVTU8
-bEQuRT4iKSkKcmV0dXJuIHQuaC5hKHMuZ3I4KHMpKX0sCnJTOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT0i
-ZWxlbWVudCB0YWcgdW5hdmFpbGFibGUiCnRyeXtzPUouWUUoYSkKcy5nbnMoYSkKcT1zLmducyhhKX1j
-YXRjaChyKXtILlJ1KHIpfXJldHVybiBxfSwKQzA6ZnVuY3Rpb24oYSxiKXthPWErYiY1MzY4NzA5MTEK
-YT1hKygoYSY1MjQyODcpPDwxMCkmNTM2ODcwOTExCnJldHVybiBhXmE+Pj42fSwKckU6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHM9Vy5DMChXLkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHI9cysoKHMmNjcx
-MDg4NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+PjExCnJldHVybiByKygociYxNjM4Myk8PDE1KSY1MzY4
-NzA5MTF9LApUTjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1hLmNsYXNzTGlzdApmb3Iocz1iLmxlbmd0
-aCxyPTA7cjxiLmxlbmd0aDtiLmxlbmd0aD09PXN8fCgwLEgubGspKGIpLCsrcilxLmFkZChiW3JdKX0s
-CkpFOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9Vy5hRihuZXcgVy52TihjKSx0LkIpCmlmKHMhPW51
-bGwmJiEwKUouZFooYSxiLHMsITEpCnJldHVybiBuZXcgVy54QyhhLGIscywhMSxlLkMoInhDPDA+Iikp
-fSwKVHc6ZnVuY3Rpb24oYSl7dmFyIHM9Vy5KNihudWxsKSxyPXQuRi5hKHdpbmRvdy5sb2NhdGlvbikK
-cz1uZXcgVy5KUShuZXcgVy5tayhzLHIpKQpzLkNZKGEpCnJldHVybiBzfSwKcUQ6ZnVuY3Rpb24oYSxi
-LGMsZCl7dC5oLmEoYSkKSC5uKGIpCkgubihjKQp0LmNyLmEoZCkKcmV0dXJuITB9LApuWjpmdW5jdGlv
-bihhLGIsYyxkKXt2YXIgcyxyLHEKdC5oLmEoYSkKSC5uKGIpCkgubihjKQpzPXQuY3IuYShkKS5hCnI9
-cy5hCkMueG4uc0xVKHIsYykKcT1yLmhvc3RuYW1lCnM9cy5iCmlmKCEocT09cy5ob3N0bmFtZSYmci5w
-b3J0PT09cy5wb3J0JiZyLnByb3RvY29sPT09cy5wcm90b2NvbCkpaWYocT09PSIiKWlmKHIucG9ydD09
-PSIiKXtzPXIucHJvdG9jb2wKcz1zPT09IjoifHxzPT09IiJ9ZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNl
-IHM9ITAKcmV0dXJuIHN9LApCbDpmdW5jdGlvbigpe3ZhciBzPXQuTixyPVAudE0oQy5ReCxzKSxxPXQu
-ZEcuYShuZXcgVy5JQSgpKSxwPUguUUkoWyJURU1QTEFURSJdLHQucykKcz1uZXcgVy5jdChyLFAuTHMo
-cyksUC5McyhzKSxQLkxzKHMpLG51bGwpCnMuQ1kobnVsbCxuZXcgSC5sSihDLlF4LHEsdC5EKSxwLG51
-bGwpCnJldHVybiBzfSwKcWM6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4gbnVsbApp
-ZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5QMShhKQpyZXR1cm4gc31lbHNlIHJldHVybiB0LmNoLmEo
-YSl9LApQMTpmdW5jdGlvbihhKXtpZihhPT09d2luZG93KXJldHVybiB0LmNpLmEoYSkKZWxzZSByZXR1
-cm4gbmV3IFcuZFcoKX0sCmFGOmZ1bmN0aW9uKGEsYil7dmFyIHM9JC5YMwppZihzPT09Qy5OVSlyZXR1
-cm4gYQpyZXR1cm4gcy5QeShhLGIpfSwKcUU6ZnVuY3Rpb24gcUUoKXt9LApHaDpmdW5jdGlvbiBHaCgp
-e30sCmZZOmZ1bmN0aW9uIGZZKCl7fSwKclo6ZnVuY3Rpb24gclooKXt9LApBejpmdW5jdGlvbiBBeigp
-e30sClFQOmZ1bmN0aW9uIFFQKCl7fSwKbng6ZnVuY3Rpb24gbngoKXt9LApvSjpmdW5jdGlvbiBvSigp
-e30sCmlkOmZ1bmN0aW9uIGlkKCl7fSwKUUY6ZnVuY3Rpb24gUUYoKXt9LApOaDpmdW5jdGlvbiBOaCgp
-e30sCmFlOmZ1bmN0aW9uIGFlKCl7fSwKSUI6ZnVuY3Rpb24gSUIoKXt9LApuNzpmdW5jdGlvbiBuNygp
-e30sCnd6OmZ1bmN0aW9uIHd6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmN2OmZ1bmN0aW9uIGN2
-KCl7fSwKQ3Y6ZnVuY3Rpb24gQ3YoKXt9LAplYTpmdW5jdGlvbiBlYSgpe30sCkQwOmZ1bmN0aW9uIEQw
-KCl7fSwKaEg6ZnVuY3Rpb24gaEgoKXt9LApoNDpmdW5jdGlvbiBoNCgpe30sCmJyOmZ1bmN0aW9uIGJy
-KCl7fSwKVmI6ZnVuY3Rpb24gVmIoKXt9LApmSjpmdW5jdGlvbiBmSigpe30sCndhOmZ1bmN0aW9uIHdh
-KCl7fSwKU2c6ZnVuY3Rpb24gU2coKXt9LAp1ODpmdW5jdGlvbiB1OCgpe30sCkFqOmZ1bmN0aW9uIEFq
-KCl7fSwKZTc6ZnVuY3Rpb24gZTcoYSl7dGhpcy5hPWF9LApLVjpmdW5jdGlvbiBLVigpe30sCkJIOmZ1
-bmN0aW9uIEJIKCl7fSwKU046ZnVuY3Rpb24gU04oKXt9LApldzpmdW5jdGlvbiBldygpe30sCmxwOmZ1
-bmN0aW9uIGxwKCl7fSwKVGI6ZnVuY3Rpb24gVGIoKXt9LApJdjpmdW5jdGlvbiBJdigpe30sCldQOmZ1
-bmN0aW9uIFdQKCl7fSwKeVk6ZnVuY3Rpb24geVkoKXt9LAp3NjpmdW5jdGlvbiB3Nigpe30sCks1OmZ1
-bmN0aW9uIEs1KCl7fSwKQ206ZnVuY3Rpb24gQ20oKXt9LApDUTpmdW5jdGlvbiBDUSgpe30sCnc0OmZ1
-bmN0aW9uIHc0KCl7fSwKcmg6ZnVuY3Rpb24gcmgoKXt9LApjZjpmdW5jdGlvbiBjZigpe30sCmk3OmZ1
-bmN0aW9uIGk3KGEpe3RoaXMuYT1hfSwKU3k6ZnVuY3Rpb24gU3koYSl7dGhpcy5hPWF9LApLUzpmdW5j
-dGlvbiBLUyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQTM6ZnVuY3Rpb24gQTMoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sCkk0OmZ1bmN0aW9uIEk0KGEpe3RoaXMuYT1hfSwKRms6ZnVuY3Rpb24gRmsoYSxi
-KXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKUk86ZnVuY3Rpb24gUk8oYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKQ3E6ZnVuY3Rpb24gQ3EoYSxiLGMsZCl7dmFyIF89dGhp
-cwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKeEM6ZnVuY3Rpb24geEMoYSxiLGMsZCxlKXt2YXIg
-Xz10aGlzCl8uYj1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2TjpmdW5jdGlvbiB2TihhKXt0
-aGlzLmE9YX0sCkpROmZ1bmN0aW9uIEpRKGEpe3RoaXMuYT1hfSwKR206ZnVuY3Rpb24gR20oKXt9LAp2
-RDpmdW5jdGlvbiB2RChhKXt0aGlzLmE9YX0sClV2OmZ1bmN0aW9uIFV2KGEpe3RoaXMuYT1hfSwKRWc6
-ZnVuY3Rpb24gRWcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKbTY6ZnVuY3Rpb24g
-bTYoKXt9LApFbzpmdW5jdGlvbiBFbygpe30sCldrOmZ1bmN0aW9uIFdrKCl7fSwKY3Q6ZnVuY3Rpb24g
-Y3QoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZT1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKSUE6
-ZnVuY3Rpb24gSUEoKXt9LApPdzpmdW5jdGlvbiBPdygpe30sClc5OmZ1bmN0aW9uIFc5KGEsYixjKXt2
-YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz0tMQpfLmQ9bnVsbApfLiR0aT1jfSwKZFc6ZnVuY3Rpb24g
-ZFcoKXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24g
-S28oYSl7dGhpcy5hPWEKdGhpcy5iPTB9LApmbTpmdW5jdGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1
-bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1
-bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxYPXsKQ0w6ZnVuY3Rpb24oYSxiKXt2YXIg
-cyxyLHEscCxvLG49Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51bGwpYT1DLnhCLnluKGEsbi5sZW5ndGgp
-CnM9dC5zCnI9SC5RSShbXSxzKQpxPUguUUkoW10scykKcz1hLmxlbmd0aAppZihzIT09MCYmYi5yNChD
-LnhCLlcoYSwwKSkpe2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBdKQpwPTF9ZWxz
-ZXtDLk5tLmkocSwiIikKcD0wfWZvcihvPXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhhLG8pKSl7Qy5O
-bS5pKHIsQy54Qi5OaihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7Qy5ObS5pKHIs
-Qy54Qi55bihhLHApKQpDLk5tLmkocSwiIil9cmV0dXJuIG5ldyBYLldEKGIsbixyLHEpfSwKV0Q6ZnVu
-Y3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCkk3OmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgWC5kdihhKX0sCmR2OmZ1bmN0aW9uIGR2KGEpe3RoaXMuYT1hfX0K
-dmFyIHc9W0IsQyxELEUsRixILEosTCxNLE8sUCxSLFQsVSxXLFhdCmh1bmtIZWxwZXJzLnNldEZ1bmN0
-aW9uTmFtZXNJZk5lY2Vzc2FyeSh3KQp2YXIgJD17fQpILkZLLnByb3RvdHlwZT17fQpKLkd2LnByb3Rv
-dHlwZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVy
-biBILmVRKGEpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5saChhKSsiJyJ9
-LAplNzpmdW5jdGlvbihhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmduZCgp
-LGIuZ1ZtKCkpKX19CkoueUUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEp
-fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2UucHJv
-dG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09Yn0sCnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIm51bGwifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKJGljODoxfQpKLk1GLnByb3RvdHlw
-ZT17CmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhh
+KHEpfXE9UC5RZShwKQpyZXR1cm4gcX0sClFlKGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwK
+aWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSE9
+PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXcoYSxPYmplY3QuY3JlYXRlKG51bGwpKQpmb3Io
+cz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5RZShhW3NdKQpyZXR1cm4gYX0sCmt5KGEsYixjLGQpe3Zh
+ciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe3M9YgpkPXMubGVuZ3RoCmlmKGQtYzwxNSly
+ZXR1cm4gbnVsbApyPVAuUlAoYSxzLGMsZCkKaWYociE9bnVsbCYmYSlpZihyLmluZGV4T2YoIlx1ZmZm
+ZCIpPj0wKXJldHVybiBudWxsCnJldHVybiByfXJldHVybiBudWxsfSwKUlAoYSxiLGMsZCl7dmFyIHM9
+YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0
+aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQLlJiKHMsYi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVu
+Z3RoKSkpfSwKUmIoYSxiKXt2YXIgcyxyCnRyeXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIp
+e0guUnUocil9cmV0dXJuIG51bGx9LAp4TShhLGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0
+aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJl
+IG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixhLGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJ
+bnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJv
+dyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFj
+dGVycyIsYSxiKSl9LApHeShhLGIsYyl7cmV0dXJuIG5ldyBQLlVkKGEsYil9LApOQyhhKXtyZXR1cm4g
+YS5MdCgpfSwKVWcoYSxiKXtyZXR1cm4gbmV3IFAudHUoYSxbXSxQLkN5KCkpfSwKdVgoYSxiLGMpe3Zh
+ciBzLHI9bmV3IFAuTSgiIikscT1QLlVnKHIsYikKcS5pVShhKQpzPXIuYQpyZXR1cm4gcy5jaGFyQ29k
+ZUF0KDApPT0wP3M6c30sCmo0KGEpe3N3aXRjaChhKXtjYXNlIDY1OnJldHVybiJNaXNzaW5nIGV4dGVu
+c2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJVbmV4cGVjdGVkIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY5
+OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUiCmNhc2UgNzE6cmV0dXJuIk92ZXJsb25nIGVuY29kaW5n
+IgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5pY29kZSByYW5nZSIKY2FzZSA3NTpyZXR1cm4iRW5jb2Rl
+ZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJuIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2Ui
+CmRlZmF1bHQ6cmV0dXJuIiJ9fSwKankoYSxiLGMpe3ZhciBzLHIscSxwPWMtYixvPW5ldyBVaW50OEFy
+cmF5KHApCmZvcihzPUouVTYoYSkscj0wO3I8cDsrK3Ipe3E9cy5xKGEsYityKQppZigocSY0Mjk0OTY3
+MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXApcmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99
+LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVu
+Y3Rpb24gaTgoYSl7dGhpcy5hPWF9LAp4cjpmdW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7
+fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7
+fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpmdW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
+fSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpmdW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0
+aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVuY3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVuY3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1i
+CnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUoKXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0
+aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1hfSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApi
+ejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0aGlzLmI9MTYKdGhpcy5jPTB9LApRQShhLGIpe3ZhciBz
+PUguSHAoYSxiKQppZihzIT1udWxsKXJldHVybiBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9
+LApvcyhhKXtpZihhIGluc3RhbmNlb2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBv
+ZiAnIitILmxoKGEpKyInIn0sCk84KGEsYixjLGQpe3ZhciBzLHI9Yz9KLktoKGEsZCk6Si5RaShhLGQp
+CmlmKGEhPT0wJiZiIT1udWxsKWZvcihzPTA7czxyLmxlbmd0aDsrK3MpcltzXT1iCnJldHVybiByfSwK
+UFcoYSxiLGMpe3ZhciBzLHI9SC5RSShbXSxjLkMoImpkPDA+IikpCmZvcihzPUouSVQoYSk7cy5GKCk7
+KUMuTm0uaShyLGMuYShzLmdsKCkpKQppZihiKXJldHVybiByCnJldHVybiBKLkVwKHIsYyl9LApZMShh
+LGIsYyl7dmFyIHMKaWYoYilyZXR1cm4gUC5ldihhLGMpCnM9Si5FcChQLmV2KGEsYyksYykKcmV0dXJu
+IHN9LApldihhLGIpe3ZhciBzLHIKaWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gSC5RSShhLnNsaWNl
+KDApLGIuQygiamQ8MD4iKSkKcz1ILlFJKFtdLGIuQygiamQ8MD4iKSkKZm9yKHI9Si5JVChhKTtyLkYo
+KTspQy5ObS5pKHMsci5nbCgpKQpyZXR1cm4gc30sCkFGKGEsYil7cmV0dXJuIEouekMoUC5QVyhhLCEx
+LGIpKX0sCkhNKGEsYixjKXt2YXIgcz1ILmZ3KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJldHVybiBz
+fSwKT28oYSl7cmV0dXJuIEguTHcoYSl9LApudShhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEs
+ITAsITEsITEsITEpKX0sCmwoYSxiLGMpe3ZhciBzPUouSVQoYikKaWYoIXMuRigpKXJldHVybiBhCmlm
+KGMubGVuZ3RoPT09MCl7ZG8gYSs9SC5FaihzLmdsKCkpCndoaWxlKHMuRigpKX1lbHNle2ErPUguRWoo
+cy5nbCgpKQpmb3IoO3MuRigpOylhPWErYytILkVqKHMuZ2woKSl9cmV0dXJuIGF9LApscihhLGIsYyxk
+KXtyZXR1cm4gbmV3IFAubXAoYSxiLGMsZCl9LAp1bygpe3ZhciBzPUguTTAoKQppZihzIT1udWxsKXJl
+dHVybiBQLmhLKHMpCnRocm93IEguYihQLkw0KCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKSl9
+LAplUChhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYz09PUMu
+eE0pe3M9JC56NCgpLmIKcz1zLnRlc3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5D
+KCJVay5TIikuYShiKQpyPWMuZ1pFKCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysr
+cSl7bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25d
+JjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9w
+KyIrIjpwKyIlIittW28+Pj40JjE1XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpw
+fSwKR3EoYSl7dmFyIHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIr
+YQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiBy
+KyIwMDAiK3N9LApWeChhKXtpZihhPj0xMDApcmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIrYQpy
+ZXR1cm4iMDAiK2F9LApoMChhKXtpZihhPj0xMClyZXR1cm4iIithCnJldHVybiIwIithfSwKaGwoYSl7
+aWYodHlwZW9mIGE9PSJudW1iZXIifHxILnJRKGEpfHxhPT1udWxsKXJldHVybiBKLncoYSkKaWYodHlw
+ZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhW
+KGEpe3JldHVybiBuZXcgUC5DNihhKX0sCnhZKGEsYil7cmV0dXJuIG5ldyBQLkFUKCExLG51bGwsYixh
+KX0sCkwzKGEsYixjKXtyZXR1cm4gbmV3IFAuQVQoITAsYSxiLGMpfSwKTzcoYSxiKXtyZXR1cm4gbmV3
+IFAuYkoobnVsbCxudWxsLCEwLGEsYiwiVmFsdWUgbm90IGluIHJhbmdlIil9LApURShhLGIsYyxkLGUp
+e3JldHVybiBuZXcgUC5iSihiLGMsITAsYSxkLCJJbnZhbGlkIHZhbHVlIil9LAp3QShhLGIsYyxkKXtp
+ZihhPGJ8fGE+Yyl0aHJvdyBILmIoUC5URShhLGIsYyxkLG51bGwpKQpyZXR1cm4gYX0sCmpCKGEsYixj
+KXtpZigwPmF8fGE+Yyl0aHJvdyBILmIoUC5URShhLDAsYywic3RhcnQiLG51bGwpKQppZihiIT1udWxs
+KXtpZihhPmJ8fGI+Yyl0aHJvdyBILmIoUC5URShiLGEsYywiZW5kIixudWxsKSkKcmV0dXJuIGJ9cmV0
+dXJuIGN9LAprMShhLGIpe2lmKGE8MCl0aHJvdyBILmIoUC5URShhLDAsbnVsbCxiLG51bGwpKQpyZXR1
+cm4gYX0sCkNmKGEsYixjLGQsZSl7dmFyIHM9SC5JWihlPT1udWxsP0ouSG0oYik6ZSkKcmV0dXJuIG5l
+dyBQLmVZKHMsITAsYSxjLCJJbmRleCBvdXQgb2YgcmFuZ2UiKX0sCkw0KGEpe3JldHVybiBuZXcgUC51
+YihhKX0sClNZKGEpe3JldHVybiBuZXcgUC5kcyhhKX0sClBWKGEpe3JldHVybiBuZXcgUC5saihhKX0s
+CmE0KGEpe3JldHVybiBuZXcgUC5VVihhKX0sCnJyKGEsYixjKXtyZXR1cm4gbmV3IFAuYUUoYSxiLGMp
+fSwKaEsoYTUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEy
+LGEzPW51bGwsYTQ9YTUubGVuZ3RoCmlmKGE0Pj01KXtzPSgoQy54Qi5XKGE1LDQpXjU4KSozfEMueEIu
+VyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3fEMueEIuVyhhNSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3
+KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0QoYTQ8YTQ/Qy54Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5n
+bFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGE1LDUsYTQpLDAsYTMpLmdsUigp
+fXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlk1KHIsMCwwKQpDLk5tLlk1KHIsMSwtMSkKQy5ObS5ZNShy
+LDIsLTEpCkMuTm0uWTUociw3LC0xKQpDLk5tLlk1KHIsMywwKQpDLk5tLlk1KHIsNCwwKQpDLk5tLlk1
+KHIsNSxhNCkKQy5ObS5ZNShyLDYsYTQpCmlmKFAuVUIoYTUsMCxhNCwwLHIpPj0xNClDLk5tLlk1KHIs
+NyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5VQihhNSwwLHEsMjAscik9PT0yMClyWzddPXEKcD1yWzJd
+KzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1yWzZdCmlmKGw8bSltPWwKaWYobjxwKW49bQplbHNlIGlm
+KG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJbN108MAppZihrKWlmKHA+cSszKXtqPWEzCms9ITF9ZWxz
+ZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEzCms9ITF9ZWxzZXtpZighKG08YTQmJm09PT1uKzImJkMu
+eEIuUWkoYTUsIi4uIixuKSkpaD1tPm4rMiYmQy54Qi5RaShhNSwiLy4uIixtLTMpCmVsc2UgaD0hMApp
+ZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09NClpZihDLnhCLlFpKGE1LCJmaWxlIiwwKSl7aWYocDw9
+MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtnPSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmlsZTovLyIK
+cz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpxLT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5sZW5ndGgK
+cD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixtLCIvIik7
+KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihDLnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYmbyszPT09
+biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wtPTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1LG8sbiwi
+IikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ugaj1hMwplbHNlIGlmKHE9PT01JiZDLnhCLlFpKGE1LCJo
+dHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkMueEIuUWkoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNApt
+LT00CmE1PUMueEIuaTcoYTUsbyxuLCIiKQphNC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEw
+fX19ZWxzZSBqPWEzCmlmKGspe2lmKGE0PGE1Lmxlbmd0aCl7YTU9Qy54Qi5OaihhNSwwLGE0KQpxLT0w
+CnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9
+aWYoaj09bnVsbClpZihxPjApaj1QLlBpKGE1LDAscSkKZWxzZXtpZihxPT09MClQLlIzKGE1LDAsIklu
+dmFsaWQgZW1wdHkgc2NoZW1lIikKaj0iIn1pZihwPjApe2Q9cSszCmM9ZDxwP1AuelIoYTUsZCxwLTEp
+OiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysxCmlmKGk8bil7YT1ILkhwKEMueEIuTmooYTUsaSxuKSxh
+MykKYTA9UC53QihhPT1udWxsP0gudihQLnJyKCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGopfWVsc2Ug
+YTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxsKQphMj1t
+PGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEyLGw8YTQ/
+UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10KGEpe0gubihhKQpyZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgs
+Qy54TSwhMSl9LApXWChhKXt2YXIgcz10Lk4KcmV0dXJuIEMuTm0uTjAoSC5RSShhLnNwbGl0KCImIiks
+dC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54TSksdC5FKX0sCkhoKGEsYixjKXt2YXIgcyxyLHEscCxv
+LG4sbT0iSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsbD0iZWFjaCBw
+YXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaz1uZXcgUC5jUyhhKSxqPW5ldyBVaW50OEFy
+cmF5KDQpCmZvcihzPWIscj1zLHE9MDtzPGM7KytzKXtwPUMueEIuTyhhLHMpCmlmKHAhPT00Nil7aWYo
+KHBeNDgpPjkpay4kMigiaW52YWxpZCBjaGFyYWN0ZXIiLHMpfWVsc2V7aWYocT09PTMpay4kMihtLHMp
+Cm89UC5RQShDLnhCLk5qKGEscixzKSxudWxsKQppZihvPjI1NSlrLiQyKGwscikKbj1xKzEKaWYocT49
+NClyZXR1cm4gSC5PSChqLHEpCmpbcV09bwpyPXMrMQpxPW59fWlmKHEhPT0zKWsuJDIobSxjKQpvPVAu
+UUEoQy54Qi5OaihhLHIsYyksbnVsbCkKaWYobz4yNTUpay4kMihsLHIpCmlmKHE+PTQpcmV0dXJuIEgu
+T0goaixxKQpqW3FdPW8KcmV0dXJuIGp9LAplZyhhLGIsYTApe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
+LGksaCxnLGYsZSxkPW5ldyBQLlZDKGEpLGM9bmV3IFAuSlQoZCxhKQppZihhLmxlbmd0aDwyKWQuJDEo
+ImFkZHJlc3MgaXMgdG9vIHNob3J0IikKcz1ILlFJKFtdLHQudCkKZm9yKHI9YixxPXIscD0hMSxvPSEx
+O3I8YTA7KytyKXtuPUMueEIuTyhhLHIpCmlmKG49PT01OCl7aWYocj09PWIpeysrcgppZihDLnhCLk8o
+YSxyKSE9PTU4KWQuJDIoImludmFsaWQgc3RhcnQgY29sb24uIixyKQpxPXJ9aWYocj09PXEpe2lmKHAp
+ZC4kMigib25seSBvbmUgd2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkIixyKQpDLk5tLmkocywtMSkKcD0h
+MH1lbHNlIEMuTm0uaShzLGMuJDIocSxyKSkKcT1yKzF9ZWxzZSBpZihuPT09NDYpbz0hMH1pZihzLmxl
+bmd0aD09PTApZC4kMSgidG9vIGZldyBwYXJ0cyIpCm09cT09PWEwCmw9Qy5ObS5ncloocykKaWYobSYm
+bCE9PS0xKWQuJDIoImV4cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCIsYTApCmlmKCFtKWlmKCFv
+KUMuTm0uaShzLGMuJDIocSxhMCkpCmVsc2V7az1QLkhoKGEscSxhMCkKQy5ObS5pKHMsKGtbMF08PDh8
+a1sxXSk+Pj4wKQpDLk5tLmkocywoa1syXTw8OHxrWzNdKT4+PjApfWlmKHApe2lmKHMubGVuZ3RoPjcp
+ZC4kMSgiYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRz
+Iil9ZWxzZSBpZihzLmxlbmd0aCE9PTgpZC4kMSgiYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQg
+bXVzdCBjb250YWluIGV4YWN0bHkgOCBwYXJ0cyIpCmo9bmV3IFVpbnQ4QXJyYXkoMTYpCmZvcihsPXMu
+bGVuZ3RoLGk9OS1sLHI9MCxoPTA7cjxsOysrcil7Zz1zW3JdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsr
+K2Ype2lmKGg8MHx8aD49MTYpcmV0dXJuIEguT0goaixoKQpqW2hdPTAKZT1oKzEKaWYoZT49MTYpcmV0
+dXJuIEguT0goaixlKQpqW2VdPTAKaCs9Mn1lbHNle2U9Qy5qbi53RyhnLDgpCmlmKGg8MHx8aD49MTYp
+cmV0dXJuIEguT0goaixoKQpqW2hdPWUKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpqW2Vd
+PWcmMjU1CmgrPTJ9fXJldHVybiBqfSwKS0woYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuCmY9
+Zj09bnVsbD8iIjpQLlBpKGYsMCxmLmxlbmd0aCkKZz1QLnpSKGcsMCxnPT1udWxsPzA6Zy5sZW5ndGgp
+CmE9UC5PZShhLDAsYT09bnVsbD8wOmEubGVuZ3RoLCExKQpzPVAubGUobnVsbCwwLDAsZSkKcj1QLnRH
+KG51bGwsMCwwKQpkPVAud0IoZCxmKQpxPWY9PT0iZmlsZSIKaWYoYT09bnVsbClwPWcubGVuZ3RoIT09
+MHx8ZCE9bnVsbHx8cQplbHNlIHA9ITEKaWYocClhPSIiCnA9YT09bnVsbApvPSFwCmI9UC5rYShiLDAs
+Yj09bnVsbD8wOmIubGVuZ3RoLGMsZixvKQpuPWYubGVuZ3RoPT09MAppZihuJiZwJiYhQy54Qi5uKGIs
+Ii8iKSliPVAud0YoYiwhbnx8bykKZWxzZSBiPVAueGUoYikKcmV0dXJuIG5ldyBQLkRuKGYsZyxwJiZD
+LnhCLm4oYiwiLy8iKT8iIjphLGQsYixzLHIpfSwKd0soYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAK
+aWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCk5SKGEsYil7dmFyIHMscixxLHAsbyxu
+CmZvcihzPWEubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhhLHIpCnA9Qy54Qi5XKGIscikKbz1x
+XnAKaWYobyE9PTApe2lmKG89PT0zMil7bj1wfG8KaWYoOTc8PW4mJm48PTEyMiljb250aW51ZX1yZXR1
+cm4hMX19cmV0dXJuITB9LApSMyhhLGIsYyl7dGhyb3cgSC5iKFAucnIoYyxhLGIpKX0sClhkKGEsYixj
+LGQpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaD1udWxsLGc9Yi5sZW5ndGgKaWYoZyE9PTApe3E9
+MAp3aGlsZSghMCl7aWYoIShxPGcpKXtzPSIiCnI9MApicmVha31pZihDLnhCLlcoYixxKT09PTY0KXtz
+PUMueEIuTmooYiwwLHEpCnI9cSsxCmJyZWFrfSsrcX1pZihyPGcmJkMueEIuVyhiLHIpPT09OTEpe2Zv
+cihwPXIsbz0tMTtwPGc7KytwKXtuPUMueEIuVyhiLHApCmlmKG49PT0zNyYmbzwwKXttPUMueEIuUWko
+YiwiMjUiLHArMSk/cCsyOnAKbz1wCnA9bX1lbHNlIGlmKG49PT05MylicmVha31pZihwPT09Zyl0aHJv
+dyBILmIoUC5ycigiSW52YWxpZCBJUHY2IGhvc3QgZW50cnkuIixiLHIpKQpsPW88MD9wOm8KUC5lZyhi
+LHIrMSxsKTsrK3AKaWYocCE9PWcmJkMueEIuVyhiLHApIT09NTgpdGhyb3cgSC5iKFAucnIoIkludmFs
+aWQgZW5kIG9mIGF1dGhvcml0eSIsYixwKSl9ZWxzZSBwPXIKd2hpbGUoITApe2lmKCEocDxnKSl7az1o
+CmJyZWFrfWlmKEMueEIuVyhiLHApPT09NTgpe2o9Qy54Qi55bihiLHArMSkKaz1qLmxlbmd0aCE9PTA/
+UC5RQShqLGgpOmgKYnJlYWt9KytwfWk9Qy54Qi5OaihiLHIscCl9ZWxzZXtrPWgKaT1rCnM9IiJ9cmV0
+dXJuIFAuS0woaSxoLEguUUkoYy5zcGxpdCgiLyIpLHQucyksayxkLGEscyl9LAprRShhLGIpe3ZhciBz
+LHIscSxwLG8KZm9yKHM9YS5sZW5ndGgscj0wO3I8czsrK3Ipe3E9YVtyXQpwPUouVTYocSkKbz1wLmdB
+KHEpCmlmKDA+bylILnYoUC5URSgwLDAscC5nQShxKSxudWxsLG51bGwpKQppZihILlNRKHEsIi8iLDAp
+KXtzPVAuTDQoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgIitILkVqKHEpKQp0aHJvdyBILmIocyl9fX0s
+CkhOKGEsYixjKXt2YXIgcyxyLHEscApmb3Iocz1ILnFDKGEsYyxudWxsLEgudDYoYSkuYykscj1zLiR0
+aSxzPW5ldyBILmE3KHMscy5nQShzKSxyLkMoImE3PGFMLkU+IikpLHI9ci5DKCJhTC5FIik7cy5GKCk7
+KXtxPXIuYShzLmQpCnA9UC5udSgnWyIqLzo8Pj9cXFxcfF0nKQppZihILlNRKHEscCwwKSl7cz1QLkw0
+KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoOiAiK3EpCnRocm93IEguYihzKX19fSwKcmcoYSxiKXt2
+YXIgcwppZighKDY1PD1hJiZhPD05MCkpcz05Nzw9YSYmYTw9MTIyCmVsc2Ugcz0hMAppZihzKXJldHVy
+bgpzPVAuTDQoIklsbGVnYWwgZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHMpfSwKd0Io
+YSxiKXtpZihhIT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lKGEsYixj
+LGQpe3ZhciBzLHIscSxwLG8sbgppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9PT1jKXJldHVybiIi
+CmlmKEMueEIuTyhhLGIpPT09OTEpe3M9Yy0xCmlmKEMueEIuTyhhLHMpIT09OTMpUC5SMyhhLGIsIk1p
+c3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdCIpCnI9YisxCnE9UC50byhhLHIscykKaWYo
+cTxzKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxzLCIlMjUiKX1lbHNlIG89
+IiIKUC5lZyhhLHIscSkKcmV0dXJuIEMueEIuTmooYSxiLHEpLnRvTG93ZXJDYXNlKCkrbysiXSJ9Zm9y
+KG49YjtuPGM7KytuKWlmKEMueEIuTyhhLG4pPT09NTgpe3E9Qy54Qi5YVShhLCIlIixiKQpxPXE+PWIm
+JnE8Yz9xOmMKaWYocTxjKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxjLCIl
+MjUiKX1lbHNlIG89IiIKUC5lZyhhLGIscSkKcmV0dXJuIlsiK0MueEIuTmooYSxiLHEpK28rIl0ifXJl
+dHVybiBQLk9MKGEsYixjKX0sCnRvKGEsYixjKXt2YXIgcz1DLnhCLlhVKGEsIiUiLGIpCnJldHVybiBz
+Pj1iJiZzPGM/czpjfSwKT0EoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/
+bmV3IFAuTShkKTpudWxsCmZvcihzPWIscj1zLHE9ITA7czxjOyl7cD1DLnhCLk8oYSxzKQppZihwPT09
+Mzcpe289UC5ydihhLHMsITApCm49bz09bnVsbAppZihuJiZxKXtzKz0zCmNvbnRpbnVlfWlmKGk9PW51
+bGwpaT1uZXcgUC5NKCIiKQptPWkuYSs9Qy54Qi5OaihhLHIscykKaWYobilvPUMueEIuTmooYSxzLHMr
+MykKZWxzZSBpZihvPT09IiUiKVAuUjMoYSxzLCJab25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55
+bW9yZSIpCmkuYT1tK28Kcys9MwpyPXMKcT0hMH1lbHNle2lmKHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgp
+cmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihu
+KXtpZihxJiY2NTw9cCYmOTA+PXApe2lmKGk9PW51bGwpaT1uZXcgUC5NKCIiKQppZihyPHMpe2kuYSs9
+Qy54Qi5OaihhLHIscykKcj1zfXE9ITF9KytzfWVsc2V7aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnMrMTxj
+KXtsPUMueEIuTyhhLHMrMSkKaWYoKGwmNjQ1MTIpPT09NTYzMjApe3A9KHAmMTAyMyk8PDEwfGwmMTAy
+M3w2NTUzNgprPTJ9ZWxzZSBrPTF9ZWxzZSBrPTEKaj1DLnhCLk5qKGEscixzKQppZihpPT1udWxsKXtp
+PW5ldyBQLk0oIiIpCm49aX1lbHNlIG49aQpuLmErPWoKbi5hKz1QLnpYKHApCnMrPWsKcj1zfX19aWYo
+aT09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYocjxjKWkuYSs9Qy54Qi5OaihhLHIsYykKbj1p
+LmEKcmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApPTChhLGIsYyl7dmFyIHMscixxLHAsbyxu
+LG0sbCxrLGosaQpmb3Iocz1iLHI9cyxxPW51bGwscD0hMDtzPGM7KXtvPUMueEIuTyhhLHMpCmlmKG89
+PT0zNyl7bj1QLnJ2KGEscywhMCkKbT1uPT1udWxsCmlmKG0mJnApe3MrPTMKY29udGludWV9aWYocT09
+bnVsbClxPW5ldyBQLk0oIiIpCmw9Qy54Qi5OaihhLHIscykKaz1xLmErPSFwP2wudG9Mb3dlckNhc2Uo
+KTpsCmlmKG0pe249Qy54Qi5OaihhLHMscyszKQpqPTN9ZWxzZSBpZihuPT09IiUiKXtuPSIlMjUiCmo9
+MX1lbHNlIGo9MwpxLmE9aytuCnMrPWoKcj1zCnA9ITB9ZWxzZXtpZihvPDEyNyl7bT1vPj4+NAppZiht
+Pj04KXJldHVybiBILk9IKEMuZWEsbSkKbT0oQy5lYVttXSYxPDwobyYxNSkpIT09MH1lbHNlIG09ITEK
+aWYobSl7aWYocCYmNjU8PW8mJjkwPj1vKXtpZihxPT1udWxsKXE9bmV3IFAuTSgiIikKaWYocjxzKXtx
+LmErPUMueEIuTmooYSxyLHMpCnI9c31wPSExfSsrc31lbHNle2lmKG88PTkzKXttPW8+Pj40CmlmKG0+
+PTgpcmV0dXJuIEguT0goQy5hayxtKQptPShDLmFrW21dJjE8PChvJjE1KSkhPT0wfWVsc2UgbT0hMQpp
+ZihtKVAuUjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCmVsc2V7aWYoKG8mNjQ1MTIpPT09NTUyOTYm
+JnMrMTxjKXtpPUMueEIuTyhhLHMrMSkKaWYoKGkmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEw
+fGkmMTAyM3w2NTUzNgpqPTJ9ZWxzZSBqPTF9ZWxzZSBqPTEKbD1DLnhCLk5qKGEscixzKQppZighcCls
+PWwudG9Mb3dlckNhc2UoKQppZihxPT1udWxsKXtxPW5ldyBQLk0oIiIpCm09cX1lbHNlIG09cQptLmEr
+PWwKbS5hKz1QLnpYKG8pCnMrPWoKcj1zfX19fWlmKHE9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMp
+CmlmKHI8Yyl7bD1DLnhCLk5qKGEscixjKQpxLmErPSFwP2wudG9Mb3dlckNhc2UoKTpsfW09cS5hCnJl
+dHVybiBtLmNoYXJDb2RlQXQoMCk9PTA/bTptfSwKUGkoYSxiLGMpe3ZhciBzLHIscSxwCmlmKGI9PT1j
+KXJldHVybiIiCmlmKCFQLkV0KEMueEIuVyhhLGIpKSlQLlIzKGEsYiwiU2NoZW1lIG5vdCBzdGFydGlu
+ZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIikKZm9yKHM9YixyPSExO3M8YzsrK3Mpe3E9Qy54Qi5X
+KGEscykKaWYocTwxMjgpe3A9cT4+PjQKaWYocD49OClyZXR1cm4gSC5PSChDLm1LLHApCnA9KEMubUtb
+cF0mMTw8KHEmMTUpKSE9PTB9ZWxzZSBwPSExCmlmKCFwKVAuUjMoYSxzLCJJbGxlZ2FsIHNjaGVtZSBj
+aGFyYWN0ZXIiKQppZig2NTw9cSYmcTw9OTApcj0hMH1hPUMueEIuTmooYSxiLGMpCnJldHVybiBQLllh
+KHI/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWEoYSl7aWYoYT09PSJodHRwIilyZXR1cm4iaHR0cCIKaWYo
+YT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRwcyIpcmV0dXJuImh0dHBzIgppZihhPT09
+InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0sCnpSKGEsYixjKXtpZihhPT1udWxsKXJl
+dHVybiIiCnJldHVybiBQLlBJKGEsYixjLEMudG8sITEpfSwKa2EoYSxiLGMsZCxlLGYpe3ZhciBzLHIs
+cT1lPT09ImZpbGUiLHA9cXx8ZgppZihhPT1udWxsKXtpZihkPT1udWxsKXJldHVybiBxPyIvIjoiIgpz
+PUgudDYoZCkKcj1uZXcgSC5sSihkLHMuQygicVUoMSkiKS5hKG5ldyBQLlJaKCkpLHMuQygibEo8MSxx
+VT4iKSkuaygwLCIvIil9ZWxzZSBpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHBhdGggYW5k
+IHBhdGhTZWdtZW50cyBzcGVjaWZpZWQiLG51bGwpKQplbHNlIHI9UC5QSShhLGIsYyxDLldkLCEwKQpp
+ZihyLmxlbmd0aD09PTApe2lmKHEpcmV0dXJuIi8ifWVsc2UgaWYocCYmIUMueEIubihyLCIvIikpcj0i
+LyIrcgpyZXR1cm4gUC5KcihyLGUsZil9LApKcihhLGIsYyl7dmFyIHM9Yi5sZW5ndGg9PT0wCmlmKHMm
+JiFjJiYhQy54Qi5uKGEsIi8iKSlyZXR1cm4gUC53RihhLCFzfHxjKQpyZXR1cm4gUC54ZShhKX0sCmxl
+KGEsYixjLGQpe3ZhciBzLHI9e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgi
+Qm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIsbnVsbCkpCnJldHVybiBQLlBJ
+KGEsYixjLEMuVkMsITApfWlmKGQ9PW51bGwpcmV0dXJuIG51bGwKcz1uZXcgUC5NKCIiKQpyLmE9IiIK
+ZC5LKDAsbmV3IFAueTUobmV3IFAuTUUocixzKSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9
+PTA/cjpyfSwKdEcoYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxiLGMs
+Qy5WQywhMCl9LApydihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1hLmxlbmd0aClyZXR1
+cm4iJSIKcz1DLnhCLk8oYSxiKzEpCnI9Qy54Qi5PKGEsbikKcT1ILm9vKHMpCnA9SC5vbyhyKQppZihx
+PDB8fHA8MClyZXR1cm4iJSIKbz1xKjE2K3AKaWYobzwxMjcpe249Qy5qbi53RyhvLDQpCmlmKG4+PTgp
+cmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihu
+KXJldHVybiBILkx3KGMmJjY1PD1vJiY5MD49bz8ob3wzMik+Pj4wOm8pCmlmKHM+PTk3fHxyPj05Nyly
+ZXR1cm4gQy54Qi5OaihhLGIsYiszKS50b1VwcGVyQ2FzZSgpCnJldHVybiBudWxsfSwKelgoYSl7dmFy
+IHMscixxLHAsbyxuLG0sbCxrPSIwMTIzNDU2Nzg5QUJDREVGIgppZihhPDEyOCl7cz1uZXcgVWludDhB
+cnJheSgzKQpzWzBdPTM3CnNbMV09Qy54Qi5XKGssYT4+PjQpCnNbMl09Qy54Qi5XKGssYSYxNSl9ZWxz
+ZXtpZihhPjIwNDcpaWYoYT42NTUzNSl7cj0yNDAKcT00fWVsc2V7cj0yMjQKcT0zfWVsc2V7cj0xOTIK
+cT0yfXA9MypxCnM9bmV3IFVpbnQ4QXJyYXkocCkKZm9yKG89MDstLXEscT49MDtyPTEyOCl7bj1DLmpu
+LmJmKGEsNipxKSY2M3xyCmlmKG8+PXApcmV0dXJuIEguT0gocyxvKQpzW29dPTM3Cm09bysxCmw9Qy54
+Qi5XKGssbj4+PjQpCmlmKG0+PXApcmV0dXJuIEguT0gocyxtKQpzW21dPWwKbD1vKzIKbT1DLnhCLlco
+ayxuJjE1KQppZihsPj1wKXJldHVybiBILk9IKHMsbCkKc1tsXT1tCm8rPTN9fXJldHVybiBQLkhNKHMs
+MCxudWxsKX0sClBJKGEsYixjLGQsZSl7dmFyIHM9UC5VbChhLGIsYyxkLGUpCnJldHVybiBzPT1udWxs
+P0MueEIuTmooYSxiLGMpOnN9LApVbChhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPW51
+bGwKZm9yKHM9IWUscj1iLHE9cixwPWo7cjxjOyl7bz1DLnhCLk8oYSxyKQppZihvPDEyNyl7bj1vPj4+
+NAppZihuPj04KXJldHVybiBILk9IKGQsbikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEK
+aWYobikrK3IKZWxzZXtpZihvPT09Mzcpe209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMKY29u
+dGludWV9aWYoIiUiPT09bSl7bT0iJTI1IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkzKXtu
+PW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkhPT0w
+fWVsc2Ugbj0hMQplbHNlIG49ITEKaWYobil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikKbD1q
+Cm09bH1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9Qy54Qi5PKGEsbikK
+aWYoKGsmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEwfGsmMTAyM3w2NTUzNgpsPTJ9ZWxzZSBs
+PTF9ZWxzZSBsPTF9ZWxzZSBsPTEKbT1QLnpYKG8pfX1pZihwPT1udWxsKXtwPW5ldyBQLk0oIiIpCm49
+cH1lbHNlIG49cApuLmErPUMueEIuTmooYSxxLHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJu
+dW1iZXIiKXJldHVybiBILnBZKGwpCnIrPWwKcT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8Yylw
+LmErPUMueEIuTmooYSxxLGMpCnM9cC5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUIo
+YSl7aWYoQy54Qi5uKGEsIi4iKSlyZXR1cm4hMApyZXR1cm4gQy54Qi5PWShhLCIvLiIpIT09LTF9LAp4
+ZShhKXt2YXIgcyxyLHEscCxvLG4sbQppZighUC55QihhKSlyZXR1cm4gYQpzPUguUUkoW10sdC5zKQpm
+b3Iocj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtvPHE7KytvKXtuPXJbb10KaWYoSi5S
+TShuLCIuLiIpKXttPXMubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1tKXJldHVybiBILk9IKHMsLTEpCnMu
+cG9wKCkKaWYocy5sZW5ndGg9PT0wKUMuTm0uaShzLCIiKX1wPSEwfWVsc2UgaWYoIi4iPT09bilwPSEw
+CmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19aWYocClDLk5tLmkocywiIikKcmV0dXJuIEMuTm0uayhzLCIv
+Iil9LAp3RihhLGIpe3ZhciBzLHIscSxwLG8sbgppZighUC55QihhKSlyZXR1cm4hYj9QLkMxKGEpOmEK
+cz1ILlFJKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgscD0hMSxvPTA7bzxxOysr
+byl7bj1yW29dCmlmKCIuLiI9PT1uKWlmKHMubGVuZ3RoIT09MCYmQy5ObS5ncloocykhPT0iLi4iKXtp
+ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnA9ITB9ZWxzZXtDLk5tLmkocywi
+Li4iKQpwPSExfWVsc2UgaWYoIi4iPT09bilwPSEwCmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19cj1zLmxl
+bmd0aAppZihyIT09MClpZihyPT09MSl7aWYoMD49cilyZXR1cm4gSC5PSChzLDApCnI9c1swXS5sZW5n
+dGg9PT0wfWVsc2Ugcj0hMQplbHNlIHI9ITAKaWYocilyZXR1cm4iLi8iCmlmKHB8fEMuTm0uZ3JaKHMp
+PT09Ii4uIilDLk5tLmkocywiIikKaWYoIWIpe2lmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsMCkK
+Qy5ObS5ZNShzLDAsUC5DMShzWzBdKSl9cmV0dXJuIEMuTm0uayhzLCIvIil9LApDMShhKXt2YXIgcyxy
+LHEscD1hLmxlbmd0aAppZihwPj0yJiZQLkV0KEMueEIuVyhhLDApKSlmb3Iocz0xO3M8cDsrK3Mpe3I9
+Qy54Qi5XKGEscykKaWYocj09PTU4KXJldHVybiBDLnhCLk5qKGEsMCxzKSsiJTNBIitDLnhCLnluKGEs
+cysxKQppZihyPD0xMjcpe3E9cj4+PjQKaWYocT49OClyZXR1cm4gSC5PSChDLm1LLHEpCnE9KEMubUtb
+cV0mMTw8KHImMTUpKT09PTB9ZWxzZSBxPSEwCmlmKHEpYnJlYWt9cmV0dXJuIGF9LAp1aihhLGIpe2lm
+KGEuaEIoInBhY2thZ2UiKSYmYS5jPT1udWxsKXJldHVybiBQLmZGKGIsMCxiLmxlbmd0aCkKcmV0dXJu
+LTF9LAptbihhKXt2YXIgcyxyLHEscD1hLmdGaigpLG89cC5sZW5ndGgKaWYobz4wJiZKLkhtKHBbMF0p
+PT09MiYmSi5hNihwWzBdLDEpPT09NTgpe2lmKDA+PW8pcmV0dXJuIEguT0gocCwwKQpQLnJnKEouYTYo
+cFswXSwwKSwhMSkKUC5ITihwLCExLDEpCnM9ITB9ZWxzZXtQLkhOKHAsITEsMCkKcz0hMX1yPWEuZ3RU
+KCkmJiFzPyIiKyJcXCI6IiIKaWYoYS5nY2ooKSl7cT1hLmdKZihhKQppZihxLmxlbmd0aCE9PTApcj1y
+KyJcXCIrcSsiXFwifXI9UC5sKHIscCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpyCnJldHVybiBvLmNo
+YXJDb2RlQXQoMCk9PTA/bzpvfSwKSWgoYSxiKXt2YXIgcyxyLHEKZm9yKHM9MCxyPTA7cjwyOysrcil7
+cT1DLnhCLlcoYSxiK3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYrcS00OAplbHNle3F8PTMyCmlmKDk3
+PD1xJiZxPD0xMDIpcz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIoUC54WSgiSW52YWxpZCBVUkwgZW5j
+b2RpbmciLG51bGwpKX19cmV0dXJuIHN9LAprdShhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG89Ygp3aGls
+ZSghMCl7aWYoIShvPGMpKXtzPSEwCmJyZWFrfXI9Qy54Qi5XKGEsbykKaWYocjw9MTI3KWlmKHIhPT0z
+NylxPWUmJnI9PT00MwplbHNlIHE9ITAKZWxzZSBxPSEwCmlmKHEpe3M9ITEKYnJlYWt9KytvfWlmKHMp
+e2lmKEMueE0hPT1kKXE9ITEKZWxzZSBxPSEwCmlmKHEpcmV0dXJuIEMueEIuTmooYSxiLGMpCmVsc2Ug
+cD1uZXcgSC5xaihDLnhCLk5qKGEsYixjKSl9ZWxzZXtwPUguUUkoW10sdC50KQpmb3IocT1hLmxlbmd0
+aCxvPWI7bzxjOysrbyl7cj1DLnhCLlcoYSxvKQppZihyPjEyNyl0aHJvdyBILmIoUC54WSgiSWxsZWdh
+bCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIsbnVsbCkpCmlmKHI9PT0zNyl7aWYobyszPnEpdGhyb3cg
+SC5iKFAueFkoIlRydW5jYXRlZCBVUkkiLG51bGwpKQpDLk5tLmkocCxQLkloKGEsbysxKSkKbys9Mn1l
+bHNlIGlmKGUmJnI9PT00MylDLk5tLmkocCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5MLmEocCkKcmV0
+dXJuIEMub0UuV0oocCl9LApFdChhKXt2YXIgcz1hfDMyCnJldHVybiA5Nzw9cyYmczw9MTIyfSwKS0Qo
+YSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52YWxpZCBNSU1FIHR5cGUiLGo9SC5RSShbYi0x
+XSx0LnQpCmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIp
+CmlmKHA9PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhy
+b3cgSC5iKFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIpdGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3Io
+O3AhPT00NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0tMTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlm
+KHA9PT02MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5O
+bS5pKGosbykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAhPT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwi
+YmFzZTY0IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5O
+bS5pKGoscikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1Q
+LlVsKGEsbSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1DLnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcg
+UC5QRShhLGosYyl9LApLTigpe3ZhciBzLHIscSxwLG8sbixtPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktM
+TU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIsbD0i
+LiIsaz0iOiIsaj0iLyIsaT0iPyIsaD0iIyIsZz1ILlFJKG5ldyBBcnJheSgyMiksdC5nTikKZm9yKHM9
+MDtzPDIyOysrcylnW3NdPW5ldyBVaW50OEFycmF5KDk2KQpyPW5ldyBQLnlJKGcpCnE9bmV3IFAuYzYo
+KQpwPW5ldyBQLnFkKCkKbz10LmdjCm49by5hKHIuJDIoMCwyMjUpKQpxLiQzKG4sbSwxKQpxLiQzKG4s
+bCwxNCkKcS4kMyhuLGssMzQpCnEuJDMobixqLDMpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
+PW8uYShyLiQyKDE0LDIyNSkpCnEuJDMobixtLDEpCnEuJDMobixsLDE1KQpxLiQzKG4saywzNCkKcS4k
+MyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNSwyMjUpKQpx
+LiQzKG4sbSwxKQpxLiQzKG4sIiUiLDIyNSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDkpCnEuJDMobixp
+LDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLGss
+MzQpCnEuJDMobixqLDEwKQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigyLDIz
+NSkpCnEuJDMobixtLDEzOSkKcS4kMyhuLGosMTMxKQpxLiQzKG4sbCwxNDYpCnEuJDMobixpLDE3MikK
+cS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDMsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDY4KQpx
+LiQzKG4sbCwxOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNCwyMjkpKQpx
+LiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4kMyhuLCJAIiw2OCkKcS4k
+MyhuLCJbIiwyMzIpCnEuJDMobixqLDEzOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5h
+KHIuJDIoNSwyMjkpKQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4k
+MyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEo
+ci4kMig2LDIzMSkpCnAuJDMobiwiMTkiLDcpCnEuJDMobiwiQCIsNjgpCnEuJDMobixqLDEzOCkKcS4k
+MyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNywyMzEpKQpwLiQzKG4sIjA5Iiw3KQpx
+LiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpxLiQz
+KG8uYShyLiQyKDgsOCkpLCJdIiw1KQpuPW8uYShyLiQyKDksMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMo
+bixsLDE2KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQy
+KDE2LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNykKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwx
+NzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNywyMzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhuLGos
+OSkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTAsMjM1KSkKcS4kMyhuLG0s
+MTEpCnEuJDMobixsLDE4KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
+PW8uYShyLiQyKDE4LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxOSkKcS4kMyhuLGosMjM0KQpx
+LiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxOSwyMzUpKQpxLiQzKG4sbSwxMSkK
+cS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMSwyMzUp
+KQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosMTApCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8u
+YShyLiQyKDEyLDIzNikpCnEuJDMobixtLDEyKQpxLiQzKG4saSwxMikKcS4kMyhuLGgsMjA1KQpuPW8u
+YShyLiQyKDEzLDIzNykpCnEuJDMobixtLDEzKQpxLiQzKG4saSwxMykKcC4kMyhvLmEoci4kMigyMCwy
+NDUpKSwiYXoiLDIxKQpyPW8uYShyLiQyKDIxLDI0NSkpCnAuJDMociwiYXoiLDIxKQpwLiQzKHIsIjA5
+IiwyMSkKcS4kMyhyLCIrLS4iLDIxKQpyZXR1cm4gZ30sClVCKGEsYixjLGQsZSl7dmFyIHMscixxLHAs
+bz0kLnZaKCkKZm9yKHM9YjtzPGM7KytzKXtpZihkPDB8fGQ+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8s
+ZCkKcj1vW2RdCnE9Qy54Qi5XKGEscyleOTYKcD1yW3E+OTU/MzE6cV0KZD1wJjMxCkMuTm0uWTUoZSxw
+Pj4+NSxzKX1yZXR1cm4gZH0sClJ4KGEpe2lmKGEuYj09PTcmJkMueEIubihhLmEsInBhY2thZ2UiKSYm
+YS5jPD0wKXJldHVybiBQLmZGKGEuYSxhLmUsYS5mKQpyZXR1cm4tMX0sCmZGKGEsYixjKXt2YXIgcyxy
+LHEKZm9yKHM9YixyPTA7czxjOysrcyl7cT1DLnhCLk8oYSxzKQppZihxPT09NDcpcmV0dXJuIHIhPT0w
+P3M6LTEKaWYocT09PTM3fHxxPT09NTgpcmV0dXJuLTEKcnw9cV40Nn1yZXR1cm4tMX0sCldGOmZ1bmN0
+aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0s
+CkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBGKCl7fSwKQVQ6ZnVuY3Rpb24gQVQoYSxiLGMs
+ZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmJKOmZ1bmN0aW9uIGJKKGEsYixj
+LGQsZSxmKXt2YXIgXz10aGlzCl8uZT1hCl8uZj1iCl8uYT1jCl8uYj1kCl8uYz1lCl8uZD1mfSwKZVk6
+ZnVuY3Rpb24gZVkoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZj1hCl8uYT1iCl8uYj1jCl8uYz1kCl8u
+ZD1lfSwKbXA6ZnVuY3Rpb24gbXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
+LmQ9ZH0sCnViOmZ1bmN0aW9uIHViKGEpe3RoaXMuYT1hfSwKZHM6ZnVuY3Rpb24gZHMoYSl7dGhpcy5h
+PWF9LApsajpmdW5jdGlvbiBsaihhKXt0aGlzLmE9YX0sClVWOmZ1bmN0aW9uIFVWKGEpe3RoaXMuYT1h
+fSwKazU6ZnVuY3Rpb24gazUoKXt9LApLWTpmdW5jdGlvbiBLWSgpe30sCnA6ZnVuY3Rpb24gcChhKXt0
+aGlzLmE9YX0sCkNEOmZ1bmN0aW9uIENEKGEpe3RoaXMuYT1hfSwKYUU6ZnVuY3Rpb24gYUUoYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKY1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlv
+biBBbigpe30sCk4zOmZ1bmN0aW9uIE4zKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1j
+fSwKYzg6ZnVuY3Rpb24gYzgoKXt9LApNaDpmdW5jdGlvbiBNaCgpe30sClpkOmZ1bmN0aW9uIFpkKCl7
+fSwKTTpmdW5jdGlvbiBNKGEpe3RoaXMuYT1hfSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApj
+UzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6
+ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQs
+ZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcK
+Xy5RPV8uej1fLnk9Xy54PW51bGx9LApSWjpmdW5jdGlvbiBSWigpe30sCk1FOmZ1bmN0aW9uIE1FKGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp5NTpmdW5jdGlvbiB5NShhKXt0aGlzLmE9YX0sClBFOmZ1bmN0
+aW9uIFBFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnlJOmZ1bmN0aW9uIHlJKGEp
+e3RoaXMuYT1hfSwKYzY6ZnVuY3Rpb24gYzYoKXt9LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0
+aW9uIFVmKGEsYixjLGQsZSxmLGcsaCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
+LmU9ZQpfLmY9ZgpfLnI9ZwpfLng9aApfLnk9bnVsbH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxm
+LGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5R
+PV8uej1fLnk9Xy54PW51bGx9LAppSjpmdW5jdGlvbiBpSigpe30sCkUyOmZ1bmN0aW9uIEUyKGEsYil7
+dGhpcy5hPWEKdGhpcy5iPWJ9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
+QmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwK
+R0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5hPWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRo
+aXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEoKXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0KGEsYixjLGQp
+e3ZhciBzLHIscQpILnA4KGIpCnQuai5hKGQpCmlmKGIpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9cj10
+LnoKcT1QLlBXKEouTTEoZCxQLncwKCksciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5Fayhh
+LHEsbnVsbCkpfSwKRG0oYSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYh
+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5kZWZpbmVQcm9w
+ZXJ0eShhLGIse3ZhbHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4hMX0sCk9t
+KGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpcmV0dXJuIGFb
+Yl0KcmV0dXJuIG51bGx9LAp3WShhKXtpZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVv
+ZiBhPT0ibnVtYmVyInx8SC5yUShhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNClyZXR1cm4g
+YS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5iKGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2Vv
+ZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEpKXJldHVybiBQLmhFKGEsIiRkYXJ0X2pzRnVu
+Y3Rpb24iLG5ldyBQLkRWKCkpCnJldHVybiBQLmhFKGEsIl8kZGFydF9qc09iamVjdCIsbmV3IFAuUEMo
+JC5rSSgpKSl9LApoRShhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGwpe3M9Yy4kMShhKQpQ
+LkRtKGEsYixzKX1yZXR1cm4gc30sCmRVKGEpe3ZhciBzLHIKaWYoYT09bnVsbHx8dHlwZW9mIGE9PSJz
+dHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxz
+ZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZILlI5KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5j
+ZW9mIE9iamVjdCYmdC5hay5iKGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIERhdGUpe3M9
+SC5JWihhLmdldFRpbWUoKSkKaWYoTWF0aC5hYnMocyk8PTg2NGUxMylyPSExCmVsc2Ugcj0hMAppZihy
+KUgudihQLnhZKCJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAiK3MsbnVsbCkpCkguY2Io
+ITEsImlzVXRjIix0LnkpCnJldHVybiBuZXcgUC5pUChzLCExKX1lbHNlIGlmKGEuY29uc3RydWN0b3I9
+PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQoYSl7aWYodHlwZW9mIGE9
+PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLnooKSxuZXcgUC5RUygpKQppZihhIGluc3RhbmNlb2Yg
+QXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkKcmV0dXJuIFAuaVEoYSwkLlI4KCks
+bmV3IFAuVXQoKSl9LAppUShhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGx8fCEoYSBpbnN0
+YW5jZW9mIE9iamVjdCkpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCkRWOmZ1bmN0aW9u
+IERWKCl7fSwKUEM6ZnVuY3Rpb24gUEMoYSl7dGhpcy5hPWF9LApRUzpmdW5jdGlvbiBRUygpe30sCm5w
+OmZ1bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24gVXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlz
+LmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlz
+LmE9YQp0aGlzLiR0aT1ifSwKdmc6ZnVuY3Rpb24gdmcoKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktl
+OmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKaGk6ZnVuY3Rpb24gaGkoKXt9fSxSPXsKbnooYSl7dmFy
+IHM9SC5VYyhhLnEoMCwibm9kZUlkIikpCnJldHVybiBuZXcgUi5MTChDLk5tLkh0KEMucmssbmV3IFIu
+TUQoYSkpLHMpfSwKT1goYSl7c3dpdGNoKGEpe2Nhc2UgQy5BZDpyZXR1cm4iQWRkIC8qPyovIGhpbnQi
+CmNhc2UgQy5uZTpyZXR1cm4iQWRkIC8qISovIGhpbnQiCmNhc2UgQy53VjpyZXR1cm4iUmVtb3ZlIC8q
+PyovIGhpbnQiCmNhc2UgQy5mUjpyZXR1cm4iUmVtb3ZlIC8qISovIGhpbnQiCmNhc2UgQy5teTpyZXR1
+cm4iQ2hhbmdlIHRvIC8qPyovIGhpbnQiCmNhc2UgQy5yeDpyZXR1cm4iQ2hhbmdlIHRvIC8qISovIGhp
+bnQifX0sCkxMOmZ1bmN0aW9uIExMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNRDpmdW5jdGlvbiBN
+RChhKXt0aGlzLmE9YX0sCkg3OmZ1bmN0aW9uIEg3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9fSxUPXtt
+UTpmdW5jdGlvbiBtUSgpe319LFU9ewpqZihhKXt2YXIgcyxyLHEscAppZihhPT1udWxsKXM9bnVsbApl
+bHNle3M9SC5RSShbXSx0LmZBKQpmb3Iocj1KLklUKHQuUi5hKGEpKTtyLkYoKTspe3E9ci5nbCgpCnA9
+Si5VNihxKQpzLnB1c2gobmV3IFUuU2UoSC5rKHAucShxLCJkZXNjcmlwdGlvbiIpKSxILmsocC5xKHEs
+ImhyZWYiKSkpKX19cmV0dXJuIHN9LApOZChhKXt2YXIgcyxyCmlmKGE9PW51bGwpcz1udWxsCmVsc2V7
+cz1ILlFJKFtdLHQuaGgpCmZvcihyPUouSVQodC5SLmEoYSkpO3IuRigpOylzLnB1c2goVS5OZihyLmds
+KCkpKX1yZXR1cm4gc30sCk5mKGEpe3ZhciBzPUouVTYoYSkscj1ILmsocy5xKGEsImRlc2NyaXB0aW9u
+IikpLHE9SC5RSShbXSx0LmFKKQpmb3Iocz1KLklUKHQuUi5hKHMucShhLCJlbnRyaWVzIikpKTtzLkYo
+KTspcS5wdXNoKFUuUmoocy5nbCgpKSkKcmV0dXJuIG5ldyBVLnlEKHIscSl9LApSaihhKXt2YXIgcyxy
+PUouVTYoYSkscT1ILmsoci5xKGEsImRlc2NyaXB0aW9uIikpLHA9SC5rKHIucShhLCJmdW5jdGlvbiIp
+KSxvPXIucShhLCJsaW5rIikKaWYobz09bnVsbClvPW51bGwKZWxzZXtzPUouVTYobykKbz1uZXcgVS5N
+bChILmsocy5xKG8sImhyZWYiKSksSC5VYyhzLnEobywibGluZSIpKSxILmsocy5xKG8sInBhdGgiKSkp
+fXI9dC5iTS5hKHIucShhLCJoaW50QWN0aW9ucyIpKQpyPXI9PW51bGw/bnVsbDpKLk0xKHIsbmV3IFUu
+YU4oKSx0LkopLmJyKDApCnJldHVybiBuZXcgVS53YihxLHAsbyxyPT1udWxsP0MuZG46cil9LApkMjpm
+dW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
+LmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNbDpmdW5j
+dGlvbiBNbChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp5RDpmdW5jdGlvbiB5RChh
+LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2I6ZnVuY3Rpb24gd2IoYSxiLGMsZCl7dmFyIF89dGhpcwpf
+LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmFOOmZ1bmN0aW9uIGFOKCl7fSwKYjA6ZnVuY3Rpb24gYjAo
+KXt9fSxXPXsKeDMoKXtyZXR1cm4gd2luZG93fSwKWnIoKXtyZXR1cm4gZG9jdW1lbnR9LApKNihhKXt2
+YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKaWYoYSE9bnVsbClDLnhuLnNMVShzLGEpCnJl
+dHVybiBzfSwKTGooYSl7cmV0dXJuIENTUy5lc2NhcGUoYSl9LApVOShhLGIsYyl7dmFyIHMscj1kb2N1
+bWVudC5ib2R5CnIudG9TdHJpbmcKcz10LmFjCnM9bmV3IEguVTUobmV3IFcuZTcoQy5SWS5yNihyLGEs
+YixjKSkscy5DKCJhMihsRC5FKSIpLmEobmV3IFcuQ3YoKSkscy5DKCJVNTxsRC5FPiIpKQpyZXR1cm4g
+dC5oLmEocy5ncjgocykpfSwKclMoYSl7dmFyIHMscixxPSJlbGVtZW50IHRhZyB1bmF2YWlsYWJsZSIK
+dHJ5e3M9Si5ZRShhKQpzLmducyhhKQpxPXMuZ25zKGEpfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIHF9
+LApDMChhLGIpe2E9YStiJjUzNjg3MDkxMQphPWErKChhJjUyNDI4Nyk8PDEwKSY1MzY4NzA5MTEKcmV0
+dXJuIGFeYT4+PjZ9LApyRShhLGIsYyxkKXt2YXIgcz1XLkMwKFcuQzAoVy5DMChXLkMwKDAsYSksYiks
+YyksZCkscj1zKygocyY2NzEwODg2Myk8PDMpJjUzNjg3MDkxMQpyXj1yPj4+MTEKcmV0dXJuIHIrKChy
+JjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sClROKGEsYil7dmFyIHMscixxPWEuY2xhc3NMaXN0CmZvcihz
+PWIubGVuZ3RoLHI9MDtyPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytyKXEuYWRk
+KGJbcl0pfSwKSkUoYSxiLGMsZCxlKXt2YXIgcz1XLmFGKG5ldyBXLnZOKGMpLHQuQikKaWYocyE9bnVs
+bCYmITApSi5kWihhLGIscywhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYixzLCExLGUuQygieEM8MD4iKSl9
+LApUdyhhKXt2YXIgcz1XLko2KG51bGwpLHI9dC5GLmEod2luZG93LmxvY2F0aW9uKQpzPW5ldyBXLkpR
+KG5ldyBXLm1rKHMscikpCnMuQ1koYSkKcmV0dXJuIHN9LApxRChhLGIsYyxkKXt0LmguYShhKQpILm4o
+YikKSC5uKGMpCnQuY3IuYShkKQpyZXR1cm4hMH0sCm5aKGEsYixjLGQpe3ZhciBzLHIscQp0LmguYShh
+KQpILm4oYikKSC5uKGMpCnM9dC5jci5hKGQpLmEKcj1zLmEKQy54bi5zTFUocixjKQpxPXIuaG9zdG5h
+bWUKcz1zLmIKaWYoIShxPT1zLmhvc3RuYW1lJiZyLnBvcnQ9PT1zLnBvcnQmJnIucHJvdG9jb2w9PT1z
+LnByb3RvY29sKSlpZihxPT09IiIpaWYoci5wb3J0PT09IiIpe3M9ci5wcm90b2NvbApzPXM9PT0iOiJ8
+fHM9PT0iIn1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMApyZXR1cm4gc30sCkJsKCl7dmFyIHM9
+dC5OLHI9UC50TShDLlF4LHMpLHE9dC5kRy5hKG5ldyBXLklBKCkpLHA9SC5RSShbIlRFTVBMQVRFIl0s
+dC5zKQpzPW5ldyBXLmN0KHIsUC5McyhzKSxQLkxzKHMpLFAuTHMocyksbnVsbCkKcy5DWShudWxsLG5l
+dyBILmxKKEMuUXgscSx0LmR2KSxwLG51bGwpCnJldHVybiBzfSwKcWMoYSl7dmFyIHMKaWYoYT09bnVs
+bClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5QMShhKQpyZXR1cm4gc31lbHNl
+IHJldHVybiB0LmNoLmEoYSl9LApQMShhKXtpZihhPT09d2luZG93KXJldHVybiB0LmNpLmEoYSkKZWxz
+ZSByZXR1cm4gbmV3IFcuZFcoKX0sCmFGKGEsYil7dmFyIHM9JC5YMwppZihzPT09Qy5OVSlyZXR1cm4g
+YQpyZXR1cm4gcy5QeShhLGIpfSwKcUU6ZnVuY3Rpb24gcUUoKXt9LApHaDpmdW5jdGlvbiBHaCgpe30s
+CmZZOmZ1bmN0aW9uIGZZKCl7fSwKclo6ZnVuY3Rpb24gclooKXt9LApBejpmdW5jdGlvbiBBeigpe30s
+ClFQOmZ1bmN0aW9uIFFQKCl7fSwKbng6ZnVuY3Rpb24gbngoKXt9LApvSjpmdW5jdGlvbiBvSigpe30s
+CmlkOmZ1bmN0aW9uIGlkKCl7fSwKUUY6ZnVuY3Rpb24gUUYoKXt9LApOaDpmdW5jdGlvbiBOaCgpe30s
+CmFlOmZ1bmN0aW9uIGFlKCl7fSwKSUI6ZnVuY3Rpb24gSUIoKXt9LApuNzpmdW5jdGlvbiBuNygpe30s
+Cnd6OmZ1bmN0aW9uIHd6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmN2OmZ1bmN0aW9uIGN2KCl7
+fSwKQ3Y6ZnVuY3Rpb24gQ3YoKXt9LAplYTpmdW5jdGlvbiBlYSgpe30sCkQwOmZ1bmN0aW9uIEQwKCl7
+fSwKaEg6ZnVuY3Rpb24gaEgoKXt9LApoNDpmdW5jdGlvbiBoNCgpe30sCmJyOmZ1bmN0aW9uIGJyKCl7
+fSwKVmI6ZnVuY3Rpb24gVmIoKXt9LApmSjpmdW5jdGlvbiBmSigpe30sCndhOmZ1bmN0aW9uIHdhKCl7
+fSwKU2c6ZnVuY3Rpb24gU2coKXt9LAp1ODpmdW5jdGlvbiB1OCgpe30sCkFqOmZ1bmN0aW9uIEFqKCl7
+fSwKZTc6ZnVuY3Rpb24gZTcoYSl7dGhpcy5hPWF9LApLVjpmdW5jdGlvbiBLVigpe30sCkJIOmZ1bmN0
+aW9uIEJIKCl7fSwKU046ZnVuY3Rpb24gU04oKXt9LApldzpmdW5jdGlvbiBldygpe30sCmxwOmZ1bmN0
+aW9uIGxwKCl7fSwKVGI6ZnVuY3Rpb24gVGIoKXt9LApJdjpmdW5jdGlvbiBJdigpe30sCldQOmZ1bmN0
+aW9uIFdQKCl7fSwKeVk6ZnVuY3Rpb24geVkoKXt9LAp3NjpmdW5jdGlvbiB3Nigpe30sCks1OmZ1bmN0
+aW9uIEs1KCl7fSwKQ206ZnVuY3Rpb24gQ20oKXt9LApDUTpmdW5jdGlvbiBDUSgpe30sCnc0OmZ1bmN0
+aW9uIHc0KCl7fSwKcmg6ZnVuY3Rpb24gcmgoKXt9LApjZjpmdW5jdGlvbiBjZigpe30sCmk3OmZ1bmN0
+aW9uIGk3KGEpe3RoaXMuYT1hfSwKU3k6ZnVuY3Rpb24gU3koYSl7dGhpcy5hPWF9LApLUzpmdW5jdGlv
+biBLUyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQTM6ZnVuY3Rpb24gQTMoYSxiKXt0aGlzLmE9YQp0
+aGlzLmI9Yn0sCkk0OmZ1bmN0aW9uIEk0KGEpe3RoaXMuYT1hfSwKRms6ZnVuY3Rpb24gRmsoYSxiKXt0
+aGlzLmE9YQp0aGlzLiR0aT1ifSwKUk86ZnVuY3Rpb24gUk8oYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
+YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKQ3E6ZnVuY3Rpb24gQ3EoYSxiLGMsZCl7dmFyIF89dGhpcwpf
+LmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKeEM6ZnVuY3Rpb24geEMoYSxiLGMsZCxlKXt2YXIgXz10
+aGlzCl8uYj1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2TjpmdW5jdGlvbiB2TihhKXt0aGlz
+LmE9YX0sCkpROmZ1bmN0aW9uIEpRKGEpe3RoaXMuYT1hfSwKR206ZnVuY3Rpb24gR20oKXt9LAp2RDpm
+dW5jdGlvbiB2RChhKXt0aGlzLmE9YX0sClV2OmZ1bmN0aW9uIFV2KGEpe3RoaXMuYT1hfSwKRWc6ZnVu
+Y3Rpb24gRWcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKbTY6ZnVuY3Rpb24gbTYo
+KXt9LApFbzpmdW5jdGlvbiBFbygpe30sCldrOmZ1bmN0aW9uIFdrKCl7fSwKY3Q6ZnVuY3Rpb24gY3Qo
+YSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZT1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKSUE6ZnVu
+Y3Rpb24gSUEoKXt9LApPdzpmdW5jdGlvbiBPdygpe30sClc5OmZ1bmN0aW9uIFc5KGEsYixjKXt2YXIg
+Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz0tMQpfLmQ9bnVsbApfLiR0aT1jfSwKZFc6ZnVuY3Rpb24gZFco
+KXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28o
+YSl7dGhpcy5hPWEKdGhpcy5iPTB9LApmbTpmdW5jdGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0
+aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1bmN0
+aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxYPXsKQ0woYSxiKXt2YXIgcyxyLHEscCxvLG49
+Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51bGwpYT1DLnhCLnluKGEsbi5sZW5ndGgpCnM9dC5zCnI9SC5R
+SShbXSxzKQpxPUguUUkoW10scykKcz1hLmxlbmd0aAppZihzIT09MCYmYi5yNChDLnhCLlcoYSwwKSkp
+e2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBdKQpwPTF9ZWxzZXtDLk5tLmkocSwi
+IikKcD0wfWZvcihvPXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhhLG8pKSl7Qy5ObS5pKHIsQy54Qi5O
+aihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7Qy5ObS5pKHIsQy54Qi55bihhLHAp
+KQpDLk5tLmkocSwiIil9cmV0dXJuIG5ldyBYLldEKGIsbixyLHEpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxi
+LGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCkk3KGEpe3JldHVybiBuZXcg
+WC5kdihhKX0sCmR2OmZ1bmN0aW9uIGR2KGEpe3RoaXMuYT1hfX0KdmFyIHc9W0IsQyxELEUsRixILEos
+TCxNLE8sUCxSLFQsVSxXLFhdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3
+KQp2YXIgJD17fQpILkZLLnByb3RvdHlwZT17fQpKLkd2LnByb3RvdHlwZT17CkROKGEsYil7cmV0dXJu
+IGE9PT1ifSwKZ2lPKGEpe3JldHVybiBILmVRKGEpfSwKdyhhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIr
+SC5saChhKSsiJyJ9LAplNyhhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmdu
+ZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gU3RyaW5nKGEpfSwKZ2lP
+KGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2UucHJvdG90eXBlPXsKRE4oYSxi
+KXtyZXR1cm4gbnVsbD09Yn0sCncoYSl7cmV0dXJuIm51bGwifSwKZ2lPKGEpe3JldHVybiAwfSwKJGlj
+ODoxfQpKLk1GLnByb3RvdHlwZT17CmdpTyhhKXtyZXR1cm4gMH0sCncoYSl7cmV0dXJuIFN0cmluZyhh
 KX0sCiRpdm06MX0KSi5pQy5wcm90b3R5cGU9e30KSi5rZC5wcm90b3R5cGU9e30KSi5jNS5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPWFbJC56KCldCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMudChh
-KQpyZXR1cm4iSmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgIitILkVqKEoudyhzKSl9LAokaUVIOjF9Ckou
-amQucHJvdG90eXBlPXsKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnQ2KGEpLkMo
-IkA8MT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKaTpmdW5jdGlvbihhLGIpe0gudDYoYSkuYy5hKGIp
-CmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImFkZCIpKQphLnB1c2goYil9LApXNDpmdW5jdGlv
-bihhLGIpe3ZhciBzCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoInJlbW92ZUF0IikpCnM9YS5s
-ZW5ndGgKaWYoYj49cyl0aHJvdyBILmIoUC5PNyhiLG51bGwpKQpyZXR1cm4gYS5zcGxpY2UoYiwxKVsw
-XX0sClVHOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCkgudDYoYSkuQygiY1g8MT4iKS5hKGMpCmlmKCEh
-YS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImluc2VydEFsbCIpKQpQLndBKGIsMCxhLmxlbmd0aCwiaW5k
-ZXgiKQppZighdC5XLmIoYykpYz1KLlJYKGMpCnM9Si5IbShjKQphLmxlbmd0aD1hLmxlbmd0aCtzCnI9
-YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCkZWOmZ1bmN0aW9u
-KGEsYil7dmFyIHMKSC50NihhKS5DKCJjWDwxPiIpLmEoYikKaWYoISFhLmZpeGVkJGxlbmd0aClILnYo
-UC5MNCgiYWRkQWxsIikpCmlmKEFycmF5LmlzQXJyYXkoYikpe3RoaXMuS2goYSxiKQpyZXR1cm59Zm9y
-KHM9Si5JVChiKTtzLkYoKTspYS5wdXNoKHMuZ2woKSl9LApLaDpmdW5jdGlvbihhLGIpe3ZhciBzLHIK
-dC5iLmEoYikKcz1iLmxlbmd0aAppZihzPT09MClyZXR1cm4KaWYoYT09PWIpdGhyb3cgSC5iKFAuYTQo
-YSkpCmZvcihyPTA7cjxzOysrcilhLnB1c2goYltyXSl9LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9
-SC50NihhKQpyZXR1cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEoMikiKS5hKGIpLHMuQygiQDwxPiIp
-LktxKGMpLkMoImxKPDEsMj4iKSl9LAprOmZ1bmN0aW9uKGEsYil7dmFyIHMscj1QLk84KGEubGVuZ3Ro
-LCIiLCExLHQuTikKZm9yKHM9MDtzPGEubGVuZ3RoOysrcyl0aGlzLlk1KHIscyxILkVqKGFbc10pKQpy
-ZXR1cm4gci5qb2luKGIpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnQ2
-KGEpLmMpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCmQuYShiKQpILnQ2KGEpLktxKGQp
-LkMoIjEoMSwyKSIpLmEoYykKcz1hLmxlbmd0aApmb3Iocj1iLHE9MDtxPHM7KytxKXtyPWMuJDIocixh
-W3FdKQppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiByfSwKSHQ6ZnVuY3Rp
-b24oYSxiKXt2YXIgcyxyLHEscCxvLG49SC50NihhKQpuLkMoImEyKDEpIikuYShiKQpzPWEubGVuZ3Ro
-CmZvcihyPW51bGwscT0hMSxwPTA7cDxzOysrcCl7bz1hW3BdCmlmKEgub1QoYi4kMShvKSkpe2lmKHEp
-dGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9ITB9aWYocyE9PWEubGVuZ3RoKXRocm93IEguYihQLmE0KGEp
-KX1pZihxKXJldHVybiBuLmMuYShyKQp0aHJvdyBILmIoSC5XcCgpKX0sCkU6ZnVuY3Rpb24oYSxiKXtp
-ZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LApndEg6ZnVuY3Rp
-b24oYSl7aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQp0aHJvdyBILmIoSC5XcCgpKX0sCmdyWjpmdW5j
-dGlvbihhKXt2YXIgcz1hLmxlbmd0aAppZihzPjApcmV0dXJuIGFbcy0xXQp0aHJvdyBILmIoSC5XcCgp
-KX0sCllXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxLHAsbwpILnQ2KGEpLkMoImNYPDE+Iiku
-YShkKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC52KFAuTDQoInNldFJhbmdlIikpClAuakIoYixjLGEu
-bGVuZ3RoKQpzPWMtYgppZihzPT09MClyZXR1cm4KUC5rMShlLCJza2lwQ291bnQiKQppZih0LmouYihk
-KSl7cj1kCnE9ZX1lbHNle3I9Si5BNShkLGUpLnR0KDAsITEpCnE9MH1wPUouVTYocikKaWYocStzPnAu
-Z0EocikpdGhyb3cgSC5iKEguYXIoKSkKaWYocTxiKWZvcihvPXMtMTtvPj0wOy0tbylhW2Irb109cC5x
-KHIscStvKQplbHNlIGZvcihvPTA7bzxzOysrbylhW2Irb109cC5xKHIscStvKX0sCnZnOmZ1bmN0aW9u
-KGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQsMCl9LApWcjpmdW5jdGlvbihhLGIpe3ZhciBz
-LHIKSC50NihhKS5DKCJhMigxKSIpLmEoYikKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3Ipe2lmKEgu
-b1QoYi4kMShhW3JdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGghPT1zKXRocm93IEguYihQLmE0KGEpKX1y
-ZXR1cm4hMX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHMKZm9yKHM9MDtzPGEubGVuZ3RoOysrcylpZihK
-LlJNKGFbc10sYikpcmV0dXJuITAKcmV0dXJuITF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVu
-Z3RoPT09MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGghPT0wfSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4gUC54KGEsIlsiLCJdIil9LAp0dDpmdW5jdGlvbihhLGIpe3ZhciBzPUguUUkoYS5zbGlj
-ZSgwKSxILnQ2KGEpKQpyZXR1cm4gc30sCmJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITAp
-fSwKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwx
-PiIpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVy
-biBhLmxlbmd0aH0sCnNBOmZ1bmN0aW9uKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgi
-c2V0IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVs
-bCkpCmlmKGI+YS5sZW5ndGgpSC50NihhKS5jLmEobnVsbCkKYS5sZW5ndGg9Yn0sCnE6ZnVuY3Rpb24o
-YSxiKXtILklaKGIpCmlmKGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQpyZXR1cm4g
-YVtiXX0sClk1OmZ1bmN0aW9uKGEsYixjKXtILnQ2KGEpLmMuYShjKQppZighIWEuaW1tdXRhYmxlJGxp
-c3QpSC52KFAuTDQoImluZGV4ZWQgc2V0IikpCmlmKGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEgu
-dShhLGIpKQphW2JdPWN9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpKLlBvLnByb3RvdHlwZT17fQpK
-Lm0xLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmQpfSwK
-RjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIuYiE9PXApdGhyb3cg
-SC5iKEgubGsocSkpCnM9ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9ci5zTShxW3NdKTsr
-K3IuYwpyZXR1cm4hMH0sCnNNOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9
-LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsKelE6ZnVuY3Rpb24oYSl7aWYoYT4wKXtpZihhIT09MS8w
-KXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgucm91bmQoMC1h
-KQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAm
-JjEvYTwwKXJldHVybiItMC4wIgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHMs
-cixxLHAsbz1hfDAKaWYoYT09PW8pcmV0dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5hYnMoYSkKcj1NYXRo
-LmxvZyhzKS8wLjY5MzE0NzE4MDU1OTk0NTN8MApxPU1hdGgucG93KDIscikKcD1zPDE/cy9xOnEvcwpy
-ZXR1cm4oKHAqOTAwNzE5OTI1NDc0MDk5MnwwKSsocCozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcr
-cioxMjU5JjUzNjg3MDkxMX0sCnpZOmZ1bmN0aW9uKGEsYil7dmFyIHM9YSViCmlmKHM9PT0wKXJldHVy
-biAwCmlmKHM+MClyZXR1cm4gcwpyZXR1cm4gcytifSwKQlU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYXww
-KT09PWE/YS9ifDA6dGhpcy5ESihhLGIpfSwKREo6ZnVuY3Rpb24oYSxiKXt2YXIgcz1hL2IKaWYocz49
-LTIxNDc0ODM2NDgmJnM8PTIxNDc0ODM2NDcpcmV0dXJuIHN8MAppZihzPjApe2lmKHMhPT0xLzApcmV0
-dXJuIE1hdGguZmxvb3Iocyl9ZWxzZSBpZihzPi0xLzApcmV0dXJuIE1hdGguY2VpbChzKQp0aHJvdyBI
-LmIoUC5MNCgiUmVzdWx0IG9mIHRydW5jYXRpbmcgZGl2aXNpb24gaXMgIitILkVqKHMpKyI6ICIrSC5F
-aihhKSsiIH4vICIrYikpfSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihhPjApcz10aGlzLnAzKGEs
-YikKZWxzZXtzPWI+MzE/MzE6YgpzPWE+PnM+Pj4wfXJldHVybiBzfSwKYmY6ZnVuY3Rpb24oYSxiKXtp
-ZigwPmIpdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAzKGEsYil9LApwMzpmdW5jdGlvbihh
-LGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRpWlo6MX0KSi5iVS5wcm90b3R5cGU9eyRp
-SWo6MX0KSi5rRC5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5cGU9ewpPOmZ1bmN0aW9uKGEsYil7aWYo
-YjwwKXRocm93IEguYihILnUoYSxiKSkKaWYoYj49YS5sZW5ndGgpSC52KEgudShhLGIpKQpyZXR1cm4g
-YS5jaGFyQ29kZUF0KGIpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI+PWEubGVuZ3RoKXRocm93IEguYihI
-LnUoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5l
-dyBILnVuKGIsYSwwKX0sCmg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYStifSwKVGM6ZnVuY3Rpb24oYSxi
-KXt2YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMu
-eW4oYSxyLXMpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHM9UC5qQihiLGMsYS5sZW5ndGgpLHI9
-YS5zdWJzdHJpbmcoMCxiKSxxPWEuc3Vic3RyaW5nKHMpCnJldHVybiByK2QrcX0sClFpOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3Ro
-LG51bGwsbnVsbCkpCnM9YytiLmxlbmd0aAppZihzPmEubGVuZ3RoKXJldHVybiExCnJldHVybiBiPT09
-YS5zdWJzdHJpbmcoYyxzKX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RaShhLGIsMCl9LApO
-ajpmdW5jdGlvbihhLGIsYyl7aWYoYz09bnVsbCljPWEubGVuZ3RoCmlmKGI8MCl0aHJvdyBILmIoUC5P
-NyhiLG51bGwpKQppZihiPmMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkKaWYoYz5hLmxlbmd0aCl0aHJv
-dyBILmIoUC5PNyhjLG51bGwpKQpyZXR1cm4gYS5zdWJzdHJpbmcoYixjKX0sCnluOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIHRoaXMuTmooYSxiLG51bGwpfSwKaGM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9Mb3dl
-ckNhc2UoKX0sCmJTOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEudHJpbSgpLG89cC5sZW5ndGgKaWYo
-bz09PTApcmV0dXJuIHAKaWYodGhpcy5XKHAsMCk9PT0xMzMpe3M9Si5tbShwLDEpCmlmKHM9PT1vKXJl
-dHVybiIifWVsc2Ugcz0wCnI9by0xCnE9dGhpcy5PKHAscik9PT0xMzM/Si5jMShwLHIpOm8KaWYocz09
-PTAmJnE9PT1vKXJldHVybiBwCnJldHVybiBwLnN1YnN0cmluZyhzLHEpfSwKVDpmdW5jdGlvbihhLGIp
+cGU9ewp3KGEpe3ZhciBzPWFbJC56KCldCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMudChhKQpyZXR1cm4i
+SmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgIitILkVqKEoudyhzKSl9LAokaUVIOjF9CkouamQucHJvdG90
+eXBlPXsKZHIoYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnQ2KGEpLkMoIkA8MT4iKS5LcShiKS5DKCJq
+VjwxLDI+IikpfSwKaShhLGIpe0gudDYoYSkuYy5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAu
+TDQoImFkZCIpKQphLnB1c2goYil9LApXNChhLGIpe3ZhciBzCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52
+KFAuTDQoInJlbW92ZUF0IikpCnM9YS5sZW5ndGgKaWYoYj49cyl0aHJvdyBILmIoUC5PNyhiLG51bGwp
+KQpyZXR1cm4gYS5zcGxpY2UoYiwxKVswXX0sClVHKGEsYixjKXt2YXIgcyxyCkgudDYoYSkuQygiY1g8
+MT4iKS5hKGMpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImluc2VydEFsbCIpKQpQLndBKGIs
+MCxhLmxlbmd0aCwiaW5kZXgiKQppZighdC5XLmIoYykpYz1KLlJYKGMpCnM9Si5IbShjKQphLmxlbmd0
+aD1hLmxlbmd0aCtzCnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixj
+KX0sCkZWKGEsYil7dmFyIHMKSC50NihhKS5DKCJjWDwxPiIpLmEoYikKaWYoISFhLmZpeGVkJGxlbmd0
+aClILnYoUC5MNCgiYWRkQWxsIikpCmlmKEFycmF5LmlzQXJyYXkoYikpe3RoaXMuS2goYSxiKQpyZXR1
+cm59Zm9yKHM9Si5JVChiKTtzLkYoKTspYS5wdXNoKHMuZ2woKSl9LApLaChhLGIpe3ZhciBzLHIKdC5i
+LmEoYikKcz1iLmxlbmd0aAppZihzPT09MClyZXR1cm4KaWYoYT09PWIpdGhyb3cgSC5iKFAuYTQoYSkp
+CmZvcihyPTA7cjxzOysrcilhLnB1c2goYltyXSl9LApFMihhLGIsYyl7dmFyIHM9SC50NihhKQpyZXR1
+cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEoMikiKS5hKGIpLHMuQygiQDwxPiIpLktxKGMpLkMoImxK
+PDEsMj4iKSl9LAprKGEsYil7dmFyIHMscj1QLk84KGEubGVuZ3RoLCIiLCExLHQuTikKZm9yKHM9MDtz
+PGEubGVuZ3RoOysrcyl0aGlzLlk1KHIscyxILkVqKGFbc10pKQpyZXR1cm4gci5qb2luKGIpfSwKZVIo
+YSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnQ2KGEpLmMpfSwKTjAoYSxiLGMsZCl7dmFyIHMscixx
+CmQuYShiKQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmEoYykKcz1hLmxlbmd0aApmb3Iocj1iLHE9
+MDtxPHM7KytxKXtyPWMuJDIocixhW3FdKQppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkp
+fXJldHVybiByfSwKSHQoYSxiKXt2YXIgcyxyLHEscCxvLG49SC50NihhKQpuLkMoImEyKDEpIikuYShi
+KQpzPWEubGVuZ3RoCmZvcihyPW51bGwscT0hMSxwPTA7cDxzOysrcCl7bz1hW3BdCmlmKEgub1QoYi4k
+MShvKSkpe2lmKHEpdGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9ITB9aWYocyE9PWEubGVuZ3RoKXRocm93
+IEguYihQLmE0KGEpKX1pZihxKXJldHVybiBuLmMuYShyKQp0aHJvdyBILmIoSC5XcCgpKX0sCkUoYSxi
+KXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LApndEgoYSl7
+aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQp0aHJvdyBILmIoSC5XcCgpKX0sCmdyWihhKXt2YXIgcz1h
+Lmxlbmd0aAppZihzPjApcmV0dXJuIGFbcy0xXQp0aHJvdyBILmIoSC5XcCgpKX0sCllXKGEsYixjLGQs
+ZSl7dmFyIHMscixxLHAsbwpILnQ2KGEpLkMoImNYPDE+IikuYShkKQppZighIWEuaW1tdXRhYmxlJGxp
+c3QpSC52KFAuTDQoInNldFJhbmdlIikpClAuakIoYixjLGEubGVuZ3RoKQpzPWMtYgppZihzPT09MCly
+ZXR1cm4KUC5rMShlLCJza2lwQ291bnQiKQppZih0LmouYihkKSl7cj1kCnE9ZX1lbHNle3I9Si5BNShk
+LGUpLnR0KDAsITEpCnE9MH1wPUouVTYocikKaWYocStzPnAuZ0EocikpdGhyb3cgSC5iKEguYXIoKSkK
+aWYocTxiKWZvcihvPXMtMTtvPj0wOy0tbylhW2Irb109cC5xKHIscStvKQplbHNlIGZvcihvPTA7bzxz
+OysrbylhW2Irb109cC5xKHIscStvKX0sCnZnKGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQs
+MCl9LApWcihhLGIpe3ZhciBzLHIKSC50NihhKS5DKCJhMigxKSIpLmEoYikKcz1hLmxlbmd0aApmb3Io
+cj0wO3I8czsrK3Ipe2lmKEgub1QoYi4kMShhW3JdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGghPT1zKXRo
+cm93IEguYihQLmE0KGEpKX1yZXR1cm4hMX0sCnRnKGEsYil7dmFyIHMKZm9yKHM9MDtzPGEubGVuZ3Ro
+OysrcylpZihKLlJNKGFbc10sYikpcmV0dXJuITAKcmV0dXJuITF9LApnbDAoYSl7cmV0dXJuIGEubGVu
+Z3RoPT09MH0sCmdvcihhKXtyZXR1cm4gYS5sZW5ndGghPT0wfSwKdyhhKXtyZXR1cm4gUC54KGEsIlsi
+LCJdIil9LAp0dChhLGIpe3ZhciBzPUguUUkoYS5zbGljZSgwKSxILnQ2KGEpKQpyZXR1cm4gc30sCmJy
+KGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ20oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgs
+SC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTyhhKXtyZXR1cm4gSC5lUShhKX0sCmdBKGEpe3JldHVybiBh
+Lmxlbmd0aH0sCnNBKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0IGxlbmd0aCIp
+KQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmlmKGI+YS5s
+ZW5ndGgpSC50NihhKS5jLmEobnVsbCkKYS5sZW5ndGg9Yn0sCnEoYSxiKXtILklaKGIpCmlmKGI+PWEu
+bGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXtILnQ2
+KGEpLmMuYShjKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC52KFAuTDQoImluZGV4ZWQgc2V0IikpCmlm
+KGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQphW2JdPWN9LAokaWJROjEsCiRpY1g6
+MSwKJGl6TToxfQpKLlBvLnByb3RvdHlwZT17fQpKLm0xLnByb3RvdHlwZT17CmdsKCl7cmV0dXJuIHRo
+aXMuJHRpLmMuYSh0aGlzLmQpfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIu
+YiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9
+ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0sCnNNKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEo
+YSl9LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsKelEoYSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVy
+biBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJv
+dyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCncoYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiIt
+MC4wIgplbHNlIHJldHVybiIiK2F9LApnaU8oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYoYT09PW8pcmV0
+dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5hYnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0NzE4MDU1OTk0
+NTN8MApxPU1hdGgucG93KDIscikKcD1zPDE/cy9xOnEvcwpyZXR1cm4oKHAqOTAwNzE5OTI1NDc0MDk5
+MnwwKSsocCozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcrcioxMjU5JjUzNjg3MDkxMX0sCnpZKGEs
+Yil7dmFyIHM9YSViCmlmKHM9PT0wKXJldHVybiAwCmlmKHM+MClyZXR1cm4gcwpyZXR1cm4gcytifSwK
+QlUoYSxiKXtyZXR1cm4oYXwwKT09PWE/YS9ifDA6dGhpcy5ESihhLGIpfSwKREooYSxiKXt2YXIgcz1h
+L2IKaWYocz49LTIxNDc0ODM2NDgmJnM8PTIxNDc0ODM2NDcpcmV0dXJuIHN8MAppZihzPjApe2lmKHMh
+PT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyl9ZWxzZSBpZihzPi0xLzApcmV0dXJuIE1hdGguY2VpbChz
+KQp0aHJvdyBILmIoUC5MNCgiUmVzdWx0IG9mIHRydW5jYXRpbmcgZGl2aXNpb24gaXMgIitILkVqKHMp
+KyI6ICIrSC5FaihhKSsiIH4vICIrYikpfSwKd0coYSxiKXt2YXIgcwppZihhPjApcz10aGlzLnAzKGEs
+YikKZWxzZXtzPWI+MzE/MzE6YgpzPWE+PnM+Pj4wfXJldHVybiBzfSwKYmYoYSxiKXtpZigwPmIpdGhy
+b3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAzKGEsYil9LApwMyhhLGIpe3JldHVybiBiPjMxPzA6
+YT4+PmJ9LAokaUNQOjEsCiRpWlo6MX0KSi5iVS5wcm90b3R5cGU9eyRpSWo6MX0KSi5rRC5wcm90b3R5
+cGU9e30KSi5Eci5wcm90b3R5cGU9ewpPKGEsYil7aWYoYjwwKXRocm93IEguYihILnUoYSxiKSkKaWYo
+Yj49YS5sZW5ndGgpSC52KEgudShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVyhhLGIpe2lm
+KGI+PWEubGVuZ3RoKXRocm93IEguYihILnUoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRk
+KGEsYil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmgoYSxiKXtyZXR1cm4gYStifSwKVGMoYSxiKXt2
+YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMueW4o
+YSxyLXMpfSwKaTcoYSxiLGMsZCl7dmFyIHM9UC5qQihiLGMsYS5sZW5ndGgpLHI9YS5zdWJzdHJpbmco
+MCxiKSxxPWEuc3Vic3RyaW5nKHMpCnJldHVybiByK2QrcX0sClFpKGEsYixjKXt2YXIgcwppZihjPDB8
+fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9YytiLmxl
+bmd0aAppZihzPmEubGVuZ3RoKXJldHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyxzKX0sCm4o
+YSxiKXtyZXR1cm4gdGhpcy5RaShhLGIsMCl9LApOaihhLGIsYyl7cmV0dXJuIGEuc3Vic3RyaW5nKGIs
+UC5qQihiLGMsYS5sZW5ndGgpKX0sCnluKGEsYil7cmV0dXJuIHRoaXMuTmooYSxiLG51bGwpfSwKaGMo
+YSl7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX0sCmJTKGEpe3ZhciBzLHIscSxwPWEudHJpbSgpLG89cC5s
+ZW5ndGgKaWYobz09PTApcmV0dXJuIHAKaWYodGhpcy5XKHAsMCk9PT0xMzMpe3M9Si5tbShwLDEpCmlm
+KHM9PT1vKXJldHVybiIifWVsc2Ugcz0wCnI9by0xCnE9dGhpcy5PKHAscik9PT0xMzM/Si5jMShwLHIp
+Om8KaWYocz09PTAmJnE9PT1vKXJldHVybiBwCnJldHVybiBwLnN1YnN0cmluZyhzLHEpfSwKVChhLGIp
 e3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5ndGg9PT0wKXJldHVybiBhCmlm
 KGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHM9YSxyPSIiOyEwOyl7aWYoKGImMSk9PT0xKXI9
-cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0sClhVOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGws
-bnVsbCkpCnM9YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWTpmdW5jdGlvbihhLGIpe3JldHVybiB0
-aGlzLlhVKGEsYiwwKX0sClBrOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1hLmxl
-bmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVs
-bCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVuZ3RoCmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxhc3RJ
-bmRleE9mKGIsYyl9LApjbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlBrKGEsYixudWxsKX0sCklz
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhyb3cgSC5iKFAuVEUoYywwLHMs
-bnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhp
-cy5JcyhhLGIsMCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBz
-LHIscQpmb3Iocz1hLmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkmNTM2
-ODcwOTExCnI9cisoKHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcxMDg4
-NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkx
-MX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILklaKGIp
-CmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIoSC51KGEsYikpCnJldHVybiBhW2JdfSwKJGl2WDox
-LAokaXFVOjF9CkguQlIucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9SC5MaCh0aGlzKQpy
-ZXR1cm4gbmV3IEguZVQoSi5JVCh0aGlzLmdPTigpKSxzLkMoIkA8MT4iKS5LcShzLlFbMV0pLkMoImVU
-PDEsMj4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmdPTigpKX0sCmdsMDpmdW5j
-dGlvbihhKXtyZXR1cm4gSi51VSh0aGlzLmdPTigpKX0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gSi5G
-Nyh0aGlzLmdPTigpKX0sCmVSOmZ1bmN0aW9uKGEsYil7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5H
-SihKLkE1KHRoaXMuZ09OKCksYikscy5jLHMuUVsxXSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgu
-TGgodGhpcykuUVsxXS5hKEouR0EodGhpcy5nT04oKSxiKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBK
-LncodGhpcy5nT04oKSl9fQpILmVULnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5h
-LkYoKX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYSh0aGlzLmEuZ2woKSl9LAok
-aUFuOjF9CkguWnkucHJvdG90eXBlPXsKZ09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX19Ckgub2wu
-cHJvdG90eXBlPXskaWJROjF9CkguVXEucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0
-aGlzLiR0aS5RWzFdLmEoSi54OSh0aGlzLmEsSC5JWihiKSkpfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciBzPXRoaXMuJHRpCkoudTkodGhpcy5hLGIscy5jLmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwKJGl6
-TToxfQpILmpWLnByb3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKHRoaXMu
-YSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYikuQygialY8MSwyPiIpKX0sCmdPTjpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLmF9fQpILmMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz0iTGF0ZUluaXRp
-YWxpemF0aW9uRXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5xai5wcm90b3R5cGU9ewpnQTpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy54Qi5P
-KHRoaXMuYSxILklaKGIpKX19CkguYlEucHJvdG90eXBlPXt9CkguYUwucHJvdG90eXBlPXsKZ206ZnVu
-Y3Rpb24oYSl7dmFyIHM9dGhpcwpyZXR1cm4gbmV3IEguYTcocyxzLmdBKHMpLEguTGgocykuQygiYTc8
-YUwuRT4iKSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKazpmdW5j
-dGlvbihhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1wLmdBKHApCmlmKGIubGVuZ3RoIT09MCl7aWYobz09
-PTApcmV0dXJuIiIKcz1ILkVqKHAuRSgwLDApKQppZihvIT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChw
-KSkKZm9yKHI9cyxxPTE7cTxvOysrcSl7cj1yK2IrSC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkp
-dGhyb3cgSC5iKFAuYTQocCkpfXJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfWVsc2V7Zm9yKHE9
-MCxyPSIiO3E8bzsrK3Epe3IrPUguRWoocC5FKDAscSkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQ
-LmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn19LApldjpmdW5jdGlvbihhLGIpe3Jl
-dHVybiB0aGlzLkdHKDAsSC5MaCh0aGlzKS5DKCJhMihhTC5FKSIpLmEoYikpfSwKRTI6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILmxKKHRoaXMscy5LcShjKS5DKCIxKGFM
-LkUpIikuYShiKSxzLkMoIkA8YUwuRT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwKZVI6ZnVuY3Rpb24o
-YSxiKXtyZXR1cm4gSC5xQyh0aGlzLGIsbnVsbCxILkxoKHRoaXMpLkMoImFMLkUiKSl9LAp0dDpmdW5j
-dGlvbihhLGIpe3JldHVybiBQLlkxKHRoaXMsITAsSC5MaCh0aGlzKS5DKCJhTC5FIikpfSwKYnI6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9fQpILm5ILnByb3RvdHlwZT17CkhkOmZ1bmN0aW9u
-KGEsYixjLGQpe3ZhciBzLHI9dGhpcy5iClAuazEociwic3RhcnQiKQpzPXRoaXMuYwppZihzIT1udWxs
-KXtQLmsxKHMsImVuZCIpCmlmKHI+cyl0aHJvdyBILmIoUC5URShyLDAscywic3RhcnQiLG51bGwpKX19
-LApnVUQ6ZnVuY3Rpb24oKXt2YXIgcz1KLkhtKHRoaXMuYSkscj10aGlzLmMKaWYocj09bnVsbHx8cj5z
-KXJldHVybiBzCnJldHVybiByfSwKZ0FzOmZ1bmN0aW9uKCl7dmFyIHM9Si5IbSh0aGlzLmEpLHI9dGhp
-cy5iCmlmKHI+cylyZXR1cm4gcwpyZXR1cm4gcn0sCmdBOmZ1bmN0aW9uKGEpe3ZhciBzLHI9Si5IbSh0
-aGlzLmEpLHE9dGhpcy5iCmlmKHE+PXIpcmV0dXJuIDAKcz10aGlzLmMKaWYocz09bnVsbHx8cz49cily
-ZXR1cm4gci1xCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSE4oKQpyZXR1cm4gcy1xfSwK
-RTpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMscj1zLmdBcygpK2IKaWYoYjwwfHxyPj1zLmdVRCgpKXRo
+cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0sClhVKGEsYixjKXt2YXIgcwpp
+ZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9
+YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWShhLGIpe3JldHVybiB0aGlzLlhVKGEsYiwwKX0sClBr
+KGEsYixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1hLmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0
+aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVu
+Z3RoCmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxhc3RJbmRleE9mKGIsYyl9LApjbihhLGIpe3JldHVy
+biB0aGlzLlBrKGEsYixudWxsKX0sCklzKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhyb3cg
+SC5iKFAuVEUoYywwLHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGcoYSxiKXtyZXR1
+cm4gdGhpcy5JcyhhLGIsMCl9LAp3KGEpe3JldHVybiBhfSwKZ2lPKGEpe3ZhciBzLHIscQpmb3Iocz1h
+Lmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkmNTM2ODcwOTExCnI9ciso
+KHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcxMDg4NjMpPDwzKSY1MzY4
+NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sCmdBKGEpe3Jl
+dHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIo
+SC51KGEsYikpCnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkguQlIucHJvdG90eXBlPXsKZ20o
+YSl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguZVQoSi5JVCh0aGlzLmdPTigpKSxzLkMoIkA8
+MT4iKS5LcShzLlFbMV0pLkMoImVUPDEsMj4iKSl9LApnQShhKXtyZXR1cm4gSi5IbSh0aGlzLmdPTigp
+KX0sCmdsMChhKXtyZXR1cm4gSi51VSh0aGlzLmdPTigpKX0sCmdvcihhKXtyZXR1cm4gSi5GNyh0aGlz
+LmdPTigpKX0sCmVSKGEsYil7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5HSihKLkE1KHRoaXMuZ09O
+KCksYikscy5jLHMuUVsxXSl9LApFKGEsYil7cmV0dXJuIEguTGgodGhpcykuUVsxXS5hKEouR0EodGhp
+cy5nT04oKSxiKSl9LAp3KGEpe3JldHVybiBKLncodGhpcy5nT04oKSl9fQpILmVULnByb3RvdHlwZT17
+CkYoKXtyZXR1cm4gdGhpcy5hLkYoKX0sCmdsKCl7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYSh0aGlzLmEu
+Z2woKSl9LAokaUFuOjF9CkguWnkucHJvdG90eXBlPXsKZ09OKCl7cmV0dXJuIHRoaXMuYX19Ckgub2wu
+cHJvdG90eXBlPXskaWJROjF9CkguVXEucHJvdG90eXBlPXsKcShhLGIpe3JldHVybiB0aGlzLiR0aS5R
+WzFdLmEoSi54OSh0aGlzLmEsSC5JWihiKSkpfSwKWTUoYSxiLGMpe3ZhciBzPXRoaXMuJHRpCkoudTko
+dGhpcy5hLGIscy5jLmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwKJGl6TToxfQpILmpWLnByb3RvdHlw
+ZT17CmRyKGEsYil7cmV0dXJuIG5ldyBILmpWKHRoaXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYiku
+QygialY8MSwyPiIpKX0sCmdPTigpe3JldHVybiB0aGlzLmF9fQpILmMucHJvdG90eXBlPXsKdyhhKXt2
+YXIgcz0iTGF0ZUluaXRpYWxpemF0aW9uRXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5xai5wcm90
+b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnEoYSxiKXtyZXR1cm4gQy54Qi5PKHRo
+aXMuYSxILklaKGIpKX19CkguYlEucHJvdG90eXBlPXt9CkguYUwucHJvdG90eXBlPXsKZ20oYSl7dmFy
+IHM9dGhpcwpyZXR1cm4gbmV3IEguYTcocyxzLmdBKHMpLEguTGgocykuQygiYTc8YUwuRT4iKSl9LApn
+bDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKayhhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1w
+LmdBKHApCmlmKGIubGVuZ3RoIT09MCl7aWYobz09PTApcmV0dXJuIiIKcz1ILkVqKHAuRSgwLDApKQpp
+ZihvIT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChwKSkKZm9yKHI9cyxxPTE7cTxvOysrcSl7cj1yK2Ir
+SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpfXJldHVybiByLmNo
+YXJDb2RlQXQoMCk9PTA/cjpyfWVsc2V7Zm9yKHE9MCxyPSIiO3E8bzsrK3Epe3IrPUguRWoocC5FKDAs
+cSkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDAp
+PT0wP3I6cn19LApldihhLGIpe3JldHVybiB0aGlzLkdHKDAsSC5MaCh0aGlzKS5DKCJhMihhTC5FKSIp
+LmEoYikpfSwKRTIoYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILmxKKHRoaXMscy5L
+cShjKS5DKCIxKGFMLkUpIikuYShiKSxzLkMoIkA8YUwuRT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwK
+ZVIoYSxiKXtyZXR1cm4gSC5xQyh0aGlzLGIsbnVsbCxILkxoKHRoaXMpLkMoImFMLkUiKSl9LAp0dChh
+LGIpe3JldHVybiBQLlkxKHRoaXMsITAsSC5MaCh0aGlzKS5DKCJhTC5FIikpfSwKYnIoYSl7cmV0dXJu
+IHRoaXMudHQoYSwhMCl9fQpILm5ILnByb3RvdHlwZT17CkhkKGEsYixjLGQpe3ZhciBzLHI9dGhpcy5i
+ClAuazEociwic3RhcnQiKQpzPXRoaXMuYwppZihzIT1udWxsKXtQLmsxKHMsImVuZCIpCmlmKHI+cyl0
+aHJvdyBILmIoUC5URShyLDAscywic3RhcnQiLG51bGwpKX19LApnVUQoKXt2YXIgcz1KLkhtKHRoaXMu
+YSkscj10aGlzLmMKaWYocj09bnVsbHx8cj5zKXJldHVybiBzCnJldHVybiByfSwKZ0FzKCl7dmFyIHM9
+Si5IbSh0aGlzLmEpLHI9dGhpcy5iCmlmKHI+cylyZXR1cm4gcwpyZXR1cm4gcn0sCmdBKGEpe3ZhciBz
+LHI9Si5IbSh0aGlzLmEpLHE9dGhpcy5iCmlmKHE+PXIpcmV0dXJuIDAKcz10aGlzLmMKaWYocz09bnVs
+bHx8cz49cilyZXR1cm4gci1xCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSE4oKQpyZXR1
+cm4gcy1xfSwKRShhLGIpe3ZhciBzPXRoaXMscj1zLmdBcygpK2IKaWYoYjwwfHxyPj1zLmdVRCgpKXRo
 cm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBKLkdBKHMuYSxyKX0sCmVS
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRoaXMKUC5rMShiLCJjb3VudCIpCnM9cS5iK2IKcj1xLmMK
-aWYociE9bnVsbCYmcz49cilyZXR1cm4gbmV3IEguTUIocS4kdGkuQygiTUI8MT4iKSkKcmV0dXJuIEgu
-cUMocS5hLHMscixxLiR0aS5jKX0sCnR0OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHA9dGhpcyxvPXAu
-YixuPXAuYSxtPUouVTYobiksbD1tLmdBKG4pLGs9cC5jCmlmKGshPW51bGwmJms8bClsPWsKcz1sLW8K
-aWYoczw9MCl7bj1KLlFpKDAscC4kdGkuYykKcmV0dXJuIG59cj1QLk84KHMsbS5FKG4sbyksITEscC4k
-dGkuYykKZm9yKHE9MTtxPHM7KytxKXtDLk5tLlk1KHIscSxtLkUobixvK3EpKQppZihtLmdBKG4pPGwp
-dGhyb3cgSC5iKFAuYTQocCkpfXJldHVybiByfX0KSC5hNy5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigp
-e3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5kKX0sCkY6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMscT1y
-LmEscD1KLlU2KHEpLG89cC5nQShxKQppZihyLmIhPT1vKXRocm93IEguYihQLmE0KHEpKQpzPXIuYwpp
-ZihzPj1vKXtyLnNJKG51bGwpCnJldHVybiExfXIuc0kocC5FKHEscykpOysrci5jCnJldHVybiEwfSwK
-c0k6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRpQW46MX0KSC5pMS5w
-cm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5NSChK
-LklUKHRoaXMuYSksdGhpcy5iLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygiTUg8MSwyPiIpKX0sCmdB
-OmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
-dVUodGhpcy5hKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIp
-KX19CkgueHkucHJvdG90eXBlPXskaWJROjF9CkguTUgucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3Zh
-ciBzPXRoaXMscj1zLmIKaWYoci5GKCkpe3Muc0kocy5jLiQxKHIuZ2woKSkpCnJldHVybiEwfXMuc0ko
-bnVsbCkKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aS5RWzFdLmEodGhpcy5h
-KX0sCnNJOmZ1bmN0aW9uKGEpe3RoaXMuYT10aGlzLiR0aS5DKCIyPyIpLmEoYSl9fQpILmxKLnByb3Rv
-dHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnByb3RvdHlwZT17CmdtOmZ1bmN0
-aW9uKGEpe3JldHVybiBuZXcgSC5TTyhKLklUKHRoaXMuYSksdGhpcy5iLHRoaXMuJHRpLkMoIlNPPDE+
-IikpfX0KSC5TTy5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj10
-aGlzLmI7cy5GKCk7KWlmKEgub1Qoci4kMShzLmdsKCkpKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsOmZ1
-bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5BTS5wcm90b3R5cGU9ewplUjpmdW5jdGlvbihh
-LGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguQU0odGhpcy5hLHRoaXMuYitiLEguTGgodGhp
-cykuQygiQU08MT4iKSl9LApnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVTEoSi5JVCh0aGlzLmEp
-LHRoaXMuYixILkxoKHRoaXMpLkMoIlUxPDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpnQTpmdW5jdGlv
-bihhKXt2YXIgcz1KLkhtKHRoaXMuYSktdGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9LApl
-UjpmdW5jdGlvbihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguZDUodGhpcy5hLHRoaXMu
-YitiLHRoaXMuJHRpKX0sCiRpYlE6MX0KSC5VMS5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHMs
-cgpmb3Iocz10aGlzLmEscj0wO3I8dGhpcy5iOysrcilzLkYoKQp0aGlzLmI9MApyZXR1cm4gcy5GKCl9
-LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguTUIucHJvdG90eXBlPXsKZ206ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEMuR3d9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LApnQTpmdW5jdGlv
-bihhKXtyZXR1cm4gMH0sCkU6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5URShiLDAsMCwiaW5kZXgi
-LG51bGwpKX0sCmVSOmZ1bmN0aW9uKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiB0aGlzfX0KSC5G
-dS5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3Rocm93IEgu
-YihILldwKCkpfSwKJGlBbjoxfQpILnU2LnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBu
-ZXcgSC5KQihKLklUKHRoaXMuYSksdGhpcy4kdGkuQygiSkI8MT4iKSl9fQpILkpCLnByb3RvdHlwZT17
-CkY6ZnVuY3Rpb24oKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMuJHRpLmM7cy5GKCk7KWlmKHIu
-YihzLmdsKCkpKXJldHVybiEwCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGku
-Yy5hKHRoaXMuYS5nbCgpKX0sCiRpQW46MX0KSC5TVS5wcm90b3R5cGU9e30KSC5SZS5wcm90b3R5cGU9
-ewpZNTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIikuYShjKQp0aHJvdyBILmIoUC5M
-NCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19CkgudzIucHJvdG90eXBlPXt9
-Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuX2hhc2hDb2RlCmlmKHMh
-PW51bGwpcmV0dXJuIHMKcz02NjQ1OTcqSi5oZih0aGlzLmEpJjUzNjg3MDkxMQp0aGlzLl9oYXNoQ29k
-ZT1zCnJldHVybiBzfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4nU3ltYm9sKCInK0guRWoodGhpcy5hKSsn
-IiknfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNl
-b2YgSC53diYmdGhpcy5hPT1iLmF9LAokaUdEOjF9CkguUUMucHJvdG90eXBlPXt9CkguUEQucHJvdG90
-eXBlPXt9CkguV1UucHJvdG90eXBlPXsKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMp
-PT09MH0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LApZNTpmdW5jdGlvbihhLGIsYyl7
-dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCl9LApnUHU6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMucTQoMCxILkxoKHRoaXMpLkMoIk4zPDEsMj4iKSl9LApxNDpmdW5jdGlvbihh
-LGIpe3ZhciBzPXRoaXMKcmV0dXJuIFAubDAoZnVuY3Rpb24oKXt2YXIgcj1hCnZhciBxPTAscD0xLG8s
-bixtLGwsawpyZXR1cm4gZnVuY3Rpb24gJGFzeW5jJGdQdShjLGQpe2lmKGM9PT0xKXtvPWQKcT1wfXdo
-aWxlKHRydWUpc3dpdGNoKHEpe2Nhc2UgMDpuPXMuZ3ZjKCksbj1uLmdtKG4pLG09SC5MaChzKSxtPW0u
-QygiQDwxPiIpLktxKG0uUVsxXSkuQygiTjM8MSwyPiIpCmNhc2UgMjppZighbi5GKCkpe3E9MwpicmVh
-a31sPW4uZ2woKQprPXMucSgwLGwpCmsudG9TdHJpbmcKcT00CnJldHVybiBuZXcgUC5OMyhsLGssbSkK
-Y2FzZSA0OnE9MgpicmVhawpjYXNlIDM6cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0obyl9
-fX0sYil9LAokaVowOjF9CkguTFAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-YX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4hMQppZigiX19wcm90
-b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9wZXJ0eShhKX0sCnE6ZnVuY3Rp
-b24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5xUChiKX0sCnFQOmZ1
-bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC5uKGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEs
-cCxvPUguTGgodGhpcykKby5DKCJ+KDEsMikiKS5hKGIpCnM9dGhpcy5jCmZvcihyPXMubGVuZ3RoLG89
-by5RWzFdLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLG8uYSh0aGlzLnFQKHApKSl9fSwKZ3ZjOmZ1
-bmN0aW9uKCl7cmV0dXJuIG5ldyBILlhSKHRoaXMsSC5MaCh0aGlzKS5DKCJYUjwxPiIpKX19CkguWFIu
-cHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLmMKcmV0dXJuIG5ldyBKLm0xKHMs
-cy5sZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEu
-Yy5sZW5ndGh9fQpILkxJLnByb3RvdHlwZT17CmdXYTpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYQpyZXR1
-cm4gc30sCmduZDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89dGhpcwppZihvLmM9PT0xKXJldHVybiBD
-LmhVCnM9by5kCnI9cy5sZW5ndGgtby5lLmxlbmd0aC1vLmYKaWYocj09PTApcmV0dXJuIEMuaFUKcT1b
-XQpmb3IocD0wO3A8cjsrK3Ape2lmKHA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscCkKcS5wdXNoKHNb
-cF0pfXJldHVybiBKLnpDKHEpfSwKZ1ZtOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRo
-aXMKaWYoay5jIT09MClyZXR1cm4gQy5XTwpzPWsuZQpyPXMubGVuZ3RoCnE9ay5kCnA9cS5sZW5ndGgt
-ci1rLmYKaWYocj09PTApcmV0dXJuIEMuV08Kbz1uZXcgSC5ONSh0LmVvKQpmb3Iobj0wO248cjsrK24p
-e2lmKG4+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsbikKbT1zW25dCmw9cCtuCmlmKGw8MHx8bD49cS5s
-ZW5ndGgpcmV0dXJuIEguT0gocSxsKQpvLlk1KDAsbmV3IEgud3YobSkscVtsXSl9cmV0dXJuIG5ldyBI
-LlBEKG8sdC5nRil9LAokaXZROjF9CkguQ2oucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIg
-cwpILm4oYSkKcz10aGlzLmEKcy5iPXMuYisiJCIrYQpDLk5tLmkodGhpcy5iLGEpCkMuTm0uaSh0aGlz
-LmMsYik7KytzLmF9LAokUzoxMX0KSC5mOS5wcm90b3R5cGU9ewpxUzpmdW5jdGlvbihhKXt2YXIgcyxy
-LHE9dGhpcyxwPW5ldyBSZWdFeHAocS5hKS5leGVjKGEpCmlmKHA9PW51bGwpcmV0dXJuIG51bGwKcz1P
-YmplY3QuY3JlYXRlKG51bGwpCnI9cS5iCmlmKHIhPT0tMSlzLmFyZ3VtZW50cz1wW3IrMV0Kcj1xLmMK
-aWYociE9PS0xKXMuYXJndW1lbnRzRXhwcj1wW3IrMV0Kcj1xLmQKaWYociE9PS0xKXMuZXhwcj1wW3Ir
-MV0Kcj1xLmUKaWYociE9PS0xKXMubWV0aG9kPXBbcisxXQpyPXEuZgppZihyIT09LTEpcy5yZWNlaXZl
-cj1wW3IrMV0KcmV0dXJuIHN9fQpILlcwLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
-cy5iCmlmKHM9PW51bGwpcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiAiK3RoaXMuYQpyZXR1cm4iTm9T
-dWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK3MrIicgb24gbnVsbCJ9fQpILmF6LnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLHE9Ik5vU3VjaE1ldGhvZEVycm9yOiBt
-ZXRob2Qgbm90IGZvdW5kOiAnIixwPXIuYgppZihwPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJv
-cjogIityLmEKcz1yLmMKaWYocz09bnVsbClyZXR1cm4gcStwKyInICgiK3IuYSsiKSIKcmV0dXJuIHEr
-cCsiJyBvbiAnIitzKyInICgiK3IuYSsiKSJ9fQpILnZWLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
-dmFyIHM9dGhpcy5hCnJldHVybiBzLmxlbmd0aD09PTA/IkVycm9yIjoiRXJyb3I6ICIrc319CkgudGUu
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbCAoJyIrKHRoaXMuYT09
-PW51bGw/Im51bGwiOiJ1bmRlZmluZWQiKSsiJyBmcm9tIEphdmFTY3JpcHQpIn0sCiRpUno6MX0KSC5i
-cS5wcm90b3R5cGU9e30KSC5YTy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5i
-CmlmKHIhPW51bGwpcmV0dXJuIHIKcj10aGlzLmEKcz1yIT09bnVsbCYmdHlwZW9mIHI9PT0ib2JqZWN0
-Ij9yLnN0YWNrOm51bGwKcmV0dXJuIHRoaXMuYj1zPT1udWxsPyIiOnN9LAokaUd6OjF9CkguVHAucHJv
-dG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmNvbnN0cnVjdG9yLHI9cz09bnVsbD9udWxs
-OnMubmFtZQpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHI9PW51bGw/InVua25vd24iOnIpKyInIn0sCiRp
-RUg6MSwKZ0t1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpI
-LmxjLnByb3RvdHlwZT17fQpILnp4LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy4k
-c3RhdGljX25hbWUKaWYocz09bnVsbClyZXR1cm4iQ2xvc3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRo
-b2QiCnJldHVybiJDbG9zdXJlICciK0guTlEocykrIicifX0KSC5yVC5wcm90b3R5cGU9ewpETjpmdW5j
-dGlvbihhLGIpe3ZhciBzPXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihzPT09YilyZXR1cm4hMApp
-ZighKGIgaW5zdGFuY2VvZiBILnJUKSlyZXR1cm4hMQpyZXR1cm4gcy5hPT09Yi5hJiZzLiRfdGFyZ2V0
-PT09Yi4kX3RhcmdldCYmcy5iPT09Yi5ifSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5iCmlm
-KHI9PW51bGwpcz1ILmVRKHRoaXMuYSkKZWxzZSBzPXR5cGVvZiByIT09Im9iamVjdCI/Si5oZihyKTpI
-LmVRKHIpCnJldHVybihzXkguZVEodGhpcy4kX3RhcmdldCkpPj4+MH0sCnc6ZnVuY3Rpb24oYSl7dmFy
-IHM9dGhpcy5iCmlmKHM9PW51bGwpcz10aGlzLmEKcmV0dXJuIkNsb3N1cmUgJyIrdGhpcy4kX25hbWUr
-Iicgb2YgIisoIkluc3RhbmNlIG9mICciK0gubGgodC5LLmEocykpKyInIil9fQpILkVxLnByb3RvdHlw
-ZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJ1bnRpbWVFcnJvcjogIit0aGlzLmF9fQpILmtZLnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkFzc2VydGlvbiBmYWlsZWQ6ICIrUC5obCh0aGlzLmEp
-fX0KSC5rci5wcm90b3R5cGU9e30KSC5ONS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4g
-dGhpcy5hfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmE9PT0wfSwKZ3ZjOmZ1bmN0aW9uKCl7
-cmV0dXJuIG5ldyBILmk1KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwxPiIpKX0sCng0OmZ1bmN0aW9uKGEp
-e3ZhciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLlh1KHMsYSl9LApxOmZ1
-bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz10aGlzLG49bnVsbAppZih0eXBlb2YgYj09InN0cmluZyIp
-e3M9by5iCmlmKHM9PW51bGwpcmV0dXJuIG4Kcj1vLmoyKHMsYikKcT1yPT1udWxsP246ci5iCnJldHVy
-biBxfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYweDNmZmZmZmYpPT09Yil7cD1vLmMKaWYo
-cD09bnVsbClyZXR1cm4gbgpyPW8uajIocCxiKQpxPXI9PW51bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSBy
-ZXR1cm4gby5hYShiKX0sCmFhOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLmQKaWYocT09bnVsbCly
-ZXR1cm4gbnVsbApzPXRoaXMuQnQocSxKLmhmKGEpJjB4M2ZmZmZmZikKcj10aGlzLkZoKHMsYSkKaWYo
-cjwwKXJldHVybiBudWxsCnJldHVybiBzW3JdLmJ9LApZNTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
-LHAsbyxuLG09dGhpcyxsPUguTGgobSkKbC5jLmEoYikKbC5RWzFdLmEoYykKaWYodHlwZW9mIGI9PSJz
-dHJpbmciKXtzPW0uYgptLkVIKHM9PW51bGw/bS5iPW0ueksoKTpzLGIsYyl9ZWxzZSBpZih0eXBlb2Yg
-Yj09Im51bWJlciImJihiJjB4M2ZmZmZmZik9PT1iKXtyPW0uYwptLkVIKHI9PW51bGw/bS5jPW0uekso
-KTpyLGIsYyl9ZWxzZXtxPW0uZAppZihxPT1udWxsKXE9bS5kPW0ueksoKQpwPUouaGYoYikmMHgzZmZm
-ZmZmCm89bS5CdChxLHApCmlmKG89PW51bGwpbS5FSShxLHAsW20uSG4oYixjKV0pCmVsc2V7bj1tLkZo
-KG8sYikKaWYobj49MClvW25dLmI9YwplbHNlIG8ucHVzaChtLkhuKGIsYykpfX19LApLOmZ1bmN0aW9u
-KGEsYil7dmFyIHMscixxPXRoaXMKSC5MaChxKS5DKCJ+KDEsMikiKS5hKGIpCnM9cS5lCnI9cS5yCmZv
-cig7cyE9bnVsbDspe2IuJDIocy5hLHMuYikKaWYociE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKcz1z
-LmN9fSwKRUg6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9dGhpcyxxPUguTGgocikKcS5jLmEoYikKcS5R
-WzFdLmEoYykKcz1yLmoyKGEsYikKaWYocz09bnVsbClyLkVJKGEsYixyLkhuKGIsYykpCmVsc2Ugcy5i
-PWN9LAprczpmdW5jdGlvbigpe3RoaXMucj10aGlzLnIrMSY2NzEwODg2M30sCkhuOmZ1bmN0aW9uKGEs
-Yil7dmFyIHM9dGhpcyxyPUguTGgocykscT1uZXcgSC52aChyLmMuYShhKSxyLlFbMV0uYShiKSkKaWYo
-cy5lPT1udWxsKXMuZT1zLmY9cQplbHNle3I9cy5mCnIudG9TdHJpbmcKcS5kPXIKcy5mPXIuYz1xfSsr
-cy5hCnMua3MoKQpyZXR1cm4gcX0sCkZoOmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZihhPT1udWxsKXJl
-dHVybi0xCnM9YS5sZW5ndGgKZm9yKHI9MDtyPHM7KytyKWlmKEouUk0oYVtyXS5hLGIpKXJldHVybiBy
-CnJldHVybi0xfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCmoyOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIGFbYl19LApCdDpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKRUk6ZnVuY3Rpb24o
-YSxiLGMpe2FbYl09Y30sCnJuOmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApYdTpmdW5jdGlvbihh
-LGIpe3JldHVybiB0aGlzLmoyKGEsYikhPW51bGx9LAp6SzpmdW5jdGlvbigpe3ZhciBzPSI8bm9uLWlk
-ZW50aWZpZXIta2V5PiIscj1PYmplY3QuY3JlYXRlKG51bGwpCnRoaXMuRUkocixzLHIpCnRoaXMucm4o
-cixzKQpyZXR1cm4gcn0sCiRpRm86MX0KSC52aC5wcm90b3R5cGU9e30KSC5pNS5wcm90b3R5cGU9ewpn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-YS5hPT09MH0sCmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYSxyPW5ldyBILk42KHMscy5yLHRoaXMu
-JHRpLkMoIk42PDE+IikpCnIuYz1zLmUKcmV0dXJuIHJ9LAp0ZzpmdW5jdGlvbihhLGIpe3JldHVybiB0
-aGlzLmEueDQoYil9fQpILk42LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0s
-CkY6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMscT1yLmEKaWYoci5iIT09cS5yKXRocm93IEguYihQLmE0
-KHEpKQpzPXIuYwppZihzPT1udWxsKXtyLnNxWShudWxsKQpyZXR1cm4hMX1lbHNle3Iuc3FZKHMuYSkK
-ci5jPXMuYwpyZXR1cm4hMH19LApzcVk6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/Iiku
-YShhKX0sCiRpQW46MX0KSC5kQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5h
-KGEpfSwKJFM6NH0KSC53Ti5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEo
-YSxiKX0sCiRTOjUwfQpILlZYLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEo
-SC5uKGEpKX0sCiRTOjIxfQpILlZSLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlZ0V4
-cC8iK3RoaXMuYSsiLyIrdGhpcy5iLmZsYWdzfSwKZ0hjOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMu
-YwppZihyIT1udWxsKXJldHVybiByCnI9cy5iCnJldHVybiBzLmM9SC52NChzLmEsci5tdWx0aWxpbmUs
-IXIuaWdub3JlQ2FzZSxyLnVuaWNvZGUsci5kb3RBbGwsITApfSwKZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1
-cm4gbmV3IEguS1codGhpcyxiLDApfSwKVVo6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXQuSy5hKHRoaXMu
-Z0hjKCkpCnIubGFzdEluZGV4PWIKcz1yLmV4ZWMoYSkKaWYocz09bnVsbClyZXR1cm4gbnVsbApyZXR1
-cm4gbmV3IEguRUsocyl9LAokaXZYOjEsCiRpd0w6MX0KSC5FSy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9u
-KGEsYil7dmFyIHMKSC5JWihiKQpzPXRoaXMuYgppZihiPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLGIp
-CnJldHVybiBzW2JdfSwKJGlPZDoxLAokaWliOjF9CkguS1cucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24o
-YSl7cmV0dXJuIG5ldyBILlBiKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19CkguUGIucHJvdG90eXBlPXsK
-Z2w6ZnVuY3Rpb24oKXtyZXR1cm4gdC5jei5hKHRoaXMuZCl9LApGOmZ1bmN0aW9uKCl7dmFyIHMscixx
-LHAsbyxuLG09dGhpcyxsPW0uYgppZihsPT1udWxsKXJldHVybiExCnM9bS5jCnI9bC5sZW5ndGgKaWYo
-czw9cil7cT1tLmEKcD1xLlVaKGwscykKaWYocCE9bnVsbCl7bS5kPXAKcz1wLmIKbz1zLmluZGV4Cm49
-bytzWzBdLmxlbmd0aAppZihvPT09bil7aWYocS5iLnVuaWNvZGUpe3M9bS5jCnE9cysxCmlmKHE8cil7
-cz1DLnhCLk8obCxzKQppZihzPj01NTI5NiYmczw9NTYzMTkpe3M9Qy54Qi5PKGwscSkKcz1zPj01NjMy
-MCYmczw9NTczNDN9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKbj0ocz9uKzE6bikrMX1tLmM9
-bgpyZXR1cm4hMH19bS5iPW0uZD1udWxsCnJldHVybiExfSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17
-CnE6ZnVuY3Rpb24oYSxiKXtILklaKGIpCmlmKGIhPT0wKUgudihQLk83KGIsbnVsbCkpCnJldHVybiB0
-aGlzLmN9LAokaU9kOjF9CkgudW4ucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBI
-LlNkKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19CkguU2QucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3Zh
-ciBzLHIscT10aGlzLHA9cS5jLG89cS5iLG49by5sZW5ndGgsbT1xLmEsbD1tLmxlbmd0aAppZihwK24+
-bCl7cS5kPW51bGwKcmV0dXJuITF9cz1tLmluZGV4T2YobyxwKQppZihzPDApe3EuYz1sKzEKcS5kPW51
-bGwKcmV0dXJuITF9cj1zK24KcS5kPW5ldyBILnRRKHMsbykKcS5jPXI9PT1xLmM/cisxOnIKcmV0dXJu
-ITB9LApnbDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuZApzLnRvU3RyaW5nCnJldHVybiBzfSwKJGlBbjox
-fQpILkVULnByb3RvdHlwZT17JGlFVDoxLCRpQVM6MX0KSC5MWi5wcm90b3R5cGU9ewpnQTpmdW5jdGlv
-bihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhqOjF9CkguRGcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihh
-LGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwKWTU6ZnVuY3Rpb24oYSxi
-LGMpe0guclYoYykKSC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpN
-OjF9CkguUGcucHJvdG90eXBlPXsKWTU6ZnVuY3Rpb24oYSxiLGMpe0guSVooYykKSC5vZChiLGEsYS5s
-ZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkgueGoucHJvdG90eXBlPXsKcTpm
-dW5jdGlvbihhLGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kRS5w
-cm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJu
-IGFbYl19fQpILlpBLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILklaKGIpCkgub2QoYixhLGEu
-bGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZFQucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guSVoo
-YikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5QcS5wcm90b3R5cGU9ewpxOmZ1bmN0
-aW9uKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmVFLnByb3Rv
-dHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILkla
-KGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguVjYucHJvdG90eXBlPXsKZ0E6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guSVooYikKSC5vZChiLGEs
-YS5sZW5ndGgpCnJldHVybiBhW2JdfSwKJGluNjoxfQpILlJHLnByb3RvdHlwZT17fQpILlZQLnByb3Rv
-dHlwZT17fQpILldCLnByb3RvdHlwZT17fQpILlpHLnByb3RvdHlwZT17fQpILkpjLnByb3RvdHlwZT17
-CkM6ZnVuY3Rpb24oYSl7cmV0dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsdGhpcyxhKX0sCktxOmZ1bmN0
-aW9uKGEpe3JldHVybiBILnY1KHYudHlwZVVuaXZlcnNlLHRoaXMsYSl9fQpILkcucHJvdG90eXBlPXt9
-Ckgua1MucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfX0KSC5pTS5wcm90b3R5
-cGU9e30KUC50aC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEscj1zLmEKcy5h
-PW51bGwKci4kMCgpfSwKJFM6MTN9ClAuaGEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMs
-cgp0aGlzLmEuYT10Lk0uYShhKQpzPXRoaXMuYgpyPXRoaXMuYwpzLmZpcnN0Q2hpbGQ/cy5yZW1vdmVD
-aGlsZChyKTpzLmFwcGVuZENoaWxkKHIpfSwKJFM6NDF9ClAuVnMucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
-b24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjE1fQpQLkZ0LnByb3RvdHlwZT17CiQw
-OmZ1bmN0aW9uKCl7dGhpcy5hLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzoxNX0KUC5XMy5wcm90b3R5
-cGU9ewpDWTpmdW5jdGlvbihhLGIpe2lmKHNlbGYuc2V0VGltZW91dCE9bnVsbClzZWxmLnNldFRpbWVv
-dXQoSC50UihuZXcgUC55SCh0aGlzLGIpLDApLGEpCmVsc2UgdGhyb3cgSC5iKFAuTDQoImBzZXRUaW1l
-b3V0KClgIG5vdCBmb3VuZC4iKSl9fQpQLnlILnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5i
-LiQwKCl9LAokQzoiJDAiLAokUjowLAokUzowfQpQLmloLnByb3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEs
-Yil7dmFyIHMscj10aGlzLHE9ci4kdGkKcS5DKCIxLz8iKS5hKGIpCmlmKGI9PW51bGwpYj1xLmMuYShi
-KQppZighci5iKXIuYS5YZihiKQplbHNle3M9ci5hCmlmKHEuQygiYjg8MT4iKS5iKGIpKXMuY1UoYikK
-ZWxzZSBzLlgyKHEuYy5hKGIpKX19LAp3MDpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMuYQppZih0aGlz
-LmIpcy5aTChhLGIpCmVsc2Ugcy5OayhhLGIpfX0KUC5XTS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5hLiQyKDAsYSl9LAokUzo1MX0KUC5TWC5wcm90b3R5cGU9ewokMjpmdW5jdGlv
-bihhLGIpe3RoaXMuYS4kMigxLG5ldyBILmJxKGEsdC5sLmEoYikpKX0sCiRDOiIkMiIsCiRSOjIsCiRT
-OjUzfQpQLkdzLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hKEguSVooYSksYil9LAok
-Uzo0NX0KUC5GeS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJJdGVyYXRpb25NYXJrZXIo
-Iit0aGlzLmIrIiwgIitILkVqKHRoaXMuYSkrIikifX0KUC5HVi5wcm90b3R5cGU9ewpnbDpmdW5jdGlv
-bigpe3ZhciBzPXRoaXMuYwppZihzPT1udWxsKXJldHVybiB0aGlzLiR0aS5jLmEodGhpcy5iKQpyZXR1
-cm4gcy5nbCgpfSwKRjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKZm9yKHM9bS4kdGku
-QygiQW48MT4iKTshMDspe3I9bS5jCmlmKHIhPW51bGwpaWYoci5GKCkpcmV0dXJuITAKZWxzZSBtLnNY
-OShudWxsKQpxPWZ1bmN0aW9uKGEsYixjKXt2YXIgbCxrPWIKd2hpbGUodHJ1ZSl0cnl7cmV0dXJuIGEo
-ayxsKX1jYXRjaChqKXtsPWoKaz1jfX0obS5hLDAsMSkKaWYocSBpbnN0YW5jZW9mIFAuRnkpe3A9cS5i
-CmlmKHA9PT0yKXtvPW0uZAppZihvPT1udWxsfHxvLmxlbmd0aD09PTApe20uc0VDKG51bGwpCnJldHVy
-biExfWlmKDA+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8sLTEpCm0uYT1vLnBvcCgpCmNvbnRpbnVlfWVs
-c2V7cj1xLmEKaWYocD09PTMpdGhyb3cgcgplbHNle249cy5hKEouSVQocikpCmlmKG4gaW5zdGFuY2Vv
-ZiBQLkdWKXtyPW0uZAppZihyPT1udWxsKXI9bS5kPVtdCkMuTm0uaShyLG0uYSkKbS5hPW4uYQpjb250
-aW51ZX1lbHNle20uc1g5KG4pCmNvbnRpbnVlfX19fWVsc2V7bS5zRUMocSkKcmV0dXJuITB9fXJldHVy
-biExfSwKc0VDOmZ1bmN0aW9uKGEpe3RoaXMuYj10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LApzWDk6ZnVu
-Y3Rpb24oYSl7dGhpcy5jPXRoaXMuJHRpLkMoIkFuPDE+PyIpLmEoYSl9LAokaUFuOjF9ClAucTQucHJv
-dG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkdWKHRoaXMuYSgpLHRoaXMuJHRpLkMo
-IkdWPDE+IikpfX0KUC5Ddy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBILkVqKHRoaXMu
-YSl9LAokaVhTOjEsCmdJSTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9fQpQLlBmLnByb3RvdHlwZT17
-CncwOmZ1bmN0aW9uKGEsYil7dmFyIHMKSC5jYihhLCJlcnJvciIsdC5LKQpzPXRoaXMuYQppZihzLmEh
-PT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKaWYoYj09bnVsbCli
-PVAudjAoYSkKcy5OayhhLGIpfSwKcG06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19
-ClAuWmYucHJvdG90eXBlPXsKYU06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuJHRpCnIuQygiMS8/
-IikuYShiKQpzPXRoaXMuYQppZihzLmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBj
-b21wbGV0ZWQiKSkKcy5YZihyLkMoIjEvIikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17CkhSOmZ1bmN0
-aW9uKGEpe2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIuYnYodC5hbC5h
-KHRoaXMuZCksYS5hLHQueSx0LkspfSwKS3c6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5lLHI9dC56LHE9
-dC5LLHA9YS5hLG89dGhpcy4kdGkuQygiMi8iKSxuPXRoaXMuYi5iCmlmKHQuYWcuYihzKSlyZXR1cm4g
-by5hKG4ucnAocyxwLGEuYixyLHEsdC5sKSkKZWxzZSByZXR1cm4gby5hKG4uYnYodC5iSS5hKHMpLHAs
-cixxKSl9fQpQLnZzLnByb3RvdHlwZT17ClNxOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD10aGlz
-LiR0aQpwLktxKGMpLkMoIjEvKDIpIikuYShhKQpzPSQuWDMKaWYocyE9PUMuTlUpe2MuQygiQDwwLz4i
-KS5LcShwLmMpLkMoIjEoMikiKS5hKGEpCmlmKGIhPW51bGwpYj1QLlZIKGIscyl9cj1uZXcgUC52cyhz
-LGMuQygidnM8MD4iKSkKcT1iPT1udWxsPzE6Mwp0aGlzLnhmKG5ldyBQLkZlKHIscSxhLGIscC5DKCJA
-PDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHJ9LApXNzpmdW5jdGlvbihhLGIpe3JldHVy
-biB0aGlzLlNxKGEsbnVsbCxiKX0sClFkOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPXRoaXMuJHRpCnIu
-S3EoYykuQygiMS8oMikiKS5hKGEpCnM9bmV3IFAudnMoJC5YMyxjLkMoInZzPDA+IikpCnRoaXMueGYo
-bmV3IFAuRmUocywxOSxhLGIsci5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHN9
-LAp4ZjpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMscT1yLmEKaWYocTw9MSl7YS5hPXQuZS5hKHIuYykK
-ci5jPWF9ZWxzZXtpZihxPT09Mil7cz10LmMuYShyLmMpCnE9cy5hCmlmKHE8NCl7cy54ZihhKQpyZXR1
-cm59ci5hPXEKci5jPXMuY31QLlRrKG51bGwsbnVsbCxyLmIsdC5NLmEobmV3IFAuZGEocixhKSkpfX0s
-CmpROmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD17fQpsLmE9YQppZihhPT1udWxs
-KXJldHVybgpzPW0uYQppZihzPD0xKXtyPXQuZS5hKG0uYykKbS5jPWEKaWYociE9bnVsbCl7cT1hLmEK
-Zm9yKHA9YTtxIT1udWxsO3A9cSxxPW8pbz1xLmEKcC5hPXJ9fWVsc2V7aWYocz09PTIpe249dC5jLmEo
-bS5jKQpzPW4uYQppZihzPDQpe24ualEoYSkKcmV0dXJufW0uYT1zCm0uYz1uLmN9bC5hPW0uTjgoYSkK
-UC5UayhudWxsLG51bGwsbS5iLHQuTS5hKG5ldyBQLm9RKGwsbSkpKX19LAphaDpmdW5jdGlvbigpe3Zh
-ciBzPXQuZS5hKHRoaXMuYykKdGhpcy5jPW51bGwKcmV0dXJuIHRoaXMuTjgocyl9LApOODpmdW5jdGlv
-bihhKXt2YXIgcyxyLHEKZm9yKHM9YSxyPW51bGw7cyE9bnVsbDtyPXMscz1xKXtxPXMuYQpzLmE9cn1y
-ZXR1cm4gcn0sCmVjOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPXRoaXMKcC5hPTEKdHJ5e2EuU3EobmV3
-IFAucFYocCksbmV3IFAuVTcocCksdC5QKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpClAucmIo
-bmV3IFAudnIocCxzLHIpKX19LApYMjpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMKci4kdGkuYy5hKGEp
-CnM9ci5haCgpCnIuYT00CnIuYz1hClAuSFoocixzKX0sClpMOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
-PXRoaXMKdC5sLmEoYikKcz1xLmFoKCkKcj1QLlRsKGEsYikKcS5hPTgKcS5jPXIKUC5IWihxLHMpfSwK
-WGY6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy4kdGkKcy5DKCIxLyIpLmEoYSkKaWYocy5DKCJiODwxPiIp
-LmIoYSkpe3RoaXMuY1UoYSkKcmV0dXJufXRoaXMud1Uocy5jLmEoYSkpfSwKd1U6ZnVuY3Rpb24oYSl7
-dmFyIHM9dGhpcwpzLiR0aS5jLmEoYSkKcy5hPTEKUC5UayhudWxsLG51bGwscy5iLHQuTS5hKG5ldyBQ
-LnJ0KHMsYSkpKX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMscj1zLiR0aQpyLkMoImI4PDE+Iiku
-YShhKQppZihyLmIoYSkpe2lmKGEuYT09PTgpe3MuYT0xClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShu
-ZXcgUC5LRihzLGEpKSl9ZWxzZSBQLkE5KGEscykKcmV0dXJufXMuZWMoYSl9LApOazpmdW5jdGlvbihh
-LGIpe3RoaXMuYT0xClAuVGsobnVsbCxudWxsLHRoaXMuYix0Lk0uYShuZXcgUC5aTCh0aGlzLGEsYikp
-KX0sCiRpYjg6MX0KUC5kYS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe1AuSFoodGhpcy5hLHRoaXMu
-Yil9LAokUzowfQpQLm9RLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0aGlzLmIsdGhpcy5h
-LmEpfSwKJFM6MH0KUC5wVi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlz
-LmEKcC5hPTAKdHJ5e3AuWDIocC4kdGkuYy5hKGEpKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEp
-CnAuWkwocyxyKX19LAokUzoxM30KUC5VNy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMu
-YS5aTCh0LksuYShhKSx0LmwuYShiKSl9LAokQzoiJDIiLAokUjoyLAokUzozNH0KUC52ci5wcm90b3R5
-cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAucnQucHJv
-dG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWDIodGhpcy5iKX0sCiRTOjB9ClAuS0YucHJvdG90
-eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5aTC5wcm90b3R5
-cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJv
-dG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bnVsbAp0cnl7cT1t
-LmEuYQpsPXEuYi5iLnp6KHQuZk8uYShxLmQpLHQueil9Y2F0Y2gocCl7cz1ILlJ1KHApCnI9SC50cyhw
-KQpxPW0uYyYmdC5uLmEobS5iLmEuYykuYT09PXMKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5iLmEuYykK
-ZWxzZSBvLmM9UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMmJmwuYT49
-NCl7aWYobC5hPT09OCl7cT1tLmEKcS5jPXQubi5hKGwuYykKcS5iPSEwfXJldHVybn1pZih0LmkuYihs
-KSl7bj1tLmIuYQpxPW0uYQpxLmM9bC5XNyhuZXcgUC5qWihuKSx0LnopCnEuYj0hMX19LAokUzowfQpQ
-LmpaLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokUzoyOX0KUC5ycS5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtLGwKdHJ5e3E9dGhpcy5hCnA9
-cS5hCm89cC4kdGkKbj1vLmMKbT1uLmEodGhpcy5iKQpxLmM9cC5iLmIuYnYoby5DKCIyLygxKSIpLmEo
-cC5kKSxtLG8uQygiMi8iKSxuKX1jYXRjaChsKXtzPUguUnUobCkKcj1ILnRzKGwpCnE9dGhpcy5hCnEu
-Yz1QLlRsKHMscikKcS5iPSEwfX0sCiRTOjB9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2
-YXIgcyxyLHEscCxvLG4sbT10aGlzCnRyeXtzPXQubi5hKG0uYS5hLmMpCnA9bS5iCmlmKHAuYS5IUihz
-KSYmcC5hLmUhPW51bGwpe3AuYz1wLmEuS3cocykKcC5iPSExfX1jYXRjaChvKXtyPUguUnUobykKcT1I
-LnRzKG8pCnA9dC5uLmEobS5hLmEuYykKbj1tLmIKaWYocC5hPT09ciluLmM9cAplbHNlIG4uYz1QLlRs
-KHIscSkKbi5iPSEwfX0sCiRTOjB9ClAuT00ucHJvdG90eXBlPXt9ClAucWgucHJvdG90eXBlPXsKZ0E6
-ZnVuY3Rpb24oYSl7dmFyIHMscixxPXRoaXMscD17fSxvPW5ldyBQLnZzKCQuWDMsdC5mSikKcC5hPTAK
-cz1ILkxoKHEpCnI9cy5DKCJ+KDEpPyIpLmEobmV3IFAuQjUocCxxKSkKdC5aLmEobmV3IFAudU8ocCxv
-KSkKVy5KRShxLmEscS5iLHIsITEscy5jKQpyZXR1cm4gb319ClAuQjUucHJvdG90eXBlPXsKJDE6ZnVu
-Y3Rpb24oYSl7SC5MaCh0aGlzLmIpLmMuYShhKTsrK3RoaXMuYS5hfSwKJFM6ZnVuY3Rpb24oKXtyZXR1
-cm4gSC5MaCh0aGlzLmIpLkMoIn4oMSkiKX19ClAudU8ucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2
-YXIgcz10aGlzLmIscj1zLiR0aSxxPXIuQygiMS8iKS5hKHRoaXMuYS5hKSxwPXMuYWgoKQpyLmMuYShx
-KQpzLmE9NApzLmM9cQpQLkhaKHMscCl9LAokUzowfQpQLk1PLnByb3RvdHlwZT17fQpQLmtULnByb3Rv
-dHlwZT17fQpQLnhJLnByb3RvdHlwZT17fQpQLm0wLnByb3RvdHlwZT17JGlRbToxfQpQLkV2LnByb3Rv
-dHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHM9dC5LLmEoSC5iKHRoaXMuYSkpCnMuc3RhY2s9dGhpcy5i
-LncoMCkKdGhyb3cgc30sCiRTOjB9ClAuSmkucHJvdG90eXBlPXsKYkg6ZnVuY3Rpb24oYSl7dmFyIHMs
-cixxLHAsbwp0Lk0uYShhKQp0cnl7aWYoQy5OVT09PSQuWDMpe2EuJDAoKQpyZXR1cm59UC5UOChudWxs
-LG51bGwsdGhpcyxhLHQuSCl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpwPXQuSy5hKHMpCm89
-dC5sLmEocikKUC5TaShwLG8pfX0sCkRsOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvCmMuQygi
-figwKSIpLmEoYSkKYy5hKGIpCnRyeXtpZihDLk5VPT09JC5YMyl7YS4kMShiKQpyZXR1cm59UC55dihu
-dWxsLG51bGwsdGhpcyxhLGIsdC5ILGMpfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKcD10Lksu
-YShzKQpvPXQubC5hKHIpClAuU2kocCxvKX19LApHWTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVnAo
-dGhpcyx0Lk0uYShhKSl9LApQeTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5PUih0aGlzLGIuQygi
-figwKSIpLmEoYSksYil9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGx9LAp6ejpmdW5jdGlvbihh
-LGIpe2IuQygiMCgpIikuYShhKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMCgpCnJldHVybiBQLlQ4
-KG51bGwsbnVsbCx0aGlzLGEsYil9LApidjpmdW5jdGlvbihhLGIsYyxkKXtjLkMoIkA8MD4iKS5LcShk
-KS5DKCIxKDIpIikuYShhKQpkLmEoYikKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDEoYikKcmV0dXJu
-IFAueXYobnVsbCxudWxsLHRoaXMsYSxiLGMsZCl9LApycDpmdW5jdGlvbihhLGIsYyxkLGUsZil7ZC5D
-KCJAPDA+IikuS3EoZSkuS3EoZikuQygiMSgyLDMpIikuYShhKQplLmEoYikKZi5hKGMpCmlmKCQuWDM9
-PT1DLk5VKXJldHVybiBhLiQyKGIsYykKcmV0dXJuIFAuUXgobnVsbCxudWxsLHRoaXMsYSxiLGMsZCxl
-LGYpfSwKTGo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGIuQygiQDwwPiIpLktxKGMpLktxKGQpLkMo
-IjEoMiwzKSIpLmEoYSl9fQpQLlZwLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
-YS5iSCh0aGlzLmIpfSwKJFM6MH0KUC5PUi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz10
-aGlzLmMKcmV0dXJuIHRoaXMuYS5EbCh0aGlzLmIscy5hKGEpLHMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1
-cm4gdGhpcy5jLkMoIn4oMCkiKX19ClAuYjYucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9
-dGhpcyxyPW5ldyBQLmxtKHMscy5yLEguTGgocykuQygibG08MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0s
-CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-YT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYSE9PTB9LAp0ZzpmdW5jdGlvbihhLGIp
-e3ZhciBzLHIKaWYoYiE9PSJfX3Byb3RvX18iKXtzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiExCnJl
-dHVybiB0LmcuYShzW2JdKSE9bnVsbH1lbHNle3I9dGhpcy5QUihiKQpyZXR1cm4gcn19LApQUjpmdW5j
-dGlvbihhKXt2YXIgcz10aGlzLmQKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5ERihzW3Ro
-aXMuTihhKV0sYSk+PTB9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRoaXMKSC5MaChxKS5jLmEo
-YikKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3M9cS5iCnJldHVybiBxLkoo
-cz09bnVsbD9xLmI9UC5UMigpOnMsYil9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjEwNzM3
-NDE4MjMpPT09Yil7cj1xLmMKcmV0dXJuIHEuSihyPT1udWxsP3EuYz1QLlQyKCk6cixiKX1lbHNlIHJl
-dHVybiBxLlkoYil9LApZOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPXRoaXMKSC5MaChwKS5jLmEoYSkK
-cz1wLmQKaWYocz09bnVsbClzPXAuZD1QLlQyKCkKcj1wLk4oYSkKcT1zW3JdCmlmKHE9PW51bGwpc1ty
-XT1bcC55byhhKV0KZWxzZXtpZihwLkRGKHEsYSk+PTApcmV0dXJuITEKcS5wdXNoKHAueW8oYSkpfXJl
-dHVybiEwfSwKUjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZi
-IT09Il9fcHJvdG9fXyIpcmV0dXJuIHMuSChzLmIsYikKZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciIm
-JihiJjEwNzM3NDE4MjMpPT09YilyZXR1cm4gcy5IKHMuYyxiKQplbHNlIHJldHVybiBzLnFnKGIpfSwK
-cWc6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz10aGlzLG49by5kCmlmKG49PW51bGwpcmV0dXJuITEK
-cz1vLk4oYSkKcj1uW3NdCnE9by5ERihyLGEpCmlmKHE8MClyZXR1cm4hMQpwPXIuc3BsaWNlKHEsMSlb
-MF0KaWYoMD09PXIubGVuZ3RoKWRlbGV0ZSBuW3NdCm8uRyhwKQpyZXR1cm4hMH0sCko6ZnVuY3Rpb24o
-YSxiKXtILkxoKHRoaXMpLmMuYShiKQppZih0LmcuYShhW2JdKSE9bnVsbClyZXR1cm4hMQphW2JdPXRo
-aXMueW8oYikKcmV0dXJuITB9LApIOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4h
-MQpzPXQuZy5hKGFbYl0pCmlmKHM9PW51bGwpcmV0dXJuITEKdGhpcy5HKHMpCmRlbGV0ZSBhW2JdCnJl
-dHVybiEwfSwKUzpmdW5jdGlvbigpe3RoaXMucj10aGlzLnIrMSYxMDczNzQxODIzfSwKeW86ZnVuY3Rp
-b24oYSl7dmFyIHMscj10aGlzLHE9bmV3IFAuYm4oSC5MaChyKS5jLmEoYSkpCmlmKHIuZT09bnVsbCly
-LmU9ci5mPXEKZWxzZXtzPXIuZgpzLnRvU3RyaW5nCnEuYz1zCnIuZj1zLmI9cX0rK3IuYQpyLlMoKQpy
-ZXR1cm4gcX0sCkc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPWEuYyxxPWEuYgppZihyPT1udWxsKXMu
-ZT1xCmVsc2Ugci5iPXEKaWYocT09bnVsbClzLmY9cgplbHNlIHEuYz1yOy0tcy5hCnMuUygpfSwKTjpm
-dW5jdGlvbihhKXtyZXR1cm4gSi5oZihhKSYxMDczNzQxODIzfSwKREY6ZnVuY3Rpb24oYSxiKXt2YXIg
-cyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYoSi5STShh
-W3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9fQpQLmJuLnByb3RvdHlwZT17fQpQLmxtLnByb3RvdHlw
-ZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmQpfSwKRjpmdW5jdGlvbigp
-e3ZhciBzPXRoaXMscj1zLmMscT1zLmEKaWYocy5iIT09cS5yKXRocm93IEguYihQLmE0KHEpKQplbHNl
-IGlmKHI9PW51bGwpe3Muc2oobnVsbCkKcmV0dXJuITF9ZWxzZXtzLnNqKHMuJHRpLkMoIjE/IikuYShy
-LmEpKQpzLmM9ci5iCnJldHVybiEwfX0sCnNqOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIx
-PyIpLmEoYSl9LAokaUFuOjF9ClAubVcucHJvdG90eXBlPXt9ClAudXkucHJvdG90eXBlPXskaWJROjEs
-JGljWDoxLCRpek06MX0KUC5sRC5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEgu
-YTcoYSx0aGlzLmdBKGEpLEgueksoYSkuQygiYTc8bEQuRT4iKSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0
-dXJuIHRoaXMucShhLGIpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC56SyhhKS5DKCJ+KGxELkUp
-IikuYShiKQpzPXRoaXMuZ0EoYSkKZm9yKHI9MDtyPHM7KytyKXtiLiQxKHRoaXMucShhLHIpKQppZihz
-IT09dGhpcy5nQShhKSl0aHJvdyBILmIoUC5hNChhKSl9fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmdBKGEpPT09MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5nbDAoYSl9LApFMjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHM9SC56SyhhKQpyZXR1cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEobEQu
-RSkiKS5hKGIpLHMuQygiQDxsRC5FPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpmdW5jdGlvbihh
-LGIpe3JldHVybiBILnFDKGEsYixudWxsLEgueksoYSkuQygibEQuRSIpKX0sCmRyOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIG5ldyBILmpWKGEsSC56SyhhKS5DKCJAPGxELkU+IikuS3EoYikuQygialY8MSwyPiIp
-KX0sCmR1OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHI9SC56SyhhKQpkPXIuQygibEQuRSIpLmEoci5D
-KCJsRC5FPyIpLmEoZCkpClAuakIoYixjLHRoaXMuZ0EoYSkpCmZvcihzPWI7czxjOysrcyl0aGlzLlk1
-KGEscyxkKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAueChhLCJbIiwiXSIpfX0KUC5pbC5wcm90b3R5
-cGU9e30KUC5yYS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5hCmlmKCFy
-LmEpdGhpcy5iLmErPSIsICIKci5hPSExCnI9dGhpcy5iCnM9ci5hKz1ILkVqKGEpCnIuYT1zKyI6ICIK
-ci5hKz1ILkVqKGIpfSwKJFM6OX0KUC5Zay5wcm90b3R5cGU9ewpLOmZ1bmN0aW9uKGEsYil7dmFyIHMs
-cixxPUguTGgodGhpcykKcS5DKCJ+KFlrLkssWWsuVikiKS5hKGIpCmZvcihzPUouSVQodGhpcy5ndmMo
-KSkscT1xLkMoIllrLlYiKTtzLkYoKTspe3I9cy5nbCgpCmIuJDIocixxLmEodGhpcy5xKDAscikpKX19
-LApnUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTTEodGhpcy5ndmMoKSxuZXcgUC55USh0aGlzKSxILkxo
-KHRoaXMpLkMoIk4zPFlrLkssWWsuVj4iKSl9LAp4NDpmdW5jdGlvbihhKXtyZXR1cm4gSi56bCh0aGlz
-Lmd2YygpLGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5ndmMoKSl9LApnbDA6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5ndmMoKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5P
-KHRoaXMpfSwKJGlaMDoxfQpQLnlRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhp
-cy5hLHE9SC5MaChyKQpxLkMoIllrLksiKS5hKGEpCnM9cS5DKCJZay5WIikKcmV0dXJuIG5ldyBQLk4z
-KGEscy5hKHIucSgwLGEpKSxxLkMoIkA8WWsuSz4iKS5LcShzKS5DKCJOMzwxLDI+IikpfSwKJFM6ZnVu
-Y3Rpb24oKXtyZXR1cm4gSC5MaCh0aGlzLmEpLkMoIk4zPFlrLkssWWsuVj4oWWsuSykiKX19ClAuS1Au
-cHJvdG90eXBlPXsKWTU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcy5jLmEoYikKcy5R
-WzFdLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpKX19
-ClAuUG4ucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucSgwLGIpfSwKWTU6
-ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKdGhpcy5hLlk1KDAscy5jLmEoYikscy5RWzFd
-LmEoYykpfSwKeDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS54NChhKX0sCks6ZnVuY3Rpb24oYSxi
-KXt0aGlzLmEuSygwLEguTGgodGhpcykuQygifigxLDIpIikuYShiKSl9LApnbDA6ZnVuY3Rpb24oYSl7
-dmFyIHM9dGhpcy5hCnJldHVybiBzLmdsMChzKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpy
-ZXR1cm4gcy5nQShzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS53KDApfSwKZ1B1OmZ1bmN0
-aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5nUHUocyl9LAokaVowOjF9ClAuR2oucHJvdG90eXBl
-PXt9ClAubGYucHJvdG90eXBlPXsKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpPT09
-MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKSE9PTB9LApGVjpmdW5jdGlvbihh
-LGIpe3ZhciBzCmZvcihzPUouSVQoSC5MaCh0aGlzKS5DKCJjWDxsZi5FPiIpLmEoYikpO3MuRigpOyl0
-aGlzLmkoMCxzLmdsKCkpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC54KHRoaXMsInsiLCJ9Iil9LApr
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRoaXMuZ20odGhpcykKaWYoIXEuRigpKXJldHVybiIiCnM9
-cS4kdGkuYwppZihiPT09IiIpe3I9IiIKZG8gcis9SC5FaihzLmEocS5kKSkKd2hpbGUocS5GKCkpCnM9
-cn1lbHNle3I9IiIrSC5FaihzLmEocS5kKSkKZm9yKDtxLkYoKTspcj1yK2IrSC5FaihzLmEocS5kKSkK
-cz1yfXJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-SC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJsZi5FIikpfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIs
-cSxwLG89ImluZGV4IgpILmNiKGIsbyx0LlMpClAuazEoYixvKQpmb3Iocz10aGlzLmdtKHRoaXMpLHI9
-cy4kdGkuYyxxPTA7cy5GKCk7KXtwPXIuYShzLmQpCmlmKGI9PT1xKXJldHVybiBwOysrcX10aHJvdyBI
-LmIoUC5DZihiLHRoaXMsbyxudWxsLHEpKX19ClAuVmoucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRp
-eHU6MX0KUC5Ydi5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl4dToxfQpQLm5ZLnByb3RvdHlwZT17
-fQpQLldZLnByb3RvdHlwZT17fQpQLlJVLnByb3RvdHlwZT17fQpQLnBSLnByb3RvdHlwZT17fQpQLnV3
-LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuYgppZihyPT1udWxsKXJldHVy
-biB0aGlzLmMucSgwLGIpCmVsc2UgaWYodHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBudWxsCmVsc2V7
-cz1yW2JdCnJldHVybiB0eXBlb2Ygcz09InVuZGVmaW5lZCI/dGhpcy5mYihiKTpzfX0sCmdBOmZ1bmN0
-aW9uKGEpe3JldHVybiB0aGlzLmI9PW51bGw/dGhpcy5jLmE6dGhpcy5DZigpLmxlbmd0aH0sCmdsMDpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LApndmM6ZnVuY3Rpb24oKXtpZih0aGlz
-LmI9PW51bGwpe3ZhciBzPXRoaXMuYwpyZXR1cm4gbmV3IEguaTUocyxILkxoKHMpLkMoImk1PDE+Iikp
-fXJldHVybiBuZXcgUC5pOCh0aGlzKX0sClk1OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9dGhpcwpp
-ZihxLmI9PW51bGwpcS5jLlk1KDAsYixjKQplbHNlIGlmKHEueDQoYikpe3M9cS5iCnNbYl09YwpyPXEu
-YQppZihyPT1udWxsP3MhPW51bGw6ciE9PXMpcltiXT1udWxsfWVsc2UgcS5YSygpLlk1KDAsYixjKX0s
-Cng0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJldHVybiBP
-YmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5jdGlvbihh
-LGIpe3ZhciBzLHIscSxwLG89dGhpcwp0LmNBLmEoYikKaWYoby5iPT1udWxsKXJldHVybiBvLmMuSygw
-LGIpCnM9by5DZigpCmZvcihyPTA7cjxzLmxlbmd0aDsrK3Ipe3E9c1tyXQpwPW8uYltxXQppZih0eXBl
-b2YgcD09InVuZGVmaW5lZCIpe3A9UC5RZShvLmFbcV0pCm8uYltxXT1wfWIuJDIocSxwKQppZihzIT09
-by5jKXRocm93IEguYihQLmE0KG8pKX19LApDZjpmdW5jdGlvbigpe3ZhciBzPXQuYk0uYSh0aGlzLmMp
-CmlmKHM9PW51bGwpcz10aGlzLmM9SC5RSShPYmplY3Qua2V5cyh0aGlzLmEpLHQucykKcmV0dXJuIHN9
-LApYSzpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbj10aGlzCmlmKG4uYj09bnVsbClyZXR1cm4gbi5j
-CnM9UC5GbCh0Lk4sdC56KQpyPW4uQ2YoKQpmb3IocT0wO3A9ci5sZW5ndGgscTxwOysrcSl7bz1yW3Fd
-CnMuWTUoMCxvLG4ucSgwLG8pKX1pZihwPT09MClDLk5tLmkociwiIikKZWxzZSBDLk5tLnNBKHIsMCkK
-bi5hPW4uYj1udWxsCnJldHVybiBuLmM9c30sCmZiOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKCFPYmplY3Qu
-cHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpKXJldHVybiBudWxsCnM9UC5RZSh0
-aGlzLmFbYV0pCnJldHVybiB0aGlzLmJbYV09c319ClAuaTgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
-YSl7dmFyIHM9dGhpcy5hCnJldHVybiBzLmdBKHMpfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMu
-YQppZihzLmI9PW51bGwpcz1zLmd2YygpLkUoMCxiKQplbHNle3M9cy5DZigpCmlmKGI8MHx8Yj49cy5s
-ZW5ndGgpcmV0dXJuIEguT0gocyxiKQpzPXNbYl19cmV0dXJuIHN9LApnbTpmdW5jdGlvbihhKXt2YXIg
-cz10aGlzLmEKaWYocy5iPT1udWxsKXtzPXMuZ3ZjKCkKcz1zLmdtKHMpfWVsc2V7cz1zLkNmKCkKcz1u
-ZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9cmV0dXJuIHN9LAp0ZzpmdW5jdGlv
-bihhLGIpe3JldHVybiB0aGlzLmEueDQoYil9fQpQLnhyLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
-dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7ZmF0YWw6dHJ1ZX0pCnJldHVybiBz
-fWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAokUzoxMH0KUC5Oei5wcm90b3R5cGU9ewokMDpm
-dW5jdGlvbigpe3ZhciBzLHIKdHJ5e3M9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOmZhbHNl
-fSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0sCiRTOjEwfQpQLkNWLnByb3Rv
-dHlwZT17CnlyOmZ1bmN0aW9uKGExLGEyLGEzKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxm
-LGUsZCxjLGIsYSxhMD0iSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIKYTM9UC5qQihhMixh
-MyxhMS5sZW5ndGgpCnM9JC5WNygpCmZvcihyPXMubGVuZ3RoLHE9YTIscD1xLG89bnVsbCxuPS0xLG09
-LTEsbD0wO3E8YTM7cT1rKXtrPXErMQpqPUMueEIuVyhhMSxxKQppZihqPT09Mzcpe2k9aysyCmlmKGk8
-PWEzKXtoPUgub28oQy54Qi5XKGExLGspKQpnPUgub28oQy54Qi5XKGExLGsrMSkpCmY9aCoxNitnLShn
-JjI1NikKaWYoZj09PTM3KWY9LTEKaz1pfWVsc2UgZj0tMX1lbHNlIGY9agppZigwPD1mJiZmPD0xMjcp
-e2lmKGY8MHx8Zj49cilyZXR1cm4gSC5PSChzLGYpCmU9c1tmXQppZihlPj0wKXtmPUMueEIuTygiQUJD
-REVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkr
-LyIsZSkKaWYoZj09PWopY29udGludWUKaj1mfWVsc2V7aWYoZT09PS0xKXtpZihuPDApe2Q9bz09bnVs
-bD9udWxsOm8uYS5sZW5ndGgKaWYoZD09bnVsbClkPTAKbj1kKyhxLXApCm09cX0rK2wKaWYoaj09PTYx
-KWNvbnRpbnVlfWo9Zn1pZihlIT09LTIpe2lmKG89PW51bGwpe289bmV3IFAuTSgiIikKZD1vfWVsc2Ug
-ZD1vCmM9ZC5hKz1DLnhCLk5qKGExLHAscSkKZC5hPWMrSC5MdyhqKQpwPWsKY29udGludWV9fXRocm93
-IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBkYXRhIixhMSxxKSl9aWYobyE9bnVsbCl7cj1vLmErPUMu
-eEIuTmooYTEscCxhMykKZD1yLmxlbmd0aAppZihuPj0wKVAueE0oYTEsbSxhMyxuLGwsZCkKZWxzZXti
-PUMuam4uelkoZC0xLDQpKzEKaWYoYj09PTEpdGhyb3cgSC5iKFAucnIoYTAsYTEsYTMpKQpmb3IoO2I8
-NDspe3IrPSI9IgpvLmE9cjsrK2J9fXI9by5hCnJldHVybiBDLnhCLmk3KGExLGEyLGEzLHIuY2hhckNv
-ZGVBdCgwKT09MD9yOnIpfWE9YTMtYTIKaWYobj49MClQLnhNKGExLG0sYTMsbixsLGEpCmVsc2V7Yj1D
-LmpuLnpZKGEsNCkKaWYoYj09PTEpdGhyb3cgSC5iKFAucnIoYTAsYTEsYTMpKQppZihiPjEpYTE9Qy54
-Qi5pNyhhMSxhMyxhMyxiPT09Mj8iPT0iOiI9Iil9cmV0dXJuIGExfX0KUC5VOC5wcm90b3R5cGU9e30K
-UC5Vay5wcm90b3R5cGU9e30KUC53SS5wcm90b3R5cGU9e30KUC5aaS5wcm90b3R5cGU9e30KUC5VZC5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPVAuaGwodGhpcy5hKQpyZXR1cm4odGhpcy5iIT1u
-dWxsPyJDb252ZXJ0aW5nIG9iamVjdCB0byBhbiBlbmNvZGFibGUgb2JqZWN0IGZhaWxlZDoiOiJDb252
-ZXJ0aW5nIG9iamVjdCBkaWQgbm90IHJldHVybiBhbiBlbmNvZGFibGUgb2JqZWN0OiIpKyIgIitzfX0K
-UC5LOC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJDeWNsaWMgZXJyb3IgaW4gSlNPTiBz
-dHJpbmdpZnkifX0KUC5ieS5wcm90b3R5cGU9ewpwVzpmdW5jdGlvbihhLGIsYyl7dmFyIHMKdC5mVi5h
-KGMpCnM9UC5CUyhiLHRoaXMuZ0hlKCkuYSkKcmV0dXJuIHN9LApPQjpmdW5jdGlvbihhLGIpe3ZhciBz
-CnQuZEEuYShiKQpzPVAudVgoYSx0aGlzLmdaRSgpLmIsbnVsbCkKcmV0dXJuIHN9LApnWkU6ZnVuY3Rp
-b24oKXtyZXR1cm4gQy5uWH0sCmdIZTpmdW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5vai5wcm90b3R5
-cGU9e30KUC5NeC5wcm90b3R5cGU9e30KUC5TaC5wcm90b3R5cGU9ewpSVDpmdW5jdGlvbihhKXt2YXIg
-cyxyLHEscCxvLG4sbT1hLmxlbmd0aApmb3Iocz10aGlzLmMscj0wLHE9MDtxPG07KytxKXtwPUMueEIu
-VyhhLHEpCmlmKHA+OTIpe2lmKHA+PTU1Mjk2KXtvPXAmNjQ1MTIKaWYobz09PTU1Mjk2KXtuPXErMQpu
-PSEobjxtJiYoQy54Qi5XKGEsbikmNjQ1MTIpPT09NTYzMjApfWVsc2Ugbj0hMQppZighbilpZihvPT09
-NTYzMjApe289cS0xCm89IShvPj0wJiYoQy54Qi5PKGEsbykmNjQ1MTIpPT09NTUyOTYpfWVsc2Ugbz0h
-MQplbHNlIG89ITAKaWYobyl7aWYocT5yKXMuYSs9Qy54Qi5OaihhLHIscSkKcj1xKzEKbz1zLmErPUgu
-THcoOTIpCm8rPUguTHcoMTE3KQpzLmE9bwpvKz1ILkx3KDEwMCkKcy5hPW8Kbj1wPj4+OCYxNQpvKz1I
-Lkx3KG48MTA/NDgrbjo4NytuKQpzLmE9bwpuPXA+Pj40JjE1Cm8rPUguTHcobjwxMD80OCtuOjg3K24p
-CnMuYT1vCm49cCYxNQpzLmE9bytILkx3KG48MTA/NDgrbjo4NytuKX19Y29udGludWV9aWYocDwzMil7
-aWYocT5yKXMuYSs9Qy54Qi5OaihhLHIscSkKcj1xKzEKbz1zLmErPUguTHcoOTIpCnN3aXRjaChwKXtj
-YXNlIDg6cy5hPW8rSC5Mdyg5OCkKYnJlYWsKY2FzZSA5OnMuYT1vK0guTHcoMTE2KQpicmVhawpjYXNl
-IDEwOnMuYT1vK0guTHcoMTEwKQpicmVhawpjYXNlIDEyOnMuYT1vK0guTHcoMTAyKQpicmVhawpjYXNl
-IDEzOnMuYT1vK0guTHcoMTE0KQpicmVhawpkZWZhdWx0Om8rPUguTHcoMTE3KQpzLmE9bwpvKz1ILkx3
-KDQ4KQpzLmE9bwpvKz1ILkx3KDQ4KQpzLmE9bwpuPXA+Pj40JjE1Cm8rPUguTHcobjwxMD80OCtuOjg3
-K24pCnMuYT1vCm49cCYxNQpzLmE9bytILkx3KG48MTA/NDgrbjo4NytuKQpicmVha319ZWxzZSBpZihw
-PT09MzR8fHA9PT05Mil7aWYocT5yKXMuYSs9Qy54Qi5OaihhLHIscSkKcj1xKzEKbz1zLmErPUguTHco
-OTIpCnMuYT1vK0guTHcocCl9fWlmKHI9PT0wKXMuYSs9YQplbHNlIGlmKHI8bSlzLmErPUMueEIuTmoo
-YSxyLG0pfSwKSm46ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKZm9yKHM9dGhpcy5hLHI9cy5sZW5ndGgs
-cT0wO3E8cjsrK3Epe3A9c1txXQppZihhPT1udWxsP3A9PW51bGw6YT09PXApdGhyb3cgSC5iKG5ldyBQ
-Lks4KGEsbnVsbCkpfUMuTm0uaShzLGEpfSwKaVU6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz10aGlz
-CmlmKG8udE0oYSkpcmV0dXJuCm8uSm4oYSkKdHJ5e3M9by5iLiQxKGEpCmlmKCFvLnRNKHMpKXtxPVAu
-R3koYSxudWxsLG8uZ1ZLKCkpCnRocm93IEguYihxKX1xPW8uYQppZigwPj1xLmxlbmd0aClyZXR1cm4g
-SC5PSChxLC0xKQpxLnBvcCgpfWNhdGNoKHApe3I9SC5SdShwKQpxPVAuR3koYSxyLG8uZ1ZLKCkpCnRo
-cm93IEguYihxKX19LAp0TTpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcwppZih0eXBlb2YgYT09Im51
-bWJlciIpe2lmKCFpc0Zpbml0ZShhKSlyZXR1cm4hMQpxLmMuYSs9Qy5DRC53KGEpCnJldHVybiEwfWVs
-c2UgaWYoYT09PSEwKXtxLmMuYSs9InRydWUiCnJldHVybiEwfWVsc2UgaWYoYT09PSExKXtxLmMuYSs9
-ImZhbHNlIgpyZXR1cm4hMH1lbHNlIGlmKGE9PW51bGwpe3EuYy5hKz0ibnVsbCIKcmV0dXJuITB9ZWxz
-ZSBpZih0eXBlb2YgYT09InN0cmluZyIpe3M9cS5jCnMuYSs9JyInCnEuUlQoYSkKcy5hKz0nIicKcmV0
-dXJuITB9ZWxzZSBpZih0LmouYihhKSl7cS5KbihhKQpxLmxLKGEpCnM9cS5hCmlmKDA+PXMubGVuZ3Ro
-KXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcmV0dXJuITB9ZWxzZSBpZih0LmYuYihhKSl7cS5Kbihh
-KQpyPXEuancoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpy
-ZXR1cm4gcn1lbHNlIHJldHVybiExfSwKbEs6ZnVuY3Rpb24oYSl7dmFyIHMscixxPXRoaXMuYwpxLmEr
-PSJbIgpzPUouVTYoYSkKaWYocy5nb3IoYSkpe3RoaXMuaVUocy5xKGEsMCkpCmZvcihyPTE7cjxzLmdB
-KGEpOysrcil7cS5hKz0iLCIKdGhpcy5pVShzLnEoYSxyKSl9fXEuYSs9Il0ifSwKanc6ZnVuY3Rpb24o
-YSl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPXt9CmlmKGEuZ2wwKGEpKXttLmMuYSs9Int9IgpyZXR1
-cm4hMH1zPWEuZ0EoYSkqMgpyPVAuTzgocyxudWxsLCExLHQuWCkKcT1sLmE9MApsLmI9ITAKYS5LKDAs
-bmV3IFAudGkobCxyKSkKaWYoIWwuYilyZXR1cm4hMQpwPW0uYwpwLmErPSJ7Igpmb3Iobz0nIic7cTxz
-O3ErPTIsbz0nLCInKXtwLmErPW8KbS5SVChILm4ocltxXSkpCnAuYSs9JyI6JwpuPXErMQppZihuPj1z
-KXJldHVybiBILk9IKHIsbikKbS5pVShyW25dKX1wLmErPSJ9IgpyZXR1cm4hMH19ClAudGkucHJvdG90
-eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKHR5cGVvZiBhIT0ic3RyaW5nIil0aGlzLmEu
-Yj0hMQpzPXRoaXMuYgpyPXRoaXMuYQpDLk5tLlk1KHMsci5hKyssYSkKQy5ObS5ZNShzLHIuYSsrLGIp
-fSwKJFM6OX0KUC50dS5wcm90b3R5cGU9ewpnVks6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmMuYQpyZXR1
-cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c319ClAudTUucHJvdG90eXBlPXsKZ1pFOmZ1bmN0aW9uKCl7
-cmV0dXJuIEMuUWt9fQpQLkUzLnByb3RvdHlwZT17CldKOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPVAu
-akIoMCxudWxsLGEubGVuZ3RoKSxvPXAtMAppZihvPT09MClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCkK
-cz1vKjMKcj1uZXcgVWludDhBcnJheShzKQpxPW5ldyBQLlJ3KHIpCmlmKHEuR3goYSwwLHApIT09cCl7
-Qy54Qi5PKGEscC0xKQpxLlJPKCl9cmV0dXJuIG5ldyBVaW50OEFycmF5KHIuc3ViYXJyYXkoMCxILnJN
-KDAscS5iLHMpKSl9fQpQLlJ3LnByb3RvdHlwZT17ClJPOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMu
-YyxxPXMuYixwPXMuYj1xKzEsbz1yLmxlbmd0aAppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0y
-MzkKcT1zLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPTE5MQpzLmI9cSsxCmlmKHE+
-PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTE4OX0sCk82OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAs
-byxuPXRoaXMKaWYoKGImNjQ1MTIpPT09NTYzMjApe3M9NjU1MzYrKChhJjEwMjMpPDwxMCl8YiYxMDIz
-CnI9bi5jCnE9bi5iCnA9bi5iPXErMQpvPXIubGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpy
-W3FdPXM+Pj4xOHwyNDAKcT1uLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPXM+Pj4x
-MiY2M3wxMjgKcD1uLmI9cSsxCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPXM+Pj42JjYzfDEy
-OApuLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPXMmNjN8MTI4CnJldHVybiEwfWVs
-c2V7bi5STygpCnJldHVybiExfX0sCkd4OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbSxs
-PXRoaXMKaWYoYiE9PWMmJihDLnhCLk8oYSxjLTEpJjY0NTEyKT09PTU1Mjk2KS0tYwpmb3Iocz1sLmMs
-cj1zLmxlbmd0aCxxPWI7cTxjOysrcSl7cD1DLnhCLlcoYSxxKQppZihwPD0xMjcpe289bC5iCmlmKG8+
-PXIpYnJlYWsKbC5iPW8rMQpzW29dPXB9ZWxzZXtvPXAmNjQ1MTIKaWYobz09PTU1Mjk2KXtpZihsLmIr
-ND5yKWJyZWFrCm49cSsxCmlmKGwuTzYocCxDLnhCLlcoYSxuKSkpcT1ufWVsc2UgaWYobz09PTU2MzIw
-KXtpZihsLmIrMz5yKWJyZWFrCmwuUk8oKX1lbHNlIGlmKHA8PTIwNDcpe289bC5iCm09bysxCmlmKG0+
-PXIpYnJlYWsKbC5iPW0KaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjZ8MTkyCmwuYj1t
-KzEKc1ttXT1wJjYzfDEyOH1lbHNle289bC5iCmlmKG8rMj49cilicmVhawptPWwuYj1vKzEKaWYobz49
-cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjEyfDIyNApvPWwuYj1tKzEKaWYobT49cilyZXR1cm4g
-SC5PSChzLG0pCnNbbV09cD4+PjYmNjN8MTI4CmwuYj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8p
-CnNbb109cCY2M3wxMjh9fX1yZXR1cm4gcX19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7
-dmFyIHMscgp0LkwuYShhKQpzPXRoaXMuYQpyPVAua3kocyxhLDAsbnVsbCkKaWYociE9bnVsbClyZXR1
-cm4gcgpyZXR1cm4gbmV3IFAuYnoocykuTmUoYSwwLG51bGwsITApfX0KUC5iei5wcm90b3R5cGU9ewpO
-ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG49dGhpcwp0LkwuYShhKQpzPVAuakIoYixj
-LEouSG0oYSkpCmlmKGI9PT1zKXJldHVybiIiCnI9UC5qeShhLGIscykKcT1uLmhPKHIsMCxzLWIsITAp
-CnA9bi5iCmlmKChwJjEpIT09MCl7bz1QLmo0KHApCm4uYj0wCnRocm93IEguYihQLnJyKG8sYSxiK24u
-YykpfXJldHVybiBxfSwKaE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxPXRoaXMKaWYoYy1iPjEw
-MDApe3M9Qy5qbi5CVShiK2MsMikKcj1xLmhPKGEsYixzLCExKQppZigocS5iJjEpIT09MClyZXR1cm4g
-cgpyZXR1cm4gcitxLmhPKGEscyxjLGQpfXJldHVybiBxLkVoKGEsYixjLGQpfSwKRWg6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMsaj02NTUzMyxpPWsuYixoPWsuYyxnPW5l
-dyBQLk0oIiIpLGY9YisxLGU9YS5sZW5ndGgKaWYoYjwwfHxiPj1lKXJldHVybiBILk9IKGEsYikKcz1h
-W2JdCiRsYWJlbDAkMDpmb3Iocj1rLmE7ITA7KXtmb3IoOyEwO2Y9byl7cT1DLnhCLlcoIkFBQUFBQUFB
+KGEsYil7dmFyIHMscixxPXRoaXMKUC5rMShiLCJjb3VudCIpCnM9cS5iK2IKcj1xLmMKaWYociE9bnVs
+bCYmcz49cilyZXR1cm4gbmV3IEguTUIocS4kdGkuQygiTUI8MT4iKSkKcmV0dXJuIEgucUMocS5hLHMs
+cixxLiR0aS5jKX0sCnR0KGEsYil7dmFyIHMscixxLHA9dGhpcyxvPXAuYixuPXAuYSxtPUouVTYobiks
+bD1tLmdBKG4pLGs9cC5jCmlmKGshPW51bGwmJms8bClsPWsKcz1sLW8KaWYoczw9MCl7bj1KLlFpKDAs
+cC4kdGkuYykKcmV0dXJuIG59cj1QLk84KHMsbS5FKG4sbyksITEscC4kdGkuYykKZm9yKHE9MTtxPHM7
+KytxKXtDLk5tLlk1KHIscSxtLkUobixvK3EpKQppZihtLmdBKG4pPGwpdGhyb3cgSC5iKFAuYTQocCkp
+fXJldHVybiByfX0KSC5hNy5wcm90b3R5cGU9ewpnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5k
+KX0sCkYoKXt2YXIgcyxyPXRoaXMscT1yLmEscD1KLlU2KHEpLG89cC5nQShxKQppZihyLmIhPT1vKXRo
+cm93IEguYihQLmE0KHEpKQpzPXIuYwppZihzPj1vKXtyLnNJKG51bGwpCnJldHVybiExfXIuc0kocC5F
+KHEscykpOysrci5jCnJldHVybiEwfSwKc0koYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0s
+CiRpQW46MX0KSC5pMS5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcg
+SC5NSChKLklUKHRoaXMuYSksdGhpcy5iLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygiTUg8MSwyPiIp
+KX0sCmdBKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApnbDAoYSl7cmV0dXJuIEoudVUodGhpcy5hKX0s
+CkUoYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkgueHkucHJvdG90eXBlPXsk
+aWJROjF9CkguTUgucHJvdG90eXBlPXsKRigpe3ZhciBzPXRoaXMscj1zLmIKaWYoci5GKCkpe3Muc0ko
+cy5jLiQxKHIuZ2woKSkpCnJldHVybiEwfXMuc0kobnVsbCkKcmV0dXJuITF9LApnbCgpe3JldHVybiB0
+aGlzLiR0aS5RWzFdLmEodGhpcy5hKX0sCnNJKGEpe3RoaXMuYT10aGlzLiR0aS5DKCIyPyIpLmEoYSl9
+fQpILmxKLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApFKGEsYil7cmV0dXJu
+IHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBu
+ZXcgSC5TTyhKLklUKHRoaXMuYSksdGhpcy5iLHRoaXMuJHRpLkMoIlNPPDE+IikpfX0KSC5TTy5wcm90
+b3R5cGU9ewpGKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj10aGlzLmI7cy5GKCk7KWlmKEgub1Qoci4k
+MShzLmdsKCkpKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5B
+TS5wcm90b3R5cGU9ewplUihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguQU0odGhpcy5h
+LHRoaXMuYitiLEguTGgodGhpcykuQygiQU08MT4iKSl9LApnbShhKXtyZXR1cm4gbmV3IEguVTEoSi5J
+VCh0aGlzLmEpLHRoaXMuYixILkxoKHRoaXMpLkMoIlUxPDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpn
+QShhKXt2YXIgcz1KLkhtKHRoaXMuYSktdGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9LApl
+UihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguZDUodGhpcy5hLHRoaXMuYitiLHRoaXMu
+JHRpKX0sCiRpYlE6MX0KSC5VMS5wcm90b3R5cGU9ewpGKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj0w
+O3I8dGhpcy5iOysrcilzLkYoKQp0aGlzLmI9MApyZXR1cm4gcy5GKCl9LApnbCgpe3JldHVybiB0aGlz
+LmEuZ2woKX19CkguTUIucHJvdG90eXBlPXsKZ20oYSl7cmV0dXJuIEMuR3d9LApnbDAoYSl7cmV0dXJu
+ITB9LApnQShhKXtyZXR1cm4gMH0sCkUoYSxiKXt0aHJvdyBILmIoUC5URShiLDAsMCwiaW5kZXgiLG51
+bGwpKX0sCmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiB0aGlzfX0KSC5GdS5wcm90b3R5cGU9
+ewpGKCl7cmV0dXJuITF9LApnbCgpe3Rocm93IEguYihILldwKCkpfSwKJGlBbjoxfQpILnU2LnByb3Rv
+dHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5KQihKLklUKHRoaXMuYSksdGhpcy4kdGkuQygiSkI8MT4i
+KSl9fQpILkpCLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMuJHRpLmM7
+cy5GKCk7KWlmKHIuYihzLmdsKCkpKXJldHVybiEwCnJldHVybiExfSwKZ2woKXtyZXR1cm4gdGhpcy4k
+dGkuYy5hKHRoaXMuYS5nbCgpKX0sCiRpQW46MX0KSC5TVS5wcm90b3R5cGU9e30KSC5SZS5wcm90b3R5
+cGU9ewpZNShhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIikuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fu
+bm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19CkgudzIucHJvdG90eXBlPXt9Ckgud3Yu
+cHJvdG90eXBlPXsKZ2lPKGEpe3ZhciBzPXRoaXMuX2hhc2hDb2RlCmlmKHMhPW51bGwpcmV0dXJuIHMK
+cz02NjQ1OTcqSi5oZih0aGlzLmEpJjUzNjg3MDkxMQp0aGlzLl9oYXNoQ29kZT1zCnJldHVybiBzfSwK
+dyhhKXtyZXR1cm4nU3ltYm9sKCInK0guRWoodGhpcy5hKSsnIiknfSwKRE4oYSxiKXtpZihiPT1udWxs
+KXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgSC53diYmdGhpcy5hPT1iLmF9LAokaUdEOjF9Ckgu
+UUMucHJvdG90eXBlPXt9CkguUEQucHJvdG90eXBlPXt9CkguV1UucHJvdG90eXBlPXsKZ2wwKGEpe3Jl
+dHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCncoYSl7cmV0dXJuIFAubk8odGhpcyl9LApZNShhLGIsYyl7
+dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCl9LApnUHUoYSl7cmV0dXJu
+IHRoaXMucTQoMCxILkxoKHRoaXMpLkMoIk4zPDEsMj4iKSl9LApxNChhLGIpe3ZhciBzPXRoaXMKcmV0
+dXJuIFAubDAoZnVuY3Rpb24oKXt2YXIgcj1hCnZhciBxPTAscD0xLG8sbixtLGwsawpyZXR1cm4gZnVu
+Y3Rpb24gJGFzeW5jJGdQdShjLGQpe2lmKGM9PT0xKXtvPWQKcT1wfXdoaWxlKHRydWUpc3dpdGNoKHEp
+e2Nhc2UgMDpuPXMuZ3ZjKCksbj1uLmdtKG4pLG09SC5MaChzKSxsPW0uUVsxXSxtPW0uQygiQDwxPiIp
+LktxKGwpLkMoIk4zPDEsMj4iKQpjYXNlIDI6aWYoIW4uRigpKXtxPTMKYnJlYWt9az1uLmdsKCkKcT00
+CnJldHVybiBuZXcgUC5OMyhrLGwuYShzLnEoMCxrKSksbSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6
+cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0obyl9fX0sYil9LAokaVowOjF9CkguTFAucHJv
+dG90eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYX0sCng0KGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIily
+ZXR1cm4hMQppZigiX19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9w
+ZXJ0eShhKX0sCnEoYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5iW0gu
+bihiKV19LApLKGEsYil7dmFyIHMscixxLHAsbyxuPXRoaXMuJHRpCm4uQygifigxLDIpIikuYShiKQpz
+PXRoaXMuYwpmb3Iocj1zLmxlbmd0aCxxPXRoaXMuYixuPW4uUVsxXSxwPTA7cDxyOysrcCl7bz1ILm4o
+c1twXSkKYi4kMihvLG4uYShxW29dKSl9fSwKZ3ZjKCl7cmV0dXJuIG5ldyBILlhSKHRoaXMsdGhpcy4k
+dGkuQygiWFI8MT4iKSl9fQpILlhSLnByb3RvdHlwZT17CmdtKGEpe3ZhciBzPXRoaXMuYS5jCnJldHVy
+biBuZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9LApnQShhKXtyZXR1cm4gdGhp
+cy5hLmMubGVuZ3RofX0KSC5MSS5wcm90b3R5cGU9ewpnV2EoKXt2YXIgcz10aGlzLmEKcmV0dXJuIHN9
+LApnbmQoKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby5jPT09MSlyZXR1cm4gQy5oVQpzPW8uZApyPXMu
+bGVuZ3RoLW8uZS5sZW5ndGgtby5mCmlmKHI9PT0wKXJldHVybiBDLmhVCnE9W10KZm9yKHA9MDtwPHI7
+KytwKXtpZihwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHApCnEucHVzaChzW3BdKX1yZXR1cm4gSi56
+QyhxKX0sCmdWbSgpe3ZhciBzLHIscSxwLG8sbixtLGwsaz10aGlzCmlmKGsuYyE9PTApcmV0dXJuIEMu
+V08Kcz1rLmUKcj1zLmxlbmd0aApxPWsuZApwPXEubGVuZ3RoLXItay5mCmlmKHI9PT0wKXJldHVybiBD
+LldPCm89bmV3IEguTjUodC5lbykKZm9yKG49MDtuPHI7KytuKXtpZihuPj1zLmxlbmd0aClyZXR1cm4g
+SC5PSChzLG4pCm09c1tuXQpsPXArbgppZihsPDB8fGw+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsbCkK
+by5ZNSgwLG5ldyBILnd2KG0pLHFbbF0pfXJldHVybiBuZXcgSC5QRChvLHQuZ0YpfSwKJGl2UToxfQpI
+LkNqLnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMKSC5uKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK2EK
+Qy5ObS5pKHRoaXMuYixhKQpDLk5tLmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTF9CkguZjkucHJvdG90
+eXBlPXsKcVMoYSl7dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSkuZXhlYyhhKQppZihwPT1u
+dWxsKXJldHVybiBudWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgppZihyIT09LTEpcy5hcmd1
+bWVudHM9cFtyKzFdCnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9cFtyKzFdCnI9cS5kCmlm
+KHIhPT0tMSlzLmV4cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhvZD1wW3IrMV0Kcj1xLmYK
+aWYociE9PS0xKXMucmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5wcm90b3R5cGU9ewp3KGEp
+e3ZhciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIit0aGlzLmEK
+cmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitzKyInIG9uIG51bGwi
+fX0KSC5hei5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1Y2hNZXRob2RFcnJvcjog
+bWV0aG9kIG5vdCBmb3VuZDogJyIscD1yLmIKaWYocD09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJy
+b3I6ICIrci5hCnM9ci5jCmlmKHM9PW51bGwpcmV0dXJuIHErcCsiJyAoIityLmErIikiCnJldHVybiBx
+K3ArIicgb24gJyIrcysiJyAoIityLmErIikifX0KSC52Vi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPXRo
+aXMuYQpyZXR1cm4gcy5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnByb3RvdHlw
+ZT17CncoYSl7cmV0dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1udWxsPyJudWxsIjoidW5k
+ZWZpbmVkIikrIicgZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEucHJvdG90eXBlPXt9Ckgu
+WE8ucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyPXRoaXMuYgppZihyIT1udWxsKXJldHVybiByCnI9dGhp
+cy5hCnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/ci5zdGFjazpudWxsCnJldHVybiB0aGlz
+LmI9cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5j
+b25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpzLm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUShyPT1u
+dWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVIOjEsCmdLdSgpe3JldHVybiB0aGlzfSwKJEM6IiQxIiwK
+JFI6MSwKJEQ6bnVsbH0KSC5BeS5wcm90b3R5cGU9eyRDOiIkMCIsJFI6MH0KSC5FMS5wcm90b3R5cGU9
+eyRDOiIkMiIsJFI6Mn0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5cGU9ewp3KGEpe3ZhciBz
+PXRoaXMuJHN0YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0dXJuIkNsb3N1cmUgb2YgdW5rbm93biBzdGF0
+aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHMpKyInIn19CkguclQucHJvdG90eXBlPXsK
+RE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJldHVybiEwCmlmKCEoYiBpbnN0
+YW5jZW9mIEguclQpKXJldHVybiExCnJldHVybiB0aGlzLiRfdGFyZ2V0PT09Yi4kX3RhcmdldCYmdGhp
+cy5hPT09Yi5hfSwKZ2lPKGEpe3JldHVybihILkNVKHRoaXMuYSleSC5lUSh0aGlzLiRfdGFyZ2V0KSk+
+Pj4wfSwKdyhhKXtyZXR1cm4iQ2xvc3VyZSAnIit0aGlzLiRfbmFtZSsiJyBvZiAiKygiSW5zdGFuY2Ug
+b2YgJyIrSC5saCh0LksuYSh0aGlzLmEpKSsiJyIpfX0KSC5FcS5wcm90b3R5cGU9ewp3KGEpe3JldHVy
+biJSdW50aW1lRXJyb3I6ICIrdGhpcy5hfX0KSC5rWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJBc3Nl
+cnRpb24gZmFpbGVkOiAiK1AuaGwodGhpcy5hKX19Ckgua3IucHJvdG90eXBlPXt9CkguTjUucHJvdG90
+eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYX0sCmdsMChhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcihh
+KXtyZXR1cm4hdGhpcy5nbDAodGhpcyl9LApndmMoKXtyZXR1cm4gbmV3IEguaTUodGhpcyxILkxoKHRo
+aXMpLkMoImk1PDE+IikpfSwKeDQoYSl7dmFyIHM9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0
+dXJuIHRoaXMuWHUocyxhKX0sCnEoYSxiKXt2YXIgcyxyLHEscCxvPXRoaXMsbj1udWxsCmlmKHR5cGVv
+ZiBiPT0ic3RyaW5nIil7cz1vLmIKaWYocz09bnVsbClyZXR1cm4gbgpyPW8uajIocyxiKQpxPXI9PW51
+bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZmZik9
+PT1iKXtwPW8uYwppZihwPT1udWxsKXJldHVybiBuCnI9by5qMihwLGIpCnE9cj09bnVsbD9uOnIuYgpy
+ZXR1cm4gcX1lbHNlIHJldHVybiBvLmFhKGIpfSwKYWEoYSl7dmFyIHMscixxPXRoaXMscD1xLmQKaWYo
+cD09bnVsbClyZXR1cm4gbnVsbApzPXEuQnQocCxxLnhpKGEpKQpyPXEuRmgocyxhKQppZihyPDApcmV0
+dXJuIG51bGwKcmV0dXJuIHNbcl0uYn0sClk1KGEsYixjKXt2YXIgcyxyLHE9dGhpcyxwPUguTGgocSkK
+cC5jLmEoYikKcC5RWzFdLmEoYykKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPXEuYgpxLkVIKHM9PW51
+bGw/cS5iPXEueksoKTpzLGIsYyl9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZm
+Zik9PT1iKXtyPXEuYwpxLkVIKHI9PW51bGw/cS5jPXEueksoKTpyLGIsYyl9ZWxzZSBxLnh3KGIsYyl9
+LAp4dyhhLGIpe3ZhciBzLHIscSxwLG89dGhpcyxuPUguTGgobykKbi5jLmEoYSkKbi5RWzFdLmEoYikK
+cz1vLmQKaWYocz09bnVsbClzPW8uZD1vLnpLKCkKcj1vLnhpKGEpCnE9by5CdChzLHIpCmlmKHE9PW51
+bGwpby5FSShzLHIsW28uSG4oYSxiKV0pCmVsc2V7cD1vLkZoKHEsYSkKaWYocD49MClxW3BdLmI9Ygpl
+bHNlIHEucHVzaChvLkhuKGEsYikpfX0sCksoYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLkMoIn4o
+MSwyKSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxsOyl7Yi4kMihzLmEscy5iKQppZihyIT09
+cS5yKXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSChhLGIsYyl7dmFyIHMscj10aGlzLHE9SC5M
+aChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpzPXIuajIoYSxiKQppZihzPT1udWxsKXIuRUkoYSxiLHIu
+SG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG4oYSxi
+KXt2YXIgcz10aGlzLHI9SC5MaChzKSxxPW5ldyBILnZoKHIuYy5hKGEpLHIuUVsxXS5hKGIpKQppZihz
+LmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7cj1zLmYKci50b1N0cmluZwpxLmQ9cgpzLmY9ci5jPXF9Kytz
+LmEKcy5rcygpCnJldHVybiBxfSwKeGkoYSl7cmV0dXJuIEouaGYoYSkmMHgzZmZmZmZmfSwKRmgoYSxi
+KXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYo
+Si5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9LAp3KGEpe3JldHVybiBQLm5PKHRoaXMpfSwK
+ajIoYSxiKXtyZXR1cm4gYVtiXX0sCkJ0KGEsYil7cmV0dXJuIGFbYl19LApFSShhLGIsYyl7YVtiXT1j
+fSwKcm4oYSxiKXtkZWxldGUgYVtiXX0sClh1KGEsYil7cmV0dXJuIHRoaXMuajIoYSxiKSE9bnVsbH0s
+CnpLKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1rZXk+IixyPU9iamVjdC5jcmVhdGUobnVsbCkKdGhp
+cy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVybiByfSwKJGlGbzoxfQpILnZoLnByb3RvdHlwZT17
+fQpILmk1LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEuYX0sCmdsMChhKXtyZXR1cm4gdGhp
+cy5hLmE9PT0wfSwKZ20oYSl7dmFyIHM9dGhpcy5hLHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygi
+TjY8MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRnKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19Ckgu
+TjYucHJvdG90eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy5kfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYQpp
+ZihyLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM9PW51bGwpe3Iuc3FZKG51bGwp
+CnJldHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJldHVybiEwfX0sCnNxWShhKXt0aGlzLmQ9
+dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
+biB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyKGEsYil7cmV0dXJuIHRoaXMuYShh
+LGIpfSwKJFM6NTB9CkguVlgucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYShILm4oYSkpfSwK
+JFM6MjF9CkguVlIucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlz
+LmIuZmxhZ3N9LApnSGMoKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51bGwpcmV0dXJuIHIKcj1zLmIK
+cmV0dXJuIHMuYz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVDYXNlLHIudW5pY29kZSxyLmRv
+dEFsbCwhMCl9LApkZChhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWihhLGIpe3ZhciBz
+LHI9dC5LLmEodGhpcy5nSGMoKSkKci5sYXN0SW5kZXg9YgpzPXIuZXhlYyhhKQppZihzPT1udWxsKXJl
+dHVybiBudWxsCnJldHVybiBuZXcgSC5FSyhzKX0sCiRpdlg6MSwKJGl3TDoxfQpILkVLLnByb3RvdHlw
+ZT17CnEoYSxiKXt2YXIgcwpILklaKGIpCnM9dGhpcy5iCmlmKGI+PXMubGVuZ3RoKXJldHVybiBILk9I
+KHMsYikKcmV0dXJuIHNbYl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9ewpnbShhKXty
+ZXR1cm4gbmV3IEguUGIodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5QYi5wcm90b3R5cGU9ewpnbCgp
+e3JldHVybiB0LmN6LmEodGhpcy5kKX0sCkYoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlm
+KGw9PW51bGwpcmV0dXJuITEKcz1tLmMKcj1sLmxlbmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxz
+KQppZihwIT1udWxsKXttLmQ9cApzPXAuYgpvPXMuaW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1u
+KXtpZihxLmIudW5pY29kZSl7cz1tLmMKcT1zKzEKaWYocTxyKXtzPUMueEIuTyhsLHMpCmlmKHM+PTU1
+Mjk2JiZzPD01NjMxOSl7cz1DLnhCLk8obCxxKQpzPXM+PTU2MzIwJiZzPD01NzM0M31lbHNlIHM9ITF9
+ZWxzZSBzPSExfWVsc2Ugcz0hMQpuPShzP24rMTpuKSsxfW0uYz1uCnJldHVybiEwfX1tLmI9bS5kPW51
+bGwKcmV0dXJuITF9LAokaUFuOjF9CkgudFEucHJvdG90eXBlPXsKcShhLGIpe0guSVooYikKaWYoYiE9
+PTApSC52KFAuTzcoYixudWxsKSkKcmV0dXJuIHRoaXMuY30sCiRpT2Q6MX0KSC51bi5wcm90b3R5cGU9
+ewpnbShhKXtyZXR1cm4gbmV3IEguU2QodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5TZC5wcm90b3R5
+cGU9ewpGKCl7dmFyIHMscixxPXRoaXMscD1xLmMsbz1xLmIsbj1vLmxlbmd0aCxtPXEuYSxsPW0ubGVu
+Z3RoCmlmKHArbj5sKXtxLmQ9bnVsbApyZXR1cm4hMX1zPW0uaW5kZXhPZihvLHApCmlmKHM8MCl7cS5j
+PWwrMQpxLmQ9bnVsbApyZXR1cm4hMX1yPXMrbgpxLmQ9bmV3IEgudFEocyxvKQpxLmM9cj09PXEuYz9y
+KzE6cgpyZXR1cm4hMH0sCmdsKCl7dmFyIHM9dGhpcy5kCnMudG9TdHJpbmcKcmV0dXJuIHN9LAokaUFu
+OjF9CkguRVQucHJvdG90eXBlPXskaUVUOjEsJGlBUzoxfQpILkxaLnByb3RvdHlwZT17CmdBKGEpe3Jl
+dHVybiBhLmxlbmd0aH0sCiRpWGo6MX0KSC5EZy5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9k
+KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LApZNShhLGIsYyl7SC5yVihjKQpILm9kKGIsYSxhLmxl
+bmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSC5QZy5wcm90b3R5cGU9ewpZNShh
+LGIsYyl7SC5JWihjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRp
+ek06MX0KSC54ai5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0
+dXJuIGFbYl19fQpILmRFLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3Ro
+KQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5s
+ZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kVC5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9kKGIs
+YSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgu
+b2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJu
+IGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0K
+SC5WNi5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9LApxKGEsYil7SC5JWihiKQpILm9k
+KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAu
+cHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90
+eXBlPXsKQyhhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3EoYSl7cmV0dXJu
+IEgudjUodi50eXBlVW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5cGU9e30KSC5rUy5wcm90b3R5
+cGU9ewp3KGEpe3JldHVybiB0aGlzLmF9fQpILmlNLnByb3RvdHlwZT17JGlFejoxfQpQLnRoLnByb3Rv
+dHlwZT17CiQxKGEpe3ZhciBzPXRoaXMuYSxyPXMuYQpzLmE9bnVsbApyLiQwKCl9LAokUzoxM30KUC5o
+YS5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyCnRoaXMuYS5hPXQuTS5hKGEpCnM9dGhpcy5iCnI9dGhp
+cy5jCnMuZmlyc3RDaGlsZD9zLnJlbW92ZUNoaWxkKHIpOnMuYXBwZW5kQ2hpbGQocil9LAokUzo0MX0K
+UC5Wcy5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS4kMCgpfSwKJFM6MTV9ClAuRnQucHJvdG90eXBlPXsK
+JDAoKXt0aGlzLmEuJDAoKX0sCiRTOjE1fQpQLlczLnByb3RvdHlwZT17CkNZKGEsYil7aWYoc2VsZi5z
+ZXRUaW1lb3V0IT1udWxsKXNlbGYuc2V0VGltZW91dChILnRSKG5ldyBQLnlIKHRoaXMsYiksMCksYSkK
+ZWxzZSB0aHJvdyBILmIoUC5MNCgiYHNldFRpbWVvdXQoKWAgbm90IGZvdW5kLiIpKX19ClAueUgucHJv
+dG90eXBlPXsKJDAoKXt0aGlzLmIuJDAoKX0sCiRTOjB9ClAuaWgucHJvdG90eXBlPXsKYU0oYSxiKXt2
+YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEvPyIpLmEoYikKaWYoYj09bnVsbCliPXEuYy5hKGIpCmlm
+KCFyLmIpci5hLlhmKGIpCmVsc2V7cz1yLmEKaWYocS5DKCJiODwxPiIpLmIoYikpcy5jVShiKQplbHNl
+IHMuWDIocS5jLmEoYikpfX0sCncwKGEsYil7dmFyIHM9dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikK
+ZWxzZSBzLk5rKGEsYil9fQpQLldNLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLmEuJDIoMCxh
+KX0sCiRTOjUxfQpQLlNYLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLiQyKDEsbmV3IEguYnEoYSx0
+LmwuYShiKSkpfSwKJFM6NTN9ClAuR3MucHJvdG90eXBlPXsKJDIoYSxiKXt0aGlzLmEoSC5JWihhKSxi
+KX0sCiRTOjQ1fQpQLkZ5LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIkl0ZXJhdGlvbk1hcmtlcigiK3Ro
+aXMuYisiLCAiK0guRWoodGhpcy5hKSsiKSJ9fQpQLkdWLnByb3RvdHlwZT17CmdsKCl7dmFyIHM9dGhp
+cy5jCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApG
+KCl7dmFyIHMscixxLHAsbyxuLG09dGhpcwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1tLmMK
+aWYociE9bnVsbClpZihyLkYoKSlyZXR1cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24oYSxi
+LGMpe3ZhciBsLGs9Ygp3aGlsZSh0cnVlKXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agprPWN9
+fShtLmEsMCwxKQppZihxIGluc3RhbmNlb2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlmKG89
+PW51bGx8fG8ubGVuZ3RoPT09MCl7bS5zRUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgpcmV0
+dXJuIEguT0gobywtMSkKbS5hPW8ucG9wKCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0aHJv
+dyByCmVsc2V7bj1zLmEoSi5JVChyKSkKaWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9PW51
+bGwpcj1tLmQ9W10KQy5ObS5pKHIsbS5hKQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikKY29u
+dGludWV9fX19ZWxzZXttLnNFQyhxKQpyZXR1cm4hMH19cmV0dXJuITF9LApzRUMoYSl7dGhpcy5iPXRo
+aXMuJHRpLkMoIjE/IikuYShhKX0sCnNYOShhKXt0aGlzLmM9dGhpcy4kdGkuQygiQW48MT4/IikuYShh
+KX0sCiRpQW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbShhKXtyZXR1cm4gbmV3IFAuR1YodGhpcy5hKCks
+dGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLkN3LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIEguRWoodGhp
+cy5hKX0sCiRpWFM6MSwKZ0lJKCl7cmV0dXJuIHRoaXMuYn19ClAuUGYucHJvdG90eXBlPXsKdzAoYSxi
+KXt2YXIgcwpILmNiKGEsImVycm9yIix0LkspCnM9dGhpcy5hCmlmKChzLmEmMzApIT09MCl0aHJvdyBI
+LmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCmlmKGI9PW51bGwpYj1QLnYwKGEpCnMu
+TmsoYSxiKX0sCnBtKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnByb3RvdHlwZT17CmFN
+KGEsYil7dmFyIHMscj10aGlzLiR0aQpyLkMoIjEvPyIpLmEoYikKcz10aGlzLmEKaWYoKHMuYSYzMCkh
+PT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKcy5YZihyLkMoIjEv
+IikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17CkhSKGEpe2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4h
+MApyZXR1cm4gdGhpcy5iLmIuYnYodC5hbC5hKHRoaXMuZCksYS5hLHQueSx0LkspfSwKS3coYSl7dmFy
+IHMscj10aGlzLHE9ci5lLHA9bnVsbCxvPXQueixuPXQuSyxtPWEuYSxsPXIuYi5iCmlmKHQuYS5iKHEp
+KXA9bC5ycChxLG0sYS5iLG8sbix0LmwpCmVsc2UgcD1sLmJ2KHQudi5hKHEpLG0sbyxuKQp0cnl7bz1y
+LiR0aS5DKCIyLyIpLmEocCkKcmV0dXJuIG99Y2F0Y2gocyl7aWYodC5lSy5iKEguUnUocykpKXtpZigo
+ci5jJjEpIT09MCl0aHJvdyBILmIoUC54WSgiVGhlIGVycm9yIGhhbmRsZXIgb2YgRnV0dXJlLnRoZW4g
+bXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgZnV0dXJlJ3MgdHlwZSIsIm9uRXJyb3Ii
+KSkKdGhyb3cgSC5iKFAueFkoIlRoZSBlcnJvciBoYW5kbGVyIG9mIEZ1dHVyZS5jYXRjaEVycm9yIG11
+c3QgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGZ1dHVyZSdzIHR5cGUiLCJvbkVycm9yIikpfWVsc2UgdGhy
+b3cgc319fQpQLnZzLnByb3RvdHlwZT17ClNxKGEsYixjKXt2YXIgcyxyLHEscD10aGlzLiR0aQpwLktx
+KGMpLkMoIjEvKDIpIikuYShhKQpzPSQuWDMKaWYocz09PUMuTlUpe2lmKGIhPW51bGwmJiF0LmEuYihi
+KSYmIXQudi5iKGIpKXRocm93IEguYihQLkwzKGIsIm9uRXJyb3IiLHUuYykpfWVsc2V7Yy5DKCJAPDAv
+PiIpLktxKHAuYykuQygiMSgyKSIpLmEoYSkKaWYoYiE9bnVsbCliPVAuVkgoYixzKX1yPW5ldyBQLnZz
+KHMsYy5DKCJ2czwwPiIpKQpxPWI9PW51bGw/MTozCnRoaXMueGYobmV3IFAuRmUocixxLGEsYixwLkMo
+IkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sClc3KGEsYil7cmV0dXJuIHRoaXMu
+U3EoYSxudWxsLGIpfSwKUWQoYSxiLGMpe3ZhciBzLHI9dGhpcy4kdGkKci5LcShjKS5DKCIxLygyKSIp
+LmEoYSkKcz1uZXcgUC52cygkLlgzLGMuQygidnM8MD4iKSkKdGhpcy54ZihuZXcgUC5GZShzLDE5LGEs
+YixyLkMoIkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gc30sClA5KGEpe3RoaXMuYT10
+aGlzLmEmMXwxNgp0aGlzLmM9YX0sCnVnKGEpe3RoaXMuYT1hLmEmMzB8dGhpcy5hJjEKdGhpcy5jPWEu
+Y30sCnhmKGEpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihxPD0zKXthLmE9dC5lLmEoci5jKQpyLmM9YX1l
+bHNle2lmKChxJjQpIT09MCl7cz10LmMuYShyLmMpCmlmKChzLmEmMjQpPT09MCl7cy54ZihhKQpyZXR1
+cm59ci51ZyhzKX1QLlRrKG51bGwsbnVsbCxyLmIsdC5NLmEobmV3IFAuZGEocixhKSkpfX0sCmpRKGEp
+e3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD17fQpsLmE9YQppZihhPT1udWxsKXJldHVybgpzPW0uYQpp
+ZihzPD0zKXtyPXQuZS5hKG0uYykKbS5jPWEKaWYociE9bnVsbCl7cT1hLmEKZm9yKHA9YTtxIT1udWxs
+O3A9cSxxPW8pbz1xLmEKcC5hPXJ9fWVsc2V7aWYoKHMmNCkhPT0wKXtuPXQuYy5hKG0uYykKaWYoKG4u
+YSYyNCk9PT0wKXtuLmpRKGEpCnJldHVybn1tLnVnKG4pfWwuYT1tLk44KGEpClAuVGsobnVsbCxudWxs
+LG0uYix0Lk0uYShuZXcgUC5vUShsLG0pKSl9fSwKYWgoKXt2YXIgcz10LmUuYSh0aGlzLmMpCnRoaXMu
+Yz1udWxsCnJldHVybiB0aGlzLk44KHMpfSwKTjgoYSl7dmFyIHMscixxCmZvcihzPWEscj1udWxsO3Mh
+PW51bGw7cj1zLHM9cSl7cT1zLmEKcy5hPXJ9cmV0dXJuIHJ9LAplYyhhKXt2YXIgcyxyLHEscD10aGlz
+CnAuYV49Mgp0cnl7YS5TcShuZXcgUC5wVihwKSxuZXcgUC5VNyhwKSx0LlApfWNhdGNoKHEpe3M9SC5S
+dShxKQpyPUgudHMocSkKUC5yYihuZXcgUC52cihwLHMscikpfX0sClgyKGEpe3ZhciBzLHI9dGhpcwpy
+LiR0aS5jLmEoYSkKcz1yLmFoKCkKci5hPTgKci5jPWEKUC5IWihyLHMpfSwKWkwoYSxiKXt2YXIgcwp0
+LmwuYShiKQpzPXRoaXMuYWgoKQp0aGlzLlA5KFAuVGwoYSxiKSkKUC5IWih0aGlzLHMpfSwKWGYoYSl7
+dmFyIHM9dGhpcy4kdGkKcy5DKCIxLyIpLmEoYSkKaWYocy5DKCJiODwxPiIpLmIoYSkpe3RoaXMuY1Uo
+YSkKcmV0dXJufXRoaXMud1Uocy5jLmEoYSkpfSwKd1UoYSl7dmFyIHM9dGhpcwpzLiR0aS5jLmEoYSkK
+cy5hXj0yClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5ydChzLGEpKSl9LApjVShhKXt2YXIg
+cz10aGlzLHI9cy4kdGkKci5DKCJiODwxPiIpLmEoYSkKaWYoci5iKGEpKXtpZigoYS5hJjE2KSE9PTAp
+e3MuYV49MgpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEobmV3IFAuS0YocyxhKSkpfWVsc2UgUC5BOShh
+LHMpCnJldHVybn1zLmVjKGEpfSwKTmsoYSxiKXt0aGlzLmFePTIKUC5UayhudWxsLG51bGwsdGhpcy5i
+LHQuTS5hKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwKCl7
+UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDAoKXtQLkhaKHRoaXMu
+Yix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwPXRoaXMu
+YQpwLmFePTIKdHJ5e3AuWDIocC4kdGkuYy5hKGEpKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEp
+CnAuWkwocyxyKX19LAokUzoxM30KUC5VNy5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5aTCh0Lksu
+YShhKSx0LmwuYShiKSl9LAokUzozNH0KUC52ci5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS5aTCh0aGlz
+LmIsdGhpcy5jKX0sCiRTOjB9ClAucnQucHJvdG90eXBlPXsKJDAoKXt0aGlzLmEuWDIodGhpcy5iKX0s
+CiRTOjB9ClAuS0YucHJvdG90eXBlPXsKJDAoKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5a
+TC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJv
+dG90eXBlPXsKJDAoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bnVsbAp0cnl7cT1tLmEuYQpsPXEu
+Yi5iLnp6KHQuZk8uYShxLmQpLHQueil9Y2F0Y2gocCl7cz1ILlJ1KHApCnI9SC50cyhwKQpxPW0uYyYm
+dC5uLmEobS5iLmEuYykuYT09PXMKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5iLmEuYykKZWxzZSBvLmM9
+UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMmJihsLmEmMjQpIT09MCl7
+aWYoKGwuYSYxNikhPT0wKXtxPW0uYQpxLmM9dC5uLmEobC5jKQpxLmI9ITB9cmV0dXJufWlmKHQuaS5i
+KGwpKXtuPW0uYi5hCnE9bS5hCnEuYz1sLlc3KG5ldyBQLmpaKG4pLHQueikKcS5iPSExfX0sCiRTOjB9
+ClAualoucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYX0sCiRTOjI5fQpQLnJxLnByb3RvdHlw
+ZT17CiQwKCl7dmFyIHMscixxLHAsbyxuLG0sbAp0cnl7cT10aGlzLmEKcD1xLmEKbz1wLiR0aQpuPW8u
+YwptPW4uYSh0aGlzLmIpCnEuYz1wLmIuYi5idihvLkMoIjIvKDEpIikuYShwLmQpLG0sby5DKCIyLyIp
+LG4pfWNhdGNoKGwpe3M9SC5SdShsKQpyPUgudHMobCkKcT10aGlzLmEKcS5jPVAuVGwocyxyKQpxLmI9
+ITB9fSwKJFM6MH0KUC5SVy5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKdHJ5
+e3M9dC5uLmEobS5hLmEuYykKcD1tLmIKaWYocC5hLkhSKHMpJiZwLmEuZSE9bnVsbCl7cC5jPXAuYS5L
+dyhzKQpwLmI9ITF9fWNhdGNoKG8pe3I9SC5SdShvKQpxPUgudHMobykKcD10Lm4uYShtLmEuYS5jKQpu
+PW0uYgppZihwLmE9PT1yKW4uYz1wCmVsc2Ugbi5jPVAuVGwocixxKQpuLmI9ITB9fSwKJFM6MH0KUC5P
+TS5wcm90b3R5cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQShhKXt2YXIgcyxyLHE9dGhpcyxwPXt9LG89
+bmV3IFAudnMoJC5YMyx0LmZKKQpwLmE9MApzPUguTGgocSkKcj1zLkMoIn4oMSk/IikuYShuZXcgUC5C
+NShwLHEpKQp0LlouYShuZXcgUC51TyhwLG8pKQpXLkpFKHEuYSxxLmIsciwhMSxzLmMpCnJldHVybiBv
+fX0KUC5CNS5wcm90b3R5cGU9ewokMShhKXtILkxoKHRoaXMuYikuYy5hKGEpOysrdGhpcy5hLmF9LAok
+Uygpe3JldHVybiBILkxoKHRoaXMuYikuQygifigxKSIpfX0KUC51Ty5wcm90b3R5cGU9ewokMCgpe3Zh
+ciBzPXRoaXMuYixyPXMuJHRpLHE9ci5DKCIxLyIpLmEodGhpcy5hLmEpLHA9cy5haCgpCnIuYy5hKHEp
+CnMuYT04CnMuYz1xClAuSFoocyxwKX0sCiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAua1QucHJvdG90
+eXBlPXt9ClAueEkucHJvdG90eXBlPXt9ClAubTAucHJvdG90eXBlPXskaVFtOjF9ClAuRXYucHJvdG90
+eXBlPXsKJDAoKXt2YXIgcz10LksuYShILmIodGhpcy5hKSkKcy5zdGFjaz10aGlzLmIudygwKQp0aHJv
+dyBzfSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSChhKXt2YXIgcyxyLHEscCxvCnQuTS5hKGEpCnRy
+eXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJldHVybn1QLlQ4KG51bGwsbnVsbCx0aGlzLGEsdC5IKX1j
+YXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpCnA9dC5LLmEocykKbz10LmwuYShyKQpQLlNpKHAsbyl9
+fSwKRGwoYSxiLGMpe3ZhciBzLHIscSxwLG8KYy5DKCJ+KDApIikuYShhKQpjLmEoYikKdHJ5e2lmKEMu
+TlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1QLnl2KG51bGwsbnVsbCx0aGlzLGEsYix0LkgsYyl9Y2F0
+Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpwPXQuSy5hKHMpCm89dC5sLmEocikKUC5TaShwLG8pfX0s
+CkdZKGEpe3JldHVybiBuZXcgUC5WcCh0aGlzLHQuTS5hKGEpKX0sClB5KGEsYil7cmV0dXJuIG5ldyBQ
+Lk9SKHRoaXMsYi5DKCJ+KDApIikuYShhKSxiKX0sCnEoYSxiKXtyZXR1cm4gbnVsbH0sCnp6KGEsYil7
+Yi5DKCIwKCkiKS5hKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVs
+bCxudWxsLHRoaXMsYSxiKX0sCmJ2KGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5h
+KGEpCmQuYShiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51
+bGwsdGhpcyxhLGIsYyxkKX0sCnJwKGEsYixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShmKS5D
+KCIxKDIsMykiKS5hKGEpCmUuYShiKQpmLmEoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIoYixj
+KQpyZXR1cm4gUC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9LApMaihhLGIsYyxkKXtyZXR1
+cm4gYi5DKCJAPDA+IikuS3EoYykuS3EoZCkuQygiMSgyLDMpIikuYShhKX19ClAuVnAucHJvdG90eXBl
+PXsKJDAoKXtyZXR1cm4gdGhpcy5hLmJIKHRoaXMuYil9LAokUzowfQpQLk9SLnByb3RvdHlwZT17CiQx
+KGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gdGhpcy5hLkRsKHRoaXMuYixzLmEoYSkscyl9LAokUygpe3Jl
+dHVybiB0aGlzLmMuQygifigwKSIpfX0KUC5iNi5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz10aGlzLHI9
+bmV3IFAubG0ocyxzLnIsSC5MaChzKS5DKCJsbTwxPiIpKQpyLmM9cy5lCnJldHVybiByfSwKZ0EoYSl7
+cmV0dXJuIHRoaXMuYX0sCmdsMChhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcihhKXtyZXR1cm4gdGhp
+cy5hIT09MH0sCnRnKGEsYil7dmFyIHMscgppZihiIT09Il9fcHJvdG9fXyIpe3M9dGhpcy5iCmlmKHM9
+PW51bGwpcmV0dXJuITEKcmV0dXJuIHQuZy5hKHNbYl0pIT1udWxsfWVsc2V7cj10aGlzLlBSKGIpCnJl
+dHVybiByfX0sClBSKGEpe3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlz
+LkRGKHNbdGhpcy5OKGEpXSxhKT49MH0sCmkoYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLmMuYShi
+KQppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7cz1xLmIKcmV0dXJuIHEuSihz
+PT1udWxsP3EuYj1QLlQyKCk6cyxiKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0
+MTgyMyk9PT1iKXtyPXEuYwpyZXR1cm4gcS5KKHI9PW51bGw/cS5jPVAuVDIoKTpyLGIpfWVsc2UgcmV0
+dXJuIHEuWShiKX0sClkoYSl7dmFyIHMscixxLHA9dGhpcwpILkxoKHApLmMuYShhKQpzPXAuZAppZihz
+PT1udWxsKXM9cC5kPVAuVDIoKQpyPXAuTihhKQpxPXNbcl0KaWYocT09bnVsbClzW3JdPVtwLnlvKGEp
+XQplbHNle2lmKHAuREYocSxhKT49MClyZXR1cm4hMQpxLnB1c2gocC55byhhKSl9cmV0dXJuITB9LApS
+KGEsYil7dmFyIHM9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIilyZXR1
+cm4gcy5IKHMuYixiKQplbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1i
+KXJldHVybiBzLkgocy5jLGIpCmVsc2UgcmV0dXJuIHMucWcoYil9LApxZyhhKXt2YXIgcyxyLHEscCxv
+PXRoaXMsbj1vLmQKaWYobj09bnVsbClyZXR1cm4hMQpzPW8uTihhKQpyPW5bc10KcT1vLkRGKHIsYSkK
+aWYocTwwKXJldHVybiExCnA9ci5zcGxpY2UocSwxKVswXQppZigwPT09ci5sZW5ndGgpZGVsZXRlIG5b
+c10Kby5HKHApCnJldHVybiEwfSwKSihhLGIpe0guTGgodGhpcykuYy5hKGIpCmlmKHQuZy5hKGFbYl0p
+IT1udWxsKXJldHVybiExCmFbYl09dGhpcy55byhiKQpyZXR1cm4hMH0sCkgoYSxiKXt2YXIgcwppZihh
+PT1udWxsKXJldHVybiExCnM9dC5nLmEoYVtiXSkKaWYocz09bnVsbClyZXR1cm4hMQp0aGlzLkcocykK
+ZGVsZXRlIGFbYl0KcmV0dXJuITB9LApTKCl7dGhpcy5yPXRoaXMucisxJjEwNzM3NDE4MjN9LAp5byhh
+KXt2YXIgcyxyPXRoaXMscT1uZXcgUC5ibihILkxoKHIpLmMuYShhKSkKaWYoci5lPT1udWxsKXIuZT1y
+LmY9cQplbHNle3M9ci5mCnMudG9TdHJpbmcKcS5jPXMKci5mPXMuYj1xfSsrci5hCnIuUygpCnJldHVy
+biBxfSwKRyhhKXt2YXIgcz10aGlzLHI9YS5jLHE9YS5iCmlmKHI9PW51bGwpcy5lPXEKZWxzZSByLmI9
+cQppZihxPT1udWxsKXMuZj1yCmVsc2UgcS5jPXI7LS1zLmEKcy5TKCl9LApOKGEpe3JldHVybiBKLmhm
+KGEpJjEwNzM3NDE4MjN9LApERihhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVu
+Z3RoCmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX19ClAu
+Ym4ucHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy4kdGkuYy5hKHRo
+aXMuZCl9LApGKCl7dmFyIHM9dGhpcyxyPXMuYyxxPXMuYQppZihzLmIhPT1xLnIpdGhyb3cgSC5iKFAu
+YTQocSkpCmVsc2UgaWYocj09bnVsbCl7cy5zaihudWxsKQpyZXR1cm4hMX1lbHNle3Muc2oocy4kdGku
+QygiMT8iKS5hKHIuYSkpCnMuYz1yLmIKcmV0dXJuITB9fSwKc2ooYSl7dGhpcy5kPXRoaXMuJHRpLkMo
+IjE/IikuYShhKX0sCiRpQW46MX0KUC5tVy5wcm90b3R5cGU9e30KUC51eS5wcm90b3R5cGU9eyRpYlE6
+MSwkaWNYOjEsJGl6TToxfQpQLmxELnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5hNyhhLHRo
+aXMuZ0EoYSksSC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sCkUoYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9
+LApLKGEsYil7dmFyIHMscgpILnpLKGEpLkMoIn4obEQuRSkiKS5hKGIpCnM9dGhpcy5nQShhKQpmb3Io
+cj0wO3I8czsrK3Ipe2IuJDEodGhpcy5xKGEscikpCmlmKHMhPT10aGlzLmdBKGEpKXRocm93IEguYihQ
+LmE0KGEpKX19LApnbDAoYSl7cmV0dXJuIHRoaXMuZ0EoYSk9PT0wfSwKZ29yKGEpe3JldHVybiF0aGlz
+LmdsMChhKX0sCkUyKGEsYixjKXt2YXIgcz1ILnpLKGEpCnJldHVybiBuZXcgSC5sSihhLHMuS3EoYyku
+QygiMShsRC5FKSIpLmEoYikscy5DKCJAPGxELkU+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmVSKGEs
+Yil7cmV0dXJuIEgucUMoYSxiLG51bGwsSC56SyhhKS5DKCJsRC5FIikpfSwKZHIoYSxiKXtyZXR1cm4g
+bmV3IEgualYoYSxILnpLKGEpLkMoIkA8bEQuRT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZHUoYSxi
+LGMsZCl7dmFyIHMscj1ILnpLKGEpCmQ9ci5DKCJsRC5FIikuYShyLkMoImxELkU/IikuYShkKSkKUC5q
+QihiLGMsdGhpcy5nQShhKSkKZm9yKHM9YjtzPGM7KytzKXRoaXMuWTUoYSxzLGQpfSwKdyhhKXtyZXR1
+cm4gUC54KGEsIlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3RvdHlwZT17CiQyKGEs
+Yil7dmFyIHMscj10aGlzLmEKaWYoIXIuYSl0aGlzLmIuYSs9IiwgIgpyLmE9ITEKcj10aGlzLmIKcz1y
+LmErPUguRWooYSkKci5hPXMrIjogIgpyLmErPUguRWooYil9LAokUzo5fQpQLllrLnByb3RvdHlwZT17
+CksoYSxiKXt2YXIgcyxyLHE9SC5MaCh0aGlzKQpxLkMoIn4oWWsuSyxZay5WKSIpLmEoYikKZm9yKHM9
+Si5JVCh0aGlzLmd2YygpKSxxPXEuQygiWWsuViIpO3MuRigpOyl7cj1zLmdsKCkKYi4kMihyLHEuYSh0
+aGlzLnEoMCxyKSkpfX0sCmdQdShhKXtyZXR1cm4gSi5NMSh0aGlzLmd2YygpLG5ldyBQLnlRKHRoaXMp
+LEguTGgodGhpcykuQygiTjM8WWsuSyxZay5WPiIpKX0sCng0KGEpe3JldHVybiBKLnpsKHRoaXMuZ3Zj
+KCksYSl9LApnQShhKXtyZXR1cm4gSi5IbSh0aGlzLmd2YygpKX0sCmdsMChhKXtyZXR1cm4gSi51VSh0
+aGlzLmd2YygpKX0sCncoYSl7cmV0dXJuIFAubk8odGhpcyl9LAokaVowOjF9ClAueVEucHJvdG90eXBl
+PXsKJDEoYSl7dmFyIHMscj10aGlzLmEscT1ILkxoKHIpCnEuQygiWWsuSyIpLmEoYSkKcz1xLkMoIllr
+LlYiKQpyZXR1cm4gbmV3IFAuTjMoYSxzLmEoci5xKDAsYSkpLHEuQygiQDxZay5LPiIpLktxKHMpLkMo
+Ik4zPDEsMj4iKSl9LAokUygpe3JldHVybiBILkxoKHRoaXMuYSkuQygiTjM8WWsuSyxZay5WPihZay5L
+KSIpfX0KUC5LUC5wcm90b3R5cGU9ewpZNShhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpz
+LlFbMV0uYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIikp
+fX0KUC5Qbi5wcm90b3R5cGU9ewpxKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9LApZNShhLGIsYyl7
+dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWTUoMCxzLmMuYShiKSxzLlFbMV0uYShjKSl9LAp4NChhKXty
+ZXR1cm4gdGhpcy5hLng0KGEpfSwKSyhhLGIpe3RoaXMuYS5LKDAsSC5MaCh0aGlzKS5DKCJ+KDEsMiki
+KS5hKGIpKX0sCmdsMChhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ2wwKHMpfSwKZ0EoYSl7dmFyIHM9
+dGhpcy5hCnJldHVybiBzLmdBKHMpfSwKdyhhKXtyZXR1cm4gdGhpcy5hLncoMCl9LApnUHUoYSl7dmFy
+IHM9dGhpcy5hCnJldHVybiBzLmdQdShzKX0sCiRpWjA6MX0KUC5Hai5wcm90b3R5cGU9e30KUC5sZi5w
+cm90b3R5cGU9ewpnbDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ29yKGEpe3JldHVybiB0
+aGlzLmdBKHRoaXMpIT09MH0sCkZWKGEsYil7dmFyIHMKZm9yKHM9Si5JVChILkxoKHRoaXMpLkMoImNY
+PGxmLkU+IikuYShiKSk7cy5GKCk7KXRoaXMuaSgwLHMuZ2woKSl9LAp3KGEpe3JldHVybiBQLngodGhp
+cywieyIsIn0iKX0sCmsoYSxiKXt2YXIgcyxyLHE9dGhpcy5nbSh0aGlzKQppZighcS5GKCkpcmV0dXJu
+IiIKcz1xLiR0aS5jCmlmKGI9PT0iIil7cj0iIgpkbyByKz1ILkVqKHMuYShxLmQpKQp3aGlsZShxLkYo
+KSkKcz1yfWVsc2V7cj0iIitILkVqKHMuYShxLmQpKQpmb3IoO3EuRigpOylyPXIrYitILkVqKHMuYShx
+LmQpKQpzPXJ9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAplUihhLGIpe3JldHVybiBILmJL
+KHRoaXMsYixILkxoKHRoaXMpLkMoImxmLkUiKSl9LApFKGEsYil7dmFyIHMscixxLHAsbz0iaW5kZXgi
+CkguY2IoYixvLHQuUykKUC5rMShiLG8pCmZvcihzPXRoaXMuZ20odGhpcykscj1zLiR0aS5jLHE9MDtz
+LkYoKTspe3A9ci5hKHMuZCkKaWYoYj09PXEpcmV0dXJuIHA7KytxfXRocm93IEguYihQLkNmKGIsdGhp
+cyxvLG51bGwscSkpfX0KUC5Wai5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl4dToxfQpQLlh2LnBy
+b3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAublkucHJvdG90eXBlPXt9ClAuV1kucHJvdG90
+eXBlPXt9ClAuUlUucHJvdG90eXBlPXt9ClAucFIucHJvdG90eXBlPXt9ClAudXcucHJvdG90eXBlPXsK
+cShhLGIpe3ZhciBzLHI9dGhpcy5iCmlmKHI9PW51bGwpcmV0dXJuIHRoaXMuYy5xKDAsYikKZWxzZSBp
+Zih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIG51bGwKZWxzZXtzPXJbYl0KcmV0dXJuIHR5cGVvZiBz
+PT0idW5kZWZpbmVkIj90aGlzLmZiKGIpOnN9fSwKZ0EoYSl7dmFyIHMKaWYodGhpcy5iPT1udWxsKXtz
+PXRoaXMuYwpzPXMuZ0Eocyl9ZWxzZSBzPXRoaXMuQ2YoKS5sZW5ndGgKcmV0dXJuIHN9LApnbDAoYSl7
+cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ3ZjKCl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlz
+LmMuZ3ZjKCkKcmV0dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTUoYSxiLGMpe3ZhciBzLHIscT10aGlzCmlm
+KHEuYj09bnVsbClxLmMuWTUoMCxiLGMpCmVsc2UgaWYocS54NChiKSl7cz1xLmIKc1tiXT1jCnI9cS5h
+CmlmKHI9PW51bGw/cyE9bnVsbDpyIT09cylyW2JdPW51bGx9ZWxzZSBxLlhLKCkuWTUoMCxiLGMpfSwK
+eDQoYSl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlzLmMueDQoYSkKcmV0dXJuIE9iamVjdC5wcm90
+b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSl9LApLKGEsYil7dmFyIHMscixxLHAsbz10
+aGlzCnQuY0EuYShiKQppZihvLmI9PW51bGwpcmV0dXJuIG8uYy5LKDAsYikKcz1vLkNmKCkKZm9yKHI9
+MDtyPHMubGVuZ3RoOysrcil7cT1zW3JdCnA9by5iW3FdCmlmKHR5cGVvZiBwPT0idW5kZWZpbmVkIil7
+cD1QLlFlKG8uYVtxXSkKby5iW3FdPXB9Yi4kMihxLHApCmlmKHMhPT1vLmMpdGhyb3cgSC5iKFAuYTQo
+bykpfX0sCkNmKCl7dmFyIHM9dC5iTS5hKHRoaXMuYykKaWYocz09bnVsbClzPXRoaXMuYz1ILlFJKE9i
+amVjdC5rZXlzKHRoaXMuYSksdC5zKQpyZXR1cm4gc30sClhLKCl7dmFyIHMscixxLHAsbyxuPXRoaXMK
+aWYobi5iPT1udWxsKXJldHVybiBuLmMKcz1QLkZsKHQuTix0LnopCnI9bi5DZigpCmZvcihxPTA7cD1y
+Lmxlbmd0aCxxPHA7KytxKXtvPXJbcV0Kcy5ZNSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShy
+LCIiKQplbHNlIEMuTm0uc0EociwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmIoYSl7dmFy
+IHMKaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJu
+IG51bGwKcz1QLlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9
+ewpnQShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFKGEsYil7dmFyIHM9dGhpcy5hCmlm
+KHMuYj09bnVsbClzPXMuZ3ZjKCkuRSgwLGIpCmVsc2V7cz1zLkNmKCkKaWYoYjwwfHxiPj1zLmxlbmd0
+aClyZXR1cm4gSC5PSChzLGIpCnM9c1tiXX1yZXR1cm4gc30sCmdtKGEpe3ZhciBzPXRoaXMuYQppZihz
+LmI9PW51bGwpe3M9cy5ndmMoKQpzPXMuZ20ocyl9ZWxzZXtzPXMuQ2YoKQpzPW5ldyBKLm0xKHMscy5s
+ZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX1yZXR1cm4gc30sCnRnKGEsYil7cmV0dXJuIHRoaXMuYS54
+NChiKX19ClAueHIucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyCnRyeXtzPW5ldyBUZXh0RGVjb2Rlcigi
+dXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0s
+CiRTOjEwfQpQLk56LnByb3RvdHlwZT17CiQwKCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIo
+InV0Zi04Iix7ZmF0YWw6ZmFsc2V9KQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxs
+fSwKJFM6MTB9ClAuQ1YucHJvdG90eXBlPXsKeXIoYTEsYTIsYTMpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZSxkLGMsYixhLGEwPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgph
+Mz1QLmpCKGEyLGEzLGExLmxlbmd0aCkKcz0kLlY3KCkKZm9yKHI9cy5sZW5ndGgscT1hMixwPXEsbz1u
+dWxsLG49LTEsbT0tMSxsPTA7cTxhMztxPWspe2s9cSsxCmo9Qy54Qi5XKGExLHEpCmlmKGo9PT0zNyl7
+aT1rKzIKaWYoaTw9YTMpe2g9SC5vbyhDLnhCLlcoYTEsaykpCmc9SC5vbyhDLnhCLlcoYTEsaysxKSkK
+Zj1oKjE2K2ctKGcmMjU2KQppZihmPT09MzcpZj0tMQprPWl9ZWxzZSBmPS0xfWVsc2UgZj1qCmlmKDA8
+PWYmJmY8PTEyNyl7aWYoZjwwfHxmPj1yKXJldHVybiBILk9IKHMsZikKZT1zW2ZdCmlmKGU+PTApe2Y9
+Qy54Qi5PKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6
+MDEyMzQ1Njc4OSsvIixlKQppZihmPT09ailjb250aW51ZQpqPWZ9ZWxzZXtpZihlPT09LTEpe2lmKG48
+MCl7ZD1vPT1udWxsP251bGw6by5hLmxlbmd0aAppZihkPT1udWxsKWQ9MApuPWQrKHEtcCkKbT1xfSsr
+bAppZihqPT09NjEpY29udGludWV9aj1mfWlmKGUhPT0tMil7aWYobz09bnVsbCl7bz1uZXcgUC5NKCIi
+KQpkPW99ZWxzZSBkPW8KYz1kLmErPUMueEIuTmooYTEscCxxKQpkLmE9YytILkx3KGopCnA9awpjb250
+aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGExLHEpKX1pZihvIT1udWxs
+KXtyPW8uYSs9Qy54Qi5OaihhMSxwLGEzKQpkPXIubGVuZ3RoCmlmKG4+PTApUC54TShhMSxtLGEzLG4s
+bCxkKQplbHNle2I9Qy5qbi56WShkLTEsNCkrMQppZihiPT09MSl0aHJvdyBILmIoUC5ycihhMCxhMSxh
+MykpCmZvcig7Yjw0Oyl7cis9Ij0iCm8uYT1yOysrYn19cj1vLmEKcmV0dXJuIEMueEIuaTcoYTEsYTIs
+YTMsci5jaGFyQ29kZUF0KDApPT0wP3I6cil9YT1hMy1hMgppZihuPj0wKVAueE0oYTEsbSxhMyxuLGws
+YSkKZWxzZXtiPUMuam4uelkoYSw0KQppZihiPT09MSl0aHJvdyBILmIoUC5ycihhMCxhMSxhMykpCmlm
+KGI+MSlhMT1DLnhCLmk3KGExLGEzLGEzLGI9PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTF9fQpQLlU4LnBy
+b3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlw
+ZT17fQpQLlVkLnByb3RvdHlwZT17CncoYSl7dmFyIHM9UC5obCh0aGlzLmEpCnJldHVybih0aGlzLmIh
+PW51bGw/IkNvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOiI6IkNv
+bnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IikrIiAiK3N9
+fQpQLks4LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lm
+eSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXKGEsYixjKXt2YXIgcwp0LmZWLmEoYykKcz1QLkJTKGIsdGhp
+cy5nSGUoKS5hKQpyZXR1cm4gc30sCk9CKGEsYil7dmFyIHMKdC5kQS5hKGIpCnM9UC51WChhLHRoaXMu
+Z1pFKCkuYixudWxsKQpyZXR1cm4gc30sCmdaRSgpe3JldHVybiBDLm5YfSwKZ0hlKCl7cmV0dXJuIEMu
+QTN9fQpQLm9qLnByb3RvdHlwZT17fQpQLk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17ClJU
+KGEpe3ZhciBzLHIscSxwLG8sbixtPWEubGVuZ3RoCmZvcihzPXRoaXMuYyxyPTAscT0wO3E8bTsrK3Ep
+e3A9Qy54Qi5XKGEscSkKaWYocD45Mil7aWYocD49NTUyOTYpe289cCY2NDUxMgppZihvPT09NTUyOTYp
+e249cSsxCm49IShuPG0mJihDLnhCLlcoYSxuKSY2NDUxMik9PT01NjMyMCl9ZWxzZSBuPSExCmlmKCFu
+KWlmKG89PT01NjMyMCl7bz1xLTEKbz0hKG8+PTAmJihDLnhCLk8oYSxvKSY2NDUxMik9PT01NTI5Nil9
+ZWxzZSBvPSExCmVsc2Ugbz0hMAppZihvKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpv
+PXMuYSs9SC5Mdyg5MikKbys9SC5MdygxMTcpCnMuYT1vCm8rPUguTHcoMTAwKQpzLmE9bwpuPXA+Pj44
+JjE1Cm8rPUguTHcobjwxMD80OCtuOjg3K24pCnMuYT1vCm49cD4+PjQmMTUKbys9SC5MdyhuPDEwPzQ4
+K246ODcrbikKcy5hPW8Kbj1wJjE1CnMuYT1vK0guTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51ZX1p
+ZihwPDMyKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpvPXMuYSs9SC5Mdyg5MikKc3dp
+dGNoKHApe2Nhc2UgODpzLmE9bytILkx3KDk4KQpicmVhawpjYXNlIDk6cy5hPW8rSC5MdygxMTYpCmJy
+ZWFrCmNhc2UgMTA6cy5hPW8rSC5MdygxMTApCmJyZWFrCmNhc2UgMTI6cy5hPW8rSC5MdygxMDIpCmJy
+ZWFrCmNhc2UgMTM6cy5hPW8rSC5MdygxMTQpCmJyZWFrCmRlZmF1bHQ6bys9SC5MdygxMTcpCnMuYT1v
+Cm8rPUguTHcoNDgpCnMuYT1vCm8rPUguTHcoNDgpCnMuYT1vCm49cD4+PjQmMTUKbys9SC5MdyhuPDEw
+PzQ4K246ODcrbikKcy5hPW8Kbj1wJjE1CnMuYT1vK0guTHcobjwxMD80OCtuOjg3K24pCmJyZWFrfX1l
+bHNlIGlmKHA9PT0zNHx8cD09PTkyKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpvPXMu
+YSs9SC5Mdyg5MikKcy5hPW8rSC5MdyhwKX19aWYocj09PTApcy5hKz1hCmVsc2UgaWYocjxtKXMuYSs9
+Qy54Qi5OaihhLHIsbSl9LApKbihhKXt2YXIgcyxyLHEscApmb3Iocz10aGlzLmEscj1zLmxlbmd0aCxx
+PTA7cTxyOysrcSl7cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDphPT09cCl0aHJvdyBILmIobmV3IFAu
+SzgoYSxudWxsKSl9Qy5ObS5pKHMsYSl9LAppVShhKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShh
+KSlyZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEoYSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGws
+by5nVksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlmKDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEp
+CnEucG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEp
+fX0sCnRNKGEpe3ZhciBzLHIscT10aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlzRmluaXRl
+KGEpKXJldHVybiExCnEuYy5hKz1DLkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITApe3EuYy5h
+Kz0idHJ1ZSIKcmV0dXJuITB9ZWxzZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVybiEwfWVs
+c2UgaWYoYT09bnVsbCl7cS5jLmErPSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBhPT0ic3Ry
+aW5nIil7cz1xLmMKcy5hKz0nIicKcS5SVChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlmKHQuai5i
+KGEpKXtxLkpuKGEpCnEubEsoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkK
+cy5wb3AoKQpyZXR1cm4hMH1lbHNlIGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpzPXEuYQpp
+ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2UgcmV0dXJu
+ITF9LApsSyhhKXt2YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihhKQppZihzLmdvcihhKSl7
+dGhpcy5pVShzLnEoYSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmErPSIsIgp0aGlzLmlVKHMu
+cShhLHIpKX19cS5hKz0iXSJ9LApqdyhhKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9e30KaWYoYS5n
+bDAoYSkpe20uYy5hKz0ie30iCnJldHVybiEwfXM9YS5nQShhKSoyCnI9UC5POChzLG51bGwsITEsdC5Y
+KQpxPWwuYT0wCmwuYj0hMAphLksoMCxuZXcgUC50aShsLHIpKQppZighbC5iKXJldHVybiExCnA9bS5j
+CnAuYSs9InsiCmZvcihvPSciJztxPHM7cSs9MixvPScsIicpe3AuYSs9bwptLlJUKEgubihyW3FdKSkK
+cC5hKz0nIjonCm49cSsxCmlmKG4+PXMpcmV0dXJuIEguT0gocixuKQptLmlVKHJbbl0pfXAuYSs9In0i
+CnJldHVybiEwfX0KUC50aS5wcm90b3R5cGU9ewokMihhLGIpe3ZhciBzLHIKaWYodHlwZW9mIGEhPSJz
+dHJpbmciKXRoaXMuYS5iPSExCnM9dGhpcy5iCnI9dGhpcy5hCkMuTm0uWTUocyxyLmErKyxhKQpDLk5t
+Llk1KHMsci5hKyssYil9LAokUzo5fQpQLnR1LnByb3RvdHlwZT17CmdWSygpe3ZhciBzPXRoaXMuYy5h
+CnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfX0KUC51NS5wcm90b3R5cGU9ewpnWkUoKXtyZXR1
+cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0ooYSl7dmFyIHMscixxLHA9UC5qQigwLG51bGwsYS5s
+ZW5ndGgpLG89cC0wCmlmKG89PT0wKXJldHVybiBuZXcgVWludDhBcnJheSgwKQpzPW8qMwpyPW5ldyBV
+aW50OEFycmF5KHMpCnE9bmV3IFAuUncocikKaWYocS5HeChhLDAscCkhPT1wKXtDLnhCLk8oYSxwLTEp
+CnEuUk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoci5zdWJhcnJheSgwLEguck0oMCxxLmIscykpKX19
+ClAuUncucHJvdG90eXBlPXsKUk8oKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXErMSxvPXIu
+bGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYocD49byly
+ZXR1cm4gSC5PSChyLHApCnJbcF09MTkxCnMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJb
+cV09MTg5fSwKTzYoYSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2NDUxMik9PT01NjMyMCl7
+cz02NTUzNisoKGEmMTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1uLmI9cSsxCm89ci5sZW5n
+dGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApxPW4uYj1wKzEKaWYocD49
+bylyZXR1cm4gSC5PSChyLHApCnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1xKzEKaWYocT49bylyZXR1
+cm4gSC5PSChyLHEpCnJbcV09cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChy
+LHApCnJbcF09cyY2M3wxMjgKcmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJuITF9fSwKR3goYSxiLGMp
+e3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYmKEMueEIuTyhhLGMtMSkmNjQ1MTIpPT09
+NTUyOTYpLS1jCmZvcihzPWwuYyxyPXMubGVuZ3RoLHE9YjtxPGM7KytxKXtwPUMueEIuVyhhLHEpCmlm
+KHA8PTEyNyl7bz1sLmIKaWYobz49cilicmVhawpsLmI9bysxCnNbb109cH1lbHNle289cCY2NDUxMgpp
+ZihvPT09NTUyOTYpe2lmKGwuYis0PnIpYnJlYWsKbj1xKzEKaWYobC5PNihwLEMueEIuVyhhLG4pKSlx
+PW59ZWxzZSBpZihvPT09NTYzMjApe2lmKGwuYiszPnIpYnJlYWsKbC5STygpfWVsc2UgaWYocDw9MjA0
+Nyl7bz1sLmIKbT1vKzEKaWYobT49cilicmVhawpsLmI9bQppZihvPj1yKXJldHVybiBILk9IKHMsbykK
+c1tvXT1wPj4+NnwxOTIKbC5iPW0rMQpzW21dPXAmNjN8MTI4fWVsc2V7bz1sLmIKaWYobysyPj1yKWJy
+ZWFrCm09bC5iPW8rMQppZihvPj1yKXJldHVybiBILk9IKHMsbykKc1tvXT1wPj4+MTJ8MjI0Cm89bC5i
+PW0rMQppZihtPj1yKXJldHVybiBILk9IKHMsbSkKc1ttXT1wPj4+NiY2M3wxMjgKbC5iPW8rMQppZihv
+Pj1yKXJldHVybiBILk9IKHMsbykKc1tvXT1wJjYzfDEyOH19fXJldHVybiBxfX0KUC5HWS5wcm90b3R5
+cGU9ewpXSihhKXt2YXIgcyxyCnQuTC5hKGEpCnM9dGhpcy5hCnI9UC5reShzLGEsMCxudWxsKQppZihy
+IT1udWxsKXJldHVybiByCnJldHVybiBuZXcgUC5ieihzKS5OZShhLDAsbnVsbCwhMCl9fQpQLmJ6LnBy
+b3RvdHlwZT17Ck5lKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbj10aGlzCnQuTC5hKGEpCnM9UC5qQihi
+LGMsSi5IbShhKSkKaWYoYj09PXMpcmV0dXJuIiIKcj1QLmp5KGEsYixzKQpxPW4uaE8ociwwLHMtYiwh
+MCkKcD1uLmIKaWYoKHAmMSkhPT0wKXtvPVAuajQocCkKbi5iPTAKdGhyb3cgSC5iKFAucnIobyxhLGIr
+bi5jKSl9cmV0dXJuIHF9LApoTyhhLGIsYyxkKXt2YXIgcyxyLHE9dGhpcwppZihjLWI+MTAwMCl7cz1D
+LmpuLkJVKGIrYywyKQpyPXEuaE8oYSxiLHMsITEpCmlmKChxLmImMSkhPT0wKXJldHVybiByCnJldHVy
+biByK3EuaE8oYSxzLGMsZCl9cmV0dXJuIHEuRWgoYSxiLGMsZCl9LApFaChhLGIsYyxkKXt2YXIgcyxy
+LHEscCxvLG4sbSxsLGs9dGhpcyxqPTY1NTMzLGk9ay5iLGg9ay5jLGc9bmV3IFAuTSgiIiksZj1iKzEs
+ZT1hLmxlbmd0aAppZihiPDB8fGI+PWUpcmV0dXJuIEguT0goYSxiKQpzPWFbYl0KJGxhYmVsMCQwOmZv
+cihyPWsuYTshMDspe2Zvcig7ITA7Zj1vKXtxPUMueEIuVygiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
 QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-RkZGRkZGRkZGRkZGRkZGRkdHR0dHR0dHR0dHR0dHR0dISEhISEhISEhISEhISEhISEhISEhISEhISEhJ
-SEhISkVFQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS0NDQ0NDQ0NDQ0NDQ0RDTE9OTk5NRUVF
-RUVFRUVFRUUiLHMpJjMxCmg9aTw9MzI/cyY2MTY5ND4+PnE6KHMmNjN8aDw8Nik+Pj4wCmk9Qy54Qi5X
-KCIgXHgwMDA6WEVDQ0NDQ046bERiIFx4MDAwOlhFQ0NDQ0NOdmxEYiBceDAwMDpYRUNDQ0NDTjpsRGIg
-QUFBQUFceDAwXHgwMFx4MDBceDAwXHgwMEFBQUFBMDAwMDBBQUFBQTo6Ojo6QUFBQUFHRzAwMEFBQUFB
-MDBLS0tBQUFBQUc6Ojo6QUFBQUE6SUlJSUFBQUFBMDAwXHg4MDBBQUFBQVx4MDBceDAwXHgwMFx4MDAg
-QUFBQUEiLGkrcSkKaWYoaT09PTApe2cuYSs9SC5MdyhoKQppZihmPT09YylicmVhayAkbGFiZWwwJDAK
-YnJlYWt9ZWxzZSBpZigoaSYxKSE9PTApe2lmKHIpc3dpdGNoKGkpe2Nhc2UgNjk6Y2FzZSA2NzpnLmEr
-PUguTHcoaikKYnJlYWsKY2FzZSA2NTpnLmErPUguTHcoaik7LS1mCmJyZWFrCmRlZmF1bHQ6cD1nLmEr
-PUguTHcoaikKZy5hPXArSC5MdyhqKQpicmVha31lbHNle2suYj1pCmsuYz1mLTEKcmV0dXJuIiJ9aT0w
-fWlmKGY9PT1jKWJyZWFrICRsYWJlbDAkMApvPWYrMQppZihmPDB8fGY+PWUpcmV0dXJuIEguT0goYSxm
-KQpzPWFbZl19bz1mKzEKaWYoZjwwfHxmPj1lKXJldHVybiBILk9IKGEsZikKcz1hW2ZdCmlmKHM8MTI4
-KXt3aGlsZSghMCl7aWYoIShvPGMpKXtuPWMKYnJlYWt9bT1vKzEKaWYobzwwfHxvPj1lKXJldHVybiBI
-Lk9IKGEsbykKcz1hW29dCmlmKHM+PTEyOCl7bj1tLTEKbz1tCmJyZWFrfW89bX1pZihuLWY8MjApZm9y
-KGw9ZjtsPG47KytsKXtpZihsPj1lKXJldHVybiBILk9IKGEsbCkKZy5hKz1ILkx3KGFbbF0pfWVsc2Ug
-Zy5hKz1QLkhNKGEsZixuKQppZihuPT09YylicmVhayAkbGFiZWwwJDAKZj1vfWVsc2UgZj1vfWlmKGQm
-Jmk+MzIpaWYocilnLmErPUguTHcoaikKZWxzZXtrLmI9NzcKay5jPWMKcmV0dXJuIiJ9ay5iPWkKay5j
-PWgKZT1nLmEKcmV0dXJuIGUuY2hhckNvZGVBdCgwKT09MD9lOmV9fQpQLldGLnByb3RvdHlwZT17CiQy
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCnQuZm8uYShhKQpzPXRoaXMuYgpyPXRoaXMuYQpxPXMuYSs9
-ci5hCnErPWEuYQpzLmE9cQpzLmE9cSsiOiAiCnMuYSs9UC5obChiKQpyLmE9IiwgIn0sCiRTOjI4fQpQ
-LmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4g
-YiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHM9
-dGhpcy5hCnJldHVybihzXkMuam4ud0cocywzMCkpJjEwNzM3NDE4MjN9LAp3OmZ1bmN0aW9uKGEpe3Zh
-ciBzPXRoaXMscj1QLkdxKEgudEoocykpLHE9UC5oMChILk5TKHMpKSxwPVAuaDAoSC5qQShzKSksbz1Q
-LmgwKEguSVgocykpLG49UC5oMChILmNoKHMpKSxtPVAuaDAoSC5KZChzKSksbD1QLlZ4KEgubzEocykp
-LGs9cisiLSIrcSsiLSIrcCsiICIrbysiOiIrbisiOiIrbSsiLiIrbApyZXR1cm4ga319ClAuWFMucHJv
-dG90eXBlPXsKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIEgudHModGhpcy4kdGhyb3duSnNFcnJvcil9fQpQ
-LkM2LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlmKHMhPW51bGwpcmV0dXJu
-IkFzc2VydGlvbiBmYWlsZWQ6ICIrUC5obChzKQpyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZCJ9fQpQLkV6
-LnByb3RvdHlwZT17fQpQLkYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVGhyb3cgb2Yg
-bnVsbC4ifX0KUC5BVC5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3Vt
-ZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5jdGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlv
-bihhKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXA9PW51bGw/IiI6IiAoIitwKyIpIixuPXEuZCxtPW49
-PW51bGw/IiI6IjogIitILkVqKG4pLGw9cS5nWigpK28rbQppZighcS5hKXJldHVybiBsCnM9cS5ndSgp
-CnI9UC5obChxLmIpCnJldHVybiBsK3MrIjogIityfX0KUC5iSi5wcm90b3R5cGU9ewpnWjpmdW5jdGlv
-bigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzLmUscT10aGlz
-LmYKaWYocj09bnVsbClzPXEhPW51bGw/IjogTm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAiK0guRWoo
-cSk6IiIKZWxzZSBpZihxPT1udWxsKXM9IjogTm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiK0gu
-RWoocikKZWxzZSBpZihxPnIpcz0iOiBOb3QgaW4gaW5jbHVzaXZlIHJhbmdlICIrSC5FaihyKSsiLi4i
-K0guRWoocSkKZWxzZSBzPXE8cj8iOiBWYWxpZCB2YWx1ZSByYW5nZSBpcyBlbXB0eSI6IjogT25seSB2
-YWxpZCB2YWx1ZSBpcyAiK0guRWoocikKcmV0dXJuIHN9fQpQLmVZLnByb3RvdHlwZT17CmdaOmZ1bmN0
-aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXtpZihILklaKHRoaXMuYik8MCly
-ZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIKdmFyIHM9dGhpcy5mCmlmKHM9PT0wKXJl
-dHVybiI6IG5vIGluZGljZXMgYXJlIHZhbGlkIgpyZXR1cm4iOiBpbmRleCBzaG91bGQgYmUgbGVzcyB0
-aGFuICIrc30sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMsaj17fSxpPW5ldyBQLk0oIiIpCmou
-YT0iIgpzPWsuYwpmb3Iocj1zLmxlbmd0aCxxPTAscD0iIixvPSIiO3E8cjsrK3Esbz0iLCAiKXtuPXNb
-cV0KaS5hPXArbwpwPWkuYSs9UC5obChuKQpqLmE9IiwgIn1rLmQuSygwLG5ldyBQLldGKGosaSkpCm09
-UC5obChrLmEpCmw9aS53KDApCnI9Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAn
-IitrLmIuYSsiJ1xuUmVjZWl2ZXI6ICIrbSsiXG5Bcmd1bWVudHM6IFsiK2wrIl0iCnJldHVybiByfX0K
-UC51Yi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJVbnN1cHBvcnRlZCBvcGVyYXRpb246
-ICIrdGhpcy5hfX0KUC5kcy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPSJVbmltcGxlbWVu
-dGVkRXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
-e3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5hfX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
-e3ZhciBzPXRoaXMuYQppZihzPT1udWxsKXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJp
-bmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRp
-b246ICIrUC5obChzKSsiLiJ9fQpQLms1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIk91
-dCBvZiBNZW1vcnkifSwKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LAokaVhTOjF9ClAuS1kucHJv
-dG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwKZ0lJOmZ1bmN0aW9u
-KCl7cmV0dXJuIG51bGx9LAokaVhTOjF9ClAucC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBz
-PSJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0aGlzLmErIicgZHVyaW5nIGl0cyBpbml0aWFsaXph
-dGlvbiIKcmV0dXJuIHN9fQpQLkNELnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkV4Y2Vw
-dGlvbjogIit0aGlzLmF9LAokaVJ6OjF9ClAuYUUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIg
-cyxyLHEscCxvLG4sbSxsLGssaixpLGgsZz10aGlzLmEsZj0iIiE9PWc/IkZvcm1hdEV4Y2VwdGlvbjog
-IitnOiJGb3JtYXRFeGNlcHRpb24iLGU9dGhpcy5jLGQ9dGhpcy5iCmlmKHR5cGVvZiBkPT0ic3RyaW5n
-Iil7aWYoZSE9bnVsbClzPWU8MHx8ZT5kLmxlbmd0aAplbHNlIHM9ITEKaWYocyllPW51bGwKaWYoZT09
-bnVsbCl7aWYoZC5sZW5ndGg+NzgpZD1DLnhCLk5qKGQsMCw3NSkrIi4uLiIKcmV0dXJuIGYrIlxuIitk
-fWZvcihyPTEscT0wLHA9ITEsbz0wO288ZTsrK28pe249Qy54Qi5XKGQsbykKaWYobj09PTEwKXtpZihx
-IT09b3x8IXApKytyCnE9bysxCnA9ITF9ZWxzZSBpZihuPT09MTMpeysrcgpxPW8rMQpwPSEwfX1mPXI+
-MT9mKygiIChhdCBsaW5lICIrcisiLCBjaGFyYWN0ZXIgIisoZS1xKzEpKyIpXG4iKTpmKygiIChhdCBj
-aGFyYWN0ZXIgIisoZSsxKSsiKVxuIikKbT1kLmxlbmd0aApmb3Iobz1lO288bTsrK28pe249Qy54Qi5P
-KGQsbykKaWYobj09PTEwfHxuPT09MTMpe209bwpicmVha319aWYobS1xPjc4KWlmKGUtcTw3NSl7bD1x
-Kzc1Cms9cQpqPSIiCmk9Ii4uLiJ9ZWxzZXtpZihtLWU8NzUpe2s9bS03NQpsPW0KaT0iIn1lbHNle2s9
-ZS0zNgpsPWUrMzYKaT0iLi4uIn1qPSIuLi4ifWVsc2V7bD1tCms9cQpqPSIiCmk9IiJ9aD1DLnhCLk5q
-KGQsayxsKQpyZXR1cm4gZitqK2graSsiXG4iK0MueEIuVCgiICIsZS1rK2oubGVuZ3RoKSsiXlxuIn1l
-bHNlIHJldHVybiBlIT1udWxsP2YrKCIgKGF0IG9mZnNldCAiK0guRWooZSkrIikiKTpmfSwKJGlSejox
-fQpQLmNYLnByb3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguR0oodGhpcyxILkxoKHRo
-aXMpLkMoImNYLkUiKSxiKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVy
-biBILksxKHRoaXMscy5LcShjKS5DKCIxKGNYLkUpIikuYShiKSxzLkMoImNYLkUiKSxjKX0sCmV2OmZ1
-bmN0aW9uKGEsYil7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguVTUodGhpcyxzLkMoImEyKGNY
-LkUpIikuYShiKSxzLkMoIlU1PGNYLkU+IikpfSwKdHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5ZMSh0
-aGlzLGIsSC5MaCh0aGlzKS5DKCJjWC5FIikpfSwKYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHQo
-YSwhMCl9LApnQTpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKZm9yKHM9MDtyLkYoKTsp
-KytzCnJldHVybiBzfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdtKHRoaXMpLkYoKX0sCmdv
-cjpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5nbDAodGhpcyl9LAplUjpmdW5jdGlvbihhLGIpe3JldHVy
-biBILmJLKHRoaXMsYixILkxoKHRoaXMpLkMoImNYLkUiKSl9LApncjg6ZnVuY3Rpb24oYSl7dmFyIHMs
-cj10aGlzLmdtKHRoaXMpCmlmKCFyLkYoKSl0aHJvdyBILmIoSC5XcCgpKQpzPXIuZ2woKQppZihyLkYo
-KSl0aHJvdyBILmIoSC5BbSgpKQpyZXR1cm4gc30sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKUC5r
-MShiLCJpbmRleCIpCmZvcihzPXRoaXMuZ20odGhpcykscj0wO3MuRigpOyl7cT1zLmdsKCkKaWYoYj09
-PXIpcmV0dXJuIHE7KytyfXRocm93IEguYihQLkNmKGIsdGhpcywiaW5kZXgiLG51bGwscikpfSwKdzpm
-dW5jdGlvbihhKXtyZXR1cm4gUC5FUCh0aGlzLCIoIiwiKSIpfX0KUC5Bbi5wcm90b3R5cGU9e30KUC5O
-My5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJNYXBFbnRyeSgiK0guRWoodGhpcy5hKSsi
-OiAiK0guRWoodGhpcy5iKSsiKSJ9fQpQLmM4LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXtyZXR1
-cm4gUC5NaC5wcm90b3R5cGUuZ2lPLmNhbGwodGhpcyx0aGlzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJu
-Im51bGwifX0KUC5NaC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlAuTWgsJGlNaDoxLApETjpmdW5jdGlv
-bihhLGIpe3JldHVybiB0aGlzPT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUSh0aGlzKX0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkluc3RhbmNlIG9mICciK0gubGgodGhpcykrIicifSwKZTc6ZnVu
-Y3Rpb24oYSxiKXt0Lm8uYShiKQp0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdW
-bSgpKSl9LAp0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLncodGhpcyl9fQpQLlpkLnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAuTS5wcm90b3R5cGU9ewpnQTpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5h
-CnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKJGlCTDoxfQpQLm4xLnByb3RvdHlwZT17CiQy
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAKdC52LmEoYSkKSC5uKGIpCnM9Qy54Qi5PWShiLCI9IikK
-aWYocz09PS0xKXtpZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMuYSwhMCksIiIp
-fWVsc2UgaWYocyE9PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLnluKGIscysxKQpwPXRoaXMuYQph
-Llk1KDAsUC5rdShyLDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAscS5sZW5ndGgscCwhMCkpfXJldHVy
-biBhfSwKJFM6MjZ9ClAuY1MucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5y
-cigiSWxsZWdhbCBJUHY0IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJFM6MjR9ClAuVkMucHJvdG90
-eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY2IGFkZHJlc3Ms
-ICIrYSx0aGlzLmEsYikpfSwKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJDIoYSxudWxsKX0sCiRT
-OjE5fQpQLkpULnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYi1hPjQpdGhpcy5h
-LiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRz
-IixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIsYSxiKSwxNikKaWYoczwwfHxzPjY1NTM1KXRoaXMuYS4k
-MigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmAiLGEpCnJldHVy
-biBzfSwKJFM6MjB9ClAuRG4ucHJvdG90eXBlPXsKZ25EOmZ1bmN0aW9uKCl7dmFyIHMscixxLHA9dGhp
-cyxvPXAueAppZihvPT1udWxsKXtvPXAuYQpzPW8ubGVuZ3RoIT09MD8iIitvKyI6IjoiIgpyPXAuYwpx
-PXI9PW51bGwKaWYoIXF8fG89PT0iZmlsZSIpe289cysiLy8iCnM9cC5iCmlmKHMubGVuZ3RoIT09MClv
-PW8rcysiQCIKaWYoIXEpbys9cgpzPXAuZAppZihzIT1udWxsKW89bysiOiIrSC5FaihzKX1lbHNlIG89
-cwpvKz1wLmUKcz1wLmYKaWYocyE9bnVsbClvPW8rIj8iK3MKcz1wLnIKaWYocyE9bnVsbClvPW8rIiMi
-K3MKbz1vLmNoYXJDb2RlQXQoMCk9PTA/bzpvCmlmKHAueD09bnVsbClwLng9bwplbHNlIG89SC52KEgu
-aigiX3RleHQiKSl9cmV0dXJuIG99LApnRmo6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMscT1yLnkKaWYo
-cT09bnVsbCl7cz1yLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09PTQ3KXM9Qy54Qi55bihz
-LDEpCnE9cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlFJKHMuc3BsaXQoIi8iKSx0LnMp
-LHQuZE8uYShQLlBIKCkpLHQuZG8pLHQuTikKaWYoci55PT1udWxsKXIuc0twKHEpCmVsc2UgcT1ILnYo
-SC5qKCJwYXRoU2VnbWVudHMiKSl9cmV0dXJuIHF9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxy
-PXMuegppZihyPT1udWxsKXtyPUMueEIuZ2lPKHMuZ25EKCkpCmlmKHMuej09bnVsbClzLno9cgplbHNl
-IHI9SC52KEguaigiaGFzaENvZGUiKSl9cmV0dXJuIHJ9LApnaFk6ZnVuY3Rpb24oKXt2YXIgcz10aGlz
-LHI9cy5RCmlmKHI9PW51bGwpe3I9cy5mCnI9bmV3IFAuR2ooUC5XWChyPT1udWxsPyIiOnIpLHQuZHcp
-CmlmKHMuUT09bnVsbClzLnNOTShyKQplbHNlIHI9SC52KEguaigicXVlcnlQYXJhbWV0ZXJzIikpfXJl
-dHVybiByfSwKZ2t1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYn0sCmdKZjpmdW5jdGlvbihhKXt2YXIg
-cz10aGlzLmMKaWYocz09bnVsbClyZXR1cm4iIgppZihDLnhCLm4ocywiWyIpKXJldHVybiBDLnhCLk5q
-KHMsMSxzLmxlbmd0aC0xKQpyZXR1cm4gc30sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmQKcmV0
-dXJuIHM9PW51bGw/UC53Syh0aGlzLmEpOnN9LApndFA6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmYKcmV0
-dXJuIHM9PW51bGw/IiI6c30sCmdLYTpmdW5jdGlvbigpe3ZhciBzPXRoaXMucgpyZXR1cm4gcz09bnVs
-bD8iIjpzfSwKaEI6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlmKGEubGVuZ3RoIT09cy5sZW5ndGgp
-cmV0dXJuITEKcmV0dXJuIFAuTlIoYSxzKX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxu
-LG0sbCxrLGo9dGhpcwp0LmM5LmEoYikKcz1qLmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5j
-CmlmKCEobyE9bnVsbCkpbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZigh
-ciltPW8hPW51bGwmJm4ubGVuZ3RoIT09MAplbHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0i
-LyIrbgpsPW4Kaz1QLmxlKG51bGwsMCwwLGIpCnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIp
-fSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4KZm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIu
-Li8iLHIpOyl7cis9MzsrK3N9cT1DLnhCLmNuKGEsIi8iKQp3aGlsZSghMCl7aWYoIShxPjAmJnM+MCkp
-YnJlYWsKcD1DLnhCLlBrKGEsIi8iLHEtMSkKaWYocDwwKWJyZWFrCm89cS1wCm49byE9PTIKaWYoIW58
-fG89PT0zKWlmKEMueEIuTyhhLHArMSk9PT00NiluPSFufHxDLnhCLk8oYSxwKzIpPT09NDYKZWxzZSBu
-PSExCmVsc2Ugbj0hMQppZihuKWJyZWFrOy0tcwpxPXB9cmV0dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxD
-LnhCLnluKGIsci0zKnMpKX0sClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwK
-bVM6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbAppZihhLmdG
-aSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpw
-PWEuZ3hBKCk/YS5ndHAoYSk6aH1lbHNle3A9aApxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkpCm49YS5n
-UUQoKT9hLmd0UCgpOmh9ZWxzZXtzPWkuYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpw
-PVAud0IoYS5neEEoKT9hLmd0cChhKTpoLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgpP2EuZ3RQ
-KCk6aH1lbHNle3I9aS5iCnE9aS5jCnA9aS5kCm89aS5lCmlmKGEuZ0lpKGEpPT09IiIpbj1hLmdRRCgp
-P2EuZ3RQKCk6aS5mCmVsc2V7bT1QLnVqKGksbykKaWYobT4wKXtsPUMueEIuTmoobywwLG0pCm89YS5n
-dFQoKT9sK1AueGUoYS5nSWkoYSkpOmwrUC54ZShpLkpoKEMueEIueW4obyxsLmxlbmd0aCksYS5nSWko
-YSkpKX1lbHNlIGlmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNlIGlmKG8ubGVuZ3RoPT09MClp
-ZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ugbz1QLnhl
-KCIvIithLmdJaShhKSkKZWxzZXtrPWkuSmgobyxhLmdJaShhKSkKaj1zLmxlbmd0aD09PTAKaWYoIWp8
-fHEhPW51bGx8fEMueEIubihvLCIvIikpbz1QLnhlKGspCmVsc2Ugbz1QLndGKGssIWp8fHEhPW51bGwp
-fW49YS5nUUQoKT9hLmd0UCgpOmh9fX1yZXR1cm4gbmV3IFAuRG4ocyxyLHEscCxvLG4sYS5nWjgoKT9h
-LmdLYSgpOmgpfSwKZ2NqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYyE9bnVsbH0sCmd4QTpmdW5jdGlv
-bigpe3JldHVybiB0aGlzLmQhPW51bGx9LApnUUQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mIT1udWxs
-fSwKZ1o4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuciE9bnVsbH0sCmd0VDpmdW5jdGlvbigpe3JldHVy
-biBDLnhCLm4odGhpcy5lLCIvIil9LAp0NDpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihx
-IT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRo
-IGZyb20gYSAiK3ErIiBVUkkiKSkKcT1yLmYKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJvdyBILmIo
-UC5MNCh1LmkpKQpxPXIucgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEguYihQLkw0KHUubCkp
-CnE9JC53USgpCmlmKHEpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgu
-dihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC5sKEMueEIubihyLmUsIi8iKT8iIisi
-LyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0KDApPT0wP3E6cX1yZXR1cm4gcX0sCnc6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT10aGlzCmlmKGI9
-PW51bGwpcmV0dXJuITEKaWYocT09PWIpcmV0dXJuITAKaWYodC5kRC5iKGIpKWlmKHEuYT09PWIuZ0Zp
-KCkpaWYocS5jIT1udWxsPT09Yi5nY2ooKSlpZihxLmI9PT1iLmdrdSgpKWlmKHEuZ0pmKHEpPT09Yi5n
-SmYoYikpaWYocS5ndHAocSk9PT1iLmd0cChiKSlpZihxLmU9PT1iLmdJaShiKSl7cz1xLmYKcj1zPT1u
-dWxsCmlmKCFyPT09Yi5nUUQoKSl7aWYocilzPSIiCmlmKHM9PT1iLmd0UCgpKXtzPXEucgpyPXM9PW51
-bGwKaWYoIXI9PT1iLmdaOCgpKXtpZihyKXM9IiIKcz1zPT09Yi5nS2EoKX1lbHNlIHM9ITF9ZWxzZSBz
-PSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKZWxzZSBz
-PSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKcmV0dXJuIHN9LApzS3A6ZnVuY3Rpb24oYSl7dGhpcy55PXQu
-YmsuYShhKX0sCnNOTTpmdW5jdGlvbihhKXt0aGlzLlE9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmk6ZnVu
-Y3Rpb24oKXtyZXR1cm4gdGhpcy5hfSwKZ0lpOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmV9fQpQLlJa
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBQLmVQKEMuWkosSC5uKGEpLEMueE0sITEp
-fSwKJFM6Mn0KUC5NRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMuYixyPXRo
+QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGRkZGRkZGRkZGRkZGRkZG
+R0dHR0dHR0dHR0dHR0dHR0hISEhISEhISEhISEhISEhISEhISEhISEhISElISEhKRUVCQkJCQkJCQkJC
+QkJCQkJCQkJCQkJCQkJCQkJCQkJLQ0NDQ0NDQ0NDQ0NDRENMT05OTk1FRUVFRUVFRUVFRSIscykmMzEK
+aD1pPD0zMj9zJjYxNjk0Pj4+cToocyY2M3xoPDw2KT4+PjAKaT1DLnhCLlcoIiBceDAwMDpYRUNDQ0ND
+TjpsRGIgXHgwMDA6WEVDQ0NDQ052bERiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBBQUFBQVx4MDBceDAwXHgw
+MFx4MDBceDAwQUFBQUEwMDAwMEFBQUFBOjo6OjpBQUFBQUdHMDAwQUFBQUEwMEtLS0FBQUFBRzo6OjpB
+QUFBQTpJSUlJQUFBQUEwMDBceDgwMEFBQUFBXHgwMFx4MDBceDAwXHgwMCBBQUFBQSIsaStxKQppZihp
+PT09MCl7Zy5hKz1ILkx3KGgpCmlmKGY9PT1jKWJyZWFrICRsYWJlbDAkMApicmVha31lbHNlIGlmKChp
+JjEpIT09MCl7aWYocilzd2l0Y2goaSl7Y2FzZSA2OTpjYXNlIDY3OmcuYSs9SC5MdyhqKQpicmVhawpj
+YXNlIDY1OmcuYSs9SC5MdyhqKTstLWYKYnJlYWsKZGVmYXVsdDpwPWcuYSs9SC5MdyhqKQpnLmE9cCtI
+Lkx3KGopCmJyZWFrfWVsc2V7ay5iPWkKay5jPWYtMQpyZXR1cm4iIn1pPTB9aWYoZj09PWMpYnJlYWsg
+JGxhYmVsMCQwCm89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9YVtmXX1vPWYrMQpp
+ZihmPDB8fGY+PWUpcmV0dXJuIEguT0goYSxmKQpzPWFbZl0KaWYoczwxMjgpe3doaWxlKCEwKXtpZigh
+KG88Yykpe249YwpicmVha31tPW8rMQppZihvPDB8fG8+PWUpcmV0dXJuIEguT0goYSxvKQpzPWFbb10K
+aWYocz49MTI4KXtuPW0tMQpvPW0KYnJlYWt9bz1tfWlmKG4tZjwyMClmb3IobD1mO2w8bjsrK2wpe2lm
+KGw+PWUpcmV0dXJuIEguT0goYSxsKQpnLmErPUguTHcoYVtsXSl9ZWxzZSBnLmErPVAuSE0oYSxmLG4p
+CmlmKG49PT1jKWJyZWFrICRsYWJlbDAkMApmPW99ZWxzZSBmPW99aWYoZCYmaT4zMilpZihyKWcuYSs9
+SC5MdyhqKQplbHNle2suYj03NwprLmM9YwpyZXR1cm4iIn1rLmI9aQprLmM9aAplPWcuYQpyZXR1cm4g
+ZS5jaGFyQ29kZUF0KDApPT0wP2U6ZX19ClAuV0YucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEK
+dC5mby5hKGEpCnM9dGhpcy5iCnI9dGhpcy5hCnE9cy5hKz1yLmEKcSs9YS5hCnMuYT1xCnMuYT1xKyI6
+ICIKcy5hKz1QLmhsKGIpCnIuYT0iLCAifSwKJFM6Mjh9ClAuaVAucHJvdG90eXBlPXsKRE4oYSxiKXtp
+ZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5pUCYmdGhpcy5hPT09Yi5hJiYh
+MH0sCmdpTyhhKXt2YXIgcz10aGlzLmEKcmV0dXJuKHNeQy5qbi53RyhzLDMwKSkmMTA3Mzc0MTgyM30s
+CncoYSl7dmFyIHM9dGhpcyxyPVAuR3EoSC50SihzKSkscT1QLmgwKEguTlMocykpLHA9UC5oMChILmpB
+KHMpKSxvPVAuaDAoSC5JWChzKSksbj1QLmgwKEguY2gocykpLG09UC5oMChILkpkKHMpKSxsPVAuVngo
+SC5vMShzKSksaz1yKyItIitxKyItIitwKyIgIitvKyI6IituKyI6IittKyIuIitsCnJldHVybiBrfX0K
+UC5YUy5wcm90b3R5cGU9ewpnSUkoKXtyZXR1cm4gSC50cyh0aGlzLiR0aHJvd25Kc0Vycm9yKX19ClAu
+QzYucHJvdG90eXBlPXsKdyhhKXt2YXIgcz10aGlzLmEKaWYocyE9bnVsbClyZXR1cm4iQXNzZXJ0aW9u
+IGZhaWxlZDogIitQLmhsKHMpCnJldHVybiJBc3NlcnRpb24gZmFpbGVkIn19ClAuRXoucHJvdG90eXBl
+PXt9ClAuRi5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJUaHJvdyBvZiBudWxsLiJ9fQpQLkFULnByb3Rv
+dHlwZT17CmdaKCl7cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5hPyIocykiOiIiKX0sCmd1
+KCl7cmV0dXJuIiJ9LAp3KGEpe3ZhciBzLHIscT10aGlzLHA9cS5jLG89cD09bnVsbD8iIjoiICgiK3Ar
+IikiLG49cS5kLG09bj09bnVsbD8iIjoiOiAiK0guRWoobiksbD1xLmdaKCkrbyttCmlmKCFxLmEpcmV0
+dXJuIGwKcz1xLmd1KCkKcj1QLmhsKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnByb3RvdHlw
+ZT17CmdaKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3UoKXt2YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgpp
+ZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihxKToi
+IgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5Faihy
+KQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUgcmFuZ2UgIitILkVqKHIpKyIuLiIrSC5F
+aihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlk
+IHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVkucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4i
+UmFuZ2VFcnJvciJ9LApndSgpe2lmKEguSVoodGhpcy5iKTwwKXJldHVybiI6IGluZGV4IG11c3Qgbm90
+IGJlIG5lZ2F0aXZlIgp2YXIgcz10aGlzLmYKaWYocz09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUg
+dmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gIitzfSwKZ0EoYSl7cmV0dXJu
+IHRoaXMuZn19ClAubXAucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxq
+PXt9LGk9bmV3IFAuTSgiIikKai5hPSIiCnM9ay5jCmZvcihyPXMubGVuZ3RoLHE9MCxwPSIiLG89IiI7
+cTxyOysrcSxvPSIsICIpe249c1txXQppLmE9cCtvCnA9aS5hKz1QLmhsKG4pCmouYT0iLCAifWsuZC5L
+KDAsbmV3IFAuV0YoaixpKSkKbT1QLmhsKGsuYSkKbD1pLncoMCkKcj0iTm9TdWNoTWV0aG9kRXJyb3I6
+IG1ldGhvZCBub3QgZm91bmQ6ICciK2suYi5hKyInXG5SZWNlaXZlcjogIittKyJcbkFyZ3VtZW50czog
+WyIrbCsiXSIKcmV0dXJuIHJ9fQpQLnViLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIlVuc3VwcG9ydGVk
+IG9wZXJhdGlvbjogIit0aGlzLmF9fQpQLmRzLnByb3RvdHlwZT17CncoYSl7dmFyIHM9IlVuaW1wbGVt
+ZW50ZWRFcnJvcjogIit0aGlzLmEKcmV0dXJuIHN9fQpQLmxqLnByb3RvdHlwZT17CncoYSl7cmV0dXJu
+IkJhZCBzdGF0ZTogIit0aGlzLmF9fQpQLlVWLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5hCmlm
+KHM9PW51bGwpcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIgpy
+ZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIitQLmhsKHMpKyIu
+In19ClAuazUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApnSUkoKXtyZXR1
+cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJTdGFjayBPdmVyZmxv
+dyJ9LApnSUkoKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5wLnByb3RvdHlwZT17CncoYSl7dmFyIHM9
+IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICciK3RoaXMuYSsiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0
+aW9uIgpyZXR1cm4gc319ClAuQ0QucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3Ro
+aXMuYX0sCiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
+LGksaCxnPXRoaXMuYSxmPSIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK2c6IkZvcm1hdEV4Y2VwdGlv
+biIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmciKXtpZihlIT1udWxsKXM9ZTww
+fHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1udWxsKXtpZihkLmxlbmd0aD43
+OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9Zm9yKHI9MSxxPTAscD0hMSxv
+PTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEhPT1vfHwhcCkrK3IKcT1vKzEK
+cD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4xP2YrKCIgKGF0IGxpbmUgIity
+KyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNoYXJhY3RlciAiKyhlKzEpKyIp
+XG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8oZCxvKQppZihuPT09MTB8fG49
+PT0xMyl7bT1vCmJyZWFrfX1pZihtLXE+NzgpaWYoZS1xPDc1KXtsPXErNzUKaz1xCmo9IiIKaT0iLi4u
+In1lbHNle2lmKG0tZTw3NSl7az1tLTc1Cmw9bQppPSIifWVsc2V7az1lLTM2Cmw9ZSszNgppPSIuLi4i
+fWo9Ii4uLiJ9ZWxzZXtsPW0Kaz1xCmo9IiIKaT0iIn1oPUMueEIuTmooZCxrLGwpCnJldHVybiBmK2or
+aCtpKyJcbiIrQy54Qi5UKCIgIixlLWsrai5sZW5ndGgpKyJeXG4ifWVsc2UgcmV0dXJuIGUhPW51bGw/
+ZisoIiAoYXQgb2Zmc2V0ICIrSC5FaihlKSsiKSIpOmZ9LAokaVJ6OjF9ClAuY1gucHJvdG90eXBlPXsK
+ZHIoYSxiKXtyZXR1cm4gSC5HSih0aGlzLEguTGgodGhpcykuQygiY1guRSIpLGIpfSwKRTIoYSxiLGMp
+e3ZhciBzPUguTGgodGhpcykKcmV0dXJuIEguSzEodGhpcyxzLktxKGMpLkMoIjEoY1guRSkiKS5hKGIp
+LHMuQygiY1guRSIpLGMpfSwKZXYoYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5VNSh0
+aGlzLHMuQygiYTIoY1guRSkiKS5hKGIpLHMuQygiVTU8Y1guRT4iKSl9LAp0dChhLGIpe3JldHVybiBQ
+LlkxKHRoaXMsYixILkxoKHRoaXMpLkMoImNYLkUiKSl9LApicihhKXtyZXR1cm4gdGhpcy50dChhLCEw
+KX0sCmdBKGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQpmb3Iocz0wO3IuRigpOykrK3MKcmV0dXJuIHN9
+LApnbDAoYSl7cmV0dXJuIXRoaXMuZ20odGhpcykuRigpfSwKZ29yKGEpe3JldHVybiF0aGlzLmdsMCh0
+aGlzKX0sCmVSKGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmdy
+OChhKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKaWYoIXIuRigpKXRocm93IEguYihILldwKCkpCnM9ci5n
+bCgpCmlmKHIuRigpKXRocm93IEguYihILkFtKCkpCnJldHVybiBzfSwKRShhLGIpe3ZhciBzLHIscQpQ
+LmsxKGIsImluZGV4IikKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7KXtxPXMuZ2woKQppZihi
+PT09cilyZXR1cm4gcTsrK3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxyKSl9LAp3
+KGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLk4zLnByb3Rv
+dHlwZT17CncoYSl7cmV0dXJuIk1hcEVudHJ5KCIrSC5Faih0aGlzLmEpKyI6ICIrSC5Faih0aGlzLmIp
+KyIpIn19ClAuYzgucHJvdG90eXBlPXsKZ2lPKGEpe3JldHVybiBQLk1oLnByb3RvdHlwZS5naU8uY2Fs
+bCh0aGlzLHRoaXMpfSwKdyhhKXtyZXR1cm4ibnVsbCJ9fQpQLk1oLnByb3RvdHlwZT17JGlNaDoxLApE
+TihhLGIpe3JldHVybiB0aGlzPT09Yn0sCmdpTyhhKXtyZXR1cm4gSC5lUSh0aGlzKX0sCncoYSl7cmV0
+dXJuIkluc3RhbmNlIG9mICciK0gubGgodGhpcykrIicifSwKZTcoYSxiKXt0Lm8uYShiKQp0aHJvdyBI
+LmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmluZygpe3JldHVybiB0
+aGlzLncodGhpcyl9fQpQLlpkLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAuTS5w
+cm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCncoYSl7dmFyIHM9dGhpcy5hCnJl
+dHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKJGlCTDoxfQpQLm4xLnByb3RvdHlwZT17CiQyKGEs
+Yil7dmFyIHMscixxLHAKdC5FLmEoYSkKSC5uKGIpCnM9Qy54Qi5PWShiLCI9IikKaWYocz09PS0xKXtp
+ZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMuYSwhMCksIiIpfWVsc2UgaWYocyE9
+PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLnluKGIscysxKQpwPXRoaXMuYQphLlk1KDAsUC5rdShy
+LDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAscS5sZW5ndGgscCwhMCkpfXJldHVybiBhfSwKJFM6MjZ9
+ClAuY1MucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY0IGFkZHJl
+c3MsICIrYSx0aGlzLmEsYikpfSwKJFM6MjR9ClAuVkMucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBI
+LmIoUC5ycigiSWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJDEoYSl7cmV0dXJu
+IHRoaXMuJDIoYSxudWxsKX0sCiRTOjE5fQpQLkpULnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMKaWYo
+Yi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2Yg
+NCBoZXggZGlnaXRzIixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIsYSxiKSwxNikKaWYoczwwfHxzPjY1
+NTM1KXRoaXMuYS4kMigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZG
+RmAiLGEpCnJldHVybiBzfSwKJFM6MjB9ClAuRG4ucHJvdG90eXBlPXsKZ25EKCl7dmFyIHMscixxLHA9
+dGhpcyxvPXAueAppZihvPT1udWxsKXtvPXAuYQpzPW8ubGVuZ3RoIT09MD8iIitvKyI6IjoiIgpyPXAu
+YwpxPXI9PW51bGwKaWYoIXF8fG89PT0iZmlsZSIpe289cysiLy8iCnM9cC5iCmlmKHMubGVuZ3RoIT09
+MClvPW8rcysiQCIKaWYoIXEpbys9cgpzPXAuZAppZihzIT1udWxsKW89bysiOiIrSC5FaihzKX1lbHNl
+IG89cwpvKz1wLmUKcz1wLmYKaWYocyE9bnVsbClvPW8rIj8iK3MKcz1wLnIKaWYocyE9bnVsbClvPW8r
+IiMiK3MKbz1vLmNoYXJDb2RlQXQoMCk9PTA/bzpvCmlmKHAueD09bnVsbClwLng9bwplbHNlIG89SC52
+KEguaigiX3RleHQiKSl9cmV0dXJuIG99LApnRmooKXt2YXIgcyxyPXRoaXMscT1yLnkKaWYocT09bnVs
+bCl7cz1yLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09PTQ3KXM9Qy54Qi55bihzLDEpCnE9
+cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlFJKHMuc3BsaXQoIi8iKSx0LnMpLHQuZE8u
+YShQLlBIKCkpLHQuZG8pLHQuTikKaWYoci55PT1udWxsKXIuc0twKHEpCmVsc2UgcT1ILnYoSC5qKCJw
+YXRoU2VnbWVudHMiKSl9cmV0dXJuIHF9LApnaU8oYSl7dmFyIHM9dGhpcyxyPXMuegppZihyPT1udWxs
+KXtyPUMueEIuZ2lPKHMuZ25EKCkpCmlmKHMuej09bnVsbClzLno9cgplbHNlIHI9SC52KEguaigiaGFz
+aENvZGUiKSl9cmV0dXJuIHJ9LApnaFkoKXt2YXIgcz10aGlzLHI9cy5RCmlmKHI9PW51bGwpe3I9cy5m
+CnI9bmV3IFAuR2ooUC5XWChyPT1udWxsPyIiOnIpLHQuZHcpCmlmKHMuUT09bnVsbClzLnNOTShyKQpl
+bHNlIHI9SC52KEguaigicXVlcnlQYXJhbWV0ZXJzIikpfXJldHVybiByfSwKZ2t1KCl7cmV0dXJuIHRo
+aXMuYn0sCmdKZihhKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbClyZXR1cm4iIgppZihDLnhCLm4ocywi
+WyIpKXJldHVybiBDLnhCLk5qKHMsMSxzLmxlbmd0aC0xKQpyZXR1cm4gc30sCmd0cChhKXt2YXIgcz10
+aGlzLmQKcmV0dXJuIHM9PW51bGw/UC53Syh0aGlzLmEpOnN9LApndFAoKXt2YXIgcz10aGlzLmYKcmV0
+dXJuIHM9PW51bGw/IiI6c30sCmdLYSgpe3ZhciBzPXRoaXMucgpyZXR1cm4gcz09bnVsbD8iIjpzfSwK
+aEIoYSl7dmFyIHM9dGhpcy5hCmlmKGEubGVuZ3RoIT09cy5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIFAu
+TlIoYSxzKX0sCm5tKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9dGhpcwp0LmM5LmEoYikKcz1q
+LmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5jCmlmKCEobyE9bnVsbCkpbz1xLmxlbmd0aCE9
+PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZighciltPW8hPW51bGwmJm4ubGVuZ3RoIT09MApl
+bHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0iLyIrbgpsPW4Kaz1QLmxlKG51bGwsMCwwLGIp
+CnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmgoYSxiKXt2YXIgcyxyLHEscCxvLG4K
+Zm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9MzsrK3N9cT1DLnhCLmNuKGEsIi8iKQp3
+aGlsZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBrKGEsIi8iLHEtMSkKaWYocDwwKWJy
+ZWFrCm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIuTyhhLHArMSk9PT00NiluPSFufHxD
+LnhCLk8oYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKWJyZWFrOy0tcwpxPXB9cmV0
+dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLnluKGIsci0zKnMpKX0sClpJKGEpe3JldHVybiB0aGlz
+Lm1TKFAuaEsoYSkpfSwKbVMoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbApp
+ZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
+ZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aH1lbHNle3A9aApxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkp
+Cm49YS5nUUQoKT9hLmd0UCgpOmh9ZWxzZXtzPWkuYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
+ZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTpoLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgp
+P2EuZ3RQKCk6aH1lbHNle3I9aS5iCnE9aS5jCnA9aS5kCm89aS5lCmlmKGEuZ0lpKGEpPT09IiIpbj1h
+LmdRRCgpP2EuZ3RQKCk6aS5mCmVsc2V7bT1QLnVqKGksbykKaWYobT4wKXtsPUMueEIuTmoobywwLG0p
+Cm89YS5ndFQoKT9sK1AueGUoYS5nSWkoYSkpOmwrUC54ZShpLkpoKEMueEIueW4obyxsLmxlbmd0aCks
+YS5nSWkoYSkpKX1lbHNlIGlmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNlIGlmKG8ubGVuZ3Ro
+PT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ug
+bz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtrPWkuSmgobyxhLmdJaShhKSkKaj1zLmxlbmd0aD09PTAK
+aWYoIWp8fHEhPW51bGx8fEMueEIubihvLCIvIikpbz1QLnhlKGspCmVsc2Ugbz1QLndGKGssIWp8fHEh
+PW51bGwpfW49YS5nUUQoKT9hLmd0UCgpOmh9fX1yZXR1cm4gbmV3IFAuRG4ocyxyLHEscCxvLG4sYS5n
+WjgoKT9hLmdLYSgpOmgpfSwKZ2NqKCl7cmV0dXJuIHRoaXMuYyE9bnVsbH0sCmd4QSgpe3JldHVybiB0
+aGlzLmQhPW51bGx9LApnUUQoKXtyZXR1cm4gdGhpcy5mIT1udWxsfSwKZ1o4KCl7cmV0dXJuIHRoaXMu
+ciE9bnVsbH0sCmd0VCgpe3JldHVybiBDLnhCLm4odGhpcy5lLCIvIil9LAp0NCgpe3ZhciBzLHI9dGhp
+cyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
+IGEgZmlsZSBwYXRoIGZyb20gYSAiK3ErIiBVUkkiKSkKcT1yLmYKaWYoKHE9PW51bGw/IiI6cSkhPT0i
+Iil0aHJvdyBILmIoUC5MNCh1LmkpKQpxPXIucgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEgu
+YihQLkw0KHUubCkpCnE9JC53USgpCmlmKHEpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdK
+ZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC5sKEMueEIubihy
+LmUsIi8iKT8iIisiLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0KDApPT0wP3E6cX1yZXR1cm4gcX0s
+CncoYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETihhLGIpe3ZhciBzLHIscT10aGlzCmlmKGI9PW51bGwp
+cmV0dXJuITEKaWYocT09PWIpcmV0dXJuITAKaWYodC5kRC5iKGIpKWlmKHEuYT09PWIuZ0ZpKCkpaWYo
+cS5jIT1udWxsPT09Yi5nY2ooKSlpZihxLmI9PT1iLmdrdSgpKWlmKHEuZ0pmKHEpPT09Yi5nSmYoYikp
+aWYocS5ndHAocSk9PT1iLmd0cChiKSlpZihxLmU9PT1iLmdJaShiKSl7cz1xLmYKcj1zPT1udWxsCmlm
+KCFyPT09Yi5nUUQoKSl7aWYocilzPSIiCmlmKHM9PT1iLmd0UCgpKXtzPXEucgpyPXM9PW51bGwKaWYo
+IXI9PT1iLmdaOCgpKXtpZihyKXM9IiIKcz1zPT09Yi5nS2EoKX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVs
+c2Ugcz0hMX1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKZWxzZSBzPSExCmVs
+c2Ugcz0hMQplbHNlIHM9ITEKcmV0dXJuIHN9LApzS3AoYSl7dGhpcy55PXQuYmsuYShhKX0sCnNOTShh
+KXt0aGlzLlE9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmkoKXtyZXR1cm4gdGhpcy5hfSwKZ0lpKGEpe3Jl
+dHVybiB0aGlzLmV9fQpQLlJaLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBQLmVQKEMuWkosSC5uKGEp
+LEMueE0sITEpfSwKJFM6Mn0KUC5NRS5wcm90b3R5cGU9ewokMihhLGIpe3ZhciBzPXRoaXMuYixyPXRo
 aXMuYQpzLmErPXIuYQpyLmE9IiYiCnI9cy5hKz1QLmVQKEMuRjMsYSxDLnhNLCEwKQppZihiIT1udWxs
 JiZiLmxlbmd0aCE9PTApe3MuYT1yKyI9IgpzLmErPVAuZVAoQy5GMyxiLEMueE0sITApfX0sCiRTOjIy
-fQpQLnk1LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILm4oYSkKaWYoYj09bnVs
-bHx8dHlwZW9mIGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBmb3Iocz1KLklUKHQu
-Ui5hKGIpKSxyPXRoaXMuYTtzLkYoKTspci4kMihhLEgubihzLmdsKCkpKX0sCiRTOjExfQpQLlBFLnBy
-b3RvdHlwZT17CmdsUjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMKaWYo
-bT09bnVsbCl7bT1vLmIKaWYoMD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1bMF0r
-MQpyPUMueEIuWFUocywiPyIsbSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxDLlZD
-LCExKQpxPXJ9ZWxzZSBwPW4KbT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxxLEMu
-V2QsITEpLHAsbil9cmV0dXJuIG19LAp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIu
-bGVuZ3RoKXJldHVybiBILk9IKHIsMCkKcz10aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6
-c319ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEKaWYoYT49cy5s
-ZW5ndGgpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5kdShzLDAsOTYsYikKcmV0dXJuIHN9LAok
-UzoyM30KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxCmZvcihzPWIu
-bGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2KXJldHVybiBILk9IKGEs
-cSkKYVtxXT1jfX0sCiRTOjE4fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0oc145Nik+Pj4w
-CmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLlVmLnByb3RvdHlwZT17
-CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3JldHVybiB0aGlz
-LmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9
-LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApndFQ6ZnVuY3Rpb24o
-KXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rpb24oKXt2YXIgcz10
-aGlzLngKcmV0dXJuIHM9PW51bGw/dGhpcy54PXRoaXMuVTIoKTpzfSwKVTI6ZnVuY3Rpb24oKXt2YXIg
-cyxyPXRoaXMscT1yLmIKaWYocTw9MClyZXR1cm4iIgpzPXE9PT00CmlmKHMmJkMueEIubihyLmEsImh0
-dHAiKSlyZXR1cm4iaHR0cCIKaWYocT09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuImh0dHBz
-IgppZihzJiZDLnhCLm4oci5hLCJmaWxlIikpcmV0dXJuImZpbGUiCmlmKHE9PT03JiZDLnhCLm4oci5h
-LCJwYWNrYWdlIikpcmV0dXJuInBhY2thZ2UiCnJldHVybiBDLnhCLk5qKHIuYSwwLHEpfSwKZ2t1OmZ1
-bmN0aW9uKCl7dmFyIHM9dGhpcy5jLHI9dGhpcy5iKzMKcmV0dXJuIHM+cj9DLnhCLk5qKHRoaXMuYSxy
-LHMtMSk6IiJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5jCnJldHVybiBzPjA/Qy54Qi5Oaih0
-aGlzLmEscyx0aGlzLmQpOiIifSwKZ3RwOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwppZihyLmd4QSgp
-KXJldHVybiBQLlFBKEMueEIuTmooci5hLHIuZCsxLHIuZSksbnVsbCkKcz1yLmIKaWYocz09PTQmJkMu
-eEIubihyLmEsImh0dHAiKSlyZXR1cm4gODAKaWYocz09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0
-dXJuIDQ0MwpyZXR1cm4gMH0sCmdJaTpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi5Oaih0aGlzLmEsdGhp
-cy5lLHRoaXMuZil9LApndFA6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmYscj10aGlzLnIKcmV0dXJuIHM8
-cj9DLnhCLk5qKHRoaXMuYSxzKzEscik6IiJ9LApnS2E6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLnIscj10
-aGlzLmEKcmV0dXJuIHM8ci5sZW5ndGg/Qy54Qi55bihyLHMrMSk6IiJ9LApnRmo6ZnVuY3Rpb24oKXt2
+fQpQLnk1LnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMscgpILm4oYSkKaWYoYj09bnVsbHx8dHlwZW9m
+IGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBmb3Iocz1KLklUKHQuUi5hKGIpKSxy
+PXRoaXMuYTtzLkYoKTspci4kMihhLEgubihzLmdsKCkpKX0sCiRTOjExfQpQLlBFLnByb3RvdHlwZT17
+CmdsUigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMKaWYobT09bnVsbCl7bT1vLmIKaWYo
+MD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1bMF0rMQpyPUMueEIuWFUocywiPyIs
+bSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxDLlZDLCExKQpxPXJ9ZWxzZSBwPW4K
+bT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxxLEMuV2QsITEpLHAsbil9cmV0dXJu
+IG19LAp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIubGVuZ3RoKXJldHVybiBILk9IKHIsMCkKcz10
+aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6c319ClAueUkucHJvdG90eXBlPXsKJDIoYSxi
+KXt2YXIgcz10aGlzLmEKaWYoYT49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5k
+dShzLDAsOTYsYikKcmV0dXJuIHN9LAokUzoyM30KUC5jNi5wcm90b3R5cGU9ewokMyhhLGIsYyl7dmFy
+IHMscixxCmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2
+KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLnFkLnByb3RvdHlwZT17CiQzKGEsYixj
+KXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0oc145
+Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLlVmLnByb3Rv
+dHlwZT17Cmdjaigpe3JldHVybiB0aGlzLmM+MH0sCmd4QSgpe3JldHVybiB0aGlzLmM+MCYmdGhpcy5k
+KzE8dGhpcy5lfSwKZ1FEKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9LApnWjgoKXtyZXR1cm4gdGhpcy5y
+PHRoaXMuYS5sZW5ndGh9LApndFQoKXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApn
+RmkoKXt2YXIgcz10aGlzLngKcmV0dXJuIHM9PW51bGw/dGhpcy54PXRoaXMuVTIoKTpzfSwKVTIoKXt2
+YXIgcyxyPXRoaXMscT1yLmIKaWYocTw9MClyZXR1cm4iIgpzPXE9PT00CmlmKHMmJkMueEIubihyLmEs
+Imh0dHAiKSlyZXR1cm4iaHR0cCIKaWYocT09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuImh0
+dHBzIgppZihzJiZDLnhCLm4oci5hLCJmaWxlIikpcmV0dXJuImZpbGUiCmlmKHE9PT03JiZDLnhCLm4o
+ci5hLCJwYWNrYWdlIikpcmV0dXJuInBhY2thZ2UiCnJldHVybiBDLnhCLk5qKHIuYSwwLHEpfSwKZ2t1
+KCl7dmFyIHM9dGhpcy5jLHI9dGhpcy5iKzMKcmV0dXJuIHM+cj9DLnhCLk5qKHRoaXMuYSxyLHMtMSk6
+IiJ9LApnSmYoYSl7dmFyIHM9dGhpcy5jCnJldHVybiBzPjA/Qy54Qi5Oaih0aGlzLmEscyx0aGlzLmQp
+OiIifSwKZ3RwKGEpe3ZhciBzLHI9dGhpcwppZihyLmd4QSgpKXJldHVybiBQLlFBKEMueEIuTmooci5h
+LHIuZCsxLHIuZSksbnVsbCkKcz1yLmIKaWYocz09PTQmJkMueEIubihyLmEsImh0dHAiKSlyZXR1cm4g
+ODAKaWYocz09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCmdJaShh
+KXtyZXR1cm4gQy54Qi5Oaih0aGlzLmEsdGhpcy5lLHRoaXMuZil9LApndFAoKXt2YXIgcz10aGlzLmYs
+cj10aGlzLnIKcmV0dXJuIHM8cj9DLnhCLk5qKHRoaXMuYSxzKzEscik6IiJ9LApnS2EoKXt2YXIgcz10
+aGlzLnIscj10aGlzLmEKcmV0dXJuIHM8ci5sZW5ndGg/Qy54Qi55bihyLHMrMSk6IiJ9LApnRmooKXt2
 YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMueEIuUWkobywiLyIscSkpKytxCmlm
 KHE9PT1wKXJldHVybiBDLnhECnM9SC5RSShbXSx0LnMpCmZvcihyPXE7cjxwOysrcilpZihDLnhCLk8o
 byxyKT09PTQ3KXtDLk5tLmkocyxDLnhCLk5qKG8scSxyKSkKcT1yKzF9Qy5ObS5pKHMsQy54Qi5Oaihv
-LHEscCkpCnJldHVybiBQLkFGKHMsdC5OKX0sCmdoWTpmdW5jdGlvbigpe2lmKHRoaXMuZj49dGhpcy5y
-KXJldHVybiBDLkNNCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHQuZHcpfSwKa1g6ZnVu
-Y3Rpb24oYSl7dmFyIHM9dGhpcy5kKzEKcmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIuUWko
-dGhpcy5hLGEscyl9LApOOTpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5s
-ZW5ndGgpcmV0dXJuIHMKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMu
-ZSxzLmYscixzLngpfSwKbm06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPXRo
-aXMsaD1udWxsCnQuYzkuYShiKQpzPWkuZ0ZpKCkKcj1zPT09ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIu
-TmooaS5hLGkuYiszLHEpOiIiCm89aS5neEEoKT9pLmd0cChpKTpoCnE9aS5jCmlmKHE+MCluPUMueEIu
-TmooaS5hLHEsaS5kKQplbHNlIG49cC5sZW5ndGghPT0wfHxvIT1udWxsfHxyPyIiOmgKcT1pLmEKbT1D
-LnhCLk5qKHEsaS5lLGkuZikKaWYoIXIpbD1uIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlm
-KGwmJiFDLnhCLm4obSwiLyIpKW09Ii8iK20Kaz1QLmxlKGgsMCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0
-aD9DLnhCLnluKHEsbCsxKTpoCnJldHVybiBuZXcgUC5EbihzLHAsbixvLG0sayxqKX0sClpJOmZ1bmN0
-aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5j
-ZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4gdGhpcy5SZSgpLm1TKGEpfSwKdTE6
-ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjPWIuYgppZihj
-PjApcmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgppZihyPD0wKXJldHVybiBiCnE9cj09PTQKaWYo
-cSYmQy54Qi5uKGEuYSwiZmlsZSIpKXA9Yi5lIT09Yi5mCmVsc2UgaWYocSYmQy54Qi5uKGEuYSwiaHR0
-cCIpKXA9IWIua1goIjgwIikKZWxzZSBwPSEocj09PTUmJkMueEIubihhLmEsImh0dHBzIikpfHwhYi5r
-WCgiNDQzIikKaWYocCl7bz1yKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsbykrQy54Qi55
-bihiLmEsYysxKSxyLHMrbyxiLmQrbyxiLmUrbyxiLmYrbyxiLnIrbyxhLngpfWVsc2UgcmV0dXJuIHRo
-aXMuUmUoKS5tUyhiKX1uPWIuZQpjPWIuZgppZihuPT09Yyl7cz1iLnIKaWYoYzxzKXtyPWEuZgpvPXIt
-YwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnluKGIuYSxjKSxhLmIsYS5jLGEu
-ZCxhLmUsYytvLHMrbyxhLngpfWM9Yi5hCmlmKHM8Yy5sZW5ndGgpe3I9YS5yCnJldHVybiBuZXcgUC5V
-ZihDLnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYyxzKSxhLmIsYS5jLGEuZCxhLmUsYS5mLHMrKHItcyks
-YS54KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIuUWkocywiLyIsbikpe209YS5lCmw9UC5SeCh0
-aGlzKQprPWw+MD9sOm0Kbz1rLW4KcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsaykrQy54Qi55
-bihzLG4pLGEuYixhLmMsYS5kLG0sYytvLGIucitvLGEueCl9aj1hLmUKaT1hLmYKaWYoaj09PWkmJmEu
-Yz4wKXtmb3IoO0MueEIuUWkocywiLi4vIixuKTspbis9MwpvPWotbisxCnJldHVybiBuZXcgUC5VZihD
-LnhCLk5qKGEuYSwwLGopKyIvIitDLnhCLnluKHMsbiksYS5iLGEuYyxhLmQsaixjK28sYi5yK28sYS54
-KX1oPWEuYQpsPVAuUngodGhpcykKaWYobD49MClnPWwKZWxzZSBmb3IoZz1qO0MueEIuUWkoaCwiLi4v
-IixnKTspZys9MwpmPTAKd2hpbGUoITApe2U9biszCmlmKCEoZTw9YyYmQy54Qi5RaShzLCIuLi8iLG4p
-KSlicmVhazsrK2YKbj1lfWZvcihkPSIiO2k+Zzspey0taQppZihDLnhCLk8oaCxpKT09PTQ3KXtpZihm
-PT09MCl7ZD0iLyIKYnJlYWt9LS1mCmQ9Ii8ifX1pZihpPT09ZyYmYS5iPD0wJiYhQy54Qi5RaShoLCIv
-IixqKSl7bi09ZiozCmQ9IiJ9bz1pLW4rZC5sZW5ndGgKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooaCww
-LGkpK2QrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLGosYytvLGIucitvLGEueCl9LAp0NDpmdW5jdGlv
-bigpe3ZhciBzLHIscT10aGlzLHA9cS5iCmlmKHA+PTApe3M9IShwPT09NCYmQy54Qi5uKHEuYSwiZmls
-ZSIpKQpwPXN9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmls
-ZSBwYXRoIGZyb20gYSAiK3EuZ0ZpKCkrIiBVUkkiKSkKcD1xLmYKcz1xLmEKaWYocDxzLmxlbmd0aCl7
-aWYocDxxLnIpdGhyb3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9cj0kLndRKCkK
-aWYocilwPVAubW4ocSkKZWxzZXtpZihxLmM8cS5kKUgudihQLkw0KHUuaikpCnA9Qy54Qi5OaihzLHEu
-ZSxwKX1yZXR1cm4gcH0sCmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/
-dGhpcy55PUMueEIuZ2lPKHRoaXMuYSk6c30sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1
-cm4hMQppZih0aGlzPT09YilyZXR1cm4hMApyZXR1cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9
-LApSZTpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1udWxsLHE9cy5nRmkoKSxwPXMuZ2t1KCksbz1zLmM+
-MD9zLmdKZihzKTpyLG49cy5neEEoKT9zLmd0cChzKTpyLG09cy5hLGw9cy5mLGs9Qy54Qi5OaihtLHMu
-ZSxsKSxqPXMucgpsPWw8aj9zLmd0UCgpOnIKcmV0dXJuIG5ldyBQLkRuKHEscCxvLG4sayxsLGo8bS5s
-ZW5ndGg/cy5nS2EoKTpyKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5x
-ZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9ewpzTFU6ZnVuY3Rp
-b24oYSxiKXthLmhyZWY9Yn0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpR2g6MX0K
-Vy5mWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLnJaLnByb3Rv
-dHlwZT17JGlyWjoxfQpXLkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17JGlRUDox
-fQpXLm54LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJv
-dG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30K
-Vy5RRi5wcm90b3R5cGU9e30KVy5OaC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJp
-bmcoYSl9fQpXLmFlLnByb3RvdHlwZT17CkRjOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuY3JlYXRlSFRN
-TERvY3VtZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9YS5sZWZ0
+LHEscCkpCnJldHVybiBQLkFGKHMsdC5OKX0sCmdoWSgpe2lmKHRoaXMuZj49dGhpcy5yKXJldHVybiBD
+LkNNCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHQuZHcpfSwKa1goYSl7dmFyIHM9dGhp
+cy5kKzEKcmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIuUWkodGhpcy5hLGEscyl9LApOOSgp
+e3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5sZW5ndGgpcmV0dXJuIHMKcmV0dXJuIG5ldyBQ
+LlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMuZSxzLmYscixzLngpfSwKbm0oYSxiKXt2YXIg
+cyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnQuYzkuYShiKQpzPWkuZ0ZpKCkKcj1zPT09
+ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIuTmooaS5hLGkuYiszLHEpOiIiCm89aS5neEEoKT9pLmd0cChp
+KTpoCnE9aS5jCmlmKHE+MCluPUMueEIuTmooaS5hLHEsaS5kKQplbHNlIG49cC5sZW5ndGghPT0wfHxv
+IT1udWxsfHxyPyIiOmgKcT1pLmEKbT1DLnhCLk5qKHEsaS5lLGkuZikKaWYoIXIpbD1uIT1udWxsJiZt
+Lmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwiLyIpKW09Ii8iK20Kaz1QLmxlKGgs
+MCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0aD9DLnhCLnluKHEsbCsxKTpoCnJldHVybiBuZXcgUC5Ebihz
+LHAsbixvLG0sayxqKX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVMoYSl7aWYoYSBp
+bnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4gdGhpcy5SZSgpLm1TKGEp
+fSwKdTEoYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjPWIuYgppZihjPjAp
+cmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgppZihyPD0wKXJldHVybiBiCnE9cj09PTQKaWYocSYm
+Qy54Qi5uKGEuYSwiZmlsZSIpKXA9Yi5lIT09Yi5mCmVsc2UgaWYocSYmQy54Qi5uKGEuYSwiaHR0cCIp
+KXA9IWIua1goIjgwIikKZWxzZSBwPSEocj09PTUmJkMueEIubihhLmEsImh0dHBzIikpfHwhYi5rWCgi
+NDQzIikKaWYocCl7bz1yKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsbykrQy54Qi55bihi
+LmEsYysxKSxyLHMrbyxiLmQrbyxiLmUrbyxiLmYrbyxiLnIrbyxhLngpfWVsc2UgcmV0dXJuIHRoaXMu
+UmUoKS5tUyhiKX1uPWIuZQpjPWIuZgppZihuPT09Yyl7cz1iLnIKaWYoYzxzKXtyPWEuZgpvPXItYwpy
+ZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnluKGIuYSxjKSxhLmIsYS5jLGEuZCxh
+LmUsYytvLHMrbyxhLngpfWM9Yi5hCmlmKHM8Yy5sZW5ndGgpe3I9YS5yCnJldHVybiBuZXcgUC5VZihD
+LnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYyxzKSxhLmIsYS5jLGEuZCxhLmUsYS5mLHMrKHItcyksYS54
+KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIuUWkocywiLyIsbikpe209YS5lCmw9UC5SeCh0aGlz
+KQprPWw+MD9sOm0Kbz1rLW4KcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsaykrQy54Qi55bihz
+LG4pLGEuYixhLmMsYS5kLG0sYytvLGIucitvLGEueCl9aj1hLmUKaT1hLmYKaWYoaj09PWkmJmEuYz4w
+KXtmb3IoO0MueEIuUWkocywiLi4vIixuKTspbis9MwpvPWotbisxCnJldHVybiBuZXcgUC5VZihDLnhC
+Lk5qKGEuYSwwLGopKyIvIitDLnhCLnluKHMsbiksYS5iLGEuYyxhLmQsaixjK28sYi5yK28sYS54KX1o
+PWEuYQpsPVAuUngodGhpcykKaWYobD49MClnPWwKZWxzZSBmb3IoZz1qO0MueEIuUWkoaCwiLi4vIixn
+KTspZys9MwpmPTAKd2hpbGUoITApe2U9biszCmlmKCEoZTw9YyYmQy54Qi5RaShzLCIuLi8iLG4pKSli
+cmVhazsrK2YKbj1lfWZvcihkPSIiO2k+Zzspey0taQppZihDLnhCLk8oaCxpKT09PTQ3KXtpZihmPT09
+MCl7ZD0iLyIKYnJlYWt9LS1mCmQ9Ii8ifX1pZihpPT09ZyYmYS5iPD0wJiYhQy54Qi5RaShoLCIvIixq
+KSl7bi09ZiozCmQ9IiJ9bz1pLW4rZC5sZW5ndGgKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooaCwwLGkp
+K2QrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLGosYytvLGIucitvLGEueCl9LAp0NCgpe3ZhciBzLHIs
+cT10aGlzLHA9cS5iCmlmKHA+PTApe3M9IShwPT09NCYmQy54Qi5uKHEuYSwiZmlsZSIpKQpwPXN9ZWxz
+ZSBwPSExCmlmKHApdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
+YSAiK3EuZ0ZpKCkrIiBVUkkiKSkKcD1xLmYKcz1xLmEKaWYocDxzLmxlbmd0aCl7aWYocDxxLnIpdGhy
+b3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9cj0kLndRKCkKaWYocilwPVAubW4o
+cSkKZWxzZXtpZihxLmM8cS5kKUgudihQLkw0KHUuaikpCnA9Qy54Qi5OaihzLHEuZSxwKX1yZXR1cm4g
+cH0sCmdpTyhhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/dGhpcy55PUMueEIuZ2lPKHRoaXMu
+YSk6c30sCkROKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQppZih0aGlzPT09YilyZXR1cm4hMApyZXR1
+cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZSgpe3ZhciBzPXRoaXMscj1udWxsLHE9cy5n
+RmkoKSxwPXMuZ2t1KCksbz1zLmM+MD9zLmdKZihzKTpyLG49cy5neEEoKT9zLmd0cChzKTpyLG09cy5h
+LGw9cy5mLGs9Qy54Qi5OaihtLHMuZSxsKSxqPXMucgpsPWw8aj9zLmd0UCgpOnIKcmV0dXJuIG5ldyBQ
+LkRuKHEscCxvLG4sayxsLGo8bS5sZW5ndGg/cy5nS2EoKTpyKX0sCncoYSl7cmV0dXJuIHRoaXMuYX0s
+CiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9
+ewpzTFUoYSxiKXthLmhyZWY9Yn0sCncoYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpR2g6MX0KVy5mWS5w
+cm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLnJaLnByb3RvdHlwZT17JGlyWjoxfQpX
+LkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17JGlRUDoxfQpXLm54LnByb3RvdHlw
+ZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEu
+bGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5RRi5wcm90b3R5cGU9e30KVy5OaC5wcm90b3R5cGU9
+ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLmFlLnByb3RvdHlwZT17CkRjKGEsYil7cmV0dXJuIGEu
+Y3JlYXRlSFRNTERvY3VtZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9YS5sZWZ0
 CnIudG9TdHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwgIgpzPWEudG9wCnMudG9TdHJpbmcK
 cz1yK0guRWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpyPXMrSC5FaihyKSsiIHggIgpzPWEu
-aGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkROOmZ1bmN0aW9uKGEsYil7dmFyIHMs
-cgppZihiPT1udWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRvU3RyaW5nCnI9Yi5s
-ZWZ0CnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIudG9wCnIudG9TdHJp
-bmcKaWYocz09PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRvU3RyaW5nCmlmKHM9
-PT1yKXtzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5nCnI9cz09PXIKcz1y
-fWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4gc30sCmdpTzpmdW5j
-dGlvbihhKXt2YXIgcyxyLHEscD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50b3AK
-cy50b1N0cmluZwpzPUMuQ0QuZ2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8ocikK
-cT1hLmhlaWdodApxLnRvU3RyaW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRpdG46
-MX0KVy5uNy5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnBy
-b3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcTpmdW5jdGlvbihh
-LGIpe3ZhciBzCkguSVooYikKcz10aGlzLmEKaWYoYjwwfHxiPj1zLmxlbmd0aClyZXR1cm4gSC5PSChz
-LGIpCnJldHVybiB0aGlzLiR0aS5jLmEoc1tiXSl9LApZNTpmdW5jdGlvbihhLGIsYyl7dGhpcy4kdGku
-Yy5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlw
-ZT17CmdRZzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApnUDpmdW5jdGlvbihhKXtyZXR1
-cm4gbmV3IFcuSTQoYSl9LApzUDpmdW5jdGlvbihhLGIpe3ZhciBzCnQuTy5hKGIpCnM9dGhpcy5nUChh
-KQpzLlYxKDApCnMuRlYoMCxiKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKRkY6
-ZnVuY3Rpb24oYSl7dmFyIHM9ISFhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQKaWYocylhLnNjcm9sbElu
-dG9WaWV3SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50b1ZpZXcoKX0sCm56OmZ1bmN0aW9uKGEsYixj
-LGQsZSl7dmFyIHMscj10aGlzLnI2KGEsYyxkLGUpCnN3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2Ui
-YmVmb3JlYmVnaW4iOnM9YS5wYXJlbnROb2RlCnMudG9TdHJpbmcKSi5FaChzLHIsYSkKYnJlYWsKY2Fz
-ZSJhZnRlcmJlZ2luIjpzPWEuY2hpbGROb2Rlcwp0aGlzLm1LKGEscixzLmxlbmd0aD4wP3NbMF06bnVs
-bCkKYnJlYWsKY2FzZSJiZWZvcmVlbmQiOmEuYXBwZW5kQ2hpbGQocikKYnJlYWsKY2FzZSJhZnRlcmVu
-ZCI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmluZwpKLkVoKHMscixhLm5leHRTaWJsaW5nKQpicmVhawpk
-ZWZhdWx0OkgudihQLnhZKCJJbnZhbGlkIHBvc2l0aW9uICIrYikpfX0sCnI2OmZ1bmN0aW9uKGEsYixj
-LGQpe3ZhciBzLHIscSxwCmlmKGM9PW51bGwpe2lmKGQ9PW51bGwpe3M9JC5sdAppZihzPT1udWxsKXtz
-PUguUUkoW10sdC5yKQpyPW5ldyBXLnZEKHMpCkMuTm0uaShzLFcuVHcobnVsbCkpCkMuTm0uaShzLFcu
-QmwoKSkKJC5sdD1yCmQ9cn1lbHNlIGQ9c31zPSQuRVUKaWYocz09bnVsbCl7cz1uZXcgVy5LbyhkKQok
-LkVVPXMKYz1zfWVsc2V7cy5hPWQKYz1zfX1lbHNlIGlmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoInZh
-bGlkYXRvciBjYW4gb25seSBiZSBwYXNzZWQgaWYgdHJlZVNhbml0aXplciBpcyBudWxsIikpCmlmKCQu
-eG89PW51bGwpe3M9ZG9jdW1lbnQKcj1zLmltcGxlbWVudGF0aW9uCnIudG9TdHJpbmcKcj1DLm1ILkRj
-KHIsIiIpCiQueG89cgokLkJPPXIuY3JlYXRlUmFuZ2UoKQpyPSQueG8uY3JlYXRlRWxlbWVudCgiYmFz
-ZSIpCnQuY1IuYShyKQpzPXMuYmFzZVVSSQpzLnRvU3RyaW5nCnIuaHJlZj1zCiQueG8uaGVhZC5hcHBl
-bmRDaGlsZChyKX1zPSQueG8KaWYocy5ib2R5PT1udWxsKXtyPXMuY3JlYXRlRWxlbWVudCgiYm9keSIp
-CkMuQlouc0dTKHMsdC5rLmEocikpfXM9JC54bwppZih0LmsuYihhKSl7cz1zLmJvZHkKcy50b1N0cmlu
-ZwpxPXN9ZWxzZXtzLnRvU3RyaW5nCnE9cy5jcmVhdGVFbGVtZW50KGEudGFnTmFtZSkKJC54by5ib2R5
-LmFwcGVuZENoaWxkKHEpfWlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5n
-ZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMuU3EsYS50YWdOYW1lKSl7JC5CTy5zZWxlY3ROb2RlQ29udGVu
-dHMocSkKcz0kLkJPCnMudG9TdHJpbmcKcD1zLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChiPT1udWxs
-PyJudWxsIjpiKX1lbHNle0oud2YocSxiKQpwPSQueG8uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCmZv
-cig7cz1xLmZpcnN0Q2hpbGQscyE9bnVsbDspcC5hcHBlbmRDaGlsZChzKX1pZihxIT09JC54by5ib2R5
-KUouTHQocSkKYy5QbihwKQpkb2N1bWVudC5hZG9wdE5vZGUocCkKcmV0dXJuIHB9LApBSDpmdW5jdGlv
-bihhLGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMsbnVsbCl9LApzaGY6ZnVuY3Rpb24oYSxiKXt0aGlz
-LllDKGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7dGhpcy5zYTQoYSxudWxsKQphLmFwcGVuZENoaWxk
-KHRoaXMucjYoYSxiLG51bGwsYykpfSwKWUM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wayhhLGIs
-bnVsbCl9LApzUk46ZnVuY3Rpb24oYSxiKXthLmlubmVySFRNTD1ifSwKZ25zOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhLnRhZ05hbWV9LApnVmw6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkNxKGEsImNsaWNrIiwh
-MSx0LlEpfSwKJGljdjoxfQpXLkN2LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0Lmgu
-Yih0LkEuYShhKSl9LAokUzoyNX0KVy5lYS5wcm90b3R5cGU9eyRpZWE6MX0KVy5EMC5wcm90b3R5cGU9
-ewpPbjpmdW5jdGlvbihhLGIsYyxkKXt0LmJ3LmEoYykKaWYoYyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9
-LApCOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5PbihhLGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24o
-YSxiLGMsZCl7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLEgudFIodC5idy5hKGMpLDEpLGQpfSwK
-JGlEMDoxfQpXLmhILnByb3RvdHlwZT17JGloSDoxfQpXLmg0LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLmxlbmd0aH19ClcuYnIucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGEubGVuZ3RofX0KVy5WYi5wcm90b3R5cGU9ewpzR1M6ZnVuY3Rpb24oYSxiKXthLmJvZHk9Yn19Clcu
-ZkoucHJvdG90eXBlPXsKZW86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEub3BlbihiLGMsITApfSwK
-JGlmSjoxfQpXLndhLnByb3RvdHlwZT17fQpXLlNnLnByb3RvdHlwZT17JGlTZzoxfQpXLnU4LnByb3Rv
-dHlwZT17CmdEcjpmdW5jdGlvbihhKXtpZigib3JpZ2luIiBpbiBhKXJldHVybiBhLm9yaWdpbgpyZXR1
-cm4gYS5wcm90b2NvbCsiLy8iK2EuaG9zdH0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0s
-CiRpdTg6MX0KVy5Bai5wcm90b3R5cGU9eyRpQWo6MX0KVy5lNy5wcm90b3R5cGU9ewpncjg6ZnVuY3Rp
-b24oYSl7dmFyIHM9dGhpcy5hLHI9cy5jaGlsZE5vZGVzLmxlbmd0aAppZihyPT09MCl0aHJvdyBILmIo
-UC5QVigiTm8gZWxlbWVudHMiKSkKaWYocj4xKXRocm93IEguYihQLlBWKCJNb3JlIHRoYW4gb25lIGVs
-ZW1lbnQiKSkKcz1zLmZpcnN0Q2hpbGQKcy50b1N0cmluZwpyZXR1cm4gc30sCkZWOmZ1bmN0aW9uKGEs
-Yil7dmFyIHMscixxLHAsbwp0LmVoLmEoYikKaWYoYiBpbnN0YW5jZW9mIFcuZTcpe3M9Yi5hCnI9dGhp
-cy5hCmlmKHMhPT1yKWZvcihxPXMuY2hpbGROb2Rlcy5sZW5ndGgscD0wO3A8cTsrK3Ape289cy5maXJz
-dENoaWxkCm8udG9TdHJpbmcKci5hcHBlbmRDaGlsZChvKX1yZXR1cm59Zm9yKHM9Yi5nbShiKSxyPXRo
-aXMuYTtzLkYoKTspci5hcHBlbmRDaGlsZChzLmdsKCkpfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBz
-LHIKdC5BLmEoYykKcz10aGlzLmEKcj1zLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj1yLmxlbmd0aClyZXR1
-cm4gSC5PSChyLGIpCnMucmVwbGFjZUNoaWxkKGMscltiXSl9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10
-aGlzLmEuY2hpbGROb2RlcwpyZXR1cm4gbmV3IFcuVzkocyxzLmxlbmd0aCxILnpLKHMpLkMoIlc5PEdt
-LkU+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jaGlsZE5vZGVzLmxlbmd0aH0sCnE6
-ZnVuY3Rpb24oYSxiKXt2YXIgcwpILklaKGIpCnM9dGhpcy5hLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj1z
-Lmxlbmd0aClyZXR1cm4gSC5PSChzLGIpCnJldHVybiBzW2JdfX0KVy5LVi5wcm90b3R5cGU9ewp3Zzpm
-dW5jdGlvbihhKXt2YXIgcz1hLnBhcmVudE5vZGUKaWYocyE9bnVsbClzLnJlbW92ZUNoaWxkKGEpfSwK
-RDQ6ZnVuY3Rpb24oYSl7dmFyIHMKZm9yKDtzPWEuZmlyc3RDaGlsZCxzIT1udWxsOylhLnJlbW92ZUNo
-aWxkKHMpfSwKdzpmdW5jdGlvbihhKXt2YXIgcz1hLm5vZGVWYWx1ZQpyZXR1cm4gcz09bnVsbD90aGlz
-LlUoYSk6c30sCnNhNDpmdW5jdGlvbihhLGIpe2EudGV4dENvbnRlbnQ9Yn0sCm1LOmZ1bmN0aW9uKGEs
-YixjKXtyZXR1cm4gYS5pbnNlcnRCZWZvcmUoYixjKX0sCiRpS1Y6MX0KVy5CSC5wcm90b3R5cGU9ewpn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5JWihiKQppZihi
-Pj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJl
-dHVybiBhW2JdfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe3QuQS5hKGMpCnRocm93IEguYihQLkw0KCJDYW5u
-b3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKZ3RIOmZ1bmN0aW9uKGEpe2lm
-KGEubGVuZ3RoPjApcmV0dXJuIGFbMF0KdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpfSwKRTpm
-dW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVti
-XX0sCiRpYlE6MSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5TTi5wcm90b3R5cGU9e30KVy5ldy5w
-cm90b3R5cGU9eyRpZXc6MX0KVy5scC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5s
-ZW5ndGh9fQpXLlRiLnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIKaWYoImNy
-ZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSlyZXR1cm4gdGhp
-cy5EVyhhLGIsYyxkKQpzPVcuVTkoIjx0YWJsZT4iK0guRWooYikrIjwvdGFibGU+IixjLGQpCnI9ZG9j
-dW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCm5ldyBXLmU3KHIpLkZWKDAsbmV3IFcuZTcocykp
-CnJldHVybiByfX0KVy5Jdi5wcm90b3R5cGU9ewpyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlm
-KCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJu
-IHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9
-bmV3IFcuZTcoQy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpKQpzPW5ldyBXLmU3
-KHMuZ3I4KHMpKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMuZ3I4KHMpKSkKcmV0dXJuIHJ9fQpX
-LldQLnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIKaWYoImNyZWF0ZUNvbnRl
-eHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy5EVyhhLGIs
-YyxkKQpzPWRvY3VtZW50CnI9cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcz1uZXcgVy5lNyhDLkll
-LnI2KHMuY3JlYXRlRWxlbWVudCgidGFibGUiKSxiLGMsZCkpCm5ldyBXLmU3KHIpLkZWKDAsbmV3IFcu
-ZTcocy5ncjgocykpKQpyZXR1cm4gcn19ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciBzLHIKdGhpcy5zYTQoYSxudWxsKQpzPWEuY29udGVudApzLnRvU3RyaW5nCkouYlQocykKcj10
-aGlzLnI2KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGlsZChyKX0sCllDOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlwZT17fQpXLks1
-LnByb3RvdHlwZT17ClBvOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1XLlAxKGEub3BlbihiLGMpKQpyZXR1
-cm4gc30sCmdtVzpmdW5jdGlvbihhKXtyZXR1cm4gdC5GLmEoYS5sb2NhdGlvbil9LAp1czpmdW5jdGlv
-bihhLGIpe3JldHVybiBhLmNvbmZpcm0oYil9LAokaUs1OjEsCiRpdjY6MX0KVy5DbS5wcm90b3R5cGU9
-eyRpQ206MX0KVy5DUS5wcm90b3R5cGU9eyRpQ1E6MX0KVy53NC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3ZhciBzLHI9YS5sZWZ0CnIudG9TdHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwgIgpz
-PWEudG9wCnMudG9TdHJpbmcKcz1yK0guRWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpyPXMr
-SC5FaihyKSsiIHggIgpzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkROOmZ1
-bmN0aW9uKGEsYil7dmFyIHMscgppZihiPT1udWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVm
-dApzLnRvU3RyaW5nCnI9Yi5sZWZ0CnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmlu
-ZwpyPWIudG9wCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0
-aApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRv
-U3RyaW5nCnI9cz09PXIKcz1yfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpy
-ZXR1cm4gc30sCmdpTzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLmxlZnQKcC50b1N0cmluZwpwPUMu
-Q0QuZ2lPKHApCnM9YS50b3AKcy50b1N0cmluZwpzPUMuQ0QuZ2lPKHMpCnI9YS53aWR0aApyLnRvU3Ry
-aW5nCnI9Qy5DRC5naU8ocikKcT1hLmhlaWdodApxLnRvU3RyaW5nCnJldHVybiBXLnJFKHAscyxyLEMu
-Q0QuZ2lPKHEpKX19ClcucmgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3Ro
-fSwKcTpmdW5jdGlvbihhLGIpe0guSVooYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBI
-LmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk1OmZ1bmN0aW9uKGEsYixj
-KXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJs
-ZSBMaXN0LiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9I
-KGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuY2YucHJv
-dG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8KdC5lQS5hKGIpCmZvcihzPXRoaXMu
-Z3ZjKCkscj1zLmxlbmd0aCxxPXRoaXMuYSxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgu
-bGspKHMpLCsrcCl7bz1zW3BdCmIuJDIobyxILm4ocS5nZXRBdHRyaWJ1dGUobykpKX19LApndmM6ZnVu
-Y3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLmEuYXR0cmlidXRlcwptLnRvU3RyaW5nCnM9SC5R
-SShbXSx0LnMpCmZvcihyPW0ubGVuZ3RoLHE9dC5oOSxwPTA7cDxyOysrcCl7aWYocD49bS5sZW5ndGgp
-cmV0dXJuIEguT0gobSxwKQpvPXEuYShtW3BdKQppZihvLm5hbWVzcGFjZVVSST09bnVsbCl7bj1vLm5h
-bWUKbi50b1N0cmluZwpDLk5tLmkocyxuKX19cmV0dXJuIHN9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJu
-IHRoaXMuZ3ZjKCkubGVuZ3RoPT09MH19ClcuaTcucHJvdG90eXBlPXsKeDQ6ZnVuY3Rpb24oYSl7dmFy
-IHM9dGhpcy5hLmhhc0F0dHJpYnV0ZShhKQpyZXR1cm4gc30sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-dGhpcy5hLmdldEF0dHJpYnV0ZShILm4oYikpfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYS5zZXRB
-dHRyaWJ1dGUoYixjKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmd2YygpLmxlbmd0aH19Clcu
-U3kucHJvdG90eXBlPXsKeDQ6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLmEuaGFzQXR0cmlidXRlKCJk
-YXRhLSIrdGhpcy5PVShhKSkKcmV0dXJuIHN9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5h
-LmdldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1UoSC5uKGIpKSl9LApZNTpmdW5jdGlvbihhLGIsYyl7
-dGhpcy5hLmEuc2V0QXR0cmlidXRlKCJkYXRhLSIrdGhpcy5PVShiKSxjKX0sCks6ZnVuY3Rpb24oYSxi
-KXt0aGlzLmEuSygwLG5ldyBXLktTKHRoaXMsdC5lQS5hKGIpKSl9LApndmM6ZnVuY3Rpb24oKXt2YXIg
-cz1ILlFJKFtdLHQucykKdGhpcy5hLksoMCxuZXcgVy5BMyh0aGlzLHMpKQpyZXR1cm4gc30sCmdBOmZ1
-bmN0aW9uKGEpe3JldHVybiB0aGlzLmd2YygpLmxlbmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4g
-dGhpcy5ndmMoKS5sZW5ndGg9PT0wfSwKeHE6ZnVuY3Rpb24oYSl7dmFyIHMscixxPUguUUkoYS5zcGxp
-dCgiLSIpLHQucykKZm9yKHM9MTtzPHEubGVuZ3RoOysrcyl7cj1xW3NdCmlmKHIubGVuZ3RoPjApQy5O
-bS5ZNShxLHMsclswXS50b1VwcGVyQ2FzZSgpK0MueEIueW4ociwxKSl9cmV0dXJuIEMuTm0uayhxLCIi
-KX0sCk9VOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8KZm9yKHM9YS5sZW5ndGgscj0wLHE9IiI7cjxz
-Oysrcil7cD1hW3JdCm89cC50b0xvd2VyQ2FzZSgpCnE9KHAhPT1vJiZyPjA/cSsiLSI6cSkrb31yZXR1
-cm4gcS5jaGFyQ29kZUF0KDApPT0wP3E6cX19ClcuS1MucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxi
-KXtpZihDLnhCLm4oYSwiZGF0YS0iKSl0aGlzLmIuJDIodGhpcy5hLnhxKEMueEIueW4oYSw1KSksYil9
-LAokUzo4fQpXLkEzLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7aWYoQy54Qi5uKGEsImRhdGEt
-IikpQy5ObS5pKHRoaXMuYix0aGlzLmEueHEoQy54Qi55bihhLDUpKSl9LAokUzo4fQpXLkk0LnByb3Rv
-dHlwZT17CkQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvPVAuTHModC5OKQpmb3Iocz10aGlzLmEuY2xh
-c3NOYW1lLnNwbGl0KCIgIikscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1KLlQwKHNbcV0pCmlmKHAu
-bGVuZ3RoIT09MClvLmkoMCxwKX1yZXR1cm4gb30sClg6ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFt
-ZT10LkMuYShhKS5rKDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0
-Lmxlbmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGg9PT0w
-fSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aCE9PTB9LApWMTpm
-dW5jdGlvbihhKXt0aGlzLmEuY2xhc3NOYW1lPSIifSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlz
-LmEuY2xhc3NMaXN0LmNvbnRhaW5zKGIpCnJldHVybiBzfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIK
-SC5uKGIpCnM9dGhpcy5hLmNsYXNzTGlzdApyPXMuY29udGFpbnMoYikKcy5hZGQoYikKcmV0dXJuIXJ9
-LApSOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7cz10aGlzLmEu
-Y2xhc3NMaXN0CnI9cy5jb250YWlucyhiKQpzLnJlbW92ZShiKQpxPXJ9ZWxzZSBxPSExCnJldHVybiBx
-fSwKRlY6ZnVuY3Rpb24oYSxiKXtXLlROKHRoaXMuYSx0Lk8uYShiKSl9fQpXLkZrLnByb3RvdHlwZT17
-fQpXLlJPLnByb3RvdHlwZT17fQpXLkNxLnByb3RvdHlwZT17fQpXLnhDLnByb3RvdHlwZT17fQpXLnZO
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuJDEodC5CLmEoYSkpfSwKJFM6
-Mjd9ClcuSlEucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoJC5vci5hPT09MCl7Zm9y
-KHM9MDtzPDI2MjsrK3MpJC5vci5ZNSgwLEMuY21bc10sVy5wUygpKQpmb3Iocz0wO3M8MTI7KytzKSQu
-b3IuWTUoMCxDLkJJW3NdLFcuVjQoKSl9fSwKaTA6ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4oKS50Zygw
-LFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPSQub3IucSgwLFcuclMoYSkrIjo6Iiti
-KQppZihzPT1udWxsKXM9JC5vci5xKDAsIio6OiIrYikKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4g
-SC5wOChzLiQ0KGEsYixjLHRoaXMpKX0sCiRpa0Y6MX0KVy5HbS5wcm90b3R5cGU9ewpnbTpmdW5jdGlv
-bihhKXtyZXR1cm4gbmV3IFcuVzkoYSx0aGlzLmdBKGEpLEgueksoYSkuQygiVzk8R20uRT4iKSl9fQpX
-LnZELnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5V
-dihhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEs
-YixjKSl9LAokaWtGOjF9ClcuVXYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuRS5h
-KGEpLmkwKHRoaXMuYSl9LAokUzoxNn0KVy5FZy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1
-cm4gdC5FLmEoYSkuRWIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MTZ9ClcubTYucHJvdG90eXBl
-PXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCnRoaXMuYS5GVigwLGMpCnM9Yi5ldigwLG5l
-dyBXLkVvKCkpCnI9Yi5ldigwLG5ldyBXLldrKCkpCnRoaXMuYi5GVigwLHMpCnE9dGhpcy5jCnEuRlYo
-MCxDLnhEKQpxLkZWKDAscil9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAsVy5yUyhh
-KSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9dGhpcyxyPVcuclMoYSkscT1zLmMKaWYocS50Zygw
-LHIrIjo6IitiKSlyZXR1cm4gcy5kLkR0KGMpCmVsc2UgaWYocS50ZygwLCIqOjoiK2IpKXJldHVybiBz
-LmQuRHQoYykKZWxzZXtxPXMuYgppZihxLnRnKDAscisiOjoiK2IpKXJldHVybiEwCmVsc2UgaWYocS50
-ZygwLCIqOjoiK2IpKXJldHVybiEwCmVsc2UgaWYocS50ZygwLHIrIjo6KiIpKXJldHVybiEwCmVsc2Ug
-aWYocS50ZygwLCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5CSSxILm4oYSkpfSwKJFM6Nn0KVy5Xay5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS50ZyhDLkJJLEgubihhKSl9LAokUzo2
-fQpXLmN0LnByb3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1
-cm4hMAppZihiPT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0
-ZW1wbGF0ZSIpPT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6OiIrSC5uKGEpfSwKJFM6Mn0KVy5Pdy5w
-cm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXt2YXIgcwppZih0LmFPLmIoYSkpcmV0dXJuITEKcz10Lmc3
-LmIoYSkKaWYocyYmVy5yUyhhKT09PSJmb3JlaWduT2JqZWN0IilyZXR1cm4hMQppZihzKXJldHVybiEw
-CnJldHVybiExfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe2lmKGI9PT0iaXMifHxDLnhCLm4oYiwib24iKSly
-ZXR1cm4hMQpyZXR1cm4gdGhpcy5pMChhKX0sCiRpa0Y6MX0KVy5XOS5wcm90b3R5cGU9ewpGOmZ1bmN0
-aW9uKCl7dmFyIHM9dGhpcyxyPXMuYysxLHE9cy5iCmlmKHI8cSl7cy5zcChKLng5KHMuYSxyKSkKcy5j
-PXIKcmV0dXJuITB9cy5zcChudWxsKQpzLmM9cQpyZXR1cm4hMX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJu
-IHRoaXMuJHRpLmMuYSh0aGlzLmQpfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/
-IikuYShhKX0sCiRpQW46MX0KVy5kVy5wcm90b3R5cGU9eyRpRDA6MSwkaXY2OjF9ClcubWsucHJvdG90
-eXBlPXskaXkwOjF9ClcuS28ucHJvdG90eXBlPXsKUG46ZnVuY3Rpb24oYSl7dmFyIHMscj1uZXcgVy5m
-bSh0aGlzKQpkb3tzPXRoaXMuYgpyLiQyKGEsbnVsbCl9d2hpbGUocyE9PXRoaXMuYil9LApFUDpmdW5j
-dGlvbihhLGIpeysrdGhpcy5iCmlmKGI9PW51bGx8fGIhPT1hLnBhcmVudE5vZGUpSi5MdChhKQplbHNl
-IGIucmVtb3ZlQ2hpbGQoYSl9LApJNDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbj0hMCxtPW51
-bGwsbD1udWxsCnRyeXttPUouaWcoYSkKbD1tLmEuZ2V0QXR0cmlidXRlKCJpcyIpCnQuaC5hKGEpCnM9
-ZnVuY3Rpb24oYyl7aWYoIShjLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVy
-biB0cnVlCmlmKGMuaWQ9PSJsYXN0Q2hpbGQifHxjLm5hbWU9PSJsYXN0Q2hpbGQifHxjLmlkPT0icHJl
-dmlvdXNTaWJsaW5nInx8Yy5uYW1lPT0icHJldmlvdXNTaWJsaW5nInx8Yy5pZD09ImNoaWxkcmVuInx8
-Yy5uYW1lPT0iY2hpbGRyZW4iKXJldHVybiB0cnVlCnZhciBrPWMuY2hpbGROb2RlcwppZihjLmxhc3RD
-aGlsZCYmYy5sYXN0Q2hpbGQhPT1rW2subGVuZ3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4p
-aWYoIShjLmNoaWxkcmVuIGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFu
-Y2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRydWUKdmFyIGo9MAppZihjLmNoaWxkcmVuKWo9Yy5jaGlsZHJl
-bi5sZW5ndGgKZm9yKHZhciBpPTA7aTxqO2krKyl7dmFyIGg9Yy5jaGlsZHJlbltpXQppZihoLmlkPT0i
-YXR0cmlidXRlcyJ8fGgubmFtZT09ImF0dHJpYnV0ZXMifHxoLmlkPT0ibGFzdENoaWxkInx8aC5uYW1l
-PT0ibGFzdENoaWxkInx8aC5pZD09InByZXZpb3VzU2libGluZyJ8fGgubmFtZT09InByZXZpb3VzU2li
-bGluZyJ8fGguaWQ9PSJjaGlsZHJlbiJ8fGgubmFtZT09ImNoaWxkcmVuIilyZXR1cm4gdHJ1ZX1yZXR1
-cm4gZmFsc2V9KGEpCm49SC5vVChzKT8hMDohKGEuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9k
-ZU1hcCl9Y2F0Y2gocCl7SC5SdShwKX1yPSJlbGVtZW50IHVucHJpbnRhYmxlIgp0cnl7cj1KLncoYSl9
-Y2F0Y2gocCl7SC5SdShwKX10cnl7cT1XLnJTKGEpCnRoaXMua1IodC5oLmEoYSksYixuLHIscSx0LmYu
-YShtKSxILmsobCkpfWNhdGNoKHApe2lmKEguUnUocCkgaW5zdGFuY2VvZiBQLkFUKXRocm93IHAKZWxz
-ZXt0aGlzLkVQKGEsYikKd2luZG93Cm89IlJlbW92aW5nIGNvcnJ1cHRlZCBlbGVtZW50ICIrSC5Faihy
-KQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihvKX19fSwK
-a1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuLG09dGhpcwppZihjKXttLkVQ
-KGEsYikKd2luZG93CnM9IlJlbW92aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRlZCBhdHRyaWJ1dGVz
-IG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53
-YXJuKHMpCnJldHVybn1pZighbS5hLmkwKGEpKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5nIGRp
-c2FsbG93ZWQgZWxlbWVudCA8IitlKyI+IGZyb20gIitILkVqKGIpCmlmKHR5cGVvZiBjb25zb2xlIT0i
-dW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHMpCnJldHVybn1pZihnIT1udWxsKWlmKCFtLmEu
-RWIoYSwiaXMiLGcpKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5nIGRpc2FsbG93ZWQgdHlwZSBl
-eHRlbnNpb24gPCIrZSsnIGlzPSInK2crJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIp
-d2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59cz1mLmd2YygpCnI9SC5RSShzLnNsaWNlKDApLEgu
-dDYocykpCmZvcihxPWYuZ3ZjKCkubGVuZ3RoLTEscz1mLmE7cT49MDstLXEpe2lmKHE+PXIubGVuZ3Ro
-KXJldHVybiBILk9IKHIscSkKcD1yW3FdCm89bS5hCm49Si5jSChwKQpILm4ocCkKaWYoIW8uRWIoYSxu
-LEgubihzLmdldEF0dHJpYnV0ZShwKSkpKXt3aW5kb3cKbz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRy
-aWJ1dGUgPCIrZSsiICIrcCsnPSInK0guRWoocy5nZXRBdHRyaWJ1dGUocCkpKyciPicKaWYodHlwZW9m
-IGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4obykKcy5yZW1vdmVBdHRyaWJ1
-dGUocCl9fWlmKHQuYVcuYihhKSl7cz1hLmNvbnRlbnQKcy50b1N0cmluZwptLlBuKHMpfX0sCiRpb246
-MX0KVy5mbS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMu
-YQpzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOm0uSTQoYSxiKQpicmVhawpjYXNlIDg6Y2FzZSAxMTpj
-YXNlIDM6Y2FzZSA0OmJyZWFrCmRlZmF1bHQ6bS5FUChhLGIpfXM9YS5sYXN0Q2hpbGQKZm9yKHE9dC5B
-O3MhPW51bGw7KXtyPW51bGwKdHJ5e3I9cy5wcmV2aW91c1NpYmxpbmcKaWYociE9bnVsbCl7cD1yLm5l
-eHRTaWJsaW5nCm89cwpvPXA9PW51bGw/byE9bnVsbDpwIT09bwpwPW99ZWxzZSBwPSExCmlmKHApe3A9
-UC5QVigiQ29ycnVwdCBIVE1MIikKdGhyb3cgSC5iKHApfX1jYXRjaChuKXtILlJ1KG4pCnA9cS5hKHMp
-OysrbS5iCm89cC5wYXJlbnROb2RlCmlmKGEhPT1vKXtpZihvIT1udWxsKW8ucmVtb3ZlQ2hpbGQocCl9
-ZWxzZSBhLnJlbW92ZUNoaWxkKHApCnM9bnVsbApyPWEubGFzdENoaWxkfWlmKHMhPW51bGwpdGhpcy4k
-MihzLGEpCnM9cn19LAokUzozMH0KVy5MZS5wcm90b3R5cGU9e30KVy5LNy5wcm90b3R5cGU9e30KVy5y
-Qi5wcm90b3R5cGU9e30KVy5YVy5wcm90b3R5cGU9e30KVy5vYS5wcm90b3R5cGU9e30KUC5pSi5wcm90
-b3R5cGU9ewpWSDpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuYSxxPXIubGVuZ3RoCmZvcihzPTA7czxx
-OysrcylpZihyW3NdPT09YSlyZXR1cm4gcwpDLk5tLmkocixhKQpDLk5tLmkodGhpcy5iLG51bGwpCnJl
-dHVybiBxfSwKUHY6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9dGhpcyxvPXt9CmlmKGE9PW51bGwpcmV0
-dXJuIGEKaWYoSC5yUShhKSlyZXR1cm4gYQppZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYo
-dHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBuZXcg
-RGF0ZShhLmEpCmlmKHQuZnYuYihhKSl0aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBS
-ZWdFeHAiKSkKaWYodC5jOC5iKGEpKXJldHVybiBhCmlmKHQudy5iKGEpKXJldHVybiBhCmlmKHQuSS5i
-KGEpKXJldHVybiBhCnM9dC5kRS5iKGEpfHwhMQppZihzKXJldHVybiBhCmlmKHQuZi5iKGEpKXtyPXAu
-VkgoYSkKcz1wLmIKaWYocj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxyKQpxPW8uYT1zW3JdCmlmKHEh
-PW51bGwpcmV0dXJuIHEKcT17fQpvLmE9cQpDLk5tLlk1KHMscixxKQphLksoMCxuZXcgUC5FMihvLHAp
-KQpyZXR1cm4gby5hfWlmKHQuai5iKGEpKXtyPXAuVkgoYSkKbz1wLmIKaWYocj49by5sZW5ndGgpcmV0
-dXJuIEguT0gobyxyKQpxPW9bcl0KaWYocSE9bnVsbClyZXR1cm4gcQpyZXR1cm4gcC5layhhLHIpfWlm
-KHQuZUguYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikK
-cT1vLmI9c1tyXQppZihxIT1udWxsKXJldHVybiBxCnE9e30Kby5iPXEKQy5ObS5ZNShzLHIscSkKcC5p
-bShhLG5ldyBQLmpnKG8scCkpCnJldHVybiBvLmJ9dGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xv
-bmUgb2Ygb3RoZXIgdHlwZSIpKX0sCmVrOmZ1bmN0aW9uKGEsYil7dmFyIHMscj1KLlU2KGEpLHE9ci5n
-QShhKSxwPW5ldyBBcnJheShxKQpDLk5tLlk1KHRoaXMuYixiLHApCmZvcihzPTA7czxxOysrcylDLk5t
-Llk1KHAscyx0aGlzLlB2KHIucShhLHMpKSkKcmV0dXJuIHB9fQpQLkUyLnByb3RvdHlwZT17CiQyOmZ1
-bmN0aW9uKGEsYil7dGhpcy5hLmFbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzF9ClAuamcucHJvdG90eXBl
-PXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYlthXT10aGlzLmIuUHYoYil9LAokUzozMn0KUC5CZi5w
-cm90b3R5cGU9ewppbTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwCnQuYjguYShiKQpmb3Iocz1PYmpl
-Y3Qua2V5cyhhKSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLGFbcF0pfX19ClAu
-QXMucHJvdG90eXBlPXsKVjpmdW5jdGlvbihhKXt2YXIgcwpILm4oYSkKcz0kLmhHKCkuYgppZihzLnRl
-c3QoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKFAuTDMoYSwidmFsdWUiLCJOb3QgYSB2YWxpZCBjbGFzcyB0
-b2tlbiIpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRCgpLmsoMCwiICIpfSwKZ206ZnVuY3Rp
-b24oYSl7dmFyIHM9dGhpcy5EKCkKcmV0dXJuIFAucmoocyxzLnIsSC5MaChzKS5jKX0sCmdsMDpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy5EKCkuYT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-RCgpLmEhPT0wfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRCgpLmF9LAp0ZzpmdW5jdGlvbihh
-LGIpe3RoaXMuVihiKQpyZXR1cm4gdGhpcy5EKCkudGcoMCxiKX0sCmk6ZnVuY3Rpb24oYSxiKXt2YXIg
-cwpILm4oYikKdGhpcy5WKGIpCnM9dGhpcy5PUyhuZXcgUC5HRShiKSkKcmV0dXJuIEgucDgocz09bnVs
-bD8hMTpzKX0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1
-cm4hMQp0aGlzLlYoYikKcz10aGlzLkQoKQpyPXMuUigwLGIpCnRoaXMuWChzKQpyZXR1cm4gcn0sCkZW
-OmZ1bmN0aW9uKGEsYil7dGhpcy5PUyhuZXcgUC5ONyh0aGlzLHQuTy5hKGIpKSl9LAplUjpmdW5jdGlv
-bihhLGIpe3ZhciBzPXRoaXMuRCgpCnJldHVybiBILmJLKHMsYixILkxoKHMpLkMoImxmLkUiKSl9LApF
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRCgpLkUoMCxiKX0sClYxOmZ1bmN0aW9uKGEpe3RoaXMu
-T1MobmV3IFAudVEoKSl9LApPUzpmdW5jdGlvbihhKXt2YXIgcyxyCnQuYlUuYShhKQpzPXRoaXMuRCgp
-CnI9YS4kMShzKQp0aGlzLlgocykKcmV0dXJuIHJ9fQpQLkdFLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9u
-KGEpe3JldHVybiB0LkMuYShhKS5pKDAsdGhpcy5hKX0sCiRTOjMzfQpQLk43LnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYixyPUgudDYocykKcmV0dXJuIHQuQy5hKGEpLkZWKDAsbmV3
-IEgubEoocyxyLkMoInFVKDEpIikuYSh0aGlzLmEuZ3VNKCkpLHIuQygibEo8MSxxVT4iKSkpfSwKJFM6
-MTJ9ClAudVEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5DLmEoYSkKaWYoYS5hPjApe2EuYj1h
-LmM9YS5kPWEuZT1hLmY9bnVsbAphLmE9MAphLlMoKX1yZXR1cm4gbnVsbH0sCiRTOjEyfQpQLmhGLnBy
-b3RvdHlwZT17JGloRjoxfQpQLlBDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzCnQuWS5h
-KGEpCnM9ZnVuY3Rpb24oYixjLGQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiKGMsZCx0aGlzLEFy
-cmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKX19KFAuUjQsYSwhMSkKUC5EbShzLCQu
-eigpLGEpCnJldHVybiBzfSwKJFM6NH0KUC5tdC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1
-cm4gbmV3IHRoaXMuYShhKX0sCiRTOjR9ClAuUVMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0
-dXJuIG5ldyBQLnI3KHQuSy5hKGEpKX0sCiRTOjQ0fQpQLm5wLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9u
-KGEpe3JldHVybiBuZXcgUC5Ueih0LksuYShhKSx0LmFtKX0sCiRTOjM2fQpQLlV0LnByb3RvdHlwZT17
-CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5FNCh0LksuYShhKSl9LAokUzozN30KUC5FNC5wcm90
-b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIhPSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51
-bWJlciIpdGhyb3cgSC5iKFAueFkoInByb3BlcnR5IGlzIG5vdCBhIFN0cmluZyBvciBudW0iKSkKcmV0
-dXJuIFAuZFUodGhpcy5hW2JdKX0sClk1OmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmlu
-ZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3Ry
-aW5nIG9yIG51bSIpKQp0aGlzLmFbYl09UC53WShjKX0sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVs
-bClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuRTQmJnRoaXMuYT09PWIuYX0sCnc6ZnVuY3Rp
-b24oYSl7dmFyIHMscgp0cnl7cz1TdHJpbmcodGhpcy5hKQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIp
-CnM9dGhpcy54YigwKQpyZXR1cm4gc319LApWNzpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5hCmlm
-KGI9PW51bGwpcz1udWxsCmVsc2V7cz1ILnQ2KGIpCnM9UC5DSChuZXcgSC5sSihiLHMuQygiQCgxKSIp
-LmEoUC5pRygpKSxzLkMoImxKPDEsQD4iKSksITAsdC56KX1yZXR1cm4gUC5kVShyW2FdLmFwcGx5KHIs
-cykpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfX0KUC5yNy5wcm90b3R5cGU9e30KUC5Uei5wcm90
-b3R5cGU9ewpjUDpmdW5jdGlvbihhKXt2YXIgcz10aGlzLHI9YTwwfHxhPj1zLmdBKHMpCmlmKHIpdGhy
-b3cgSC5iKFAuVEUoYSwwLHMuZ0EocyksbnVsbCxudWxsKSl9LApxOmZ1bmN0aW9uKGEsYil7aWYoSC5v
-ayhiKSl0aGlzLmNQKGIpCnJldHVybiB0aGlzLiR0aS5jLmEodGhpcy5VcigwLGIpKX0sClk1OmZ1bmN0
-aW9uKGEsYixjKXt0aGlzLmNQKGIpCnRoaXMuYmgoMCxiLGMpfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHM9
-dGhpcy5hLmxlbmd0aAppZih0eXBlb2Ygcz09PSJudW1iZXIiJiZzPj4+MD09PXMpcmV0dXJuIHMKdGhy
-b3cgSC5iKFAuUFYoIkJhZCBKc0FycmF5IGxlbmd0aCIpKX0sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9
-ClAudmcucHJvdG90eXBlPXsKWTU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmU0KDAsYixjKX19
-ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS2UucHJvdG90eXBlPXsKRDpmdW5jdGlvbigpe3ZhciBz
-LHIscSxwLG89dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSxuPVAuTHModC5OKQppZihvPT1udWxs
-KXJldHVybiBuCmZvcihzPW8uc3BsaXQoIiAiKSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPUouVDAo
-c1txXSkKaWYocC5sZW5ndGghPT0wKW4uaSgwLHApfXJldHVybiBufSwKWDpmdW5jdGlvbihhKXt0aGlz
-LmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS5rKDAsIiAiKSl9fQpQLmhpLnByb3RvdHlwZT17CmdQOmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LZShhKX0sCnNoZjpmdW5jdGlvbihhLGIpe3RoaXMuWUMoYSxi
-KX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbgppZihkPT1udWxsKXtzPUguUUko
-W10sdC5yKQpkPW5ldyBXLnZEKHMpCkMuTm0uaShzLFcuVHcobnVsbCkpCkMuTm0uaShzLFcuQmwoKSkK
-Qy5ObS5pKHMsbmV3IFcuT3coKSl9Yz1uZXcgVy5LbyhkKQpyPSc8c3ZnIHZlcnNpb249IjEuMSI+JytI
-LkVqKGIpKyI8L3N2Zz4iCnM9ZG9jdW1lbnQKcT1zLmJvZHkKcS50b1N0cmluZwpwPUMuUlkuQUgocSxy
-LGMpCm89cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcz1uZXcgVy5lNyhwKQpuPXMuZ3I4KHMpCmZv
-cig7cz1uLmZpcnN0Q2hpbGQscyE9bnVsbDspby5hcHBlbmRDaGlsZChzKQpyZXR1cm4gb30sCm56OmZ1
-bmN0aW9uKGEsYixjLGQsZSl7dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBpbnZva2UgaW5zZXJ0QWRqYWNl
-bnRIdG1sIG9uIFNWRy4iKSl9LApnVmw6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkNxKGEsImNsaWNr
-IiwhMSx0LlEpfSwKJGloaToxfQpVLmQyLnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7dmFyIHMscixx
-LHAsbz10aGlzLG49dC5OLG09dC5YLGw9UC5GbChuLG0pLGs9by5hCmlmKGshPW51bGwpe3M9SC5RSShb
-XSx0LmQpCmZvcihyPWsubGVuZ3RoLHE9MDtxPGsubGVuZ3RoO2subGVuZ3RoPT09cnx8KDAsSC5sayko
-ayksKytxKXtwPWtbcV0Kcy5wdXNoKFAuRUYoWyJkZXNjcmlwdGlvbiIscC5hLCJocmVmIixwLmJdLG4s
-bSkpfWwuWTUoMCwiZWRpdHMiLHMpfWwuWTUoMCwiZXhwbGFuYXRpb24iLG8uYikKbC5ZNSgwLCJsaW5l
-IixvLmMpCmwuWTUoMCwiZGlzcGxheVBhdGgiLG8uZCkKbC5ZNSgwLCJ1cmlQYXRoIixvLmUpCm49by5m
-CmlmKG4hPW51bGwpe209SC5RSShbXSx0LmQpCmZvcihrPW4ubGVuZ3RoLHE9MDtxPG4ubGVuZ3RoO24u
-bGVuZ3RoPT09a3x8KDAsSC5saykobiksKytxKW0ucHVzaChuW3FdLkx0KCkpCmwuWTUoMCwidHJhY2Vz
-IixtKX1yZXR1cm4gbH19ClUuU2UucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihb
-ImRlc2NyaXB0aW9uIix0aGlzLmEsImhyZWYiLHRoaXMuYl0sdC5OLHQuWCl9fQpVLk1sLnByb3RvdHlw
-ZT17Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJocmVmIix0aGlzLmEsImxpbmUiLHRoaXMuYiwi
-cGF0aCIsdGhpcy5jXSx0Lk4sdC5YKX19ClUueUQucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIg
-cyxyLHEscD1ILlFJKFtdLHQuZCkKZm9yKHM9dGhpcy5iLHI9cy5sZW5ndGgscT0wO3E8cy5sZW5ndGg7
-cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3EpcC5wdXNoKHNbcV0uTHQoKSkKcmV0dXJuIFAuRUYo
-WyJkZXNjcmlwdGlvbiIsdGhpcy5hLCJlbnRyaWVzIixwXSx0Lk4sdC5YKX19ClUud2IucHJvdG90eXBl
-PXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscD10aGlzLG89UC5GbCh0Lk4sdC5YKQpvLlk1KDAsImRl
-c2NyaXB0aW9uIixwLmEpCnM9cC5iCmlmKHMhPW51bGwpby5ZNSgwLCJmdW5jdGlvbiIscykKcz1wLmMK
-aWYocyE9bnVsbClvLlk1KDAsImxpbmsiLHMuTHQoKSkKcz1wLmQKaWYocy5sZW5ndGghPT0wKXtyPUgu
-dDYocykKcT1yLkMoImxKPDEsWjA8cVUsTWg/Pj4iKQpvLlk1KDAsImhpbnRBY3Rpb25zIixQLlkxKG5l
-dyBILmxKKHMsci5DKCJaMDxxVSxNaD8+KDEpIikuYShuZXcgVS5iMCgpKSxxKSwhMCxxLkMoImFMLkUi
-KSkpfXJldHVybiBvfX0KVS5hTi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gUi5ueih0
-LkcuYShhKSl9LAokUzozOH0KVS5iMC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdC5K
-LmEoYSkuTHQoKX0sCiRTOjM5fQpCLmo4LnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAu
-RUYoWyJsaW5lIix0aGlzLmEsImV4cGxhbmF0aW9uIix0aGlzLmIsIm9mZnNldCIsdGhpcy5jXSx0Lk4s
-dC5YKX19CkIucXAucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsPXRo
-aXMsaz10Lk4saj1QLkZsKGssdC54KQpmb3Iocz1sLmQscz1zLmdQdShzKSxzPXMuZ20ocykscj10Llgs
-cT10LmQ7cy5GKCk7KXtwPXMuZ2woKQpvPXAuYQpuPUguUUkoW10scSkKZm9yKHA9Si5JVChwLmIpO3Au
-RigpOyl7bT1wLmdsKCkKbi5wdXNoKFAuRUYoWyJsaW5lIixtLmEsImV4cGxhbmF0aW9uIixtLmIsIm9m
-ZnNldCIsbS5jXSxrLHIpKX1qLlk1KDAsbyxuKX1yZXR1cm4gUC5FRihbInJlZ2lvbnMiLGwuYSwibmF2
-aWdhdGlvbkNvbnRlbnQiLGwuYiwic291cmNlQ29kZSIsbC5jLCJlZGl0cyIsal0sayxyKX19ClQubVEu
-cHJvdG90eXBlPXt9CkwuZS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4s
-bQp0LkIuYShhKQpzPXQuRgpyPXMuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lCnE9TC5HNihzLmEo
-d2luZG93LmxvY2F0aW9uKS5ocmVmKQpwPUwuYUsocy5hKHdpbmRvdy5sb2NhdGlvbikuaHJlZikKTC5H
-ZSgpCmlmKHIhPT0iLyIpe3M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnJvb3QiKS50ZXh0Q29udGVu
-dApzLnRvU3RyaW5nCnM9ciE9PUMueEIuYlMocyl9ZWxzZSBzPSExCmlmKHMpe3IudG9TdHJpbmcKTC5H
-NyhyLHEscCwhMCxuZXcgTC5WVyhyLHEscCkpfXM9ZG9jdW1lbnQKbz1zLnF1ZXJ5U2VsZWN0b3IoIi5h
-cHBseS1taWdyYXRpb24iKQpvLnRvU3RyaW5nCm89Si5xRihvKQpuPW8uJHRpCm09bi5DKCJ+KDEpPyIp
-LmEobmV3IEwub1ooKSkKdC5aLmEobnVsbCkKVy5KRShvLmEsby5iLG0sITEsbi5jKQpuPXMucXVlcnlT
-ZWxlY3RvcigiLnJlcnVuLW1pZ3JhdGlvbiIpCm4udG9TdHJpbmcKbj1KLnFGKG4pCm09bi4kdGkKVy5K
-RShuLmEsbi5iLG0uQygifigxKT8iKS5hKG5ldyBMLnk4KCkpLCExLG0uYykKbT1zLnF1ZXJ5U2VsZWN0
-b3IoIi5yZXBvcnQtcHJvYmxlbSIpCm0udG9TdHJpbmcKbT1KLnFGKG0pCm49bS4kdGkKVy5KRShtLmEs
-bS5iLG4uQygifigxKT8iKS5hKG5ldyBMLkhpKCkpLCExLG4uYykKcz1zLnF1ZXJ5U2VsZWN0b3IoIi5w
-b3B1cC1wYW5lIC5jbG9zZSIpCnMudG9TdHJpbmcKcz1KLnFGKHMpCm49cy4kdGkKVy5KRShzLmEscy5i
-LG4uQygifigxKT8iKS5hKG5ldyBMLkJUKCkpLCExLG4uYykKbj0kLmMwKCkKbi50b1N0cmluZwpuPUou
-cUYobikKcz1uLiR0aQpXLkpFKG4uYSxuLmIscy5DKCJ+KDEpPyIpLmEobmV3IEwuUFkoKSksITEscy5j
-KX0sCiRTOjE3fQpMLlZXLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsdGhpcy5i
-LHRoaXMuYyl9LAokUzowfQpMLm9aLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
-LG8KdC5WLmEoYSkKaWYoQy5vbC51cyh3aW5kb3csIlRoaXMgd2lsbCBhcHBseSB0aGUgY2hhbmdlcyB5
-b3UndmUgcHJldmlld2VkIHRvIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIEl0IGlzIHJlY29tbWVuZGVk
-IHlvdSBjb21taXQgYW55IGNoYW5nZXMgeW91IG1hZGUgYmVmb3JlIGRvaW5nIHRoaXMuIikpe3M9SC5R
-SShbXSx0LmQpCmZvcihyPSQuSVIscT1yLmxlbmd0aCxwPTA7cDxyLmxlbmd0aDtyLmxlbmd0aD09PXF8
-fCgwLEgubGspKHIpLCsrcClzLnB1c2gocltwXS5MdCgpKQpzPUwudHkoIi9hcHBseS1taWdyYXRpb24i
-LFAuRUYoWyJuYXZpZ2F0aW9uVHJlZSIsc10sdC5OLHQueCkpLlc3KG5ldyBMLmpyKCksdC5QKQpvPW5l
-dyBMLnFsKCkKdC5iNy5hKG51bGwpCnI9cy4kdGkKcT0kLlgzCmlmKHEhPT1DLk5VKW89UC5WSChvLHEp
-CnMueGYobmV3IFAuRmUobmV3IFAudnMocSxyKSwyLG51bGwsbyxyLkMoIkA8MT4iKS5LcShyLmMpLkMo
-IkZlPDEsMj4iKSkpfX0sCiRTOjF9CkwuanIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMK
-dC5mbi5hKGEpCnM9ZG9jdW1lbnQuYm9keQpzLmNsYXNzTGlzdC5yZW1vdmUoInByb3Bvc2VkIikKcy5j
-bGFzc0xpc3QuYWRkKCJhcHBsaWVkIil9LAokUzo0Mn0KTC5xbC5wcm90b3R5cGU9ewokMjpmdW5jdGlv
-bihhLGIpe0wuQzIoIkNvdWxkbid0IGFwcGx5IG1pZ3JhdGlvbiIsdC5LLmEoYSksYil9LAokQzoiJDIi
-LAokUjoyLAokUzo0M30KTC55OC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54
-bih0LlYuYShhKSl9LAp4bjpmdW5jdGlvbihhKXt2YXIgcz0wLHI9UC5GWCh0LkgpLHE9MSxwLG89W10s
-bixtLGwsayxqLGkKdmFyICRhc3luYyQkMT1QLmx6KGZ1bmN0aW9uKGIsYyl7aWYoYj09PTEpe3A9Ywpz
-PXF9d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9Mwpkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5h
-ZGQoInJlcnVubmluZyIpCnM9NgpyZXR1cm4gUC5qUShMLnR5KCIvcmVydW4tbWlncmF0aW9uIixudWxs
-KSwkYXN5bmMkJDEpCmNhc2UgNjpuPWMKaz1uCmsudG9TdHJpbmcKaWYoSC5wOChKLng5KGssInN1Y2Nl
-c3MiKSkpdC5GLmEod2luZG93LmxvY2F0aW9uKS5yZWxvYWQoKQplbHNlIEwuSzAodC5ldy5hKEoueDko
-biwiZXJyb3JzIikpKQpvLnB1c2goNSkKcz00CmJyZWFrCmNhc2UgMzpxPTIKaT1wCm09SC5SdShpKQps
-PUgudHMoaSkKTC5DMigiRmFpbGVkIHRvIHJlcnVuIG1pZ3JhdGlvbiIsbSxsKQpvLnB1c2goNSkKcz00
-CmJyZWFrCmNhc2UgMjpvPVsxXQpjYXNlIDQ6cT0xCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92
-ZSgicmVydW5uaW5nIikKcz1vLnBvcCgpCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNh
-c2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxyKX0sCiRTOjd9Ckwu
-SGkucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5WLmEoYSkKQy5vbC5Qbyh3aW5kb3csUC5YZCgi
-aHR0cHMiLCJnaXRodWIuY29tIiwiZGFydC1sYW5nL3Nkay9pc3N1ZXMvbmV3IixQLkVGKFsidGl0bGUi
-LCJDdXN0b21lci1yZXBvcnRlZCBpc3N1ZSB3aXRoIE5OQkQgbWlncmF0aW9uIHRvb2wiLCJsYWJlbHMi
-LHUuZCwiYm9keSIsIiMjIyMgU3RlcHMgdG8gcmVwcm9kdWNlXG5cbiMjIyMgV2hhdCBkaWQgeW91IGV4
-cGVjdCB0byBoYXBwZW4/XG5cbiMjIyMgV2hhdCBhY3R1YWxseSBoYXBwZW5lZD9cblxuX1NjcmVlbnNo
-b3RzIGFyZSBhcHByZWNpYXRlZF9cblxuKipEYXJ0IFNESyB2ZXJzaW9uKio6ICIrSC5Faihkb2N1bWVu
-dC5nZXRFbGVtZW50QnlJZCgic2RrLXZlcnNpb24iKS50ZXh0Q29udGVudCkrIlxuXG5UaGFua3MgZm9y
-IGZpbGluZyFcbiJdLHQuTix0LnopKS5nbkQoKSwicmVwb3J0LXByb2JsZW0iKX0sCiRTOjF9CkwuQlQu
-cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5WLmEoYSkKcz1kb2N1bWVudC5xdWVyeVNl
-bGVjdG9yKCIucG9wdXAtcGFuZSIpLnN0eWxlCnMuZGlzcGxheT0ibm9uZSIKcmV0dXJuIm5vbmUifSwK
-JFM6MX0KTC5QWS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvCnQuVi5hKGEp
-CnM9JC5EOSgpLmlubmVyVGV4dApyPXQuaC5hKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXYtcGFu
-ZWwgW2RhdGEtbmFtZSo9IicrVy5MaihzKSsnIl0nKS5wYXJlbnROb2RlKQpxPXIucXVlcnlTZWxlY3Rv
-cigiLnN0YXR1cy1pY29uIikKcD0kLklSCnAudG9TdHJpbmcKbz1MLnl3KHAscykKaWYobyBpbnN0YW5j
-ZW9mIEwuY0Qpe3A9by54CnAudG9TdHJpbmd9ZWxzZSBwPSExCmlmKHApe0wuT3QobykKTC54bihxLG8p
-CkwuQVIocixvKX19LAokUzoxfQpMLkwucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixx
-LHAKdC5CLmEoYSkKcz10LkYKcj1zLmEod2luZG93LmxvY2F0aW9uKS5wYXRobmFtZQpyLnRvU3RyaW5n
-CnE9TC5HNihzLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQpwPUwuYUsocy5hKHdpbmRvdy5sb2NhdGlv
-bikuaHJlZikKaWYoci5sZW5ndGg+MSlMLkc3KHIscSxwLCExLG51bGwpCmVsc2V7TC5CRShyLEIud1Io
-KSwhMCkKTC5CWCgiJm5ic3A7IixudWxsKX19LAokUzoxN30KTC5XeC5wcm90b3R5cGU9ewokMTpmdW5j
-dGlvbihhKXt2YXIgcyxyLHEscCxvPSJjb2xsYXBzZWQiCnQuVi5hKGEpCnM9dGhpcy5hCnI9Si5ZRShz
-KQpxPXRoaXMuYgpwPUouWUUocSkKaWYoIXIuZ1AocykudGcoMCxvKSl7ci5nUChzKS5pKDAsbykKcC5n
-UChxKS5pKDAsbyl9ZWxzZXtyLmdQKHMpLlIoMCxvKQpwLmdQKHEpLlIoMCxvKX19LAokUzoxfQpMLkFP
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzPUoucUYodC5oLmEoYSkpLHI9cy4kdGkscT1y
-LkMoIn4oMSk/IikuYShuZXcgTC5kTih0aGlzLmEpKQp0LlouYShudWxsKQpXLkpFKHMuYSxzLmIscSwh
-MSxyLmMpfSwKJFM6M30KTC5kTi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gTC50Mih0
-LlYuYShhKSx0aGlzLmEpfSwKJFM6MX0KTC5Iby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
-cyxyLHEKdC5oLmEoYSkKcz1KLnFGKGEpCnI9cy4kdGkKcT1yLkMoIn4oMSk/IikuYShuZXcgTC54eihh
-LHRoaXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpMLnh6LnBy
-b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwCnQuVi5hKGEpCnM9dGhpcy5hCnI9cy5n
-ZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhzKSkuT1UoIm9mZnNldCIpKQpyLnRv
-U3RyaW5nCnE9UC5RQShyLG51bGwpCnM9cy5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcg
-Vy5pNyhzKSkuT1UoImxpbmUiKSkKcy50b1N0cmluZwpwPVAuUUEocyxudWxsKQpzPXRoaXMuYgpzLnRv
-U3RyaW5nCkwuaFgocyxxLHApfSwKJFM6MX0KTC5JQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
-YXIgcz1KLnFGKHQuaC5hKGEpKSxyPXMuJHRpCnIuQygifigxKT8iKS5hKEwuaVMoKSkKdC5aLmEobnVs
-bCkKVy5KRShzLmEscy5iLEwuaVMoKSwhMSxyLmMpfSwKJFM6M30KTC5mQy5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXt0LnAuYShhKQp0aGlzLmEuYU0oMCx0aGlzLmIpfSwKJFM6NDZ9CkwuVG0ucHJvdG90
-eXBlPXsKJDE6ZnVuY3Rpb24oYSl7SC5uKGEpCnJldHVybiBhLmxlbmd0aD40MD9DLnhCLk5qKGEsMCw0
-MCkrIi4uLiI6YX0sCiRTOjJ9CkwublQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMu
-YSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9CkwuTlkucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZy
-KHRoaXMuYSxudWxsLG51bGwpfSwKJFM6MH0KTC51ZS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0
-LmYuYShhKQpyZXR1cm4gSC5FaihhLnEoMCwic2V2ZXJpdHkiKSkrIiAtICIrSC5FaihhLnEoMCwibWVz
-c2FnZSIpKSsiIGF0ICIrSC5FaihhLnEoMCwibG9jYXRpb24iKSkrIiAtICgiK0guRWooYS5xKDAsImNv
-ZGUiKSkrIikifSwKJFM6NDd9CkwuR0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5oLmEoYSkK
-JC56QigpCnQuZXMuYSgkLm93KCkucSgwLCJobGpzIikpLlY3KCJoaWdobGlnaHRCbG9jayIsW2FdKX0s
-CiRTOjN9CkwuRUUucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscgp0LlYuYShhKS5wcmV2
-ZW50RGVmYXVsdCgpCnM9dGhpcy5hCnI9dGhpcy5iCkwuYWYodC5GLmEod2luZG93LmxvY2F0aW9uKS5w
-YXRobmFtZSxzLHIsITAsbmV3IEwuUUwocyxyKSkKTC5oWCh0aGlzLmMscyxyKX0sCiRTOjF9CkwuUUwu
-cHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHQuRi5hKHdpbmRvdy5sb2NhdGlvbikucGF0aG5h
-bWUsdGhpcy5hLHRoaXMuYil9LAokUzowfQpMLlZTLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHI9InNlbGVjdGVkLWZpbGUiCnQuaC5hKGEpCnM9Si5ZRShhKQppZihhLmdldEF0dHJpYnV0ZSgi
-ZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGEpKS5PVSgibmFtZSIpKT09PXRoaXMuYS5hKXMuZ1AoYSku
-aSgwLHIpCmVsc2Ugcy5nUChhKS5SKDAscil9LAokUzozfQpMLlRELnByb3RvdHlwZT17CiQxOmZ1bmN0
-aW9uKGEpe3ZhciBzLHIKdC5WLmEoYSkKcz10aGlzLmEKc3dpdGNoKHMuZ0woKSl7Y2FzZSBDLmN3OmJy
-ZWFrCmNhc2UgQy5XRDpzLm5HKCkKYnJlYWsKY2FzZSBDLlhqOnMuYzIoKQpicmVhawpjYXNlIEMuZGM6
-cy5jMigpCmJyZWFrfXI9dGhpcy5iCkwuYkwocixzKQpMLnhuKHRoaXMuYyxzKQpMLkFSKHIscyl9LAok
-UzoxfQpMLklmLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzCnQuVi5hKGEpCnM9dGhpcy5h
-CkwuT3QocykKTC54bih0aGlzLmIscykKTC5BUih0aGlzLmMscyl9LAokUzoxfQpMLnRCLnByb3RvdHlw
-ZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBMLnQyKHQuVi5hKGEpLCEwKX0sCiRTOjF9CkwubTIucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUkkodC5WLmEoYSkpfSwKUkk6ZnVuY3Rp
-b24oYSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxPTEscCxvPVtdLG49dGhpcyxtLGwsayxqLGksaCxnLGYs
-ZQp2YXIgJGFzeW5jJCQxPVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0
-cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0zCmk9ZG9jdW1lbnQKbT1DLkNELnpRKGkucXVlcnlTZWxlY3Rv
-cigiLmNvbnRlbnQiKS5zY3JvbGxUb3ApCmg9dC5OCnM9NgpyZXR1cm4gUC5qUShMLnR5KEwuUTQoIi9h
-cHBseS1oaW50IixQLkZsKGgsaCkpLG4uYS5MdCgpKSwkYXN5bmMkJDEpCmNhc2UgNjpoPW4uYgpnPWgu
-YQpnLnRvU3RyaW5nCmw9TC5VcyhnKQpzPTcKcmV0dXJuIFAualEoTC5HNyhsLG51bGwsaC5iLCExLG51
-bGwpLCRhc3luYyQkMSkKY2FzZSA3OmkuYm9keS5jbGFzc0xpc3QuYWRkKCJuZWVkcy1yZXJ1biIpCmk9
-aS5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpCmkudG9TdHJpbmcKaS5zY3JvbGxUb3A9Qy5qbi56USht
-KQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZT1wCms9SC5SdShlKQpqPUgudHMoZSkKTC5DMigiY291
-bGRuJ3QgYXBwbHkgaGludCIsayxqKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0
-dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5
-bmMkJDEscil9LAokUzo3fQpMLlFXLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-YSsiOlxuIit0aGlzLmJ9LAokaVJ6OjF9CkwuWEEucHJvdG90eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMp
-e3JldHVybiEwfSwKaTA6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LAokaWtGOjF9CkwudnQucHJvdG90eXBl
-PXsKZ0w6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsPXRoaXMuZAppZihsLmxlbmd0aD09PTAp
-cmV0dXJuIEMuY3cKcz1DLk5tLmd0SChsKS5nTCgpCmZvcihyPWwubGVuZ3RoLHE9ITAscD0hMCxvPTA7
-bzxsLmxlbmd0aDtsLmxlbmd0aD09PXJ8fCgwLEgubGspKGwpLCsrbyl7bj1sW29dLmdMKCkKaWYobiE9
-cylzPW51bGwKbT1uIT09Qy5jdwppZihtJiZuIT09Qy5XRClxPSExCmlmKG0mJm4hPT1DLlhqKXA9ITF9
-aWYocyE9bnVsbClyZXR1cm4gcwppZihxKXJldHVybiBDLldECmlmKHApcmV0dXJuIEMuWGoKcmV0dXJu
-IEMuZGN9LApMVjpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMuZAppZihwIT1udWxsKWZvcihzPXAu
-bGVuZ3RoLHI9MDtyPHM7KytyKXtxPXBbcl0KaWYocS5iPT09JClxLmI9dGhpcwplbHNlIEgudihuZXcg
-SC5jKCJGaWVsZCAncGFyZW50JyBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiIpKX19LApjMjpm
-dW5jdGlvbigpe3ZhciBzLHIscSxwLG8KZm9yKHM9dGhpcy5kLHI9cy5sZW5ndGgscT0wO3E8cy5sZW5n
-dGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3Epe3A9c1txXQppZihwIGluc3RhbmNlb2YgTC52
-dClwLmMyKCkKZWxzZXtpZihwIGluc3RhbmNlb2YgTC5jRCl7bz1wLngKby50b1N0cmluZwpvPW8mJnAu
-cj09PUMuWGp9ZWxzZSBvPSExCmlmKG8pcC5yPUMuV0R9fX0sCm5HOmZ1bmN0aW9uKCl7dmFyIHMscixx
-LHAsbwpmb3Iocz10aGlzLmQscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgw
-LEgubGspKHMpLCsrcSl7cD1zW3FdCmlmKHAgaW5zdGFuY2VvZiBMLnZ0KXAubkcoKQplbHNle2lmKHAg
-aW5zdGFuY2VvZiBMLmNEKXtvPXAueApvLnRvU3RyaW5nCm89byYmcC5yPT09Qy5XRH1lbHNlIG89ITEK
-aWYobylwLnI9Qy5Yan19fSwKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyPVAuRmwodC5OLHQuWCkKci5ZNSgw
-LCJ0eXBlIiwiZGlyZWN0b3J5IikKci5ZNSgwLCJuYW1lIix0aGlzLmEpCnM9dGhpcy5kCnMudG9TdHJp
-bmcKci5ZNSgwLCJzdWJ0cmVlIixMLlZEKHMpKQpzPXRoaXMuYwppZihzIT1udWxsKXIuWTUoMCwicGF0
-aCIscykKcmV0dXJuIHJ9fQpMLmNELnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7dmFyIHMscj10aGlz
-LHE9UC5GbCh0Lk4sdC5YKQpxLlk1KDAsInR5cGUiLCJmaWxlIikKcS5ZNSgwLCJuYW1lIixyLmEpCnM9
-ci5jCmlmKHMhPW51bGwpcS5ZNSgwLCJwYXRoIixzKQpzPXIuZAppZihzIT1udWxsKXEuWTUoMCwiaHJl
-ZiIscykKcz1yLmUKaWYocyE9bnVsbClxLlk1KDAsImVkaXRDb3VudCIscykKcz1yLmYKaWYocyE9bnVs
-bClxLlk1KDAsIndhc0V4cGxpY2l0bHlPcHRlZE91dCIscykKcz1yLnIKaWYocyE9bnVsbClxLlk1KDAs
-Im1pZ3JhdGlvblN0YXR1cyIscy5hKQpzPXIueAppZihzIT1udWxsKXEuWTUoMCwibWlncmF0aW9uU3Rh
-dHVzQ2FuQmVDaGFuZ2VkIixzKQpyZXR1cm4gcX0sCmdMOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucn19
-CkwuRDgucHJvdG90eXBlPXt9CkwuTzkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5ifX0KTC5HYi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9fQpSLkxMLnBy
-b3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJub2RlSWQiLHRoaXMuYiwia2luZCIs
-dGhpcy5hLmFdLHQuTix0LlgpfX0KUi5NRC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
-dC5ncC5hKGEpLmE9PT10aGlzLmEucSgwLCJraW5kIil9LAokUzo0OH0KUi5INy5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9fQpNLmxJLnByb3RvdHlwZT17CldPOmZ1bmN0aW9uKGEs
-Yil7dmFyIHMscixxPXQuZDQKTS5ZRigiYWJzb2x1dGUiLEguUUkoW2IsbnVsbCxudWxsLG51bGwsbnVs
-bCxudWxsLG51bGxdLHEpKQpzPXRoaXMuYQpzPXMuWXIoYik+MCYmIXMuaEsoYikKaWYocylyZXR1cm4g
-YgpzPUQuYWIoKQpyPUguUUkoW3MsYixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0scSkKTS5Z
-Rigiam9pbiIscikKcmV0dXJuIHRoaXMuSVAobmV3IEgudTYocix0LmVKKSl9LAp6ZjpmdW5jdGlvbihh
-KXt2YXIgcyxyLHE9WC5DTChhLHRoaXMuYSkKcS5JeCgpCnM9cS5kCnI9cy5sZW5ndGgKaWYocj09PTAp
-e3M9cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKHI9PT0xKXtzPXEuYgpyZXR1cm4gcz09bnVsbD8i
-LiI6c31pZigwPj1yKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49cy5sZW5ndGgp
-cmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpxLkl4KCkKcmV0dXJuIHEudygwKX0sCklQOmZ1bmN0aW9u
-KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqCnQuTy5hKGEpCmZvcihzPWEuJHRpLHI9cy5DKCJhMihj
-WC5FKSIpLmEobmV3IE0ucTcoKSkscT1hLmdtKGEpLHM9bmV3IEguU08ocSxyLHMuQygiU088Y1guRT4i
-KSkscj10aGlzLmEscD0hMSxvPSExLG49IiI7cy5GKCk7KXttPXEuZ2woKQppZihyLmhLKG0pJiZvKXts
-PVguQ0wobSxyKQprPW4uY2hhckNvZGVBdCgwKT09MD9uOm4Kbj1DLnhCLk5qKGssMCxyLlNwKGssITAp
-KQpsLmI9bgppZihyLmRzKG4pKUMuTm0uWTUobC5lLDAsci5nbUkoKSkKbj0iIitsLncoMCl9ZWxzZSBp
-ZihyLllyKG0pPjApe289IXIuaEsobSkKbj0iIittfWVsc2V7aj1tLmxlbmd0aAppZihqIT09MCl7aWYo
-MD49ailyZXR1cm4gSC5PSChtLDApCmo9ci5VZChtWzBdKX1lbHNlIGo9ITEKaWYoIWopaWYocCluKz1y
-LmdtSSgpCm4rPW19cD1yLmRzKG0pfXJldHVybiBuLmNoYXJDb2RlQXQoMCk9PTA/bjpufSwKbzU6ZnVu
-Y3Rpb24oYSl7dmFyIHMKaWYoIXRoaXMueTMoYSkpcmV0dXJuIGEKcz1YLkNMKGEsdGhpcy5hKQpzLnJS
-KCkKcmV0dXJuIHMudygwKX0sCnkzOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsaz10aGlz
-LmEsaj1rLllyKGEpCmlmKGohPT0wKXtpZihrPT09JC5LaygpKWZvcihzPTA7czxqOysrcylpZihDLnhC
-LlcoYSxzKT09PTQ3KXJldHVybiEwCnI9agpxPTQ3fWVsc2V7cj0wCnE9bnVsbH1mb3IocD1uZXcgSC5x
-aihhKS5hLG89cC5sZW5ndGgscz1yLG49bnVsbDtzPG87KytzLG49cSxxPW0pe209Qy54Qi5PKHAscykK
-aWYoay5yNChtKSl7aWYoaz09PSQuS2soKSYmbT09PTQ3KXJldHVybiEwCmlmKHEhPW51bGwmJmsucjQo
-cSkpcmV0dXJuITAKaWYocT09PTQ2KWw9bj09bnVsbHx8bj09PTQ2fHxrLnI0KG4pCmVsc2UgbD0hMQpp
-ZihsKXJldHVybiEwfX1pZihxPT1udWxsKXJldHVybiEwCmlmKGsucjQocSkpcmV0dXJuITAKaWYocT09
-PTQ2KWs9bj09bnVsbHx8ay5yNChuKXx8bj09PTQ2CmVsc2Ugaz0hMQppZihrKXJldHVybiEwCnJldHVy
-biExfSwKSFA6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsPXRoaXMsaz0nVW5hYmxlIHRv
-IGZpbmQgYSBwYXRoIHRvICInCmI9bC5XTygwLGIpCnM9bC5hCmlmKHMuWXIoYik8PTAmJnMuWXIoYSk+
-MClyZXR1cm4gbC5vNShhKQppZihzLllyKGEpPD0wfHxzLmhLKGEpKWE9bC5XTygwLGEpCmlmKHMuWXIo
-YSk8PTAmJnMuWXIoYik+MCl0aHJvdyBILmIoWC5JNyhrK2ErJyIgZnJvbSAiJytiKyciLicpKQpyPVgu
-Q0woYixzKQpyLnJSKCkKcT1YLkNMKGEscykKcS5yUigpCnA9ci5kCm89cC5sZW5ndGgKaWYobyE9PTAp
-e2lmKDA+PW8pcmV0dXJuIEguT0gocCwwKQpwPUouUk0ocFswXSwiLiIpfWVsc2UgcD0hMQppZihwKXJl
-dHVybiBxLncoMCkKcD1yLmIKbz1xLmIKaWYocCE9bylwPXA9PW51bGx8fG89PW51bGx8fCFzLk5jKHAs
-bykKZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQp3aGlsZSghMCl7cD1yLmQKbz1wLmxlbmd0aApp
-ZihvIT09MCl7bj1xLmQKbT1uLmxlbmd0aAppZihtIT09MCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDAp
-CnA9cFswXQppZigwPj1tKXJldHVybiBILk9IKG4sMCkKbj1zLk5jKHAsblswXSkKcD1ufWVsc2UgcD0h
-MX1lbHNlIHA9ITEKaWYoIXApYnJlYWsKQy5ObS5XNChyLmQsMCkKQy5ObS5XNChyLmUsMSkKQy5ObS5X
-NChxLmQsMCkKQy5ObS5XNChxLmUsMSl9cD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49byly
-ZXR1cm4gSC5PSChwLDApCnA9Si5STShwWzBdLCIuLiIpfWVsc2UgcD0hMQppZihwKXRocm93IEguYihY
-Lkk3KGsrYSsnIiBmcm9tICInK2IrJyIuJykpCnA9dC5OCkMuTm0uVUcocS5kLDAsUC5POChyLmQubGVu
-Z3RoLCIuLiIsITEscCkpCkMuTm0uWTUocS5lLDAsIiIpCkMuTm0uVUcocS5lLDEsUC5POChyLmQubGVu
-Z3RoLHMuZ21JKCksITEscCkpCnM9cS5kCnA9cy5sZW5ndGgKaWYocD09PTApcmV0dXJuIi4iCmlmKHA+
-MSYmSi5STShDLk5tLmdyWihzKSwiLiIpKXtzPXEuZAppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChz
-LC0xKQpzLnBvcCgpCnM9cS5lCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkK
-aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpDLk5tLmkocywiIil9cS5iPSIi
-CnEuSXgoKQpyZXR1cm4gcS53KDApfX0KTS5xNy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1
-cm4gSC5uKGEpIT09IiJ9LAokUzo2fQpNLk5vLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guayhh
-KQpyZXR1cm4gYT09bnVsbD8ibnVsbCI6JyInK2ErJyInfSwKJFM6NDl9CkIuZnYucHJvdG90eXBlPXsK
-eFo6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLllyKGEpCmlmKHI+MClyZXR1cm4gQy54Qi5OaihhLDAs
-cikKaWYodGhpcy5oSyhhKSl7aWYoMD49YS5sZW5ndGgpcmV0dXJuIEguT0goYSwwKQpzPWFbMF19ZWxz
-ZSBzPW51bGwKcmV0dXJuIHN9LApOYzpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yn19ClguV0QucHJv
-dG90eXBlPXsKSXg6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcwp3aGlsZSghMCl7cz1xLmQKaWYoIShz
-Lmxlbmd0aCE9PTAmJkouUk0oQy5ObS5ncloocyksIiIpKSlicmVhawpzPXEuZAppZigwPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnM9cS5lCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9I
-KHMsLTEpCnMucG9wKCl9cz1xLmUKcj1zLmxlbmd0aAppZihyIT09MClDLk5tLlk1KHMsci0xLCIiKX0s
-CnJSOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPUguUUkoW10sdC5zKQpmb3Iocz1t
-LmQscj1zLmxlbmd0aCxxPTAscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwr
-K3Ape289c1twXQpuPUouaWEobykKaWYoIShuLkROKG8sIi4iKXx8bi5ETihvLCIiKSkpaWYobi5ETihv
-LCIuLiIpKXtuPWwubGVuZ3RoCmlmKG4hPT0wKXtpZigwPj1uKXJldHVybiBILk9IKGwsLTEpCmwucG9w
-KCl9ZWxzZSArK3F9ZWxzZSBDLk5tLmkobCxvKX1pZihtLmI9PW51bGwpQy5ObS5VRyhsLDAsUC5POChx
-LCIuLiIsITEsdC5OKSkKaWYobC5sZW5ndGg9PT0wJiZtLmI9PW51bGwpQy5ObS5pKGwsIi4iKQptLnNu
-SihsKQpzPW0uYQptLnNQaChQLk84KGwubGVuZ3RoKzEscy5nbUkoKSwhMCx0Lk4pKQpyPW0uYgppZihy
-PT1udWxsfHxsLmxlbmd0aD09PTB8fCFzLmRzKHIpKUMuTm0uWTUobS5lLDAsIiIpCnI9bS5iCmlmKHIh
-PW51bGwmJnM9PT0kLktrKCkpe3IudG9TdHJpbmcKbS5iPUgueXMociwiLyIsIlxcIil9bS5JeCgpfSwK
-dzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcyxwPXEuYgpwPXAhPW51bGw/IiIrcDoiIgpmb3Iocz0w
-O3M8cS5kLmxlbmd0aDsrK3Mpe3I9cS5lCmlmKHM+PXIubGVuZ3RoKXJldHVybiBILk9IKHIscykKcj1w
-K0guRWoocltzXSkKcD1xLmQKaWYocz49cC5sZW5ndGgpcmV0dXJuIEguT0gocCxzKQpwPXIrSC5Faihw
-W3NdKX1wKz1ILkVqKEMuTm0uZ3JaKHEuZSkpCnJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwK
-c25KOmZ1bmN0aW9uKGEpe3RoaXMuZD10LmEuYShhKX0sCnNQaDpmdW5jdGlvbihhKXt0aGlzLmU9dC5h
-LmEoYSl9fQpYLmR2LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlBhdGhFeGNlcHRpb246
-ICIrdGhpcy5hfSwKJGlSejoxfQpPLnpMLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuZ29jKHRoaXMpfX0KRS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50
-ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFy
-IHM9YS5sZW5ndGgKcmV0dXJuIHMhPT0wJiZDLnhCLk8oYSxzLTEpIT09NDd9LApTcDpmdW5jdGlvbihh
-LGIpe2lmKGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00NylyZXR1cm4gMQpyZXR1cm4gMH0sClly
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuITF9
-LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXgifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifX0K
-Ri5ydS5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpm
-dW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHM9YS5sZW5ndGgKaWYo
-cz09PTApcmV0dXJuITEKaWYoQy54Qi5PKGEscy0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRj
-KGEsIjovLyIpJiZ0aGlzLllyKGEpPT09c30sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz1h
-Lmxlbmd0aAppZihvPT09MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcihz
-PTA7czxvOysrcyl7cj1DLnhCLlcoYSxzKQppZihyPT09NDcpcmV0dXJuIDAKaWYocj09PTU4KXtpZihz
-PT09MClyZXR1cm4gMApxPUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIscysxKT9zKzM6cykKaWYo
-cTw9MClyZXR1cm4gbwppZighYnx8bzxxKzMpcmV0dXJuIHEKaWYoIUMueEIubihhLCJmaWxlOi8vIikp
-cmV0dXJuIHEKaWYoIUIuWXUoYSxxKzEpKXJldHVybiBxCnA9cSszCnJldHVybiBvPT09cD9wOnErNH19
-cmV0dXJuIDB9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXty
-ZXR1cm4idXJsIn0sCmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9
-PT00N3x8YT09PTkyfSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHM9YS5sZW5ndGgKaWYocz09PTApcmV0dXJu
-ITEKcz1DLnhCLk8oYSxzLTEpCnJldHVybiEocz09PTQ3fHxzPT09OTIpfSwKU3A6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyLHE9YS5sZW5ndGgKaWYocT09PTApcmV0dXJuIDAKcz1DLnhCLlcoYSwwKQppZihzPT09
-NDcpcmV0dXJuIDEKaWYocz09PTkyKXtpZihxPDJ8fEMueEIuVyhhLDEpIT09OTIpcmV0dXJuIDEKcj1D
-LnhCLlhVKGEsIlxcIiwyKQppZihyPjApe3I9Qy54Qi5YVShhLCJcXCIscisxKQppZihyPjApcmV0dXJu
-IHJ9cmV0dXJuIHF9aWYocTwzKXJldHVybiAwCmlmKCFCLk9TKHMpKXJldHVybiAwCmlmKEMueEIuVyhh
-LDEpIT09NTgpcmV0dXJuIDAKcT1DLnhCLlcoYSwyKQppZighKHE9PT00N3x8cT09PTkyKSlyZXR1cm4g
-MApyZXR1cm4gM30sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMuWXIoYSk9PT0xfSwKT3Q6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihhPT09
-YilyZXR1cm4hMAppZihhPT09NDcpcmV0dXJuIGI9PT05MgppZihhPT09OTIpcmV0dXJuIGI9PT00Nwpp
-ZigoYV5iKSE9PTMyKXJldHVybiExCnM9YXwzMgpyZXR1cm4gcz49OTcmJnM8PTEyMn0sCk5jOmZ1bmN0
-aW9uKGEsYil7dmFyIHMscgppZihhPT09YilyZXR1cm4hMApzPWEubGVuZ3RoCmlmKHMhPT1iLmxlbmd0
-aClyZXR1cm4hMQpmb3Iocj0wO3I8czsrK3IpaWYoIXRoaXMuT3QoQy54Qi5XKGEsciksQy54Qi5XKGIs
-cikpKXJldHVybiExCnJldHVybiEwfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuIndpbmRvd3MifSwKZ21J
-OmZ1bmN0aW9uKCl7cmV0dXJuIlxcIn19OyhmdW5jdGlvbiBhbGlhc2VzKCl7dmFyIHM9Si5Hdi5wcm90
-b3R5cGUKcy5VPXMudwpzPUouTUYucHJvdG90eXBlCnMudD1zLncKcz1QLmNYLnByb3RvdHlwZQpzLkdH
-PXMuZXYKcz1QLk1oLnByb3RvdHlwZQpzLnhiPXMudwpzPVcuY3YucHJvdG90eXBlCnMuRFc9cy5yNgpz
-PVcubTYucHJvdG90eXBlCnMuakY9cy5FYgpzPVAuRTQucHJvdG90eXBlCnMuVXI9cy5xCnMuZTQ9cy5Z
-NQpzPVAudmcucHJvdG90eXBlCnMuYmg9cy5ZNX0pKCk7KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygp
-e3ZhciBzPWh1bmtIZWxwZXJzLl9zdGF0aWNfMSxyPWh1bmtIZWxwZXJzLl9zdGF0aWNfMCxxPWh1bmtI
-ZWxwZXJzLmluc3RhbGxJbnN0YW5jZVRlYXJPZmYscD1odW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVh
-ck9mZixvPWh1bmtIZWxwZXJzLl9pbnN0YW5jZV8xdQpzKFAsIkVYIiwiWlYiLDUpCnMoUCwieXQiLCJv
-QSIsNSkKcyhQLCJxVyIsIkJ6Iiw1KQpyKFAsIlVJIiwiZU4iLDApCnEoUC5QZi5wcm90b3R5cGUsImdZ
-SiIsMCwxLG51bGwsWyIkMiIsIiQxIl0sWyJ3MCIsInBtIl0sNDAsMCwwKQpzKFAsIkN5IiwiTkMiLDQp
-CnMoUCwiUEgiLCJNdCIsMikKcChXLCJwUyIsNCxudWxsLFsiJDQiXSxbInFEIl0sMTQsMCkKcChXLCJW
-NCIsNCxudWxsLFsiJDQiXSxbIm5aIl0sMTQsMCkKbyhQLkFzLnByb3RvdHlwZSwiZ3VNIiwiViIsMikK
-cyhQLCJpRyIsIndZIiw1MikKcyhQLCJ3MCIsImRVIiwzNSkKcyhMLCJpUyIsImk2IiwxKX0pKCk7KGZ1
-bmN0aW9uIGluaGVyaXRhbmNlKCl7dmFyIHM9aHVua0hlbHBlcnMubWl4aW4scj1odW5rSGVscGVycy5p
-bmhlcml0LHE9aHVua0hlbHBlcnMuaW5oZXJpdE1hbnkKcihQLk1oLG51bGwpCnEoUC5NaCxbSC5GSyxK
-Lkd2LEoubTEsUC5jWCxILmVULFAuWFMsUC5uWSxILmE3LFAuQW4sSC5GdSxILkpCLEguU1UsSC5SZSxI
-Lnd2LFAuUG4sSC5XVSxILkxJLEguVHAsSC5mOSxILnRlLEguYnEsSC5YTyxILmtyLFAuWWssSC52aCxI
-Lk42LEguVlIsSC5FSyxILlBiLEgudFEsSC5TZCxILkpjLEguRyxQLlczLFAuaWgsUC5GeSxQLkdWLFAu
-Q3csUC5QZixQLkZlLFAudnMsUC5PTSxQLnFoLFAuTU8sUC5rVCxQLnhJLFAubTAsUC5wUixQLmJuLFAu
-bG0sUC5sRCxQLktQLFAubGYsUC5XWSxQLlVrLFAuU2gsUC5SdyxQLmJ6LFAuaVAsUC5rNSxQLktZLFAu
-Q0QsUC5hRSxQLk4zLFAuYzgsUC5aZCxQLk0sUC5EbixQLlBFLFAuVWYsVy5pZCxXLkZrLFcuSlEsVy5H
-bSxXLnZELFcubTYsVy5PdyxXLlc5LFcuZFcsVy5tayxXLktvLFAuaUosUC5FNCxVLmQyLFUuU2UsVS5N
-bCxVLnlELFUud2IsQi5qOCxCLnFwLFQubVEsTC5YQSxMLkQ4LEwuTzksTC5HYixSLkxMLFIuSDcsTS5s
-SSxPLnpMLFguV0QsWC5kdl0pCnEoSi5HdixbSi55RSxKLndlLEouTUYsSi5qZCxKLnFJLEouRHIsSC5F
-VCxXLkQwLFcuQXosVy5MZSxXLk5oLFcuYWUsVy5JQixXLm43LFcuZWEsVy5icixXLlNnLFcudTgsVy5L
-NyxXLlhXLFAuaEZdKQpxKEouTUYsW0ouaUMsSi5rZCxKLmM1XSkKcihKLlBvLEouamQpCnEoSi5xSSxb
-Si5iVSxKLmtEXSkKcShQLmNYLFtILkJSLEguYlEsSC5pMSxILlU1LEguQU0sSC51NixILlhSLFAubVcs
-SC51bl0pCnEoSC5CUixbSC5aeSxILlFDXSkKcihILm9sLEguWnkpCnIoSC5VcSxILlFDKQpyKEgualYs
-SC5VcSkKcShQLlhTLFtILmMsUC5FeixILmF6LEgudlYsSC5FcSxQLkM2LEgua1MsUC5VZCxQLkYsUC5B
-VCxQLm1wLFAudWIsUC5kcyxQLmxqLFAuVVYsUC5wLEwuUVddKQpyKFAudXksUC5uWSkKcShQLnV5LFtI
-LncyLFcud3osVy5lN10pCnIoSC5xaixILncyKQpxKEguYlEsW0guYUwsSC5NQixILmk1XSkKcShILmFM
-LFtILm5ILEgubEosUC5pOF0pCnIoSC54eSxILmkxKQpxKFAuQW4sW0guTUgsSC5TTyxILlUxXSkKcihI
-LmQ1LEguQU0pCnIoUC5SVSxQLlBuKQpyKFAuR2osUC5SVSkKcihILlBELFAuR2opCnIoSC5MUCxILldV
-KQpxKEguVHAsW0guQ2osSC5sYyxILmRDLEgud04sSC5WWCxQLnRoLFAuaGEsUC5WcyxQLkZ0LFAueUgs
-UC5XTSxQLlNYLFAuR3MsUC5kYSxQLm9RLFAucFYsUC5VNyxQLnZyLFAucnQsUC5LRixQLlpMLFAuUlQs
-UC5qWixQLnJxLFAuUlcsUC5CNSxQLnVPLFAuRXYsUC5WcCxQLk9SLFAucmEsUC55USxQLnhyLFAuTnos
-UC50aSxQLldGLFAubjEsUC5jUyxQLlZDLFAuSlQsUC5SWixQLk1FLFAueTUsUC55SSxQLmM2LFAucWQs
-Vy5DdixXLktTLFcuQTMsVy52TixXLlV2LFcuRWcsVy5FbyxXLldrLFcuSUEsVy5mbSxQLkUyLFAuamcs
-UC5HRSxQLk43LFAudVEsUC5QQyxQLm10LFAuUVMsUC5ucCxQLlV0LFUuYU4sVS5iMCxMLmUsTC5WVyxM
-Lm9aLEwuanIsTC5xbCxMLnk4LEwuSGksTC5CVCxMLlBZLEwuTCxMLld4LEwuQU8sTC5kTixMLkhvLEwu
-eHosTC5JQyxMLmZDLEwuVG0sTC5uVCxMLk5ZLEwudWUsTC5HSCxMLkVFLEwuUUwsTC5WUyxMLlRELEwu
-SWYsTC50QixMLm0yLFIuTUQsTS5xNyxNLk5vXSkKcihILlcwLFAuRXopCnEoSC5sYyxbSC56eCxILnJU
-XSkKcihILmtZLFAuQzYpCnIoUC5pbCxQLllrKQpxKFAuaWwsW0guTjUsUC51dyxXLmNmLFcuU3ldKQpx
-KFAubVcsW0guS1csUC5xNF0pCnIoSC5MWixILkVUKQpxKEguTFosW0guUkcsSC5XQl0pCnIoSC5WUCxI
-LlJHKQpyKEguRGcsSC5WUCkKcihILlpHLEguV0IpCnIoSC5QZyxILlpHKQpxKEguUGcsW0gueGosSC5k
-RSxILlpBLEguZFQsSC5QcSxILmVFLEguVjZdKQpyKEguaU0sSC5rUykKcihQLlpmLFAuUGYpCnIoUC5K
-aSxQLm0wKQpyKFAuWHYsUC5wUikKcihQLmI2LFAuWHYpCnIoUC5WaixQLldZKQpxKFAuVWssW1AuQ1Ys
-UC5aaSxQLmJ5XSkKcihQLndJLFAua1QpCnEoUC53SSxbUC5VOCxQLm9qLFAuTXgsUC5FMyxQLkdZXSkK
-cihQLks4LFAuVWQpCnIoUC50dSxQLlNoKQpyKFAudTUsUC5aaSkKcShQLkFULFtQLmJKLFAuZVldKQpy
-KFAucWUsUC5EbikKcShXLkQwLFtXLktWLFcud2EsVy5LNSxXLkNtXSkKcShXLktWLFtXLmN2LFcubngs
-Vy5RRixXLkNRXSkKcShXLmN2LFtXLnFFLFAuaGldKQpxKFcucUUsW1cuR2gsVy5mWSxXLnJaLFcuUVAs
-Vy5oNCxXLlNOLFcubHAsVy5UYixXLkl2LFcuV1AsVy55WV0pCnIoVy5vSixXLkxlKQpyKFcuaEgsVy5B
-eikKcihXLlZiLFcuUUYpCnIoVy5mSixXLndhKQpxKFcuZWEsW1cudzYsVy5ld10pCnIoVy5BaixXLnc2
-KQpyKFcuckIsVy5LNykKcihXLkJILFcuckIpCnIoVy53NCxXLklCKQpyKFcub2EsVy5YVykKcihXLnJo
-LFcub2EpCnIoVy5pNyxXLmNmKQpyKFAuQXMsUC5WaikKcShQLkFzLFtXLkk0LFAuS2VdKQpyKFcuUk8s
-UC5xaCkKcihXLkNxLFcuUk8pCnIoVy54QyxQLk1PKQpyKFcuY3QsVy5tNikKcihQLkJmLFAuaUopCnEo
-UC5FNCxbUC5yNyxQLnZnXSkKcihQLlR6LFAudmcpCnIoUC5uZCxQLmhpKQpxKEwuRDgsW0wudnQsTC5j
-RF0pCnIoQi5mdixPLnpMKQpxKEIuZnYsW0UuT0YsRi5ydSxMLklWXSkKcyhILncyLEguUmUpCnMoSC5R
-QyxQLmxEKQpzKEguUkcsUC5sRCkKcyhILlZQLEguU1UpCnMoSC5XQixQLmxEKQpzKEguWkcsSC5TVSkK
-cyhQLm5ZLFAubEQpCnMoUC5XWSxQLmxmKQpzKFAuUlUsUC5LUCkKcyhQLnBSLFAubGYpCnMoVy5MZSxX
-LmlkKQpzKFcuSzcsUC5sRCkKcyhXLnJCLFcuR20pCnMoVy5YVyxQLmxEKQpzKFcub2EsVy5HbSkKcyhQ
-LnZnLFAubEQpfSkoKQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30s
-dFBWOnt9LHNFQTpbXX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntJajoiaW50IixDUDoiZG91YmxlIixaWjoi
-bnVtIixxVToiU3RyaW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVz
-Ont9LHR5cGVzOlsifigpIiwifihBaikiLCJxVShxVSkiLCJ+KGN2KSIsIkAoQCkiLCJ+KH4oKSkiLCJh
-MihxVSkiLCJiODx+PihBaikiLCJ+KHFVLHFVKSIsIn4oTWg/LE1oPykiLCJAKCkiLCJ+KHFVLEApIiwi
-fih4dTxxVT4pIiwiYzgoQCkiLCJhMihjdixxVSxxVSxKUSkiLCJjOCgpIiwiYTIoa0YpIiwiYzgoZWEp
-IiwifihuNixxVSxJaikiLCJ+KHFVW0BdKSIsIklqKElqLElqKSIsIkAocVUpIiwifihxVSxxVT8pIiwi
-bjYoQCxAKSIsIn4ocVUsSWopIiwiYTIoS1YpIiwiWjA8cVUscVU+KFowPHFVLHFVPixxVSkiLCJ+KGVh
-KSIsIn4oR0QsQCkiLCJ2czxAPihAKSIsIn4oS1YsS1Y/KSIsIn4oQCxAKSIsImM4KEAsQCkiLCJhMih4
-dTxxVT4pIiwiYzgoTWgsR3opIiwiTWg/KEApIiwiVHo8QD4oQCkiLCJFNChAKSIsIkxMKEApIiwiWjA8
-cVUsTWg/PihMTCkiLCJ+KE1oW0d6P10pIiwiYzgofigpKSIsImM4KFowPHFVLE1oPz4/KSIsImM4KE1o
-LEApIiwicjcoQCkiLCJ+KElqLEApIiwifihldykiLCJxVShaMDxALEA+KSIsImEyKEg3KSIsInFVKHFV
-PykiLCJAKEAscVUpIiwifihAKSIsIk1oPyhNaD8pIiwiYzgoQCxHeikiXSxpbnRlcmNlcHRvcnNCeVRh
-ZzpudWxsLGxlYWZUYWdzOm51bGwsYXJyYXlSdGk6dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlw
-ZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj9TeW1ib2woIiR0aSIpOiIkdGkifQpILnhiKHYudHlwZVVuaXZl
-cnNlLEpTT04ucGFyc2UoJ3siaUMiOiJNRiIsImtkIjoiTUYiLCJjNSI6Ik1GIiwicngiOiJlYSIsImU1
-IjoiZWEiLCJZMCI6ImhpIiwidHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIsIkkw
-IjoiS1YiLCJocyI6IktWIiwiWGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhj
-IjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJhMiI6W119LCJ3ZSI6eyJj
-OCI6W119LCJNRiI6eyJ2bSI6W119LCJqZCI6eyJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJd
-fSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibTEiOnsi
-QW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJaWiI6W119LCJiVSI6eyJDUCI6W10sIklqIjpbXSwiWloi
-OltdfSwia0QiOnsiQ1AiOltdLCJaWiI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sImJRIjp7ImNY
-IjpbIjEiXX0sIkJSIjp7ImNYIjpbIjIiXX0sImVUIjp7IkFuIjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEi
-LCIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwib2wiOnsiWnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIs
-IjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIlVxIjp7ImxEIjpbIjIiXSwiek0i
-OlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXX0sImpWIjp7IlVxIjpbIjEi
-LCIyIl0sImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpb
-IjIiXSwibEQuRSI6IjIiLCJjWC5FIjoiMiJ9LCJjIjp7IlhTIjpbXX0sInFqIjp7ImxEIjpbIklqIl0s
-IlJlIjpbIklqIl0sInpNIjpbIklqIl0sImJRIjpbIklqIl0sImNYIjpbIklqIl0sImxELkUiOiJJaiIs
-IlJlLkUiOiJJaiJ9LCJhTCI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEiXSwi
-YlEiOlsiMSJdLCJjWCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJd
-fSwiaTEiOnsiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6WyIy
-Il0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsiMiJd
-LCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIx
-Il0sImNYLkUiOiIxIn0sIlNPIjp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6IjEi
-fSwiZDUiOnsiQU0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEiOnsi
-QW4iOlsiMSJdfSwiTUIiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7IkFu
-IjpbIjEiXX0sInU2Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwidzIi
-OnsibEQiOlsiMSJdLCJSZSI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3
-diI6eyJHRCI6W119LCJQRCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwi
-MiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQ
-Ijp7IldVIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIx
-In0sIkxJIjp7InZRIjpbXX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7IlhTIjpbXX0sInZWIjp7IlhTIjpb
-XX0sInRlIjp7IlJ6IjpbXX0sIlhPIjp7Ikd6IjpbXX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7IkVIIjpb
-XX0sInp4Ijp7IkVIIjpbXX0sInJUIjp7IkVIIjpbXX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7IlhTIjpb
-XX0sIk41Ijp7IllrIjpbIjEiLCIyIl0sIkZvIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl0sIllrLksi
-OiIxIiwiWWsuViI6IjIifSwiaTUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIk42
-Ijp7IkFuIjpbIjEiXX0sIlZSIjp7IndMIjpbXSwidlgiOltdfSwiRUsiOnsiaWIiOltdLCJPZCI6W119
-LCJLVyI6eyJjWCI6WyJpYiJdLCJjWC5FIjoiaWIifSwiUGIiOnsiQW4iOlsiaWIiXX0sInRRIjp7Ik9k
-IjpbXX0sInVuIjp7ImNYIjpbIk9kIl0sImNYLkUiOiJPZCJ9LCJTZCI6eyJBbiI6WyJPZCJdfSwiRVQi
-OnsiQVMiOltdfSwiTFoiOnsiWGoiOlsiMSJdLCJFVCI6W10sIkFTIjpbXX0sIkRnIjp7ImxEIjpbIkNQ
-Il0sIlhqIjpbIkNQIl0sInpNIjpbIkNQIl0sIkVUIjpbXSwiYlEiOlsiQ1AiXSwiQVMiOltdLCJjWCI6
-WyJDUCJdLCJTVSI6WyJDUCJdLCJsRC5FIjoiQ1AifSwiUGciOnsibEQiOlsiSWoiXSwiWGoiOlsiSWoi
-XSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpb
-IklqIl19LCJ4aiI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJR
-IjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQuRSI6IklqIn0sImRFIjp7
-ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMi
-OltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiWkEiOnsibEQiOlsiSWoiXSwi
-WGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklq
-Il0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9LCJkVCI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6
-TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoi
-XSwibEQuRSI6IklqIn0sIlBxIjp7ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVU
-IjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoi
-fSwiZUUiOnsibEQiOlsiSWoiXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJ
-aiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9LCJWNiI6eyJsRCI6
-WyJJaiJdLCJuNiI6W10sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwi
-QVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwia1MiOnsiWFMiOltdfSwi
-aU0iOnsiWFMiOltdfSwidnMiOnsiYjgiOlsiMSJdfSwiR1YiOnsiQW4iOlsiMSJdfSwicTQiOnsiY1gi
-OlsiMSJdLCJjWC5FIjoiMSJ9LCJDdyI6eyJYUyI6W119LCJaZiI6eyJQZiI6WyIxIl19LCJtMCI6eyJR
-bSI6W119LCJKaSI6eyJtMCI6W10sIlFtIjpbXX0sImI2Ijp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJi
-USI6WyIxIl0sImNYIjpbIjEiXSwibGYuRSI6IjEifSwibG0iOnsiQW4iOlsiMSJdfSwibVciOnsiY1gi
-OlsiMSJdfSwidXkiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwi
-aWwiOnsiWWsiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIllrIjp7IlowIjpbIjEiLCIyIl19LCJQ
-biI6eyJaMCI6WyIxIiwiMiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1Ai
-OlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIlZqIjp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJiUSI6
-WyIxIl0sImNYIjpbIjEiXX0sIlh2Ijp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNY
-IjpbIjEiXX0sInV3Ijp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwiWWsuSyI6InFVIiwi
-WWsuViI6IkAifSwiaTgiOnsiYUwiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwiYUwuRSI6
-InFVIiwiY1guRSI6InFVIn0sIkNWIjp7IlVrIjpbInpNPElqPiIsInFVIl0sIlVrLlMiOiJ6TTxJaj4i
-fSwiVTgiOnsid0kiOlsiek08SWo+IiwicVUiXX0sIlppIjp7IlVrIjpbInFVIiwiek08SWo+Il19LCJV
-ZCI6eyJYUyI6W119LCJLOCI6eyJYUyI6W119LCJieSI6eyJVayI6WyJNaD8iLCJxVSJdLCJVay5TIjoi
-TWg/In0sIm9qIjp7IndJIjpbIk1oPyIsInFVIl19LCJNeCI6eyJ3SSI6WyJxVSIsIk1oPyJdfSwidTUi
-OnsiVWsiOlsicVUiLCJ6TTxJaj4iXSwiVWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08SWo+
-Il19LCJHWSI6eyJ3SSI6WyJ6TTxJaj4iLCJxVSJdfSwiQ1AiOnsiWloiOltdfSwiSWoiOnsiWloiOltd
-fSwiek0iOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJiUSI6WyIx
-Il0sImNYIjpbIjEiXX0sInFVIjp7InZYIjpbXX0sIkM2Ijp7IlhTIjpbXX0sIkV6Ijp7IlhTIjpbXX0s
-IkYiOnsiWFMiOltdfSwiQVQiOnsiWFMiOltdfSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwi
-bXAiOnsiWFMiOltdfSwidWIiOnsiWFMiOltdfSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwi
-VVYiOnsiWFMiOltdfSwiazUiOnsiWFMiOltdfSwiS1kiOnsiWFMiOltdfSwicCI6eyJYUyI6W119LCJD
-RCI6eyJSeiI6W119LCJhRSI6eyJSeiI6W119LCJaZCI6eyJHeiI6W119LCJNIjp7IkJMIjpbXX0sIkRu
-Ijp7ImlEIjpbXX0sIlVmIjp7ImlEIjpbXX0sInFlIjp7ImlEIjpbXX0sImN2Ijp7IktWIjpbXSwiRDAi
-OltdfSwiZkoiOnsiRDAiOltdfSwid2EiOnsiRDAiOltdfSwiQWoiOnsiZWEiOltdfSwiS1YiOnsiRDAi
-OltdfSwiZXciOnsiZWEiOltdfSwidzYiOnsiZWEiOltdfSwiSlEiOnsia0YiOltdfSwicUUiOnsiY3Yi
-OltdLCJLViI6W10sIkQwIjpbXX0sIkdoIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJmWSI6eyJj
-diI6W10sIktWIjpbXSwiRDAiOltdfSwicloiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIlFQIjp7
-ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJueCI6eyJLViI6W10sIkQwIjpbXX0sIlFGIjp7IktWIjpb
-XSwiRDAiOltdfSwiSUIiOnsidG4iOlsiWloiXX0sInd6Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJi
-USI6WyIxIl0sImNYIjpbIjEiXSwibEQuRSI6IjEifSwiaEgiOnsiQXoiOltdfSwiaDQiOnsiY3YiOltd
-LCJLViI6W10sIkQwIjpbXX0sIlZiIjp7IktWIjpbXSwiRDAiOltdfSwiZTciOnsibEQiOlsiS1YiXSwi
-ek0iOlsiS1YiXSwiYlEiOlsiS1YiXSwiY1giOlsiS1YiXSwibEQuRSI6IktWIn0sIkJIIjp7ImxEIjpb
-IktWIl0sIkdtIjpbIktWIl0sInpNIjpbIktWIl0sIlhqIjpbIktWIl0sImJRIjpbIktWIl0sImNYIjpb
-IktWIl0sImxELkUiOiJLViIsIkdtLkUiOiJLViJ9LCJTTiI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltd
-fSwibHAiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIlRiIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6
-W119LCJJdiI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiV1AiOnsiY3YiOltdLCJLViI6W10sIkQw
-IjpbXX0sInlZIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJLNSI6eyJ2NiI6W10sIkQwIjpbXX0s
-IkNtIjp7IkQwIjpbXX0sIkNRIjp7IktWIjpbXSwiRDAiOltdfSwidzQiOnsidG4iOlsiWloiXX0sInJo
-Ijp7ImxEIjpbIktWIl0sIkdtIjpbIktWIl0sInpNIjpbIktWIl0sIlhqIjpbIktWIl0sImJRIjpbIktW
-Il0sImNYIjpbIktWIl0sImxELkUiOiJLViIsIkdtLkUiOiJLViJ9LCJjZiI6eyJZayI6WyJxVSIsInFV
-Il0sIlowIjpbInFVIiwicVUiXX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJd
-LCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIs
-InFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9LCJJNCI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJd
-LCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdLCJsZi5FIjoicVUifSwiUk8iOnsicWgiOlsiMSJdfSwiQ3Ei
-OnsiUk8iOlsiMSJdLCJxaCI6WyIxIl19LCJ4QyI6eyJNTyI6WyIxIl19LCJ2RCI6eyJrRiI6W119LCJt
-NiI6eyJrRiI6W119LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIxIl19
-LCJkVyI6eyJ2NiI6W10sIkQwIjpbXX0sIm1rIjp7InkwIjpbXX0sIktvIjp7Im9uIjpbXX0sIkFzIjp7
-ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6
-W119LCJUeiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJFNCI6W10sImNYIjpbIjEi
-XSwibEQuRSI6IjEifSwibmQiOnsiaGkiOltdLCJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiS2UiOnsi
-bGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6InFVIn0s
-ImhpIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJRVyI6eyJYUyI6W10sIlJ6IjpbXX0sIlhBIjp7
-ImtGIjpbXX0sInZ0Ijp7IkQ4IjpbXX0sImNEIjp7IkQ4IjpbXX0sImR2Ijp7IlJ6IjpbXX0sIk9GIjp7
-ImZ2IjpbXX0sInJ1Ijp7ImZ2IjpbXX0sIklWIjp7ImZ2IjpbXX0sIm42Ijp7InpNIjpbIklqIl0sImJR
-IjpbIklqIl0sImNYIjpbIklqIl0sIkFTIjpbXX19JykpCkguRkYodi50eXBlVW5pdmVyc2UsSlNPTi5w
-YXJzZSgneyJ3MiI6MSwiUUMiOjIsIkxaIjoxLCJrVCI6MiwibVciOjEsInV5IjoxLCJpbCI6MiwiVmoi
-OjEsIlh2IjoxLCJuWSI6MSwiV1kiOjEsInBSIjoxLCJ2ZyI6MX0nKSkKdmFyIHU9e2w6IkNhbm5vdCBl
-eHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudCIsaToi
-Q2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50
-IixqOiJDYW5ub3QgZXh0cmFjdCBhIG5vbi1XaW5kb3dzIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkg
-d2l0aCBhbiBhdXRob3JpdHkiLGQ6ImFyZWEtYW5hbHl6ZXIsYW5hbHl6ZXItbm5iZC1taWdyYXRpb24s
-dHlwZS1idWcifQp2YXIgdD0oZnVuY3Rpb24gcnRpaSgpe3ZhciBzPUguTjAKcmV0dXJue2JxOnMoIkdo
-IiksbjpzKCJDdyIpLGNSOnMoInJaIiksdzpzKCJBeiIpLGs6cygiUVAiKSxnRjpzKCJQRDxHRCxAPiIp
-LFc6cygiYlE8QD4iKSxoOnMoImN2IiksbTpzKCJYUyIpLEI6cygiZWEiKSxnODpzKCJSeiIpLGM4OnMo
-ImhIIiksWTpzKCJFSCIpLGk6cygiYjg8QD4iKSxKOnMoIkxMIiksZ3A6cygiSDciKSxJOnMoIlNnIiks
-bzpzKCJ2USIpLGVoOnMoImNYPEtWPiIpLE86cygiY1g8cVU+IiksUjpzKCJjWDxAPiIpLGZBOnMoImpk
-PFNlPiIpLGdpOnMoImpkPGo4PiIpLGQ6cygiamQ8WjA8cVUsTWg/Pj4iKSxmaDpzKCJqZDxEOD4iKSxy
-OnMoImpkPGtGPiIpLHM6cygiamQ8cVU+IiksaGg6cygiamQ8eUQ+IiksYUo6cygiamQ8d2I+IiksZ046
-cygiamQ8bjY+IiksYjpzKCJqZDxAPiIpLHQ6cygiamQ8SWo+IiksZDQ6cygiamQ8cVU/PiIpLFQ6cygi
-d2UiKSxlSDpzKCJ2bSIpLHU6cygiYzUiKSxhVTpzKCJYajxAPiIpLGFtOnMoIlR6PEA+IiksZW86cygi
-TjU8R0QsQD4iKSxkejpzKCJoRiIpLGY0OnMoInpNPGo4PiIpLHg6cygiek08WjA8cVUsTWg/Pj4iKSxl
-dzpzKCJ6TTxNaD4iKSxhOnMoInpNPHFVPiIpLGo6cygiek08QD4iKSxMOnMoInpNPElqPiIpLGVlOnMo
-InpNPE1oPz4iKSxGOnMoInU4IiksaDY6cygiWjA8cVUsTWg+IiksdjpzKCJaMDxxVSxxVT4iKSxmOnMo
-IlowPEAsQD4iKSxHOnMoIlowPHFVLE1oPz4iKSxEOnMoImxKPHFVLHFVPiIpLGRvOnMoImxKPHFVLEA+
-IiksVjpzKCJBaiIpLGRFOnMoIkVUIiksQTpzKCJLViIpLEU6cygia0YiKSxQOnMoImM4IiksSzpzKCJN
-aCIpLHA6cygiZXciKSxxOnMoInRuPFpaPiIpLGZ2OnMoIndMIiksY3o6cygiaWIiKSxhTzpzKCJuZCIp
-LEM6cygieHU8cVU+IiksbDpzKCJHeiIpLE46cygicVUiKSxkRzpzKCJxVShxVSkiKSxnNzpzKCJoaSIp
-LGZvOnMoIkdEIiksYVc6cygieVkiKSxhazpzKCJBUyIpLGdjOnMoIm42IiksYko6cygia2QiKSxkdzpz
-KCJHajxxVSxxVT4iKSxkRDpzKCJpRCIpLGVKOnMoInU2PHFVPiIpLGc0OnMoIks1IiksY2k6cygidjYi
-KSxnMjpzKCJDbSIpLGJqOnMoIlpmPGZKPiIpLGg5OnMoIkNRIiksYWM6cygiZTciKSxROnMoIkNxPEFq
-PiIpLFU6cygid3o8Y3Y+IiksYW86cygidnM8Zko+IiksYzpzKCJ2czxAPiIpLGZKOnMoInZzPElqPiIp
-LGNyOnMoIkpRIikseTpzKCJhMiIpLGFsOnMoImEyKE1oKSIpLGdSOnMoIkNQIiksejpzKCJAIiksZk86
-cygiQCgpIiksYkk6cygiQChNaCkiKSxhZzpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRP
-OnMoIkAocVUpIiksYjg6cygiQChALEApIiksUzpzKCJJaiIpLGF3OnMoIjAmKiIpLF86cygiTWgqIiks
-Y2g6cygiRDA/IiksYkc6cygiYjg8Yzg+PyIpLGVzOnMoIkU0PyIpLGJrOnMoInpNPHFVPj8iKSxiTTpz
-KCJ6TTxAPj8iKSxjWjpzKCJaMDxxVSxxVT4/IiksYzk6cygiWjA8cVUsQD4/IiksZm46cygiWjA8cVUs
-TWg/Pj8iKSxYOnMoIk1oPyIpLGRrOnMoInFVPyIpLGU6cygiRmU8QCxAPj8iKSxnOnMoImJuPyIpLGI3
-OnMoImEyKE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6cygiTWg/
-KEApPyIpLFo6cygifigpPyIpLGd4OnMoIn4oZXcpPyIpLGRpOnMoIlpaIiksSDpzKCJ+IiksTTpzKCJ+
-KCkiKSxlQTpzKCJ+KHFVLHFVKSIpLGNBOnMoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFu
-dHMoKXt2YXIgcz1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMueG49Vy5HaC5wcm90b3R5cGUKQy5S
-WT1XLlFQLnByb3RvdHlwZQpDLm1IPVcuYWUucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5E
-dD1XLmZKLnByb3RvdHlwZQpDLk9rPUouR3YucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5q
-bj1KLmJVLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5E
-Rz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBlCkMuTkE9SC5WNi5wcm90b3R5cGUKQy50
-NT1XLkJILnByb3RvdHlwZQpDLkx0PVcuU04ucHJvdG90eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5J
-ZT1XLlRiLnByb3RvdHlwZQpDLnZCPUoua2QucHJvdG90eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55
-OD1uZXcgUC5VOCgpCkMuaDk9bmV3IFAuQ1YoKQpDLkd3PW5ldyBILkZ1KEguTjAoIkZ1PDAmPiIpKQpD
-Lk80PWZ1bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsKICB2YXIgcyA9IE9iamVjdC5wcm90b3R5cGUu
-dG9TdHJpbmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKfQpD
-LllxPWZ1bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1bmN0aW9uID0gT2JqZWN0LnByb3RvdHlwZS50
-b1N0cmluZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewogICAgdmFyIHMgPSB0b1N0cmluZ0Z1bmN0aW9u
-LmNhbGwobyk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKICB9CiAgZnVu
-Y3Rpb24gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykgewogICAgaWYgKC9eSFRNTFtBLVpdLipFbGVt
-ZW50JC8udGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1lID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG9i
-amVjdCk7CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gbnVsbDsKICAg
-ICAgcmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldFVua25vd25UYWdH
-ZW5lcmljQnJvd3NlcihvYmplY3QsIHRhZykgewogICAgaWYgKHNlbGYuSFRNTEVsZW1lbnQgJiYgb2Jq
-ZWN0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVybiAiSFRNTEVsZW1lbnQiOwogICAgcmV0dXJu
-IGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWco
-dGFnKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAg
-ICBpZiAodHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIHZh
-ciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPSAi
-ZnVuY3Rpb24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAg
-fQogIGZ1bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGlzQnJv
-d3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCI7CiAgcmV0dXJuIHsKICAgIGdldFRhZzog
-Z2V0VGFnLAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93c2VyID8gZ2V0VW5rbm93blRhZ0dlbmVyaWNC
-cm93c2VyIDogZ2V0VW5rbm93blRhZywKICAgIHByb3RvdHlwZUZvclRhZzogcHJvdG90eXBlRm9yVGFn
-LAogICAgZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRvciB9Owp9CkMud2I9ZnVuY3Rpb24oZ2V0VGFn
-RmFsbGJhY2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9va3MpIHsKICAgIGlmICh0eXBlb2YgbmF2aWdh
-dG9yICE9ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFn
-ZW50OwogICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5kZXJUcmVlIikgPj0gMCkgcmV0dXJuIGhvb2tz
-OwogICAgaWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49IDApIHsKICAgICAgZnVuY3Rpb24gY29uZmly
-bShwKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT0gIm9iamVjdCIgJiYgd2luZG93W3Bd
-ICYmIHdpbmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpcm0oIldpbmRvdyIp
-ICYmIGNvbmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVybiBob29rczsKICAgIH0KICAgIGhvb2tzLmdl
-dFRhZyA9IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5LVT1mdW5jdGlvbihob29rcykgewogIGlmICh0
-eXBlb2YgZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnICE9ICJmdW5jdGlvbiIpIHJldHVybiBob29r
-czsKICBob29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcoaG9va3MuZ2V0VGFn
-KTsKfQpDLmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2
-YXIgcHJvdG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90eXBlRm9yVGFnOwogIGZ1bmN0aW9uIGdldFRh
-Z0ZpeGVkKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICBpZiAodGFnID09ICJEb2N1bWVu
-dCIpIHsKICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSByZXR1cm4gIiFEb2N1bWVudCI7CiAgICAgIHJl
-dHVybiAiIUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBw
-cm90b3R5cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlmICh0YWcgPT0gIkRvY3VtZW50IikgcmV0dXJu
-IG51bGw7CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFnKHRhZyk7CiAgfQogIGhvb2tzLmdldFRhZyA9
-IGdldFRhZ0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0ZpeGVk
-Owp9CkMuZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRv
-ciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50Lmlu
-ZGV4T2YoIkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5n
-ZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwK
-ICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJHZW9HZW9sb2NhdGlvbiI6ICJHZW9s
-b2NhdGlvbiIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0aW9uIiwKICAgICJXb3JrZXJNZXNzYWdlRXZl
-bnQiOiAiTWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1bWVudCI6ICIhRG9jdW1lbnQifTsKICBmdW5j
-dGlvbiBnZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICByZXR1cm4g
-cXVpY2tNYXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpcmVmb3g7Cn0K
-Qy54aT1mdW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09
-ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhP
-ZigiVHJpZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRU
-YWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAg
-ICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJIVE1MRERFbGVtZW50IjogIkhUTUxFbGVt
-ZW50IiwKICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MUGhyYXNlRWxl
-bWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRpb24iOiAiR2VvcG9zaXRpb24iCiAgfTsKICBm
-dW5jdGlvbiBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgdmFyIG5ld1Rh
-ZyA9IHF1aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFnKSByZXR1cm4gbmV3VGFnOwogICAgaWYgKHRh
-ZyA9PSAiT2JqZWN0IikgewogICAgICBpZiAod2luZG93LkRhdGFWaWV3ICYmIChvIGluc3RhbmNlb2Yg
-d2luZG93LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmlldyI7CiAgICB9CiAgICByZXR1cm4gdGFnOwog
-IH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0YWcpIHsKICAgIHZhciBjb25zdHJ1Y3RvciA9
-IHdpbmRvd1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHJldHVybiBudWxsOwogICAg
-cmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnSUU7
-CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnSUU7Cn0KQy5pNz1mdW5jdGlv
-bihob29rcykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9bmV3IFAuYnkoKQpDLkVxPW5ldyBQLms1KCkK
-Qy54TT1uZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpDLk52PW5ldyBILmtyKCkKQy5OVT1uZXcgUC5K
-aSgpCkMucGQ9bmV3IFAuWmQoKQpDLkFkPW5ldyBSLkg3KDAsIkhpbnRBY3Rpb25LaW5kLmFkZE51bGxh
-YmxlSGludCIpCkMubmU9bmV3IFIuSDcoMSwiSGludEFjdGlvbktpbmQuYWRkTm9uTnVsbGFibGVIaW50
-IikKQy5teT1uZXcgUi5INygyLCJIaW50QWN0aW9uS2luZC5jaGFuZ2VUb051bGxhYmxlSGludCIpCkMu
-cng9bmV3IFIuSDcoMywiSGludEFjdGlvbktpbmQuY2hhbmdlVG9Ob25OdWxsYWJsZUhpbnQiKQpDLndW
-PW5ldyBSLkg3KDQsIkhpbnRBY3Rpb25LaW5kLnJlbW92ZU51bGxhYmxlSGludCIpCkMuZlI9bmV3IFIu
-SDcoNSwiSGludEFjdGlvbktpbmQucmVtb3ZlTm9uTnVsbGFibGVIaW50IikKQy5BMz1uZXcgUC5NeChu
-dWxsKQpDLm5YPW5ldyBQLm9qKG51bGwpCkMuY3c9bmV3IEwuR2IoMCwiVW5pdE1pZ3JhdGlvblN0YXR1
-cy5hbHJlYWR5TWlncmF0ZWQiKQpDLmRjPW5ldyBMLkdiKDEsIlVuaXRNaWdyYXRpb25TdGF0dXMuaW5k
-ZXRlcm1pbmF0ZSIpCkMuV0Q9bmV3IEwuR2IoMiwiVW5pdE1pZ3JhdGlvblN0YXR1cy5taWdyYXRpbmci
-KQpDLlhqPW5ldyBMLkdiKDMsIlVuaXRNaWdyYXRpb25TdGF0dXMub3B0aW5nT3V0IikKQy5sMD1ILlFJ
-KHMoW0MuY3csQy5kYyxDLldELEMuWGpdKSxILk4wKCJqZDxHYj4iKSkKQy5haz1ILlFJKHMoWzAsMCwz
-Mjc3NiwzMzc5MiwxLDEwMjQwLDAsMF0pLHQudCkKQy5jbT1ILlFJKHMoWyIqOjpjbGFzcyIsIio6OmRp
-ciIsIio6OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIsIio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJv
-cCIsIio6Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUiLCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6
-OnRpdGxlIiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNjZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxh
-bmciLCJBOjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUi
-LCJBUkVBOjphY2Nlc3NrZXkiLCJBUkVBOjphbHQiLCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYi
-LCJBUkVBOjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRy
-b2xzIiwiQVVESU86Omxvb3AiLCJBVURJTzo6bWVkaWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElP
-OjpwcmVsb2FkIiwiQkRPOjpkaXIiLCJCT0RZOjphbGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjps
-aW5rIiwiQk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5rIiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3Nr
-ZXkiLCJCVVRUT046OmRpc2FibGVkIiwiQlVUVE9OOjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJV
-VFRPTjo6dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJDQU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgi
-LCJDQVBUSU9OOjphbGlnbiIsIkNPTDo6YWxpZ24iLCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJD
-T0w6OnNwYW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xH
-Uk9VUDo6Y2hhciIsIkNPTEdST1VQOjpjaGFyb2ZmIiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6
-dmFsaWduIiwiQ09MR1JPVVA6OndpZHRoIiwiQ09NTUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1h
-bmQiLCJDT01NQU5EOjpkaXNhYmxlZCIsIkNPTU1BTkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91
-cCIsIkNPTU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpv
-cGVuIiwiRElSOjpjb21wYWN0IiwiRElWOjphbGlnbiIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRp
-c2FibGVkIiwiRk9OVDo6Y29sb3IiLCJGT05UOjpmYWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2Vw
-dCIsIkZPUk06OmF1dG9jb21wbGV0ZSIsIkZPUk06OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JN
-OjpuYW1lIiwiRk9STTo6bm92YWxpZGF0ZSIsIkZPUk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6
-OmFsaWduIiwiSDI6OmFsaWduIiwiSDM6OmFsaWduIiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6
-OmFsaWduIiwiSFI6OmFsaWduIiwiSFI6Om5vc2hhZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhU
-TUw6OnZlcnNpb24iLCJJRlJBTUU6OmFsaWduIiwiSUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6
-aGVpZ2h0IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQiLCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1F
-Ojp3aWR0aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFsdCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQi
-LCJJTUc6OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJTUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6
-dnNwYWNlIiwiSU1HOjp3aWR0aCIsIklOUFVUOjphY2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5Q
-VVQ6OmFsaWduIiwiSU5QVVQ6OmFsdCIsIklOUFVUOjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2Zv
-Y3VzIiwiSU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwi
-SU5QVVQ6OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJTlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIs
-IklOUFVUOjptaW4iLCJJTlBVVDo6bXVsdGlwbGUiLCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhv
-bGRlciIsIklOUFVUOjpyZWFkb25seSIsIklOUFVUOjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5Q
-VVQ6OnN0ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJTlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJ
-TlBVVDo6dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwiS0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5
-dHlwZSIsIktFWUdFTjo6bmFtZSIsIkxBQkVMOjphY2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5E
-OjphY2Nlc3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwiTEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpz
-aXplcyIsIk1BUDo6bmFtZSIsIk1FTlU6OmNvbXBhY3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUi
-LCJNRVRFUjo6aGlnaCIsIk1FVEVSOjpsb3ciLCJNRVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVS
-Ojp2YWx1ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRjaCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2Vk
-IiwiT0w6OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRHUk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFi
-ZWwiLCJPUFRJT046OmRpc2FibGVkIiwiT1BUSU9OOjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJP
-UFRJT046OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJPVVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6
-d2lkdGgiLCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JFU1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNF
-TEVDVDo6YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpkaXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJT
-RUxFQ1Q6Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVkIiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJp
-bmRleCIsIlNPVVJDRTo6dHlwZSIsIlRBQkxFOjphbGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6
-OmJvcmRlciIsIlRBQkxFOjpjZWxscGFkZGluZyIsIlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpm
-cmFtZSIsIlRBQkxFOjpydWxlcyIsIlRBQkxFOjpzdW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6
-OmFsaWduIiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6
-YWJiciIsIlREOjphbGlnbiIsIlREOjpheGlzIiwiVEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpj
-aGFyb2ZmIiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVhZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFw
-IiwiVEQ6OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJURDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFS
-RUE6OmFjY2Vzc2tleSIsIlRFWFRBUkVBOjphdXRvY29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRF
-WFRBUkVBOjpkaXNhYmxlZCIsIlRFWFRBUkVBOjppbnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRF
-WFRBUkVBOjpwbGFjZWhvbGRlciIsIlRFWFRBUkVBOjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJl
-ZCIsIlRFWFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJU
-Rk9PVDo6YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRGT09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIs
-IlRIOjphYmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwi
-VEg6OmNoYXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRIOjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpu
-b3dyYXAiLCJUSDo6cm93c3BhbiIsIlRIOjpzY29wZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJU
-SEVBRDo6YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRIRUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIs
-IlRSOjphbGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxp
-Z24iLCJUUkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpraW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNy
-Y2xhbmciLCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBlIiwiVklERU86OmNvbnRyb2xzIiwiVklERU86Omhl
-aWdodCIsIlZJREVPOjpsb29wIiwiVklERU86Om1lZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURF
-Tzo6cHJlbG9hZCIsIlZJREVPOjp3aWR0aCJdKSx0LnMpCkMuVkM9SC5RSShzKFswLDAsNjU0OTAsNDUw
-NTUsNjU1MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMubUs9SC5RSShzKFswLDAsMjY2MjQsMTAy
-Myw2NTUzNCwyMDQ3LDY1NTM0LDIwNDddKSx0LnQpCkMuU3E9SC5RSShzKFsiSEVBRCIsIkFSRUEiLCJC
-QVNFIiwiQkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNPTEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1F
-U0VUIiwiSFIiLCJJTUFHRSIsIklNRyIsIklOUFVUIiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFS
-QU0iLCJTT1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwiV0JSIl0pLHQucykKQy5kbj1ILlFJKHMoW10pLEgu
-TjAoImpkPExMPiIpKQpDLnhEPUguUUkocyhbXSksdC5zKQpDLmhVPUguUUkocyhbXSksdC5iKQpDLnRv
-PUguUUkocyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLnJr
-PUguUUkocyhbQy5BZCxDLm5lLEMubXksQy5yeCxDLndWLEMuZlJdKSxILk4wKCJqZDxINz4iKSkKQy5G
-Mz1ILlFJKHMoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLmVh
-PUguUUkocyhbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlpK
-PUguUUkocyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLldk
-PUguUUkocyhbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlF4
-PUguUUkocyhbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx0LnMpCkMuQkk9SC5R
-SShzKFsiQTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwiQk9EWTo6YmFja2dy
-b3VuZCIsIkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24iLCJJTUc6OnNyYyIs
-IklOUFVUOjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3RlciJdKSx0LnMpCkMu
-RHg9bmV3IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVLHpNPGo4Pj4iKSkKQy5DTT1uZXcgSC5MUCgw
-LHt9LEMueEQsSC5OMCgiTFA8cVUscVU+IikpCkMuaUg9SC5RSShzKFtdKSxILk4wKCJqZDxHRD4iKSkK
-Qy5XTz1uZXcgSC5MUCgwLHt9LEMuaUgsSC5OMCgiTFA8R0QsQD4iKSkKQy5ZMj1uZXcgTC5POSgiTmF2
-aWdhdGlvblRyZWVOb2RlVHlwZS5kaXJlY3RvcnkiKQpDLnJmPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJl
-ZU5vZGVUeXBlLmZpbGUiKQpDLlRlPW5ldyBILnd2KCJjYWxsIikKQy5vRT1uZXcgUC5HWSghMSkKQy53
-UT1uZXcgUC5GeShudWxsLDIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC56bT1udWxsCiQu
-eWo9MAokLldXPW51bGwKJC5pMD1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwKJC54Nz1udWxsCiQubnc9
-bnVsbAokLnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwKJC5tZz1udWxsCiQuVUQ9
-ITEKJC5YMz1DLk5VCiQueGc9SC5RSShbXSxILk4wKCJqZDxNaD4iKSkKJC54bz1udWxsCiQuQk89bnVs
-bAokLmx0PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh0Lk4sdC5ZKQokLklSPW51bGwKJC5JNj1udWxs
-CiQuRmY9bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFsaXplcnMoKXt2YXIgcz1odW5rSGVscGVy
-cy5sYXp5RmluYWwscj1odW5rSGVscGVycy5sYXp5CnMoJCwiZmEiLCJ6IixmdW5jdGlvbigpe3JldHVy
-biBILllnKCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMoJCwiS3EiLCJTbiIsZnVuY3Rpb24oKXtyZXR1
-cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkK
-cygkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRv
-U3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwiUjEiLCJOOSIsZnVu
-Y3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnMoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXty
-ZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0cnl7
-bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgp
-KX0pCnMoJCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKcygk
-LCJwdiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNF
-eHByJD0iJGFyZ3VtZW50cyQiCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNh
-dGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1
-cm4gSC5jTShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShm
-dW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0p
-CnMoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQgMCkpfSkKcygkLCJB
-NyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRo
-b2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiV2MiLCJ1dCIsZnVuY3Rpb24o
-KXtyZXR1cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVybiBuZXcgUC54cigp
-LiQwKCl9KQpzKCQsImRIIiwiSEciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLk56KCkuJDAoKX0pCnMo
-JCwiaGoiLCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEludDhBcnJheShILlhGKEguUUkoWy0yLC0y
+aGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkROKGEsYil7dmFyIHMscgppZihiPT1u
+dWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRvU3RyaW5nCnI9Yi5sZWZ0CnIudG9T
+dHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIudG9wCnIudG9TdHJpbmcKaWYocz09
+PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEu
+aGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5nCnI9cz09PXIKcz1yfWVsc2Ugcz0h
+MX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4gc30sCmdpTyhhKXt2YXIgcyxyLHEs
+cD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50b3AKcy50b1N0cmluZwpzPUMuQ0Qu
+Z2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8ocikKcT1hLmhlaWdodApxLnRvU3Ry
+aW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRpdG46MX0KVy5uNy5wcm90b3R5cGU9
+ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlz
+LmEubGVuZ3RofSwKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlzLmEKaWYoYjwwfHxiPj1zLmxlbmd0
+aClyZXR1cm4gSC5PSChzLGIpCnJldHVybiB0aGlzLiR0aS5jLmEoc1tiXSl9LApZNShhLGIsYyl7dGhp
+cy4kdGkuYy5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGxpc3QiKSl9fQpXLmN2LnBy
+b3RvdHlwZT17CmdRZyhhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApnUChhKXtyZXR1cm4gbmV3IFcuSTQo
+YSl9LApzUChhLGIpe3ZhciBzCnQuTy5hKGIpCnM9dGhpcy5nUChhKQpzLlYxKDApCnMuRlYoMCxiKX0s
+CncoYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKRkYoYSl7dmFyIHM9ISFhLnNjcm9sbEludG9WaWV3SWZO
+ZWVkZWQKaWYocylhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50b1ZpZXco
+KX0sCm56KGEsYixjLGQsZSl7dmFyIHMscj10aGlzLnI2KGEsYyxkLGUpCnN3aXRjaChiLnRvTG93ZXJD
+YXNlKCkpe2Nhc2UiYmVmb3JlYmVnaW4iOnM9YS5wYXJlbnROb2RlCnMudG9TdHJpbmcKSi5FaChzLHIs
+YSkKYnJlYWsKY2FzZSJhZnRlcmJlZ2luIjpzPWEuY2hpbGROb2Rlcwp0aGlzLm1LKGEscixzLmxlbmd0
+aD4wP3NbMF06bnVsbCkKYnJlYWsKY2FzZSJiZWZvcmVlbmQiOmEuYXBwZW5kQ2hpbGQocikKYnJlYWsK
+Y2FzZSJhZnRlcmVuZCI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmluZwpKLkVoKHMscixhLm5leHRTaWJs
+aW5nKQpicmVhawpkZWZhdWx0OkgudihQLnhZKCJJbnZhbGlkIHBvc2l0aW9uICIrYixudWxsKSl9fSwK
+cjYoYSxiLGMsZCl7dmFyIHMscixxLHAKaWYoYz09bnVsbCl7aWYoZD09bnVsbCl7cz0kLmx0CmlmKHM9
+PW51bGwpe3M9SC5RSShbXSx0LnIpCnI9bmV3IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkKQy5O
+bS5pKHMsVy5CbCgpKQokLmx0PXIKZD1yfWVsc2UgZD1zfXM9JC5FVQppZihzPT1udWxsKXtzPW5ldyBX
+LktvKGQpCiQuRVU9cwpjPXN9ZWxzZXtzLmE9ZApjPXN9fWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBILmIo
+UC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0cmVlU2FuaXRpemVyIGlzIG51bGwi
+LG51bGwpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50CnI9cy5pbXBsZW1lbnRhdGlvbgpyLnRvU3Ry
+aW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1yLmNyZWF0ZVJhbmdlKCkKcj0kLnhvLmNyZWF0
+ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJhc2VVUkkKcy50b1N0cmluZwpyLmhyZWY9cwok
+LnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlmKHMuYm9keT09bnVsbCl7cj1zLmNyZWF0ZUVs
+ZW1lbnQoImJvZHkiKQpDLkJaLnNHUyhzLHQuay5hKHIpKX1zPSQueG8KaWYodC5rLmIoYSkpe3M9cy5i
+b2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmluZwpxPXMuY3JlYXRlRWxlbWVudChhLnRhZ05h
+bWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBp
+biB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50ZyhDLlNxLGEudGFnTmFtZSkpeyQuQk8uc2Vs
+ZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3RyaW5nCnA9cy5jcmVhdGVDb250ZXh0dWFsRnJh
+Z21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndmKHEsYikKcD0kLnhvLmNyZWF0ZURvY3VtZW50
+RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMhPW51bGw7KXAuYXBwZW5kQ2hpbGQocyl9aWYo
+cSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9jdW1lbnQuYWRvcHROb2RlKHApCnJldHVybiBw
+fSwKQUgoYSxiLGMpe3JldHVybiB0aGlzLnI2KGEsYixjLG51bGwpfSwKc2hmKGEsYil7dGhpcy5ZQyhh
+LGIpfSwKcGsoYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixu
+dWxsLGMpKX0sCllDKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKc1JOKGEsYil7YS5pbm5l
+ckhUTUw9Yn0sCmducyhhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1ZsKGEpe3JldHVybiBuZXcgVy5DcShh
+LCJjbGljayIsITEsdC5RKX0sCiRpY3Y6MX0KVy5Ddi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5o
+LmIodC5BLmEoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBl
+PXsKT24oYSxiLGMsZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhpcy52KGEsYixjLGQpfSwKQihhLGIs
+Yyl7cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2KGEsYixjLGQpe3JldHVybiBhLmFkZEV2ZW50
+TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6MX0KVy5oSC5wcm90b3R5cGU9eyRp
+aEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmJyLnByb3RvdHlw
+ZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJvdG90eXBlPXsKc0dTKGEsYil7YS5ib2R5
+PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRp
+Zko6MX0KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5
+cGU9ewpnRHIoYSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIGEucHJvdG9j
+b2wrIi8vIithLmhvc3R9LAp3KGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuQWoucHJvdG90
+eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4KGEpe3ZhciBzPXRoaXMuYSxyPXMuY2hpbGRO
+b2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpCmlmKHI+MSl0
+aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnM9cy5maXJzdENoaWxkCnMudG9T
+dHJpbmcKcmV0dXJuIHN9LApGVihhLGIpe3ZhciBzLHIscSxwLG8KdC5laC5hKGIpCmlmKGIgaW5zdGFu
+Y2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihzIT09cilmb3IocT1zLmNoaWxkTm9kZXMubGVuZ3Ro
+LHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApvLnRvU3RyaW5nCnIuYXBwZW5kQ2hpbGQobyl9cmV0
+dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5GKCk7KXIuYXBwZW5kQ2hpbGQocy5nbCgpKX0sClk1
+KGEsYixjKXt2YXIgcyxyCnQuQS5hKGMpCnM9dGhpcy5hCnI9cy5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49
+ci5sZW5ndGgpcmV0dXJuIEguT0gocixiKQpzLnJlcGxhY2VDaGlsZChjLHJbYl0pfSwKZ20oYSl7dmFy
+IHM9dGhpcy5hLmNoaWxkTm9kZXMKcmV0dXJuIG5ldyBXLlc5KHMscy5sZW5ndGgsSC56SyhzKS5DKCJX
+OTxHbS5FPiIpKX0sCmdBKGEpe3JldHVybiB0aGlzLmEuY2hpbGROb2Rlcy5sZW5ndGh9LApxKGEsYil7
+dmFyIHMKSC5JWihiKQpzPXRoaXMuYS5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5sZW5ndGgpcmV0dXJu
+IEguT0gocyxiKQpyZXR1cm4gc1tiXX19ClcuS1YucHJvdG90eXBlPXsKd2coYSl7dmFyIHM9YS5wYXJl
+bnROb2RlCmlmKHMhPW51bGwpcy5yZW1vdmVDaGlsZChhKX0sCkQ0KGEpe3ZhciBzCmZvcig7cz1hLmZp
+cnN0Q2hpbGQscyE9bnVsbDspYS5yZW1vdmVDaGlsZChzKX0sCncoYSl7dmFyIHM9YS5ub2RlVmFsdWUK
+cmV0dXJuIHM9PW51bGw/dGhpcy5VKGEpOnN9LApzYTQoYSxiKXthLnRleHRDb250ZW50PWJ9LAptSyhh
+LGIsYyl7cmV0dXJuIGEuaW5zZXJ0QmVmb3JlKGIsYyl9LAokaUtWOjF9ClcuQkgucHJvdG90eXBlPXsK
+Z0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxl
+bmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk1KGEs
+YixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0
+YWJsZSBMaXN0LiIpKX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihQ
+LlBWKCJObyBlbGVtZW50cyIpKX0sCkUoYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9I
+KGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuU04ucHJv
+dG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAucHJvdG90eXBlPXsKZ0EoYSl7cmV0
+dXJuIGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVh
+dGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMu
+RFcoYSxiLGMsZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpyPWRvY3Vt
+ZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMpKQpy
+ZXR1cm4gcn19ClcuSXYucHJvdG90eXBlPXsKcjYoYSxiLGMsZCl7dmFyIHMscgppZigiY3JlYXRlQ29u
+dGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEs
+YixjLGQpCnM9ZG9jdW1lbnQKcj1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzPW5ldyBXLmU3KEMu
+SWUucjYocy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKSkKcz1uZXcgVy5lNyhzLmdyOChzKSkK
+bmV3IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzLmdyOChzKSkpCnJldHVybiByfX0KVy5XUC5wcm90b3R5
+cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdp
+bmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMu
+Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9bmV3IFcuZTcoQy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQo
+InRhYmxlIiksYixjLGQpKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMuZ3I4KHMpKSkKcmV0dXJu
+IHJ9fQpXLnlZLnByb3RvdHlwZT17CnBrKGEsYixjKXt2YXIgcyxyCnRoaXMuc2E0KGEsbnVsbCkKcz1h
+LmNvbnRlbnQKcy50b1N0cmluZwpKLmJUKHMpCnI9dGhpcy5yNihhLGIsbnVsbCxjKQphLmNvbnRlbnQu
+YXBwZW5kQ2hpbGQocil9LApZQyhhLGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCiRpeVk6MX0K
+Vy53Ni5wcm90b3R5cGU9e30KVy5LNS5wcm90b3R5cGU9ewpQbyhhLGIsYyl7dmFyIHM9Vy5QMShhLm9w
+ZW4oYixjKSkKcmV0dXJuIHN9LApnbVcoYSl7cmV0dXJuIHQuRi5hKGEubG9jYXRpb24pfSwKdXMoYSxi
+KXtyZXR1cm4gYS5jb25maXJtKGIpfSwKJGlLNToxLAokaXY2OjF9ClcuQ20ucHJvdG90eXBlPXskaUNt
+OjF9ClcuQ1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyPWEu
+bGVmdApyLnRvU3RyaW5nCnI9IlJlY3RhbmdsZSAoIitILkVqKHIpKyIsICIKcz1hLnRvcApzLnRvU3Ry
+aW5nCnM9citILkVqKHMpKyIpICIKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1zK0guRWoocikrIiB4ICIK
+cz1hLmhlaWdodApzLnRvU3RyaW5nCnJldHVybiByK0guRWoocyl9LApETihhLGIpe3ZhciBzLHIKaWYo
+Yj09bnVsbClyZXR1cm4hMQppZih0LnEuYihiKSl7cz1hLmxlZnQKcy50b1N0cmluZwpyPWIubGVmdApy
+LnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEudG9wCnMudG9TdHJpbmcKcj1iLnRvcApyLnRvU3RyaW5nCmlm
+KHM9PT1yKXtzPWEud2lkdGgKcy50b1N0cmluZwpyPWIud2lkdGgKci50b1N0cmluZwppZihzPT09cil7
+cz1hLmhlaWdodApzLnRvU3RyaW5nCnI9Yi5oZWlnaHQKci50b1N0cmluZwpyPXM9PT1yCnM9cn1lbHNl
+IHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKcmV0dXJuIHN9LApnaU8oYSl7dmFyIHMs
+cixxLHA9YS5sZWZ0CnAudG9TdHJpbmcKcD1DLkNELmdpTyhwKQpzPWEudG9wCnMudG9TdHJpbmcKcz1D
+LkNELmdpTyhzKQpyPWEud2lkdGgKci50b1N0cmluZwpyPUMuQ0QuZ2lPKHIpCnE9YS5oZWlnaHQKcS50
+b1N0cmluZwpyZXR1cm4gVy5yRShwLHMscixDLkNELmdpTyhxKSl9fQpXLnJoLnByb3RvdHlwZT17CmdB
+KGEpe3JldHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5n
+dGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZNShhLGIs
+Yyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFi
+bGUgTGlzdC4iKSl9LApFKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJl
+dHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnByb3RvdHlwZT17
+CksoYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlzLmd2YygpLHI9cy5sZW5ndGgs
+cT10aGlzLmEscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3Ape289c1tw
+XQpiLiQyKG8sSC5uKHEuZ2V0QXR0cmlidXRlKG8pKSl9fSwKZ3ZjKCl7dmFyIHMscixxLHAsbyxuLG09
+dGhpcy5hLmF0dHJpYnV0ZXMKbS50b1N0cmluZwpzPUguUUkoW10sdC5zKQpmb3Iocj1tLmxlbmd0aCxx
+PXQuaDkscD0wO3A8cjsrK3Ape2lmKHA+PW0ubGVuZ3RoKXJldHVybiBILk9IKG0scCkKbz1xLmEobVtw
+XSkKaWYoby5uYW1lc3BhY2VVUkk9PW51bGwpe249by5uYW1lCm4udG9TdHJpbmcKQy5ObS5pKHMsbil9
+fXJldHVybiBzfSwKZ2wwKGEpe3JldHVybiB0aGlzLmd2YygpLmxlbmd0aD09PTB9fQpXLmk3LnByb3Rv
+dHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5oYXNBdHRyaWJ1dGUoYSkKcmV0dXJuIHN9LApxKGEsYil7
+cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC5uKGIpKX0sClk1KGEsYixjKXt0aGlzLmEuc2V0QXR0
+cmlidXRlKGIsYyl9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9fQpXLlN5LnByb3RvdHlw
+ZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5hLmhhc0F0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1UoYSkpCnJl
+dHVybiBzfSwKcShhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk9V
+KEgubihiKSkpfSwKWTUoYSxiLGMpe3RoaXMuYS5hLnNldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1Uo
+YiksYyl9LApLKGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlzLHQuZUEuYShiKSkpfSwKZ3ZjKCl7
+dmFyIHM9SC5RSShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApn
+QShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9LApnbDAoYSl7cmV0dXJuIHRoaXMuZ3ZjKCkubGVu
+Z3RoPT09MH0sCnhxKGEpe3ZhciBzLHIscT1ILlFJKGEuc3BsaXQoIi0iKSx0LnMpCmZvcihzPTE7czxx
+Lmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWTUocSxzLHJbMF0udG9VcHBlckNh
+c2UoKStDLnhCLnluKHIsMSkpfXJldHVybiBDLk5tLmsocSwiIil9LApPVShhKXt2YXIgcyxyLHEscCxv
+CmZvcihzPWEubGVuZ3RoLHI9MCxxPSIiO3I8czsrK3Ipe3A9YVtyXQpvPXAudG9Mb3dlckNhc2UoKQpx
+PShwIT09byYmcj4wP3ErIi0iOnEpK299cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9fQpXLktT
+LnByb3RvdHlwZT17CiQyKGEsYil7aWYoQy54Qi5uKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS54
+cShDLnhCLnluKGEsNSkpLGIpfSwKJFM6OH0KVy5BMy5wcm90b3R5cGU9ewokMihhLGIpe2lmKEMueEIu
+bihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLnhxKEMueEIueW4oYSw1KSkpfSwKJFM6OH0K
+Vy5JNC5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz1QLkxzKHQuTikKZm9yKHM9dGhpcy5hLmNs
+YXNzTmFtZS5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihw
+Lmxlbmd0aCE9PTApby5pKDAscCl9cmV0dXJuIG99LApYKGEpe3RoaXMuYS5jbGFzc05hbWU9dC5DLmEo
+YSkuaygwLCIgIil9LApnQShhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGh9LApnbDAoYSl7
+cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoPT09MH0sCmdvcihhKXtyZXR1cm4gdGhpcy5hLmNs
+YXNzTGlzdC5sZW5ndGghPT0wfSwKVjEoYSl7dGhpcy5hLmNsYXNzTmFtZT0iIn0sCnRnKGEsYil7dmFy
+IHM9dGhpcy5hLmNsYXNzTGlzdC5jb250YWlucyhiKQpyZXR1cm4gc30sCmkoYSxiKXt2YXIgcyxyCkgu
+bihiKQpzPXRoaXMuYS5jbGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIpCnMuYWRkKGIpCnJldHVybiFyfSwK
+UihhLGIpe3ZhciBzLHIscQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9dGhpcy5hLmNsYXNzTGlzdApy
+PXMuY29udGFpbnMoYikKcy5yZW1vdmUoYikKcT1yfWVsc2UgcT0hMQpyZXR1cm4gcX0sCkZWKGEsYil7
+Vy5UTih0aGlzLmEsdC5PLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9e30KVy5STy5wcm90b3R5cGU9e30K
+Vy5DcS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52Ti5wcm90b3R5cGU9ewokMShhKXty
+ZXR1cm4gdGhpcy5hLiQxKHQuQi5hKGEpKX0sCiRTOjI3fQpXLkpRLnByb3RvdHlwZT17CkNZKGEpe3Zh
+ciBzCmlmKCQub3IuZ2wwKCQub3IpKXtmb3Iocz0wO3M8MjYyOysrcykkLm9yLlk1KDAsQy5jbVtzXSxX
+LnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZNSgwLEMuQklbc10sVy5WNCgpKX19LAppMChhKXty
+ZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9LApFYihhLGIsYyl7dmFyIHM9JC5vci5xKDAsVy5yUyhh
+KSsiOjoiK2IpCmlmKHM9PW51bGwpcz0kLm9yLnEoMCwiKjo6IitiKQppZihzPT1udWxsKXJldHVybiEx
+CnJldHVybiBILnA4KHMuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17Cmdt
+KGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56SyhhKS5DKCJXOTxHbS5FPiIpKX19Clcu
+dkQucHJvdG90eXBlPXsKaTAoYSl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLlV2KGEpKX0sCkVi
+KGEsYixjKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuRWcoYSxiLGMpKX0sCiRpa0Y6MX0KVy5V
+di5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLmkwKHRoaXMuYSl9LAokUzoxNn0KVy5F
+Zy5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLkViKHRoaXMuYSx0aGlzLmIsdGhpcy5j
+KX0sCiRTOjE2fQpXLm02LnByb3RvdHlwZT17CkNZKGEsYixjLGQpe3ZhciBzLHIscQp0aGlzLmEuRlYo
+MCxjKQpzPWIuZXYoMCxuZXcgVy5FbygpKQpyPWIuZXYoMCxuZXcgVy5XaygpKQp0aGlzLmIuRlYoMCxz
+KQpxPXRoaXMuYwpxLkZWKDAsQy54RCkKcS5GVigwLHIpfSwKaTAoYSl7cmV0dXJuIHRoaXMuYS50Zygw
+LFcuclMoYSkpfSwKRWIoYSxiLGMpe3ZhciBzPXRoaXMscj1XLnJTKGEpLHE9cy5jCmlmKHEudGcoMCxy
+KyI6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNlIGlmKHEudGcoMCwiKjo6IitiKSlyZXR1cm4gcy5k
+LkR0KGMpCmVsc2V7cT1zLmIKaWYocS50ZygwLHIrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGco
+MCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCxyKyI6OioiKSlyZXR1cm4hMAplbHNlIGlm
+KHEudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwKJGlrRjoxfQpXLkVvLnByb3RvdHlwZT17
+CiQxKGEpe3JldHVybiFDLk5tLnRnKEMuQkksSC5uKGEpKX0sCiRTOjZ9ClcuV2sucHJvdG90eXBlPXsK
+JDEoYSl7cmV0dXJuIEMuTm0udGcoQy5CSSxILm4oYSkpfSwKJFM6Nn0KVy5jdC5wcm90b3R5cGU9ewpF
+YihhLGIsYyl7aWYodGhpcy5qRihhLGIsYykpcmV0dXJuITAKaWYoYj09PSJ0ZW1wbGF0ZSImJmM9PT0i
+IilyZXR1cm4hMAppZihhLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUiKT09PSIiKXJldHVybiB0aGlzLmUu
+dGcoMCxiKQpyZXR1cm4hMX19ClcuSUEucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIlRFTVBMQVRFOjoi
+K0gubihhKX0sCiRTOjJ9ClcuT3cucHJvdG90eXBlPXsKaTAoYSl7dmFyIHMKaWYodC5hTy5iKGEpKXJl
+dHVybiExCnM9dC5nNy5iKGEpCmlmKHMmJlcuclMoYSk9PT0iZm9yZWlnbk9iamVjdCIpcmV0dXJuITEK
+aWYocylyZXR1cm4hMApyZXR1cm4hMX0sCkViKGEsYixjKXtpZihiPT09ImlzInx8Qy54Qi5uKGIsIm9u
+IikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAokaWtGOjF9ClcuVzkucHJvdG90eXBlPXsKRigp
+e3ZhciBzPXRoaXMscj1zLmMrMSxxPXMuYgppZihyPHEpe3Muc3AoSi54OShzLmEscikpCnMuYz1yCnJl
+dHVybiEwfXMuc3AobnVsbCkKcy5jPXEKcmV0dXJuITF9LApnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEo
+dGhpcy5kKX0sCnNwKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClcuZFcu
+cHJvdG90eXBlPXskaUQwOjEsJGl2NjoxfQpXLm1rLnByb3RvdHlwZT17JGl5MDoxfQpXLktvLnByb3Rv
+dHlwZT17ClBuKGEpe3ZhciBzLHI9bmV3IFcuZm0odGhpcykKZG97cz10aGlzLmIKci4kMihhLG51bGwp
+fXdoaWxlKHMhPT10aGlzLmIpfSwKRVAoYSxiKXsrK3RoaXMuYgppZihiPT1udWxsfHxiIT09YS5wYXJl
+bnROb2RlKUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwKSTQoYSxiKXt2YXIgcyxyLHEscCxv
+LG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5hLmdldEF0dHJpYnV0ZSgiaXMiKQp0
+LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2Rl
+TWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0ibGFzdENoaWxkInx8Yy5uYW1lPT0ibGFzdENoaWxkInx8
+Yy5pZD09InByZXZpb3VzU2libGluZyJ8fGMubmFtZT09InByZXZpb3VzU2libGluZyJ8fGMuaWQ9PSJj
+aGlsZHJlbiJ8fGMubmFtZT09ImNoaWxkcmVuIilyZXR1cm4gdHJ1ZQp2YXIgaz1jLmNoaWxkTm9kZXMK
+aWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0aC0xXSlyZXR1cm4gdHJ1ZQppZihj
+LmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9ufHxjLmNoaWxk
+cmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBqPTAKaWYoYy5jaGlsZHJlbilq
+PWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKyspe3ZhciBoPWMuY2hpbGRyZW5baV0K
+aWYoaC5pZD09ImF0dHJpYnV0ZXMifHxoLm5hbWU9PSJhdHRyaWJ1dGVzInx8aC5pZD09Imxhc3RDaGls
+ZCJ8fGgubmFtZT09Imxhc3RDaGlsZCJ8fGguaWQ9PSJwcmV2aW91c1NpYmxpbmcifHxoLm5hbWU9PSJw
+cmV2aW91c1NpYmxpbmcifHxoLmlkPT0iY2hpbGRyZW4ifHxoLm5hbWU9PSJjaGlsZHJlbiIpcmV0dXJu
+IHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShhLmF0dHJpYnV0ZXMgaW5zdGFuY2Vv
+ZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxlbWVudCB1bnByaW50YWJsZSIKdHJ5
+e3I9Si53KGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhhKQp0aGlzLmtSKHQuaC5hKGEpLGIs
+bixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1KHApIGluc3RhbmNlb2YgUC5BVCl0
+aHJvdyBwCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpvPSJSZW1vdmluZyBjb3JydXB0ZWQgZWxlbWVu
+dCAiK0guRWoocikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndh
+cm4obyl9fX0sCmtSKGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKaWYoYyl7bS5F
+UChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBlbGVtZW50IGR1ZSB0byBjb3JydXB0ZWQgYXR0cmlidXRl
+cyBvbiA8IitkKyI+IgppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihzKQpyZXR1cm59aWYoIW0uYS5pMChhKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBk
+aXNhbGxvd2VkIGVsZW1lbnQgPCIrZSsiPiBmcm9tICIrSC5FaihiKQppZih0eXBlb2YgY29uc29sZSE9
+InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59aWYoZyE9bnVsbClpZighbS5h
+LkViKGEsImlzIixnKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBkaXNhbGxvd2VkIHR5cGUg
+ZXh0ZW5zaW9uIDwiK2UrJyBpcz0iJytnKyciPicKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQi
+KXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufXM9Zi5ndmMoKQpyPUguUUkocy5zbGljZSgwKSxI
+LnQ2KHMpKQpmb3IocT1mLmd2YygpLmxlbmd0aC0xLHM9Zi5hO3E+PTA7LS1xKXtpZihxPj1yLmxlbmd0
+aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0gocCkKSC5uKHApCmlmKCFvLkViKGEs
+bixILm4ocy5nZXRBdHRyaWJ1dGUocCkpKSl7d2luZG93Cm89IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0
+cmlidXRlIDwiK2UrIiAiK3ArJz0iJytILkVqKHMuZ2V0QXR0cmlidXRlKHApKSsnIj4nCmlmKHR5cGVv
+ZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKG8pCnMucmVtb3ZlQXR0cmli
+dXRlKHApfX1pZih0LmFXLmIoYSkpe3M9YS5jb250ZW50CnMudG9TdHJpbmcKbS5QbihzKX19LAokaW9u
+OjF9ClcuZm0ucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLmEKc3dpdGNo
+KGEubm9kZVR5cGUpe2Nhc2UgMTptLkk0KGEsYikKYnJlYWsKY2FzZSA4OmNhc2UgMTE6Y2FzZSAzOmNh
+c2UgNDpicmVhawpkZWZhdWx0Om0uRVAoYSxiKX1zPWEubGFzdENoaWxkCmZvcihxPXQuQTtzIT1udWxs
+Oyl7cj1udWxsCnRyeXtyPXMucHJldmlvdXNTaWJsaW5nCmlmKHIhPW51bGwpe3A9ci5uZXh0U2libGlu
+ZwpvPXMKbz1wPT1udWxsP28hPW51bGw6cCE9PW8KcD1vfWVsc2UgcD0hMQppZihwKXtwPVAuUFYoIkNv
+cnJ1cHQgSFRNTCIpCnRocm93IEguYihwKX19Y2F0Y2gobil7SC5SdShuKQpwPXEuYShzKTsrK20uYgpv
+PXAucGFyZW50Tm9kZQppZihhIT09byl7aWYobyE9bnVsbClvLnJlbW92ZUNoaWxkKHApfWVsc2UgYS5y
+ZW1vdmVDaGlsZChwKQpzPW51bGwKcj1hLmxhc3RDaGlsZH1pZihzIT1udWxsKXRoaXMuJDIocyxhKQpz
+PXJ9fSwKJFM6MzB9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJvdG90eXBlPXt9ClcuckIucHJvdG90
+eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBlPXt9ClAuaUoucHJvdG90eXBlPXsK
+VkgoYSl7dmFyIHMscj10aGlzLmEscT1yLmxlbmd0aApmb3Iocz0wO3M8cTsrK3MpaWYocltzXT09PWEp
+cmV0dXJuIHMKQy5ObS5pKHIsYSkKQy5ObS5pKHRoaXMuYixudWxsKQpyZXR1cm4gcX0sClB2KGEpe3Zh
+ciBzLHIscSxwPXRoaXMsbz17fQppZihhPT1udWxsKXJldHVybiBhCmlmKEguclEoYSkpcmV0dXJuIGEK
+aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4g
+YQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERhdGUoYS5hKQppZih0LmZ2LmIoYSkpdGhy
+b3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVnRXhwIikpCmlmKHQuYzguYihhKSlyZXR1
+cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihhKSlyZXR1cm4gYQpzPXQuZEUuYihhKXx8
+ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3Ro
+KXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1udWxsKXJldHVybiBxCnE9e30Kby5hPXEK
+Qy5ObS5ZNShzLHIscSkKYS5LKDAsbmV3IFAuRTIobyxwKSkKcmV0dXJuIG8uYX1pZih0LmouYihhKSl7
+cj1wLlZIKGEpCm89cC5iCmlmKHI+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8scikKcT1vW3JdCmlmKHEh
+PW51bGwpcmV0dXJuIHEKcmV0dXJuIHAuZWsoYSxyKX1pZih0LmVILmIoYSkpe3I9cC5WSChhKQpzPXAu
+YgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5iPXNbcl0KaWYocSE9bnVsbClyZXR1
+cm4gcQpxPXt9Cm8uYj1xCkMuTm0uWTUocyxyLHEpCnAuaW0oYSxuZXcgUC5qZyhvLHApKQpyZXR1cm4g
+by5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplayhh
+LGIpe3ZhciBzLHI9Si5VNihhKSxxPXIuZ0EoYSkscD1uZXcgQXJyYXkocSkKQy5ObS5ZNSh0aGlzLmIs
+YixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZNShwLHMsdGhpcy5QdihyLnEoYSxzKSkpCnJldHVybiBw
+fX0KUC5FMi5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5hW2FdPXRoaXMuYi5QdihiKX0sCiRTOjMx
+fQpQLmpnLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzJ9
+ClAuQmYucHJvdG90eXBlPXsKaW0oYSxiKXt2YXIgcyxyLHEscAp0LmI4LmEoYikKZm9yKHM9T2JqZWN0
+LmtleXMoYSkscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3FdCmIuJDIocCxhW3BdKX19fQpQLkFz
+LnByb3RvdHlwZT17ClYoYSl7dmFyIHMKSC5uKGEpCnM9JC5oRygpLmIKaWYocy50ZXN0KGEpKXJldHVy
+biBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFsaWQgY2xhc3MgdG9rZW4iKSl9LAp3
+KGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtKGEpe3ZhciBzPXRoaXMuRCgpCnJldHVybiBQ
+LnJqKHMscy5yLEguTGgocykuYyl9LApnbDAoYSl7cmV0dXJuIHRoaXMuRCgpLmE9PT0wfSwKZ29yKGEp
+e3JldHVybiB0aGlzLkQoKS5hIT09MH0sCmdBKGEpe3JldHVybiB0aGlzLkQoKS5hfSwKdGcoYSxiKXt0
+aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppKGEsYil7dmFyIHMKSC5uKGIpCnRoaXMu
+VihiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnA4KHM9PW51bGw/ITE6cyl9LApSKGEs
+Yil7dmFyIHMscgppZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuITEKdGhpcy5WKGIpCnM9dGhpcy5E
+KCkKcj1zLlIoMCxiKQp0aGlzLlgocykKcmV0dXJuIHJ9LApGVihhLGIpe3RoaXMuT1MobmV3IFAuTjco
+dGhpcyx0Lk8uYShiKSkpfSwKZVIoYSxiKXt2YXIgcz10aGlzLkQoKQpyZXR1cm4gSC5iSyhzLGIsSC5M
+aChzKS5DKCJsZi5FIikpfSwKRShhLGIpe3JldHVybiB0aGlzLkQoKS5FKDAsYil9LApWMShhKXt0aGlz
+Lk9TKG5ldyBQLnVRKCkpfSwKT1MoYSl7dmFyIHMscgp0LmJVLmEoYSkKcz10aGlzLkQoKQpyPWEuJDEo
+cykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5DLmEo
+YSkuaSgwLHRoaXMuYSl9LAokUzozM30KUC5ONy5wcm90b3R5cGU9ewokMShhKXt2YXIgcz10aGlzLmIs
+cj1ILnQ2KHMpCnJldHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxKKHMsci5DKCJxVSgxKSIpLmEodGhp
+cy5hLmd1TSgpKSxyLkMoImxKPDEscVU+IikpKX0sCiRTOjEyfQpQLnVRLnByb3RvdHlwZT17CiQxKGEp
+e3QuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0
+dXJuIG51bGx9LAokUzoxMn0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5EVi5wcm90b3R5cGU9ewok
+MShhKXt2YXIgcwp0LlkuYShhKQpzPWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1
+cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9fShQLlI0
+LGEsITEpClAuRG0ocywkLnooKSxhKQpyZXR1cm4gc30sCiRTOjR9ClAuUEMucHJvdG90eXBlPXsKJDEo
+YSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLlFTLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
+biBuZXcgUC5yNyh0LksuYShhKSl9LAokUzo0NH0KUC5ucC5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4g
+bmV3IFAuVHoodC5LLmEoYSksdC5hbSl9LAokUzozNn0KUC5VdC5wcm90b3R5cGU9ewokMShhKXtyZXR1
+cm4gbmV3IFAuRTQodC5LLmEoYSkpfSwKJFM6Mzd9ClAuRTQucHJvdG90eXBlPXsKcShhLGIpe2lmKHR5
+cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0
+eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIixudWxsKSkKcmV0dXJuIFAuZFUodGhpcy5hW2JdKX0sClk1
+KGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIo
+UC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIsbnVsbCkpCnRoaXMuYVtiXT1QLndZ
+KGMpfSwKRE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5FNCYm
+dGhpcy5hPT09Yi5hfSwKdyhhKXt2YXIgcyxyCnRyeXtzPVN0cmluZyh0aGlzLmEpCnJldHVybiBzfWNh
+dGNoKHIpe0guUnUocikKcz10aGlzLnhiKDApCnJldHVybiBzfX0sClY3KGEsYil7dmFyIHMscj10aGlz
+LmEKaWYoYj09bnVsbClzPW51bGwKZWxzZXtzPUgudDYoYikKcz1QLlBXKG5ldyBILmxKKGIscy5DKCJA
+KDEpIikuYShQLmlHKCkpLHMuQygibEo8MSxAPiIpKSwhMCx0LnopfXJldHVybiBQLmRVKHJbYV0uYXBw
+bHkocixzKSl9LApnaU8oYSl7cmV0dXJuIDB9fQpQLnI3LnByb3RvdHlwZT17fQpQLlR6LnByb3RvdHlw
+ZT17CmNQKGEpe3ZhciBzPXRoaXMscj1hPDB8fGE+PXMuZ0EocykKaWYocil0aHJvdyBILmIoUC5URShh
+LDAscy5nQShzKSxudWxsLG51bGwpKX0sCnEoYSxiKXtpZihILm9rKGIpKXRoaXMuY1AoYikKcmV0dXJu
+IHRoaXMuJHRpLmMuYSh0aGlzLlVyKDAsYikpfSwKWTUoYSxiLGMpe3RoaXMuY1AoYikKdGhpcy5iaCgw
+LGIsYyl9LApnQShhKXt2YXIgcz10aGlzLmEubGVuZ3RoCmlmKHR5cGVvZiBzPT09Im51bWJlciImJnM+
+Pj4wPT09cylyZXR1cm4gcwp0aHJvdyBILmIoUC5QVigiQmFkIEpzQXJyYXkgbGVuZ3RoIikpfSwKJGli
+UToxLAokaWNYOjEsCiRpek06MX0KUC52Zy5wcm90b3R5cGU9ewpZNShhLGIsYyl7cmV0dXJuIHRoaXMu
+ZTQoMCxiLGMpfX0KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpEKCl7dmFy
+IHMscixxLHAsbz10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLG49UC5Mcyh0Lk4pCmlmKG89PW51
+bGwpcmV0dXJuIG4KZm9yKHM9by5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5U
+MChzW3FdKQppZihwLmxlbmd0aCE9PTApbi5pKDAscCl9cmV0dXJuIG59LApYKGEpe3RoaXMuYS5zZXRB
+dHRyaWJ1dGUoImNsYXNzIixhLmsoMCwiICIpKX19ClAuaGkucHJvdG90eXBlPXsKZ1AoYSl7cmV0dXJu
+IG5ldyBQLktlKGEpfSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjYoYSxiLGMsZCl7dmFyIHMscixx
+LHAsbyxuCmlmKGQ9PW51bGwpe3M9SC5RSShbXSx0LnIpCmQ9bmV3IFcudkQocykKQy5ObS5pKHMsVy5U
+dyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQpDLk5tLmkocyxuZXcgVy5PdygpKX1jPW5ldyBXLktvKGQp
+CnI9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guRWooYikrIjwvc3ZnPiIKcz1kb2N1bWVudApxPXMuYm9k
+eQpxLnRvU3RyaW5nCnA9Qy5SWS5BSChxLHIsYykKbz1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpz
+PW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RDaGlsZCxzIT1udWxsOylvLmFwcGVu
+ZENoaWxkKHMpCnJldHVybiBvfSwKbnooYSxiLGMsZCxlKXt0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGlu
+dm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdWbChhKXtyZXR1cm4gbmV3IFcuQ3Eo
+YSwiY2xpY2siLCExLHQuUSl9LAokaWhpOjF9ClUuZDIucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyLHEs
+cCxvPXRoaXMsbj10Lk4sbT10LlgsbD1QLkZsKG4sbSksaz1vLmEKaWYoayE9bnVsbCl7cz1ILlFJKFtd
+LHQuZCkKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5sZW5ndGg9PT1yfHwoMCxILmxrKShr
+KSwrK3Epe3A9a1txXQpzLnB1c2goUC5FRihbImRlc2NyaXB0aW9uIixwLmEsImhyZWYiLHAuYl0sbixt
+KSl9bC5ZNSgwLCJlZGl0cyIscyl9bC5ZNSgwLCJleHBsYW5hdGlvbiIsby5iKQpsLlk1KDAsImxpbmUi
+LG8uYykKbC5ZNSgwLCJkaXNwbGF5UGF0aCIsby5kKQpsLlk1KDAsInVyaVBhdGgiLG8uZSkKbj1vLmYK
+aWYobiE9bnVsbCl7bT1ILlFJKFtdLHQuZCkKZm9yKGs9bi5sZW5ndGgscT0wO3E8bi5sZW5ndGg7bi5s
+ZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpbS5wdXNoKG5bcV0uTHQoKSkKbC5ZNSgwLCJ0cmFjZXMi
+LG0pfXJldHVybiBsfX0KVS5TZS5wcm90b3R5cGU9ewpMdCgpe3JldHVybiBQLkVGKFsiZGVzY3JpcHRp
+b24iLHRoaXMuYSwiaHJlZiIsdGhpcy5iXSx0Lk4sdC5YKX19ClUuTWwucHJvdG90eXBlPXsKTHQoKXty
+ZXR1cm4gUC5FRihbImhyZWYiLHRoaXMuYSwibGluZSIsdGhpcy5iLCJwYXRoIix0aGlzLmNdLHQuTix0
+LlgpfX0KVS55RC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwPUguUUkoW10sdC5kKQpmb3Iocz10
+aGlzLmIscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsr
+cSlwLnB1c2goc1txXS5MdCgpKQpyZXR1cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImVudHJp
+ZXMiLHBdLHQuTix0LlgpfX0KVS53Yi5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwPXRoaXMsbz1Q
+LkZsKHQuTix0LlgpCm8uWTUoMCwiZGVzY3JpcHRpb24iLHAuYSkKcz1wLmIKaWYocyE9bnVsbClvLlk1
+KDAsImZ1bmN0aW9uIixzKQpzPXAuYwppZihzIT1udWxsKW8uWTUoMCwibGluayIscy5MdCgpKQpzPXAu
+ZAppZihzLmxlbmd0aCE9PTApe3I9SC50NihzKQpxPXIuQygibEo8MSxaMDxxVSxNaD8+PiIpCm8uWTUo
+MCwiaGludEFjdGlvbnMiLFAuWTEobmV3IEgubEoocyxyLkMoIlowPHFVLE1oPz4oMSkiKS5hKG5ldyBV
+LmIwKCkpLHEpLCEwLHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpVLmFOLnByb3RvdHlwZT17CiQxKGEp
+e3JldHVybiBSLm56KHQuRy5hKGEpKX0sCiRTOjM4fQpVLmIwLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
+biB0LkouYShhKS5MdCgpfSwKJFM6Mzl9CkIuajgucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihb
+ImxpbmUiLHRoaXMuYSwiZXhwbGFuYXRpb24iLHRoaXMuYiwib2Zmc2V0Iix0aGlzLmNdLHQuTix0Llgp
+fX0KQi5xcC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPXQuTixqPVAu
+Rmwoayx0LngpCmZvcihzPWwuZCxzPXMuZ1B1KHMpLHM9cy5nbShzKSxyPXQuWCxxPXQuZDtzLkYoKTsp
+e3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklUKHAuYik7cC5GKCk7KXttPXAuZ2wo
+KQpuLnB1c2goUC5FRihbImxpbmUiLG0uYSwiZXhwbGFuYXRpb24iLG0uYiwib2Zmc2V0IixtLmNdLGss
+cikpfWouWTUoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIsbC5hLCJuYXZpZ2F0aW9uQ29udGVu
+dCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIpfX0KVC5tUS5wcm90b3R5cGU9e30K
+TC5lLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8sbixtCnQuQi5hKGEpCnM9dC5GCnI9cy5h
+KHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKcT1MLkc2KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYp
+CnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQpMLkdlKCkKaWYociE9PSIvIil7cz1kb2N1
+bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50CnMudG9TdHJpbmcKcz1yIT09Qy54
+Qi5iUyhzKX1lbHNlIHM9ITEKaWYocyl7ci50b1N0cmluZwpMLkc3KHIscSxwLCEwLG5ldyBMLlZXKHIs
+cSxwKSl9cz1kb2N1bWVudApvPXMucXVlcnlTZWxlY3RvcigiLmFwcGx5LW1pZ3JhdGlvbiIpCm8udG9T
+dHJpbmcKbz1KLnFGKG8pCm49by4kdGkKbT1uLkMoIn4oMSk/IikuYShuZXcgTC5vWigpKQp0LlouYShu
+dWxsKQpXLkpFKG8uYSxvLmIsbSwhMSxuLmMpCm49cy5xdWVyeVNlbGVjdG9yKCIucmVydW4tbWlncmF0
+aW9uIikKbi50b1N0cmluZwpuPUoucUYobikKbT1uLiR0aQpXLkpFKG4uYSxuLmIsbS5DKCJ+KDEpPyIp
+LmEobmV3IEwueTgoKSksITEsbS5jKQptPXMucXVlcnlTZWxlY3RvcigiLnJlcG9ydC1wcm9ibGVtIikK
+bS50b1N0cmluZwptPUoucUYobSkKbj1tLiR0aQpXLkpFKG0uYSxtLmIsbi5DKCJ+KDEpPyIpLmEobmV3
+IEwuSGkoKSksITEsbi5jKQpzPXMucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUgLmNsb3NlIikKcy50
+b1N0cmluZwpzPUoucUYocykKbj1zLiR0aQpXLkpFKHMuYSxzLmIsbi5DKCJ+KDEpPyIpLmEobmV3IEwu
+QlQoKSksITEsbi5jKQpuPSQuYzAoKQpuLnRvU3RyaW5nCm49Si5xRihuKQpzPW4uJHRpClcuSkUobi5h
+LG4uYixzLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxzLmMpfSwKJFM6MTd9CkwuVlcucHJvdG90
+eXBlPXsKJDAoKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1oucHJvdG90eXBl
+PXsKJDEoYSl7dmFyIHMscixxLHAsbwp0LlYuYShhKQppZihDLm9sLnVzKHdpbmRvdywiVGhpcyB3aWxs
+IGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8geW91ciB3b3JraW5nIGRpcmVjdG9y
+eS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hhbmdlcyB5b3UgbWFkZSBiZWZvcmUg
+ZG9pbmcgdGhpcy4iKSl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9JC5JUixxPXIubGVuZ3RoLHA9MDtwPHIu
+bGVuZ3RoO3IubGVuZ3RoPT09cXx8KDAsSC5saykociksKytwKXMucHVzaChyW3BdLkx0KCkpCnM9TC50
+eSgiL2FwcGx5LW1pZ3JhdGlvbiIsUC5FRihbIm5hdmlnYXRpb25UcmVlIixzXSx0Lk4sdC54KSkuVzco
+bmV3IEwuanIoKSx0LlApCm89bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcj1zLiR0aQpxPSQuWDMKaWYo
+cSE9PUMuTlUpbz1QLlZIKG8scSkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhxLHIpLDIsbnVsbCxvLHIu
+QygiQDwxPiIpLktxKHIuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6MX0KTC5qci5wcm90b3R5cGU9ewok
+MShhKXt2YXIgcwp0LmZuLmEoYSkKcz1kb2N1bWVudC5ib2R5CnMuY2xhc3NMaXN0LnJlbW92ZSgicHJv
+cG9zZWQiKQpzLmNsYXNzTGlzdC5hZGQoImFwcGxpZWQiKX0sCiRTOjQyfQpMLnFsLnByb3RvdHlwZT17
+CiQyKGEsYil7TC5DMigiQ291bGRuJ3QgYXBwbHkgbWlncmF0aW9uIix0LksuYShhKSxiKX0sCiRTOjQz
+fQpMLnk4LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLnhuKHQuVi5hKGEpKX0sCnhuKGEpe3Zh
+ciBzPTAscj1QLkZYKHQuSCkscT0xLHAsbz1bXSxuLG0sbCxrLGosaQp2YXIgJGFzeW5jJCQxPVAubHoo
+ZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
+cT0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKcz02CnJldHVybiBQLmpR
+KEwudHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQkMSkKY2FzZSA2Om49YwprPW4Kay50
+b1N0cmluZwppZihILnA4KEoueDkoaywic3VjY2VzcyIpKSl0LkYuYSh3aW5kb3cubG9jYXRpb24pLnJl
+bG9hZCgpCmVsc2UgTC5LMCh0LmV3LmEoSi54OShuLCJlcnJvcnMiKSkpCm8ucHVzaCg1KQpzPTQKYnJl
+YWsKY2FzZSAzOnE9MgppPXAKbT1ILlJ1KGkpCmw9SC50cyhpKQpMLkMyKCJGYWlsZWQgdG8gcmVydW4g
+bWlncmF0aW9uIixtLGwpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2FzZSAyOm89WzFdCmNhc2UgNDpxPTEK
+ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJyZXJ1bm5pbmciKQpzPW8ucG9wKCkKYnJlYWsK
+Y2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJu
+IFAuREkoJGFzeW5jJCQxLHIpfSwKJFM6N30KTC5IaS5wcm90b3R5cGU9ewokMShhKXt0LlYuYShhKQpD
+Lm9sLlBvKHdpbmRvdyxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20iLCJkYXJ0LWxhbmcvc2RrL2lzc3Vl
+cy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVkIGlzc3VlIHdpdGggTk5CRCBtaWdy
+YXRpb24gdG9vbCIsImxhYmVscyIsdS5kLCJib2R5IiwiIyMjIyBTdGVwcyB0byByZXByb2R1Y2Vcblxu
+IyMjIyBXaGF0IGRpZCB5b3UgZXhwZWN0IHRvIGhhcHBlbj9cblxuIyMjIyBXaGF0IGFjdHVhbGx5IGhh
+cHBlbmVkP1xuXG5fU2NyZWVuc2hvdHMgYXJlIGFwcHJlY2lhdGVkX1xuXG4qKkRhcnQgU0RLIHZlcnNp
+b24qKjogIitILkVqKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZGstdmVyc2lvbiIpLnRleHRDb250
+ZW50KSsiXG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuIl0sdC5OLHQueikpLmduRCgpLCJyZXBvcnQtcHJv
+YmxlbSIpfSwKJFM6MX0KTC5CVC5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LlYuYShhKQpzPWRvY3Vt
+ZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUKcy5kaXNwbGF5PSJub25lIgpyZXR1
+cm4ibm9uZSJ9LAokUzoxfQpMLlBZLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8KdC5WLmEo
+YSkKcz0kLkQ5KCkuaW5uZXJUZXh0CnI9dC5oLmEoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1w
+YW5lbCBbZGF0YS1uYW1lKj0iJytXLkxqKHMpKyciXScpLnBhcmVudE5vZGUpCnE9ci5xdWVyeVNlbGVj
+dG9yKCIuc3RhdHVzLWljb24iKQpwPSQuSVIKcC50b1N0cmluZwpvPUwueXcocCxzKQppZihvIGluc3Rh
+bmNlb2YgTC5jRCl7cD1vLngKcC50b1N0cmluZ31lbHNlIHA9ITEKaWYocCl7TC5PdChvKQpMLnhuKHEs
+bykKTC5BUihyLG8pfX0sCiRTOjF9CkwuTC5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyLHEscAp0LkIu
+YShhKQpzPXQuRgpyPXMuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lCnIudG9TdHJpbmcKcT1MLkc2
+KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVm
+KQppZihyLmxlbmd0aD4xKUwuRzcocixxLHAsITEsbnVsbCkKZWxzZXtMLkJFKHIsQi53UigpLCEwKQpM
+LkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3fQpMLld4LnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIs
+cSxwLG89ImNvbGxhcHNlZCIKdC5WLmEoYSkKcz10aGlzLmEKcj1KLllFKHMpCnE9dGhpcy5iCnA9Si5Z
+RShxKQppZighci5nUChzKS50ZygwLG8pKXtyLmdQKHMpLmkoMCxvKQpwLmdQKHEpLmkoMCxvKX1lbHNl
+e3IuZ1AocykuUigwLG8pCnAuZ1AocSkuUigwLG8pfX0sCiRTOjF9CkwuSG8ucHJvdG90eXBlPXsKJDEo
+YSl7dmFyIHM9Si5xRih0LmguYShhKSkscj1zLiR0aSxxPXIuQygifigxKT8iKS5hKG5ldyBMLmROKHRo
+aXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpMLmROLnByb3Rv
+dHlwZT17CiQxKGEpe3JldHVybiBMLnQyKHQuVi5hKGEpLHRoaXMuYSl9LAokUzoxfQpMLklDLnByb3Rv
+dHlwZT17CiQxKGEpe3ZhciBzLHIscQp0LmguYShhKQpzPUoucUYoYSkKcj1zLiR0aQpxPXIuQygifigx
+KT8iKS5hKG5ldyBMLnh6KGEsdGhpcy5hKSkKdC5aLmEobnVsbCkKVy5KRShzLmEscy5iLHEsITEsci5j
+KX0sCiRTOjN9CkwueHoucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscixxLHAKdC5WLmEoYSkKcz10aGlz
+LmEKcj1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHMpKS5PVSgib2Zmc2V0
+IikpCnIudG9TdHJpbmcKcT1QLlFBKHIsbnVsbCkKcz1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBX
+LlN5KG5ldyBXLmk3KHMpKS5PVSgibGluZSIpKQpzLnRvU3RyaW5nCnA9UC5RQShzLG51bGwpCnM9dGhp
+cy5iCnMudG9TdHJpbmcKTC5oWChzLHEscCl9LAokUzoxfQpMLkJOLnByb3RvdHlwZT17CiQxKGEpe3Zh
+ciBzPUoucUYodC5oLmEoYSkpLHI9cy4kdGkKci5DKCJ+KDEpPyIpLmEoTC5pUygpKQp0LlouYShudWxs
+KQpXLkpFKHMuYSxzLmIsTC5pUygpLCExLHIuYyl9LAokUzozfQpMLmZDLnByb3RvdHlwZT17CiQxKGEp
+e3QucC5hKGEpCnRoaXMuYS5hTSgwLHRoaXMuYil9LAokUzo0Nn0KTC5UbS5wcm90b3R5cGU9ewokMShh
+KXtILm4oYSkKcmV0dXJuIGEubGVuZ3RoPjQwP0MueEIuTmooYSwwLDQwKSsiLi4uIjphfSwKJFM6Mn0K
+TC5uVC5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5O
+WS5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLG51bGwsbnVsbCl9LAokUzowfQpMLnVlLnByb3Rv
+dHlwZT17CiQxKGEpe3QuZi5hKGEpCnJldHVybiBILkVqKGEucSgwLCJzZXZlcml0eSIpKSsiIC0gIitI
+LkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgwLCJsb2NhdGlvbiIpKSsiIC0gKCIr
+SC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0N30KTC5HSC5wcm90b3R5cGU9ewokMShhKXt0Lmgu
+YShhKQokLnpCKCkKdC5lcy5hKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixb
+YV0pfSwKJFM6M30KTC5FRS5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyCnQuVi5hKGEpLnByZXZlbnRE
+ZWZhdWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih0LkYuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhu
+YW1lLHMsciwhMCxuZXcgTC5RTChzLHIpKQpMLmhYKHRoaXMuYyxzLHIpfSwKJFM6MX0KTC5RTC5wcm90
+b3R5cGU9ewokMCgpe0wuRnIodC5GLmEod2luZG93LmxvY2F0aW9uKS5wYXRobmFtZSx0aGlzLmEsdGhp
+cy5iKX0sCiRTOjB9CkwuVlMucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscj0ic2VsZWN0ZWQtZmlsZSIK
+dC5oLmEoYSkKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcu
+aTcoYSkpLk9VKCJuYW1lIikpPT09dGhpcy5hLmEpcy5nUChhKS5pKDAscikKZWxzZSBzLmdQKGEpLlIo
+MCxyKX0sCiRTOjN9CkwuVEQucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscgp0LlYuYShhKQpzPXRoaXMu
+YQpzd2l0Y2gocy5nTCgpKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOnMubkcoKQpicmVhawpjYXNl
+IEMuWGo6cy5jMigpCmJyZWFrCmNhc2UgQy5kYzpzLmMyKCkKYnJlYWt9cj10aGlzLmIKTC5iTChyLHMp
+CkwueG4odGhpcy5jLHMpCkwuQVIocixzKX0sCiRTOjF9CkwuSWYucHJvdG90eXBlPXsKJDEoYSl7dmFy
+IHMKdC5WLmEoYSkKcz10aGlzLmEKTC5PdChzKQpMLnhuKHRoaXMuYixzKQpMLkFSKHRoaXMuYyxzKX0s
+CiRTOjF9CkwudEIucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEwudDIodC5WLmEoYSksITApfSwKJFM6
+MX0KTC5tMi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5SSSh0LlYuYShhKSl9LApSSShhKXt2
+YXIgcz0wLHI9UC5GWCh0LkgpLHE9MSxwLG89W10sbj10aGlzLG0sbCxrLGosaSxoLGcsZixlCnZhciAk
+YXN5bmMkJDE9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dp
+dGNoKHMpe2Nhc2UgMDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEoaS5xdWVyeVNlbGVjdG9yKCIuY29u
+dGVudCIpLnNjcm9sbFRvcCkKaD10Lk4Kcz02CnJldHVybiBQLmpRKEwudHkoTC5RNCgiL2FwcGx5LWhp
+bnQiLFAuRmwoaCxoKSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2FzZSA2Omg9bi5iCmc9aC5hCmcudG9T
+dHJpbmcKbD1MLlVzKGcpCnM9NwpyZXR1cm4gUC5qUShMLkc3KGwsbnVsbCxoLmIsITEsbnVsbCksJGFz
+eW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNzTGlzdC5hZGQoIm5lZWRzLXJlcnVuIikKaT1pLnF1ZXJ5
+U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0cmluZwppLnNjcm9sbFRvcD1DLmpuLnpRKG0pCnE9MQpz
+PTUKYnJlYWsKY2FzZSAzOnE9MgplPXAKaz1ILlJ1KGUpCmo9SC50cyhlKQpMLkMyKCJjb3VsZG4ndCBh
+cHBseSBoaW50IixrLGopCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
+QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxy
+KX0sCiRTOjd9CkwuUVcucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gdGhpcy5hKyI6XG4iK3RoaXMuYn0s
+CiRpUno6MX0KTC5YQS5wcm90b3R5cGU9ewpFYihhLGIsYyl7cmV0dXJuITB9LAppMChhKXtyZXR1cm4h
+MH0sCiRpa0Y6MX0KTC52dC5wcm90b3R5cGU9ewpnTCgpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcy5k
+CmlmKGwubGVuZ3RoPT09MClyZXR1cm4gQy5jdwpzPUMuTm0uZ3RIKGwpLmdMKCkKZm9yKHI9bC5sZW5n
+dGgscT0hMCxwPSEwLG89MDtvPGwubGVuZ3RoO2wubGVuZ3RoPT09cnx8KDAsSC5saykobCksKytvKXtu
+PWxbb10uZ0woKQppZihuIT1zKXM9bnVsbAptPW4hPT1DLmN3CmlmKG0mJm4hPT1DLldEKXE9ITEKaWYo
+bSYmbiE9PUMuWGopcD0hMX1pZihzIT1udWxsKXJldHVybiBzCmlmKHEpcmV0dXJuIEMuV0QKaWYocCly
+ZXR1cm4gQy5YagpyZXR1cm4gQy5kY30sCkxWKCl7dmFyIHMscixxLHA9dGhpcy5kCmlmKHAhPW51bGwp
+Zm9yKHM9cC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9cFtyXQppZihxLmI9PT0kKXEuYj10aGlzCmVsc2Ug
+SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIikp
+fX0sCmMyKCl7dmFyIHMscixxLHAsbwpmb3Iocz10aGlzLmQscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0
+aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcSl7cD1zW3FdCmlmKHAgaW5zdGFuY2VvZiBMLnZ0
+KXAuYzIoKQplbHNle2lmKHAgaW5zdGFuY2VvZiBMLmNEKXtvPXAueApvLnRvU3RyaW5nCm89byYmcC5y
+PT09Qy5Yan1lbHNlIG89ITEKaWYobylwLnI9Qy5XRH19fSwKbkcoKXt2YXIgcyxyLHEscCxvCmZvcihz
+PXRoaXMuZCxyPXMubGVuZ3RoLHE9MDtxPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyks
+KytxKXtwPXNbcV0KaWYocCBpbnN0YW5jZW9mIEwudnQpcC5uRygpCmVsc2V7aWYocCBpbnN0YW5jZW9m
+IEwuY0Qpe289cC54Cm8udG9TdHJpbmcKbz1vJiZwLnI9PT1DLldEfWVsc2Ugbz0hMQppZihvKXAucj1D
+LlhqfX19LApMdCgpe3ZhciBzLHI9UC5GbCh0Lk4sdC5YKQpyLlk1KDAsInR5cGUiLCJkaXJlY3Rvcnki
+KQpyLlk1KDAsIm5hbWUiLHRoaXMuYSkKcz10aGlzLmQKcy50b1N0cmluZwpyLlk1KDAsInN1YnRyZWUi
+LEwuVkQocykpCnM9dGhpcy5jCmlmKHMhPW51bGwpci5ZNSgwLCJwYXRoIixzKQpyZXR1cm4gcn19Ckwu
+Y0QucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyPXRoaXMscT1QLkZsKHQuTix0LlgpCnEuWTUoMCwidHlw
+ZSIsImZpbGUiKQpxLlk1KDAsIm5hbWUiLHIuYSkKcz1yLmMKaWYocyE9bnVsbClxLlk1KDAsInBhdGgi
+LHMpCnM9ci5kCmlmKHMhPW51bGwpcS5ZNSgwLCJocmVmIixzKQpzPXIuZQppZihzIT1udWxsKXEuWTUo
+MCwiZWRpdENvdW50IixzKQpzPXIuZgppZihzIT1udWxsKXEuWTUoMCwid2FzRXhwbGljaXRseU9wdGVk
+T3V0IixzKQpzPXIucgppZihzIT1udWxsKXEuWTUoMCwibWlncmF0aW9uU3RhdHVzIixzLmEpCnM9ci54
+CmlmKHMhPW51bGwpcS5ZNSgwLCJtaWdyYXRpb25TdGF0dXNDYW5CZUNoYW5nZWQiLHMpCnJldHVybiBx
+fSwKZ0woKXtyZXR1cm4gdGhpcy5yfX0KTC5EOC5wcm90b3R5cGU9e30KTC5POS5wcm90b3R5cGU9ewp3
+KGEpe3JldHVybiB0aGlzLmJ9fQpMLkdiLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYn19ClIu
+TEwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbIm5vZGVJZCIsdGhpcy5iLCJraW5kIix0aGlz
+LmEuYV0sdC5OLHQuWCl9fQpSLk1ELnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0LmdwLmEoYSkuYT09
+PXRoaXMuYS5xKDAsImtpbmQiKX0sCiRTOjQ4fQpSLkg3LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRo
+aXMuYn19Ck0ubEkucHJvdG90eXBlPXsKV08oYSxiKXt2YXIgcyxyLHE9dC5kNApNLllGKCJhYnNvbHV0
+ZSIsSC5RSShbYixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0scSkpCnM9dGhpcy5hCnM9cy5Z
+cihiKT4wJiYhcy5oSyhiKQppZihzKXJldHVybiBiCnM9RC5hYigpCnI9SC5RSShbcyxiLG51bGwsbnVs
+bCxudWxsLG51bGwsbnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhpcy5JUChuZXcg
+SC51NihyLHQuZUopKX0sCnpmKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhpcy5hKQpxLkl4KCkKcz1xLmQK
+cj1zLmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/Ii4iOnN9aWYocj09PTEpe3M9
+cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpz
+PXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnEuSXgoKQpyZXR1cm4g
+cS53KDApfSwKSVAoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKdC5PLmEoYSkKZm9yKHM9YS4kdGks
+cj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20oYSkscz1uZXcgSC5TTyhxLHIscy5D
+KCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtzLkYoKTspe209cS5nbCgpCmlmKHIu
+aEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDApPT0wP246bgpuPUMueEIuTmooayww
+LHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZNShsLmUsMCxyLmdtSSgpKQpuPSIiK2wu
+dygwKX1lbHNlIGlmKHIuWXIobSk+MCl7bz0hci5oSyhtKQpuPSIiK219ZWxzZXtqPW0ubGVuZ3RoCmlm
+KGohPT0wKXtpZigwPj1qKXJldHVybiBILk9IKG0sMCkKaj1yLlVkKG1bMF0pfWVsc2Ugaj0hMQppZigh
+ailpZihwKW4rPXIuZ21JKCkKbis9bX1wPXIuZHMobSl9cmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9u
+Om59LApvNShhKXt2YXIgcwppZighdGhpcy55MyhhKSlyZXR1cm4gYQpzPVguQ0woYSx0aGlzLmEpCnMu
+clIoKQpyZXR1cm4gcy53KDApfSwKeTMoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMuYSxqPWsu
+WXIoYSkKaWYoaiE9PTApe2lmKGs9PT0kLktrKCkpZm9yKHM9MDtzPGo7KytzKWlmKEMueEIuVyhhLHMp
+PT09NDcpcmV0dXJuITAKcj1qCnE9NDd9ZWxzZXtyPTAKcT1udWxsfWZvcihwPW5ldyBILnFqKGEpLmEs
+bz1wLmxlbmd0aCxzPXIsbj1udWxsO3M8bzsrK3Msbj1xLHE9bSl7bT1DLnhCLk8ocCxzKQppZihrLnI0
+KG0pKXtpZihrPT09JC5LaygpJiZtPT09NDcpcmV0dXJuITAKaWYocSE9bnVsbCYmay5yNChxKSlyZXR1
+cm4hMAppZihxPT09NDYpbD1uPT1udWxsfHxuPT09NDZ8fGsucjQobikKZWxzZSBsPSExCmlmKGwpcmV0
+dXJuITB9fWlmKHE9PW51bGwpcmV0dXJuITAKaWYoay5yNChxKSlyZXR1cm4hMAppZihxPT09NDYpaz1u
+PT1udWxsfHxrLnI0KG4pfHxuPT09NDYKZWxzZSBrPSExCmlmKGspcmV0dXJuITAKcmV0dXJuITF9LApI
+UChhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8g
+IicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEp
+CmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4w
+KXRocm93IEguYihYLkk3KGsrYSsnIiBmcm9tICInK2IrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpx
+PVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4g
+SC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIu
+YgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYo
+cClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZApt
+PW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0p
+cmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZigh
+cClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0
+KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkK
+cD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaythKyciIGZyb20g
+IicrYisnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgsIi4uIiwhMSxwKSkK
+Qy5ObS5ZNShxLmUsMCwiIikKQy5ObS5VRyhxLmUsMSxQLk84KHIuZC5sZW5ndGgscy5nbUkoKSwhMSxw
+KSkKcz1xLmQKcD1zLmxlbmd0aAppZihwPT09MClyZXR1cm4iLiIKaWYocD4xJiZKLlJNKEMuTm0uZ3Ja
+KHMpLCIuIikpe3M9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1x
+LmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQppZigwPj1zLmxlbmd0aCly
+ZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCkMuTm0uaShzLCIiKX1xLmI9IiIKcS5JeCgpCnJldHVybiBx
+LncoMCl9fQpNLnE3LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBILm4oYSkhPT0iIn0sCiRTOjZ9Ck0u
+Tm8ucHJvdG90eXBlPXsKJDEoYSl7SC5rKGEpCnJldHVybiBhPT1udWxsPyJudWxsIjonIicrYSsnIid9
+LAokUzo0OX0KQi5mdi5wcm90b3R5cGU9ewp4WihhKXt2YXIgcyxyPXRoaXMuWXIoYSkKaWYocj4wKXJl
+dHVybiBDLnhCLk5qKGEsMCxyKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aClyZXR1cm4gSC5P
+SChhLDApCnM9YVswXX1lbHNlIHM9bnVsbApyZXR1cm4gc30sCk5jKGEsYil7cmV0dXJuIGE9PT1ifX0K
+WC5XRC5wcm90b3R5cGU9ewpJeCgpe3ZhciBzLHIscT10aGlzCndoaWxlKCEwKXtzPXEuZAppZighKHMu
+bGVuZ3RoIT09MCYmSi5STShDLk5tLmdyWihzKSwiIikpKWJyZWFrCnM9cS5kCmlmKDA+PXMubGVuZ3Ro
+KXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
+cywtMSkKcy5wb3AoKX1zPXEuZQpyPXMubGVuZ3RoCmlmKHIhPT0wKUMuTm0uWTUocyxyLTEsIiIpfSwK
+clIoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5RSShbXSx0LnMpCmZvcihzPW0uZCxyPXMubGVu
+Z3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3Bd
+Cm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIpKSlpZihuLkROKG8sIi4uIikpe249
+bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0gobCwtMSkKbC5wb3AoKX1lbHNlICsr
+cX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVHKGwsMCxQLk84KHEsIi4uIiwhMSx0
+Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIpCm0uc25KKGwpCnM9bS5h
+Cm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikpCnI9bS5iCmlmKHI9PW51bGx8fGwu
+bGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZNShtLmUsMCwiIikKcj1tLmIKaWYociE9bnVsbCYmcz09
+PSQuS2soKSl7ci50b1N0cmluZwptLmI9SC55cyhyLCIvIiwiXFwiKX1tLkl4KCl9LAp3KGEpe3ZhciBz
+LHIscT10aGlzLHA9cS5iCnA9cCE9bnVsbD8iIitwOiIiCmZvcihzPTA7czxxLmQubGVuZ3RoOysrcyl7
+cj1xLmUKaWYocz49ci5sZW5ndGgpcmV0dXJuIEguT0gocixzKQpyPXArSC5FaihyW3NdKQpwPXEuZApp
+ZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnA9citILkVqKHBbc10pfXArPUguRWooQy5ObS5n
+cloocS5lKSkKcmV0dXJuIHAuY2hhckNvZGVBdCgwKT09MD9wOnB9LApzbkooYSl7dGhpcy5kPXQuRC5h
+KGEpfSwKc1BoKGEpe3RoaXMuZT10LkQuYShhKX19ClguZHYucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4i
+UGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9LAokaVJ6OjF9Ck8uekwucHJvdG90eXBlPXsKdyhhKXtyZXR1
+cm4gdGhpcy5nb2ModGhpcyl9fQpFLk9GLnByb3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEs
+Ii8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIgcz1hLmxlbmd0aApyZXR1cm4gcyE9
+PTAmJkMueEIuTyhhLHMtMSkhPT00N30sClNwKGEsYil7aWYoYS5sZW5ndGghPT0wJiZDLnhCLlcoYSww
+KT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSyhh
+KXtyZXR1cm4hMX0sCmdvYygpe3JldHVybiJwb3NpeCJ9LApnbUkoKXtyZXR1cm4iLyJ9fQpGLnJ1LnBy
+b3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9
+LApkcyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQppZihDLnhCLk8oYSxzLTEpIT09
+NDcpcmV0dXJuITAKcmV0dXJuIEMueEIuVGMoYSwiOi8vIikmJnRoaXMuWXIoYSk9PT1zfSwKU3AoYSxi
+KXt2YXIgcyxyLHEscCxvPWEubGVuZ3RoCmlmKG89PT0wKXJldHVybiAwCmlmKEMueEIuVyhhLDApPT09
+NDcpcmV0dXJuIDEKZm9yKHM9MDtzPG87KytzKXtyPUMueEIuVyhhLHMpCmlmKHI9PT00NylyZXR1cm4g
+MAppZihyPT09NTgpe2lmKHM9PT0wKXJldHVybiAwCnE9Qy54Qi5YVShhLCIvIixDLnhCLlFpKGEsIi8v
+IixzKzEpP3MrMzpzKQppZihxPD0wKXJldHVybiBvCmlmKCFifHxvPHErMylyZXR1cm4gcQppZighQy54
+Qi5uKGEsImZpbGU6Ly8iKSlyZXR1cm4gcQppZighQi5ZdShhLHErMSkpcmV0dXJuIHEKcD1xKzMKcmV0
+dXJuIG89PT1wP3A6cSs0fX1yZXR1cm4gMH0sCllyKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEso
+YSl7cmV0dXJuIGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00N30sCmdvYygpe3JldHVybiJ1cmwi
+fSwKZ21JKCl7cmV0dXJuIi8ifX0KTC5JVi5wcm90b3R5cGU9ewpVZChhKXtyZXR1cm4gQy54Qi50Zyhh
+LCIvIil9LApyNChhKXtyZXR1cm4gYT09PTQ3fHxhPT09OTJ9LApkcyhhKXt2YXIgcz1hLmxlbmd0aApp
+ZihzPT09MClyZXR1cm4hMQpzPUMueEIuTyhhLHMtMSkKcmV0dXJuIShzPT09NDd8fHM9PT05Mil9LApT
+cChhLGIpe3ZhciBzLHIscT1hLmxlbmd0aAppZihxPT09MClyZXR1cm4gMApzPUMueEIuVyhhLDApCmlm
+KHM9PT00NylyZXR1cm4gMQppZihzPT09OTIpe2lmKHE8Mnx8Qy54Qi5XKGEsMSkhPT05MilyZXR1cm4g
+MQpyPUMueEIuWFUoYSwiXFwiLDIpCmlmKHI+MCl7cj1DLnhCLlhVKGEsIlxcIixyKzEpCmlmKHI+MCly
+ZXR1cm4gcn1yZXR1cm4gcX1pZihxPDMpcmV0dXJuIDAKaWYoIUIuT1MocykpcmV0dXJuIDAKaWYoQy54
+Qi5XKGEsMSkhPT01OClyZXR1cm4gMApxPUMueEIuVyhhLDIpCmlmKCEocT09PTQ3fHxxPT09OTIpKXJl
+dHVybiAwCnJldHVybiAzfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSyhhKXtyZXR1cm4g
+dGhpcy5ZcihhKT09PTF9LApPdChhLGIpe3ZhciBzCmlmKGE9PT1iKXJldHVybiEwCmlmKGE9PT00Nyly
+ZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3CmlmKChhXmIpIT09MzIpcmV0dXJuITEK
+cz1hfDMyCnJldHVybiBzPj05NyYmczw9MTIyfSwKTmMoYSxiKXt2YXIgcyxyCmlmKGE9PT1iKXJldHVy
+biEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiExCmZvcihyPTA7cjxzOysrcilpZigh
+dGhpcy5PdChDLnhCLlcoYSxyKSxDLnhCLlcoYixyKSkpcmV0dXJuITEKcmV0dXJuITB9LApnb2MoKXty
+ZXR1cm4id2luZG93cyJ9LApnbUkoKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMoKXt2YXIg
+cz1KLkd2LnByb3RvdHlwZQpzLlU9cy53CnM9Si5NRi5wcm90b3R5cGUKcy50PXMudwpzPVAuY1gucHJv
+dG90eXBlCnMuR0c9cy5ldgpzPVAuTWgucHJvdG90eXBlCnMueGI9cy53CnM9Vy5jdi5wcm90b3R5cGUK
+cy5EVz1zLnI2CnM9Vy5tNi5wcm90b3R5cGUKcy5qRj1zLkViCnM9UC5FNC5wcm90b3R5cGUKcy5Vcj1z
+LnEKcy5lND1zLlk1CnM9UC52Zy5wcm90b3R5cGUKcy5iaD1zLlk1fSkoKTsoZnVuY3Rpb24gaW5zdGFs
+bFRlYXJPZmZzKCl7dmFyIHM9aHVua0hlbHBlcnMuX3N0YXRpY18xLHI9aHVua0hlbHBlcnMuX3N0YXRp
+Y18wLHE9aHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9mZixwPWh1bmtIZWxwZXJzLmluc3Rh
+bGxTdGF0aWNUZWFyT2ZmLG89aHVua0hlbHBlcnMuX2luc3RhbmNlXzF1CnMoUCwiRVgiLCJaViIsNSkK
+cyhQLCJ5dCIsIm9BIiw1KQpzKFAsInFXIiwiQnoiLDUpCnIoUCwiVUkiLCJlTiIsMCkKcShQLlBmLnBy
+b3RvdHlwZSwiZ1lKIiwwLDEsbnVsbCxbIiQyIiwiJDEiXSxbIncwIiwicG0iXSw0MCwwLDApCnMoUCwi
+Q3kiLCJOQyIsNCkKcyhQLCJQSCIsIk10IiwyKQpwKFcsInBTIiw0LG51bGwsWyIkNCJdLFsicUQiXSwx
+NCwwKQpwKFcsIlY0Iiw0LG51bGwsWyIkNCJdLFsibloiXSwxNCwwKQpvKFAuQXMucHJvdG90eXBlLCJn
+dU0iLCJWIiwyKQpzKFAsImlHIiwid1kiLDUyKQpzKFAsIncwIiwiZFUiLDM1KQpzKEwsImlTIiwiaTYi
+LDEpfSkoKTsoZnVuY3Rpb24gaW5oZXJpdGFuY2UoKXt2YXIgcz1odW5rSGVscGVycy5taXhpbixyPWh1
+bmtIZWxwZXJzLmluaGVyaXQscT1odW5rSGVscGVycy5pbmhlcml0TWFueQpyKFAuTWgsbnVsbCkKcShQ
+Lk1oLFtILkZLLEouR3YsSi5tMSxQLmNYLEguZVQsUC5YUyxQLm5ZLEguYTcsUC5BbixILkZ1LEguSkIs
+SC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5LEgudGUsSC5icSxILlhPLEgua3Is
+UC5ZayxILnZoLEguTjYsSC5WUixILkVLLEguUGIsSC50USxILlNkLEguSmMsSC5HLFAuVzMsUC5paCxQ
+LkZ5LFAuR1YsUC5DdyxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgsUC5NTyxQLmtULFAueEksUC5tMCxQ
+LnBSLFAuYm4sUC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWssUC5TaCxQLlJ3LFAuYnosUC5pUCxQ
+Lms1LFAuS1ksUC5DRCxQLmFFLFAuTjMsUC5jOCxQLlpkLFAuTSxQLkRuLFAuUEUsUC5VZixXLmlkLFcu
+RmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxXLm1rLFcuS28sUC5pSixQLkU0LFUu
+ZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5tUSxMLlhBLEwuRDgsTC5POSxMLkdiLFIu
+TEwsUi5INyxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLkd2LFtKLnlFLEoud2UsSi5NRixKLmpkLEou
+cUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxXLklCLFcubjcsVy5lYSxXLmJyLFcu
+U2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxKLmtkLEouYzVdKQpyKEouUG8sSi5q
+ZCkKcShKLnFJLFtKLmJVLEoua0RdKQpxKFAuY1gsW0guQlIsSC5iUSxILmkxLEguVTUsSC5BTSxILnU2
+LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpyKEgub2wsSC5aeSkKcihILlVxLEgu
+UUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0guYyxQLkV6LEguYXosSC52VixILkVxLFAuQzYsSC5rUyxQ
+LlVkLFAuRixQLkFULFAubXAsUC51YixQLmRzLFAubGosUC5VVixQLnAsTC5RV10pCnIoUC51eSxQLm5Z
+KQpxKFAudXksW0gudzIsVy53eixXLmU3XSkKcihILnFqLEgudzIpCnEoSC5iUSxbSC5hTCxILk1CLEgu
+aTVdKQpxKEguYUwsW0gubkgsSC5sSixQLmk4XSkKcihILnh5LEguaTEpCnEoUC5BbixbSC5NSCxILlNP
+LEguVTFdKQpyKEguZDUsSC5BTSkKcihQLlJVLFAuUG4pCnIoUC5HaixQLlJVKQpyKEguUEQsUC5HaikK
+cihILkxQLEguV1UpCnEoSC5UcCxbSC5FMSxILkF5LEgubGMsSC5kQyxILlZYLFAudGgsUC5oYSxQLldN
+LFAucFYsUC5qWixQLkI1LFAuT1IsUC55USxQLlZDLFAuUlosUC5jNixQLnFkLFcuQ3YsVy52TixXLlV2
+LFcuRWcsVy5FbyxXLldrLFcuSUEsUC5HRSxQLk43LFAudVEsUC5EVixQLlBDLFAuUVMsUC5ucCxQLlV0
+LFUuYU4sVS5iMCxMLmUsTC5vWixMLmpyLEwueTgsTC5IaSxMLkJULEwuUFksTC5MLEwuV3gsTC5IbyxM
+LmROLEwuSUMsTC54eixMLkJOLEwuZkMsTC5UbSxMLnVlLEwuR0gsTC5FRSxMLlZTLEwuVEQsTC5JZixM
+LnRCLEwubTIsUi5NRCxNLnE3LE0uTm9dKQpxKEguRTEsW0guQ2osSC53TixQLlNYLFAuR3MsUC5VNyxQ
+LnJhLFAudGksUC5XRixQLm4xLFAuY1MsUC5KVCxQLk1FLFAueTUsUC55SSxXLktTLFcuQTMsVy5mbSxQ
+LkUyLFAuamcsTC5xbF0pCnIoSC5XMCxQLkV6KQpxKEgubGMsW0guengsSC5yVF0pCnIoSC5rWSxQLkM2
+KQpyKFAuaWwsUC5ZaykKcShQLmlsLFtILk41LFAudXcsVy5jZixXLlN5XSkKcShQLm1XLFtILktXLFAu
+cTRdKQpyKEguTFosSC5FVCkKcShILkxaLFtILlJHLEguV0JdKQpyKEguVlAsSC5SRykKcihILkRnLEgu
+VlApCnIoSC5aRyxILldCKQpyKEguUGcsSC5aRykKcShILlBnLFtILnhqLEguZEUsSC5aQSxILmRULEgu
+UHEsSC5lRSxILlY2XSkKcihILmlNLEgua1MpCnEoSC5BeSxbUC5WcyxQLkZ0LFAueUgsUC5kYSxQLm9R
+LFAudnIsUC5ydCxQLktGLFAuWkwsUC5SVCxQLnJxLFAuUlcsUC51TyxQLkV2LFAuVnAsUC54cixQLk56
+LEwuVlcsTC5uVCxMLk5ZLEwuUUxdKQpyKFAuWmYsUC5QZikKcihQLkppLFAubTApCnIoUC5YdixQLnBS
+KQpyKFAuYjYsUC5YdikKcihQLlZqLFAuV1kpCnEoUC5VayxbUC5DVixQLlppLFAuYnldKQpyKFAud0ks
+UC5rVCkKcShQLndJLFtQLlU4LFAub2osUC5NeCxQLkUzLFAuR1ldKQpyKFAuSzgsUC5VZCkKcihQLnR1
+LFAuU2gpCnIoUC51NSxQLlppKQpxKFAuQVQsW1AuYkosUC5lWV0pCnIoUC5xZSxQLkRuKQpxKFcuRDAs
+W1cuS1YsVy53YSxXLks1LFcuQ21dKQpxKFcuS1YsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpxKFcuY3Ys
+W1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcuclosVy5RUCxXLmg0LFcuU04sVy5scCxXLlRi
+LFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIoVy5oSCxXLkF6KQpyKFcuVmIsVy5RRikKcihX
+LmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihXLkFqLFcudzYpCnIoVy5yQixXLks3KQpyKFcu
+QkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhXKQpyKFcucmgsVy5vYSkKcihXLmk3LFcuY2Yp
+CnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0pCnIoVy5STyxQLnFoKQpyKFcuQ3EsVy5STykK
+cihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYsUC5pSikKcShQLkU0LFtQLnI3LFAudmddKQpy
+KFAuVHosUC52ZykKcihQLm5kLFAuaGkpCnEoTC5EOCxbTC52dCxMLmNEXSkKcihCLmZ2LE8uekwpCnEo
+Qi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkKcyhILlFDLFAubEQpCnMoSC5SRyxQLmxE
+KQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxILlNVKQpzKFAublksUC5sRCkKcyhQLldZ
+LFAubGYpCnMoUC5SVSxQLktQKQpzKFAucFIsUC5sZikKcyhXLkxlLFcuaWQpCnMoVy5LNyxQLmxEKQpz
+KFcuckIsVy5HbSkKcyhXLlhXLFAubEQpCnMoVy5vYSxXLkdtKQpzKFAudmcsUC5sRCl9KSgpCnZhciB2
+PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAoKSx0Ujp7fSxlVDp7fSx0UFY6e30sc0VBOltdfSxtYW5n
+bGVkR2xvYmFsTmFtZXM6e0lqOiJpbnQiLENQOiJkb3VibGUiLFpaOiJudW0iLHFVOiJTdHJpbmciLGEy
+OiJib29sIixjODoiTnVsbCIsek06Ikxpc3QifSxtYW5nbGVkTmFtZXM6e30sdHlwZXM6WyJ+KCkiLCJ+
+KEFqKSIsInFVKHFVKSIsIn4oY3YpIiwiQChAKSIsIn4ofigpKSIsImEyKHFVKSIsImI4PH4+KEFqKSIs
+In4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUsQCkiLCJ+KHh1PHFVPikiLCJjOChAKSIs
+ImEyKGN2LHFVLHFVLEpRKSIsImM4KCkiLCJhMihrRikiLCJjOChlYSkiLCJ+KG42LHFVLElqKSIsIn4o
+cVVbQF0pIiwiSWooSWosSWopIiwiQChxVSkiLCJ+KHFVLHFVPykiLCJuNihALEApIiwifihxVSxJaiki
+LCJhMihLVikiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIn4oZWEpIiwifihHRCxAKSIsInZzPEA+
+KEApIiwifihLVixLVj8pIiwifihALEApIiwiYzgoQCxAKSIsImEyKHh1PHFVPikiLCJjOChNaCxHeiki
+LCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiTEwoQCkiLCJaMDxxVSxNaD8+KExMKSIsIn4oTWhb
+R3o/XSkiLCJjOCh+KCkpIiwiYzgoWjA8cVUsTWg/Pj8pIiwiYzgoTWgsQCkiLCJyNyhAKSIsIn4oSWos
+QCkiLCJ+KGV3KSIsInFVKFowPEAsQD4pIiwiYTIoSDcpIiwicVUocVU/KSIsIkAoQCxxVSkiLCJ+KEAp
+IiwiTWg/KE1oPykiLCJjOChALEd6KSJdLGludGVyY2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVs
+bCxhcnJheVJ0aTpTeW1ib2woIiR0aSIpfQpILnhiKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3si
+aUMiOiJNRiIsImtkIjoiTUYiLCJjNSI6Ik1GIiwicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImhpIiwi
+dHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIsIkkwIjoiS1YiLCJocyI6IktWIiwi
+WGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54Iiwi
+elUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJhMiI6W119LCJ3ZSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6
+W119LCJqZCI6eyJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwiUG8iOnsiamQiOlsiMSJd
+LCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibTEiOnsiQW4iOlsiMSJdfSwicUkiOnsi
+Q1AiOltdLCJaWiI6W119LCJiVSI6eyJDUCI6W10sIklqIjpbXSwiWloiOltdfSwia0QiOnsiQ1AiOltd
+LCJaWiI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sIkJSIjp7ImNYIjpbIjIiXX0sImVUIjp7IkFu
+IjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEiLCIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwib2wiOnsi
+WnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIy
+In0sIlVxIjp7ImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNY
+IjpbIjIiXX0sImpWIjp7IlVxIjpbIjEiLCIyIl0sImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIx
+IiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwibEQuRSI6IjIiLCJjWC5FIjoiMiJ9LCJjIjp7IlhT
+IjpbXX0sInFqIjp7ImxEIjpbIklqIl0sIlJlIjpbIklqIl0sInpNIjpbIklqIl0sImJRIjpbIklqIl0s
+ImNYIjpbIklqIl0sImxELkUiOiJJaiIsIlJlLkUiOiJJaiJ9LCJiUSI6eyJjWCI6WyIxIl19LCJhTCI6
+eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIx
+Il0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiaTEiOnsiY1giOlsiMiJd
+LCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiY1gu
+RSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsiMiJdLCJiUSI6WyIyIl0sImNYIjpb
+IjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlNP
+Ijp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiZDUiOnsiQU0iOlsiMSJd
+LCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEiOnsiQW4iOlsiMSJdfSwiTUIiOnsi
+YlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7IkFuIjpbIjEiXX0sInU2Ijp7ImNY
+IjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwidzIiOnsibEQiOlsiMSJdLCJSZSI6
+WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQRCI6
+eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwiMiJd
+LCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIyIl0s
+IlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkxJIjp7InZRIjpbXX0s
+IlcwIjp7IkV6IjpbXSwiWFMiOltdfSwiYXoiOnsiWFMiOltdfSwidlYiOnsiWFMiOltdfSwidGUiOnsi
+UnoiOltdfSwiWE8iOnsiR3oiOltdfSwiVHAiOnsiRUgiOltdfSwiQXkiOnsiRUgiOltdfSwiRTEiOnsi
+RUgiOltdfSwibGMiOnsiRUgiOltdfSwiengiOnsiRUgiOltdfSwiclQiOnsiRUgiOltdfSwiRXEiOnsi
+WFMiOltdfSwia1kiOnsiWFMiOltdfSwiTjUiOnsiWWsiOlsiMSIsIjIiXSwiRm8iOlsiMSIsIjIiXSwi
+WjAiOlsiMSIsIjIiXSwiWWsuSyI6IjEiLCJZay5WIjoiMiJ9LCJpNSI6eyJiUSI6WyIxIl0sImNYIjpb
+IjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIiOnsid0wiOltdLCJ2WCI6W119LCJF
+SyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0sImNYLkUiOiJpYiJ9LCJQYiI6eyJB
+biI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsiT2QiXSwiY1guRSI6Ik9kIn0sIlNk
+Ijp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJMWiI6eyJYaiI6WyIxIl0sIkVUIjpbXSwiQVMi
+OltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQ1AiXSwiek0iOlsiQ1AiXSwiRVQiOltdLCJiUSI6
+WyJDUCJdLCJBUyI6W10sImNYIjpbIkNQIl0sIlNVIjpbIkNQIl0sImxELkUiOiJDUCJ9LCJQZyI6eyJs
+RCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpb
+XSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXX0sInhqIjp7ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpN
+IjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJd
+LCJsRC5FIjoiSWoifSwiZEUiOnsibEQiOlsiSWoiXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQi
+OltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9
+LCJaQSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklq
+Il0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQuRSI6IklqIn0sImRUIjp7ImxEIjpb
+IklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJj
+WCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiUHEiOnsibEQiOlsiSWoiXSwiWGoiOlsi
+SWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNV
+IjpbIklqIl0sImxELkUiOiJJaiJ9LCJlRSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJ
+aiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQu
+RSI6IklqIn0sIlY2Ijp7ImxEIjpbIklqIl0sIm42IjpbXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwi
+RVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJ
+aiJ9LCJrUyI6eyJYUyI6W119LCJpTSI6eyJFeiI6W10sIlhTIjpbXX0sInZzIjp7ImI4IjpbIjEiXX0s
+IkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiQ3ciOnsiWFMiOltd
+fSwiWmYiOnsiUGYiOlsiMSJdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsibTAiOltdLCJRbSI6W119LCJi
+NiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxmLkUiOiIxIn0s
+ImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5Ijp7ImxEIjpbIjEiXSwiek0iOlsi
+MSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIy
+Il19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7IlJVIjpb
+IjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJWaiI6
+eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJsZiI6WyIx
+Il0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZayI6WyJxVSIsIkAiXSwi
+WjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7ImFMIjpbInFVIl0sImJR
+IjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6eyJVayI6WyJ6
+TTxJaj4iLCJxVSJdLCJVay5TIjoiek08SWo+In0sIlU4Ijp7IndJIjpbInpNPElqPiIsInFVIl19LCJa
+aSI6eyJVayI6WyJxVSIsInpNPElqPiJdfSwiVWQiOnsiWFMiOltdfSwiSzgiOnsiWFMiOltdfSwiYnki
+OnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6eyJ3SSI6WyJNaD8iLCJxVSJdfSwi
+TXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFVIiwiek08SWo+Il0sIlVrLlMiOiJx
+VSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElqPiJdfSwiR1kiOnsid0kiOlsiek08SWo+IiwicVUiXX0s
+IkNQIjp7IlpaIjpbXX0sIklqIjp7IlpaIjpbXX0sInpNIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwi
+aWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJxVSI6eyJ2WCI6W119LCJD
+NiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpbXX0sIkFUIjp7IlhTIjpbXX0sImJK
+Ijp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7IlhTIjpbXX0sImRz
+Ijp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7IlhTIjpbXX0sIktZ
+Ijp7IlhTIjpbXX0sInAiOnsiWFMiOltdfSwiQ0QiOnsiUnoiOltdfSwiYUUiOnsiUnoiOltdfSwiWmQi
+OnsiR3oiOltdfSwiTSI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6W119LCJxZSI6
+eyJpRCI6W119LCJjdiI6eyJLViI6W10sIkQwIjpbXX0sImZKIjp7IkQwIjpbXX0sIkFqIjp7ImVhIjpb
+XX0sIktWIjp7IkQwIjpbXX0sImV3Ijp7ImVhIjpbXX0sIkpRIjp7ImtGIjpbXX0sInFFIjp7ImN2Ijpb
+XSwiS1YiOltdLCJEMCI6W119LCJHaCI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiZlkiOnsiY3Yi
+OltdLCJLViI6W10sIkQwIjpbXX0sInJaIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJRUCI6eyJj
+diI6W10sIktWIjpbXSwiRDAiOltdfSwibngiOnsiS1YiOltdLCJEMCI6W119LCJRRiI6eyJLViI6W10s
+IkQwIjpbXX0sIklCIjp7InRuIjpbIlpaIl19LCJ3eiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEi
+OlsiMSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImhIIjp7IkF6IjpbXX0sImg0Ijp7ImN2IjpbXSwi
+S1YiOltdLCJEMCI6W119LCJWYiI6eyJLViI6W10sIkQwIjpbXX0sIndhIjp7IkQwIjpbXX0sImU3Ijp7
+ImxEIjpbIktWIl0sInpNIjpbIktWIl0sImJRIjpbIktWIl0sImNYIjpbIktWIl0sImxELkUiOiJLViJ9
+LCJCSCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6
+WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoiS1YifSwiU04iOnsiY3YiOltdLCJL
+ViI6W10sIkQwIjpbXX0sImxwIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJUYiI6eyJjdiI6W10s
+IktWIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIldQIjp7ImN2Ijpb
+XSwiS1YiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwidzYiOnsiZWEi
+OltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6W119LCJDUSI6eyJLViI6W10sIkQw
+IjpbXX0sInc0Ijp7InRuIjpbIlpaIl19LCJyaCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6
+WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5F
+IjoiS1YifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl19LCJpNyI6eyJZayI6
+WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIlN5Ijp7
+IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwi
+STQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6
+InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sIkNxIjp7IlJPIjpbIjEiXSwicWgiOlsiMSJdfSwieEMiOnsi
+TU8iOlsiMSJdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltdfSwiY3QiOnsia0YiOltdfSwiT3ci
+Onsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYiOltdLCJEMCI6W119LCJtayI6eyJ5
+MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJx
+VSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0s
+ImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7ImhpIjpbXSwiY3Yi
+OltdLCJLViI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFV
+Il0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwi
+UVciOnsiWFMiOltdLCJSeiI6W119LCJYQSI6eyJrRiI6W119LCJ2dCI6eyJEOCI6W119LCJjRCI6eyJE
+OCI6W119LCJkdiI6eyJSeiI6W119LCJPRiI6eyJmdiI6W119LCJydSI6eyJmdiI6W119LCJJViI6eyJm
+diI6W119LCJuNiI6eyJ6TSI6WyJJaiJdLCJiUSI6WyJJaiJdLCJjWCI6WyJJaiJdLCJBUyI6W119fScp
+KQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3sidzIiOjEsIlFDIjoyLCJMWiI6MSwia1Qi
+OjIsIm1XIjoxLCJ1eSI6MSwiaWwiOjIsIlZqIjoxLCJYdiI6MSwiblkiOjEsIldZIjoxLCJwUiI6MSwi
+dmciOjF9JykpCnZhciB1PXtsOiJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdp
+dGggYSBmcmFnbWVudCBjb21wb25lbnQiLGk6IkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
+YSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIsajoiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93
+cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IixjOiJFcnJvciBoYW5k
+bGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFz
+IGFyZ3VtZW50cywgYW5kIHJldHVybiBhIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBmdXR1cmUncyB0eXBl
+IixkOiJhcmVhLWFuYWx5emVyLGFuYWx5emVyLW5uYmQtbWlncmF0aW9uLHR5cGUtYnVnIn0KdmFyIHQ9
+KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgcz1ILk4wCnJldHVybnticTpzKCJHaCIpLG46cygiQ3ciKSxjUjpz
+KCJyWiIpLHc6cygiQXoiKSxrOnMoIlFQIiksZ0Y6cygiUEQ8R0QsQD4iKSxXOnMoImJRPEA+IiksaDpz
+KCJjdiIpLG06cygiWFMiKSxCOnMoImVhIiksZzg6cygiUnoiKSxjODpzKCJoSCIpLFk6cygiRUgiKSxp
+OnMoImI4PEA+IiksSjpzKCJMTCIpLGdwOnMoIkg3IiksSTpzKCJTZyIpLG86cygidlEiKSxlaDpzKCJj
+WDxLVj4iKSxPOnMoImNYPHFVPiIpLFI6cygiY1g8QD4iKSxmQTpzKCJqZDxTZT4iKSxnaTpzKCJqZDxq
+OD4iKSxkOnMoImpkPFowPHFVLE1oPz4+IiksZmg6cygiamQ8RDg+IikscjpzKCJqZDxrRj4iKSxzOnMo
+ImpkPHFVPiIpLGhoOnMoImpkPHlEPiIpLGFKOnMoImpkPHdiPiIpLGdOOnMoImpkPG42PiIpLGI6cygi
+amQ8QD4iKSx0OnMoImpkPElqPiIpLGQ0OnMoImpkPHFVPz4iKSxUOnMoIndlIiksZUg6cygidm0iKSx1
+OnMoImM1IiksYVU6cygiWGo8QD4iKSxhbTpzKCJUejxAPiIpLGVvOnMoIk41PEdELEA+IiksZHo6cygi
+aEYiKSxmNDpzKCJ6TTxqOD4iKSx4OnMoInpNPFowPHFVLE1oPz4+IiksZXc6cygiek08TWg+IiksRDpz
+KCJ6TTxxVT4iKSxqOnMoInpNPEA+IiksTDpzKCJ6TTxJaj4iKSxlZTpzKCJ6TTxNaD8+IiksRjpzKCJ1
+OCIpLGg2OnMoIlowPHFVLE1oPiIpLEU6cygiWjA8cVUscVU+IiksZjpzKCJaMDxALEA+IiksRzpzKCJa
+MDxxVSxNaD8+IiksZHY6cygibEo8cVUscVU+IiksZG86cygibEo8cVUsQD4iKSxWOnMoIkFqIiksZEU6
+cygiRVQiKSxBOnMoIktWIiksZjY6cygia0YiKSxQOnMoImM4IiksSzpzKCJNaCIpLHA6cygiZXciKSxx
+OnMoInRuPFpaPiIpLGZ2OnMoIndMIiksY3o6cygiaWIiKSxhTzpzKCJuZCIpLEM6cygieHU8cVU+Iiks
+bDpzKCJHeiIpLE46cygicVUiKSxkRzpzKCJxVShxVSkiKSxnNzpzKCJoaSIpLGZvOnMoIkdEIiksYVc6
+cygieVkiKSxlSzpzKCJFeiIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSTpzKCJrZCIpLGR3OnMoIkdq
+PHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcy
+OnMoIkNtIiksYmo6cygiWmY8Zko+IiksaDk6cygiQ1EiKSxhYzpzKCJlNyIpLFE6cygiQ3E8QWo+Iiks
+VTpzKCJ3ejxjdj4iKSxhbzpzKCJ2czxmSj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8SWo+IiksY3I6
+cygiSlEiKSx5OnMoImEyIiksYWw6cygiYTIoTWgpIiksZ1I6cygiQ1AiKSx6OnMoIkAiKSxmTzpzKCJA
+KCkiKSx2OnMoIkAoTWgpIiksYTpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRPOnMoIkAo
+cVUpIiksYjg6cygiQChALEApIiksUzpzKCJJaiIpLGF3OnMoIjAmKiIpLF86cygiTWgqIiksY2g6cygi
+RDA/IiksYkc6cygiYjg8Yzg+PyIpLGVzOnMoIkU0PyIpLGJrOnMoInpNPHFVPj8iKSxiTTpzKCJ6TTxA
+Pj8iKSxjWjpzKCJaMDxxVSxxVT4/IiksYzk6cygiWjA8cVUsQD4/IiksZm46cygiWjA8cVUsTWg/Pj8i
+KSxYOnMoIk1oPyIpLGRrOnMoInFVPyIpLGU6cygiRmU8QCxAPj8iKSxnOnMoImJuPyIpLGI3OnMoImEy
+KE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6cygiTWg/KEApPyIp
+LFo6cygifigpPyIpLGd4OnMoIn4oZXcpPyIpLGRpOnMoIlpaIiksSDpzKCJ+IiksTTpzKCJ+KCkiKSxl
+QTpzKCJ+KHFVLHFVKSIpLGNBOnMoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFudHMoKXt2
+YXIgcz1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMueG49Vy5HaC5wcm90b3R5cGUKQy5SWT1XLlFQ
+LnByb3RvdHlwZQpDLm1IPVcuYWUucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLmZK
+LnByb3RvdHlwZQpDLk9rPUouR3YucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLmJV
+LnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1
+LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBlCkMuTkE9SC5WNi5wcm90b3R5cGUKQy50NT1XLkJI
+LnByb3RvdHlwZQpDLkx0PVcuU04ucHJvdG90eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRi
+LnByb3RvdHlwZQpDLnZCPUoua2QucHJvdG90eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcg
+UC5VOCgpCkMuaDk9bmV3IFAuQ1YoKQpDLkd3PW5ldyBILkZ1KEguTjAoIkZ1PDAmPiIpKQpDLk80PWZ1
+bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsKICB2YXIgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJp
+bmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1
+bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1bmN0aW9uID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu
+ZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewogICAgdmFyIHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwo
+byk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24g
+Z2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykgewogICAgaWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8u
+dGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1lID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7
+CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0
+dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmlj
+QnJvd3NlcihvYmplY3QsIHRhZykgewogICAgaWYgKHNlbGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGlu
+c3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVybiAiSFRNTEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVu
+a25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7
+CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAo
+dHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25z
+dHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rp
+b24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1
+bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9
+IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCI7CiAgcmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFn
+LAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93c2VyID8gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2Vy
+IDogZ2V0VW5rbm93blRhZywKICAgIHByb3RvdHlwZUZvclRhZzogcHJvdG90eXBlRm9yVGFnLAogICAg
+ZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRvciB9Owp9CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJh
+Y2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9va3MpIHsKICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9
+ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50Owog
+ICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5kZXJUcmVlIikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAg
+aWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49IDApIHsKICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7
+CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT0gIm9iamVjdCIgJiYgd2luZG93W3BdICYmIHdp
+bmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNv
+bmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVybiBob29rczsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9
+IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5LVT1mdW5jdGlvbihob29rcykgewogIGlmICh0eXBlb2Yg
+ZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnICE9ICJmdW5jdGlvbiIpIHJldHVybiBob29rczsKICBo
+b29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpD
+LmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJv
+dG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90eXBlRm9yVGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVk
+KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsK
+ICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSByZXR1cm4gIiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAi
+IUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5
+cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlmICh0YWcgPT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7
+CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFnKHRhZyk7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRh
+Z0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMu
+ZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAi
+b2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2Yo
+IkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7
+CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJE
+YXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJHZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlv
+biIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0aW9uIiwKICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAi
+TWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1bWVudCI6ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBn
+ZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tN
+YXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1m
+dW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmpl
+Y3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJp
+ZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAg
+dmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRh
+VHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJIVE1MRERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwK
+ICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6
+ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRpb24iOiAiR2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlv
+biBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1
+aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFnKSByZXR1cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAi
+T2JqZWN0IikgewogICAgICBpZiAod2luZG93LkRhdGFWaWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93
+LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmlldyI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBm
+dW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0YWcpIHsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRv
+d1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJu
+IGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9v
+a3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29r
+cykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9bmV3IFAuYnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1u
+ZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpDLk52PW5ldyBILmtyKCkKQy5OVT1uZXcgUC5KaSgpCkMu
+cGQ9bmV3IFAuWmQoKQpDLkFkPW5ldyBSLkg3KDAsIkhpbnRBY3Rpb25LaW5kLmFkZE51bGxhYmxlSGlu
+dCIpCkMubmU9bmV3IFIuSDcoMSwiSGludEFjdGlvbktpbmQuYWRkTm9uTnVsbGFibGVIaW50IikKQy5t
+eT1uZXcgUi5INygyLCJIaW50QWN0aW9uS2luZC5jaGFuZ2VUb051bGxhYmxlSGludCIpCkMucng9bmV3
+IFIuSDcoMywiSGludEFjdGlvbktpbmQuY2hhbmdlVG9Ob25OdWxsYWJsZUhpbnQiKQpDLndWPW5ldyBS
+Lkg3KDQsIkhpbnRBY3Rpb25LaW5kLnJlbW92ZU51bGxhYmxlSGludCIpCkMuZlI9bmV3IFIuSDcoNSwi
+SGludEFjdGlvbktpbmQucmVtb3ZlTm9uTnVsbGFibGVIaW50IikKQy5BMz1uZXcgUC5NeChudWxsKQpD
+Lm5YPW5ldyBQLm9qKG51bGwpCkMuY3c9bmV3IEwuR2IoMCwiVW5pdE1pZ3JhdGlvblN0YXR1cy5hbHJl
+YWR5TWlncmF0ZWQiKQpDLmRjPW5ldyBMLkdiKDEsIlVuaXRNaWdyYXRpb25TdGF0dXMuaW5kZXRlcm1p
+bmF0ZSIpCkMuV0Q9bmV3IEwuR2IoMiwiVW5pdE1pZ3JhdGlvblN0YXR1cy5taWdyYXRpbmciKQpDLlhq
+PW5ldyBMLkdiKDMsIlVuaXRNaWdyYXRpb25TdGF0dXMub3B0aW5nT3V0IikKQy5sMD1ILlFJKHMoW0Mu
+Y3csQy5kYyxDLldELEMuWGpdKSxILk4wKCJqZDxHYj4iKSkKQy5haz1ILlFJKHMoWzAsMCwzMjc3Niwz
+Mzc5MiwxLDEwMjQwLDAsMF0pLHQudCkKQy5jbT1ILlFJKHMoWyIqOjpjbGFzcyIsIio6OmRpciIsIio6
+OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIsIio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJvcCIsIio6
+Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUiLCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6OnRpdGxl
+IiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNjZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxhbmciLCJB
+OjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUiLCJBUkVB
+OjphY2Nlc3NrZXkiLCJBUkVBOjphbHQiLCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYiLCJBUkVB
+OjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRyb2xzIiwi
+QVVESU86Omxvb3AiLCJBVURJTzo6bWVkaWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElPOjpwcmVs
+b2FkIiwiQkRPOjpkaXIiLCJCT0RZOjphbGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjpsaW5rIiwi
+Qk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5rIiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3NrZXkiLCJC
+VVRUT046OmRpc2FibGVkIiwiQlVUVE9OOjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJVVFRPTjo6
+dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJDQU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgiLCJDQVBU
+SU9OOjphbGlnbiIsIkNPTDo6YWxpZ24iLCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJDT0w6OnNw
+YW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xHUk9VUDo6
+Y2hhciIsIkNPTEdST1VQOjpjaGFyb2ZmIiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6dmFsaWdu
+IiwiQ09MR1JPVVA6OndpZHRoIiwiQ09NTUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1hbmQiLCJD
+T01NQU5EOjpkaXNhYmxlZCIsIkNPTU1BTkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91cCIsIkNP
+TU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpvcGVuIiwi
+RElSOjpjb21wYWN0IiwiRElWOjphbGlnbiIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRpc2FibGVk
+IiwiRk9OVDo6Y29sb3IiLCJGT05UOjpmYWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2VwdCIsIkZP
+Uk06OmF1dG9jb21wbGV0ZSIsIkZPUk06OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JNOjpuYW1l
+IiwiRk9STTo6bm92YWxpZGF0ZSIsIkZPUk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6OmFsaWdu
+IiwiSDI6OmFsaWduIiwiSDM6OmFsaWduIiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6OmFsaWdu
+IiwiSFI6OmFsaWduIiwiSFI6Om5vc2hhZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhUTUw6OnZl
+cnNpb24iLCJJRlJBTUU6OmFsaWduIiwiSUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6aGVpZ2h0
+IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQiLCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1FOjp3aWR0
+aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFsdCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQiLCJJTUc6
+OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJTUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6dnNwYWNl
+IiwiSU1HOjp3aWR0aCIsIklOUFVUOjphY2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5QVVQ6OmFs
+aWduIiwiSU5QVVQ6OmFsdCIsIklOUFVUOjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2ZvY3VzIiwi
+SU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwiSU5QVVQ6
+OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJTlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIsIklOUFVU
+OjptaW4iLCJJTlBVVDo6bXVsdGlwbGUiLCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhvbGRlciIs
+IklOUFVUOjpyZWFkb25seSIsIklOUFVUOjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5QVVQ6OnN0
+ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJTlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJTlBVVDo6
+dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwiS0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5dHlwZSIs
+IktFWUdFTjo6bmFtZSIsIkxBQkVMOjphY2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5EOjphY2Nl
+c3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwiTEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpzaXplcyIs
+Ik1BUDo6bmFtZSIsIk1FTlU6OmNvbXBhY3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUiLCJNRVRF
+Ujo6aGlnaCIsIk1FVEVSOjpsb3ciLCJNRVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVSOjp2YWx1
+ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRjaCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2VkIiwiT0w6
+OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRHUk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFiZWwiLCJP
+UFRJT046OmRpc2FibGVkIiwiT1BUSU9OOjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJPUFRJT046
+OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJPVVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6d2lkdGgi
+LCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JFU1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNFTEVDVDo6
+YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpkaXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJTRUxFQ1Q6
+Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVkIiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJpbmRleCIs
+IlNPVVJDRTo6dHlwZSIsIlRBQkxFOjphbGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6OmJvcmRl
+ciIsIlRBQkxFOjpjZWxscGFkZGluZyIsIlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpmcmFtZSIs
+IlRBQkxFOjpydWxlcyIsIlRBQkxFOjpzdW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6OmFsaWdu
+IiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6YWJiciIs
+IlREOjphbGlnbiIsIlREOjpheGlzIiwiVEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpjaGFyb2Zm
+IiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVhZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFwIiwiVEQ6
+OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJURDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFSRUE6OmFj
+Y2Vzc2tleSIsIlRFWFRBUkVBOjphdXRvY29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRFWFRBUkVB
+OjpkaXNhYmxlZCIsIlRFWFRBUkVBOjppbnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRFWFRBUkVB
+OjpwbGFjZWhvbGRlciIsIlRFWFRBUkVBOjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJlZCIsIlRF
+WFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJURk9PVDo6
+YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRGT09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIsIlRIOjph
+YmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwiVEg6OmNo
+YXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRIOjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpub3dyYXAi
+LCJUSDo6cm93c3BhbiIsIlRIOjpzY29wZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJUSEVBRDo6
+YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRIRUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIsIlRSOjph
+bGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxpZ24iLCJU
+UkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpraW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNyY2xhbmci
+LCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBlIiwiVklERU86OmNvbnRyb2xzIiwiVklERU86OmhlaWdodCIs
+IlZJREVPOjpsb29wIiwiVklERU86Om1lZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURFTzo6cHJl
+bG9hZCIsIlZJREVPOjp3aWR0aCJdKSx0LnMpCkMuVkM9SC5RSShzKFswLDAsNjU0OTAsNDUwNTUsNjU1
+MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMubUs9SC5RSShzKFswLDAsMjY2MjQsMTAyMyw2NTUz
+NCwyMDQ3LDY1NTM0LDIwNDddKSx0LnQpCkMuU3E9SC5RSShzKFsiSEVBRCIsIkFSRUEiLCJCQVNFIiwi
+QkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNPTEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1FU0VUIiwi
+SFIiLCJJTUFHRSIsIklNRyIsIklOUFVUIiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFSQU0iLCJT
+T1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwiV0JSIl0pLHQucykKQy5kbj1ILlFJKHMoW10pLEguTjAoImpk
+PExMPiIpKQpDLnhEPUguUUkocyhbXSksdC5zKQpDLmhVPUguUUkocyhbXSksdC5iKQpDLnRvPUguUUko
+cyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLnJrPUguUUko
+cyhbQy5BZCxDLm5lLEMubXksQy5yeCxDLndWLEMuZlJdKSxILk4wKCJqZDxINz4iKSkKQy5GMz1ILlFJ
+KHMoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLmVhPUguUUko
+cyhbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlpKPUguUUko
+cyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLldkPUguUUko
+cyhbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlF4PUguUUko
+cyhbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx0LnMpCkMuQkk9SC5RSShzKFsi
+QTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwiQk9EWTo6YmFja2dyb3VuZCIs
+IkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24iLCJJTUc6OnNyYyIsIklOUFVU
+OjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3RlciJdKSx0LnMpCkMuRHg9bmV3
+IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVLHpNPGo4Pj4iKSkKQy5DTT1uZXcgSC5MUCgwLHt9LEMu
+eEQsSC5OMCgiTFA8cVUscVU+IikpCkMuaUg9SC5RSShzKFtdKSxILk4wKCJqZDxHRD4iKSkKQy5XTz1u
+ZXcgSC5MUCgwLHt9LEMuaUgsSC5OMCgiTFA8R0QsQD4iKSkKQy5ZMj1uZXcgTC5POSgiTmF2aWdhdGlv
+blRyZWVOb2RlVHlwZS5kaXJlY3RvcnkiKQpDLnJmPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVU
+eXBlLmZpbGUiKQpDLlRlPW5ldyBILnd2KCJjYWxsIikKQy5vRT1uZXcgUC5HWSghMSkKQy53UT1uZXcg
+UC5GeShudWxsLDIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC56bT1udWxsCiQueWo9MAok
+LmkwPW51bGwKJC5BbD1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwKJC54Nz1udWxsCiQubnc9bnVsbAok
+LnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwKJC5tZz1udWxsCiQuVUQ9ITEKJC5Y
+Mz1DLk5VCiQueGc9SC5RSShbXSxILk4wKCJqZDxNaD4iKSkKJC54bz1udWxsCiQuQk89bnVsbAokLmx0
+PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh0Lk4sdC5ZKQokLklSPW51bGwKJC5JNj1udWxsCiQuRmY9
+bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFsaXplcnMoKXt2YXIgcz1odW5rSGVscGVycy5sYXp5
+RmluYWwscj1odW5rSGVscGVycy5sYXp5CnMoJCwiZmEiLCJ6IixmdW5jdGlvbigpe3JldHVybiBILlln
+KCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMoJCwiS3EiLCJTbiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5j
+TShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkKcygkLCJ4
+cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRvU3RyaW5n
+OmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwiUjEiLCJOOSIsZnVuY3Rpb24o
+KXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnMoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXtyZXR1cm4g
+SC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0cnl7bnVsbC4k
+bWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMo
+JCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKcygkLCJwdiIs
+IlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNFeHByJD0i
+JGFyZ3VtZW50cyQiCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEp
+e3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5j
+TShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlv
+bigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwi
+ZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQgMCkpfSkKcygkLCJBNyIsInIx
+IixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNh
+dGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiV2MiLCJ1dCIsZnVuY3Rpb24oKXtyZXR1
+cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVybiBuZXcgUC54cigpLiQwKCl9
+KQpzKCQsImRIIiwiSEciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLk56KCkuJDAoKX0pCnMoJCwiaGoi
+LCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEludDhBcnJheShILlhGKEguUUkoWy0yLC0yLC0yLC0y
 LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0y
-LC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0x
-LC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTks
-MjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMs
-MzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIs
-LTIsLTIsLTJdLHQudCkpKX0pCnMoJCwiWWUiLCJ3USIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHBy
-b2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9
-PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09IndpbjMyIn0pCnMoJCwibWYiLCJ6
-NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpfYS16fl0qJCIpfSkKcygkLCJP
-USIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9KQpzKCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7
-cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUi
-LCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJV
-VFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdS
-T1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIs
-IkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIs
-IkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVS
-IiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJF
-TCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJP
-TCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMi
-LCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIs
-IlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJF
-QSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJW
-QVIiLCJWSURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAu
-bnUoIl5cXFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5jdGlvbigpe3JldHVybiBQLk5EKHNlbGYpfSkK
-cygkLCJrdCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkK
-cygkLCJmSyIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMu
-bz1hfX0pCnMoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQubVEoKX0pCnMoJCwiT2wi
-LCJVRSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9sLmdtVyhXLngzKCkpLmhyZWYpLmdoWSgpLnEo
-MCwiYXV0aFRva2VuIil9KQpzKCQsImhUIiwieVAiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVy
-eVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9KQpzKCQsIlc2IiwiaEwiLGZ1bmN0
-aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVu
-dCIpfSkKcygkLCJUUiIsIkRXIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3Rvcigi
-Zm9vdGVyIil9KQpzKCQsIkVZIiwiZmkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVj
-dG9yKCJoZWFkZXIiKX0pCnMoJCwiYkEiLCJjMCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5
-U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24iKX0pCnMoJCwidDAiLCJiTiIsZnVuY3Rp
-b24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24t
-bGFiZWwiKX0pCnMoJCwiYXYiLCJEOSIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0
-b3IoIiN1bml0LW5hbWUiKX0pCnIoJCwiZmUiLCJLRyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWEEo
-KX0pCnMoJCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0ubEkoSC5OMCgiZnYiKS5hKCQu
-SGsoKSkpfSkKcygkLCJ5ciIsImJEIixmdW5jdGlvbigpe3JldHVybiBuZXcgRS5PRihQLm51KCIvIiks
-UC5udSgiW14vXSQiKSxQLm51KCJeLyIpKX0pCnMoJCwiTWsiLCJLayIsZnVuY3Rpb24oKXtyZXR1cm4g
-bmV3IEwuSVYoUC5udSgiWy9cXFxcXSIpLFAubnUoIlteL1xcXFxdJCIpLFAubnUoIl4oXFxcXFxcXFxb
-XlxcXFxdK1xcXFxbXlxcXFwvXSt8W2EtekEtWl06Wy9cXFxcXSkiKSxQLm51KCJeWy9cXFxcXSg/IVsv
-XFxcXF0pIikpfSkKcygkLCJhayIsIkViIixmdW5jdGlvbigpe3JldHVybiBuZXcgRi5ydShQLm51KCIv
-IiksUC5udSgiKF5bYS16QS1aXVstKy5hLXpBLVpcXGRdKjovL3xbXi9dKSQiKSxQLm51KCJbYS16QS1a
-XVstKy5hLXpBLVpcXGRdKjovL1teL10qIiksUC5udSgiXi8iKSl9KQpzKCQsImxzIiwiSGsiLGZ1bmN0
-aW9uKCl7cmV0dXJuIE8uUmgoKX0pfSkoKTsoZnVuY3Rpb24gbmF0aXZlU3VwcG9ydCgpeyFmdW5jdGlv
-bigpe3ZhciBzPWZ1bmN0aW9uKGEpe3ZhciBtPXt9Cm1bYV09MQpyZXR1cm4gT2JqZWN0LmtleXMoaHVu
-a0hlbHBlcnMuY29udmVydFRvRmFzdE9iamVjdChtKSlbMF19CnYuZ2V0SXNvbGF0ZVRhZz1mdW5jdGlv
-bihhKXtyZXR1cm4gcygiX19fZGFydF8iK2Erdi5pc29sYXRlVGFnKX0KdmFyIHI9Il9fX2RhcnRfaXNv
-bGF0ZV90YWdzXyIKdmFyIHE9T2JqZWN0W3JdfHwoT2JqZWN0W3JdPU9iamVjdC5jcmVhdGUobnVsbCkp
-CnZhciBwPSJfWnhZeFgiCmZvcih2YXIgbz0wOztvKyspe3ZhciBuPXMocCsiXyIrbysiXyIpCmlmKCEo
-biBpbiBxKSl7cVtuXT0xCnYuaXNvbGF0ZVRhZz1uCmJyZWFrfX12LmRpc3BhdGNoUHJvcGVydHlOYW1l
-PXYuZ2V0SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIil9KCkKaHVua0hlbHBlcnMuc2V0T3JVcGRh
-dGVJbnRlcmNlcHRvcnNCeVRhZyh7RE9NRXJyb3I6Si5HdixNZWRpYUVycm9yOkouR3YsTmF2aWdhdG9y
-OkouR3YsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOkouR3YsTmF2aWdhdG9yVXNlck1lZGlhRXJy
-b3I6Si5HdixPdmVyY29uc3RyYWluZWRFcnJvcjpKLkd2LFBvc2l0aW9uRXJyb3I6Si5HdixHZW9sb2Nh
-dGlvblBvc2l0aW9uRXJyb3I6Si5HdixSYW5nZTpKLkd2LFNRTEVycm9yOkouR3YsRGF0YVZpZXc6SC5F
-VCxBcnJheUJ1ZmZlclZpZXc6SC5FVCxGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0QXJyYXk6SC5EZyxJ
-bnQxNkFycmF5OkgueGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVpbnQxNkFycmF5Okgu
-ZFQsVWludDMyQXJyYXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZhc1BpeGVsQXJyYXk6
-SC5lRSxVaW50OEFycmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxCUkVsZW1lbnQ6Vy5x
-RSxIVE1MQnV0dG9uRWxlbWVudDpXLnFFLEhUTUxDYW52YXNFbGVtZW50OlcucUUsSFRNTENvbnRlbnRF
-bGVtZW50OlcucUUsSFRNTERMaXN0RWxlbWVudDpXLnFFLEhUTUxEYXRhRWxlbWVudDpXLnFFLEhUTUxE
-YXRhTGlzdEVsZW1lbnQ6Vy5xRSxIVE1MRGV0YWlsc0VsZW1lbnQ6Vy5xRSxIVE1MRGlhbG9nRWxlbWVu
-dDpXLnFFLEhUTUxEaXZFbGVtZW50OlcucUUsSFRNTEVtYmVkRWxlbWVudDpXLnFFLEhUTUxGaWVsZFNl
-dEVsZW1lbnQ6Vy5xRSxIVE1MSFJFbGVtZW50OlcucUUsSFRNTEhlYWRFbGVtZW50OlcucUUsSFRNTEhl
-YWRpbmdFbGVtZW50OlcucUUsSFRNTEh0bWxFbGVtZW50OlcucUUsSFRNTElGcmFtZUVsZW1lbnQ6Vy5x
-RSxIVE1MSW1hZ2VFbGVtZW50OlcucUUsSFRNTElucHV0RWxlbWVudDpXLnFFLEhUTUxMSUVsZW1lbnQ6
-Vy5xRSxIVE1MTGFiZWxFbGVtZW50OlcucUUsSFRNTExlZ2VuZEVsZW1lbnQ6Vy5xRSxIVE1MTGlua0Vs
-ZW1lbnQ6Vy5xRSxIVE1MTWFwRWxlbWVudDpXLnFFLEhUTUxNZWRpYUVsZW1lbnQ6Vy5xRSxIVE1MTWVu
-dUVsZW1lbnQ6Vy5xRSxIVE1MTWV0YUVsZW1lbnQ6Vy5xRSxIVE1MTWV0ZXJFbGVtZW50OlcucUUsSFRN
-TE1vZEVsZW1lbnQ6Vy5xRSxIVE1MT0xpc3RFbGVtZW50OlcucUUsSFRNTE9iamVjdEVsZW1lbnQ6Vy5x
-RSxIVE1MT3B0R3JvdXBFbGVtZW50OlcucUUsSFRNTE9wdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MT3V0cHV0
-RWxlbWVudDpXLnFFLEhUTUxQYXJhbUVsZW1lbnQ6Vy5xRSxIVE1MUGljdHVyZUVsZW1lbnQ6Vy5xRSxI
-VE1MUHJlRWxlbWVudDpXLnFFLEhUTUxQcm9ncmVzc0VsZW1lbnQ6Vy5xRSxIVE1MUXVvdGVFbGVtZW50
-OlcucUUsSFRNTFNjcmlwdEVsZW1lbnQ6Vy5xRSxIVE1MU2hhZG93RWxlbWVudDpXLnFFLEhUTUxTbG90
-RWxlbWVudDpXLnFFLEhUTUxTb3VyY2VFbGVtZW50OlcucUUsSFRNTFNwYW5FbGVtZW50OlcucUUsSFRN
-TFN0eWxlRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OlcucUUsSFRNTFRhYmxlQ2Vs
-bEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVIZWFkZXJD
-ZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNvbEVsZW1lbnQ6Vy5xRSxIVE1MVGV4dEFyZWFFbGVtZW50
-OlcucUUsSFRNTFRpbWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVudDpXLnFFLEhUTUxUcmFja0Vs
-ZW1lbnQ6Vy5xRSxIVE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25vd25FbGVtZW50OlcucUUsSFRN
-TFZpZGVvRWxlbWVudDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50OlcucUUsSFRNTEZvbnRFbGVtZW50
-OlcucUUsSFRNTEZyYW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVsZW1lbnQ6Vy5xRSxIVE1MTWFy
-cXVlZUVsZW1lbnQ6Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEhUTUxBbmNob3JFbGVtZW50OlcuR2gsSFRN
-TEFyZWFFbGVtZW50OlcuZlksSFRNTEJhc2VFbGVtZW50OlcuclosQmxvYjpXLkF6LEhUTUxCb2R5RWxl
-bWVudDpXLlFQLENEQVRBU2VjdGlvbjpXLm54LENoYXJhY3RlckRhdGE6Vy5ueCxDb21tZW50Olcubngs
-UHJvY2Vzc2luZ0luc3RydWN0aW9uOlcubngsVGV4dDpXLm54LENTU1N0eWxlRGVjbGFyYXRpb246Vy5v
-SixNU1N0eWxlQ1NTUHJvcGVydGllczpXLm9KLENTUzJQcm9wZXJ0aWVzOlcub0osWE1MRG9jdW1lbnQ6
-Vy5RRixEb2N1bWVudDpXLlFGLERPTUV4Y2VwdGlvbjpXLk5oLERPTUltcGxlbWVudGF0aW9uOlcuYWUs
-RE9NUmVjdFJlYWRPbmx5OlcuSUIsRE9NVG9rZW5MaXN0OlcubjcsRWxlbWVudDpXLmN2LEFib3J0UGF5
-bWVudEV2ZW50OlcuZWEsQW5pbWF0aW9uRXZlbnQ6Vy5lYSxBbmltYXRpb25QbGF5YmFja0V2ZW50Olcu
-ZWEsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50
-OlcuZWEsQmFja2dyb3VuZEZldGNoRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6Vy5l
-YSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OlcuZWEsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OlcuZWEs
-QmVmb3JlVW5sb2FkRXZlbnQ6Vy5lYSxCbG9iRXZlbnQ6Vy5lYSxDYW5NYWtlUGF5bWVudEV2ZW50Olcu
-ZWEsQ2xpcGJvYXJkRXZlbnQ6Vy5lYSxDbG9zZUV2ZW50OlcuZWEsQ3VzdG9tRXZlbnQ6Vy5lYSxEZXZp
-Y2VNb3Rpb25FdmVudDpXLmVhLERldmljZU9yaWVudGF0aW9uRXZlbnQ6Vy5lYSxFcnJvckV2ZW50Olcu
-ZWEsRXh0ZW5kYWJsZUV2ZW50OlcuZWEsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDpXLmVhLEZldGNoRXZl
-bnQ6Vy5lYSxGb250RmFjZVNldExvYWRFdmVudDpXLmVhLEZvcmVpZ25GZXRjaEV2ZW50OlcuZWEsR2Ft
-ZXBhZEV2ZW50OlcuZWEsSGFzaENoYW5nZUV2ZW50OlcuZWEsSW5zdGFsbEV2ZW50OlcuZWEsTWVkaWFF
-bmNyeXB0ZWRFdmVudDpXLmVhLE1lZGlhS2V5TWVzc2FnZUV2ZW50OlcuZWEsTWVkaWFRdWVyeUxpc3RF
-dmVudDpXLmVhLE1lZGlhU3RyZWFtRXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6Vy5lYSxN
-ZXNzYWdlRXZlbnQ6Vy5lYSxNSURJQ29ubmVjdGlvbkV2ZW50OlcuZWEsTUlESU1lc3NhZ2VFdmVudDpX
-LmVhLE11dGF0aW9uRXZlbnQ6Vy5lYSxOb3RpZmljYXRpb25FdmVudDpXLmVhLFBhZ2VUcmFuc2l0aW9u
-RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVzdEV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVu
-dDpXLmVhLFBvcFN0YXRlRXZlbnQ6Vy5lYSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZl
-bnQ6Vy5lYSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDpXLmVhLFByb21pc2VSZWplY3Rp
-b25FdmVudDpXLmVhLFB1c2hFdmVudDpXLmVhLFJUQ0RhdGFDaGFubmVsRXZlbnQ6Vy5lYSxSVENEVE1G
-VG9uZUNoYW5nZUV2ZW50OlcuZWEsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDpXLmVhLFJUQ1RyYWNr
-RXZlbnQ6Vy5lYSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OlcuZWEsU2Vuc29yRXJyb3JFdmVu
-dDpXLmVhLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50Olcu
-ZWEsU3BlZWNoU3ludGhlc2lzRXZlbnQ6Vy5lYSxTdG9yYWdlRXZlbnQ6Vy5lYSxTeW5jRXZlbnQ6Vy5l
-YSxUcmFja0V2ZW50OlcuZWEsVHJhbnNpdGlvbkV2ZW50OlcuZWEsV2ViS2l0VHJhbnNpdGlvbkV2ZW50
-OlcuZWEsVlJEZXZpY2VFdmVudDpXLmVhLFZSRGlzcGxheUV2ZW50OlcuZWEsVlJTZXNzaW9uRXZlbnQ6
-Vy5lYSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OlcuZWEsVVNCQ29ubmVjdGlvbkV2ZW50OlcuZWEs
-SURCVmVyc2lvbkNoYW5nZUV2ZW50OlcuZWEsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6Vy5lYSxPZmZsaW5l
-QXVkaW9Db21wbGV0aW9uRXZlbnQ6Vy5lYSxXZWJHTENvbnRleHRFdmVudDpXLmVhLEV2ZW50OlcuZWEs
-SW5wdXRFdmVudDpXLmVhLFN1Ym1pdEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuaEgs
-SFRNTEZvcm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBS
-ZXF1ZXN0OlcuZkosWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExv
-Y2F0aW9uOlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFq
-LFdoZWVsRXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcuS1YsU2hhZG93Um9vdDpXLktWLERvY3Vt
-ZW50VHlwZTpXLktWLE5vZGU6Vy5LVixOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1M
-UGFyYWdyYXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZl
-bnQ6Vy5ldyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFi
-bGVSb3dFbGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5XUCxIVE1MVGVtcGxhdGVF
-bGVtZW50OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2
-ZW50OlcudzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6
-Vy5LNSxET01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VX
-b3JrZXJHbG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xv
-YmFsU2NvcGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5v
-ZGVNYXA6Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVs
-ZW1lbnQ6UC5uZCxTVkdBRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVFbGVtZW50OlAuaGksU1ZHQW5pbWF0
-ZU1vdGlvbkVsZW1lbnQ6UC5oaSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmhpLFNWR0FuaW1h
-dGlvbkVsZW1lbnQ6UC5oaSxTVkdDaXJjbGVFbGVtZW50OlAuaGksU1ZHQ2xpcFBhdGhFbGVtZW50OlAu
-aGksU1ZHRGVmc0VsZW1lbnQ6UC5oaSxTVkdEZXNjRWxlbWVudDpQLmhpLFNWR0Rpc2NhcmRFbGVtZW50
-OlAuaGksU1ZHRWxsaXBzZUVsZW1lbnQ6UC5oaSxTVkdGRUJsZW5kRWxlbWVudDpQLmhpLFNWR0ZFQ29s
-b3JNYXRyaXhFbGVtZW50OlAuaGksU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5oaSxTVkdG
-RUNvbXBvc2l0ZUVsZW1lbnQ6UC5oaSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZF
-RGlmZnVzZUxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmhp
-LFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFRmxvb2RFbGVtZW50OlAuaGksU1ZHRkVG
-dW5jQUVsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNCRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0dFbGVtZW50OlAu
-aGksU1ZHRkVGdW5jUkVsZW1lbnQ6UC5oaSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5oaSxTVkdG
-RUltYWdlRWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZU5vZGVFbGVt
-ZW50OlAuaGksU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmhpLFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmhp
-LFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6UC5oaSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAu
-aGksU1ZHRkVTcG90TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVUaWxlRWxlbWVudDpQLmhpLFNWR0ZFVHVy
-YnVsZW5jZUVsZW1lbnQ6UC5oaSxTVkdGaWx0ZXJFbGVtZW50OlAuaGksU1ZHRm9yZWlnbk9iamVjdEVs
-ZW1lbnQ6UC5oaSxTVkdHRWxlbWVudDpQLmhpLFNWR0dlb21ldHJ5RWxlbWVudDpQLmhpLFNWR0dyYXBo
-aWNzRWxlbWVudDpQLmhpLFNWR0ltYWdlRWxlbWVudDpQLmhpLFNWR0xpbmVFbGVtZW50OlAuaGksU1ZH
-TGluZWFyR3JhZGllbnRFbGVtZW50OlAuaGksU1ZHTWFya2VyRWxlbWVudDpQLmhpLFNWR01hc2tFbGVt
-ZW50OlAuaGksU1ZHTWV0YWRhdGFFbGVtZW50OlAuaGksU1ZHUGF0aEVsZW1lbnQ6UC5oaSxTVkdQYXR0
-ZXJuRWxlbWVudDpQLmhpLFNWR1BvbHlnb25FbGVtZW50OlAuaGksU1ZHUG9seWxpbmVFbGVtZW50OlAu
-aGksU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OlAuaGksU1ZHUmVjdEVsZW1lbnQ6UC5oaSxTVkdTZXRF
-bGVtZW50OlAuaGksU1ZHU3RvcEVsZW1lbnQ6UC5oaSxTVkdTdHlsZUVsZW1lbnQ6UC5oaSxTVkdTVkdF
-bGVtZW50OlAuaGksU1ZHU3dpdGNoRWxlbWVudDpQLmhpLFNWR1N5bWJvbEVsZW1lbnQ6UC5oaSxTVkdU
-U3BhbkVsZW1lbnQ6UC5oaSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5oaSxTVkdUZXh0RWxlbWVudDpQ
-LmhpLFNWR1RleHRQYXRoRWxlbWVudDpQLmhpLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5oaSxT
-VkdUaXRsZUVsZW1lbnQ6UC5oaSxTVkdVc2VFbGVtZW50OlAuaGksU1ZHVmlld0VsZW1lbnQ6UC5oaSxT
-VkdHcmFkaWVudEVsZW1lbnQ6UC5oaSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQ
-LmhpLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5oaSxTVkdNUGF0aEVsZW1lbnQ6UC5oaSxTVkdFbGVt
-ZW50OlAuaGl9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLE1l
-ZGlhRXJyb3I6dHJ1ZSxOYXZpZ2F0b3I6dHJ1ZSxOYXZpZ2F0b3JDb25jdXJyZW50SGFyZHdhcmU6dHJ1
-ZSxOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcjp0cnVlLE92ZXJjb25zdHJhaW5lZEVycm9yOnRydWUsUG9z
-aXRpb25FcnJvcjp0cnVlLEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcjp0cnVlLFJhbmdlOnRydWUsU1FM
-RXJyb3I6dHJ1ZSxEYXRhVmlldzp0cnVlLEFycmF5QnVmZmVyVmlldzpmYWxzZSxGbG9hdDMyQXJyYXk6
-dHJ1ZSxGbG9hdDY0QXJyYXk6dHJ1ZSxJbnQxNkFycmF5OnRydWUsSW50MzJBcnJheTp0cnVlLEludDhB
-cnJheTp0cnVlLFVpbnQxNkFycmF5OnRydWUsVWludDMyQXJyYXk6dHJ1ZSxVaW50OENsYW1wZWRBcnJh
-eTp0cnVlLENhbnZhc1BpeGVsQXJyYXk6dHJ1ZSxVaW50OEFycmF5OmZhbHNlLEhUTUxBdWRpb0VsZW1l
-bnQ6dHJ1ZSxIVE1MQlJFbGVtZW50OnRydWUsSFRNTEJ1dHRvbkVsZW1lbnQ6dHJ1ZSxIVE1MQ2FudmFz
-RWxlbWVudDp0cnVlLEhUTUxDb250ZW50RWxlbWVudDp0cnVlLEhUTUxETGlzdEVsZW1lbnQ6dHJ1ZSxI
-VE1MRGF0YUVsZW1lbnQ6dHJ1ZSxIVE1MRGF0YUxpc3RFbGVtZW50OnRydWUsSFRNTERldGFpbHNFbGVt
-ZW50OnRydWUsSFRNTERpYWxvZ0VsZW1lbnQ6dHJ1ZSxIVE1MRGl2RWxlbWVudDp0cnVlLEhUTUxFbWJl
-ZEVsZW1lbnQ6dHJ1ZSxIVE1MRmllbGRTZXRFbGVtZW50OnRydWUsSFRNTEhSRWxlbWVudDp0cnVlLEhU
-TUxIZWFkRWxlbWVudDp0cnVlLEhUTUxIZWFkaW5nRWxlbWVudDp0cnVlLEhUTUxIdG1sRWxlbWVudDp0
-cnVlLEhUTUxJRnJhbWVFbGVtZW50OnRydWUsSFRNTEltYWdlRWxlbWVudDp0cnVlLEhUTUxJbnB1dEVs
-ZW1lbnQ6dHJ1ZSxIVE1MTElFbGVtZW50OnRydWUsSFRNTExhYmVsRWxlbWVudDp0cnVlLEhUTUxMZWdl
-bmRFbGVtZW50OnRydWUsSFRNTExpbmtFbGVtZW50OnRydWUsSFRNTE1hcEVsZW1lbnQ6dHJ1ZSxIVE1M
-TWVkaWFFbGVtZW50OnRydWUsSFRNTE1lbnVFbGVtZW50OnRydWUsSFRNTE1ldGFFbGVtZW50OnRydWUs
-SFRNTE1ldGVyRWxlbWVudDp0cnVlLEhUTUxNb2RFbGVtZW50OnRydWUsSFRNTE9MaXN0RWxlbWVudDp0
-cnVlLEhUTUxPYmplY3RFbGVtZW50OnRydWUsSFRNTE9wdEdyb3VwRWxlbWVudDp0cnVlLEhUTUxPcHRp
-b25FbGVtZW50OnRydWUsSFRNTE91dHB1dEVsZW1lbnQ6dHJ1ZSxIVE1MUGFyYW1FbGVtZW50OnRydWUs
-SFRNTFBpY3R1cmVFbGVtZW50OnRydWUsSFRNTFByZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJvZ3Jlc3NFbGVt
-ZW50OnRydWUsSFRNTFF1b3RlRWxlbWVudDp0cnVlLEhUTUxTY3JpcHRFbGVtZW50OnRydWUsSFRNTFNo
-YWRvd0VsZW1lbnQ6dHJ1ZSxIVE1MU2xvdEVsZW1lbnQ6dHJ1ZSxIVE1MU291cmNlRWxlbWVudDp0cnVl
-LEhUTUxTcGFuRWxlbWVudDp0cnVlLEhUTUxTdHlsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDYXB0aW9u
-RWxlbWVudDp0cnVlLEhUTUxUYWJsZUNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlRGF0YUNlbGxFbGVt
-ZW50OnRydWUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDb2xFbGVtZW50
-OnRydWUsSFRNTFRleHRBcmVhRWxlbWVudDp0cnVlLEhUTUxUaW1lRWxlbWVudDp0cnVlLEhUTUxUaXRs
-ZUVsZW1lbnQ6dHJ1ZSxIVE1MVHJhY2tFbGVtZW50OnRydWUsSFRNTFVMaXN0RWxlbWVudDp0cnVlLEhU
-TUxVbmtub3duRWxlbWVudDp0cnVlLEhUTUxWaWRlb0VsZW1lbnQ6dHJ1ZSxIVE1MRGlyZWN0b3J5RWxl
-bWVudDp0cnVlLEhUTUxGb250RWxlbWVudDp0cnVlLEhUTUxGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MRnJh
-bWVTZXRFbGVtZW50OnRydWUsSFRNTE1hcnF1ZWVFbGVtZW50OnRydWUsSFRNTEVsZW1lbnQ6ZmFsc2Us
-SFRNTEFuY2hvckVsZW1lbnQ6dHJ1ZSxIVE1MQXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MQmFzZUVsZW1lbnQ6
-dHJ1ZSxCbG9iOmZhbHNlLEhUTUxCb2R5RWxlbWVudDp0cnVlLENEQVRBU2VjdGlvbjp0cnVlLENoYXJh
-Y3RlckRhdGE6dHJ1ZSxDb21tZW50OnRydWUsUHJvY2Vzc2luZ0luc3RydWN0aW9uOnRydWUsVGV4dDp0
-cnVlLENTU1N0eWxlRGVjbGFyYXRpb246dHJ1ZSxNU1N0eWxlQ1NTUHJvcGVydGllczp0cnVlLENTUzJQ
-cm9wZXJ0aWVzOnRydWUsWE1MRG9jdW1lbnQ6dHJ1ZSxEb2N1bWVudDpmYWxzZSxET01FeGNlcHRpb246
-dHJ1ZSxET01JbXBsZW1lbnRhdGlvbjp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxp
-c3Q6dHJ1ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6
-dHJ1ZSxBbmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6
-dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1
-ZSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUs
-QmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZl
-bnQ6dHJ1ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2
-ZW50OnRydWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVu
-dGF0aW9uRXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5k
-YWJsZU1lc3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0
-cnVlLEZvcmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50
-OnRydWUsSW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVz
-c2FnZUV2ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1
-ZSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlv
-bkV2ZW50OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmlj
-YXRpb25FdmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50
-OnRydWUsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVz
-ZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9u
-Q2xvc2VFdmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJU
-Q0RhdGFDaGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNv
-bm5lY3Rpb25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xh
-dGlvbkV2ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6
-dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxT
-dG9yYWdlRXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2
-ZW50OnRydWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlz
-cGxheUV2ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50
-OnRydWUsVVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVk
-aW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJH
-TENvbnRleHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFsc2UsU3VibWl0RXZlbnQ6
-ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhpc3Rv
-cnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1ZXN0
-RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50OnRy
-dWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3VtZW50
-RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxzZSxO
-b2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVlLFBy
-b2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxlbWVu
-dDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRNTFRh
-YmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRpb25F
-dmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRydWUs
-VG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUsRGVk
-aWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxT
-aGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0cnVl
-LENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRBdHRy
-TWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1lbnQ6
-dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUsU1ZH
-QW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZHQ2ly
-Y2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRydWUs
-U1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVtZW50
-OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVlLFNW
-R0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRydWUs
-U1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6
-dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVsZW1l
-bnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZHRkVG
-dW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50OnRy
-dWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdG
-RU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhvbG9n
-eUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVtZW50
-OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxlbWVu
-dDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUsU1ZH
-RmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1lbnQ6
-dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJbWFn
-ZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDp0
-cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRhRWxl
-bWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5
-Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50RWxl
-bWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BFbGVt
-ZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRjaEVs
-ZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZHVGV4
-dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6
-dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUsU1ZH
-VXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRydWUs
-U1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dFbGVt
-ZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguTFouJG5hdGl2
-ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
-QXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
-CkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZlU3Vw
-ZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJh
-eUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9KSgp
-CmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rpb24o
-YSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5cGVv
-ZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0idW5kZWZpbmVkIil7YShkb2N1bWVudC5jdXJyZW50U2Ny
-aXB0KQpyZXR1cm59dmFyIHM9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9yKHZh
-ciBxPTA7cTxzLmxlbmd0aDsrK3Epc1txXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQs
-ZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcj0wO3I8cy5sZW5ndGg7KytyKXNbcl0uYWRkRXZlbnRM
-aXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlwdD1h
-CnZhciBzPUwuSXEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1
-bm5lcihzLFtdKQplbHNlIHMoW10pfSl9KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5q
-cy5tYXAK
+LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYy
+LC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0y
+LC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEs
+MjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUs
+MzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIsLTIsLTIs
+LTJdLHQudCkpKX0pCnMoJCwiWWUiLCJ3USIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHByb2Nlc3Mh
+PSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PSJbb2Jq
+ZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09IndpbjMyIn0pCnMoJCwibWYiLCJ6NCIsZnVu
+Y3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpfYS16fl0qJCIpfSkKcygkLCJPUSIsInZa
+IixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9KQpzKCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJu
+IFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUiLCJBU0lE
+RSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIs
+IkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdST1VQIiwi
+Q09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIsIkRJUiIs
+IkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIsIkZPTlQi
+LCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVSIiwiSEdS
+T1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxF
+R0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJPTCIsIk9Q
+VEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMiLCJTQU1Q
+IiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIsIlNUUk9O
+RyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJFQSIsIlRG
+T09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJW
+SURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5c
+XFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5jdGlvbigpe3JldHVybiBQLk5EKHNlbGYpfSkKcygkLCJr
+dCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkKcygkLCJm
+SyIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMubz1hfX0p
+CnMoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQubVEoKX0pCnMoJCwiT2wiLCJVRSIs
+ZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9sLmdtVyhXLngzKCkpLmhyZWYpLmdoWSgpLnEoMCwiYXV0
+aFRva2VuIil9KQpzKCQsImhUIiwieVAiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVj
+dG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9KQpzKCQsIlc2IiwiaEwiLGZ1bmN0aW9uKCl7
+cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIpfSkK
+cygkLCJUUiIsIkRXIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiZm9vdGVy
+Iil9KQpzKCQsIkVZIiwiZmkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJo
+ZWFkZXIiKX0pCnMoJCwiYkEiLCJjMCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0
+b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24iKX0pCnMoJCwidDAiLCJiTiIsZnVuY3Rpb24oKXty
+ZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24tbGFiZWwi
+KX0pCnMoJCwiYXYiLCJEOSIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiN1
+bml0LW5hbWUiKX0pCnIoJCwiZmUiLCJLRyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWEEoKX0pCnMo
+JCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0ubEkoSC5OMCgiZnYiKS5hKCQuSGsoKSkp
+fSkKcygkLCJ5ciIsImJEIixmdW5jdGlvbigpe3JldHVybiBuZXcgRS5PRihQLm51KCIvIiksUC5udSgi
+W14vXSQiKSxQLm51KCJeLyIpKX0pCnMoJCwiTWsiLCJLayIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwu
+SVYoUC5udSgiWy9cXFxcXSIpLFAubnUoIlteL1xcXFxdJCIpLFAubnUoIl4oXFxcXFxcXFxbXlxcXFxd
+K1xcXFxbXlxcXFwvXSt8W2EtekEtWl06Wy9cXFxcXSkiKSxQLm51KCJeWy9cXFxcXSg/IVsvXFxcXF0p
+IikpfSkKcygkLCJhayIsIkViIixmdW5jdGlvbigpe3JldHVybiBuZXcgRi5ydShQLm51KCIvIiksUC5u
+dSgiKF5bYS16QS1aXVstKy5hLXpBLVpcXGRdKjovL3xbXi9dKSQiKSxQLm51KCJbYS16QS1aXVstKy5h
+LXpBLVpcXGRdKjovL1teL10qIiksUC5udSgiXi8iKSl9KQpzKCQsImxzIiwiSGsiLGZ1bmN0aW9uKCl7
+cmV0dXJuIE8uUmgoKX0pfSkoKTsoZnVuY3Rpb24gbmF0aXZlU3VwcG9ydCgpeyFmdW5jdGlvbigpe3Zh
+ciBzPWZ1bmN0aW9uKGEpe3ZhciBtPXt9Cm1bYV09MQpyZXR1cm4gT2JqZWN0LmtleXMoaHVua0hlbHBl
+cnMuY29udmVydFRvRmFzdE9iamVjdChtKSlbMF19CnYuZ2V0SXNvbGF0ZVRhZz1mdW5jdGlvbihhKXty
+ZXR1cm4gcygiX19fZGFydF8iK2Erdi5pc29sYXRlVGFnKX0KdmFyIHI9Il9fX2RhcnRfaXNvbGF0ZV90
+YWdzXyIKdmFyIHE9T2JqZWN0W3JdfHwoT2JqZWN0W3JdPU9iamVjdC5jcmVhdGUobnVsbCkpCnZhciBw
+PSJfWnhZeFgiCmZvcih2YXIgbz0wOztvKyspe3ZhciBuPXMocCsiXyIrbysiXyIpCmlmKCEobiBpbiBx
+KSl7cVtuXT0xCnYuaXNvbGF0ZVRhZz1uCmJyZWFrfX12LmRpc3BhdGNoUHJvcGVydHlOYW1lPXYuZ2V0
+SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIil9KCkKaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRl
+cmNlcHRvcnNCeVRhZyh7RE9NRXJyb3I6Si5HdixNZWRpYUVycm9yOkouR3YsTmF2aWdhdG9yOkouR3Ys
+TmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOkouR3YsTmF2aWdhdG9yVXNlck1lZGlhRXJyb3I6Si5H
+dixPdmVyY29uc3RyYWluZWRFcnJvcjpKLkd2LFBvc2l0aW9uRXJyb3I6Si5HdixHZW9sb2NhdGlvblBv
+c2l0aW9uRXJyb3I6Si5HdixSYW5nZTpKLkd2LFNRTEVycm9yOkouR3YsRGF0YVZpZXc6SC5FVCxBcnJh
+eUJ1ZmZlclZpZXc6SC5FVCxGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0QXJyYXk6SC5EZyxJbnQxNkFy
+cmF5OkgueGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVpbnQxNkFycmF5OkguZFQsVWlu
+dDMyQXJyYXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZhc1BpeGVsQXJyYXk6SC5lRSxV
+aW50OEFycmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxCUkVsZW1lbnQ6Vy5xRSxIVE1M
+QnV0dG9uRWxlbWVudDpXLnFFLEhUTUxDYW52YXNFbGVtZW50OlcucUUsSFRNTENvbnRlbnRFbGVtZW50
+OlcucUUsSFRNTERMaXN0RWxlbWVudDpXLnFFLEhUTUxEYXRhRWxlbWVudDpXLnFFLEhUTUxEYXRhTGlz
+dEVsZW1lbnQ6Vy5xRSxIVE1MRGV0YWlsc0VsZW1lbnQ6Vy5xRSxIVE1MRGlhbG9nRWxlbWVudDpXLnFF
+LEhUTUxEaXZFbGVtZW50OlcucUUsSFRNTEVtYmVkRWxlbWVudDpXLnFFLEhUTUxGaWVsZFNldEVsZW1l
+bnQ6Vy5xRSxIVE1MSFJFbGVtZW50OlcucUUsSFRNTEhlYWRFbGVtZW50OlcucUUsSFRNTEhlYWRpbmdF
+bGVtZW50OlcucUUsSFRNTEh0bWxFbGVtZW50OlcucUUsSFRNTElGcmFtZUVsZW1lbnQ6Vy5xRSxIVE1M
+SW1hZ2VFbGVtZW50OlcucUUsSFRNTElucHV0RWxlbWVudDpXLnFFLEhUTUxMSUVsZW1lbnQ6Vy5xRSxI
+VE1MTGFiZWxFbGVtZW50OlcucUUsSFRNTExlZ2VuZEVsZW1lbnQ6Vy5xRSxIVE1MTGlua0VsZW1lbnQ6
+Vy5xRSxIVE1MTWFwRWxlbWVudDpXLnFFLEhUTUxNZWRpYUVsZW1lbnQ6Vy5xRSxIVE1MTWVudUVsZW1l
+bnQ6Vy5xRSxIVE1MTWV0YUVsZW1lbnQ6Vy5xRSxIVE1MTWV0ZXJFbGVtZW50OlcucUUsSFRNTE1vZEVs
+ZW1lbnQ6Vy5xRSxIVE1MT0xpc3RFbGVtZW50OlcucUUsSFRNTE9iamVjdEVsZW1lbnQ6Vy5xRSxIVE1M
+T3B0R3JvdXBFbGVtZW50OlcucUUsSFRNTE9wdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MT3V0cHV0RWxlbWVu
+dDpXLnFFLEhUTUxQYXJhbUVsZW1lbnQ6Vy5xRSxIVE1MUGljdHVyZUVsZW1lbnQ6Vy5xRSxIVE1MUHJl
+RWxlbWVudDpXLnFFLEhUTUxQcm9ncmVzc0VsZW1lbnQ6Vy5xRSxIVE1MUXVvdGVFbGVtZW50OlcucUUs
+SFRNTFNjcmlwdEVsZW1lbnQ6Vy5xRSxIVE1MU2hhZG93RWxlbWVudDpXLnFFLEhUTUxTbG90RWxlbWVu
+dDpXLnFFLEhUTUxTb3VyY2VFbGVtZW50OlcucUUsSFRNTFNwYW5FbGVtZW50OlcucUUsSFRNTFN0eWxl
+RWxlbWVudDpXLnFFLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OlcucUUsSFRNTFRhYmxlQ2VsbEVsZW1l
+bnQ6Vy5xRSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVIZWFkZXJDZWxsRWxl
+bWVudDpXLnFFLEhUTUxUYWJsZUNvbEVsZW1lbnQ6Vy5xRSxIVE1MVGV4dEFyZWFFbGVtZW50OlcucUUs
+SFRNTFRpbWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVudDpXLnFFLEhUTUxUcmFja0VsZW1lbnQ6
+Vy5xRSxIVE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25vd25FbGVtZW50OlcucUUsSFRNTFZpZGVv
+RWxlbWVudDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50OlcucUUsSFRNTEZvbnRFbGVtZW50OlcucUUs
+SFRNTEZyYW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVsZW1lbnQ6Vy5xRSxIVE1MTWFycXVlZUVs
+ZW1lbnQ6Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEhUTUxBbmNob3JFbGVtZW50OlcuR2gsSFRNTEFyZWFF
+bGVtZW50OlcuZlksSFRNTEJhc2VFbGVtZW50OlcuclosQmxvYjpXLkF6LEhUTUxCb2R5RWxlbWVudDpX
+LlFQLENEQVRBU2VjdGlvbjpXLm54LENoYXJhY3RlckRhdGE6Vy5ueCxDb21tZW50OlcubngsUHJvY2Vz
+c2luZ0luc3RydWN0aW9uOlcubngsVGV4dDpXLm54LENTU1N0eWxlRGVjbGFyYXRpb246Vy5vSixNU1N0
+eWxlQ1NTUHJvcGVydGllczpXLm9KLENTUzJQcm9wZXJ0aWVzOlcub0osWE1MRG9jdW1lbnQ6Vy5RRixE
+b2N1bWVudDpXLlFGLERPTUV4Y2VwdGlvbjpXLk5oLERPTUltcGxlbWVudGF0aW9uOlcuYWUsRE9NUmVj
+dFJlYWRPbmx5OlcuSUIsRE9NVG9rZW5MaXN0OlcubjcsRWxlbWVudDpXLmN2LEFib3J0UGF5bWVudEV2
+ZW50OlcuZWEsQW5pbWF0aW9uRXZlbnQ6Vy5lYSxBbmltYXRpb25QbGF5YmFja0V2ZW50OlcuZWEsQXBw
+bGljYXRpb25DYWNoZUVycm9yRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OlcuZWEs
+QmFja2dyb3VuZEZldGNoRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6Vy5lYSxCYWNr
+Z3JvdW5kRmV0Y2hlZEV2ZW50OlcuZWEsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OlcuZWEsQmVmb3Jl
+VW5sb2FkRXZlbnQ6Vy5lYSxCbG9iRXZlbnQ6Vy5lYSxDYW5NYWtlUGF5bWVudEV2ZW50OlcuZWEsQ2xp
+cGJvYXJkRXZlbnQ6Vy5lYSxDbG9zZUV2ZW50OlcuZWEsQ3VzdG9tRXZlbnQ6Vy5lYSxEZXZpY2VNb3Rp
+b25FdmVudDpXLmVhLERldmljZU9yaWVudGF0aW9uRXZlbnQ6Vy5lYSxFcnJvckV2ZW50OlcuZWEsRXh0
+ZW5kYWJsZUV2ZW50OlcuZWEsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDpXLmVhLEZldGNoRXZlbnQ6Vy5l
+YSxGb250RmFjZVNldExvYWRFdmVudDpXLmVhLEZvcmVpZ25GZXRjaEV2ZW50OlcuZWEsR2FtZXBhZEV2
+ZW50OlcuZWEsSGFzaENoYW5nZUV2ZW50OlcuZWEsSW5zdGFsbEV2ZW50OlcuZWEsTWVkaWFFbmNyeXB0
+ZWRFdmVudDpXLmVhLE1lZGlhS2V5TWVzc2FnZUV2ZW50OlcuZWEsTWVkaWFRdWVyeUxpc3RFdmVudDpX
+LmVhLE1lZGlhU3RyZWFtRXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6Vy5lYSxNZXNzYWdl
+RXZlbnQ6Vy5lYSxNSURJQ29ubmVjdGlvbkV2ZW50OlcuZWEsTUlESU1lc3NhZ2VFdmVudDpXLmVhLE11
+dGF0aW9uRXZlbnQ6Vy5lYSxOb3RpZmljYXRpb25FdmVudDpXLmVhLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6
+Vy5lYSxQYXltZW50UmVxdWVzdEV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDpXLmVh
+LFBvcFN0YXRlRXZlbnQ6Vy5lYSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6Vy5l
+YSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDpXLmVhLFByb21pc2VSZWplY3Rpb25FdmVu
+dDpXLmVhLFB1c2hFdmVudDpXLmVhLFJUQ0RhdGFDaGFubmVsRXZlbnQ6Vy5lYSxSVENEVE1GVG9uZUNo
+YW5nZUV2ZW50OlcuZWEsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDpXLmVhLFJUQ1RyYWNrRXZlbnQ6
+Vy5lYSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OlcuZWEsU2Vuc29yRXJyb3JFdmVudDpXLmVh
+LFNwZWVjaFJlY29nbml0aW9uRXJyb3I6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OlcuZWEsU3Bl
+ZWNoU3ludGhlc2lzRXZlbnQ6Vy5lYSxTdG9yYWdlRXZlbnQ6Vy5lYSxTeW5jRXZlbnQ6Vy5lYSxUcmFj
+a0V2ZW50OlcuZWEsVHJhbnNpdGlvbkV2ZW50OlcuZWEsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OlcuZWEs
+VlJEZXZpY2VFdmVudDpXLmVhLFZSRGlzcGxheUV2ZW50OlcuZWEsVlJTZXNzaW9uRXZlbnQ6Vy5lYSxN
+b2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OlcuZWEsVVNCQ29ubmVjdGlvbkV2ZW50OlcuZWEsSURCVmVy
+c2lvbkNoYW5nZUV2ZW50OlcuZWEsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6Vy5lYSxPZmZsaW5lQXVkaW9D
+b21wbGV0aW9uRXZlbnQ6Vy5lYSxXZWJHTENvbnRleHRFdmVudDpXLmVhLEV2ZW50OlcuZWEsSW5wdXRF
+dmVudDpXLmVhLFN1Ym1pdEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuaEgsSFRNTEZv
+cm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0
+OlcuZkosWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9u
+OlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdoZWVs
+RXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcuS1YsU2hhZG93Um9vdDpXLktWLERvY3VtZW50VHlw
+ZTpXLktWLE5vZGU6Vy5LVixOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdy
+YXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5l
+dyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dF
+bGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5XUCxIVE1MVGVtcGxhdGVFbGVtZW50
+OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50Olcu
+dzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxE
+T01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJH
+bG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2Nv
+cGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6
+Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6
+UC5uZCxTVkdBRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVFbGVtZW50OlAuaGksU1ZHQW5pbWF0ZU1vdGlv
+bkVsZW1lbnQ6UC5oaSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmhpLFNWR0FuaW1hdGlvbkVs
+ZW1lbnQ6UC5oaSxTVkdDaXJjbGVFbGVtZW50OlAuaGksU1ZHQ2xpcFBhdGhFbGVtZW50OlAuaGksU1ZH
+RGVmc0VsZW1lbnQ6UC5oaSxTVkdEZXNjRWxlbWVudDpQLmhpLFNWR0Rpc2NhcmRFbGVtZW50OlAuaGks
+U1ZHRWxsaXBzZUVsZW1lbnQ6UC5oaSxTVkdGRUJsZW5kRWxlbWVudDpQLmhpLFNWR0ZFQ29sb3JNYXRy
+aXhFbGVtZW50OlAuaGksU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5oaSxTVkdGRUNvbXBv
+c2l0ZUVsZW1lbnQ6UC5oaSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZFRGlmZnVz
+ZUxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmhpLFNWR0ZF
+RGlzdGFudExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFRmxvb2RFbGVtZW50OlAuaGksU1ZHRkVGdW5jQUVs
+ZW1lbnQ6UC5oaSxTVkdGRUZ1bmNCRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0dFbGVtZW50OlAuaGksU1ZH
+RkVGdW5jUkVsZW1lbnQ6UC5oaSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5oaSxTVkdGRUltYWdl
+RWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAu
+aGksU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmhpLFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmhpLFNWR0ZF
+UG9pbnRMaWdodEVsZW1lbnQ6UC5oaSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuaGksU1ZH
+RkVTcG90TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVUaWxlRWxlbWVudDpQLmhpLFNWR0ZFVHVyYnVsZW5j
+ZUVsZW1lbnQ6UC5oaSxTVkdGaWx0ZXJFbGVtZW50OlAuaGksU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6
+UC5oaSxTVkdHRWxlbWVudDpQLmhpLFNWR0dlb21ldHJ5RWxlbWVudDpQLmhpLFNWR0dyYXBoaWNzRWxl
+bWVudDpQLmhpLFNWR0ltYWdlRWxlbWVudDpQLmhpLFNWR0xpbmVFbGVtZW50OlAuaGksU1ZHTGluZWFy
+R3JhZGllbnRFbGVtZW50OlAuaGksU1ZHTWFya2VyRWxlbWVudDpQLmhpLFNWR01hc2tFbGVtZW50OlAu
+aGksU1ZHTWV0YWRhdGFFbGVtZW50OlAuaGksU1ZHUGF0aEVsZW1lbnQ6UC5oaSxTVkdQYXR0ZXJuRWxl
+bWVudDpQLmhpLFNWR1BvbHlnb25FbGVtZW50OlAuaGksU1ZHUG9seWxpbmVFbGVtZW50OlAuaGksU1ZH
+UmFkaWFsR3JhZGllbnRFbGVtZW50OlAuaGksU1ZHUmVjdEVsZW1lbnQ6UC5oaSxTVkdTZXRFbGVtZW50
+OlAuaGksU1ZHU3RvcEVsZW1lbnQ6UC5oaSxTVkdTdHlsZUVsZW1lbnQ6UC5oaSxTVkdTVkdFbGVtZW50
+OlAuaGksU1ZHU3dpdGNoRWxlbWVudDpQLmhpLFNWR1N5bWJvbEVsZW1lbnQ6UC5oaSxTVkdUU3BhbkVs
+ZW1lbnQ6UC5oaSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5oaSxTVkdUZXh0RWxlbWVudDpQLmhpLFNW
+R1RleHRQYXRoRWxlbWVudDpQLmhpLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5oaSxTVkdUaXRs
+ZUVsZW1lbnQ6UC5oaSxTVkdVc2VFbGVtZW50OlAuaGksU1ZHVmlld0VsZW1lbnQ6UC5oaSxTVkdHcmFk
+aWVudEVsZW1lbnQ6UC5oaSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmhpLFNW
+R0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5oaSxTVkdNUGF0aEVsZW1lbnQ6UC5oaSxTVkdFbGVtZW50OlAu
+aGl9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLE1lZGlhRXJy
+b3I6dHJ1ZSxOYXZpZ2F0b3I6dHJ1ZSxOYXZpZ2F0b3JDb25jdXJyZW50SGFyZHdhcmU6dHJ1ZSxOYXZp
+Z2F0b3JVc2VyTWVkaWFFcnJvcjp0cnVlLE92ZXJjb25zdHJhaW5lZEVycm9yOnRydWUsUG9zaXRpb25F
+cnJvcjp0cnVlLEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcjp0cnVlLFJhbmdlOnRydWUsU1FMRXJyb3I6
+dHJ1ZSxEYXRhVmlldzp0cnVlLEFycmF5QnVmZmVyVmlldzpmYWxzZSxGbG9hdDMyQXJyYXk6dHJ1ZSxG
+bG9hdDY0QXJyYXk6dHJ1ZSxJbnQxNkFycmF5OnRydWUsSW50MzJBcnJheTp0cnVlLEludDhBcnJheTp0
+cnVlLFVpbnQxNkFycmF5OnRydWUsVWludDMyQXJyYXk6dHJ1ZSxVaW50OENsYW1wZWRBcnJheTp0cnVl
+LENhbnZhc1BpeGVsQXJyYXk6dHJ1ZSxVaW50OEFycmF5OmZhbHNlLEhUTUxBdWRpb0VsZW1lbnQ6dHJ1
+ZSxIVE1MQlJFbGVtZW50OnRydWUsSFRNTEJ1dHRvbkVsZW1lbnQ6dHJ1ZSxIVE1MQ2FudmFzRWxlbWVu
+dDp0cnVlLEhUTUxDb250ZW50RWxlbWVudDp0cnVlLEhUTUxETGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGF0
+YUVsZW1lbnQ6dHJ1ZSxIVE1MRGF0YUxpc3RFbGVtZW50OnRydWUsSFRNTERldGFpbHNFbGVtZW50OnRy
+dWUsSFRNTERpYWxvZ0VsZW1lbnQ6dHJ1ZSxIVE1MRGl2RWxlbWVudDp0cnVlLEhUTUxFbWJlZEVsZW1l
+bnQ6dHJ1ZSxIVE1MRmllbGRTZXRFbGVtZW50OnRydWUsSFRNTEhSRWxlbWVudDp0cnVlLEhUTUxIZWFk
+RWxlbWVudDp0cnVlLEhUTUxIZWFkaW5nRWxlbWVudDp0cnVlLEhUTUxIdG1sRWxlbWVudDp0cnVlLEhU
+TUxJRnJhbWVFbGVtZW50OnRydWUsSFRNTEltYWdlRWxlbWVudDp0cnVlLEhUTUxJbnB1dEVsZW1lbnQ6
+dHJ1ZSxIVE1MTElFbGVtZW50OnRydWUsSFRNTExhYmVsRWxlbWVudDp0cnVlLEhUTUxMZWdlbmRFbGVt
+ZW50OnRydWUsSFRNTExpbmtFbGVtZW50OnRydWUsSFRNTE1hcEVsZW1lbnQ6dHJ1ZSxIVE1MTWVkaWFF
+bGVtZW50OnRydWUsSFRNTE1lbnVFbGVtZW50OnRydWUsSFRNTE1ldGFFbGVtZW50OnRydWUsSFRNTE1l
+dGVyRWxlbWVudDp0cnVlLEhUTUxNb2RFbGVtZW50OnRydWUsSFRNTE9MaXN0RWxlbWVudDp0cnVlLEhU
+TUxPYmplY3RFbGVtZW50OnRydWUsSFRNTE9wdEdyb3VwRWxlbWVudDp0cnVlLEhUTUxPcHRpb25FbGVt
+ZW50OnRydWUsSFRNTE91dHB1dEVsZW1lbnQ6dHJ1ZSxIVE1MUGFyYW1FbGVtZW50OnRydWUsSFRNTFBp
+Y3R1cmVFbGVtZW50OnRydWUsSFRNTFByZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJvZ3Jlc3NFbGVtZW50OnRy
+dWUsSFRNTFF1b3RlRWxlbWVudDp0cnVlLEhUTUxTY3JpcHRFbGVtZW50OnRydWUsSFRNTFNoYWRvd0Vs
+ZW1lbnQ6dHJ1ZSxIVE1MU2xvdEVsZW1lbnQ6dHJ1ZSxIVE1MU291cmNlRWxlbWVudDp0cnVlLEhUTUxT
+cGFuRWxlbWVudDp0cnVlLEhUTUxTdHlsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDYXB0aW9uRWxlbWVu
+dDp0cnVlLEhUTUxUYWJsZUNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50OnRy
+dWUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDb2xFbGVtZW50OnRydWUs
+SFRNTFRleHRBcmVhRWxlbWVudDp0cnVlLEhUTUxUaW1lRWxlbWVudDp0cnVlLEhUTUxUaXRsZUVsZW1l
+bnQ6dHJ1ZSxIVE1MVHJhY2tFbGVtZW50OnRydWUsSFRNTFVMaXN0RWxlbWVudDp0cnVlLEhUTUxVbmtu
+b3duRWxlbWVudDp0cnVlLEhUTUxWaWRlb0VsZW1lbnQ6dHJ1ZSxIVE1MRGlyZWN0b3J5RWxlbWVudDp0
+cnVlLEhUTUxGb250RWxlbWVudDp0cnVlLEhUTUxGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVTZXRF
+bGVtZW50OnRydWUsSFRNTE1hcnF1ZWVFbGVtZW50OnRydWUsSFRNTEVsZW1lbnQ6ZmFsc2UsSFRNTEFu
+Y2hvckVsZW1lbnQ6dHJ1ZSxIVE1MQXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MQmFzZUVsZW1lbnQ6dHJ1ZSxC
+bG9iOmZhbHNlLEhUTUxCb2R5RWxlbWVudDp0cnVlLENEQVRBU2VjdGlvbjp0cnVlLENoYXJhY3RlckRh
+dGE6dHJ1ZSxDb21tZW50OnRydWUsUHJvY2Vzc2luZ0luc3RydWN0aW9uOnRydWUsVGV4dDp0cnVlLENT
+U1N0eWxlRGVjbGFyYXRpb246dHJ1ZSxNU1N0eWxlQ1NTUHJvcGVydGllczp0cnVlLENTUzJQcm9wZXJ0
+aWVzOnRydWUsWE1MRG9jdW1lbnQ6dHJ1ZSxEb2N1bWVudDpmYWxzZSxET01FeGNlcHRpb246dHJ1ZSxE
+T01JbXBsZW1lbnRhdGlvbjp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1
+ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxB
+bmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxC
+YWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNr
+Z3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3Jl
+SW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1
+ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRy
+dWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVudGF0aW9u
+RXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1l
+c3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0cnVlLEZv
+cmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUs
+SW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2
+ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRp
+YVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50
+OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25F
+dmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUs
+UGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRp
+b25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VF
+dmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFD
+aGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rp
+b25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2
+ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxT
+cGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdl
+RXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRy
+dWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2
+ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUs
+VVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9j
+ZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRl
+eHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFsc2UsU3VibWl0RXZlbnQ6ZmFsc2Us
+RXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhpc3Rvcnk6dHJ1
+ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1ZXN0RXZlbnRU
+YXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJh
+Z0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3VtZW50RnJhZ21l
+bnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxzZSxOb2RlTGlz
+dDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVlLFByb2dyZXNz
+RXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxlbWVudDp0cnVl
+LEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRNTFRhYmxlU2Vj
+dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRpb25FdmVudDp0
+cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRydWUsVG91Y2hF
+dmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUsRGVkaWNhdGVk
+V29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTaGFyZWRX
+b3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0cnVlLENsaWVu
+dFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRBdHRyTWFwOnRy
+dWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1ZSxT
+VkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUsU1ZHQW5pbWF0
+ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZHQ2lyY2xlRWxl
+bWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRydWUsU1ZHRGVz
+Y0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVtZW50OnRydWUs
+U1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVlLFNWR0ZFQ29t
+cG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRydWUsU1ZHRkVD
+b252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxT
+VkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6dHJ1
+ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZHRkVGdW5jQkVs
+ZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50OnRydWUsU1ZH
+RkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdl
+RWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhvbG9neUVsZW1l
+bnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVtZW50OnRydWUs
+U1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxlbWVudDp0cnVl
+LFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUsU1ZHRmlsdGVy
+RWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1ZSxT
+VkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVsZW1l
+bnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDp0cnVlLFNW
+R01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRhRWxlbWVudDp0
+cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29uRWxl
+bWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50RWxlbWVudDp0
+cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BFbGVtZW50OnRy
+dWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRjaEVsZW1lbnQ6
+dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZHVGV4dENvbnRl
+bnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6dHJ1ZSxT
+VkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUsU1ZHVXNlRWxl
+bWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHQ29t
+cG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dFbGVtZW50OnRy
+dWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguTFouJG5hdGl2ZVN1cGVy
+Y2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlC
+dWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguRGcu
+JG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZlU3VwZXJjbGFz
+c1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZl
+clZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9KSgpCmNvbnZl
+cnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rpb24oYSl7aWYo
+dHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5cGVvZiBkb2N1
+bWVudC5jdXJyZW50U2NyaXB0IT0idW5kZWZpbmVkIil7YShkb2N1bWVudC5jdXJyZW50U2NyaXB0KQpy
+ZXR1cm59dmFyIHM9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9yKHZhciBxPTA7
+cTxzLmxlbmd0aDsrK3Epc1txXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2Up
+CmEoYi50YXJnZXQpfWZvcih2YXIgcj0wO3I8cy5sZW5ndGg7KytyKXNbcl0uYWRkRXZlbnRMaXN0ZW5l
+cigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlwdD1hCnZhciBz
+PUwuSXEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihz
+LFtdKQplbHNlIHMoW10pfSl9KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
 ''';
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
index 05b4c7d..9be3101 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
@@ -939,8 +939,7 @@
     } else if (entity is NavigationTreeFileNode) {
       if (enablePartialMigration) {
         var statusIcon = createIcon()..classes.add('status-icon');
-        if (entity is NavigationTreeFileNode &&
-            !entity.migrationStatusCanBeChanged!) {
+        if (!entity.migrationStatusCanBeChanged!) {
           statusIcon.classes.add('disabled');
         }
         updateIconsForNode(statusIcon, entity);
diff --git a/pkg/nnbd_migration/lib/src/potential_modification.dart b/pkg/nnbd_migration/lib/src/potential_modification.dart
index 50ee51a..3becf56 100644
--- a/pkg/nnbd_migration/lib/src/potential_modification.dart
+++ b/pkg/nnbd_migration/lib/src/potential_modification.dart
@@ -27,7 +27,7 @@
       return ConditionalModification._(
           node.offset,
           node.end,
-          node is Statement,
+          true,
           discard,
           _KeepNode(node.condition),
           _KeepNode(node.thenStatement),
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 5715f1b..de63cee 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -1595,7 +1595,7 @@
         return _handleIndexingIntoListConstant(constant);
       }
     }
-    assert(target is Procedure && !target.isGetter);
+    assert(!target.isGetter);
     // TODO(alexmarkov): overloaded arithmetic operators
     final result = _makeCall(
         node,
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 5b175e4..700a506 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -1423,8 +1423,7 @@
         "0",
       ], callback: (RemoteVm remoteVm) async {
         for (int q = 0; q < 10; q++) {
-          var reloadResult = await remoteVm.reload(partial1Dill.uri);
-          expect(reloadResult is Map, isTrue);
+          Map reloadResult = await remoteVm.reload(partial1Dill.uri);
           expect(reloadResult["success"], equals(true));
 
           await remoteVm.forceGc();
@@ -1457,7 +1456,6 @@
           await deletePossibleBreakpoint(remoteVm, breakpoint);
 
           reloadResult = await remoteVm.reload(partial2Dill.uri);
-          expect(reloadResult is Map, isTrue);
           expect(reloadResult["success"], equals(true));
 
           await remoteVm.forceGc();
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 9f60f2a..61bef4b 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -931,6 +931,16 @@
   return cobject;
 }
 
+Dart_CObject* CObject::NewNativePointer(intptr_t ptr,
+                                        intptr_t size,
+                                        Dart_HandleFinalizer callback) {
+  Dart_CObject* cobject = New(Dart_CObject_kNativePointer);
+  cobject->value.as_native_pointer.ptr = ptr;
+  cobject->value.as_native_pointer.size = size;
+  cobject->value.as_native_pointer.callback = callback;
+  return cobject;
+}
+
 Dart_CObject* CObject::NewIOBuffer(int64_t length) {
   // Make sure that we do not have an integer overflow here. Actual check
   // against max elements will be done at the time of writing, as the constant
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 7ff1580..4eadf084 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -351,6 +351,9 @@
                                              uint8_t* data,
                                              void* peer,
                                              Dart_HandleFinalizer callback);
+  static Dart_CObject* NewNativePointer(intptr_t ptr,
+                                        intptr_t size,
+                                        Dart_HandleFinalizer callback);
 
   static Dart_CObject* NewIOBuffer(int64_t length);
   static void ShrinkIOBuffer(Dart_CObject* cobject, int64_t new_length);
@@ -579,6 +582,20 @@
   DISALLOW_COPY_AND_ASSIGN(CObjectExternalUint8Array);
 };
 
+class CObjectNativePointer : public CObject {
+ public:
+  DECLARE_COBJECT_CONSTRUCTORS(NativePointer)
+
+  intptr_t Ptr() const { return cobject_->value.as_native_pointer.ptr; }
+  intptr_t Size() const { return cobject_->value.as_native_pointer.size; }
+  Dart_HandleFinalizer Callback() const {
+    return cobject_->value.as_native_pointer.callback;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CObjectNativePointer);
+};
+
 class ScopedBlockingCall {
  public:
   ScopedBlockingCall() { Dart_ThreadDisableProfiling(); }
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index a5710f1..b6c27fa 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -221,6 +221,7 @@
       *exit_code = kDartFrontendErrorExitCode;
       break;
     case Dart_KernelCompilationStatus_Unknown:
+    case Dart_KernelCompilationStatus_MsgFailed:
       free(result.kernel);
       *error = result.error;  // Copy error message.
       *exit_code = kErrorExitCode;
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 8e377a1..fad12cf 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -923,8 +923,8 @@
   if (file == NULL) {
     return CObject::NewOSError();
   }
-  return new CObjectIntptr(
-      CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
+  return new CObjectNativePointer(CObject::NewNativePointer(
+      reinterpret_cast<intptr_t>(file), sizeof(*file), ReleaseFile));
 }
 
 CObject* File::DeleteRequest(const CObjectArray& request) {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index a328eb7..a753a56 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3538,6 +3538,7 @@
   Dart_KernelCompilationStatus_Ok = 0,
   Dart_KernelCompilationStatus_Error = 1,
   Dart_KernelCompilationStatus_Crash = 2,
+  Dart_KernelCompilationStatus_MsgFailed = 3,
 } Dart_KernelCompilationStatus;
 
 typedef struct {
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index ac183b8..f99fff1 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -45,6 +45,7 @@
   Dart_CObject_kExternalTypedData,
   Dart_CObject_kSendPort,
   Dart_CObject_kCapability,
+  Dart_CObject_kNativePointer,
   Dart_CObject_kUnsupported,
   Dart_CObject_kNumberOfTypes
 } Dart_CObject_Type;
@@ -80,6 +81,11 @@
       void* peer;
       Dart_HandleFinalizer callback;
     } as_external_typed_data;
+    struct {
+      intptr_t ptr;
+      intptr_t size;
+      Dart_HandleFinalizer callback;
+    } as_native_pointer;
   } value;
 } Dart_CObject;
 // This struct is versioned by DART_API_DL_MAJOR_VERSION, bump the version when
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 5ca709a..e7f7cbc 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -203,6 +203,10 @@
   // Illegal class id.
   kIllegalCid = 0,
 
+  // Pseudo class id for native pointers, the heap should never see an
+  // object with this class id.
+  kNativePointer,
+
   // The following entries describes classes for pseudo-objects in the heap
   // that should never be reachable from live objects. Free list elements
   // maintain the free list for old space, and forwarding corpses are used to
@@ -281,10 +285,11 @@
 // and should not be exposed directly to user code.
 inline bool IsInternalOnlyClassId(intptr_t index) {
   // Fix the condition below if these become non-contiguous.
-  COMPILE_ASSERT(kIllegalCid + 1 == kFreeListElement &&
-                 kIllegalCid + 2 == kForwardingCorpse &&
-                 kIllegalCid + 3 == kObjectCid &&
-                 kIllegalCid + 4 == kFirstInternalOnlyCid);
+  COMPILE_ASSERT(kIllegalCid + 1 == kNativePointer &&
+                 kIllegalCid + 2 == kFreeListElement &&
+                 kIllegalCid + 3 == kForwardingCorpse &&
+                 kIllegalCid + 4 == kObjectCid &&
+                 kIllegalCid + 5 == kFirstInternalOnlyCid);
   return index <= kLastInternalOnlyCid;
 }
 
diff --git a/runtime/vm/compiler/asm_intrinsifier.h b/runtime/vm/compiler/asm_intrinsifier.h
index 9d3f04b..d4e45e7 100644
--- a/runtime/vm/compiler/asm_intrinsifier.h
+++ b/runtime/vm/compiler/asm_intrinsifier.h
@@ -28,9 +28,6 @@
 class Label;
 
 class AsmIntrinsifier : public AllStatic {
- public:
-  static intptr_t ParameterSlotFromSp();
-
  private:
   friend class Intrinsifier;
 
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm.cc b/runtime/vm/compiler/asm_intrinsifier_arm.cc
index 454fb02..9c82199 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm.cc
@@ -24,10 +24,6 @@
 
 #define __ assembler->
 
-intptr_t AsmIntrinsifier::ParameterSlotFromSp() {
-  return -1;
-}
-
 // Allocate a GrowableObjectArray:: using the backing array specified.
 // On stack: type argument (+1), data (+0).
 void AsmIntrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -1067,28 +1063,6 @@
   __ Bind(normal_ir_body);
 }
 
-void AsmIntrinsifier::MathSqrt(Assembler* assembler, Label* normal_ir_body) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    Label is_smi, double_op;
-    TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
-    // Argument is double and is in R0.
-    __ LoadDFromOffset(D1, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Bind(&double_op);
-    __ vsqrtd(D0, D1);
-    const Class& double_class = DoubleClass();
-    __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
-                   R1);  // Result register.
-    __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Ret();
-    __ Bind(&is_smi);
-    __ SmiUntag(R0);
-    __ vmovsr(S0, R0);
-    __ vcvtdi(D1, S0);
-    __ b(&double_op);
-    __ Bind(normal_ir_body);
-  }
-}
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index 03d3818..d4bd868 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -24,10 +24,6 @@
 
 #define __ assembler->
 
-intptr_t AsmIntrinsifier::ParameterSlotFromSp() {
-  return -1;
-}
-
 // Allocate a GrowableObjectArray:: using the backing array specified.
 // On stack: type argument (+1), data (+0).
 void AsmIntrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -1216,24 +1212,6 @@
   __ Bind(normal_ir_body);
 }
 
-void AsmIntrinsifier::MathSqrt(Assembler* assembler, Label* normal_ir_body) {
-  Label is_smi, double_op;
-  TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
-  // Argument is double and is in R0.
-  __ LoadDFieldFromOffset(V1, R0, target::Double::value_offset());
-  __ Bind(&double_op);
-  __ fsqrtd(V0, V1);
-  const Class& double_class = DoubleClass();
-  __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0, R1);
-  __ StoreDFieldToOffset(V0, R0, target::Double::value_offset());
-  __ ret();
-  __ Bind(&is_smi);
-  __ SmiUntag(R0);
-  __ scvtfdx(V1, R0);
-  __ b(&double_op);
-  __ Bind(normal_ir_body);
-}
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/compiler/asm_intrinsifier_ia32.cc b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
index 9c52f2a..46dc44b 100644
--- a/runtime/vm/compiler/asm_intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
@@ -31,10 +31,6 @@
 
 #define __ assembler->
 
-intptr_t AsmIntrinsifier::ParameterSlotFromSp() {
-  return 0;
-}
-
 // Allocate a GrowableObjectArray:: using the backing array specified.
 // On stack: type argument (+2), data (+1), return-address (+0).
 void AsmIntrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -1165,27 +1161,6 @@
   __ Bind(normal_ir_body);
 }
 
-// Argument type is not known
-void AsmIntrinsifier::MathSqrt(Assembler* assembler, Label* normal_ir_body) {
-  Label is_smi, double_op;
-  TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
-  // Argument is double and is in EAX.
-  __ movsd(XMM1, FieldAddress(EAX, target::Double::value_offset()));
-  __ Bind(&double_op);
-  __ sqrtsd(XMM0, XMM1);
-  const Class& double_class = DoubleClass();
-  __ TryAllocate(double_class, normal_ir_body, Assembler::kNearJump,
-                 EAX,  // Result register.
-                 EBX);
-  __ movsd(FieldAddress(EAX, target::Double::value_offset()), XMM0);
-  __ ret();
-  __ Bind(&is_smi);
-  __ SmiUntag(EAX);
-  __ cvtsi2sd(XMM1, EAX);
-  __ jmp(&double_op);
-  __ Bind(normal_ir_body);
-}
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index 131a261..f3ab614 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -24,10 +24,6 @@
 
 #define __ assembler->
 
-intptr_t AsmIntrinsifier::ParameterSlotFromSp() {
-  return 0;
-}
-
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+2), data (+1), return-address (+0).
 void AsmIntrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -1064,26 +1060,6 @@
   __ Bind(normal_ir_body);
 }
 
-void AsmIntrinsifier::MathSqrt(Assembler* assembler, Label* normal_ir_body) {
-  Label is_smi, double_op;
-  TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
-  // Argument is double and is in RAX.
-  __ movsd(XMM1, FieldAddress(RAX, target::Double::value_offset()));
-  __ Bind(&double_op);
-  __ sqrtsd(XMM0, XMM1);
-  const Class& double_class = DoubleClass();
-  __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump,
-                 RAX,  // Result register.
-                 R13);
-  __ movsd(FieldAddress(RAX, target::Double::value_offset()), XMM0);
-  __ ret();
-  __ Bind(&is_smi);
-  __ SmiUntag(RAX);
-  __ OBJ(cvtsi2sd)(XMM1, RAX);
-  __ jmp(&double_op);
-  __ Bind(normal_ir_body);
-}
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index d8b607c..bb7d20d 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -7333,6 +7333,11 @@
     return kUnboxedDouble;
   }
 
+  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kNotSpeculative;
+  }
+
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 1b2d1d4..112430d 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -3524,54 +3524,6 @@
   return true;
 }
 
-static bool InlineMathCFunction(FlowGraph* flow_graph,
-                                Instruction* call,
-                                MethodRecognizer::Kind kind,
-                                GraphEntryInstr* graph_entry,
-                                FunctionEntryInstr** entry,
-                                Instruction** last,
-                                Definition** result) {
-  if (!CanUnboxDouble()) {
-    return false;
-  }
-
-  for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    if (call->ArgumentAt(i)->Type()->ToCid() != kDoubleCid) {
-      return false;
-    }
-  }
-
-  *entry =
-      new (Z) FunctionEntryInstr(graph_entry, flow_graph->allocate_block_id(),
-                                 call->GetBlock()->try_index(), DeoptId::kNone);
-  (*entry)->InheritDeoptTarget(Z, call);
-  Instruction* cursor = *entry;
-
-  switch (kind) {
-    case MethodRecognizer::kMathSqrt: {
-      *last = new (Z)
-          MathUnaryInstr(MathUnaryInstr::kSqrt,
-                         new (Z) Value(call->ArgumentAt(0)), call->deopt_id());
-      break;
-    }
-    default: {
-      ZoneGrowableArray<Value*>* args =
-          new (Z) ZoneGrowableArray<Value*>(call->ArgumentCount());
-      for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-        args->Add(new (Z) Value(call->ArgumentAt(i)));
-      }
-      *last = new (Z) InvokeMathCFunctionInstr(args, call->deopt_id(), kind,
-                                               call->source());
-      break;
-    }
-  }
-  flow_graph->AppendTo(cursor, *last,
-                       call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
-                       FlowGraph::kValue);
-  *result = (*last)->AsDefinition();
-  return true;
-}
-
 static Instruction* InlineMul(FlowGraph* flow_graph,
                               Instruction* cursor,
                               Definition* x,
@@ -4021,20 +3973,6 @@
       return InlineSimdOp(flow_graph, is_dynamic_call, call, receiver, kind,
                           graph_entry, entry, last, result);
 
-    case MethodRecognizer::kMathSqrt:
-    case MethodRecognizer::kMathDoublePow:
-    case MethodRecognizer::kMathSin:
-    case MethodRecognizer::kMathCos:
-    case MethodRecognizer::kMathTan:
-    case MethodRecognizer::kMathAsin:
-    case MethodRecognizer::kMathAcos:
-    case MethodRecognizer::kMathAtan:
-    case MethodRecognizer::kMathAtan2:
-    case MethodRecognizer::kMathExp:
-    case MethodRecognizer::kMathLog:
-      return InlineMathCFunction(flow_graph, call, kind, graph_entry, entry,
-                                 last, result);
-
     case MethodRecognizer::kMathIntPow:
       return InlineMathIntPow(flow_graph, call, graph_entry, entry, last,
                               result);
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index c63846e..1005791 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -127,10 +127,6 @@
   "frontend/scope_builder.h",
   "graph_intrinsifier.cc",
   "graph_intrinsifier.h",
-  "graph_intrinsifier_arm.cc",
-  "graph_intrinsifier_arm64.cc",
-  "graph_intrinsifier_ia32.cc",
-  "graph_intrinsifier_x64.cc",
   "intrinsifier.cc",
   "intrinsifier.h",
   "jit/jit_call_specializer.cc",
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 4e16bfe..3ff0835 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -1213,5 +1213,12 @@
   return Fragment(instr);
 }
 
+Fragment BaseFlowGraphBuilder::MathUnary(MathUnaryInstr::MathUnaryKind kind) {
+  Value* value = Pop();
+  auto* instr = new (Z) MathUnaryInstr(kind, value, GetNextDeoptId());
+  Push(instr);
+  return Fragment(instr);
+}
+
 }  // namespace kernel
 }  // namespace dart
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index f3ef8e0..4978fa3 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -444,6 +444,9 @@
   // kDoubleFloor or kDoubleCeil).
   Fragment DoubleToDouble(MethodRecognizer::Kind recognized_kind);
 
+  // Pops double value and applies unary math operation.
+  Fragment MathUnary(MathUnaryInstr::MathUnaryKind kind);
+
   // Returns whether this function has a saved arguments descriptor array.
   bool has_saved_args_desc_array() {
     return function_.HasSavedArgumentsDescriptor();
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 2e2f061..1fa49f3 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -897,6 +897,17 @@
     case MethodRecognizer::kDoubleTruncate:
     case MethodRecognizer::kDoubleFloor:
     case MethodRecognizer::kDoubleCeil:
+    case MethodRecognizer::kMathDoublePow:
+    case MethodRecognizer::kMathSin:
+    case MethodRecognizer::kMathCos:
+    case MethodRecognizer::kMathTan:
+    case MethodRecognizer::kMathAsin:
+    case MethodRecognizer::kMathAcos:
+    case MethodRecognizer::kMathAtan:
+    case MethodRecognizer::kMathAtan2:
+    case MethodRecognizer::kMathExp:
+    case MethodRecognizer::kMathLog:
+    case MethodRecognizer::kMathSqrt:
       return FlowGraphCompiler::SupportsUnboxedDoubles();
     default:
       return false;
@@ -1517,7 +1528,17 @@
     case MethodRecognizer::kDoubleRound:
     case MethodRecognizer::kDoubleTruncate:
     case MethodRecognizer::kDoubleFloor:
-    case MethodRecognizer::kDoubleCeil: {
+    case MethodRecognizer::kDoubleCeil:
+    case MethodRecognizer::kMathDoublePow:
+    case MethodRecognizer::kMathSin:
+    case MethodRecognizer::kMathCos:
+    case MethodRecognizer::kMathTan:
+    case MethodRecognizer::kMathAsin:
+    case MethodRecognizer::kMathAcos:
+    case MethodRecognizer::kMathAtan:
+    case MethodRecognizer::kMathAtan2:
+    case MethodRecognizer::kMathExp:
+    case MethodRecognizer::kMathLog: {
       for (intptr_t i = 0, n = function.NumParameters(); i < n; ++i) {
         body += LoadLocal(parsed_function_->RawParameterVariable(i));
       }
@@ -1531,6 +1552,10 @@
         body += InvokeMathCFunction(kind, function.NumParameters());
       }
     } break;
+    case MethodRecognizer::kMathSqrt: {
+      body += LoadLocal(parsed_function_->RawParameterVariable(0));
+      body += MathUnary(MathUnaryInstr::kSqrt);
+    } break;
     default: {
       UNREACHABLE();
       break;
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index a97c2fb..85ed2b5 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -62,11 +62,6 @@
       if (instr->IsParallelMove()) {
         compiler->parallel_move_resolver()->EmitNativeCode(
             instr->AsParallelMove());
-      } else if (instr->IsInvokeMathCFunction()) {
-        ASSERT(instr->locs() != NULL);
-        GraphIntrinsifier::IntrinsicCallPrologue(compiler->assembler());
-        instr->EmitNativeCode(compiler);
-        GraphIntrinsifier::IntrinsicCallEpilogue(compiler->assembler());
       } else {
         ASSERT(instr->locs() != NULL);
         // Calls are not supported in intrinsics code.
@@ -1050,77 +1045,6 @@
   return true;
 }
 
-static bool BuildInvokeMathCFunction(FlowGraph* flow_graph,
-                                     MethodRecognizer::Kind kind,
-                                     intptr_t num_parameters = 1) {
-  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {
-    return false;
-  }
-
-  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
-  auto normal_entry = graph_entry->normal_entry();
-  BlockBuilder builder(flow_graph, normal_entry);
-
-  ZoneGrowableArray<Value*>* args =
-      new ZoneGrowableArray<Value*>(num_parameters);
-
-  for (intptr_t i = 0; i < num_parameters; i++) {
-    Definition* value = builder.AddParameter(i, /*with_frame=*/false);
-    Definition* unboxed_value = ConvertOrUnboxDoubleParameter(
-        &builder, value, i, /* is_checked = */ false);
-    if (unboxed_value == nullptr) {
-      return false;
-    }
-    args->Add(new Value(unboxed_value));
-  }
-
-  Definition* unboxed_result =
-      builder.AddDefinition(new InvokeMathCFunctionInstr(
-          args, DeoptId::kNone, kind, builder.Source()));
-  Definition* result =
-      CreateBoxedResultIfNeeded(&builder, unboxed_result, kUnboxedDouble);
-  builder.AddReturn(new Value(result));
-
-  return true;
-}
-
-bool GraphIntrinsifier::Build_MathSin(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathSin);
-}
-
-bool GraphIntrinsifier::Build_MathCos(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathCos);
-}
-
-bool GraphIntrinsifier::Build_MathTan(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathTan);
-}
-
-bool GraphIntrinsifier::Build_MathAsin(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathAsin);
-}
-
-bool GraphIntrinsifier::Build_MathAcos(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathAcos);
-}
-
-bool GraphIntrinsifier::Build_MathAtan(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathAtan);
-}
-
-bool GraphIntrinsifier::Build_MathAtan2(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathAtan2,
-                                  /* num_parameters = */ 2);
-}
-
-bool GraphIntrinsifier::Build_MathExp(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathExp);
-}
-
-bool GraphIntrinsifier::Build_MathLog(FlowGraph* flow_graph) {
-  return BuildInvokeMathCFunction(flow_graph, MethodRecognizer::kMathLog);
-}
-
 bool GraphIntrinsifier::Build_ImplicitGetter(FlowGraph* flow_graph) {
   // This code will only be invoked if our assumptions have been met (see
   // [Intrinsifier::CanIntrinsifyFieldAccessor])
diff --git a/runtime/vm/compiler/graph_intrinsifier.h b/runtime/vm/compiler/graph_intrinsifier.h
index 3104d2f..69d57d8 100644
--- a/runtime/vm/compiler/graph_intrinsifier.h
+++ b/runtime/vm/compiler/graph_intrinsifier.h
@@ -26,14 +26,9 @@
 
 class GraphIntrinsifier : public AllStatic {
  public:
-  static intptr_t ParameterSlotFromSp();
-
   static bool GraphIntrinsify(const ParsedFunction& parsed_function,
                               FlowGraphCompiler* compiler);
 
-  static void IntrinsicCallPrologue(Assembler* assembler);
-  static void IntrinsicCallEpilogue(Assembler* assembler);
-
  private:
 #define DECLARE_FUNCTION(class_name, function_name, enum_name, fp)             \
   static void enum_name(Assembler* assembler, Label* normal_ir_body);
diff --git a/runtime/vm/compiler/graph_intrinsifier_arm.cc b/runtime/vm/compiler/graph_intrinsifier_arm.cc
deleted file mode 100644
index baea3aa..0000000
--- a/runtime/vm/compiler/graph_intrinsifier_arm.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM.
-#if defined(TARGET_ARCH_ARM)
-
-#include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/graph_intrinsifier.h"
-
-namespace dart {
-namespace compiler {
-
-#define __ assembler->
-
-intptr_t GraphIntrinsifier::ParameterSlotFromSp() {
-  return -1;
-}
-
-void GraphIntrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
-  COMPILE_ASSERT(IsAbiPreservedRegister(CODE_REG));
-  COMPILE_ASSERT(IsAbiPreservedRegister(ARGS_DESC_REG));
-  COMPILE_ASSERT(IsAbiPreservedRegister(CALLEE_SAVED_TEMP));
-
-  // Save LR by moving it to a callee saved temporary register.
-  __ Comment("IntrinsicCallPrologue");
-  SPILLS_RETURN_ADDRESS_FROM_LR_TO_REGISTER(
-      __ mov(CALLEE_SAVED_TEMP, Operand(LR)));
-}
-
-void GraphIntrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
-  // Restore LR.
-  __ Comment("IntrinsicCallEpilogue");
-  RESTORES_RETURN_ADDRESS_FROM_REGISTER_TO_LR(
-      __ mov(LR, Operand(CALLEE_SAVED_TEMP)));
-}
-
-#undef __
-
-}  // namespace compiler
-}  // namespace dart
-
-#endif  // defined(TARGET_ARCH_ARM)
diff --git a/runtime/vm/compiler/graph_intrinsifier_arm64.cc b/runtime/vm/compiler/graph_intrinsifier_arm64.cc
deleted file mode 100644
index 27be6fa..0000000
--- a/runtime/vm/compiler/graph_intrinsifier_arm64.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
-#if defined(TARGET_ARCH_ARM64)
-
-#include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/graph_intrinsifier.h"
-
-namespace dart {
-namespace compiler {
-
-#define __ assembler->
-
-intptr_t GraphIntrinsifier::ParameterSlotFromSp() {
-  return -1;
-}
-
-void GraphIntrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
-  COMPILE_ASSERT(IsAbiPreservedRegister(CODE_REG));
-  COMPILE_ASSERT(!IsAbiPreservedRegister(ARGS_DESC_REG));
-  COMPILE_ASSERT(IsAbiPreservedRegister(CALLEE_SAVED_TEMP));
-  COMPILE_ASSERT(IsAbiPreservedRegister(CALLEE_SAVED_TEMP2));
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP != CODE_REG);
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP2 != CODE_REG);
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP2 != ARGS_DESC_REG);
-
-  __ Comment("IntrinsicCallPrologue");
-  SPILLS_RETURN_ADDRESS_FROM_LR_TO_REGISTER(__ mov(CALLEE_SAVED_TEMP, LR));
-  __ mov(CALLEE_SAVED_TEMP2, ARGS_DESC_REG);
-}
-
-void GraphIntrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
-  __ Comment("IntrinsicCallEpilogue");
-  RESTORES_RETURN_ADDRESS_FROM_REGISTER_TO_LR(__ mov(LR, CALLEE_SAVED_TEMP));
-  __ mov(ARGS_DESC_REG, CALLEE_SAVED_TEMP2);
-}
-
-#undef __
-
-}  // namespace compiler
-}  // namespace dart
-
-#endif  // defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/compiler/graph_intrinsifier_ia32.cc b/runtime/vm/compiler/graph_intrinsifier_ia32.cc
deleted file mode 100644
index 6e29ff5..0000000
--- a/runtime/vm/compiler/graph_intrinsifier_ia32.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/globals.h"  // Needed here to get TARGET_ARCH_IA32.
-#if defined(TARGET_ARCH_IA32)
-
-#include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/graph_intrinsifier.h"
-
-namespace dart {
-namespace compiler {
-
-#define __ assembler->
-
-intptr_t GraphIntrinsifier::ParameterSlotFromSp() {
-  return 0;
-}
-
-void GraphIntrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
-
-  assembler->Comment("IntrinsicCallPrologue");
-  assembler->movl(CALLEE_SAVED_TEMP, ARGS_DESC_REG);
-}
-
-void GraphIntrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
-  assembler->Comment("IntrinsicCallEpilogue");
-  assembler->movl(ARGS_DESC_REG, CALLEE_SAVED_TEMP);
-}
-
-#undef __
-
-}  // namespace compiler
-}  // namespace dart
-
-#endif  // defined(TARGET_ARCH_IA32)
diff --git a/runtime/vm/compiler/graph_intrinsifier_x64.cc b/runtime/vm/compiler/graph_intrinsifier_x64.cc
deleted file mode 100644
index e1479a8..0000000
--- a/runtime/vm/compiler/graph_intrinsifier_x64.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/globals.h"  // Needed here to get TARGET_ARCH_X64.
-#if defined(TARGET_ARCH_X64)
-
-#include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/graph_intrinsifier.h"
-
-namespace dart {
-namespace compiler {
-
-#define __ assembler->
-
-intptr_t GraphIntrinsifier::ParameterSlotFromSp() {
-  return 0;
-}
-
-void GraphIntrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
-  COMPILE_ASSERT(IsAbiPreservedRegister(CODE_REG));
-  COMPILE_ASSERT(!IsAbiPreservedRegister(ARGS_DESC_REG));
-  COMPILE_ASSERT(IsAbiPreservedRegister(CALLEE_SAVED_TEMP));
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP != CODE_REG);
-  COMPILE_ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
-
-  assembler->Comment("IntrinsicCallPrologue");
-  assembler->movq(CALLEE_SAVED_TEMP, ARGS_DESC_REG);
-}
-
-void GraphIntrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
-  assembler->Comment("IntrinsicCallEpilogue");
-  assembler->movq(ARGS_DESC_REG, CALLEE_SAVED_TEMP);
-}
-
-#undef __
-
-}  // namespace compiler
-}  // namespace dart
-
-#endif  // defined(TARGET_ARCH_X64)
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index bce561c..f343f73 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -173,7 +173,6 @@
 
 static const IntrinsicDesc math_intrinsics[] = {
   MATH_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
-  GRAPH_MATH_LIB_INTRINSIC_LIST(DEFINE_INTRINSIC)
   {nullptr, nullptr},
 };
 
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 8bf5cf9..d621516 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -96,6 +96,16 @@
   V(::, max, MathMax, 0xead7161a)                                              \
   V(::, _doublePow, MathDoublePow, 0x989f3334)                                 \
   V(::, _intPow, MathIntPow, 0x68b6021e)                                       \
+  V(::, _sin, MathSin, 0x17dacdc4)                                             \
+  V(::, _cos, MathCos, 0xf4948106)                                             \
+  V(::, _tan, MathTan, 0xeb1a58f8)                                             \
+  V(::, _asin, MathAsin, 0x29e4d95f)                                           \
+  V(::, _acos, MathAcos, 0x200aa49c)                                           \
+  V(::, _atan, MathAtan, 0x10fa64b3)                                           \
+  V(::, _atan2, MathAtan2, 0x58d4f514)                                         \
+  V(::, _sqrt, MathSqrt, 0x03183751)                                           \
+  V(::, _exp, MathExp, 0x00f50391)                                             \
+  V(::, _log, MathLog, 0x09ae8823)                                             \
   V(Float32x4, _Float32x4FromDoubles, Float32x4FromDoubles, 0x1845792b)        \
   V(Float32x4, Float32x4.zero, Float32x4Zero, 0xd3b64002)                      \
   V(Float32x4, _Float32x4Splat, Float32x4Splat, 0x13a552c3)                    \
@@ -275,20 +285,8 @@
   V(_Double, toInt, DoubleToInteger, 0x676f1ce8)                               \
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
-  V(::, sqrt, MathSqrt, 0x1c9a16a2)                                            \
   V(_Random, _nextState, Random_nextState, 0x7207677d)                         \
 
-#define GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                       \
-  V(::, sin, MathSin, 0xb79dea09)                                              \
-  V(::, cos, MathCos, 0x81a51dbd)                                              \
-  V(::, tan, MathTan, 0x64bc50f3)                                              \
-  V(::, asin, MathAsin, 0x7d26f0d4)                                            \
-  V(::, acos, MathAcos, 0xc3879f8b)                                            \
-  V(::, atan, MathAtan, 0xb5c4223e)                                            \
-  V(::, atan2, MathAtan2, 0xc03b8b85)                                          \
-  V(::, exp, MathExp, 0x7f5f1a67)                                              \
-  V(::, log, MathLog, 0xebc3f443)                                              \
-
 #define GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                    \
   V(_Int8List, [], Int8ArrayGetIndexed, 0x35f3fab6)                            \
   V(_Int8List, []=, Int8ArraySetIndexed, 0x6e4fdaa7)                           \
@@ -375,7 +373,6 @@
 #define GRAPH_INTRINSICS_LIST(V)                                               \
   GRAPH_CORE_INTRINSICS_LIST(V)                                                \
   GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                          \
-  GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                             \
 
 #define DEVELOPER_LIB_INTRINSIC_LIST(V)                                        \
   V(::, _getDefaultTag, UserTag_defaultTag, 0x6c19c8a5)                        \
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 999790d..33a86d0 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -530,15 +530,26 @@
   return (a_length - a_cursor);
 }
 
-static void AcceptCompilation(Thread* thread) {
+static ObjectPtr AcceptCompilation(Thread* thread) {
   TransitionVMToNative transition(thread);
   Dart_KernelCompilationResult result = KernelIsolate::AcceptCompilation();
   if (result.status != Dart_KernelCompilationStatus_Ok) {
-    FATAL1(
-        "An error occurred in the CFE while accepting the most recent"
+    if (result.status != Dart_KernelCompilationStatus_MsgFailed) {
+      FATAL1(
+          "An error occurred while accepting the most recent"
+          " compilation results: %s",
+          result.error);
+    }
+    TIR_Print(
+        "An error occurred while accepting the most recent"
         " compilation results: %s",
         result.error);
+    Zone* zone = thread->zone();
+    const auto& error_str = String::Handle(zone, String::New(result.error));
+    free(result.error);
+    return ApiError::New(error_str);
   }
+  return Object::null();
 }
 
 // If [root_script_url] is null, attempt to load from [kernel_buffer].
@@ -639,7 +650,14 @@
     // we have accepted the compilation to clear some state in the incremental
     // compiler.
     if (did_kernel_compilation) {
-      AcceptCompilation(thread);
+      const auto& result = Object::Handle(Z, AcceptCompilation(thread));
+      if (result.IsError()) {
+        const auto& error = Error::Cast(result);
+        AddReasonForCancelling(new Aborted(Z, error));
+        ReportReasonsForCancelling();
+        CommonFinalizeTail(num_old_libs_);
+        return false;
+      }
     }
     TIR_Print("---- SKIPPING RELOAD (No libraries were modified)\n");
     return false;
@@ -739,6 +757,17 @@
       heap->CollectAllGarbage(Heap::kLowMemory);
     }
 
+    // If we use the CFE and performed a compilation, we need to notify that
+    // we have accepted the compilation to clear some state in the incremental
+    // compiler.
+    if (did_kernel_compilation) {
+      const auto& result = Object::Handle(Z, AcceptCompilation(thread));
+      if (result.IsError()) {
+        const auto& error = Error::Cast(result);
+        AddReasonForCancelling(new Aborted(Z, error));
+      }
+    }
+
     if (!FLAG_reload_force_rollback && !HasReasonsForCancelling()) {
       TIR_Print("---- COMMITTING RELOAD\n");
       isolate_group_->program_reload_context()->ReloadPhase4CommitPrepare();
@@ -828,13 +857,6 @@
         GrowableObjectArray::Handle(Z, IG->object_store()->libraries())
             .Length();
     CommonFinalizeTail(final_library_count);
-
-    // If we use the CFE and performed a compilation, we need to notify that
-    // we have accepted the compilation to clear some state in the incremental
-    // compiler.
-    if (did_kernel_compilation) {
-      AcceptCompilation(thread);
-    }
   }
 
   // Reenable concurrent marking if it was initially on.
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index f8b17ab..4156252 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -484,7 +484,7 @@
       const MallocGrowableArray<char*>* experimental_flags) {
     if (port_ == ILLEGAL_PORT) {
       Dart_KernelCompilationResult result = {};
-      result.status = Dart_KernelCompilationStatus_Unknown;
+      result.status = Dart_KernelCompilationStatus_MsgFailed;
       result.error =
           Utils::StrDup("Error Kernel Isolate : unable to create reply port");
       return result;
@@ -719,7 +719,7 @@
     // tag is used to specify which operation the frontend should perform.
     if (port_ == ILLEGAL_PORT) {
       Dart_KernelCompilationResult result = {};
-      result.status = Dart_KernelCompilationStatus_Unknown;
+      result.status = Dart_KernelCompilationStatus_MsgFailed;
       result.error =
           Utils::StrDup("Error Kernel Isolate : unable to create reply port");
       return result;
@@ -1057,7 +1057,7 @@
   Dart_Port kernel_port = WaitForKernelPort();
   if (kernel_port == ILLEGAL_PORT) {
     Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
+    result.status = Dart_KernelCompilationStatus_MsgFailed;
     result.error = Utils::StrDup("Error while initializing Kernel isolate");
     return result;
   }
@@ -1095,7 +1095,7 @@
   Dart_Port kernel_port = WaitForKernelPort();
   if (kernel_port == ILLEGAL_PORT) {
     Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
+    result.status = Dart_KernelCompilationStatus_MsgFailed;
     result.error = Utils::StrDup("Error while initializing Kernel isolate");
     return result;
   }
@@ -1113,7 +1113,7 @@
   Dart_Port kernel_port = WaitForKernelPort();
   if (kernel_port == ILLEGAL_PORT) {
     Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
+    result.status = Dart_KernelCompilationStatus_MsgFailed;
     result.error = Utils::StrDup("Error while initializing Kernel isolate");
     return result;
   }
@@ -1137,7 +1137,7 @@
   Dart_Port kernel_port = WaitForKernelPort();
   if (kernel_port == ILLEGAL_PORT) {
     Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
+    result.status = Dart_KernelCompilationStatus_MsgFailed;
     result.error = Utils::StrDup("Error while initializing Kernel isolate");
     return result;
   }
@@ -1159,7 +1159,7 @@
   Dart_Port kernel_port = WaitForKernelPort();
   if (kernel_port == ILLEGAL_PORT) {
     Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
+    result.status = Dart_KernelCompilationStatus_MsgFailed;
     result.error = Utils::StrDup("Error while initializing Kernel isolate");
     return result;
   }
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index e65fc1c..6c69e47 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -1818,6 +1818,65 @@
   const intptr_t cid_;
 };
 
+class NativePointerMessageSerializationCluster
+    : public MessageSerializationCluster {
+ public:
+  explicit NativePointerMessageSerializationCluster(Zone* zone)
+      : MessageSerializationCluster("NativePointer",
+                                    MessagePhase::kNonCanonicalInstances,
+                                    kNativePointer),
+        objects_(zone, 0) {}
+  ~NativePointerMessageSerializationCluster() {}
+
+  void Trace(MessageSerializer* s, Object* object) { UNREACHABLE(); }
+
+  void WriteNodes(MessageSerializer* s) { UNREACHABLE(); }
+
+  void TraceApi(ApiMessageSerializer* s, Dart_CObject* object) {
+    objects_.Add(object);
+  }
+
+  void WriteNodesApi(ApiMessageSerializer* s) {
+    intptr_t count = objects_.length();
+    s->WriteUnsigned(count);
+    for (intptr_t i = 0; i < count; i++) {
+      Dart_CObject* data = objects_[i];
+      s->AssignRef(data);
+
+      s->finalizable_data()->Put(
+          data->value.as_native_pointer.size,
+          reinterpret_cast<void*>(data->value.as_native_pointer.ptr),
+          reinterpret_cast<void*>(data->value.as_native_pointer.ptr),
+          data->value.as_native_pointer.callback);
+    }
+  }
+
+ private:
+  GrowableArray<Dart_CObject*> objects_;
+};
+
+class NativePointerMessageDeserializationCluster
+    : public MessageDeserializationCluster {
+ public:
+  NativePointerMessageDeserializationCluster()
+      : MessageDeserializationCluster("NativePointer"), cid_(kNativePointer) {}
+  ~NativePointerMessageDeserializationCluster() {}
+
+  void ReadNodes(MessageDeserializer* d) {
+    intptr_t count = d->ReadUnsigned();
+    for (intptr_t i = 0; i < count; i++) {
+      FinalizableData finalizable_data = d->finalizable_data()->Take();
+      intptr_t ptr = reinterpret_cast<intptr_t>(finalizable_data.data);
+      d->AssignRef(Integer::New(ptr));
+    }
+  }
+
+  void ReadNodesApi(ApiMessageDeserializer* d) { UNREACHABLE(); }
+
+ private:
+  const intptr_t cid_;
+};
+
 class TypedDataViewMessageSerializationCluster
     : public MessageSerializationCluster {
  public:
@@ -3189,6 +3248,9 @@
     case Dart_CObject_kCapability:
       cid = kCapabilityCid;
       break;
+    case Dart_CObject_kNativePointer:
+      cid = kNativePointer;
+      break;
     default:
       return Fail("invalid Dart_CObject type");
   }
@@ -3242,6 +3304,8 @@
   }
 
   switch (cid) {
+    case kNativePointer:
+      return new (Z) NativePointerMessageSerializationCluster(Z);
     case kClassCid:
       return new (Z) ClassMessageSerializationCluster();
     case kTypeArgumentsCid:
@@ -3326,6 +3390,9 @@
   }
 
   switch (cid) {
+    case kNativePointer:
+      ASSERT(!is_canonical);
+      return new (Z) NativePointerMessageDeserializationCluster();
     case kClassCid:
       ASSERT(!is_canonical);
       return new (Z) ClassMessageDeserializationCluster();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index da7fc64..94a73e0 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -14513,7 +14513,6 @@
   all_libs.Clear();
   all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
   MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC);
-  GRAPH_MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_GRAPH_INTRINSIC);
 
 #undef CHECK_FINGERPRINTS_INNER
 #undef CHECK_FINGERPRINTS
@@ -20459,8 +20458,9 @@
   }
   // Function types cannot be handled by Class::IsSubtypeOf().
   if (IsFunctionType()) {
-    // Any type that can be the type of a closure is a subtype of Function.
-    if (other.IsDartFunctionType()) {
+    // Any type that can be the type of a closure is a subtype of Function or
+    // non-nullable Object.
+    if (other.IsObjectType() || other.IsDartFunctionType()) {
       return !isolate_group->use_strict_null_safety_checks() || !IsNullable() ||
              !other.IsNonNullable();
     }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 959f4da..fbb1527 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -5304,52 +5304,55 @@
   EXPECT(!m.IsSubtypeOf(t, Heap::kNew));
 }
 
-ISOLATE_UNIT_TEST_CASE(ClosureType_SubtypeOfFunctionType) {
-  auto check_subtype_relation = [](const Expect& expect, const Type& sub,
-                                   const Type& super, bool is_subtype) {
-    if (sub.IsSubtypeOf(super, Heap::kNew) != is_subtype) {
-      TextBuffer buffer(128);
-      buffer.AddString("Expected ");
-      sub.PrintName(Object::kScrubbedName, &buffer);
-      buffer.Printf(" to %s a subtype of ", is_subtype ? "be" : "not be");
-      super.PrintName(Object::kScrubbedName, &buffer);
-      expect.Fail("%s", buffer.buffer());
-    }
-  };
+static void FinalizeAndCanonicalize(AbstractType* type) {
+  *type ^= ClassFinalizer::FinalizeType(*type);
+  ASSERT(type->IsCanonical());
+}
+
+static void CheckSubtypeRelation(const Expect& expect,
+                                 const AbstractType& sub,
+                                 const AbstractType& super,
+                                 bool is_subtype) {
+  if (sub.IsSubtypeOf(super, Heap::kNew) != is_subtype) {
+    TextBuffer buffer(128);
+    buffer.AddString("Expected ");
+    sub.PrintName(Object::kScrubbedName, &buffer);
+    buffer.Printf(" to %s a subtype of ", is_subtype ? "be" : "not be");
+    super.PrintName(Object::kScrubbedName, &buffer);
+    expect.Fail("%s", buffer.buffer());
+  }
+}
+
 #define EXPECT_SUBTYPE(sub, super)                                             \
-  check_subtype_relation(Expect(__FILE__, __LINE__), sub, super, true);
+  CheckSubtypeRelation(Expect(__FILE__, __LINE__), sub, super, true);
 #define EXPECT_NOT_SUBTYPE(sub, super)                                         \
-  check_subtype_relation(Expect(__FILE__, __LINE__), sub, super, false);
+  CheckSubtypeRelation(Expect(__FILE__, __LINE__), sub, super, false);
 
-  auto finalize_and_canonicalize = [](Type* type) {
-    *type ^= ClassFinalizer::FinalizeType(*type);
-    ASSERT(type->IsCanonical());
-  };
-
+ISOLATE_UNIT_TEST_CASE(ClosureType_SubtypeOfFunctionType) {
   const auto& closure_class =
       Class::Handle(IsolateGroup::Current()->object_store()->closure_class());
   const auto& closure_type = Type::Handle(closure_class.DeclarationType());
   auto& closure_type_nullable = Type::Handle(
       closure_type.ToNullability(Nullability::kNullable, Heap::kNew));
-  finalize_and_canonicalize(&closure_type_nullable);
+  FinalizeAndCanonicalize(&closure_type_nullable);
   auto& closure_type_legacy = Type::Handle(
       closure_type.ToNullability(Nullability::kLegacy, Heap::kNew));
-  finalize_and_canonicalize(&closure_type_legacy);
+  FinalizeAndCanonicalize(&closure_type_legacy);
   auto& closure_type_nonnullable = Type::Handle(
       closure_type.ToNullability(Nullability::kNonNullable, Heap::kNew));
-  finalize_and_canonicalize(&closure_type_nonnullable);
+  FinalizeAndCanonicalize(&closure_type_nonnullable);
 
   const auto& function_type =
       Type::Handle(IsolateGroup::Current()->object_store()->function_type());
   auto& function_type_nullable = Type::Handle(
       function_type.ToNullability(Nullability::kNullable, Heap::kNew));
-  finalize_and_canonicalize(&function_type_nullable);
+  FinalizeAndCanonicalize(&function_type_nullable);
   auto& function_type_legacy = Type::Handle(
       function_type.ToNullability(Nullability::kLegacy, Heap::kNew));
-  finalize_and_canonicalize(&function_type_legacy);
+  FinalizeAndCanonicalize(&function_type_legacy);
   auto& function_type_nonnullable = Type::Handle(
       function_type.ToNullability(Nullability::kNonNullable, Heap::kNew));
-  finalize_and_canonicalize(&function_type_nonnullable);
+  FinalizeAndCanonicalize(&function_type_nonnullable);
 
   EXPECT_SUBTYPE(closure_type_nonnullable, function_type_nullable);
   EXPECT_SUBTYPE(closure_type_nonnullable, function_type_legacy);
@@ -5382,13 +5385,13 @@
 
   auto& future_or_function_type_nullable =
       Type::Handle(Type::New(future_or_class, tav_function_nullable));
-  finalize_and_canonicalize(&future_or_function_type_nullable);
+  FinalizeAndCanonicalize(&future_or_function_type_nullable);
   auto& future_or_function_type_legacy =
       Type::Handle(Type::New(future_or_class, tav_function_legacy));
-  finalize_and_canonicalize(&future_or_function_type_legacy);
+  FinalizeAndCanonicalize(&future_or_function_type_legacy);
   auto& future_or_function_type_nonnullable =
       Type::Handle(Type::New(future_or_class, tav_function_nonnullable));
-  finalize_and_canonicalize(&future_or_function_type_nonnullable);
+  FinalizeAndCanonicalize(&future_or_function_type_nonnullable);
 
   EXPECT_SUBTYPE(closure_type_nonnullable, future_or_function_type_nullable);
   EXPECT_SUBTYPE(closure_type_nonnullable, future_or_function_type_legacy);
@@ -5405,9 +5408,32 @@
   } else {
     EXPECT_SUBTYPE(closure_type_nullable, future_or_function_type_nonnullable);
   }
+}
+
+ISOLATE_UNIT_TEST_CASE(FunctionType_IsSubtypeOfNonNullableObject) {
+  const auto& type_object = Type::Handle(
+      IsolateGroup::Current()->object_store()->non_nullable_object_type());
+
+  auto& type_function_int_nullary =
+      FunctionType::Handle(FunctionType::New(0, Nullability::kNonNullable));
+  type_function_int_nullary.set_result_type(Type::Handle(Type::IntType()));
+  FinalizeAndCanonicalize(&type_function_int_nullary);
+
+  auto& type_nullable_function_int_nullary =
+      FunctionType::Handle(type_function_int_nullary.ToNullability(
+          Nullability::kNullable, Heap::kOld));
+  FinalizeAndCanonicalize(&type_nullable_function_int_nullary);
+
+  EXPECT_SUBTYPE(type_function_int_nullary, type_object);
+  if (IsolateGroup::Current()->use_strict_null_safety_checks()) {
+    EXPECT_NOT_SUBTYPE(type_nullable_function_int_nullary, type_object);
+  } else {
+    EXPECT_SUBTYPE(type_nullable_function_int_nullary, type_object);
+  }
+}
+
 #undef EXPECT_NOT_SUBTYPE
 #undef EXPECT_SUBTYPE
-}
 
 TEST_CASE(Class_GetInstantiationOf) {
   const char* kScript = R"(
diff --git a/sdk/lib/_internal/vm/lib/math_patch.dart b/sdk/lib/_internal/vm/lib/math_patch.dart
index 167f3f5..ce3815b 100644
--- a/sdk/lib/_internal/vm/lib/math_patch.dart
+++ b/sdk/lib/_internal/vm/lib/math_patch.dart
@@ -121,65 +121,75 @@
 }
 
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double sin(num radians) => _sin(radians.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double cos(num radians) => _cos(radians.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double tan(num radians) => _tan(radians.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double acos(num x) => _acos(x.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double asin(num x) => _asin(x.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double atan(num x) => _atan(x.toDouble());
 @patch
-@pragma("vm:recognized", "asm-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double sqrt(num x) => _sqrt(x.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double exp(num x) => _exp(x.toDouble());
 @patch
-@pragma("vm:recognized", "graph-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Double")
-@pragma("vm:never-inline")
+@pragma("vm:prefer-inline")
 double log(num x) => _log(x.toDouble());
 
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _atan2(double a, double b) native "Math_atan2";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _sin(double x) native "Math_sin";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _cos(double x) native "Math_cos";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _tan(double x) native "Math_tan";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _acos(double x) native "Math_acos";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _asin(double x) native "Math_asin";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _atan(double x) native "Math_atan";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _sqrt(double x) native "Math_sqrt";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _exp(double x) native "Math_exp";
+@pragma("vm:recognized", "other")
+@pragma("vm:prefer-inline")
 double _log(double x) native "Math_log";
 
 // TODO(iposva): Handle patch methods within a patch class correctly.
diff --git a/tests/standalone/io/file_leak_test.dart b/tests/standalone/io/file_leak_test.dart
new file mode 100644
index 0000000..6c8ddf1
--- /dev/null
+++ b/tests/standalone/io/file_leak_test.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Dart test program for testing file I/O.
+
+// OtherResources=fixed_length_file
+// OtherResources=read_as_text.dat
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:collection';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import "package:path/path.dart";
+
+class FileTest {
+  static Directory? tempDirectory;
+  static int numLiveAsyncTests = 0;
+
+  static void asyncTestStarted() {
+    asyncStart();
+    ++numLiveAsyncTests;
+  }
+
+  static void asyncTestDone(String name) {
+    asyncEnd();
+    --numLiveAsyncTests;
+    if (numLiveAsyncTests == 0) {
+      deleteTempDirectory();
+    }
+  }
+
+  static void createTempDirectory(Function doNext) {
+    Directory.systemTemp.createTemp('dart_file').then((temp) {
+      tempDirectory = temp;
+      doNext();
+    });
+  }
+
+  static void deleteTempDirectory() {
+    tempDirectory!.deleteSync(recursive: true);
+  }
+
+  static testReadInto() async {
+    asyncTestStarted();
+    File file = new File(tempDirectory!.path + "/out_read_into");
+
+    var openedFile = await file.open(mode: FileMode.write);
+    await openedFile.writeFrom(const [1, 2, 3]);
+
+    await openedFile.setPosition(0);
+    var list = <int>[1, 2, 3];
+    Expect.equals(3, await openedFile.readInto(list));
+    Expect.listEquals([1, 2, 3], list);
+
+    read(start, end, length, expected) async {
+      var list = <int>[1, 2, 3];
+      await openedFile.setPosition(0);
+      Expect.equals(length, await openedFile.readInto(list, start, end));
+      Expect.listEquals(expected, list);
+      return list;
+    }
+
+    await read(0, 3, 3, [1, 2, 3]);
+    await read(0, 2, 2, [1, 2, null]);
+    await read(1, 2, 1, [null, 1, null]);
+    await read(1, 3, 2, [null, 1, 2]);
+    await read(2, 3, 1, [null, null, 1]);
+    await read(0, 0, 0, [null, null, null]);
+
+    await openedFile.close();
+
+    asyncTestDone("testReadInto");
+  }
+
+  static void testReadAsText() {
+    asyncTestStarted();
+    var name = getFilename("fixed_length_file");
+    var f = new File(name);
+    f.readAsString(encoding: utf8).then((text) {
+      Expect.isTrue(text.endsWith("42 bytes."));
+      Expect.equals(42, text.length);
+      var name = getFilename("read_as_text.dat");
+      var f = new File(name);
+      f.readAsString(encoding: utf8).then((text) {
+        Expect.equals(6, text.length);
+        var expected = [955, 120, 46, 32, 120, 10];
+        Expect.listEquals(expected, text.codeUnits);
+        f.readAsString(encoding: latin1).then((text) {
+          Expect.equals(7, text.length);
+          var expected = [206, 187, 120, 46, 32, 120, 10];
+          Expect.listEquals(expected, text.codeUnits);
+          var readAsStringFuture = f.readAsString(encoding: ascii);
+          readAsStringFuture.then((text) {
+            Expect.fail("Non-ascii char should cause error");
+          }).catchError((e) {
+            asyncTestDone("testReadAsText");
+          });
+        });
+      });
+    });
+  }
+
+  static String getFilename(String path) {
+    return Platform.script.resolve(path).toFilePath();
+  }
+
+  // Main test entrypoint.
+  // This test results in an unhandled exception in the isolate while
+  // some async file IO operations are still pending. The unhandled
+  // exception results in the 'File' object being leaked, the error
+  // only shows up in the ASAN bots which detect the leak.
+  static testMain() {
+    asyncStart();
+    var outerZone = Zone.current;
+    var firstZone = Zone.current.fork(specification: ZoneSpecification(
+        handleUncaughtError: (self, parent, zone, error, stacktrace) {
+      asyncEnd();
+      print("unittest-suite-success"); // For the test harness.
+      exit(0);
+    }));
+    firstZone.run(() async {
+      Expect.identical(firstZone, Zone.current);
+      createTempDirectory(() {
+        testReadAsText();
+        testReadInto();
+        Expect.equals(1, 0); // Should not execute this.
+        asyncEnd();
+      });
+    });
+  }
+}
+
+main() {
+  FileTest.testMain();
+}
diff --git a/tests/standalone_2/io/file_leak_test.dart b/tests/standalone_2/io/file_leak_test.dart
new file mode 100644
index 0000000..9bac244
--- /dev/null
+++ b/tests/standalone_2/io/file_leak_test.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Dart test program for testing file I/O.
+
+// @dart = 2.9
+
+// OtherResources=fixed_length_file
+// OtherResources=read_as_text.dat
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:collection';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import "package:path/path.dart";
+
+class FileTest {
+  static Directory tempDirectory;
+  static int numLiveAsyncTests = 0;
+
+  static void asyncTestStarted() {
+    asyncStart();
+    ++numLiveAsyncTests;
+  }
+
+  static void asyncTestDone(String name) {
+    asyncEnd();
+    --numLiveAsyncTests;
+    if (numLiveAsyncTests == 0) {
+      deleteTempDirectory();
+    }
+  }
+
+  static void createTempDirectory(Function doNext) {
+    Directory.systemTemp.createTemp('dart_file').then((temp) {
+      tempDirectory = temp;
+      doNext();
+    });
+  }
+
+  static void deleteTempDirectory() {
+    tempDirectory.deleteSync(recursive: true);
+  }
+
+  static testReadInto() async {
+    asyncTestStarted();
+    File file = new File(tempDirectory.path + "/out_read_into");
+
+    var openedFile = await file.open(mode: FileMode.write);
+    await openedFile.writeFrom(const [1, 2, 3]);
+
+    await openedFile.setPosition(0);
+    var list = [null, null, null];
+    Expect.equals(3, await openedFile.readInto(list));
+    Expect.listEquals([1, 2, 3], list);
+
+    read(start, end, length, expected) async {
+      var list = [null, null, null];
+      await openedFile.setPosition(0);
+      Expect.equals(length, await openedFile.readInto(list, start, end));
+      Expect.listEquals(expected, list);
+      return list;
+    }
+
+    await read(0, 3, 3, [1, 2, 3]);
+    await read(0, 2, 2, [1, 2, null]);
+    await read(1, 2, 1, [null, 1, null]);
+    await read(1, 3, 2, [null, 1, 2]);
+    await read(2, 3, 1, [null, null, 1]);
+    await read(0, 0, 0, [null, null, null]);
+
+    await openedFile.close();
+
+    asyncTestDone("testReadInto");
+  }
+
+  static void testReadAsText() {
+    asyncTestStarted();
+    var name = getFilename("fixed_length_file");
+    var f = new File(name);
+    f.readAsString(encoding: utf8).then((text) {
+      Expect.isTrue(text.endsWith("42 bytes."));
+      Expect.equals(42, text.length);
+      var name = getFilename("read_as_text.dat");
+      var f = new File(name);
+      f.readAsString(encoding: utf8).then((text) {
+        Expect.equals(6, text.length);
+        var expected = [955, 120, 46, 32, 120, 10];
+        Expect.listEquals(expected, text.codeUnits);
+        f.readAsString(encoding: latin1).then((text) {
+          Expect.equals(7, text.length);
+          var expected = [206, 187, 120, 46, 32, 120, 10];
+          Expect.listEquals(expected, text.codeUnits);
+          var readAsStringFuture = f.readAsString(encoding: ascii);
+          readAsStringFuture.then((text) {
+            Expect.fail("Non-ascii char should cause error");
+          }).catchError((e) {
+            asyncTestDone("testReadAsText");
+          });
+        });
+      });
+    });
+  }
+
+  static String getFilename(String path) {
+    return Platform.script.resolve(path).toFilePath();
+  }
+
+  // Main test entrypoint.
+  // This test results in an unhandled exception in the isolate while
+  // some async file IO operations are still pending. The unhandled
+  // exception results in the 'File' object being leaked, the error
+  // only shows up in the ASAN bots which detect the leak.
+  static testMain() {
+    asyncStart();
+    var outerZone = Zone.current;
+    var firstZone = Zone.current.fork(specification: ZoneSpecification(
+        handleUncaughtError: (self, parent, zone, error, stacktrace) {
+      asyncEnd();
+      print("unittest-suite-success"); // For the test harness.
+      exit(0);
+    }));
+    firstZone.run(() async {
+      Expect.identical(firstZone, Zone.current);
+      createTempDirectory(() {
+        testReadAsText();
+        testReadInto();
+        Expect.equals(1, 0); // Should not execute this.
+        asyncEnd();
+      });
+    });
+  }
+}
+
+main() {
+  FileTest.testMain();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 15b6cef..f34b853 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 65
+PRERELEASE 66
 PRERELEASE_PATCH 0
\ No newline at end of file