Version 2.12.0-245.0.dev
Merge commit '88c1be7e3b718bf00ff4f01b62d7ab1521abc5c7' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8b3949b..a6ea3d3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -79,14 +79,17 @@
#### Linter
-Updated the Linter to `0.1.127`, which includes:
+Updated the Linter to `0.1.128`, which includes:
-* fixed crash in `prefer_collection_literals` when there is no static parameter
+* New lint: `avoid_dynamic_calls`.
+* (Internal): `avoid_type_to_string` updated to use `addArgumentList` registry API.
+* Miscellaneous documentation improvements.
+* Fixed crash in `prefer_collection_literals` when there is no static parameter
element.
-* fixed false negatives for `prefer_collection_literals` when a LinkedHashSet or
+* Fixed false negatives for `prefer_collection_literals` when a LinkedHashSet or
LinkedHashMap instantiation is passed as the argument to a function in any
position other than the first.
-* fixed false negatives for `prefer_collection_literals` when a LinkedHashSet or
+* Fixed false negatives for `prefer_collection_literals` when a LinkedHashSet or
LinkedHashMap instantiation is used in a place with a static type other than
Set or Map.
* (Internal): test updates to the new `PhysicalResourceProvider` API.
diff --git a/DEPS b/DEPS
index cc4a62a..87fb107 100644
--- a/DEPS
+++ b/DEPS
@@ -118,7 +118,7 @@
"intl_tag": "0.17.0-nullsafety",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_rev": "b8dfe403fd8528fd14399dee3a6527b55802dd4d",
- "linter_tag": "0.1.127",
+ "linter_tag": "0.1.128",
"logging_rev": "e2f633b543ef89c54688554b15ca3d7e425b86a2",
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
"markdown_rev": "6f89681d59541ddb1cf3a58efbdaa2304ffc3f51",
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 7636ffc..4ad5e63 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -166,6 +166,7 @@
const String DIAGNOSTIC_RESPONSE_GET_SERVER_PORT_PORT = 'port';
const String EDIT_REQUEST_BULK_FIXES = 'edit.bulkFixes';
const String EDIT_REQUEST_BULK_FIXES_INCLUDED = 'included';
+const String EDIT_REQUEST_BULK_FIXES_IN_TEST_MODE = 'inTestMode';
const String EDIT_REQUEST_DARTFIX = 'edit.dartfix';
const String EDIT_REQUEST_DARTFIX_EXCLUDED_FIXES = 'excludedFixes';
const String EDIT_REQUEST_DARTFIX_INCLUDED = 'included';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 3cf16bf..6d05e71 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -7301,12 +7301,15 @@
///
/// {
/// "included": List<FilePath>
+/// "inTestMode": optional bool
/// }
///
/// Clients may not extend, implement or mix-in this class.
class EditBulkFixesParams implements RequestParams {
List<String> _included;
+ bool _inTestMode;
+
/// A list of the files and directories for which edits should be suggested.
///
/// If a request is made with a path that is invalid, e.g. is not absolute
@@ -7330,8 +7333,27 @@
_included = value;
}
- EditBulkFixesParams(List<String> included) {
+ /// A flag indicating whether the bulk fixes are being run in test mode. The
+ /// only difference is that in test mode the fix processor will look for a
+ /// configuration file that can modify the content of the data file used to
+ /// compute the fixes when data-driven fixes are being considered.
+ ///
+ /// If this field is omitted the flag defaults to false.
+ bool get inTestMode => _inTestMode;
+
+ /// A flag indicating whether the bulk fixes are being run in test mode. The
+ /// only difference is that in test mode the fix processor will look for a
+ /// configuration file that can modify the content of the data file used to
+ /// compute the fixes when data-driven fixes are being considered.
+ ///
+ /// If this field is omitted the flag defaults to false.
+ set inTestMode(bool value) {
+ _inTestMode = value;
+ }
+
+ EditBulkFixesParams(List<String> included, {bool inTestMode}) {
this.included = included;
+ this.inTestMode = inTestMode;
}
factory EditBulkFixesParams.fromJson(
@@ -7345,7 +7367,12 @@
} else {
throw jsonDecoder.mismatch(jsonPath, 'included');
}
- return EditBulkFixesParams(included);
+ bool inTestMode;
+ if (json.containsKey('inTestMode')) {
+ inTestMode = jsonDecoder.decodeBool(
+ jsonPath + '.inTestMode', json['inTestMode']);
+ }
+ return EditBulkFixesParams(included, inTestMode: inTestMode);
} else {
throw jsonDecoder.mismatch(jsonPath, 'edit.bulkFixes params', json);
}
@@ -7360,6 +7387,9 @@
Map<String, dynamic> toJson() {
var result = <String, dynamic>{};
result['included'] = included;
+ if (inTestMode != null) {
+ result['inTestMode'] = inTestMode;
+ }
return result;
}
@@ -7375,7 +7405,8 @@
bool operator ==(other) {
if (other is EditBulkFixesParams) {
return listEqual(
- included, other.included, (String a, String b) => a == b);
+ included, other.included, (String a, String b) => a == b) &&
+ inTestMode == other.inTestMode;
}
return false;
}
@@ -7384,6 +7415,7 @@
int get hashCode {
var hash = 0;
hash = JenkinsSmiHash.combine(hash, included.hashCode);
+ hash = JenkinsSmiHash.combine(hash, inTestMode.hashCode);
return JenkinsSmiHash.finish(hash);
}
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
index 5662724..56791c0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_late.dart
@@ -8,6 +8,7 @@
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -70,7 +71,8 @@
var keywordToken = declarationList.keyword;
if (declarationList.variables.length == 1 &&
keywordToken.keyword == Keyword.FINAL) {
- await _insertAt(builder, keywordToken.offset);
+ await _insertAt(builder, keywordToken.offset,
+ source: declarationResult.element.source);
}
}
}
@@ -78,8 +80,9 @@
}
}
- Future<void> _insertAt(ChangeBuilder builder, int offset) async {
- await builder.addDartFileEdit(file, (builder) {
+ Future<void> _insertAt(ChangeBuilder builder, int offset,
+ {Source source}) async {
+ await builder.addDartFileEdit(source?.fullName ?? file, (builder) {
builder.addSimpleInsertion(offset, 'late ');
});
}
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index bb5fa96..26306df 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -1466,6 +1466,9 @@
class num{}class Sunflower {static final n!2um MAX_D = 300;nu!3m xc, yc;Sun!4flower() {x!Xc = y!Yc = MA!1 }}''',
<String>['1+MAX_D', 'X+xc', 'Y+yc', '2+num', '3+num', '4+Sunflower']);
+ buildTests('testCompletion_staticField_withoutVarOrFinal', '''
+class num{}class Sunflower {static n!1}''', <String>['1+num']);
+
buildTests('testCompletion_super_superType', '''
class A {
var fa;
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index 27c7687..0fabf44 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1582,6 +1582,15 @@
/// analysis.setAnalysisRoots), an error of type FILE_NOT_ANALYZED will be
/// generated.
///
+ /// inTestMode: bool (optional)
+ ///
+ /// A flag indicating whether the bulk fixes are being run in test mode.
+ /// The only difference is that in test mode the fix processor will look
+ /// for a configuration file that can modify the content of the data file
+ /// used to compute the fixes when data-driven fixes are being considered.
+ ///
+ /// If this field is omitted the flag defaults to false.
+ ///
/// Returns
///
/// edits: List<SourceFileEdit>
@@ -1592,8 +1601,9 @@
///
/// Details that summarize the fixes associated with the recommended
/// changes.
- Future<EditBulkFixesResult> sendEditBulkFixes(List<String> included) async {
- var params = EditBulkFixesParams(included).toJson();
+ Future<EditBulkFixesResult> sendEditBulkFixes(List<String> included,
+ {bool inTestMode}) async {
+ var params = EditBulkFixesParams(included, inTestMode: inTestMode).toJson();
var result = await server.send('edit.bulkFixes', params);
var decoder = ResponseDecoder(null);
return EditBulkFixesResult.fromJson(decoder, 'result', result);
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 464139d..de9314a 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -2241,9 +2241,11 @@
///
/// {
/// "included": List<FilePath>
+/// "inTestMode": optional bool
/// }
final Matcher isEditBulkFixesParams = LazyMatcher(() => MatchesJsonObject(
- 'edit.bulkFixes params', {'included': isListOf(isFilePath)}));
+ 'edit.bulkFixes params', {'included': isListOf(isFilePath)},
+ optionalFields: {'inTestMode': isBool}));
/// edit.bulkFixes result
///
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
index 676a700..b44ebfc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
@@ -37,7 +37,6 @@
@override
FixKind get kind => DartFixKind.ADD_LATE;
- @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44534')
Future<void> test_changeInImportedLib() async {
addSource('/home/test/lib/a.dart', '''
class C {
@@ -58,7 +57,7 @@
''', target: '/home/test/lib/a.dart');
}
- @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44534')
+ @FailingTest(reason: 'The lint does not fire for parts.')
Future<void> test_changeInPart() async {
addSource('/home/test/lib/a.dart', '''
part 'test.dart';
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index f3f3dd1..473675b 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -481,8 +481,12 @@
* file which does not exist, or which is not currently subject to analysis (e.g. because
* it is not associated with any analysis root specified to analysis.setAnalysisRoots), an
* error of type FILE_NOT_ANALYZED will be generated.
+ * @param inTestMode A flag indicating whether the bulk fixes are being run in test mode. The only
+ * difference is that in test mode the fix processor will look for a configuration file
+ * that can modify the content of the data file used to compute the fixes when data-driven
+ * fixes are being considered. If this field is omitted the flag defaults to false.
*/
- public void edit_bulkFixes(List<String> included, BulkFixesConsumer consumer);
+ public void edit_bulkFixes(List<String> included, boolean inTestMode, BulkFixesConsumer consumer);
/**
* {@code edit.dartfix}
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 57cd829..47b9e8f 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -2191,6 +2191,18 @@
<tt>FILE_NOT_ANALYZED</tt> will be generated.
</p>
</field>
+ <field name="inTestMode" optional="true">
+ <ref>bool</ref>
+ <p>
+ A flag indicating whether the bulk fixes are being run in test mode.
+ The only difference is that in test mode the fix processor will look
+ for a configuration file that can modify the content of the data file
+ used to compute the fixes when data-driven fixes are being considered.
+ </p>
+ <p>
+ If this field is omitted the flag defaults to <tt>false</tt>.
+ </p>
+ </field>
</params>
<result>
<field name="edits">
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 7636ffc..4ad5e63 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -166,6 +166,7 @@
const String DIAGNOSTIC_RESPONSE_GET_SERVER_PORT_PORT = 'port';
const String EDIT_REQUEST_BULK_FIXES = 'edit.bulkFixes';
const String EDIT_REQUEST_BULK_FIXES_INCLUDED = 'included';
+const String EDIT_REQUEST_BULK_FIXES_IN_TEST_MODE = 'inTestMode';
const String EDIT_REQUEST_DARTFIX = 'edit.dartfix';
const String EDIT_REQUEST_DARTFIX_EXCLUDED_FIXES = 'excludedFixes';
const String EDIT_REQUEST_DARTFIX_INCLUDED = 'included';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index b9466f0..ca40968 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -7301,12 +7301,15 @@
///
/// {
/// "included": List<FilePath>
+/// "inTestMode": optional bool
/// }
///
/// Clients may not extend, implement or mix-in this class.
class EditBulkFixesParams implements RequestParams {
List<String> _included;
+ bool _inTestMode;
+
/// A list of the files and directories for which edits should be suggested.
///
/// If a request is made with a path that is invalid, e.g. is not absolute
@@ -7330,8 +7333,27 @@
_included = value;
}
- EditBulkFixesParams(List<String> included) {
+ /// A flag indicating whether the bulk fixes are being run in test mode. The
+ /// only difference is that in test mode the fix processor will look for a
+ /// configuration file that can modify the content of the data file used to
+ /// compute the fixes when data-driven fixes are being considered.
+ ///
+ /// If this field is omitted the flag defaults to false.
+ bool get inTestMode => _inTestMode;
+
+ /// A flag indicating whether the bulk fixes are being run in test mode. The
+ /// only difference is that in test mode the fix processor will look for a
+ /// configuration file that can modify the content of the data file used to
+ /// compute the fixes when data-driven fixes are being considered.
+ ///
+ /// If this field is omitted the flag defaults to false.
+ set inTestMode(bool value) {
+ _inTestMode = value;
+ }
+
+ EditBulkFixesParams(List<String> included, {bool inTestMode}) {
this.included = included;
+ this.inTestMode = inTestMode;
}
factory EditBulkFixesParams.fromJson(
@@ -7345,7 +7367,12 @@
} else {
throw jsonDecoder.mismatch(jsonPath, 'included');
}
- return EditBulkFixesParams(included);
+ bool inTestMode;
+ if (json.containsKey('inTestMode')) {
+ inTestMode = jsonDecoder.decodeBool(
+ jsonPath + '.inTestMode', json['inTestMode']);
+ }
+ return EditBulkFixesParams(included, inTestMode: inTestMode);
} else {
throw jsonDecoder.mismatch(jsonPath, 'edit.bulkFixes params', json);
}
@@ -7360,6 +7387,9 @@
Map<String, dynamic> toJson() {
var result = <String, dynamic>{};
result['included'] = included;
+ if (inTestMode != null) {
+ result['inTestMode'] = inTestMode;
+ }
return result;
}
@@ -7375,7 +7405,8 @@
bool operator ==(other) {
if (other is EditBulkFixesParams) {
return listEqual(
- included, other.included, (String a, String b) => a == b);
+ included, other.included, (String a, String b) => a == b) &&
+ inTestMode == other.inTestMode;
}
return false;
}
@@ -7384,6 +7415,7 @@
int get hashCode {
var hash = 0;
hash = JenkinsSmiHash.combine(hash, included.hashCode);
+ hash = JenkinsSmiHash.combine(hash, inTestMode.hashCode);
return JenkinsSmiHash.finish(hash);
}
}
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 4671618..2ed8e78 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -70,7 +70,6 @@
CompileTimeErrorCode.AMBIGUOUS_IMPORT,
CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH,
CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER,
- CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS,
CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR,
CompileTimeErrorCode.ASSIGNMENT_TO_CONST,
@@ -228,7 +227,6 @@
CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE,
CompileTimeErrorCode.INVALID_ANNOTATION,
CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
- CompileTimeErrorCode.INVALID_ANNOTATION_GETTER,
CompileTimeErrorCode.INVALID_ASSIGNMENT,
CompileTimeErrorCode.INVALID_CAST_FUNCTION,
CompileTimeErrorCode.INVALID_CAST_FUNCTION_EXPR,
diff --git a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
index 5dd6961..1799c09 100644
--- a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
@@ -3,70 +3,131 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/replacement_visitor.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/extensions.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type_system.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
import 'package:meta/meta.dart';
/// Replace every "top" type in a covariant position with [_bottomType].
/// Replace every "bottom" type in a contravariant position with [_topType].
-class ReplaceTopBottomVisitor extends ReplacementVisitor {
+class ReplaceTopBottomVisitor {
+ final TypeSystemImpl _typeSystem;
final DartType _topType;
final DartType _bottomType;
- final TypeSystemImpl _typeSystem;
-
- bool _isCovariant;
ReplaceTopBottomVisitor._(
this._typeSystem,
this._topType,
this._bottomType,
- this._isCovariant,
);
- @override
- void changeVariance() {
- _isCovariant = !_isCovariant;
- }
-
- @override
- DartType visitDynamicType(DynamicType type) {
- return _isCovariant ? _bottomType : null;
- }
-
- @override
- DartType visitInterfaceType(InterfaceType type) {
- if (_isCovariant) {
- if (_typeSystem.isTop(type)) {
- return _bottomType;
+ DartType process(DartType type, Variance variance) {
+ if (_typeSystem.isNonNullableByDefault) {
+ if (variance.isContravariant) {
+ // ...replacing every occurrence in `T` of a type `S` in a contravariant
+ // position where `S <: Never` by `Object?`
+ if (_typeSystem.isSubtypeOf2(type, NeverTypeImpl.instance)) {
+ return _topType;
+ }
+ } else {
+ // ...and every occurrence in `T` of a top type in a position which
+ // is not contravariant by `Never`.
+ if (_typeSystem.isTop(type)) {
+ return _bottomType;
+ }
}
} else {
- if (!_typeSystem.isNonNullableByDefault && type.isDartCoreNull) {
- return _topType;
+ if (variance.isCovariant) {
+ // ...replacing every occurrence in `T` of a top type in a covariant
+ // position by `Null`
+ if (_typeSystem.isTop(type)) {
+ return _bottomType;
+ }
+ } else if (variance.isContravariant) {
+ // ...and every occurrence in `T` of `Null` in a contravariant
+ // position by `Object`
+ if (type.isDartCoreNull) {
+ return _topType;
+ }
}
}
- return super.visitInterfaceType(type);
- }
-
- @override
- DartType visitNeverType(NeverType type) {
- return _isCovariant ? null : _topType;
- }
-
- @override
- DartType visitTypeParameterType(TypeParameterType type) {
- if (!_isCovariant && _typeSystem.isNonNullableByDefault) {
- if (_typeSystem.isSubtypeOf2(type, NeverTypeImpl.instance)) {
- return _typeSystem.objectQuestion;
- }
+ if (type.aliasElement != null) {
+ return _typeAliasInstantiation(type, variance);
+ } else if (type is InterfaceType) {
+ return _interfaceType(type, variance);
+ } else if (type is FunctionType) {
+ return _functionType(type, variance);
}
- return null;
+ return type;
}
- @override
- DartType visitVoidType(VoidType type) {
- return _isCovariant ? _bottomType : null;
+ DartType _functionType(FunctionType type, Variance variance) {
+ var newReturnType = process(type.returnType, variance);
+
+ var newParameters = type.parameters.map((parameter) {
+ return parameter.copyWith(
+ type: process(
+ parameter.type,
+ variance.combine(Variance.contravariant),
+ ),
+ );
+ }).toList();
+
+ return FunctionTypeImpl(
+ typeFormals: type.typeFormals,
+ parameters: newParameters,
+ returnType: newReturnType,
+ nullabilitySuffix: type.nullabilitySuffix,
+ );
+ }
+
+ DartType _interfaceType(InterfaceType type, Variance variance) {
+ var typeParameters = type.element.typeParameters;
+ if (typeParameters.isEmpty) {
+ return type;
+ }
+
+ var typeArguments = type.typeArguments;
+ assert(typeParameters.length == typeArguments.length);
+
+ var newTypeArguments = <DartType>[];
+ for (var i = 0; i < typeArguments.length; i++) {
+ var newTypeArgument = process(typeArguments[i], variance);
+ newTypeArguments.add(newTypeArgument);
+ }
+
+ return InterfaceTypeImpl(
+ element: type.element,
+ nullabilitySuffix: type.nullabilitySuffix,
+ typeArguments: newTypeArguments,
+ );
+ }
+
+ DartType _typeAliasInstantiation(DartType type, Variance variance) {
+ var aliasElement = type.aliasElement;
+ var aliasArguments = type.aliasArguments;
+
+ var typeParameters = aliasElement.typeParameters;
+ assert(typeParameters.length == aliasArguments.length);
+
+ var newTypeArguments = <DartType>[];
+ for (var i = 0; i < typeParameters.length; i++) {
+ var typeParameter = typeParameters[i] as TypeParameterElementImpl;
+ newTypeArguments.add(
+ process(
+ aliasArguments[i],
+ typeParameter.variance.combine(variance),
+ ),
+ );
+ }
+
+ return aliasElement.instantiate(
+ typeArguments: newTypeArguments,
+ nullabilitySuffix: type.nullabilitySuffix,
+ );
}
/// Runs an instance of the visitor on the given [type] and returns the
@@ -78,14 +139,7 @@
@required TypeSystemImpl typeSystem,
@required DartType type,
}) {
- var visitor = ReplaceTopBottomVisitor._(
- typeSystem,
- topType,
- bottomType,
- true,
- );
- var result = type.accept(visitor);
- assert(visitor._isCovariant == true);
- return result ?? type;
+ var visitor = ReplaceTopBottomVisitor._(typeSystem, topType, bottomType);
+ return visitor.process(type, Variance.covariant);
}
}
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 030afac..3671aa9 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -332,8 +332,43 @@
correction: "Try re-writing the expression to use the '~/' operator.");
/**
- * Duplicate hidden names.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a name occurs multiple times in
+ // a `hide` clause. Repeating the name is unnecessary.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the name `min` is
+ // hidden more than once:
+ //
+ // ```dart
+ // import 'dart:math' hide min, [!min!];
+ //
+ // var x = pi;
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the name was mistyped in one or more places, then correct the mistyped
+ // names:
+ //
+ // ```dart
+ // import 'dart:math' hide max, min;
+ //
+ // var x = pi;
+ // ```
+ //
+ // If the name wasn't mistyped, then remove the unnecessary name from the
+ // list:
+ //
+ // ```dart
+ // import 'dart:math' hide min;
+ //
+ // var x = pi;
+ // ```
static const HintCode DUPLICATE_HIDDEN_NAME =
HintCode('DUPLICATE_HIDDEN_NAME', "Duplicate hidden name.",
correction: "Try removing the repeated name from the list of hidden "
@@ -430,8 +465,43 @@
hasPublishedDocs: true);
/**
- * Duplicate shown names.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a name occurs multiple times in
+ // a `show` clause. Repeating the name is unnecessary.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the name `min` is shown
+ // more than once:
+ //
+ // ```dart
+ // import 'dart:math' show min, [!min!];
+ //
+ // var x = min(2, min(0, 1));
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the name was mistyped in one or more places, then correct the mistyped
+ // names:
+ //
+ // ```dart
+ // import 'dart:math' show max, min;
+ //
+ // var x = max(2, min(0, 1));
+ // ```
+ //
+ // If the name wasn't mistyped, then remove the unnecessary name from the
+ // list:
+ //
+ // ```dart
+ // import 'dart:math' show min;
+ //
+ // var x = min(2, min(0, 1));
+ // ```
static const HintCode DUPLICATE_SHOWN_NAME =
HintCode('DUPLICATE_SHOWN_NAME', "Duplicate shown name.",
correction: "Try removing the repeated name from the list of shown "
@@ -2555,25 +2625,50 @@
);
/**
- * Unnecessary type checks, the result is always false.
- *
* No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the value of a type check (using
+ // either `is` or `is!`) is known at compile time.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the test `a is Object?`
+ // is always `true`:
+ //
+ // ```dart
+ // bool f<T>(T a) => [!a is Object?!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the type check doesn't check what you intended to check, then change the
+ // test:
+ //
+ // ```dart
+ // bool f<T>(T a) => a is Object;
+ // ```
+ //
+ // If the type check does check what you intended to check, then replace the
+ // type check with its known value or completely remove it:
+ //
+ // ```dart
+ // bool f<T>(T a) => true;
+ // ```
static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = HintCode(
'UNNECESSARY_TYPE_CHECK',
- "Unnecessary type check, the result is always false.",
+ "Unnecessary type check; the result is always 'false'.",
correction: "Try correcting the type check, or removing the type check.",
uniqueName: 'UNNECESSARY_TYPE_CHECK_FALSE',
);
/**
- * Unnecessary type checks, the result is always true.
- *
* No parameters.
*/
static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = HintCode(
'UNNECESSARY_TYPE_CHECK',
- "Unnecessary type check, the result is always true.",
+ "Unnecessary type check; the result is always 'true'.",
correction: "Try correcting the type check, or removing the type check.",
uniqueName: 'UNNECESSARY_TYPE_CHECK_TRUE',
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index 274b269..6b31839 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -269,28 +269,15 @@
void _resolveAnnotationElementGetter(
Annotation annotation, PropertyAccessorElement accessorElement) {
- // accessor should be synthetic
- if (!accessorElement.isSynthetic) {
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.INVALID_ANNOTATION_GETTER, annotation);
- return;
- }
- // variable should be constant
+ // The accessor should be synthetic, the variable should be constant, and
+ // there should be no arguments.
VariableElement variableElement = accessorElement.variable;
- if (!variableElement.isConst) {
+ if (!accessorElement.isSynthetic ||
+ !variableElement.isConst ||
+ annotation.arguments != null) {
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.INVALID_ANNOTATION, annotation);
- return;
}
- // no arguments
- if (annotation.arguments != null) {
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS,
- annotation.name,
- [annotation.name]);
- }
- // OK
- return;
}
/// Given an [argumentList] and the [executableElement] that will be invoked
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 0e9748d..ceb0cb5 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -473,29 +473,6 @@
hasPublishedDocs: true);
/**
- * 15 Metadata: The constant expression given in an annotation is type checked
- * and evaluated in the scope surrounding the declaration being annotated.
- *
- * 16.12.2 Const: It is a compile-time error if <i>T</i> is not a class
- * accessible in the current scope, optionally followed by type arguments.
- *
- * 16.12.2 Const: If <i>e</i> is of the form <i>const T.id(a<sub>1</sub>,
- * …, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, …
- * x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a compile-time error if
- * <i>T</i> is not a class accessible in the current scope, optionally
- * followed by type arguments.
- *
- * Parameters:
- * 0: the name of the non-type element
- */
- static const CompileTimeErrorCode ANNOTATION_WITH_NON_CLASS =
- CompileTimeErrorCode(
- 'ANNOTATION_WITH_NON_CLASS', "The name '{0}' isn't a class.",
- correction: "Try importing the library that declares the class, "
- "correcting the name to match a defined class, or "
- "defining a class with the given name.");
-
- /**
* Parameters:
* 0: the name of the actual argument type
* 1: the name of the expected type
@@ -807,12 +784,50 @@
hasPublishedDocs: true);
/**
- * 12.18 Assignment: It is as static warning if an assignment of the form
- * <i>v = e</i> occurs inside a top level or static function (be it function,
- * method, getter, or setter) or variable initializer and there is neither a
- * local variable declaration with name <i>v</i> nor setter declaration with
- * name <i>v=</i> in the lexical scope enclosing the assignment.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the name of a function appears
+ // on the left-hand side of an assignment expression.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the assignment to the
+ // function `f` is invalid:
+ //
+ // ```dart
+ // void f() {}
+ //
+ // void g() {
+ // [!f!] = () {};
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the right-hand side should be assigned to something else, such as a
+ // local variable, then change the left-hand side:
+ //
+ // ```dart
+ // void f() {}
+ //
+ // void g() {
+ // var x = () {};
+ // print(x);
+ // }
+ // ```
+ //
+ // If the intent is to change the implementation of the function, then define
+ // a function-valued variable instead of a function:
+ //
+ // ```dart
+ // void Function() f = () {};
+ //
+ // void g() {
+ // f = () {};
+ // }
+ // ```
static const CompileTimeErrorCode ASSIGNMENT_TO_FUNCTION =
CompileTimeErrorCode(
'ASSIGNMENT_TO_FUNCTION', "Functions can't be assigned a value.");
@@ -848,25 +863,104 @@
hasPublishedDocs: true);
/**
- * 12.18 Assignment: It is as static warning if an assignment of the form
- * <i>v = e</i> occurs inside a top level or static function (be it function,
- * method, getter, or setter) or variable initializer and there is neither a
- * local variable declaration with name <i>v</i> nor setter declaration with
- * name <i>v=</i> in the lexical scope enclosing the assignment.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the name of a type name appears
+ // on the left-hand side of an assignment expression.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the assignment to the
+ // class `C` is invalid:
+ //
+ // ```dart
+ // class C {}
+ //
+ // void f() {
+ // [!C!] = null;
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the right-hand side should be assigned to something else, such as a
+ // local variable, then change the left-hand side:
+ //
+ // ```dart
+ // void f() {}
+ //
+ // void g() {
+ // var c = null;
+ // print(c);
+ // }
+ // ```
static const CompileTimeErrorCode ASSIGNMENT_TO_TYPE = CompileTimeErrorCode(
'ASSIGNMENT_TO_TYPE', "Types can't be assigned a value.");
/**
- * 17.6.3 Asynchronous For-in: It is a compile-time error if an asynchronous
- * for-in statement appears inside a synchronous function.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when an async for-in loop is found in
+ // a function or method whose body isn't marked as being either `async` or
+ // `async*`.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the body of `f` isn't
+ // marked as being either `async` or `async*`, but `f` contains an async
+ // for-in loop:
+ //
+ // ```dart
+ // void f(list) {
+ // await for (var e [!in!] list) {
+ // print(e);
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the function should return a `Future`, then mark the body with `async`:
+ //
+ // ```dart
+ // Future<void> f(list) async {
+ // await for (var e in list) {
+ // print(e);
+ // }
+ // }
+ // ```
+ //
+ // If the function should return a `Stream` of values, then mark the body with
+ // `async*`:
+ //
+ // ```dart
+ // Stream<void> f(list) async* {
+ // await for (var e in list) {
+ // print(e);
+ // }
+ // }
+ // ```
+ //
+ // If the function should be synchronous, then remove the `await` before the
+ // loop:
+ //
+ // ```dart
+ // void f(list) {
+ // for (var e in list) {
+ // print(e);
+ // }
+ // }
+ // ```
static const CompileTimeErrorCode ASYNC_FOR_IN_WRONG_CONTEXT =
CompileTimeErrorCode('ASYNC_FOR_IN_WRONG_CONTEXT',
- "The async for-in can only be used in an async function.",
+ "The async for-in loop can only be used in an async function.",
correction:
"Try marking the function body with either 'async' or 'async*', "
- "or removing the 'await' before the for loop.");
+ "or removing the 'await' before the for-in loop.");
/**
* No parameters.
@@ -1009,9 +1103,62 @@
"Try adding either a return or a throw statement at the end.",
hasPublishedDocs: true);
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a break in a case clause inside
+ // a switch statement has a label that is associated with another case clause.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the label `l` is
+ // associated with the case clause for `0`:
+ //
+ // ```dart
+ // void f(int i) {
+ // switch (i) {
+ // l: case 0:
+ // break;
+ // case 1:
+ // break [!l!];
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the intent is to transfer control to the statement after the switch,
+ // then remove the label from the break statement:
+ //
+ // ```dart
+ // void f(int i) {
+ // switch (i) {
+ // case 0:
+ // break;
+ // case 1:
+ // break;
+ // }
+ // }
+ // ```
+ //
+ // If the intent is to transfer control to a different case block, then use
+ // `continue` rather than `break`:
+ //
+ // ```dart
+ // void f(int i) {
+ // switch (i) {
+ // l: case 0:
+ // break;
+ // case 1:
+ // continue l;
+ // }
+ // }
+ // ```
static const CompileTimeErrorCode BREAK_LABEL_ON_SWITCH_MEMBER =
CompileTimeErrorCode('BREAK_LABEL_ON_SWITCH_MEMBER',
- "Break label resolves to case or default statement");
+ "A break label resolves to the 'case' or 'default' statement.");
/**
* Parameters:
@@ -1176,16 +1323,107 @@
hasPublishedDocs: true);
/**
- * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements
- * the operator <i>==</i>.
- *
* Parameters:
* 0: the this of the switch case expression
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the type of the expression
+ // following the keyword `case` has an implementation of the `==` operator
+ // other than the one in `Object`.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the expression
+ // following the keyword `case` (`C(0)`) has the type `C`, and the class `C`
+ // overrides the `==` operator:
+ //
+ // ```dart
+ // class C {
+ // final int value;
+ //
+ // const C(this.value);
+ //
+ // bool operator ==(Object other) {
+ // return false;
+ // }
+ // }
+ //
+ // void f(C c) {
+ // switch (c) {
+ // case [!C(0)!]:
+ // break;
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If there isn't a strong reason not to do so, then rewrite the code to use
+ // an if-else structure:
+ //
+ // ```dart
+ // class C {
+ // final int value;
+ //
+ // const C(this.value);
+ //
+ // bool operator ==(Object other) {
+ // return false;
+ // }
+ // }
+ //
+ // void f(C c) {
+ // if (c == C(0)) {
+ // // ...
+ // }
+ // }
+ // ```
+ //
+ // If you can't rewrite the switch statement and the implementation of `==`
+ // isn't necessary, then remove it:
+ //
+ // ```dart
+ // class C {
+ // final int value;
+ //
+ // const C(this.value);
+ // }
+ //
+ // void f(C c) {
+ // switch (c) {
+ // case C(0):
+ // break;
+ // }
+ // }
+ // ```
+ //
+ // If you can't rewrite the switch statement and you can't remove the
+ // definition of `==`, then find some other value that can be used to control
+ // the switch:
+ //
+ // ```dart
+ // class C {
+ // final int value;
+ //
+ // const C(this.value);
+ //
+ // bool operator ==(Object other) {
+ // return false;
+ // }
+ // }
+ //
+ // void f(C c) {
+ // switch (c.value) {
+ // case 0:
+ // break;
+ // }
+ // }
+ // ```
static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS =
CompileTimeErrorCode(
'CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
- "The switch case expression type '{0}' can't override the == "
+ "The switch case expression type '{0}' can't override the '==' "
"operator.");
/**
@@ -2306,9 +2544,56 @@
hasPublishedDocs: true);
/**
- * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly
- * specifies a default value for an optional parameter.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a factory constructor that
+ // redirects to another constructor specifies a default value for an optional
+ // parameter.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the factory constructor
+ // in `A` has a default value for the optional parameter `x`:
+ //
+ // ```dart
+ // class A {
+ // factory A([int [!x!] = 0]) = B;
+ // }
+ //
+ // class B implements A {
+ // B([int x = 1]) {}
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Remove the default value from the factory constructor:
+ //
+ // ```dart
+ // class A {
+ // factory A([int x]) = B;
+ // }
+ //
+ // class B implements A {
+ // B([int x = 1]) {}
+ // }
+ // ```
+ //
+ // Note that this fix might change the value used when the optional parameter
+ // is omitted. If that happens, and if that change is a problem, then consider
+ // making the optional parameter a required parameter in the factory method:
+ //
+ // ```dart
+ // class A {
+ // factory A(int x) = B;
+ // }
+ //
+ // class B implements A {
+ // B([int x = 1]) {}
+ // }
+ // ```
static const CompileTimeErrorCode
DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = CompileTimeErrorCode(
'DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR',
@@ -3521,13 +3806,39 @@
hasPublishedDocs: true);
/**
- * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
- * is a compile time error if more than one initializer corresponding to a
- * given instance variable appears in <i>k</i>'s list.
- *
* Parameters:
* 0: the name of the field being initialized multiple times
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the initializer list of a
+ // constructor initializes a field more than once. There is no value to allow
+ // both initializers because only the last value is preserved.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the field `f` is being
+ // initialized twice:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C() : f = 0, [!f!] = 1;
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Remove one of the initializers:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C() : f = 0;
+ // }
+ // ```
static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS =
CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS',
"The field '{0}' can't be initialized twice in the same constructor.",
@@ -3586,11 +3897,60 @@
hasPublishedDocs: true);
/**
- * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
- * is a compile time error if <i>k</i>'s initializer list contains an
- * initializer for a variable that is initialized by means of an initializing
- * formal of <i>k</i>.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a field is initialized in both
+ // the parameter list and in the initializer list of a constructor.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the field `f` is
+ // initialized both by a field formal parameter and in the initializer list:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f) : [!f!] = 0;
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the field should be initialized by the parameter, then remove the
+ // initialization in the initializer list:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f);
+ // }
+ // ```
+ //
+ // If the field should be initialized in the initializer list and the
+ // parameter isn't needed, then remove the parameter:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C() : f = 0;
+ // }
+ // ```
+ //
+ // If the field should be initialized in the initializer list and the
+ // parameter is needed, then make it a normal parameter:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(int g) : f = g * 2;
+ // }
+ // ```
static const CompileTimeErrorCode
FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = CompileTimeErrorCode(
'FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER',
@@ -3599,10 +3959,38 @@
correction: "Try removing one of the initializations.");
/**
- * 7.6.1 Generative Constructors: It is a compile-time error if an
- * initializing formal is used by a function other than a non-redirecting
- * generative constructor.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a factory constructor has a
+ // field formal parameter. Factory constructors can't assign values to fields
+ // because no instance is created; hence, there is no field to assign.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the factory constructor
+ // uses a field formal parameter:
+ //
+ // ```dart
+ // class C {
+ // int? f;
+ //
+ // factory C([!this.f!]) => throw 0;
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Replace the field formal parameter with a normal parameter:
+ //
+ // ```dart
+ // class C {
+ // int? f;
+ //
+ // factory C(int f) => throw 0;
+ // }
+ // ```
static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR =
CompileTimeErrorCode(
'FIELD_INITIALIZER_FACTORY_CONSTRUCTOR',
@@ -3675,27 +4063,139 @@
correction: "Try using a normal parameter.");
/**
- * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
- * in which case its only action is to invoke another generative constructor.
- *
- * 7.6.1 Generative Constructors: It is a compile-time error if an
- * initializing formal is used by a function other than a non-redirecting
- * generative constructor.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a redirecting constructor
+ // initializes a field in the object. This isn't allowed because the instance
+ // that has the field hasn't been created at the point at which it should be
+ // initialized.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the constructor
+ // `C.zero`, which redirects to the constructor `C`, has a field formal
+ // parameter that initializes the field `f`:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f);
+ //
+ // C.zero([!this.f!]) : this(f);
+ // }
+ // ```
+ //
+ // The following code produces this diagnostic because the constructor
+ // `C.zero`, which redirects to the constructor `C`, has an initializer that
+ // initializes the field `f`:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f);
+ //
+ // C.zero() : [!f = 0!], this(1);
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the initialization is done by a field formal parameter, then use a
+ // normal parameter:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f);
+ //
+ // C.zero(int f) : this(f);
+ // }
+ // ```
+ //
+ // If the initialization is done in an initializer, then remove the
+ // initializer:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f);
+ //
+ // C.zero() : this(0);
+ // }
+ // ```
static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR =
CompileTimeErrorCode('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR',
"The redirecting constructor can't have a field initializer.",
- correction: "Try using a normal parameter.");
+ correction:
+ "Try initializing the field in the constructor being redirected "
+ "to.");
/**
- * 7.6.1 Generative Constructors: An initializing formal has the form
- * <i>this.id</i>. It is a static warning if the static type of <i>id</i> is
- * not assignable to <i>T<sub>id</sub></i>.
- *
* Parameters:
* 0: the name of the type of the field formal parameter
* 1: the name of the type of the field
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the type of a field formal
+ // parameter isn't assignable to the type of the field being initialized.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the field formal
+ // parameter has the type `String`, but the type of the field is `int`. The
+ // parameter must have a type that is a subtype of the field's type.
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C([!String this.f!]);
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the type of the field is incorrect, then change the type of the field to
+ // match the type of the parameter, and consider removing the type from the
+ // parameter:
+ //
+ // ```dart
+ // class C {
+ // String f;
+ //
+ // C(this.f);
+ // }
+ // ```
+ //
+ // If the type of the parameter is incorrect, then remove the type of the
+ // parameter:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(this.f);
+ // }
+ // ```
+ //
+ // If the types of both the field and the parameter are correct, then use an
+ // initializer rather than a field formal parameter to convert the parameter
+ // value into a value of the correct type:
+ //
+ // ```dart
+ // class C {
+ // int f;
+ //
+ // C(String s) : f = int.parse(s);
+ // }
+ // ```
static const CompileTimeErrorCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE =
CompileTimeErrorCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE',
"The parameter type '{0}' is incompatible with the field type '{1}'.",
@@ -3703,13 +4203,50 @@
"changing the field's type.");
/**
- * 5. Variables: It is a static warning if a final instance variable that has
- * been initialized at its point of declaration is also initialized in a
- * constructor.
- *
* Parameters:
* 0: the name of the field in question
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a final field is initialized
+ // twice: once where it's declared and once by a constructor's parameter.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the field `f` is
+ // initialized twice:
+ //
+ // ```dart
+ // class C {
+ // final int f = 0;
+ //
+ // C(this.[!f!]);
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the field should have the same value for all instances, then remove the
+ // initialization in the parameter list:
+ //
+ // ```dart
+ // class C {
+ // final int f = 0;
+ //
+ // C();
+ // }
+ // ```
+ //
+ // If the field can have different values in different instances, then remove
+ // the initialization in the declaration:
+ //
+ // ```dart
+ // class C {
+ // final int f;
+ //
+ // C(this.f);
+ // }
+ // ```
static const CompileTimeErrorCode
FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = CompileTimeErrorCode(
'FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR',
@@ -5076,18 +5613,6 @@
"changing the import to not be deferred.");
/**
- * No parameters.
- */
- static const CompileTimeErrorCode INVALID_ANNOTATION_GETTER =
- CompileTimeErrorCode(
- 'INVALID_ANNOTATION',
- "Getters can't be used as annotations.",
- correction: "Try using a top-level variable or a field.",
- hasPublishedDocs: true,
- uniqueName: 'INVALID_ANNOTATION_GETTER',
- );
-
- /**
* Parameters:
* 0: the name of the right hand side type
* 1: the name of the left hand side type
@@ -5365,6 +5890,32 @@
"the immediately enclosing class.",
hasPublishedDocs: true);
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a generic function type has a
+ // function-valued parameter that is written using the older inline function
+ // type syntax.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the parameter `f`, in
+ // the generic function type used to define `F`, uses the inline function
+ // type syntax:
+ //
+ // ```dart
+ // typedef F = int Function(int f[!(!]String s));
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Use the generic function syntax for the parameter's type:
+ //
+ // ```dart
+ // typedef F = int Function(int Function(String));
+ // ```
static const CompileTimeErrorCode INVALID_INLINE_FUNCTION_TYPE =
CompileTimeErrorCode(
'INVALID_INLINE_FUNCTION_TYPE',
@@ -5895,19 +6446,58 @@
"Can't reference label '{0}' declared in an outer method.");
/**
- * 13.13 Break: It is a compile-time error if no such statement
- * <i>s<sub>E</sub></i> exists within the innermost function in which
- * <i>s<sub>b</sub></i> occurs.
- *
- * 13.14 Continue: It is a compile-time error if no such statement or case
- * clause <i>s<sub>E</sub></i> exists within the innermost function in which
- * <i>s<sub>c</sub></i> occurs.
- *
* Parameters:
* 0: the name of the unresolvable label
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it finds a reference to a label
+ // that isn't defined in the scope of the `break` or `continue` statement that
+ // is referencing it.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the label `loop` isn't
+ // defined anywhere:
+ //
+ // ```dart
+ // void f() {
+ // for (int i = 0; i < 10; i++) {
+ // for (int j = 0; j < 10; j++) {
+ // break [!loop!];
+ // }
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the label should be on the innermost enclosing `do`, `for`, `switch`, or
+ // `while` statement, then remove the label:
+ //
+ // ```dart
+ // void f() {
+ // for (int i = 0; i < 10; i++) {
+ // for (int j = 0; j < 10; j++) {
+ // break;
+ // }
+ // }
+ // }
+ // ```
+ //
+ // If the label should be on some other statement, then add the label:
+ //
+ // ```dart
+ // void f() {
+ // loop: for (int i = 0; i < 10; i++) {
+ // for (int j = 0; j < 10; j++) {
+ // break loop;
+ // }
+ // }
+ // }
+ // ```
static const CompileTimeErrorCode LABEL_UNDEFINED = CompileTimeErrorCode(
- 'LABEL_UNDEFINED', "Can't reference undefined label '{0}'.",
+ 'LABEL_UNDEFINED', "Can't reference an undefined label '{0}'.",
correction: "Try defining the label, or "
"correcting the name to match an existing label.");
@@ -6067,34 +6657,127 @@
/**
* No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the first positional parameter
+ // of a function named `main` isn't a supertype of `List<String>`.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because `List<int>` isn't a
+ // supertype of `List<String>`:
+ //
+ // ```dart
+ // void main([!List<int>!] args) {}
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the function is an entry point, then change the type of the first
+ // positional parameter to be a supertype of `List<String>`:
+ //
+ // ```dart
+ // void main(List<String> args) {}
+ // ```
+ //
+ // If the function isn't an entry point, then change the name of the function:
+ //
+ // ```dart
+ // void f(List<int> args) {}
+ // ```
static const CompileTimeErrorCode MAIN_FIRST_POSITIONAL_PARAMETER_TYPE =
CompileTimeErrorCode(
'MAIN_FIRST_POSITIONAL_PARAMETER_TYPE',
- "The type of the first positional parameter of the 'main' function "
- "must be a supertype of List<String>.",
+ "The type of the first positional parameter of the 'main' function must be "
+ "a supertype of 'List<String>'.",
correction: "Try changing the type of the parameter.",
);
/**
* No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a function named `main` has one
+ // or more required named parameters.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the function named
+ // `main` has a required named parameter (`x`):
+ //
+ // ```dart
+ // void [!main!]({required int x}) {}
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the function is an entry point, then remove the `required` keyword:
+ //
+ // ```dart
+ // void main({int? x}) {}
+ // ```
+ //
+ // If the function isn't an entry point, then change the name of the function:
+ //
+ // ```dart
+ // void f({required int x}) {}
+ // ```
static const CompileTimeErrorCode MAIN_HAS_REQUIRED_NAMED_PARAMETERS =
CompileTimeErrorCode(
'MAIN_HAS_REQUIRED_NAMED_PARAMETERS',
"The function 'main' can't have any required named parameters.",
- correction: "Try using a different name for the function, "
- "or removing the 'required' modifier.",
+ correction: "Try using a different name for the function, or removing the "
+ "'required' modifier.",
);
/**
* No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a function named `main` has more
+ // than two required positional parameters.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the function `main` has
+ // three required positional parameters:
+ //
+ // ```dart
+ // void [!main!](List<String> args, int x, int y) {}
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the function is an entry point and the extra parameters aren't used,
+ // then remove them:
+ //
+ // ```dart
+ // void main(List<String> args, int x) {}
+ // ```
+ //
+ // If the function is an entry point, but the extra parameters used are for
+ // when the function isn't being used as an entry point, then make the extra
+ // parameters optional:
+ //
+ // ```dart
+ // void main(List<String> args, int x, [int y = 0]) {}
+ // ```
+ //
+ // If the function isn't an entry point, then change the name of the function:
+ //
+ // ```dart
+ // void f(List<String> args, int x, int y) {}
+ // ```
static const CompileTimeErrorCode
MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS = CompileTimeErrorCode(
'MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS',
- "The function 'main' can't have more than two required positional parameters.",
- correction: "Try using a different name for the function, "
- "or removing extra parameters.",
+ "The function 'main' can't have more than two required positional "
+ "parameters.",
+ correction:
+ "Try using a different name for the function, or removing extra "
+ "parameters.",
);
/**
@@ -7681,6 +8364,55 @@
"superinitializer or changing the superclass constructor '{2}' "
"to not be a factory constructor.");
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the body of a factory
+ // constructor is marked with `async`, `async*`, or `sync*`. All constructors,
+ // including factory constructors, are required to return an instance of the
+ // class in which they're declared, not a `Future`, `Stream`, or `Iterator`.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the body of the factory
+ // constructor is marked with `async`:
+ //
+ // ```dart
+ // class C {
+ // factory C() [!async!] {
+ // return C._();
+ // }
+ // C._();
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the member must be declared as a factory constructor, then remove the
+ // keyword appearing before the body:
+ //
+ // ```dart
+ // class C {
+ // factory C() {
+ // return C._();
+ // }
+ // C._();
+ // }
+ // ```
+ //
+ // If the member must return something other than an instance of the enclosing
+ // class, then make the member a static method:
+ //
+ // ```dart
+ // class C {
+ // static Future<C> m() async {
+ // return C._();
+ // }
+ // C._();
+ // }
+ // ```
static const CompileTimeErrorCode NON_SYNC_FACTORY = CompileTimeErrorCode(
'NON_SYNC_FACTORY',
"Factory bodies can't use 'async', 'async*', or 'sync*'.");
@@ -8381,17 +9113,53 @@
"The class 'Object' can't extend any other class.");
/**
- * 10.10 Superinterfaces: It is a compile-time error if two elements in the
- * type list of the implements clause of a class `C` specifies the same
- * type `T`.
- *
* Parameters:
* 0: the name of the interface that is implemented more than once
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the same type is listed in the
+ // superclass constraints of a mixin multiple times.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because `A` is included twice
+ // in the superclass constraints for `M`:
+ //
+ // ```dart
+ // mixin M on A, [!A!] {
+ // }
+ //
+ // class A {}
+ // class B {}
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If a different type should be included in the superclass constraints, then
+ // replace one of the occurrences with the other type:
+ //
+ // ```dart
+ // mixin M on A, B {
+ // }
+ //
+ // class A {}
+ // class B {}
+ // ```
+ //
+ // If no other type was intended, then remove the repeated type name:
+ //
+ // ```dart
+ // mixin M on A {
+ // }
+ //
+ // class A {}
+ // class B {}
+ // ```
static const CompileTimeErrorCode ON_REPEATED = CompileTimeErrorCode(
'ON_REPEATED',
- "'{0}' can only be used in super-class constraints only once.",
- correction: "Try removing all but one occurrence of the class name.");
+ "The type '{0}' can be included in the superclass constraints only once.",
+ correction: "Try removing all except one occurrence of the type name.");
/**
* 7.1.1 Operators: It is a compile-time error to declare an optional
@@ -8636,9 +9404,33 @@
correction: "Try removing '{1}' from the 'with' clause.");
/**
- * 6.2.2 Optional Formals: It is a compile-time error if the name of a named
- * optional parameter begins with an '_' character.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the name of a named parameter
+ // starts with an underscore.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the named parameter
+ // `_x` starts with an underscore:
+ //
+ // ```dart
+ // class C {
+ // void m({int [!_x!] = 0}) {}
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Rename the parameter so that it doesn't start with an underscore:
+ //
+ // ```dart
+ // class C {
+ // void m({int x = 0}) {}
+ // }
+ // ```
static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER =
CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER',
"Named parameters can't start with an underscore.");
@@ -8658,16 +9450,39 @@
);
/**
- * 12.1 Constants: It is a compile-time error if the value of a compile-time
- * constant expression depends on itself.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the value of a compile-time
+ // constant is defined in terms of itself, either directly or indirectly,
+ // creating an infinite loop.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic twice because both of the
+ // constants are defined in terms of the other:
+ //
+ // ```dart
+ // const [!secondsPerHour!] = minutesPerHour * 60;
+ // const [!minutesPerHour!] = secondsPerHour / 60;
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Break the cycle by finding an alternative way of defining at least one of
+ // the constants:
+ //
+ // ```dart
+ // const secondsPerHour = minutesPerHour * 60;
+ // const minutesPerHour = 60;
+ // ```
static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT =
CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT',
- "Compile-time constant expression depends on itself.");
+ "The compile-time constant expression depends on itself.");
/**
- * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
- * in which case its only action is to invoke another generative constructor.
+ * No parameters.
*
* TODO(scheglov) review this later, there are no explicit "it is a
* compile-time error" in specification. But it was added to the co19 and
@@ -8675,6 +9490,89 @@
*
* https://code.google.com/p/dart/issues/detail?id=954
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a constructor redirects to
+ // itself, either directly or indirectly, creating an infinite loop.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the generative
+ // constructors `C.a` and `C.b` each redirect to the other:
+ //
+ // ```dart
+ // class C {
+ // C.a() : [!this.b()!];
+ // C.b() : [!this.a()!];
+ // }
+ // ```
+ //
+ // The following code produces this diagnostic because the factory
+ // constructors `A` and `B` each redirect to the other:
+ //
+ // ```dart
+ // abstract class A {
+ // factory A() = [!B!];
+ // }
+ // class B implements A {
+ // factory B() = [!A!];
+ // B.named();
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // In the case of generative constructors, break the cycle by finding defining
+ // at least one of the constructors to not redirect to another constructor:
+ //
+ // ```dart
+ // class C {
+ // C.a() : this.b();
+ // C.b();
+ // }
+ // ```
+ //
+ // In the case of factory constructors, break the cycle by defining at least
+ // one of the factory constructors to do one of the following:
+ //
+ // - Redirect to a generative constructor:
+ //
+ // ```dart
+ // abstract class A {
+ // factory A() = B;
+ // }
+ // class B implements A {
+ // factory B() = B.named;
+ // B.named();
+ // }
+ // ```
+ //
+ // - Not redirect to another constructor:
+ //
+ // ```dart
+ // abstract class A {
+ // factory A() = B;
+ // }
+ // class B implements A {
+ // factory B() {
+ // return B.named();
+ // }
+ //
+ // B.named();
+ // }
+ // ```
+ //
+ // - Not be a factory constructor:
+ //
+ // ```dart
+ // abstract class A {
+ // factory A() = B;
+ // }
+ // class B implements A {
+ // B();
+ // B.named();
+ // }
+ // ```
static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT =
CompileTimeErrorCode(
'RECURSIVE_CONSTRUCTOR_REDIRECT',
@@ -8684,9 +9582,7 @@
'redirect.');
/**
- * 7.6.2 Factories: It is a compile-time error if a redirecting factory
- * constructor redirects to itself, either directly or indirectly via a
- * sequence of redirections.
+ * No parameters.
*/
static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT =
CompileTimeErrorCode(
@@ -8694,8 +9590,8 @@
"Constructors can't redirect to themselves either directly or "
"indirectly.",
uniqueName: 'RECURSIVE_FACTORY_REDIRECT',
- correction: 'Try changing one of the constructors in the loop to '
- 'redirect to a non-factory constructor.');
+ correction: 'Try changing one of the constructors in the loop to not '
+ 'redirect.');
/**
* 7.10 Superinterfaces: It is a compile-time error if the interface of a
@@ -8775,10 +9671,43 @@
"'{0}' can't use itself as a mixin.");
/**
- * 7.6.1 Generative constructors: A generative constructor may be
- * <i>redirecting</i>, in which case its only action is to invoke another
- * generative constructor.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a generative constructor
+ // redirects to a constructor that isn't defined.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the constructor `C.a`
+ // redirects to the constructor `C.b`, but `C.b` isn't defined:
+ //
+ // ```dart
+ // class C {
+ // C.a() : [!this.b()!];
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the missing constructor must be called, then define it:
+ //
+ // ```dart
+ // class C {
+ // C.a() : this.b();
+ // C.b();
+ // }
+ // ```
+ //
+ // If the missing constructor doesn't need to be called, then remove the
+ // redirect:
+ //
+ // ```dart
+ // class C {
+ // C.a();
+ // }
+ // ```
static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR =
CompileTimeErrorCode('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR',
"The constructor '{0}' couldn't be found in '{1}'.",
@@ -8786,14 +9715,50 @@
"defining the constructor named '{0}'.");
/**
- * 7.6.1 Generative constructors: A generative constructor may be
- * <i>redirecting</i>, in which case its only action is to invoke another
- * generative constructor.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a generative constructor
+ // redirects to a factory constructor.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the generative
+ // constructor `C.a` redirects to the factory constructor `C.b`:
+ //
+ // ```dart
+ // class C {
+ // C.a() : [!this.b()!];
+ // factory C.b() => C.a();
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the generative constructor doesn't need to redirect to another
+ // constructor, then remove the redirect.
+ //
+ // ```dart
+ // class C {
+ // C.a();
+ // factory C.b() => C.a();
+ // }
+ // ```
+ //
+ // If the generative constructor must redirect to another constructor, then
+ // make the other constructor be a generative (non-factory) constructor:
+ //
+ // ```dart
+ // class C {
+ // C.a() : this.b();
+ // C.b();
+ // }
+ // ```
static const CompileTimeErrorCode
REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = CompileTimeErrorCode(
'REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR',
- "Generative constructor can't redirect to a factory constructor.",
+ "Generative constructors can't redirect to a factory constructor.",
correction: "Try redirecting to a different constructor.");
/**
@@ -9009,13 +9974,50 @@
hasPublishedDocs: true);
/**
- * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with
- * the const modifier but <i>k'</i> is not a constant constructor.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a constructor marked as `const`
+ // redirects to a constructor that isn't marked as `const`.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the constructor `C.a`
+ // is marked as `const` but redirects to the constructor `C.b`, which isn't:
+ //
+ // ```dart
+ // class C {
+ // const C.a() : this.[!b!]();
+ // C.b();
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the non-constant constructor can be marked as `const`, then mark it as
+ // `const`:
+ //
+ // ```dart
+ // class C {
+ // const C.a() : this.b();
+ // const C.b();
+ // }
+ // ```
+ //
+ // If the non-constant constructor can't be marked as `const`, then either
+ // remove the redirect or remove `const` from the redirecting constructor:
+ //
+ // ```dart
+ // class C {
+ // C.a() : this.b();
+ // C.b();
+ // }
+ // ```
static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR =
CompileTimeErrorCode(
'REDIRECT_TO_NON_CONST_CONSTRUCTOR',
- "Constant redirecting constructor can't redirect to a non-constant "
+ "A constant redirecting constructor can't redirect to a non-constant "
"constructor.",
correction: "Try redirecting to a different constructor.");
@@ -9092,12 +10094,52 @@
hasPublishedDocs: true);
/**
- * 12.8.1 Rethrow: It is a compile-time error if an expression of the form
- * <i>rethrow;</i> is not enclosed within a on-catch clause.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a `rethrow` statement is outside
+ // a `catch` clause. The `rethrow` statement is used to throw a caught
+ // exception again, but there's no caught exception outside of a `catch`
+ // clause.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the`rethrow` statement
+ // is outside of a `catch` clause:
+ //
+ // ```dart
+ // void f() {
+ // [!rethrow!];
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If you're trying to rethrow an exception, then wrap the `rethrow` statement
+ // in a `catch` clause:
+ //
+ // ```dart
+ // void f() {
+ // try {
+ // // ...
+ // } catch (exception) {
+ // rethrow;
+ // }
+ // }
+ // ```
+ //
+ // If you're trying to throw a new exception, then replace the `rethrow`
+ // statement with a `throw` expression:
+ //
+ // ```dart
+ // void f() {
+ // throw UnsupportedError('Not yet implemented');
+ // }
+ // ```
static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH =
- CompileTimeErrorCode(
- 'RETHROW_OUTSIDE_CATCH', "Rethrow must be inside of catch clause.",
+ CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH',
+ "A rethrow must be inside of a catch clause.",
correction:
"Try moving the expression into a catch clause, or using a "
"'throw' expression.");
@@ -9326,9 +10368,46 @@
"The element type '{0}' can't be assigned to the set type '{1}'.");
/**
- * 14.1 Imports: It is a compile-time error if a prefix used in a deferred
- * import is used in another import clause.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a prefix in a deferred import is
+ // also used as a prefix in other imports (whether deferred or not). The
+ // prefix in a deferred import can't be shared with other imports because the
+ // prefix is used to load the imported library.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the prefix `x` is used
+ // as the prefix for a deferred import and is also used for one other import:
+ //
+ // ```dart
+ // import 'dart:math' [!deferred!] as x;
+ // import 'dart:convert' as x;
+ //
+ // var y = x.json.encode(x.min(0, 1));
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If you can use a different name for the deferred import, then do so:
+ //
+ // ```dart
+ // import 'dart:math' deferred as math;
+ // import 'dart:convert' as x;
+ //
+ // var y = x.json.encode(math.min(0, 1));
+ // ```
+ //
+ // If you can use a different name for the other imports, then do so:
+ //
+ // ```dart
+ // import 'dart:math' deferred as x;
+ // import 'dart:convert' as convert;
+ //
+ // var y = convert.json.encode(x.min(0, 1));
+ // ```
static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX =
CompileTimeErrorCode(
'SHARED_DEFERRED_PREFIX',
@@ -9466,9 +10545,37 @@
hasPublishedDocs: true);
/**
- * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
- * in which case its only action is to invoke another generative constructor.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a constructor that redirects to
+ // another constructor also attempts to invoke a constructor from the
+ // superclass. The superclass constructor will be invoked when the constructor
+ // that the redirecting constructor is redirected to is invoked.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the constructor `C.a`
+ // both redirects to `C.b` and invokes a constructor from the superclass:
+ //
+ // ```dart
+ // class C {
+ // C.a() : this.b(), [!super()!];
+ // C.b();
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Remove the invocation of the `super` constructor:
+ //
+ // ```dart
+ // class C {
+ // C.a() : this.b();
+ // C.b();
+ // }
+ // ```
static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR =
CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR',
"The redirecting constructor can't have a 'super' initializer.");
@@ -9666,13 +10773,45 @@
hasPublishedDocs: true);
/**
- * 10 Generics: However, a type parameter is considered to be a malformed type
- * when referenced by a static member.
- *
- * 15.1 Static Types: Any use of a malformed type gives rise to a static
- * warning. A malformed type is then interpreted as dynamic by the static type
- * checker and the runtime.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a static member references a
+ // type parameter that is declared for the class. Type parameters only have
+ // meaning for instances of the class.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the static method
+ // `hasType` has a reference to the type parameter `T`:
+ //
+ // ```dart
+ // class C<T> {
+ // static bool hasType(Object o) => o is [!T!];
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the member can be an instance member, then remove the keyword `static`:
+ //
+ // ```dart
+ // class C<T> {
+ // bool hasType(Object o) => o is T;
+ // }
+ // ```
+ //
+ // If the member must be a static member, then make the member be generic:
+ //
+ // ```dart
+ // class C<T> {
+ // static bool hasType<S>(Object o) => o is S;
+ // }
+ // ```
+ //
+ // Note, however, that there isn’t a relationship between `T` and `S`, so this
+ // second option changes the semantics from what was likely to be intended.
static const CompileTimeErrorCode TYPE_PARAMETER_REFERENCED_BY_STATIC =
CompileTimeErrorCode('TYPE_PARAMETER_REFERENCED_BY_STATIC',
"Static members can't reference type parameters of the class.",
@@ -10934,9 +12073,6 @@
);
/**
- * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
- * not have an accessible (3.2) instance member named <i>m</i>.
- *
* This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used
* when we are able to find the name defined in a supertype. It exists to
* provide a more informative error message.
@@ -10944,6 +12080,42 @@
* Parameters:
* 0: the name of the defining type
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when code in one class references a
+ // static member in a superclass without prefixing the member's name with the
+ // name of the superclass. Static members can only be referenced without a
+ // prefix in the class in which they're declared.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the static field `x` is
+ // referenced in the getter `g` without prefixing it with the name of the
+ // defining class:
+ //
+ // ```dart
+ // class A {
+ // static int x = 3;
+ // }
+ //
+ // class B extends A {
+ // int get g => [!x!];
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Prefix the name of the static member with the name of the declaring class:
+ //
+ // ```dart
+ // class A {
+ // static int x = 3;
+ // }
+ //
+ // class B extends A {
+ // int get g => A.x;
+ // }
+ // ```
static const CompileTimeErrorCode
UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = CompileTimeErrorCode(
'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
@@ -11090,16 +12262,36 @@
hasPublishedDocs: true);
/**
- * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time
- * constant, or if <i>x</i> involves string interpolation.
- *
- * 14.3 Parts: It is a compile-time error if <i>s</i> is not a compile-time
- * constant, or if <i>s</i> involves string interpolation.
- *
- * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that
- * describes a URI is not a compile-time constant, or if <i>x</i> involves
- * string interpolation.
+ * No parameters.
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the string literal in an
+ // `import`, `export`, or `part` directive contains an interpolation. The
+ // resolution of the URIs in directives must happen before the declarations
+ // are compiled, so expressions can’t be evaluated while determining the
+ // values of the URIs.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the string in the
+ // `import` directive contains an interpolation:
+ //
+ // ```dart
+ // import [!'dart:$m'!];
+ //
+ // const m = 'math';
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Remove the interpolation from the URI:
+ //
+ // ```dart
+ // import 'dart:math';
+ //
+ // var zero = min(0, 0);
+ // ```
static const CompileTimeErrorCode URI_WITH_INTERPOLATION =
CompileTimeErrorCode(
'URI_WITH_INTERPOLATION', "URIs can't use string interpolation.");
@@ -11521,23 +12713,48 @@
"Try adding 'async*' or 'sync*' to the enclosing function.");
/**
- * 17.16.1 Yield: Let T be the static type of e [the expression to the right
- * of "yield"] and let f be the immediately enclosing function. It is a
- * static type warning if either:
- *
- * - the body of f is marked async* and the type Stream<T> may not be
- * assigned to the declared return type of f.
- *
- * - the body of f is marked sync* and the type Iterable<T> may not be
- * assigned to the declared return type of f.
- *
- * 17.16.2 Yield-Each: Let T be the static type of e [the expression to the
- * right of "yield*"] and let f be the immediately enclosing function. It is
- * a static type warning if T may not be assigned to the declared return type
- * of f. If f is synchronous it is a static type warning if T may not be
- * assigned to Iterable. If f is asynchronous it is a static type warning if
- * T may not be assigned to Stream.
+ * Parameters:
+ * 0: the type of the expression after `yield`
+ * 1: the return type of the function containing the `yield`
*/
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the type of object produced by a
+ // `yield` expression doesn't match the type of objects that are to be
+ // returned from the `Iterable` or `Stream` types that are returned from a
+ // generator (a function or method marked with either `sync*` or `async*`).
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the getter `zero` is
+ // declared to return an `Iterable` that returns integers, but the `yield` is
+ // returning a string from the iterable:
+ //
+ // ```dart
+ // Iterable<int> get zero sync* {
+ // yield [!'0'!];
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the return type of the function is correct, then fix the expression
+ // following the keyword `yield` to return the correct type:
+ //
+ // ```dart
+ // Iterable<int> get zero sync* {
+ // yield 0;
+ // }
+ // ```
+ //
+ // If the expression following the `yield` is correct, then change the return
+ // type of the function to allow it:
+ //
+ // ```dart
+ // Iterable<String> get zero sync* {
+ // yield '0';
+ // }
+ // ```
static const CompileTimeErrorCode YIELD_OF_INVALID_TYPE =
CompileTimeErrorCode(
'YIELD_OF_INVALID_TYPE',
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index d4b507a..cdcbe34 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -203,46 +203,88 @@
return;
}
- // iterate over each bounded type parameter and corresponding argument
- NodeList<TypeAnnotation> argumentNodes = typeName.typeArguments?.arguments;
- int loopThroughIndex =
- math.min(typeArguments.length, typeParameters.length);
- bool shouldSubstitute = typeArguments.isNotEmpty;
- for (int i = 0; i < loopThroughIndex; i++) {
- DartType argType = typeArguments[i];
- TypeAnnotation argumentNode =
- argumentNodes != null && i < argumentNodes.length
- ? argumentNodes[i]
- : typeName;
- if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
+ if (typeParameters.isEmpty) {
+ return;
+ }
+
+ // Check for regular-bounded.
+ List<_TypeArgumentIssue> issues;
+ var substitution = Substitution.fromPairs(typeParameters, typeArguments);
+ for (var i = 0; i < typeArguments.length; i++) {
+ var typeParameter = typeParameters[i];
+ var typeArgument = typeArguments[i];
+
+ if (typeArgument is FunctionType && typeArgument.typeFormals.isNotEmpty) {
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
- argumentNode,
+ _typeArgumentErrorNode(typeName, i),
);
continue;
}
- DartType boundType = typeParameters[i].bound;
- if (argType != null && boundType != null) {
- boundType = _libraryElement.toLegacyTypeIfOptOut(boundType);
- if (shouldSubstitute) {
- boundType = Substitution.fromPairs(typeParameters, typeArguments)
- .substituteType(boundType);
- }
- if (!_typeSystem.isSubtypeOf2(argType, boundType)) {
- if (_shouldAllowSuperBoundedTypes(typeName)) {
- var replacedType = _typeSystem.replaceTopAndBottom(argType);
- if (!identical(replacedType, argType) &&
- _typeSystem.isSubtypeOf2(replacedType, boundType)) {
- // Bound is satisfied under super-bounded rules, so we're ok.
- continue;
- }
- }
- _errorReporter.reportErrorForNode(
- CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
- argumentNode,
- [argType, boundType]);
- }
+ var bound = typeParameter.bound;
+ if (bound == null) {
+ continue;
+ }
+
+ bound = _libraryElement.toLegacyTypeIfOptOut(bound);
+ bound = substitution.substituteType(bound);
+
+ if (!_typeSystem.isSubtypeOf2(typeArgument, bound)) {
+ issues ??= <_TypeArgumentIssue>[];
+ issues.add(
+ _TypeArgumentIssue(i, typeParameter, typeArgument),
+ );
+ }
+ }
+
+ // If regular-bounded, we are done.
+ if (issues == null) {
+ return;
+ }
+
+ // If not allowed to be super-bounded, report issues.
+ if (!_shouldAllowSuperBoundedTypes(typeName)) {
+ for (var issue in issues) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+ _typeArgumentErrorNode(typeName, issue.index),
+ [issue.argument, issue.parameter],
+ );
+ }
+ return;
+ }
+
+ // Prepare type arguments for checking for super-bounded.
+ type = _typeSystem.replaceTopAndBottom(type);
+ if (type.aliasElement != null) {
+ typeArguments = type.aliasArguments;
+ } else if (type is InterfaceType) {
+ typeArguments = type.typeArguments;
+ } else {
+ return;
+ }
+
+ // Check for super-bounded.
+ substitution = Substitution.fromPairs(typeParameters, typeArguments);
+ for (var i = 0; i < typeArguments.length; i++) {
+ var typeParameter = typeParameters[i];
+ var typeArgument = typeArguments[i];
+
+ var bound = typeParameter.bound;
+ if (bound == null) {
+ continue;
+ }
+
+ bound = _libraryElement.toLegacyTypeIfOptOut(bound);
+ bound = substitution.substituteType(bound);
+
+ if (!_typeSystem.isSubtypeOf2(typeArgument, bound)) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+ _typeArgumentErrorNode(typeName, i),
+ [typeArgument, bound],
+ );
}
}
}
@@ -396,4 +438,32 @@
if (parent is ImplementsClause) return false;
return true;
}
+
+ /// Return the type arguments at [index] from [node], or the [node] itself.
+ static TypeAnnotation _typeArgumentErrorNode(TypeName node, int index) {
+ var typeArguments = node.typeArguments?.arguments;
+ if (typeArguments != null && index < typeArguments.length) {
+ return typeArguments[index];
+ }
+ return node;
+ }
+}
+
+class _TypeArgumentIssue {
+ /// The index for type argument within the passed type arguments.
+ final int index;
+
+ /// The type parameter with the bound that was violated.
+ final TypeParameterElement parameter;
+
+ /// The type argument that violated the bound.
+ final DartType argument;
+
+ _TypeArgumentIssue(this.index, this.parameter, this.argument);
+
+ @override
+ String toString() {
+ return 'TypeArgumentIssue(index=$index, parameter=$parameter, '
+ 'argument=$argument)';
+ }
}
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 5007cde..88fe551 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -224,6 +224,13 @@
abstract class Encoding {}
class JsonDecoder extends Converter<String, Object> {}
+
+const JsonCodec json = JsonCodec();
+
+class JsonCodec {
+ const JsonCodec();
+ String encode(Object? value, {Object? toEncodable(dynamic object)?}) => '';
+}
''',
)
],
@@ -572,6 +579,10 @@
class Type {}
+class UnsupportedError {
+ UnsupportedError(String message);
+}
+
class Uri {
static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
return null;
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 11c4578..eb9c936 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -3497,6 +3497,7 @@
class D extends C {}
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 69, 1),
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 69, 1),
]);
}
@@ -3542,11 +3543,13 @@
}
test_instantiateToBounds_class_error_typedef() async {
- await assertNoErrorsInCode(r'''
+ await assertErrorsInCode(r'''
typedef T F<T>(T x);
class C<T extends F<T>> {}
C c;
-''');
+''', [
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 48, 1),
+ ]);
_assertTopVarType('c', 'C<dynamic Function(dynamic)>');
}
diff --git a/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart b/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
index 4851abd..ea0ffef 100644
--- a/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
+++ b/pkg/analyzer/test/src/dart/element/replace_top_bottom_test.dart
@@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -36,6 +38,10 @@
_check(dynamicNone, 'Null*');
_check(voidNone, 'Null*');
+ _check(listStar(objectStar), 'List<Null*>*');
+ _check(listStar(dynamicNone), 'List<Null*>*');
+ _check(listStar(voidNone), 'List<Null*>*');
+
_check(futureOrStar(objectStar), 'Null*');
_check(futureOrStar(dynamicNone), 'Null*');
_check(futureOrStar(voidNone), 'Null*');
@@ -53,6 +59,7 @@
typeStr: 'int* Function(int* Function(Object*)*)*',
);
+ _check(intStar, 'int*');
_check(listStar(intStar), 'List<int*>*');
}
@@ -98,12 +105,17 @@
);
}
- test_covariant_top() {
+ test_notContravariant_covariant_top() {
_check(objectQuestion, 'Never');
_check(objectStar, 'Never');
_check(dynamicNone, 'Never');
_check(voidNone, 'Never');
+ _check(listNone(objectQuestion), 'List<Never>');
+ _check(listNone(objectStar), 'List<Never>');
+ _check(listNone(dynamicNone), 'List<Never>');
+ _check(listNone(voidNone), 'List<Never>');
+
_check(futureOrNone(objectQuestion), 'Never');
_check(futureOrNone(objectStar), 'Never');
_check(futureOrNone(dynamicNone), 'Never');
@@ -122,12 +134,35 @@
typeStr: 'int Function(int Function(Object?))',
);
+ _check(intNone, 'int');
+ _check(intQuestion, 'int?');
+
_check(listNone(intNone), 'List<int>');
_check(listNone(intQuestion), 'List<int?>');
_check(listQuestion(intNone), 'List<int>?');
_check(listQuestion(intQuestion), 'List<int?>?');
}
+ test_notContravariant_invariant() {
+ // typedef F<T> = T Function(T);
+ var T = typeParameter('T', variance: Variance.invariant);
+ var T_none = typeParameterTypeNone(T);
+ var F = typeAlias(
+ name: 'F',
+ typeParameters: [T],
+ aliasedType: functionTypeNone(
+ returnType: T_none,
+ parameters: [requiredParameter(type: T_none)],
+ ),
+ );
+
+ var F_dynamic = F.instantiate(
+ typeArguments: [dynamicNone],
+ nullabilitySuffix: NullabilitySuffix.none,
+ );
+ _check(F_dynamic, 'Never Function(Never)');
+ }
+
void _check(DartType type, String expectedStr, {String typeStr}) {
NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
if (typeStr != null) {
diff --git a/pkg/analyzer/test/src/diagnostics/annotation_with_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/annotation_with_non_class_test.dart
deleted file mode 100644
index c98e73c..0000000
--- a/pkg/analyzer/test/src/diagnostics/annotation_with_non_class_test.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-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(AnnotationWithNonClassTest);
- });
-}
-
-@reflectiveTest
-class AnnotationWithNonClassTest extends PubPackageResolutionTest {
- test_instance() async {
- await assertErrorsInCode('''
-class Property {
- final int value;
- const Property(this.value);
-}
-
-const Property property = const Property(42);
-
-@property(123)
-main() {
-}
-''', [
- error(CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS, 117, 8),
- ]);
- }
-
- test_prefixed() async {
- newFile('$testPackageLibPath/annotations.dart', content: r'''
-class Property {
- final int value;
- const Property(this.value);
-}
-
-const Property property = const Property(42);
-''');
- await assertErrorsInCode('''
-import 'annotations.dart' as pref;
-@pref.property(123)
-main() {
-}
-''', [
- error(CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS, 36, 13),
- ]);
- }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
index 951fcbd..2f7f2c3 100644
--- a/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
@@ -33,8 +33,9 @@
}
''', [
error(CompileTimeErrorCode.COULD_NOT_INFER, 154, 3),
- error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 154, 1),
error(CompileTimeErrorCode.COULD_NOT_INFER, 154, 3),
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 154, 1),
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 154, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_getter_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_getter_test.dart
deleted file mode 100644
index 9963bea..0000000
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_getter_test.dart
+++ /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.
-
-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(InvalidAnnotationGetterTest);
- });
-}
-
-@reflectiveTest
-class InvalidAnnotationGetterTest extends PubPackageResolutionTest {
- test_getter() async {
- await assertErrorsInCode(r'''
-get V => 0;
-@V
-main() {
-}
-''', [
- error(CompileTimeErrorCode.INVALID_ANNOTATION_GETTER, 12, 2),
- ]);
- }
-
- test_importWithPrefix_getter() async {
- newFile('$testPackageLibPath/lib.dart', content: r'''
-library lib;
-get V => 0;
-''');
- await assertErrorsInCode(r'''
-import 'lib.dart' as p;
-@p.V
-main() {
-}
-''', [
- error(CompileTimeErrorCode.INVALID_ANNOTATION_GETTER, 24, 4),
- ]);
- }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
index 1ad964c..1795ae3 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
@@ -15,6 +15,32 @@
@reflectiveTest
class InvalidAnnotationTest extends PubPackageResolutionTest {
+ test_getter() async {
+ await assertErrorsInCode(r'''
+get V => 0;
+@V
+main() {
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_ANNOTATION, 12, 2),
+ ]);
+ }
+
+ test_getter_importWithPrefix() async {
+ newFile('$testPackageLibPath/lib.dart', content: r'''
+library lib;
+get V => 0;
+''');
+ await assertErrorsInCode(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_ANNOTATION, 24, 4),
+ ]);
+ }
+
test_importWithPrefix_notConstantVariable() async {
newFile('$testPackageLibPath/lib.dart', content: r'''
library lib;
@@ -45,6 +71,42 @@
]);
}
+ test_notClass_importWithPrefix() async {
+ newFile('$testPackageLibPath/annotations.dart', content: r'''
+class Property {
+ final int value;
+ const Property(this.value);
+}
+
+const Property property = const Property(42);
+''');
+ await assertErrorsInCode('''
+import 'annotations.dart' as pref;
+@pref.property(123)
+main() {
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_ANNOTATION, 35, 19),
+ ]);
+ }
+
+ test_notClass_instance() async {
+ await assertErrorsInCode('''
+class Property {
+ final int value;
+ const Property(this.value);
+}
+
+const Property property = const Property(42);
+
+@property(123)
+main() {
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_ANNOTATION, 116, 14),
+ ]);
+ }
+
test_notConstantVariable() async {
await assertErrorsInCode(r'''
final V = 0;
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index f119043..0c6341c 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -17,7 +17,6 @@
import 'ambiguous_set_or_map_literal_test.dart' as ambiguous_set_or_map_literal;
import 'annotation_on_pointer_field_test.dart' as annotation_on_pointer_field;
import 'annotation_syntax_test.dart' as annotation_syntax;
-import 'annotation_with_non_class_test.dart' as annotation_with_non_class;
import 'argument_type_not_assignable_test.dart' as argument_type_not_assignable;
import 'assert_in_redirecting_constructor_test.dart'
as assert_in_redirecting_constructor;
@@ -274,7 +273,6 @@
import 'integer_literal_out_of_range_test.dart' as integer_literal_out_of_range;
import 'invalid_annotation_from_deferred_library_test.dart'
as invalid_annotation_from_deferred_library;
-import 'invalid_annotation_getter_test.dart' as invalid_annotation_getter;
import 'invalid_annotation_target_test.dart' as invalid_annotation_target;
import 'invalid_annotation_test.dart' as invalid_annotation;
import 'invalid_assignment_test.dart' as invalid_assignment;
@@ -672,7 +670,6 @@
ambiguous_set_or_map_literal.main();
annotation_on_pointer_field.main();
annotation_syntax.main();
- annotation_with_non_class.main();
argument_type_not_assignable.main();
assert_in_redirecting_constructor.main();
assignment_of_do_not_store.main();
@@ -840,7 +837,6 @@
integer_literal_out_of_range.main();
invalid_annotation.main();
invalid_annotation_from_deferred_library.main();
- invalid_annotation_getter.main();
invalid_annotation_target.main();
invalid_assignment.main();
invalid_cast_new_expr.main();
diff --git a/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart b/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
index da813a8..c515d56 100644
--- a/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
@@ -13,11 +13,30 @@
defineReflectiveTests(
TypeArgumentNotMatchingBoundsWithNullSafetyTest,
);
+ defineReflectiveTests(
+ TypeArgumentNotMatchingBoundsWithNonFunctionTypeAliasesTest,
+ );
});
}
@reflectiveTest
-class TypeArgumentNotMatchingBoundsTest extends PubPackageResolutionTest {
+class TypeArgumentNotMatchingBoundsTest extends PubPackageResolutionTest
+ with TypeArgumentNotMatchingBoundsTestCases {
+ test_regression_42196_Null() async {
+ await assertNoErrorsInCode(r'''
+typedef G<X> = Function(X);
+class A<X extends G<A<X,Y>>, Y extends X> {}
+
+test<X>() { print("OK"); }
+
+main() {
+ test<A<G<A<Null, Null>>, dynamic>>();
+}
+''');
+ }
+}
+
+mixin TypeArgumentNotMatchingBoundsTestCases on PubPackageResolutionTest {
test_classTypeAlias() async {
await assertErrorsInCode(r'''
class A {}
@@ -352,19 +371,6 @@
]);
}
- test_regression_42196_Null() async {
- await assertNoErrorsInCode(r'''
-typedef G<X> = Function(X);
-class A<X extends G<A<X,Y>>, Y extends X> {}
-
-test<X>() { print("OK"); }
-
-main() {
- test<A<G<A<Null, Null>>, dynamic>>();
-}
-''');
- }
-
test_typeArgumentList() async {
await assertErrorsInCode(r'''
class A {}
@@ -413,8 +419,43 @@
}
@reflectiveTest
+class TypeArgumentNotMatchingBoundsWithNonFunctionTypeAliasesTest
+ extends PubPackageResolutionTest
+ with
+ WithNonFunctionTypeAliasesMixin,
+ TypeArgumentNotMatchingBoundsTestCases {
+ test_nonFunctionTypeAlias_interfaceType_parameter() async {
+ await assertErrorsInCode(r'''
+class A {}
+typedef X<T extends A> = Map<int, T>;
+void f(X<String> a) {}
+''', [
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 58, 6),
+ ]);
+ }
+
+ test_nonFunctionTypeAlias_interfaceType_parameter_regularBounded() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+class B extends A {}
+typedef X<T extends A> = Map<int, T>;
+void f(X<B> a) {}
+''');
+ }
+
+ test_nonFunctionTypeAlias_interfaceType_parameter_superBounded() async {
+ await assertNoErrorsInCode(r'''
+class A {}
+typedef X<T extends A> = Map<int, T>;
+void f(X<Never> a) {}
+''');
+ }
+}
+
+@reflectiveTest
class TypeArgumentNotMatchingBoundsWithNullSafetyTest
- extends TypeArgumentNotMatchingBoundsTest with WithNullSafetyMixin {
+ extends PubPackageResolutionTest
+ with TypeArgumentNotMatchingBoundsTestCases, WithNullSafetyMixin {
test_extends_optIn_fromOptOut_Null() async {
newFile('$testPackageLibPath/a.dart', content: r'''
class A<X extends int> {}
@@ -447,6 +488,16 @@
''');
}
+ test_notRegularBounded_notSuperBounded_invariant() async {
+ await assertErrorsInCode(r'''
+typedef A<X> = X Function(X);
+typedef G<X extends A<X>> = void Function<Y extends X>();
+foo(G g) {}
+''', [
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 92, 1),
+ ]);
+ }
+
test_regression_42196() async {
await assertNoErrorsInCode(r'''
typedef G<X> = Function(X);
@@ -460,23 +511,6 @@
''');
}
- @override
- test_regression_42196_Null() async {
- await assertErrorsInCode(r'''
-typedef G<X> = Function(X);
-class A<X extends G<A<X,Y>>, Y extends X> {}
-
-test<X>() { print("OK"); }
-
-main() {
- test<A<G<A<Null, Null>>, dynamic>>();
-}
-''', [
- error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 120, 16),
- error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 124, 4),
- ]);
- }
-
test_regression_42196_object() async {
await assertNoErrorsInCode(r'''
typedef G<X> = Function(X);
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index af40e72..96d7c2b 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -46,9 +46,15 @@
'CompileTimeErrorCode.INVALID_URI',
// Produces two diagnostics when it should only produce one.
'CompileTimeErrorCode.INVALID_USE_OF_NULL_VALUE',
+ // Produces two diagnostics when it should only produce one.
+ 'CompileTimeErrorCode.NON_SYNC_FACTORY',
// Need a way to make auxiliary files that (a) are not included in the
// generated docs or (b) can be made persistent for fixes.
'CompileTimeErrorCode.PART_OF_NON_PART',
+ // Produces two diagnostic out of necessity.
+ 'CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT',
+ // Produces two diagnostic out of necessity.
+ 'CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT',
// Produces the diagnostic HintCode.UNUSED_LOCAL_VARIABLE when it shouldn't.
'CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT',
// The code has been replaced but is not yet removed.
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 75e38cc..1fe281f 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -894,6 +894,53 @@
}
{% endprettify %}
+### assignment_to_function
+
+_Functions can't be assigned a value._
+
+#### Description
+
+The analyzer produces this diagnostic when the name of a function appears
+on the left-hand side of an assignment expression.
+
+#### Example
+
+The following code produces this diagnostic because the assignment to the
+function `f` is invalid:
+
+{% prettify dart tag=pre+code %}
+void f() {}
+
+void g() {
+ [!f!] = () {};
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the right-hand side should be assigned to something else, such as a
+local variable, then change the left-hand side:
+
+{% prettify dart tag=pre+code %}
+void f() {}
+
+void g() {
+ var x = () {};
+ print(x);
+}
+{% endprettify %}
+
+If the intent is to change the implementation of the function, then define
+a function-valued variable instead of a function:
+
+{% prettify dart tag=pre+code %}
+void Function() f = () {};
+
+void g() {
+ f = () {};
+}
+{% endprettify %}
+
### assignment_to_method
_Methods can't be assigned a value._
@@ -922,6 +969,100 @@
Rewrite the code so that there isn't an assignment to a method.
+### assignment_to_type
+
+_Types can't be assigned a value._
+
+#### Description
+
+The analyzer produces this diagnostic when the name of a type name appears
+on the left-hand side of an assignment expression.
+
+#### Example
+
+The following code produces this diagnostic because the assignment to the
+class `C` is invalid:
+
+{% prettify dart tag=pre+code %}
+class C {}
+
+void f() {
+ [!C!] = null;
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the right-hand side should be assigned to something else, such as a
+local variable, then change the left-hand side:
+
+{% prettify dart tag=pre+code %}
+void f() {}
+
+void g() {
+ var c = null;
+ print(c);
+}
+{% endprettify %}
+
+### async_for_in_wrong_context
+
+_The async for-in loop can only be used in an async function._
+
+#### Description
+
+The analyzer produces this diagnostic when an async for-in loop is found in
+a function or method whose body isn't marked as being either `async` or
+`async*`.
+
+#### Example
+
+The following code produces this diagnostic because the body of `f` isn't
+marked as being either `async` or `async*`, but `f` contains an async
+for-in loop:
+
+{% prettify dart tag=pre+code %}
+void f(list) {
+ await for (var e [!in!] list) {
+ print(e);
+ }
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the function should return a `Future`, then mark the body with `async`:
+
+{% prettify dart tag=pre+code %}
+Future<void> f(list) async {
+ await for (var e in list) {
+ print(e);
+ }
+}
+{% endprettify %}
+
+If the function should return a `Stream` of values, then mark the body with
+`async*`:
+
+{% prettify dart tag=pre+code %}
+Stream<void> f(list) async* {
+ await for (var e in list) {
+ print(e);
+ }
+}
+{% endprettify %}
+
+If the function should be synchronous, then remove the `await` before the
+loop:
+
+{% prettify dart tag=pre+code %}
+void f(list) {
+ for (var e in list) {
+ print(e);
+ }
+}
+{% endprettify %}
+
### await_in_late_local_variable_initializer
_The 'await' expression can't be used in a 'late' local variable's initializer._
@@ -1038,6 +1179,61 @@
}
{% endprettify %}
+### break_label_on_switch_member
+
+_A break label resolves to the 'case' or 'default' statement._
+
+#### Description
+
+The analyzer produces this diagnostic when a break in a case clause inside
+a switch statement has a label that is associated with another case clause.
+
+#### Example
+
+The following code produces this diagnostic because the label `l` is
+associated with the case clause for `0`:
+
+{% prettify dart tag=pre+code %}
+void f(int i) {
+ switch (i) {
+ l: case 0:
+ break;
+ case 1:
+ break [!l!];
+ }
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the intent is to transfer control to the statement after the switch,
+then remove the label from the break statement:
+
+{% prettify dart tag=pre+code %}
+void f(int i) {
+ switch (i) {
+ case 0:
+ break;
+ case 1:
+ break;
+ }
+}
+{% endprettify %}
+
+If the intent is to transfer control to a different case block, then use
+`continue` rather than `break`:
+
+{% prettify dart tag=pre+code %}
+void f(int i) {
+ switch (i) {
+ l: case 0:
+ break;
+ case 1:
+ continue l;
+ }
+}
+{% endprettify %}
+
### built_in_identifier_as_extension_name
_The built-in identifier '{0}' can't be used as an extension name._
@@ -1129,6 +1325,105 @@
}
{% endprettify %}
+### case_expression_type_implements_equals
+
+_The switch case expression type '{0}' can't override the '==' operator._
+
+#### Description
+
+The analyzer produces this diagnostic when the type of the expression
+following the keyword `case` has an implementation of the `==` operator
+other than the one in `Object`.
+
+#### Example
+
+The following code produces this diagnostic because the expression
+following the keyword `case` (`C(0)`) has the type `C`, and the class `C`
+overrides the `==` operator:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int value;
+
+ const C(this.value);
+
+ bool operator ==(Object other) {
+ return false;
+ }
+}
+
+void f(C c) {
+ switch (c) {
+ case [!C(0)!]:
+ break;
+ }
+}
+{% endprettify %}
+
+#### Common fixes
+
+If there isn't a strong reason not to do so, then rewrite the code to use
+an if-else structure:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int value;
+
+ const C(this.value);
+
+ bool operator ==(Object other) {
+ return false;
+ }
+}
+
+void f(C c) {
+ if (c == C(0)) {
+ // ...
+ }
+}
+{% endprettify %}
+
+If you can't rewrite the switch statement and the implementation of `==`
+isn't necessary, then remove it:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int value;
+
+ const C(this.value);
+}
+
+void f(C c) {
+ switch (c) {
+ case C(0):
+ break;
+ }
+}
+{% endprettify %}
+
+If you can't rewrite the switch statement and you can't remove the
+definition of `==`, then find some other value that can be used to control
+the switch:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int value;
+
+ const C(this.value);
+
+ bool operator ==(Object other) {
+ return false;
+ }
+}
+
+void f(C c) {
+ switch (c.value) {
+ case 0:
+ break;
+ }
+}
+{% endprettify %}
+
### case_expression_type_is_not_switch_expression_subtype
_The switch case expression type '{0}' must be a subtype of the switch
@@ -2023,6 +2318,60 @@
}
{% endprettify %}
+### default_value_in_redirecting_factory_constructor
+
+_Default values aren't allowed in factory constructors that redirect to another
+constructor._
+
+#### Description
+
+The analyzer produces this diagnostic when a factory constructor that
+redirects to another constructor specifies a default value for an optional
+parameter.
+
+#### Example
+
+The following code produces this diagnostic because the factory constructor
+in `A` has a default value for the optional parameter `x`:
+
+{% prettify dart tag=pre+code %}
+class A {
+ factory A([int [!x!] = 0]) = B;
+}
+
+class B implements A {
+ B([int x = 1]) {}
+}
+{% endprettify %}
+
+#### Common fixes
+
+Remove the default value from the factory constructor:
+
+{% prettify dart tag=pre+code %}
+class A {
+ factory A([int x]) = B;
+}
+
+class B implements A {
+ B([int x = 1]) {}
+}
+{% endprettify %}
+
+Note that this fix might change the value used when the optional parameter
+is omitted. If that happens, and if that change is a problem, then consider
+making the optional parameter a required parameter in the factory method:
+
+{% prettify dart tag=pre+code %}
+class A {
+ factory A(int x) = B;
+}
+
+class B implements A {
+ B([int x = 1]) {}
+}
+{% endprettify %}
+
### definitely_unassigned_late_local_variable
_The late local variable '{0}' is definitely unassigned at this point._
@@ -2217,6 +2566,46 @@
int y = 1;
{% endprettify %}
+### duplicate_hidden_name
+
+_Duplicate hidden name._
+
+#### Description
+
+The analyzer produces this diagnostic when a name occurs multiple times in
+a `hide` clause. Repeating the name is unnecessary.
+
+#### Example
+
+The following code produces this diagnostic because the name `min` is
+hidden more than once:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' hide min, [!min!];
+
+var x = pi;
+{% endprettify %}
+
+#### Common fixes
+
+If the name was mistyped in one or more places, then correct the mistyped
+names:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' hide max, min;
+
+var x = pi;
+{% endprettify %}
+
+If the name wasn't mistyped, then remove the unnecessary name from the
+list:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' hide min;
+
+var x = pi;
+{% endprettify %}
+
### duplicate_ignore
_The diagnostic '{0}' doesn't need to be ignored here because it's already being
@@ -2383,6 +2772,46 @@
part 'part.dart';
{% endprettify %}
+### duplicate_shown_name
+
+_Duplicate shown name._
+
+#### Description
+
+The analyzer produces this diagnostic when a name occurs multiple times in
+a `show` clause. Repeating the name is unnecessary.
+
+#### Example
+
+The following code produces this diagnostic because the name `min` is shown
+more than once:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' show min, [!min!];
+
+var x = min(2, min(0, 1));
+{% endprettify %}
+
+#### Common fixes
+
+If the name was mistyped in one or more places, then correct the mistyped
+names:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' show max, min;
+
+var x = max(2, min(0, 1));
+{% endprettify %}
+
+If the name wasn't mistyped, then remove the unnecessary name from the
+list:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' show min;
+
+var x = min(2, min(0, 1));
+{% endprettify %}
+
### equal_elements_in_const_set
_Two elements in a constant set literal can't be equal._
@@ -3209,6 +3638,41 @@
}
{% endprettify %}
+### field_initialized_by_multiple_initializers
+
+_The field '{0}' can't be initialized twice in the same constructor._
+
+#### Description
+
+The analyzer produces this diagnostic when the initializer list of a
+constructor initializes a field more than once. There is no value to allow
+both initializers because only the last value is preserved.
+
+#### Example
+
+The following code produces this diagnostic because the field `f` is being
+initialized twice:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C() : f = 0, [!f!] = 1;
+}
+{% endprettify %}
+
+#### Common fixes
+
+Remove one of the initializers:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C() : f = 0;
+}
+{% endprettify %}
+
### field_initialized_in_initializer_and_declaration
_Fields can't be initialized in the constructor if they are final and were
@@ -3256,6 +3720,98 @@
}
{% endprettify %}
+### field_initialized_in_parameter_and_initializer
+
+_Fields can't be initialized in both the parameter list and the initializers._
+
+#### Description
+
+The analyzer produces this diagnostic when a field is initialized in both
+the parameter list and in the initializer list of a constructor.
+
+#### Example
+
+The following code produces this diagnostic because the field `f` is
+initialized both by a field formal parameter and in the initializer list:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f) : [!f!] = 0;
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the field should be initialized by the parameter, then remove the
+initialization in the initializer list:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f);
+}
+{% endprettify %}
+
+If the field should be initialized in the initializer list and the
+parameter isn't needed, then remove the parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C() : f = 0;
+}
+{% endprettify %}
+
+If the field should be initialized in the initializer list and the
+parameter is needed, then make it a normal parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(int g) : f = g * 2;
+}
+{% endprettify %}
+
+### field_initializer_factory_constructor
+
+_Initializing formal parameters can't be used in factory constructors._
+
+#### Description
+
+The analyzer produces this diagnostic when a factory constructor has a
+field formal parameter. Factory constructors can't assign values to fields
+because no instance is created; hence, there is no field to assign.
+
+#### Example
+
+The following code produces this diagnostic because the factory constructor
+uses a field formal parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int? f;
+
+ factory C([!this.f!]) => throw 0;
+}
+{% endprettify %}
+
+#### Common fixes
+
+Replace the field formal parameter with a normal parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int? f;
+
+ factory C(int f) => throw 0;
+}
+{% endprettify %}
+
### field_initializer_not_assignable
_The initializer type '{0}' can't be assigned to the field type '{1}' in a const
@@ -3306,6 +3862,182 @@
}
{% endprettify %}
+### field_initializer_redirecting_constructor
+
+_The redirecting constructor can't have a field initializer._
+
+#### Description
+
+The analyzer produces this diagnostic when a redirecting constructor
+initializes a field in the object. This isn't allowed because the instance
+that has the field hasn't been created at the point at which it should be
+initialized.
+
+#### Example
+
+The following code produces this diagnostic because the constructor
+`C.zero`, which redirects to the constructor `C`, has a field formal
+parameter that initializes the field `f`:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f);
+
+ C.zero([!this.f!]) : this(f);
+}
+{% endprettify %}
+
+The following code produces this diagnostic because the constructor
+`C.zero`, which redirects to the constructor `C`, has an initializer that
+initializes the field `f`:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f);
+
+ C.zero() : [!f = 0!], this(1);
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the initialization is done by a field formal parameter, then use a
+normal parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f);
+
+ C.zero(int f) : this(f);
+}
+{% endprettify %}
+
+If the initialization is done in an initializer, then remove the
+initializer:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f);
+
+ C.zero() : this(0);
+}
+{% endprettify %}
+
+### field_initializing_formal_not_assignable
+
+_The parameter type '{0}' is incompatible with the field type '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when the type of a field formal
+parameter isn't assignable to the type of the field being initialized.
+
+#### Example
+
+The following code produces this diagnostic because the field formal
+parameter has the type `String`, but the type of the field is `int`. The
+parameter must have a type that is a subtype of the field's type.
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C([!String this.f!]);
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the type of the field is incorrect, then change the type of the field to
+match the type of the parameter, and consider removing the type from the
+parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ String f;
+
+ C(this.f);
+}
+{% endprettify %}
+
+If the type of the parameter is incorrect, then remove the type of the
+parameter:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(this.f);
+}
+{% endprettify %}
+
+If the types of both the field and the parameter are correct, then use an
+initializer rather than a field formal parameter to convert the parameter
+value into a value of the correct type:
+
+{% prettify dart tag=pre+code %}
+class C {
+ int f;
+
+ C(String s) : f = int.parse(s);
+}
+{% endprettify %}
+
+### final_initialized_in_declaration_and_constructor
+
+_'{0}' is final and was given a value when it was declared, so it can't be set
+to a new value._
+
+#### Description
+
+The analyzer produces this diagnostic when a final field is initialized
+twice: once where it's declared and once by a constructor's parameter.
+
+#### Example
+
+The following code produces this diagnostic because the field `f` is
+initialized twice:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int f = 0;
+
+ C(this.[!f!]);
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the field should have the same value for all instances, then remove the
+initialization in the parameter list:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int f = 0;
+
+ C();
+}
+{% endprettify %}
+
+If the field can have different values in different instances, then remove
+the initialization in the declaration:
+
+{% prettify dart tag=pre+code %}
+class C {
+ final int f;
+
+ C(this.f);
+}
+{% endprettify %}
+
### final_not_initialized
_The final variable '{0}' must be initialized._
@@ -4174,8 +4906,6 @@
_Annotation must be either a const variable reference or const constructor
invocation._
-_Getters can't be used as annotations._
-
#### Description
The analyzer produces this diagnostic when an annotation is found that is
@@ -4397,6 +5127,34 @@
}
{% endprettify %}
+### invalid_inline_function_type
+
+_Inline function types can't be used for parameters in a generic function type._
+
+#### Description
+
+The analyzer produces this diagnostic when a generic function type has a
+function-valued parameter that is written using the older inline function
+type syntax.
+
+#### Example
+
+The following code produces this diagnostic because the parameter `f`, in
+the generic function type used to define `F`, uses the inline function
+type syntax:
+
+{% prettify dart tag=pre+code %}
+typedef F = int Function(int f[!(!]String s));
+{% endprettify %}
+
+#### Common fixes
+
+Use the generic function syntax for the parameter's type:
+
+{% prettify dart tag=pre+code %}
+typedef F = int Function(int Function(String));
+{% endprettify %}
+
### invalid_literal_annotation
_Only const constructors can have the `@literal` annotation._
@@ -5017,6 +5775,58 @@
}
{% endprettify %}
+### label_undefined
+
+_Can't reference an undefined label '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when it finds a reference to a label
+that isn't defined in the scope of the `break` or `continue` statement that
+is referencing it.
+
+#### Example
+
+The following code produces this diagnostic because the label `loop` isn't
+defined anywhere:
+
+{% prettify dart tag=pre+code %}
+void f() {
+ for (int i = 0; i < 10; i++) {
+ for (int j = 0; j < 10; j++) {
+ break [!loop!];
+ }
+ }
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the label should be on the innermost enclosing `do`, `for`, `switch`, or
+`while` statement, then remove the label:
+
+{% prettify dart tag=pre+code %}
+void f() {
+ for (int i = 0; i < 10; i++) {
+ for (int j = 0; j < 10; j++) {
+ break;
+ }
+ }
+}
+{% endprettify %}
+
+If the label should be on some other statement, then add the label:
+
+{% prettify dart tag=pre+code %}
+void f() {
+ loop: for (int i = 0; i < 10; i++) {
+ for (int j = 0; j < 10; j++) {
+ break loop;
+ }
+ }
+}
+{% endprettify %}
+
### late_final_field_with_const_constructor
_Can't have a late final field in a class with a const constructor._
@@ -5155,6 +5965,113 @@
List<num> x = [1, 2.5, 3];
{% endprettify %}
+### main_first_positional_parameter_type
+
+_The type of the first positional parameter of the 'main' function must be a
+supertype of 'List<String>'._
+
+#### Description
+
+The analyzer produces this diagnostic when the first positional parameter
+of a function named `main` isn't a supertype of `List<String>`.
+
+#### Example
+
+The following code produces this diagnostic because `List<int>` isn't a
+supertype of `List<String>`:
+
+{% prettify dart tag=pre+code %}
+void main([!List<int>!] args) {}
+{% endprettify %}
+
+#### Common fixes
+
+If the function is an entry point, then change the type of the first
+positional parameter to be a supertype of `List<String>`:
+
+{% prettify dart tag=pre+code %}
+void main(List<String> args) {}
+{% endprettify %}
+
+If the function isn't an entry point, then change the name of the function:
+
+{% prettify dart tag=pre+code %}
+void f(List<int> args) {}
+{% endprettify %}
+
+### main_has_required_named_parameters
+
+_The function 'main' can't have any required named parameters._
+
+#### Description
+
+The analyzer produces this diagnostic when a function named `main` has one
+or more required named parameters.
+
+#### Example
+
+The following code produces this diagnostic because the function named
+`main` has a required named parameter (`x`):
+
+{% prettify dart tag=pre+code %}
+void [!main!]({required int x}) {}
+{% endprettify %}
+
+#### Common fixes
+
+If the function is an entry point, then remove the `required` keyword:
+
+{% prettify dart tag=pre+code %}
+void main({int? x}) {}
+{% endprettify %}
+
+If the function isn't an entry point, then change the name of the function:
+
+{% prettify dart tag=pre+code %}
+void f({required int x}) {}
+{% endprettify %}
+
+### main_has_too_many_required_positional_parameters
+
+_The function 'main' can't have more than two required positional parameters._
+
+#### Description
+
+The analyzer produces this diagnostic when a function named `main` has more
+than two required positional parameters.
+
+#### Example
+
+The following code produces this diagnostic because the function `main` has
+three required positional parameters:
+
+{% prettify dart tag=pre+code %}
+void [!main!](List<String> args, int x, int y) {}
+{% endprettify %}
+
+#### Common fixes
+
+If the function is an entry point and the extra parameters aren't used,
+then remove them:
+
+{% prettify dart tag=pre+code %}
+void main(List<String> args, int x) {}
+{% endprettify %}
+
+If the function is an entry point, but the extra parameters used are for
+when the function isn't being used as an entry point, then make the extra
+parameters optional:
+
+{% prettify dart tag=pre+code %}
+void main(List<String> args, int x, [int y = 0]) {}
+{% endprettify %}
+
+If the function isn't an entry point, then change the name of the function:
+
+{% prettify dart tag=pre+code %}
+void f(List<String> args, int x, int y) {}
+{% endprettify %}
+
### main_is_not_function
_The declaration named 'main' must be a function._
@@ -6303,6 +7220,57 @@
void f() => const C();
{% endprettify %}
+### non_sync_factory
+
+_Factory bodies can't use 'async', 'async*', or 'sync*'._
+
+#### Description
+
+The analyzer produces this diagnostic when the body of a factory
+constructor is marked with `async`, `async*`, or `sync*`. All constructors,
+including factory constructors, are required to return an instance of the
+class in which they're declared, not a `Future`, `Stream`, or `Iterator`.
+
+#### Example
+
+The following code produces this diagnostic because the body of the factory
+constructor is marked with `async`:
+
+{% prettify dart tag=pre+code %}
+class C {
+ factory C() [!async!] {
+ return C._();
+ }
+ C._();
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the member must be declared as a factory constructor, then remove the
+keyword appearing before the body:
+
+{% prettify dart tag=pre+code %}
+class C {
+ factory C() {
+ return C._();
+ }
+ C._();
+}
+{% endprettify %}
+
+If the member must return something other than an instance of the enclosing
+class, then make the member a static method:
+
+{% prettify dart tag=pre+code %}
+class C {
+ static Future<C> m() async {
+ return C._();
+ }
+ C._();
+}
+{% endprettify %}
+
### non_type_as_type_argument
_The name '{0}' isn't a type so it can't be used as a type argument._
@@ -7003,6 +7971,51 @@
class C with M {}
{% endprettify %}
+### on_repeated
+
+_The type '{0}' can be included in the superclass constraints only once._
+
+#### Description
+
+The analyzer produces this diagnostic when the same type is listed in the
+superclass constraints of a mixin multiple times.
+
+#### Example
+
+The following code produces this diagnostic because `A` is included twice
+in the superclass constraints for `M`:
+
+{% prettify dart tag=pre+code %}
+mixin M on A, [!A!] {
+}
+
+class A {}
+class B {}
+{% endprettify %}
+
+#### Common fixes
+
+If a different type should be included in the superclass constraints, then
+replace one of the occurrences with the other type:
+
+{% prettify dart tag=pre+code %}
+mixin M on A, B {
+}
+
+class A {}
+class B {}
+{% endprettify %}
+
+If no other type was intended, then remove the repeated type name:
+
+{% prettify dart tag=pre+code %}
+mixin M on A {
+}
+
+class A {}
+class B {}
+{% endprettify %}
+
### override_on_non_overriding_member
_The field doesn't override an inherited getter or setter._
@@ -7205,6 +8218,237 @@
If the name is wrong, then correct the name.
+### private_optional_parameter
+
+_Named parameters can't start with an underscore._
+
+#### Description
+
+The analyzer produces this diagnostic when the name of a named parameter
+starts with an underscore.
+
+#### Example
+
+The following code produces this diagnostic because the named parameter
+`_x` starts with an underscore:
+
+{% prettify dart tag=pre+code %}
+class C {
+ void m({int [!_x!] = 0}) {}
+}
+{% endprettify %}
+
+#### Common fixes
+
+Rename the parameter so that it doesn't start with an underscore:
+
+{% prettify dart tag=pre+code %}
+class C {
+ void m({int x = 0}) {}
+}
+{% endprettify %}
+
+### recursive_compile_time_constant
+
+_The compile-time constant expression depends on itself._
+
+#### Description
+
+The analyzer produces this diagnostic when the value of a compile-time
+constant is defined in terms of itself, either directly or indirectly,
+creating an infinite loop.
+
+#### Example
+
+The following code produces this diagnostic twice because both of the
+constants are defined in terms of the other:
+
+{% prettify dart tag=pre+code %}
+const [!secondsPerHour!] = minutesPerHour * 60;
+const [!minutesPerHour!] = secondsPerHour / 60;
+{% endprettify %}
+
+#### Common fixes
+
+Break the cycle by finding an alternative way of defining at least one of
+the constants:
+
+{% prettify dart tag=pre+code %}
+const secondsPerHour = minutesPerHour * 60;
+const minutesPerHour = 60;
+{% endprettify %}
+
+### recursive_constructor_redirect
+
+_Constructors can't redirect to themselves either directly or indirectly._
+
+#### Description
+
+The analyzer produces this diagnostic when a constructor redirects to
+itself, either directly or indirectly, creating an infinite loop.
+
+#### Example
+
+The following code produces this diagnostic because the generative
+constructors `C.a` and `C.b` each redirect to the other:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : [!this.b()!];
+ C.b() : [!this.a()!];
+}
+{% endprettify %}
+
+The following code produces this diagnostic because the factory
+constructors `A` and `B` each redirect to the other:
+
+{% prettify dart tag=pre+code %}
+abstract class A {
+ factory A() = [!B!];
+}
+class B implements A {
+ factory B() = [!A!];
+ B.named();
+}
+{% endprettify %}
+
+#### Common fixes
+
+In the case of generative constructors, break the cycle by finding defining
+at least one of the constructors to not redirect to another constructor:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : this.b();
+ C.b();
+}
+{% endprettify %}
+
+In the case of factory constructors, break the cycle by defining at least
+one of the factory constructors to do one of the following:
+
+- Redirect to a generative constructor:
+
+{% prettify dart tag=pre+code %}
+abstract class A {
+ factory A() = B;
+}
+class B implements A {
+ factory B() = B.named;
+ B.named();
+}
+{% endprettify %}
+
+- Not redirect to another constructor:
+
+{% prettify dart tag=pre+code %}
+abstract class A {
+ factory A() = B;
+}
+class B implements A {
+ factory B() {
+ return B.named();
+ }
+
+ B.named();
+}
+{% endprettify %}
+
+- Not be a factory constructor:
+
+{% prettify dart tag=pre+code %}
+abstract class A {
+ factory A() = B;
+}
+class B implements A {
+ B();
+ B.named();
+}
+{% endprettify %}
+
+### redirect_generative_to_missing_constructor
+
+_The constructor '{0}' couldn't be found in '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when a generative constructor
+redirects to a constructor that isn't defined.
+
+#### Example
+
+The following code produces this diagnostic because the constructor `C.a`
+redirects to the constructor `C.b`, but `C.b` isn't defined:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : [!this.b()!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the missing constructor must be called, then define it:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : this.b();
+ C.b();
+}
+{% endprettify %}
+
+If the missing constructor doesn't need to be called, then remove the
+redirect:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a();
+}
+{% endprettify %}
+
+### redirect_generative_to_non_generative_constructor
+
+_Generative constructors can't redirect to a factory constructor._
+
+#### Description
+
+The analyzer produces this diagnostic when a generative constructor
+redirects to a factory constructor.
+
+#### Example
+
+The following code produces this diagnostic because the generative
+constructor `C.a` redirects to the factory constructor `C.b`:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : [!this.b()!];
+ factory C.b() => C.a();
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the generative constructor doesn't need to redirect to another
+constructor, then remove the redirect.
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a();
+ factory C.b() => C.a();
+}
+{% endprettify %}
+
+If the generative constructor must redirect to another constructor, then
+make the other constructor be a generative (non-factory) constructor:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : this.b();
+ C.b();
+}
+{% endprettify %}
+
### redirect_to_invalid_function_type
_The redirected constructor '{0}' has incompatible parameters with '{1}'._
@@ -7373,6 +8617,50 @@
}
{% endprettify %}
+### redirect_to_non_const_constructor
+
+_A constant redirecting constructor can't redirect to a non-constant
+constructor._
+
+#### Description
+
+The analyzer produces this diagnostic when a constructor marked as `const`
+redirects to a constructor that isn't marked as `const`.
+
+#### Example
+
+The following code produces this diagnostic because the constructor `C.a`
+is marked as `const` but redirects to the constructor `C.b`, which isn't:
+
+{% prettify dart tag=pre+code %}
+class C {
+ const C.a() : this.[!b!]();
+ C.b();
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the non-constant constructor can be marked as `const`, then mark it as
+`const`:
+
+{% prettify dart tag=pre+code %}
+class C {
+ const C.a() : this.b();
+ const C.b();
+}
+{% endprettify %}
+
+If the non-constant constructor can't be marked as `const`, then either
+remove the redirect or remove `const` from the redirecting constructor:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : this.b();
+ C.b();
+}
+{% endprettify %}
+
### referenced_before_declaration
_Local variable '{0}' can't be referenced before it is declared._
@@ -7423,6 +8711,52 @@
}
{% endprettify %}
+### rethrow_outside_catch
+
+_A rethrow must be inside of a catch clause._
+
+#### Description
+
+The analyzer produces this diagnostic when a `rethrow` statement is outside
+a `catch` clause. The `rethrow` statement is used to throw a caught
+exception again, but there's no caught exception outside of a `catch`
+clause.
+
+#### Example
+
+The following code produces this diagnostic because the`rethrow` statement
+is outside of a `catch` clause:
+
+{% prettify dart tag=pre+code %}
+void f() {
+ [!rethrow!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+If you're trying to rethrow an exception, then wrap the `rethrow` statement
+in a `catch` clause:
+
+{% prettify dart tag=pre+code %}
+void f() {
+ try {
+ // ...
+ } catch (exception) {
+ rethrow;
+ }
+}
+{% endprettify %}
+
+If you're trying to throw a new exception, then replace the `rethrow`
+statement with a `throw` expression:
+
+{% prettify dart tag=pre+code %}
+void f() {
+ throw UnsupportedError('Not yet implemented');
+}
+{% endprettify %}
+
### return_in_generative_constructor
_Constructors can't return values._
@@ -8088,6 +9422,49 @@
var b = [...a];
{% endprettify %}
+### shared_deferred_prefix
+
+_The prefix of a deferred import can't be used in other import directives._
+
+#### Description
+
+The analyzer produces this diagnostic when a prefix in a deferred import is
+also used as a prefix in other imports (whether deferred or not). The
+prefix in a deferred import can't be shared with other imports because the
+prefix is used to load the imported library.
+
+#### Example
+
+The following code produces this diagnostic because the prefix `x` is used
+as the prefix for a deferred import and is also used for one other import:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' [!deferred!] as x;
+import 'dart:convert' as x;
+
+var y = x.json.encode(x.min(0, 1));
+{% endprettify %}
+
+#### Common fixes
+
+If you can use a different name for the deferred import, then do so:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' deferred as math;
+import 'dart:convert' as x;
+
+var y = x.json.encode(math.min(0, 1));
+{% endprettify %}
+
+If you can use a different name for the other imports, then do so:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math' deferred as x;
+import 'dart:convert' as convert;
+
+var y = convert.json.encode(x.min(0, 1));
+{% endprettify %}
+
### static_access_to_instance_member
_Instance member '{0}' can't be accessed using static access._
@@ -8260,6 +9637,40 @@
Rewrite the code to not use `super`.
+### super_in_redirecting_constructor
+
+_The redirecting constructor can't have a 'super' initializer._
+
+#### Description
+
+The analyzer produces this diagnostic when a constructor that redirects to
+another constructor also attempts to invoke a constructor from the
+superclass. The superclass constructor will be invoked when the constructor
+that the redirecting constructor is redirected to is invoked.
+
+#### Example
+
+The following code produces this diagnostic because the constructor `C.a`
+both redirects to `C.b` and invokes a constructor from the superclass:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : this.b(), [!super()!];
+ C.b();
+}
+{% endprettify %}
+
+#### Common fixes
+
+Remove the invocation of the `super` constructor:
+
+{% prettify dart tag=pre+code %}
+class C {
+ C.a() : this.b();
+ C.b();
+}
+{% endprettify %}
+
### switch_expression_not_assignable
_Type '{0}' of the switch expression isn't assignable to the type '{1}' of case
@@ -8372,6 +9783,48 @@
var a = A<int>();
{% endprettify %}
+### type_parameter_referenced_by_static
+
+_Static members can't reference type parameters of the class._
+
+#### Description
+
+The analyzer produces this diagnostic when a static member references a
+type parameter that is declared for the class. Type parameters only have
+meaning for instances of the class.
+
+#### Example
+
+The following code produces this diagnostic because the static method
+`hasType` has a reference to the type parameter `T`:
+
+{% prettify dart tag=pre+code %}
+class C<T> {
+ static bool hasType(Object o) => o is [!T!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the member can be an instance member, then remove the keyword `static`:
+
+{% prettify dart tag=pre+code %}
+class C<T> {
+ bool hasType(Object o) => o is T;
+}
+{% endprettify %}
+
+If the member must be a static member, then make the member be generic:
+
+{% prettify dart tag=pre+code %}
+class C<T> {
+ static bool hasType<S>(Object o) => o is S;
+}
+{% endprettify %}
+
+Note, however, that there isn’t a relationship between `T` and `S`, so this
+second option changes the semantics from what was likely to be intended.
+
### type_test_with_undefined_name
_The name '{0}' isn't defined, so it can't be used in an 'is' expression._
@@ -9513,6 +10966,84 @@
}
{% endprettify %}
+### unnecessary_type_check
+
+_Unnecessary type check; the result is always 'false'._
+
+_Unnecessary type check; the result is always 'true'._
+
+#### Description
+
+The analyzer produces this diagnostic when the value of a type check (using
+either `is` or `is!`) is known at compile time.
+
+#### Example
+
+The following code produces this diagnostic because the test `a is Object?`
+is always `true`:
+
+{% prettify dart tag=pre+code %}
+bool f<T>(T a) => [!a is Object?!];
+{% endprettify %}
+
+#### Common fixes
+
+If the type check doesn't check what you intended to check, then change the
+test:
+
+{% prettify dart tag=pre+code %}
+bool f<T>(T a) => a is Object;
+{% endprettify %}
+
+If the type check does check what you intended to check, then replace the
+type check with its known value or completely remove it:
+
+{% prettify dart tag=pre+code %}
+bool f<T>(T a) => true;
+{% endprettify %}
+
+### unqualified_reference_to_non_local_static_member
+
+_Static members from supertypes must be qualified by the name of the defining
+type._
+
+#### Description
+
+The analyzer produces this diagnostic when code in one class references a
+static member in a superclass without prefixing the member's name with the
+name of the superclass. Static members can only be referenced without a
+prefix in the class in which they're declared.
+
+#### Example
+
+The following code produces this diagnostic because the static field `x` is
+referenced in the getter `g` without prefixing it with the name of the
+defining class:
+
+{% prettify dart tag=pre+code %}
+class A {
+ static int x = 3;
+}
+
+class B extends A {
+ int get g => [!x!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+Prefix the name of the static member with the name of the declaring class:
+
+{% prettify dart tag=pre+code %}
+class A {
+ static int x = 3;
+}
+
+class B extends A {
+ int get g => A.x;
+}
+{% endprettify %}
+
### unqualified_reference_to_static_member_of_extended_type
_Static members from the extended type or one of its superclasses must be
@@ -9917,6 +11448,39 @@
If the file isn't a generated file, then check the spelling of the URI or
create the file.
+### uri_with_interpolation
+
+_URIs can't use string interpolation._
+
+#### Description
+
+The analyzer produces this diagnostic when the string literal in an
+`import`, `export`, or `part` directive contains an interpolation. The
+resolution of the URIs in directives must happen before the declarations
+are compiled, so expressions can’t be evaluated while determining the
+values of the URIs.
+
+#### Example
+
+The following code produces this diagnostic because the string in the
+`import` directive contains an interpolation:
+
+{% prettify dart tag=pre+code %}
+import [!'dart:$m'!];
+
+const m = 'math';
+{% endprettify %}
+
+#### Common fixes
+
+Remove the interpolation from the URI:
+
+{% prettify dart tag=pre+code %}
+import 'dart:math';
+
+var zero = min(0, 0);
+{% endprettify %}
+
### use_of_void_result
_This expression has a type of 'void' so its value can't be used._
@@ -10151,6 +11715,49 @@
int f(C c) => c.m(2);
{% endprettify %}
+### yield_of_invalid_type
+
+_The type '{0}' implied by the 'yield' expression must be assignable to '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when the type of object produced by a
+`yield` expression doesn't match the type of objects that are to be
+returned from the `Iterable` or `Stream` types that are returned from a
+generator (a function or method marked with either `sync*` or `async*`).
+
+#### Example
+
+The following code produces this diagnostic because the getter `zero` is
+declared to return an `Iterable` that returns integers, but the `yield` is
+returning a string from the iterable:
+
+{% prettify dart tag=pre+code %}
+Iterable<int> get zero sync* {
+ yield [!'0'!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the return type of the function is correct, then fix the expression
+following the keyword `yield` to return the correct type:
+
+{% prettify dart tag=pre+code %}
+Iterable<int> get zero sync* {
+ yield 0;
+}
+{% endprettify %}
+
+If the expression following the `yield` is correct, then change the return
+type of the function to allow it:
+
+{% prettify dart tag=pre+code %}
+Iterable<String> get zero sync* {
+ yield '0';
+}
+{% endprettify %}
+
### undefined_super_method
See [undefined_super_member](#undefined_super_member).
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index e122c98..0ec115b 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -635,6 +635,15 @@
if (offset <= node.fields.offset) {
optype.includeTypeNameSuggestions = true;
}
+
+ // If there is no type then the first "field" could be intended as a type
+ // so also include type name suggestions. eg:
+ // class MyClass2 { static MyCl^ }
+ if (node.fields.type == null &&
+ (node.fields.variables.isEmpty ||
+ offset <= node.fields.variables.first.end)) {
+ optype.includeTypeNameSuggestions = true;
+ }
}
@override
diff --git a/pkg/dartdev/lib/src/analysis_server.dart b/pkg/dartdev/lib/src/analysis_server.dart
index e5cfacd..9b8340f 100644
--- a/pkg/dartdev/lib/src/analysis_server.dart
+++ b/pkg/dartdev/lib/src/analysis_server.dart
@@ -125,9 +125,11 @@
.then((response) => response['version']);
}
- Future<EditBulkFixesResult> requestBulkFixes(String filePath) {
+ Future<EditBulkFixesResult> requestBulkFixes(
+ String filePath, bool inTestMode) {
return _sendCommand('edit.bulkFixes', params: <String, dynamic>{
'included': [path.canonicalize(filePath)],
+ 'inTestMode': inTestMode
}).then((result) {
return EditBulkFixesResult.fromJson(
ResponseDecoder(null), 'result', result);
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index 975c2c7..a9feca7 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -24,13 +24,7 @@
This tool looks for and fixes analysis issues that have associated automated fixes.
-To use the tool, run either ['dart fix --dry-run'] for a preview of the proposed changes for a project, or ['dart fix --apply'] to apply the changes.
-
-[Note:] $disclaimer''';
-
- static const disclaimer = 'The `fix` command is under development and '
- 'subject to change before the next stable release. Feedback is welcome - '
- 'please file at https://github.com/dart-lang/sdk/issues.';
+To use the tool, run either ['dart fix --dry-run'] for a preview of the proposed changes for a project, or ['dart fix --apply'] to apply the changes.''';
FixCommand({bool verbose = false}) : super(cmdName, cmdDescription) {
argParser.addFlag('dry-run',
@@ -68,15 +62,13 @@
@override
FutureOr<int> run() async {
var dryRun = argResults['dry-run'];
- var testMode = argResults['compare-to-golden'];
+ var inTestMode = argResults['compare-to-golden'];
var apply = argResults['apply'];
- if (!apply && !dryRun && !testMode) {
+ if (!apply && !dryRun && !inTestMode) {
printUsage();
return 0;
}
- log.stdout('\n${log.ansi.emphasized('Note:')} $disclaimer\n');
-
var arguments = argResults.rest;
var argumentCount = arguments.length;
if (argumentCount > 1) {
@@ -113,14 +105,14 @@
}
});
- fixes = await server.requestBulkFixes(dirPath);
+ fixes = await server.requestBulkFixes(dirPath, inTestMode);
final List<SourceFileEdit> edits = fixes.edits;
await server.shutdown();
progress.finish(showTiming: true);
- if (testMode) {
+ if (inTestMode) {
var result = _compareFixesInDirectory(dir, edits);
log.stdout('Passed: ${result.passCount}, Failed: ${result.failCount}');
return result.failCount > 0 ? 1 : 0;
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
index b3d2940..69b11c9 100644
--- a/pkg/dartdev/test/commands/fix_test.dart
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -5,7 +5,6 @@
import 'dart:io';
import 'package:cli_util/cli_logging.dart';
-import 'package:dartdev/src/commands/fix.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
@@ -68,7 +67,6 @@
expect(result.exitCode, 0);
expect(result.stderr, isEmpty);
- expect(result.stdout, contains(FixCommand.disclaimer));
expect(
result.stdout, contains('Apply automated fixes to Dart source code.'));
});
@@ -80,7 +78,6 @@
expect(result.exitCode, 0);
expect(result.stderr, isEmpty);
- expect(result.stdout, contains(FixCommand.disclaimer));
expect(
result.stdout, contains('Apply automated fixes to Dart source code.'));
});
@@ -92,7 +89,6 @@
expect(result.exitCode, 0);
expect(result.stderr, isEmpty);
- expect(result.stdout, contains(FixCommand.disclaimer));
expect(result.stdout, contains('Nothing to fix!'));
});
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index 13e8fca..c67abe5 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 1.7.3
+- Return an RpcException error with code `kServiceDisappeared` if the VM
+ service connection disappears with an outstanding forwarded request.
+
# 1.7.2
- Fixed issue where a null JSON RPC result could be sent if the VM service
disconnected with a request in flight (see https://github.com/flutter/flutter/issues/74051).
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 7b64867..0c854c3 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -267,13 +267,18 @@
// NOTE: This must be the last fallback registered.
_clientPeer.registerFallback((parameters) async {
// If _vmServicePeer closes in the middle of a request, this will throw
- // a StateError that will be forwarded to the requesting client.
- // Listeners in dds_impl.dart will handle shutting down the DDS, so
- // we don't try and handle the error here.
- return await _vmServicePeer.sendRequest(
- parameters.method,
- parameters.value,
- );
+ // a StateError. Listeners in dds_impl.dart will handle shutting down the
+ // DDS instance, so we don't try and handle the error here.
+ try {
+ return await _vmServicePeer.sendRequest(
+ parameters.method,
+ parameters.value,
+ );
+ } on StateError {
+ throw RpcErrorCodes.buildRpcException(
+ RpcErrorCodes.kServiceDisappeared,
+ );
+ }
});
}
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 6e69aa5..3ecf449 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
A library used to spawn the Dart Developer Service, used to communicate with
a Dart VM Service instance.
-version: 1.7.2
+version: 1.7.3
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
diff --git a/pkg/dds/test/handles_client_disconnect_state_error_test.dart b/pkg/dds/test/handles_client_disconnect_state_error_test.dart
index 7499a52..87d027c 100644
--- a/pkg/dds/test/handles_client_disconnect_state_error_test.dart
+++ b/pkg/dds/test/handles_client_disconnect_state_error_test.dart
@@ -6,6 +6,7 @@
import 'package:dds/dds.dart';
import 'package:dds/src/dds_impl.dart';
+import 'package:dds/src/rpc_error_codes.dart';
import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
import 'package:pedantic/pedantic.dart';
import 'package:test/test.dart';
@@ -81,16 +82,22 @@
final client = json_rpc.Client(ws.cast<String>());
unawaited(client.listen());
+ bool caught = false;
+
// Make a request that causes the VM service peer to close in the middle of
// handling a request. This is meant to mimic a device being disconnected
// unexpectedly.
try {
await client.sendRequest('foo');
- } on json_rpc.RpcException {
+ } on json_rpc.RpcException catch (e) {
// This RPC exception is expected. This test is ensuring that DDS exits
// gracefully even if the VM service disappears.
+ expect(e.code, RpcErrorCodes.kServiceDisappeared);
+ caught = true;
}
+ expect(caught, true);
+
// DDS should shutdown if the VM service peer disconnects.
await dds.done;
});
diff --git a/pkg/dev_compiler/lib/src/compiler/module_containers.dart b/pkg/dev_compiler/lib/src/compiler/module_containers.dart
index 647353b..8bda34d 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_containers.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_containers.dart
@@ -198,8 +198,7 @@
containersToProperties.forEach((containerId, properties) {
var containerObject = js_ast.ObjectInitializer(properties,
multiline: properties.length > 1);
- statements.add(js.statement(
- 'var # = Object.create(#)', [containerId, containerObject]));
+ statements.add(js.statement('var # = #', [containerId, containerObject]));
aggregatedContainers.add(js.call('#', [containerId]));
});
// Create an aggregated access point over all containers for eval.
diff --git a/pkg/front_end/analysis_options_no_lints.yaml b/pkg/front_end/analysis_options_no_lints.yaml
index 25f50ec..d699e16 100644
--- a/pkg/front_end/analysis_options_no_lints.yaml
+++ b/pkg/front_end/analysis_options_no_lints.yaml
@@ -6,6 +6,7 @@
exclude:
- parser_testcases/**
- test/analyser_ignored/**
+ - test/class_hierarchy/data/**
- test/enable_non_nullable/data/**
- test/extensions/data/**
- test/id_testing/data/**
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index d778446..ce2ddc7 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -179,12 +179,8 @@
void checkSupertypes(CoreTypes coreTypes);
- void handleSeenCovariant(
- Types types,
- Member declaredMember,
- Member interfaceMember,
- bool isSetter,
- callback(Member declaredMember, Member interfaceMember, bool isSetter));
+ void handleSeenCovariant(Types types, Member interfaceMember, bool isSetter,
+ callback(Member interfaceMember, bool isSetter));
bool hasUserDefinedNoSuchMethod(
Class klass, ClassHierarchy hierarchy, Class objectClass);
@@ -740,12 +736,8 @@
}
@override
- void handleSeenCovariant(
- Types types,
- Member declaredMember,
- Member interfaceMember,
- bool isSetter,
- callback(Member declaredMember, Member interfaceMember, bool isSetter)) {
+ void handleSeenCovariant(Types types, Member interfaceMember, bool isSetter,
+ callback(Member interfaceMember, bool isSetter)) {
// When a parameter is covariant we have to check that we also
// override the same member in all parents.
for (Supertype supertype in interfaceMember.enclosingClass.supers) {
@@ -753,7 +745,7 @@
supertype.classNode, interfaceMember.name,
setter: isSetter);
if (m != null) {
- callback(declaredMember, m, isSetter);
+ callback(m, isSetter);
}
}
}
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 1e3fce0..736be55 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -791,9 +791,6 @@
bool get isProperty => true;
@override
- bool get isFunction => false;
-
- @override
bool isSameDeclaration(ClassMember other) {
return other is SourceFieldMember && memberBuilder == other.memberBuilder;
}
@@ -1460,9 +1457,6 @@
bool get isProperty => isField || isGetter || isSetter;
@override
- bool get isFunction => !isProperty;
-
- @override
ClassBuilder get classBuilder => fieldBuilder.classBuilder;
@override
@@ -1534,19 +1528,9 @@
bool get isAbstract => _member.isAbstract;
@override
- bool get needsComputation => false;
-
- @override
bool get isSynthesized => false;
@override
- bool get isInheritableConflict => false;
-
- @override
- ClassMember withParent(ClassBuilder classBuilder) =>
- throw new UnsupportedError("$runtimeType.withParent");
-
- @override
bool get hasDeclarations => false;
@override
@@ -1554,10 +1538,7 @@
throw new UnsupportedError("$runtimeType.declarations");
@override
- ClassMember get abstract => this;
-
- @override
- ClassMember get concrete => this;
+ ClassMember get interfaceMember => this;
@override
bool isSameDeclaration(ClassMember other) {
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index d28c5ac..b41a5a4 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -261,22 +261,12 @@
bool get isAbstract => memberBuilder.member.isAbstract;
@override
- bool get needsComputation => false;
-
- @override
bool get isSynthesized => false;
@override
bool get isInternalImplementation => false;
@override
- bool get isInheritableConflict => false;
-
- @override
- ClassMember withParent(ClassBuilder classBuilder) =>
- throw new UnsupportedError("$runtimeType.withParent");
-
- @override
bool get hasDeclarations => false;
@override
@@ -284,10 +274,7 @@
throw new UnsupportedError("$runtimeType.declarations");
@override
- ClassMember get abstract => this;
-
- @override
- ClassMember get concrete => this;
+ ClassMember get interfaceMember => this;
@override
String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index a56d974..388ba1d 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -639,9 +639,6 @@
memberBuilder.kind == ProcedureKind.Setter;
@override
- bool get isFunction => !isProperty;
-
- @override
bool isSameDeclaration(ClassMember other) {
return other is SourceProcedureMember &&
memberBuilder == other.memberBuilder;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 861e245..de71663d 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -254,6 +254,7 @@
bool get isSynthesized {
Member member = memberBuilder.member;
return member is Procedure &&
+ // TODO(johnniwinther): Should this just be `member.isSynthesized`?
(member.isMemberSignature ||
(member.isForwardingStub && !member.isForwardingSemiStub));
}
@@ -268,9 +269,6 @@
}
@override
- bool get isFunction => !isProperty;
-
- @override
void inferType(ClassHierarchyBuilder hierarchy) {
// Do nothing; this is only for source members.
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index a0fc2ac..cbc684d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -22,6 +22,7 @@
import 'package:kernel/src/standard_bounds.dart';
import 'package:kernel/src/types.dart' show Types;
+import '../../base/common.dart';
import '../../testing/id_testing_utils.dart' show typeToText;
import '../builder/builder.dart';
@@ -62,7 +63,6 @@
import '../names.dart' show noSuchMethodName;
-import '../problems.dart';
import '../scope.dart' show Scope;
import '../source/source_class_builder.dart';
@@ -227,13 +227,15 @@
bool get isFinal;
bool get isConst;
bool get forSetter;
- bool get isSourceDeclaration;
- /// Returns `true` if this member is a regular method or operator.
- bool get isFunction;
+ /// Returns `true` if this member corresponds to a declaration in the source
+ /// code.
+ bool get isSourceDeclaration;
/// Returns `true` if this member is a field, getter or setter.
bool get isProperty;
+
+ /// Computes the [Member] node resulting from this class member.
Member getMember(ClassHierarchyBuilder hierarchy);
/// Returns the member [Covariance] for this class member.
@@ -243,12 +245,17 @@
String get fullName;
String get fullNameForErrors;
ClassBuilder get classBuilder;
+
+ /// Returns `true` if this class member is declared in Object from dart:core.
bool isObjectMember(ClassBuilder objectClass);
Uri get fileUri;
int get charOffset;
+
+ /// Returns `true` if this class member is an interface member.
bool get isAbstract;
- bool get needsComputation;
+ /// Returns `true` if this member doesn't corresponds to a declaration in the
+ /// source code.
bool get isSynthesized;
// If `true` this member is not part of the interface but only part of the
@@ -258,17 +265,71 @@
// lowering.
bool get isInternalImplementation;
- bool get isInheritableConflict;
- ClassMember withParent(ClassBuilder classBuilder);
+ /// Returns `true` if this member is composed from a list of class members
+ /// accessible through [declarations].
bool get hasDeclarations;
+
+ /// If [hasDeclaration] is `true`, this returns the list of class members
+ /// from which this class member is composed.
+ ///
+ /// This is used in [unfoldDeclarations] to retrieve all underlying member
+ /// source declarations, and in [toSet] to retrieve all members used for
+ /// this class member wrt. certain level of the hierarchy.
+ /// TODO(johnniwinther): Can the use of [toSet] be replaced with a direct
+ /// use of [declarations]?
List<ClassMember> get declarations;
- ClassMember get abstract;
- ClassMember get concrete;
+
+ /// The interface member corresponding to this member.
+ ///
+ /// If this member is declared on the source, the interface member is
+ /// the member itself. For instance
+ ///
+ /// abstract class Class {
+ /// void concreteMethod() {}
+ /// void abstractMethod();
+ /// }
+ ///
+ /// the interface members for `concreteMethod` and `abstractMethod` are the
+ /// members themselves.
+ ///
+ /// If this member is a synthesized interface member, the
+ /// interface member is the member itself. For instance
+ ///
+ /// abstract class Interface1 {
+ /// void method() {}
+ /// }
+ /// abstract class Interface2 {
+ /// void method() {}
+ /// }
+ /// abstract class Class implements Interface1, Interface2 {}
+ ///
+ /// the interface member for `method` in `Class` is the synthesized interface
+ /// member created for the implemented members `Interface1.method` and
+ /// `Interface2.method`.
+ ///
+ /// If this member is a concrete member that implements an interface member,
+ /// the interface member is the implemented interface member. For instance
+ ///
+ /// class Super {
+ /// void method() {}
+ /// }
+ /// class Interface {
+ /// void method() {}
+ /// }
+ /// class Class extends Super implements Interface {}
+ ///
+ /// the interface member for `Super.method` implementing `method` in `Class`
+ /// is the synthesized interface member created for the implemented members
+ /// `Super.method` and `Interface.method`.
+ ClassMember get interfaceMember;
void inferType(ClassHierarchyBuilder hierarchy);
void registerOverrideDependency(Set<ClassMember> overriddenMembers);
/// Returns `true` if this has the same underlying declaration as [other].
+ ///
+ /// This is used for avoiding unnecessary checks and can this trivially
+ /// return `false`.
bool isSameDeclaration(ClassMember other);
}
@@ -381,9 +442,10 @@
_delayedTypeComputations.add(computation);
}
- void registerOverrideCheck(
- SourceClassBuilder classBuilder, ClassMember a, ClassMember b) {
- _delayedChecks.add(new DelayedOverrideCheck(classBuilder, a, b));
+ void registerOverrideCheck(SourceClassBuilder classBuilder,
+ ClassMember declaredMember, Set<ClassMember> overriddenMembers) {
+ _delayedChecks.add(new DelayedOverrideCheck(
+ classBuilder, declaredMember, overriddenMembers));
}
void registerGetterSetterCheck(
@@ -646,8 +708,6 @@
bool hasNoSuchMethod = false;
- List<ClassMember> abstractMembers = null;
-
final Map<Class, Substitution> substitutions;
ClassHierarchyNodeBuilder(
@@ -985,7 +1045,7 @@
}
}
- /// Infers the field type of [declaredMember] based on [overriddenMembers].
+ /// Infers the field type of [fieldBuilder] based on [overriddenMembers].
static void inferFieldType(
ClassHierarchyBuilder hierarchy,
ClassBuilder classBuilder,
@@ -1088,6 +1148,15 @@
messageDeclaredMemberConflictsWithInheritedMemberCause
.withLocation(b.fileUri, b.charOffset, name.length)
]);
+ } else if (b.classBuilder == classBuilder) {
+ classBuilder.addProblem(
+ messageDeclaredMemberConflictsWithInheritedMember,
+ b.charOffset,
+ name.length,
+ context: <LocatedMessage>[
+ messageDeclaredMemberConflictsWithInheritedMemberCause
+ .withLocation(a.fileUri, a.charOffset, name.length)
+ ]);
} else {
classBuilder.addProblem(messageInheritedMembersConflict,
classBuilder.charOffset, classBuilder.fullNameForErrors.length,
@@ -1137,15 +1206,6 @@
}
}
- void recordAbstractMember(ClassMember member) {
- abstractMembers ??= <ClassMember>[];
- if (member.hasDeclarations && classBuilder == member.classBuilder) {
- abstractMembers.addAll(member.declarations);
- } else {
- abstractMembers.add(member);
- }
- }
-
ClassHierarchyNode build() {
assert(!classBuilder.isPatch);
ClassHierarchyNode supernode;
@@ -1158,12 +1218,23 @@
assert(supernode != null);
}
+ /// Set to `true` if the class needs interfaces, that is, if it has any
+ /// members where the interface member is different from its corresponding
+ /// class members.
+ ///
+ /// This is an optimization to avoid unnecessary computation of interface
+ /// members.
+ bool hasInterfaces = false;
+
Map<Name, Tuple> memberMap = {};
Scope scope = classBuilder.scope;
for (MemberBuilder memberBuilder in scope.localMembers) {
for (ClassMember classMember in memberBuilder.localMembers) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.declareMember(classMember);
@@ -1172,6 +1243,9 @@
}
}
for (ClassMember classMember in memberBuilder.localSetters) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.declareSetter(classMember);
@@ -1183,6 +1257,9 @@
for (MemberBuilder memberBuilder in scope.localSetters) {
for (ClassMember classMember in memberBuilder.localMembers) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.declareMember(classMember);
@@ -1191,6 +1268,9 @@
}
}
for (ClassMember classMember in memberBuilder.localSetters) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.declareSetter(classMember);
@@ -1219,6 +1299,9 @@
for (MemberBuilder memberBuilder in scope.localMembers) {
for (ClassMember classMember in memberBuilder.localMembers) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.mixInMember(classMember);
@@ -1227,6 +1310,9 @@
}
}
for (ClassMember classMember in memberBuilder.localSetters) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
@@ -1238,6 +1324,9 @@
for (MemberBuilder memberBuilder in scope.localSetters) {
for (ClassMember classMember in memberBuilder.localMembers) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.mixInMember(classMember);
@@ -1246,6 +1335,9 @@
}
}
for (ClassMember classMember in memberBuilder.localSetters) {
+ if (classMember.isAbstract) {
+ hasInterfaces = true;
+ }
Tuple tuple = memberMap[classMember.name];
if (tuple == null) {
memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
@@ -1309,7 +1401,6 @@
}
}
- bool hasInterfaces = false;
if (supernode == null) {
// This should be Object.
superclasses = new List<Supertype>.filled(0, null);
@@ -1365,8 +1456,10 @@
hasInterfaces = true;
}
- implement(supernode.interfaceMemberMap);
- implement(supernode.interfaceSetterMap);
+ if (hasInterfaces) {
+ implement(supernode.interfaceMemberMap ?? supernode.classMemberMap);
+ implement(supernode.interfaceSetterMap ?? supernode.classSetterMap);
+ }
if (directInterfaceBuilders != null) {
for (int i = 0; i < directInterfaceBuilders.length; i++) {
@@ -1459,516 +1552,1460 @@
/// [ClassHierarchyNode].
Map<Name, ClassMember> interfaceSetterMap = {};
- void registerOverrideCheck(
- ClassMember member, ClassMember overriddenMember) {
+ /// Map for members declared in this class to the members that they
+ /// override. This is used for checking valid overrides and to ensure that
+ /// override inference correctly propagates inferred types through the
+ /// class hierarchy.
+ Map<ClassMember, Set<ClassMember>> declaredOverridesMap = {};
+
+ /// In case this class is a mixin application, this maps members declared in
+ /// the mixin to the members that they override. This is used for checking
+ /// valid overrides but _not_ as for [declaredOverridesMap] for override
+ /// inference.
+ Map<ClassMember, Set<ClassMember>> mixinApplicationOverridesMap = {};
+
+ /// In case this class is concrete, this maps concrete members that are
+ /// inherited into this class to the members they should override to validly
+ /// implement the interface of this class.
+ Map<ClassMember, Set<ClassMember>> inheritedImplementsMap = {};
+
+ /// In case this class is concrete, this holds the interface members
+ /// without a corresponding class member. These are either reported as
+ /// missing implementations or trigger insertion of noSuchMethod forwarders.
+ List<ClassMember> abstractMembers = [];
+
+ ClassHierarchyNodeDataForTesting dataForTesting;
+ if (retainDataForTesting) {
+ dataForTesting = new ClassHierarchyNodeDataForTesting(
+ abstractMembers,
+ declaredOverridesMap,
+ mixinApplicationOverridesMap,
+ inheritedImplementsMap);
+ }
+
+ /// Registers that the current class has an interface member without a
+ /// corresponding class member.
+ ///
+ /// This is used to report missing implementation or, in the case the class
+ /// has a user defined concrete noSuchMethod, to insert noSuchMethod
+ /// forwarders. (Currently, insertion of forwarders is handled elsewhere.)
+ ///
+ /// For instance:
+ ///
+ /// abstract class Interface {
+ /// method();
+ /// }
+ /// class Class1 implements Interface {
+ /// // Missing implementation for `Interface.method`.
+ /// }
+ /// class Class2 implements Interface {
+ /// noSuchMethod(_) {}
+ /// // A noSuchMethod forwarder is added for `Interface.method`.
+ /// }
+ ///
+ void registerAbstractMember(ClassMember abstractMember) {
+ if (!abstractMember.isInternalImplementation) {
+ /// If `isInternalImplementation` is `true`, the member is synthesized
+ /// implementation that does not require implementation in other
+ /// classes.
+ ///
+ /// This is for instance used for late lowering where
+ ///
+ /// class Interface {
+ /// late int? field;
+ /// }
+ /// class Class implements Interface {
+ /// int? field;
+ /// }
+ ///
+ /// is encoded as
+ ///
+ /// class Interface {
+ /// bool _#field#isSet = false;
+ /// int? _#field = null;
+ /// int? get field => _#field#isSet ? _#field : throw ...;
+ /// void set field(int? value) { ... }
+ /// }
+ /// class Class implements Interface {
+ /// int? field;
+ /// }
+ ///
+ /// and `Class` should not be required to implement
+ /// `Interface._#field#isSet` and `Interface._#field`.
+ abstractMembers.add(abstractMember);
+ }
+ }
+
+ /// Registers that [inheritedMember] should be checked to validly override
+ /// [overrides].
+ ///
+ /// This is needed in the case where a concrete member is inherited into
+ /// a concrete subclass. For instance:
+ ///
+ /// class Super {
+ /// void method() {}
+ /// }
+ /// abstract class Interface {
+ /// void method();
+ /// }
+ /// class Class extends Super implements Interface {}
+ ///
+ /// Here `Super.method` must be checked to be a valid implementation for
+ /// `Interface.method` by being a valid override of it.
+ void registerInheritedImplements(
+ ClassMember inheritedMember, Set<ClassMember> overrides,
+ {ClassMember aliasForTesting}) {
if (classBuilder is SourceClassBuilder) {
- if (overriddenMember.hasDeclarations &&
- classBuilder == overriddenMember.classBuilder) {
- for (int i = 0; i < overriddenMember.declarations.length; i++) {
- hierarchy.registerOverrideCheck(
- classBuilder, member, overriddenMember.declarations[i]);
- }
- } else {
- hierarchy.registerOverrideCheck(
- classBuilder, member, overriddenMember);
+ assert(
+ inheritedMember.classBuilder != classBuilder,
+ "Only inherited members can implement by inheritance: "
+ "${inheritedMember}");
+ inheritedImplementsMap[inheritedMember] = overrides;
+ if (dataForTesting != null && aliasForTesting != null) {
+ dataForTesting.aliasMap[aliasForTesting] = inheritedMember;
}
}
}
- memberMap.forEach((Name name, Tuple tuple) {
- Set<ClassMember> overriddenMembers = {};
+ /// Returns `true` if the current class is from an opt-out library and
+ /// [classMember] is from an opt-in library.
+ ///
+ /// In this case a member signature needs to be inserted to show the
+ /// legacy erased type of the interface member. For instance:
+ ///
+ /// // Opt-in library:
+ /// class Super {
+ /// int? method(int i) {}
+ /// }
+ /// // Opt-out library:
+ /// class Class extends Super {
+ /// // A member signature is inserted:
+ /// // int* method(int* i);
+ /// }
+ ///
+ bool needsMemberSignatureFor(ClassMember classMember) {
+ return !classBuilder.library.isNonNullableByDefault &&
+ classMember.classBuilder.library.isNonNullableByDefault;
+ }
- void registerOverrideDependency(
- ClassMember member, ClassMember overriddenMember) {
- if (classBuilder == member.classBuilder && member.isSourceDeclaration) {
- if (overriddenMember.hasDeclarations &&
- classBuilder == overriddenMember.classBuilder) {
- for (int i = 0; i < overriddenMember.declarations.length; i++) {
- registerOverrideDependency(
- member, overriddenMember.declarations[i]);
- }
+ memberMap.forEach((Name name, Tuple tuple) {
+ /// The computation starts by sanitizing the members. Conflicts between
+ /// methods and properties (getters/setters) or between static and
+ /// instance members are reported. Conflicting members and members
+ /// overridden by duplicates are removed.
+ ///
+ /// For this [definingGetable] and [definingSetable] hold the first member
+ /// of its kind found among declared, mixed in, extended and implemented
+ /// members.
+ ///
+ /// Conflicts between [definingGetable] and [definingSetable] are reported
+ /// afterwards.
+
+ ClassMember definingGetable;
+ ClassMember definingSetable;
+
+ ClassMember declaredGetable = tuple.declaredMember;
+ if (declaredGetable != null) {
+ /// class Class {
+ /// method() {}
+ /// }
+ definingGetable = declaredGetable;
+ }
+ ClassMember declaredSetable = tuple.declaredSetter;
+ if (declaredSetable != null) {
+ /// class Class {
+ /// set setter(value) {}
+ /// }
+ definingSetable = declaredSetable;
+ }
+
+ ClassMember mixedInGetable;
+ if (tuple.mixedInMember != null &&
+ !tuple.mixedInMember.isStatic &&
+ !tuple.mixedInMember.isDuplicate) {
+ /// We treat
+ ///
+ /// class Mixin {
+ /// static method1() {}
+ /// method2() {}
+ /// method2() {}
+ /// }
+ /// class Class with Mixin {}
+ ///
+ /// as
+ ///
+ /// class Mixin {}
+ /// class Class with Mixin {}
+ ///
+ if (definingGetable == null) {
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class with Mixin {}
+ definingGetable = mixedInGetable = tuple.mixedInMember;
+ } else if (!definingGetable.isDuplicate) {
+ // This case is currently unreachable from source code since classes
+ // cannot both declare and mix in members. From dill, this can occur
+ // but should not conflicting members.
+ //
+ // The case is handled for consistency.
+ if (definingGetable.isStatic ||
+ definingGetable.isProperty != tuple.mixedInMember.isProperty) {
+ reportInheritanceConflict(definingGetable, tuple.mixedInMember);
} else {
- overriddenMembers.add(overriddenMember);
+ mixedInGetable = tuple.mixedInMember;
+ }
+ }
+ }
+ ClassMember mixedInSetable;
+ if (tuple.mixedInSetter != null &&
+ !tuple.mixedInSetter.isStatic &&
+ !tuple.mixedInSetter.isDuplicate) {
+ /// We treat
+ ///
+ /// class Mixin {
+ /// static set setter1(value) {}
+ /// set setter2(value) {}
+ /// set setter2(value) {}
+ /// }
+ /// class Class with Mixin {}
+ ///
+ /// as
+ ///
+ /// class Mixin {}
+ /// class Class with Mixin {}
+ ///
+ if (definingSetable == null) {
+ /// class Mixin {
+ /// set setter(value) {}
+ /// }
+ /// class Class with Mixin {}
+ definingSetable = mixedInSetable = tuple.mixedInSetter;
+ } else if (!definingSetable.isDuplicate) {
+ if (definingSetable.isStatic ||
+ definingSetable.isProperty != tuple.mixedInSetter.isProperty) {
+ reportInheritanceConflict(definingGetable, tuple.mixedInSetter);
+ } else {
+ mixedInSetable = tuple.mixedInSetter;
}
}
}
- ClassMember computeClassMember(
+ ClassMember extendedGetable;
+ if (tuple.extendedMember != null &&
+ !tuple.extendedMember.isStatic &&
+ !tuple.extendedMember.isDuplicate) {
+ /// We treat
+ ///
+ /// class Super {
+ /// static method1() {}
+ /// method2() {}
+ /// method2() {}
+ /// }
+ /// class Class extends Super {}
+ ///
+ /// as
+ ///
+ /// class Super {}
+ /// class Class extends Super {}
+ ///
+ if (definingGetable == null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {}
+ definingGetable = extendedGetable = tuple.extendedMember;
+ } else if (!definingGetable.isDuplicate) {
+ if (definingGetable.isStatic ||
+ definingGetable.isProperty != tuple.extendedMember.isProperty) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {
+ /// static method() {}
+ /// }
+ ///
+ /// or
+ ///
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {
+ /// get getter => 0;
+ /// }
+ reportInheritanceConflict(definingGetable, tuple.extendedMember);
+ } else {
+ extendedGetable = tuple.extendedMember;
+ }
+ }
+ }
+ ClassMember extendedSetable;
+ if (tuple.extendedSetter != null &&
+ !tuple.extendedSetter.isStatic &&
+ !tuple.extendedSetter.isDuplicate) {
+ /// We treat
+ ///
+ /// class Super {
+ /// static set setter1(value) {}
+ /// set setter2(value) {}
+ /// set setter2(value) {}
+ /// }
+ /// class Class extends Super {}
+ ///
+ /// as
+ ///
+ /// class Super {}
+ /// class Class extends Super {}
+ ///
+ if (definingSetable == null) {
+ /// class Super {
+ /// set setter(value) {}
+ /// }
+ /// class Class extends Super {}
+ definingSetable = extendedSetable = tuple.extendedSetter;
+ } else if (!definingSetable.isDuplicate) {
+ if (definingSetable.isStatic ||
+ definingSetable.isProperty != tuple.extendedSetter.isProperty) {
+ reportInheritanceConflict(definingSetable, tuple.extendedSetter);
+ } else {
+ extendedSetable = tuple.extendedSetter;
+ }
+ }
+ }
+
+ // TODO(johnniwinther): Remove extended and mixed in members/setters
+ // from implemented members/setters. Mixin applications always implement
+ // the mixin class leading to unnecessary interface members.
+ List<ClassMember> implementedGetables;
+ if (tuple.implementedMembers != null &&
+ // Skip implemented members if we already have a duplicate.
+ !(definingGetable != null && definingGetable.isDuplicate)) {
+ for (int i = 0; i < tuple.implementedMembers.length; i++) {
+ ClassMember implementedGetable = tuple.implementedMembers[i];
+ if (implementedGetable.isStatic || implementedGetable.isDuplicate) {
+ /// We treat
+ ///
+ /// class Interface {
+ /// static method1() {}
+ /// method2() {}
+ /// method2() {}
+ /// }
+ /// class Class implements Interface {}
+ ///
+ /// as
+ ///
+ /// class Interface {}
+ /// class Class implements Interface {}
+ ///
+ implementedGetable = null;
+ } else {
+ if (definingGetable == null) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {}
+ definingGetable = implementedGetable;
+ } else if (definingGetable.isStatic ||
+ definingGetable.isProperty != implementedGetable.isProperty) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {
+ /// static method() {}
+ /// }
+ ///
+ /// or
+ ///
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {
+ /// get getter => 0;
+ /// }
+ reportInheritanceConflict(definingGetable, implementedGetable);
+ implementedGetable = null;
+ }
+ }
+ if (implementedGetable == null) {
+ // On the first skipped member we add all previous.
+ implementedGetables ??= tuple.implementedMembers.take(i).toList();
+ } else if (implementedGetables != null) {
+ // If already skipping members we add [implementedGetable]
+ // explicitly.
+ implementedGetables.add(implementedGetable);
+ }
+ }
+ if (implementedGetables == null) {
+ // No members were skipped so we use the full list.
+ implementedGetables = tuple.implementedMembers;
+ } else if (implementedGetables.isEmpty) {
+ // No members were included.
+ implementedGetables = null;
+ }
+ }
+
+ List<ClassMember> implementedSetables;
+ if (tuple.implementedSetters != null &&
+ // Skip implemented setters if we already have a duplicate.
+ !(definingSetable != null && definingSetable.isDuplicate)) {
+ for (int i = 0; i < tuple.implementedSetters.length; i++) {
+ ClassMember implementedSetable = tuple.implementedSetters[i];
+ if (implementedSetable.isStatic || implementedSetable.isDuplicate) {
+ /// We treat
+ ///
+ /// class Interface {
+ /// static set setter1(value) {}
+ /// set setter2(value) {}
+ /// set setter2(value) {}
+ /// }
+ /// class Class implements Interface {}
+ ///
+ /// as
+ ///
+ /// class Interface {}
+ /// class Class implements Interface {}
+ ///
+ implementedSetable = null;
+ } else {
+ if (definingSetable == null) {
+ /// class Interface {
+ /// set setter(value) {}
+ /// }
+ /// class Class implements Interface {}
+ definingSetable = implementedSetable;
+ } else if (definingSetable.isStatic ||
+ definingSetable.isProperty != implementedSetable.isProperty) {
+ /// class Interface {
+ /// set setter(value) {}
+ /// }
+ /// class Class implements Interface {
+ /// static set setter(value) {}
+ /// }
+ reportInheritanceConflict(definingSetable, implementedSetable);
+ implementedSetable = null;
+ }
+ }
+ if (implementedSetable == null) {
+ // On the first skipped setter we add all previous.
+ implementedSetables ??= tuple.implementedSetters.take(i).toList();
+ } else if (implementedSetables != null) {
+ // If already skipping setters we add [implementedSetable]
+ // explicitly.
+ implementedSetables.add(implementedSetable);
+ }
+ }
+ if (implementedSetables == null) {
+ // No setters were skipped so we use the full list.
+ implementedSetables = tuple.implementedSetters;
+ } else if (implementedSetables.isEmpty) {
+ // No setters were included.
+ implementedSetables = null;
+ }
+ }
+
+ if (definingGetable != null && definingSetable != null) {
+ if (definingGetable.isStatic != definingSetable.isStatic ||
+ definingGetable.isProperty != definingSetable.isProperty) {
+ reportInheritanceConflict(definingGetable, definingSetable);
+ // TODO(johnniwinther): Should we remove [definingSetable]? If we
+ // leave it in this conflict will also be reported in subclasses. If
+ // we remove it, any write to the setable will be unresolved.
+ }
+ }
+
+ // TODO(johnniwinther): Handle declared members together with mixed in
+ // members. This should only occur from .dill, though.
+ if (mixedInGetable != null) {
+ declaredGetable = null;
+ }
+ if (mixedInSetable != null) {
+ declaredSetable = null;
+ }
+
+ /// Set to `true` if declared members have been registered in
+ /// [registerDeclaredOverride] or [registerMixedInOverride].
+ bool hasDeclaredMembers = false;
+
+ /// Declared methods, getters and setters registered in
+ /// [registerDeclaredOverride].
+ ClassMember declaredMethod;
+ List<ClassMember> declaredProperties;
+
+ /// Declared methods, getters and setters registered in
+ /// [registerDeclaredOverride].
+ ClassMember mixedInMethod;
+ List<ClassMember> mixedInProperties;
+
+ /// Registers that [declaredMember] overrides extended and implemented
+ /// members.
+ ///
+ /// Getters and setters share overridden members so the registration
+ /// of override relations is performed after the interface members have
+ /// been computed.
+ ///
+ /// Declared members must be checked for valid override of the overridden
+ /// members _and_ must register an override dependency with the overridden
+ /// members so that override inference can propagate inferred types
+ /// correctly. For instance:
+ ///
+ /// class Super {
+ /// int get property => 42;
+ /// }
+ /// class Class extends Super {
+ /// void set property(value) {}
+ /// }
+ ///
+ /// Here the parameter type of the setter `Class.property` must be
+ /// inferred from the type of the getter `Super.property`.
+ void registerDeclaredOverride(ClassMember declaredMember,
+ {ClassMember aliasForTesting}) {
+ if (classBuilder is SourceClassBuilder && !declaredMember.isStatic) {
+ assert(
+ declaredMember.isSourceDeclaration &&
+ declaredMember.classBuilder == classBuilder,
+ "Only declared members can override: ${declaredMember}");
+ hasDeclaredMembers = true;
+ if (declaredMember.isProperty) {
+ declaredProperties ??= [];
+ declaredProperties.add(declaredMember);
+ } else {
+ assert(
+ declaredMethod == null,
+ "Multiple methods unexpectedly declared: "
+ "${declaredMethod} and ${declaredMember}.");
+ declaredMethod = declaredMember;
+ }
+ if (dataForTesting != null && aliasForTesting != null) {
+ dataForTesting.aliasMap[aliasForTesting] = declaredMember;
+ }
+ }
+ }
+
+ /// Registers that [mixedMember] overrides extended and implemented
+ /// members through application.
+ ///
+ /// Getters and setters share overridden members so the registration
+ /// of override relations in performed after the interface members have
+ /// been computed.
+ ///
+ /// Declared mixed in members must be checked for valid override of the
+ /// overridden members but _not_ register an override dependency with the
+ /// overridden members. This is in contrast to declared members. For
+ /// instance:
+ ///
+ /// class Super {
+ /// int get property => 42;
+ /// }
+ /// class Mixin {
+ /// void set property(value) {}
+ /// }
+ /// class Class = Super with Mixin;
+ ///
+ /// Here the parameter type of the setter `Mixin.property` must _not_ be
+ /// inferred from the type of the getter `Super.property`, but should
+ /// instead default to `dynamic`.
+ void registerMixedInOverride(ClassMember mixedInMember,
+ {ClassMember aliasForTesting}) {
+ assert(mixedInMember.classBuilder != classBuilder,
+ "Only mixin members can override by application: ${mixedInMember}");
+ if (classBuilder is SourceClassBuilder) {
+ hasDeclaredMembers = true;
+ if (mixedInMember.isProperty) {
+ mixedInProperties ??= [];
+ mixedInProperties.add(mixedInMember);
+ } else {
+ assert(
+ mixedInMethod == null,
+ "Multiple methods unexpectedly declared in mixin: "
+ "${mixedInMethod} and ${mixedInMember}.");
+ mixedInMethod = mixedInMember;
+ }
+ if (dataForTesting != null && aliasForTesting != null) {
+ dataForTesting.aliasMap[aliasForTesting] = mixedInMember;
+ }
+ }
+ }
+
+ /// Computes the class and interface members for a method, getter, or
+ /// setter in the current [tuple].
+ ///
+ /// [definingMember] is the member which defines whether the computation
+ /// is for a method, a getter or a setter.
+ /// [declaredMember] is the member declared in the current class, if any.
+ /// [mixedInMember] is the member declared in a mixin that is mixed into
+ /// the current current class, if any.
+ /// [extendedMember] is the member inherited from the super class.
+ /// [implementedMembers] are the members inherited from the super
+ /// interfaces, if none this is `null`.
+ ///
+ /// The computed class and interface members are added to [classMemberMap]
+ /// and [interfaceMemberMap], respectively.
+ ClassMember computeMembers(
+ {ClassMember definingMember,
ClassMember declaredMember,
ClassMember mixedInMember,
ClassMember extendedMember,
- bool forSetter) {
+ List<ClassMember> implementedMembers,
+ Map<Name, ClassMember> classMemberMap,
+ Map<Name, ClassMember> interfaceMemberMap}) {
+ ClassMember classMember;
+ ClassMember interfaceMember;
+
if (mixedInMember != null) {
- // TODO(johnniwinther): Handle members declared in mixin applications
- // correctly.
- declaredMember = null;
- }
- if (declaredMember != null) {
- if (extendedMember != null && !extendedMember.isStatic) {
- if (declaredMember == extendedMember) return declaredMember;
- if (declaredMember.isDuplicate || extendedMember.isDuplicate) {
- // Don't check overrides involving duplicated members.
- return declaredMember;
- }
- ClassMember result =
- checkInheritanceConflict(declaredMember, extendedMember);
- if (result != null) return result;
- assert(
- declaredMember.isProperty == extendedMember.isProperty,
- "Unexpected member combination: "
- "$declaredMember vs $extendedMember");
- result = declaredMember;
+ if (mixedInMember.isAbstract) {
+ /// class Mixin {
+ /// method();
+ /// }
+ /// class Class = Object with Mixin;
- // [declaredMember] is a method declared in [cls]. This means it
- // defines the interface of this class regardless if its abstract.
- if (!declaredMember.isSynthesized) {
- registerOverrideDependency(
- declaredMember, extendedMember.abstract);
- registerOverrideCheck(declaredMember, extendedMember.abstract);
+ /// Interface members from the extended, mixed in, and implemented
+ /// members define the combined member signature.
+ Set<ClassMember> interfaceMembers = {};
+
+ if (extendedMember != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method();
+ /// }
+ /// class Class = Super with Mixin;
+ interfaceMembers.add(extendedMember.interfaceMember);
}
- if (declaredMember.isAbstract) {
- if (extendedMember.isAbstract) {
- recordAbstractMember(declaredMember);
- } else {
- if (!classBuilder.isAbstract) {
- // The interface of this class is [declaredMember]. But the
- // implementation is [extendedMember]. So [extendedMember]
- // must implement [declaredMember], unless [cls] is abstract.
- registerOverrideCheck(extendedMember, declaredMember);
- }
- ClassMember concrete = extendedMember.concrete;
- result = new AbstractMemberOverridingImplementation(
- classBuilder,
- declaredMember,
- concrete,
- declaredMember.isProperty,
- forSetter,
- shouldModifyKernel,
- concrete.isAbstract,
- concrete.name);
- hierarchy.registerMemberComputation(result);
+ interfaceMembers.add(mixedInMember);
+
+ if (implementedMembers != null) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method();
+ /// }
+ /// class Class = Object with Mixin implements Interface;
+ interfaceMembers.addAll(implementedMembers);
+ }
+
+ /// We always create a synthesized interface member, even in the
+ /// case of [interfaceMembers] being a singleton, to insert the
+ /// abstract mixin stub.
+ interfaceMember = new SynthesizedInterfaceMember(
+ classBuilder, name, interfaceMembers.toList(),
+ superClassMember: extendedMember,
+ canonicalMember: mixedInMember,
+ mixedInMember: mixedInMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter,
+ shouldModifyKernel: shouldModifyKernel);
+ hierarchy.registerMemberComputation(interfaceMember);
+
+ if (extendedMember != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method();
+ /// }
+ /// class Class = Super with Mixin;
+ ///
+ /// The concrete extended member is the class member but might
+ /// be overwritten by a concrete forwarding stub:
+ ///
+ /// class Super {
+ /// method(int i) {}
+ /// }
+ /// class Interface {
+ /// method(covariant int i) {}
+ /// }
+ /// class Mixin {
+ /// method(int i);
+ /// }
+ /// // A concrete forwarding stub
+ /// // method(covariant int i) => super.method(i);
+ /// // will be inserted.
+ /// class Class = Super with Mixin implements Interface;
+ ///
+ classMember = new InheritedClassMemberImplementsInterface(
+ classBuilder, name,
+ inheritedClassMember: extendedMember,
+ implementedInterfaceMember: interfaceMember,
+ forSetter: definingMember.forSetter,
+ isProperty: definingMember.isProperty);
+ hierarchy.registerMemberComputation(classMember);
+ if (!classBuilder.isAbstract) {
+ registerInheritedImplements(extendedMember, {interfaceMember},
+ aliasForTesting: classMember);
}
+ } else if (!classBuilder.isAbstract) {
+ /// class Mixin {
+ /// method(); // Missing implementation.
+ /// }
+ /// class Class = Object with Mixin;
+ registerAbstractMember(interfaceMember);
}
- assert(
- !(classBuilder.isMixinApplication &&
- declaredMember.classBuilder != classBuilder),
- "Unexpected declared member ${declaredMember} in "
- "${classBuilder} from foreign class.");
- if (result.name == noSuchMethodName &&
- !result.isObjectMember(objectClass)) {
- hasNoSuchMethod = true;
- }
- return result;
- } else {
- if (declaredMember.isAbstract) {
- recordAbstractMember(declaredMember);
- }
- return declaredMember;
- }
- } else if (mixedInMember != null) {
- if (extendedMember != null && !extendedMember.isStatic) {
- if (mixedInMember == extendedMember) return mixedInMember;
- if (mixedInMember.isDuplicate || extendedMember.isDuplicate) {
- // Don't check overrides involving duplicated members.
- return mixedInMember;
- }
- ClassMember result =
- checkInheritanceConflict(mixedInMember, extendedMember);
- if (result != null) return result;
- assert(
- mixedInMember.isProperty == extendedMember.isProperty,
- "Unexpected member combination: "
- "$mixedInMember vs $extendedMember");
- result = mixedInMember;
-
- // [declaredMember] is a method declared in [cls]. This means it
- // defines the interface of this class regardless if its abstract.
if (!mixedInMember.isSynthesized) {
- registerOverrideDependency(
- mixedInMember, extendedMember.abstract);
- registerOverrideCheck(mixedInMember, extendedMember.abstract);
+ /// Members declared in the mixin must override extended and
+ /// implemented members.
+ ///
+ /// When loading from .dill the mixed in member might be
+ /// synthesized, for instance a member signature or forwarding
+ /// stub, and this should not be checked to override the extended
+ /// and implemented members:
+ ///
+ /// // Opt-out library, from source:
+ /// class Mixin {}
+ /// // Opt-out library, from .dill:
+ /// class Mixin {
+ /// ...
+ /// String* toString(); // member signature
+ /// }
+ /// // Opt-out library, from source:
+ /// class Class = Object with Mixin;
+ /// // Mixin.toString should not be checked to override
+ /// // Object.toString.
+ ///
+ registerMixedInOverride(mixedInMember,
+ aliasForTesting: interfaceMember);
}
-
- if (mixedInMember.isAbstract) {
- if (extendedMember.isAbstract) {
- recordAbstractMember(mixedInMember);
- } else {
- if (!classBuilder.isAbstract) {
- // The interface of this class is [declaredMember]. But the
- // implementation is [extendedMember]. So [extendedMember]
- // must implement [declaredMember], unless [cls] is abstract.
- registerOverrideCheck(extendedMember, mixedInMember);
- }
- ClassMember concrete = extendedMember.concrete;
- result = new AbstractMemberOverridingImplementation(
- classBuilder,
- mixedInMember,
- concrete,
- mixedInMember.isProperty,
- forSetter,
- shouldModifyKernel,
- concrete.isAbstract,
- concrete.name);
- hierarchy.registerMemberComputation(result);
- }
- } else {
- assert(
- (classBuilder.isMixinApplication &&
- mixedInMember.classBuilder != classBuilder),
- "Unexpected mixed in member ${mixedInMember} in "
- "${classBuilder} from the current class.");
- result = InheritedImplementationInterfaceConflict.combined(
- classBuilder,
- mixedInMember,
- /*isSuperClassMemberMixedIn = */ true,
- extendedMember,
- forSetter,
- shouldModifyKernel,
- isInheritableConflict: false);
- if (result.needsComputation) {
- hierarchy.registerMemberComputation(result);
- }
- }
-
- if (result.name == noSuchMethodName &&
- !result.isObjectMember(objectClass)) {
- hasNoSuchMethod = true;
- }
- return result;
} else {
- if (mixedInMember.isAbstract) {
- recordAbstractMember(mixedInMember);
+ assert(!mixedInMember.isAbstract);
+
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class = Object with Mixin;
+ ///
+
+ /// Interface members from the extended, mixed in, and implemented
+ /// members define the combined member signature.
+ Set<ClassMember> interfaceMembers = {};
+
+ if (extendedMember != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class = Super with Mixin;
+ interfaceMembers.add(extendedMember.interfaceMember);
+ }
+
+ interfaceMembers.add(mixedInMember);
+
+ if (implementedMembers != null) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class = Object with Mixin implements Interface;
+ interfaceMembers.addAll(implementedMembers);
+ }
+
+ /// We always create a synthesized interface member, even in the
+ /// case of [interfaceMembers] being a singleton, to insert the
+ /// concrete mixin stub.
+ interfaceMember = new SynthesizedInterfaceMember(
+ classBuilder, name, interfaceMembers.toList(),
+ superClassMember: mixedInMember,
+ canonicalMember: mixedInMember,
+ mixedInMember: mixedInMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter,
+ shouldModifyKernel: shouldModifyKernel);
+ hierarchy.registerMemberComputation(interfaceMember);
+
+ /// The concrete mixed in member is the class member but will
+ /// be overwritten by a concrete mixin stub:
+ ///
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// // A concrete mixin stub
+ /// // method() => super.method();
+ /// // will be inserted.
+ /// class Class = Object with Mixin;
+ ///
+ classMember = new InheritedClassMemberImplementsInterface(
+ classBuilder, name,
+ inheritedClassMember: mixedInMember,
+ implementedInterfaceMember: interfaceMember,
+ forSetter: definingMember.forSetter,
+ isProperty: definingMember.isProperty);
+ hierarchy.registerMemberComputation(classMember);
+
+ if (!classBuilder.isAbstract) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class = Object with Mixin;
+ ///
+ /// [mixinMember] must implemented interface member.
+ registerInheritedImplements(mixedInMember, {interfaceMember},
+ aliasForTesting: classMember);
+ }
+ if (!mixedInMember.isSynthesized) {
+ /// Members declared in the mixin must override extended and
+ /// implemented members.
+ ///
+ /// When loading from .dill the mixed in member might be
+ /// synthesized, for instance a member signature or forwarding
+ /// stub, and this should not be checked to override the extended
+ /// and implemented members.
+ ///
+ /// These synthesized mixed in members should always be abstract
+ /// and therefore not be handled here, but we handled them here
+ /// for consistency.
+ registerMixedInOverride(mixedInMember);
+ }
+ }
+ } else if (declaredMember != null) {
+ if (declaredMember.isAbstract) {
+ /// class Class {
+ /// method();
+ /// }
+ interfaceMember = declaredMember;
+
+ /// Interface members from the declared, extended, and implemented
+ /// members define the combined member signature.
+ Set<ClassMember> interfaceMembers = {};
+
+ if (extendedMember != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {
+ /// method();
+ /// }
+ interfaceMembers.add(extendedMember);
+ }
+
+ interfaceMembers.add(declaredMember);
+
+ if (implementedMembers != null) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {
+ /// method();
+ /// }
+ interfaceMembers.addAll(implementedMembers);
+ }
+
+ /// If only one member defines the interface member there is no
+ /// need for a synthesized interface member, since its result will
+ /// simply be that one member.
+ if (interfaceMembers.length > 1) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class extends Super implements Interface {
+ /// method();
+ /// }
+ interfaceMember = new SynthesizedInterfaceMember(
+ classBuilder, name, interfaceMembers.toList(),
+ superClassMember: extendedMember,
+ canonicalMember: declaredMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter,
+ shouldModifyKernel: shouldModifyKernel);
+ hierarchy.registerMemberComputation(interfaceMember);
+ }
+
+ if (extendedMember != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {
+ /// method();
+ /// }
+ ///
+ /// The concrete extended member is the class member but might
+ /// be overwritten by a concrete forwarding stub:
+ ///
+ /// class Super {
+ /// method(int i) {}
+ /// }
+ /// class Interface {
+ /// method(covariant int i) {}
+ /// }
+ /// class Class extends Super implements Interface {
+ /// // This will be turned into the concrete forwarding stub
+ /// // method(covariant int i) => super.method(i);
+ /// method(int i);
+ /// }
+ ///
+ classMember = new InheritedClassMemberImplementsInterface(
+ classBuilder, name,
+ inheritedClassMember: extendedMember,
+ implementedInterfaceMember: interfaceMember,
+ forSetter: definingMember.forSetter,
+ isProperty: definingMember.isProperty);
+ hierarchy.registerMemberComputation(classMember);
+
+ if (!classBuilder.isAbstract) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {
+ /// method();
+ /// }
+ ///
+ /// [extendedMember] must implemented interface member.
+ registerInheritedImplements(extendedMember, {interfaceMember},
+ aliasForTesting: classMember);
+ }
+ } else if (!classBuilder.isAbstract) {
+ /// class Class {
+ /// method(); // Missing implementation.
+ /// }
+ registerAbstractMember(declaredMember);
+ }
+
+ /// The declared member must override extended and implemented
+ /// members.
+ registerDeclaredOverride(declaredMember,
+ aliasForTesting: interfaceMember);
+ } else {
+ assert(!declaredMember.isAbstract);
+
+ /// class Class {
+ /// method() {}
+ /// }
+ classMember = declaredMember;
+
+ /// The declared member must override extended and implemented
+ /// members.
+ registerDeclaredOverride(declaredMember);
+ }
+ } else if (extendedMember != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {}
+ assert(!extendedMember.isAbstract,
+ "Abstract extended member: ${extendedMember}");
+
+ classMember = extendedMember;
+
+ if (implementedMembers != null) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class extends Super implements Interface {}
+ ClassMember extendedInterfaceMember =
+ extendedMember.interfaceMember;
+
+ /// Interface members from the extended and implemented
+ /// members define the combined member signature.
+ Set<ClassMember> interfaceMembers = {extendedInterfaceMember};
+
+ // TODO(johnniwinther): The extended member might be included in
+ // a synthesized implemented member. For instance:
+ //
+ // class Super {
+ // void method() {}
+ // }
+ // class Interface {
+ // void method() {}
+ // }
+ // abstract class Class extends Super implements Interface {
+ // // Synthesized interface member of
+ // // {Super.method, Interface.method}
+ // }
+ // class Sub extends Class {
+ // // Super.method implements Class.method =
+ // // {Super.method, Interface.method}
+ // // Synthesized interface member of
+ // // {Super.method, Class.method}
+ // }
+ //
+ // Maybe we should recognized this.
+ interfaceMembers.addAll(implementedMembers);
+
+ /// Normally, if only one member defines the interface member there
+ /// is no need for a synthesized interface member, since its result
+ /// will simply be that one member, but if the extended member is
+ /// from an opt-in library and the current class is from an opt-out
+ /// library we need to create a member signature:
+ ///
+ /// // Opt-in:
+ /// class Super {
+ /// int? method() => null;
+ /// }
+ /// class Interface implements Super {}
+ /// // Opt-out:
+ /// class Class extends Super implements Interface {
+ /// // Member signature added:
+ /// int* method();
+ /// }
+ ///
+ if (interfaceMembers.length == 1 &&
+ !needsMemberSignatureFor(extendedInterfaceMember)) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface implements Super {}
+ /// class Class extends Super implements Interface {}
+ interfaceMember = interfaceMembers.first;
} else {
- if (!mixedInMember.isSynthesized) {
- mixedInMember = new InterfaceConflict(
- classBuilder,
- mixedInMember,
- /*_isSuperClassMemberMixedIn = */ true,
- [mixedInMember],
- mixedInMember.isProperty,
- forSetter,
- shouldModifyKernel,
- mixedInMember.isAbstract,
- mixedInMember.name,
- isImplicitlyAbstract: mixedInMember.isAbstract);
- hierarchy.registerMemberComputation(mixedInMember);
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class extends Super implements Interface {}
+ interfaceMember = new SynthesizedInterfaceMember(
+ classBuilder, name, interfaceMembers.toList(),
+ superClassMember: extendedMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter,
+ shouldModifyKernel: shouldModifyKernel);
+ hierarchy.registerMemberComputation(interfaceMember);
+ }
+ if (interfaceMember == classMember) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface implements Super {}
+ /// class Class extends Super implements Interface {}
+ ///
+ /// We keep track of whether a class needs interfaces, that is,
+ /// whether is has any members that have an interface member
+ /// different from its corresponding class member, so we set
+ /// [interfaceMember] to `null` so show that the interface member
+ /// is not needed.
+ interfaceMember = null;
+ } else {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class extends Super implements Interface {}
+ ///
+ /// The concrete extended member is the class member but might
+ /// be overwritten by a concrete forwarding stub:
+ ///
+ /// class Super {
+ /// method(int i) {}
+ /// }
+ /// class Interface {
+ /// method(covariant int i) {}
+ /// }
+ /// class Class extends Super implements Interface {
+ /// // A concrete forwarding stub will be created:
+ /// // method(covariant int i) => super.method(i);
+ /// }
+ ///
+ classMember = new InheritedClassMemberImplementsInterface(
+ classBuilder, name,
+ inheritedClassMember: extendedMember,
+ implementedInterfaceMember: interfaceMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter);
+ hierarchy.registerMemberComputation(classMember);
+ if (!classBuilder.isAbstract) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class extends Super implements Interface {}
+ registerInheritedImplements(extendedMember, {interfaceMember},
+ aliasForTesting: classMember);
}
}
- return mixedInMember;
+ } else if (needsMemberSignatureFor(extendedMember)) {
+ /// // Opt-in library:
+ /// class Super {
+ /// method() {}
+ /// }
+ /// // opt-out library:
+ /// class Class extends Super {}
+ interfaceMember = new SynthesizedInterfaceMember(
+ classBuilder, name, [extendedMember],
+ superClassMember: extendedMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter,
+ shouldModifyKernel: shouldModifyKernel);
+ hierarchy.registerMemberComputation(interfaceMember);
+
+ /// The concrete extended member is the class member and should
+ /// be able to be overwritten by a synthesized concrete member here,
+ /// but we handle the case for consistency.
+ classMember = new InheritedClassMemberImplementsInterface(
+ classBuilder, name,
+ inheritedClassMember: extendedMember,
+ implementedInterfaceMember: interfaceMember,
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter);
+ hierarchy.registerMemberComputation(classMember);
}
- } else if (extendedMember != null && !extendedMember.isStatic) {
- if (extendedMember.isAbstract) {
- if (isNameVisibleIn(extendedMember.name, classBuilder.library)) {
- recordAbstractMember(extendedMember);
+ } else if (implementedMembers != null) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {}
+ Set<ClassMember> interfaceMembers = implementedMembers.toSet();
+ if (interfaceMembers.isNotEmpty) {
+ /// Normally, if only one member defines the interface member there
+ /// is no need for a synthesized interface member, since its result
+ /// will simply be that one member, but if the implemented member is
+ /// from an opt-in library and the current class is from an opt-out
+ /// library we need to create a member signature:
+ ///
+ /// // Opt-in:
+ /// class Interface {
+ /// int? method() => null;
+ /// }
+ /// // Opt-out:
+ /// class Class implements Interface {
+ /// // Member signature added:
+ /// int* method();
+ /// }
+ ///
+ if (interfaceMembers.length == 1 &&
+ !needsMemberSignatureFor(interfaceMembers.first)) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {}
+ interfaceMember = interfaceMembers.first;
+ } else {
+ /// class Interface1 {
+ /// method() {}
+ /// }
+ /// class Interface2 {
+ /// method() {}
+ /// }
+ /// class Class implements Interface1, Interface2 {}
+ interfaceMember = new SynthesizedInterfaceMember(
+ classBuilder, name, interfaceMembers.toList(),
+ isProperty: definingMember.isProperty,
+ forSetter: definingMember.forSetter,
+ shouldModifyKernel: shouldModifyKernel);
+ hierarchy.registerMemberComputation(interfaceMember);
+ }
+ if (!classBuilder.isAbstract) {
+ /// class Interface {
+ /// method() {}
+ /// }
+ /// class Class implements Interface {}
+ for (ClassMember abstractMember in interfaceMembers) {
+ registerAbstractMember(abstractMember);
+ }
}
}
- if (extendedMember.name == noSuchMethodName &&
- !extendedMember.isObjectMember(objectClass)) {
+ }
+
+ if (interfaceMember != null) {
+ // We have an explicit interface.
+ hasInterfaces = true;
+ }
+ if (classMember != null) {
+ if (name == noSuchMethodName &&
+ !classMember.isObjectMember(objectClass)) {
hasNoSuchMethod = true;
}
- if (extendedMember.isInheritableConflict) {
- extendedMember = extendedMember.withParent(classBuilder);
- hierarchy.registerMemberComputation(extendedMember);
- }
- if (extendedMember.classBuilder.library.isNonNullableByDefault &&
- !classBuilder.library.isNonNullableByDefault) {
- if (!extendedMember.isSynthesized) {
- extendedMember = new InterfaceConflict(
- classBuilder,
- extendedMember.concrete,
- /*_isSuperClassMemberMixedIn = */ false,
- [extendedMember],
- extendedMember.isProperty,
- forSetter,
- shouldModifyKernel,
- extendedMember.isAbstract,
- extendedMember.name,
- isImplicitlyAbstract: extendedMember.isAbstract);
- hierarchy.registerMemberComputation(extendedMember);
- }
- }
- return extendedMember;
+ classMemberMap[name] = classMember;
+ interfaceMember ??= classMember.interfaceMember;
}
- return null;
- }
-
- ClassMember computeInterfaceMember(ClassMember classMember,
- List<ClassMember> implementedMembers, bool forSetter) {
- ClassMember interfaceMember;
- if (implementedMembers != null) {
- for (ClassMember member in implementedMembers) {
- if (member.isStatic) continue;
- if (interfaceMember == null) {
- interfaceMember = member;
- } else {
- ClassMember handleMergeConflict(ClassMember a, ClassMember b) {
- if (a == b) return a;
- if (a.isDuplicate || b.isDuplicate) {
- // Don't check overrides involving duplicated members.
- return a;
- }
- ClassMember result = checkInheritanceConflict(a, b);
- if (result != null) return result;
- assert(a.isProperty == b.isProperty,
- "Unexpected member combination: $a vs $b");
- result = a;
- result = InterfaceConflict.combined(
- classBuilder, a, b, forSetter, shouldModifyKernel);
- return result;
- }
-
- interfaceMember = handleMergeConflict(interfaceMember, member);
- }
- }
- }
- if (hasInterfaces) {
- if (interfaceMember != null) {
- if (classMember != null) {
- if (classMember == interfaceMember) return classMember;
- if (classMember.isDuplicate || interfaceMember.isDuplicate) {
- // Don't check overrides involving duplicated members.
- return classMember;
- }
- ClassMember result =
- checkInheritanceConflict(classMember, interfaceMember);
- if (result != null) return result;
- assert(
- classMember.isProperty == interfaceMember.isProperty,
- "Unexpected member combination: "
- "$classMember vs $interfaceMember");
- result = classMember;
-
- // [interfaceMember] is inherited from an interface so it is
- // implicitly abstract.
- classMember = classMember.abstract;
- interfaceMember = interfaceMember.abstract;
-
- // If [classMember] is declared in this class, it defines the
- // interface.
- if (classMember.classBuilder == classBuilder) {
- if (!classMember.isSynthesized) {
- registerOverrideDependency(classMember, interfaceMember);
- registerOverrideCheck(classMember, interfaceMember);
- }
- if (classMember.hasDeclarations) {
- if (interfaceMember.hasDeclarations &&
- interfaceMember.classBuilder == classBuilder) {
- addAllDeclarationsTo(
- interfaceMember, classMember.declarations);
- } else {
- addDeclarationIfDifferent(
- interfaceMember, classMember.declarations);
- }
- }
- } else {
- if (classMember.isAbstract) {
- result = InterfaceConflict.combined(classBuilder, classMember,
- interfaceMember, forSetter, shouldModifyKernel);
- } else {
- result = InheritedImplementationInterfaceConflict.combined(
- classBuilder,
- classMember,
- /* _isSuperClassMemberMixedIn = */ false,
- interfaceMember,
- forSetter,
- shouldModifyKernel);
- }
- if (result.needsComputation) {
- hierarchy.registerMemberComputation(result);
- }
- }
-
- return result;
- } else {
- if (isNameVisibleIn(interfaceMember.name, classBuilder.library)) {
- if (!interfaceMember.isInternalImplementation) {
- recordAbstractMember(interfaceMember);
- }
- }
- if (interfaceMember.isInheritableConflict) {
- interfaceMember = interfaceMember.withParent(classBuilder);
- hierarchy.registerMemberComputation(interfaceMember);
- }
- if (interfaceMember.classBuilder.library.isNonNullableByDefault &&
- !classBuilder.library.isNonNullableByDefault) {
- if (!interfaceMember.isSynthesized) {
- interfaceMember = new InterfaceConflict(
- classBuilder,
- null,
- /*_isSuperClassMemberMixedIn = */ false,
- [interfaceMember],
- interfaceMember.isProperty,
- forSetter,
- shouldModifyKernel,
- interfaceMember.isAbstract,
- interfaceMember.name,
- isImplicitlyAbstract: interfaceMember.isAbstract);
- hierarchy.registerMemberComputation(interfaceMember);
- }
- }
- return interfaceMember;
- }
- } else if (classMember != null) {
- return classMember;
- }
+ if (interfaceMember != null) {
+ interfaceMemberMap[name] = interfaceMember;
}
return interfaceMember;
}
- void checkMemberVsSetter(
- ClassMember member, ClassMember overriddenMember) {
- if (overriddenMember.classBuilder == classBuilder &&
- overriddenMember.hasDeclarations) {
- for (ClassMember declaration in overriddenMember.declarations) {
- checkMemberVsSetter(member, declaration);
- }
- return;
- }
-
- if (classBuilder is! SourceClassBuilder) return;
- if (overriddenMember.isStatic) return;
- if (member == overriddenMember) return;
- if (member.isDuplicate || overriddenMember.isDuplicate) {
- // Don't check overrides involving duplicated members.
- return;
- }
- ClassMember result = checkInheritanceConflict(member, overriddenMember);
- if (result != null) return;
- assert(member.isProperty == overriddenMember.isProperty,
- "Unexpected member combination: $member vs $overriddenMember");
- if (member.classBuilder == classBuilder &&
- overriddenMember.classBuilder != classBuilder) {
- if (member is SourceFieldMember) {
- registerOverrideDependency(member, overriddenMember);
- hierarchy.registerOverrideCheck(
- classBuilder, member, overriddenMember);
- } else if (member is SourceProcedureMember) {
- registerOverrideDependency(member, overriddenMember);
- hierarchy.registerOverrideCheck(
- classBuilder, member, overriddenMember);
- }
- }
+ ClassMember interfaceGetable;
+ if (definingGetable != null) {
+ interfaceGetable = computeMembers(
+ definingMember: definingGetable,
+ declaredMember: declaredGetable,
+ mixedInMember: mixedInGetable,
+ extendedMember: extendedGetable,
+ implementedMembers: implementedGetables,
+ classMemberMap: classMemberMap,
+ interfaceMemberMap: interfaceMemberMap);
}
-
- ClassMember classMember = computeClassMember(tuple.declaredMember,
- tuple.mixedInMember, tuple.extendedMember, false);
- ClassMember interfaceMember =
- computeInterfaceMember(classMember, tuple.implementedMembers, false);
- ClassMember classSetter = computeClassMember(tuple.declaredSetter,
- tuple.mixedInSetter, tuple.extendedSetter, true);
- ClassMember interfaceSetter =
- computeInterfaceMember(classSetter, tuple.implementedSetters, true);
-
- if ((tuple.mixedInMember != null || tuple.declaredMember != null) &&
- classSetter != null) {
- checkMemberVsSetter(
- tuple.mixedInMember ?? tuple.declaredMember, classSetter);
- }
- if ((tuple.mixedInSetter != null || tuple.declaredSetter != null) &&
- classMember != null) {
- checkMemberVsSetter(
- tuple.mixedInSetter ?? tuple.declaredSetter, classMember);
- }
- if (classMember != null && interfaceSetter != null) {
- checkMemberVsSetter(classMember, interfaceSetter);
- }
- if (classSetter != null && interfaceMember != null) {
- checkMemberVsSetter(classSetter, interfaceMember);
- }
-
- if (classMember != null &&
- interfaceMember != null &&
- classMember != interfaceMember) {
- if (classMember.isAbstract == interfaceMember.isAbstract) {
- // TODO(johnniwinther): Ensure that we don't have both class and
- // interface members that can give rise to a forwarding stub in
- // the current class. We might already have registered a delayed
- // member computation for the [classMember] that we're replacing
- // and therefore create two stubs for this member.
- classMember = interfaceMember;
- }
- }
- if (classSetter != null &&
- interfaceSetter != null &&
- classSetter != interfaceSetter) {
- if (classSetter.isAbstract == interfaceSetter.isAbstract) {
- // TODO(johnniwinther): Ensure that we don't have both class and
- // interface members that can give rise to a forwarding stub in
- // the current class. We might already have registered a delayed
- // member computation for the [classMember] that we're replacing
- // and therefore create two stubs for this member.
- classSetter = interfaceSetter;
- }
+ ClassMember interfaceSetable;
+ if (definingSetable != null) {
+ interfaceSetable = computeMembers(
+ definingMember: definingSetable,
+ declaredMember: declaredSetable,
+ mixedInMember: mixedInSetable,
+ extendedMember: extendedSetable,
+ implementedMembers: implementedSetables,
+ classMemberMap: classSetterMap,
+ interfaceMemberMap: interfaceSetterMap);
}
if (classBuilder is SourceClassBuilder) {
- ClassMember member = interfaceMember ?? classMember;
- ClassMember setter = interfaceSetter ?? classSetter;
- if (member != null &&
- setter != null &&
- member.isProperty &&
- setter.isProperty &&
- member.isStatic == setter.isStatic &&
- !member.isSameDeclaration(setter)) {
- hierarchy.registerGetterSetterCheck(classBuilder, member, setter);
+ if (interfaceGetable != null &&
+ interfaceSetable != null &&
+ interfaceGetable.isProperty &&
+ interfaceSetable.isProperty &&
+ interfaceGetable.isStatic == interfaceSetable.isStatic &&
+ !interfaceGetable.isSameDeclaration(interfaceSetable)) {
+ /// We need to check that the getter type is a subtype of the setter
+ /// type. For instance
+ ///
+ /// class Super {
+ /// int get property1 => null;
+ /// num get property2 => null;
+ /// }
+ /// class Mixin {
+ /// void set property1(num value) {}
+ /// void set property2(int value) {}
+ /// }
+ /// class Class = Super with Mixin;
+ ///
+ /// Here `Super.property1` and `Mixin.property1` form a valid getter/
+ /// setter pair in `Class` because the type of the getter
+ /// `Super.property1` is a subtype of the setter `Mixin.property1`.
+ ///
+ /// In contrast the pair `Super.property2` and `Mixin.property2` is
+ /// not a valid getter/setter in `Class` because the type of the getter
+ /// `Super.property2` is _not_ a subtype of the setter
+ /// `Mixin.property1`.
+ hierarchy.registerGetterSetterCheck(
+ classBuilder, interfaceGetable, interfaceSetable);
}
}
- if (classMember != null) {
- classMemberMap[name] = classMember;
- }
- if (interfaceMember != null) {
- interfaceMemberMap[name] = interfaceMember;
- }
- if (classSetter != null) {
- classSetterMap[name] = classSetter;
- }
- if (interfaceSetter != null) {
- interfaceSetterMap[name] = interfaceSetter;
- }
- if (overriddenMembers.isNotEmpty) {
- void registerOverrideDependencies(ClassMember member) {
- if (member != null &&
- member.classBuilder == classBuilder &&
- member.isSourceDeclaration) {
- member.registerOverrideDependency(overriddenMembers);
- DelayedTypeComputation computation =
- new DelayedTypeComputation(this, member, overriddenMembers);
- hierarchy.registerDelayedTypeComputation(computation);
+ if (hasDeclaredMembers) {
+ Set<ClassMember> getableOverrides = {};
+ Set<ClassMember> setableOverrides = {};
+ if (extendedGetable != null) {
+ /// (abstract) class Super {
+ /// method() {}
+ /// int get property => 0;
+ /// }
+ /// (abstract) class Class extends Super {
+ /// method() {}
+ /// set property(int value) {}
+ /// }
+ getableOverrides.add(extendedGetable.interfaceMember);
+ }
+ if (extendedSetable != null) {
+ /// (abstract) class Super {
+ /// set setter(int value) {}
+ /// set property(int value) {}
+ /// }
+ /// (abstract) class Class extends Super {
+ /// set setter(int value) {}
+ /// int get property => 0;
+ /// }
+ setableOverrides.add(extendedSetable.interfaceMember);
+ }
+ if (implementedGetables != null) {
+ /// (abstract) class Interface {
+ /// method() {}
+ /// int get property => 0;
+ /// }
+ /// (abstract) class Class implements Interface {
+ /// method() {}
+ /// set property(int value) {}
+ /// }
+ getableOverrides.addAll(implementedGetables);
+ }
+ if (implementedSetables != null) {
+ /// (abstract) class Interface {
+ /// set setter(int value) {}
+ /// set property(int value) {}
+ /// }
+ /// (abstract) class Class implements Interface {
+ /// set setter(int value) {}
+ /// int get property => 0;
+ /// }
+ setableOverrides.addAll(implementedSetables);
+ }
+ if (getableOverrides.isNotEmpty || setableOverrides.isNotEmpty) {
+ if (declaredMethod != null && getableOverrides.isNotEmpty) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Class extends Super {
+ /// method() {}
+ /// }
+ declaredOverridesMap[declaredMethod] = getableOverrides;
+ }
+ if (declaredProperties != null) {
+ Set<ClassMember> overrides;
+ if (declaredMethod != null) {
+ /// class Super {
+ /// set setter() {}
+ /// }
+ /// class Class extends Super {
+ /// method() {}
+ /// }
+ overrides = setableOverrides;
+ } else {
+ /// class Super {
+ /// get property => null
+ /// void set property(value) {}
+ /// }
+ /// class Class extends Super {
+ /// get property => null
+ /// void set property(value) {}
+ /// }
+ overrides = {...getableOverrides, ...setableOverrides};
+ }
+ if (overrides.isNotEmpty) {
+ for (ClassMember declaredMember in declaredProperties) {
+ declaredOverridesMap[declaredMember] = overrides;
+ }
+ }
+ }
+ if (mixedInMethod != null && getableOverrides.isNotEmpty) {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class = Super with Mixin;
+ mixinApplicationOverridesMap[mixedInMethod] = getableOverrides;
+ }
+ if (mixedInProperties != null) {
+ Set<ClassMember> overrides;
+ if (mixedInMethod != null) {
+ /// class Super {
+ /// set setter() {}
+ /// }
+ /// class Mixin {
+ /// method() {}
+ /// }
+ /// class Class = Super with Mixin;
+ overrides = setableOverrides;
+ } else {
+ /// class Super {
+ /// method() {}
+ /// }
+ /// class Mixin extends Super {
+ /// method() {}
+ /// }
+ overrides = {...getableOverrides, ...setableOverrides};
+ }
+ if (overrides.isNotEmpty) {
+ for (ClassMember mixedInMember in mixedInProperties) {
+ mixinApplicationOverridesMap[mixedInMember] = overrides;
+ }
+ }
}
}
-
- registerOverrideDependencies(
- tuple.mixedInMember ?? tuple.declaredMember);
- registerOverrideDependencies(
- tuple.mixedInSetter ?? tuple.declaredSetter);
}
});
+ if (classBuilder is SourceClassBuilder) {
+ // TODO(johnniwinther): Avoid duplicate override check computations
+ // between [declaredOverridesMap], [mixinApplicationOverridesMap] and
+ // [inheritedImplementsMap].
+
+ // TODO(johnniwinther): Ensure that a class member is only checked to
+ // validly override another member once. Currently it can happen multiple
+ // times as an inherited implementation.
+
+ declaredOverridesMap.forEach(
+ (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+ /// A declared member can inherit its type from the overridden members.
+ ///
+ /// We register this with the class member itself so the it can force
+ /// computation of type on the overridden members before determining its
+ /// own type.
+ ///
+ /// Member types can be queried at arbitrary points during top level
+ /// inference so we need to ensure that types are computed in dependency
+ /// order.
+ classMember.registerOverrideDependency(overriddenMembers);
+
+ /// Not all member type are queried during top level inference so we
+ /// register delayed computation to ensure that all types have been
+ /// computed before override checks are performed.
+ DelayedTypeComputation computation =
+ new DelayedTypeComputation(this, classMember, overriddenMembers);
+ hierarchy.registerDelayedTypeComputation(computation);
+
+ /// Declared members must be checked to validly override the the
+ /// overridden members.
+ hierarchy.registerOverrideCheck(
+ classBuilder, classMember, overriddenMembers);
+ });
+
+ mixinApplicationOverridesMap.forEach(
+ (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+ /// Declared mixed in members must be checked to validly override the
+ /// overridden members.
+ hierarchy.registerOverrideCheck(
+ classBuilder, classMember, overriddenMembers);
+ });
+
+ inheritedImplementsMap.forEach(
+ (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+ /// Concrete members must be checked to validly override the overridden
+ /// members in concrete classes.
+ hierarchy.registerOverrideCheck(
+ classBuilder, classMember, overriddenMembers);
+ });
+ }
+
if (!hasInterfaces) {
+ /// All interface members also class members to we don't need to store
+ /// the interface members separately.
+ assert(
+ classMemberMap.length == interfaceMemberMap.length,
+ "Class/interface member mismatch. Class members: "
+ "$classMemberMap, interface members: $interfaceMemberMap.");
+ assert(
+ classSetterMap.length == interfaceSetterMap.length,
+ "Class/interface setter mismatch. Class setters: "
+ "$classSetterMap, interface setters: $interfaceSetterMap.");
+ assert(
+ classMemberMap.keys.every((Name name) =>
+ identical(classMemberMap[name], interfaceMemberMap[name])),
+ "Class/interface member mismatch. Class members: "
+ "$classMemberMap, interface members: $interfaceMemberMap.");
+ assert(
+ classSetterMap.keys.every((Name name) =>
+ identical(classSetterMap[name], interfaceSetterMap[name])),
+ "Class/interface setter mismatch. Class setters: "
+ "$classSetterMap, interface setters: $interfaceSetterMap.");
interfaceMemberMap = null;
interfaceSetterMap = null;
}
if (abstractMembers != null && !classBuilder.isAbstract) {
if (!hasNoSuchMethod) {
- reportMissingMembers();
+ reportMissingMembers(abstractMembers);
} else {
installNsmHandlers();
}
}
return new ClassHierarchyNode(
- classBuilder,
- classMemberMap,
- classSetterMap,
- interfaceMemberMap,
- interfaceSetterMap,
- superclasses,
- interfaces,
- maxInheritancePath,
- hasNoSuchMethod,
- );
+ classBuilder,
+ classMemberMap,
+ classSetterMap,
+ interfaceMemberMap,
+ interfaceSetterMap,
+ superclasses,
+ interfaces,
+ maxInheritancePath,
+ hasNoSuchMethod,
+ dataForTesting);
}
Supertype recordSupertype(Supertype supertype) {
@@ -2081,10 +3118,9 @@
interfaces.add(type);
}
- void reportMissingMembers() {
+ void reportMissingMembers(List<ClassMember> abstractMembers) {
Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
- for (int i = 0; i < abstractMembers.length; i++) {
- ClassMember declaration = abstractMembers[i];
+ for (ClassMember declaration in unfoldDeclarations(abstractMembers)) {
if (isNameVisibleIn(declaration.name, classBuilder.library)) {
String name = declaration.fullNameForErrors;
String className = declaration.classBuilder?.fullNameForErrors;
@@ -2196,6 +3232,8 @@
final bool hasNoSuchMethod;
+ final ClassHierarchyNodeDataForTesting dataForTesting;
+
ClassHierarchyNode(
this.classBuilder,
this.classMemberMap,
@@ -2205,7 +3243,8 @@
this.superclasses,
this.interfaces,
this.maxInheritancePath,
- this.hasNoSuchMethod);
+ this.hasNoSuchMethod,
+ this.dataForTesting);
/// Returns a list of all supertypes of [classBuilder], including this node.
List<ClassHierarchyNode> computeAllSuperNodes(
@@ -2327,6 +3366,17 @@
}
}
+class ClassHierarchyNodeDataForTesting {
+ final List<ClassMember> abstractMembers;
+ final Map<ClassMember, Set<ClassMember>> declaredOverrides;
+ final Map<ClassMember, Set<ClassMember>> mixinApplicationOverrides;
+ final Map<ClassMember, Set<ClassMember>> inheritedImplements;
+ final Map<ClassMember, ClassMember> aliasMap = {};
+
+ ClassHierarchyNodeDataForTesting(this.abstractMembers, this.declaredOverrides,
+ this.mixinApplicationOverrides, this.inheritedImplements);
+}
+
List<LocatedMessage> _inheritedConflictContext(ClassMember a, ClassMember b) {
int length = a.fullNameForErrors.length;
// TODO(ahe): Delete this method when it isn't used by [InterfaceResolver].
@@ -2436,25 +3486,57 @@
}
class DelayedOverrideCheck implements DelayedCheck {
- final SourceClassBuilder classBuilder;
- final ClassMember declaredMember;
- final ClassMember overriddenMember;
+ final SourceClassBuilder _classBuilder;
+ final ClassMember _declaredMember;
+ final Set<ClassMember> _overriddenMembers;
- const DelayedOverrideCheck(
- this.classBuilder, this.declaredMember, this.overriddenMember);
+ DelayedOverrideCheck(
+ this._classBuilder, this._declaredMember, this._overriddenMembers);
void check(ClassHierarchyBuilder hierarchy) {
- void callback(
- Member declaredMember, Member interfaceMember, bool isSetter) {
- classBuilder.checkOverride(
+ Member declaredMember = _declaredMember.getMember(hierarchy);
+
+ /// If [_declaredMember] is a class member that is declared in an opt-in
+ /// library but inherited to [_classBuilder] through an opt-out class then
+ /// we need to apply legacy erasure to the declared type to get the
+ /// inherited type.
+ ///
+ /// For interface members this is handled by member signatures but since
+ /// these are abstract they will never be the inherited class member.
+ ///
+ /// For instance:
+ ///
+ /// // Opt in:
+ /// class Super {
+ /// int extendedMethod(int i, {required int j}) => i;
+ /// }
+ /// class Mixin {
+ /// int mixedInMethod(int i, {required int j}) => i;
+ /// }
+ /// // Opt out:
+ /// class Legacy extends Super with Mixin {}
+ /// // Opt in:
+ /// class Class extends Legacy {
+ /// // Valid overrides since the type of `Legacy.extendedMethod` is
+ /// // `int* Function(int*, {int* j})`.
+ /// int? extendedMethod(int? i, {int? j}) => i;
+ /// // Valid overrides since the type of `Legacy.mixedInMethod` is
+ /// // `int* Function(int*, {int* j})`.
+ /// int? mixedInMethod(int? i, {int? j}) => i;
+ /// }
+ ///
+ bool declaredNeedsLegacyErasure =
+ needsLegacyErasure(_classBuilder.cls, declaredMember.enclosingClass);
+ void callback(Member interfaceMember, bool isSetter) {
+ _classBuilder.checkOverride(
hierarchy.types, declaredMember, interfaceMember, isSetter, callback,
- isInterfaceCheck: !classBuilder.isMixinApplication);
+ isInterfaceCheck: !_classBuilder.isMixinApplication,
+ declaredNeedsLegacyErasure: declaredNeedsLegacyErasure);
}
- debug?.log("Delayed override check of ${declaredMember.fullName} "
- "${overriddenMember.fullName} wrt. ${classBuilder.fullNameForErrors}");
- callback(declaredMember.getMember(hierarchy),
- overriddenMember.getMember(hierarchy), declaredMember.isSetter);
+ for (ClassMember overriddenMember in _overriddenMembers) {
+ callback(overriddenMember.getMember(hierarchy), _declaredMember.isSetter);
+ }
}
}
@@ -2504,564 +3586,6 @@
'${builder.classBuilder.name},$declaredMember,$overriddenMembers)';
}
-abstract class DelayedMember implements ClassMember {
- /// The class which has inherited [declarations].
- @override
- final ClassBuilder classBuilder;
-
- bool get hasDeclarations => true;
-
- /// Conflicting declarations.
- final List<ClassMember> declarations;
-
- final bool isProperty;
-
- final bool isSetter;
-
- final bool modifyKernel;
-
- final bool isExplicitlyAbstract;
-
- @override
- final Name name;
-
- DelayedMember(this.classBuilder, this.declarations, this.isProperty,
- this.isSetter, this.modifyKernel, this.isExplicitlyAbstract, this.name) {
- assert(declarations.every((element) => element.isProperty == isProperty),
- "isProperty mismatch for $this");
- }
-
- @override
- bool get isSourceDeclaration => false;
-
- @override
- bool get needsComputation => true;
-
- @override
- bool get isSynthesized => true;
-
- @override
- bool get isInternalImplementation => false;
-
- @override
- bool get forSetter => isSetter;
-
- @override
- bool get isFunction => !isProperty;
-
- @override
- bool get isAbstract => isExplicitlyAbstract;
-
- bool get isStatic => false;
- bool get isField => false;
- bool get isGetter => false;
- bool get isFinal => false;
- bool get isConst => false;
- bool get isAssignable => false;
- bool get isDuplicate => false;
-
- DelayedMember withParent(ClassBuilder parent);
-
- @override
- ClassMember get abstract => this;
-
- @override
- ClassMember get concrete => this;
-
- @override
- Uri get fileUri => classBuilder.fileUri;
-
- @override
- int get charOffset => classBuilder.charOffset;
-
- @override
- String get fullNameForErrors =>
- declarations.map((ClassMember m) => m.fullName).join("%");
-
- bool get isInheritableConflict => true;
-
- String get fullName {
- String suffix = isSetter ? "=" : "";
- return "${fullNameForErrors}$suffix";
- }
-
- @override
- void inferType(ClassHierarchyBuilder hierarchy) {
- // Do nothing; this is only for declared members.
- }
-
- @override
- void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
- // Do nothing; this is only for declared members.
- }
-}
-
-/// This represents a concrete implementation inherited from a superclass that
-/// has conflicts with methods inherited from an interface. The concrete
-/// implementation is the first element of [declarations].
-class InheritedImplementationInterfaceConflict extends DelayedMember {
- Member _member;
- Covariance _covariance;
- final ClassMember concreteMember;
- final bool _isSuperClassMemberMixedIn;
-
- @override
- final bool isInheritableConflict;
-
- InheritedImplementationInterfaceConflict(
- ClassBuilder parent,
- this.concreteMember,
- this._isSuperClassMemberMixedIn,
- List<ClassMember> declarations,
- bool isProperty,
- bool isSetter,
- bool modifyKernel,
- bool isAbstract,
- Name name,
- {this.isInheritableConflict = true})
- : assert(!concreteMember.isAbstract),
- super(parent, declarations, isProperty, isSetter, modifyKernel,
- isAbstract, name);
-
- @override
- bool isObjectMember(ClassBuilder objectClass) {
- return concreteMember.isObjectMember(objectClass);
- }
-
- @override
- String toString() {
- return "InheritedImplementationInterfaceConflict("
- "${classBuilder.fullNameForErrors}, $concreteMember, "
- "[${declarations.join(', ')}])";
- }
-
- void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
- if (_member == null) {
- if (!classBuilder.isAbstract) {
- if (classBuilder is SourceClassBuilder) {
- for (int i = 0; i < declarations.length; i++) {
- if (concreteMember != declarations[i]) {
- new DelayedOverrideCheck(
- classBuilder, concreteMember, declarations[i])
- .check(hierarchy);
- }
- }
- }
- }
- InterfaceConflict interfaceConflict = new InterfaceConflict(
- classBuilder,
- concreteMember,
- /*_isSuperClassMemberMixedIn = */ _isSuperClassMemberMixedIn,
- declarations,
- isProperty,
- isSetter,
- modifyKernel,
- isAbstract,
- name);
- _member = interfaceConflict.getMember(hierarchy);
- _covariance = interfaceConflict.getCovariance(hierarchy);
- }
- }
-
- @override
- Member getMember(ClassHierarchyBuilder hierarchy) {
- _ensureMemberAndCovariance(hierarchy);
- return _member;
- }
-
- @override
- Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
- _ensureMemberAndCovariance(hierarchy);
- return _covariance;
- }
-
- @override
- DelayedMember withParent(ClassBuilder parent) {
- return parent == this.classBuilder
- ? this
- : new InheritedImplementationInterfaceConflict(
- parent,
- concreteMember,
- /*_isSuperClassMemberMixedIn = */ false,
- [this],
- isProperty,
- isSetter,
- modifyKernel,
- isAbstract,
- name);
- }
-
- @override
- bool isSameDeclaration(ClassMember other) {
- // This could be more precise but it currently has no benefit.
- return identical(this, other);
- }
-
- static ClassMember combined(
- ClassBuilder parent,
- ClassMember concreteImplementation,
- bool isSuperClassMemberMixedIn,
- ClassMember other,
- bool isSetter,
- bool createForwarders,
- {bool isInheritableConflict = true}) {
- assert(concreteImplementation.isProperty == other.isProperty,
- "Unexpected member combination: $concreteImplementation vs $other");
- List<ClassMember> declarations = <ClassMember>[];
- if (concreteImplementation.hasDeclarations &&
- concreteImplementation.classBuilder == parent) {
- addAllDeclarationsTo(concreteImplementation, declarations);
- } else {
- declarations.add(concreteImplementation);
- }
- if (other.hasDeclarations && other.classBuilder == parent) {
- addAllDeclarationsTo(other, declarations);
- } else {
- addDeclarationIfDifferent(other, declarations);
- }
- if (declarations.length == 1) {
- return declarations.single;
- } else {
- return new InheritedImplementationInterfaceConflict(
- parent,
- concreteImplementation.concrete,
- isSuperClassMemberMixedIn,
- declarations,
- concreteImplementation.isProperty,
- isSetter,
- createForwarders,
- declarations.first.isAbstract,
- declarations.first.name,
- isInheritableConflict: isInheritableConflict);
- }
- }
-}
-
-class InterfaceConflict extends DelayedMember {
- final ClassMember _superClassMember;
- final bool _isSuperClassMemberMixedIn;
- final bool isImplicitlyAbstract;
-
- InterfaceConflict(
- ClassBuilder parent,
- this._superClassMember,
- this._isSuperClassMemberMixedIn,
- List<ClassMember> declarations,
- bool isProperty,
- bool isSetter,
- bool modifyKernel,
- bool isAbstract,
- Name name,
- {this.isImplicitlyAbstract: true})
- : super(parent, declarations, isProperty, isSetter, modifyKernel,
- isAbstract, name);
-
- @override
- bool isObjectMember(ClassBuilder objectClass) =>
- declarations.first.isObjectMember(objectClass);
-
- @override
- bool get isAbstract => isExplicitlyAbstract || isImplicitlyAbstract;
-
- Member _member;
- Covariance _covariance;
-
- @override
- String toString() {
- return "InterfaceConflict(${classBuilder.fullNameForErrors}, "
- "[${declarations.join(', ')}])";
- }
-
- void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
- if (_member != null) {
- return;
- }
- if (classBuilder.library is! SourceLibraryBuilder) {
- _member = declarations.first.getMember(hierarchy);
- _covariance = declarations.first.getCovariance(hierarchy);
- return;
- }
-
- CombinedClassMemberSignature combinedMemberSignature =
- new CombinedClassMemberSignature(hierarchy, classBuilder, declarations,
- forSetter: isSetter);
-
- if (combinedMemberSignature.canonicalMember == null) {
- String name = classBuilder.fullNameForErrors;
- int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
- List<LocatedMessage> context = declarations.map((ClassMember d) {
- return messageDeclaredMemberConflictsWithOverriddenMembersCause
- .withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
- }).toList();
-
- classBuilder.addProblem(
- templateCombinedMemberSignatureFailed.withArguments(
- classBuilder.fullNameForErrors,
- declarations.first.fullNameForErrors),
- classBuilder.charOffset,
- length,
- context: context);
- // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
- // cascading errors.
- _member = declarations.first.getMember(hierarchy);
- _covariance = declarations.first.getCovariance(hierarchy);
- return;
- }
- debug?.log("Combined Member Signature of ${fullNameForErrors}: "
- "${combinedMemberSignature.canonicalMember.fullName}");
-
- if (modifyKernel) {
- ProcedureKind kind = ProcedureKind.Method;
- Member bestMemberSoFar =
- combinedMemberSignature.canonicalMember.getMember(hierarchy);
- if (combinedMemberSignature.canonicalMember.isProperty) {
- kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
- } else if (bestMemberSoFar is Procedure &&
- bestMemberSoFar.kind == ProcedureKind.Operator) {
- kind = ProcedureKind.Operator;
- }
-
- debug?.log("Combined Member Signature of ${fullNameForErrors}: new "
- "ForwardingNode($classBuilder, "
- "${combinedMemberSignature.canonicalMember}, "
- "$declarations, $kind)");
- Member stub = new ForwardingNode(combinedMemberSignature, kind,
- _superClassMember, _isSuperClassMemberMixedIn)
- .finalize();
- if (stub != null && classBuilder.cls == stub.enclosingClass) {
- if (stub is Procedure) {
- classBuilder.cls.addProcedure(stub);
- } else if (stub is Field) {
- classBuilder.cls.addField(stub);
- } else if (stub is Constructor) {
- classBuilder.cls.addConstructor(stub);
- } else if (stub is RedirectingFactoryConstructor) {
- classBuilder.cls.addRedirectingFactoryConstructor(stub);
- } else {
- unhandled("${stub.runtimeType}", "getMember", stub.fileOffset,
- stub.fileUri);
- }
- SourceLibraryBuilder library = classBuilder.library;
- Member bestMemberSoFar =
- combinedMemberSignature.canonicalMember.getMember(hierarchy);
- if (bestMemberSoFar is Procedure) {
- library.forwardersOrigins..add(stub)..add(bestMemberSoFar);
- }
- debug?.log("Combined Member Signature of ${fullNameForErrors}: "
- "added stub $stub");
- _member = stub;
- _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
- assert(
- _covariance ==
- new Covariance.fromMember(_member, forSetter: forSetter),
- "Unexpected covariance for combined members signature "
- "$_member. Found $_covariance, expected "
- "${new Covariance.fromMember(_member, forSetter: forSetter)}.");
- return;
- }
- }
-
- debug?.log(
- "Combined Member Signature of ${fullNameForErrors}: picked bestSoFar");
- _member = combinedMemberSignature.canonicalMember.getMember(hierarchy);
- _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
- }
-
- @override
- Member getMember(ClassHierarchyBuilder hierarchy) {
- _ensureMemberAndCovariance(hierarchy);
- return _member;
- }
-
- @override
- Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
- _ensureMemberAndCovariance(hierarchy);
- return _covariance;
- }
-
- @override
- DelayedMember withParent(ClassBuilder parent) {
- return parent == this.classBuilder
- ? this
- : new InterfaceConflict(
- parent,
- _superClassMember,
- /*_isSuperClassMemberMixedIn = */ false,
- [this],
- isProperty,
- isSetter,
- modifyKernel,
- isAbstract,
- name,
- isImplicitlyAbstract: isImplicitlyAbstract);
- }
-
- @override
- bool isSameDeclaration(ClassMember other) {
- // This could be more precise but it currently has no benefit.
- return identical(this, other);
- }
-
- static ClassMember combined(ClassBuilder parent, ClassMember a, ClassMember b,
- bool isSetter, bool createForwarders) {
- assert(a.isProperty == b.isProperty,
- "Unexpected member combination: $a vs $b");
- List<ClassMember> declarations = <ClassMember>[];
- if (a.hasDeclarations && a.classBuilder == parent) {
- addAllDeclarationsTo(a, declarations);
- } else {
- declarations.add(a);
- }
- if (b.hasDeclarations && b.classBuilder == parent) {
- addAllDeclarationsTo(b, declarations);
- } else {
- addDeclarationIfDifferent(b, declarations);
- }
- if (declarations.length == 1) {
- return declarations.single;
- } else {
- return new InterfaceConflict(
- parent,
- null,
- /*_isSuperClassMemberMixedIn = */ false,
- declarations,
- a.isProperty,
- isSetter,
- createForwarders,
- declarations.first.isAbstract,
- declarations.first.name);
- }
- }
-
- @override
- ClassMember get concrete {
- if (isAbstract) {
- return declarations.first.concrete;
- }
- return this;
- }
-}
-
-class AbstractMemberOverridingImplementation extends DelayedMember {
- AbstractMemberOverridingImplementation(
- ClassBuilder parent,
- ClassMember abstractMember,
- ClassMember concreteImplementation,
- bool isProperty,
- bool isSetter,
- bool modifyKernel,
- bool isAbstract,
- Name name)
- : super(parent, <ClassMember>[concreteImplementation, abstractMember],
- isProperty, isSetter, modifyKernel, isAbstract, name);
-
- @override
- bool isObjectMember(ClassBuilder objectClass) =>
- concreteImplementation.isObjectMember(objectClass);
-
- ClassMember get concreteImplementation => declarations[0];
-
- ClassMember get abstractMember => declarations[1];
-
- bool _isChecked = false;
-
- void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
- if (!_isChecked) {
- _isChecked = true;
- if (!classBuilder.isAbstract &&
- !hierarchy.nodes[classBuilder.cls].hasNoSuchMethod) {
- if (classBuilder is SourceClassBuilder) {
- new DelayedOverrideCheck(
- classBuilder, concreteImplementation, abstractMember)
- .check(hierarchy);
- }
- }
-
- ProcedureKind kind = ProcedureKind.Method;
- if (abstractMember.isProperty) {
- kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
- }
- if (modifyKernel) {
- // This call will add a body to the abstract method if needed for
- // isGenericCovariantImpl checks.
- new ForwardingNode(
- new CombinedClassMemberSignature.internal(
- hierarchy, classBuilder, 1, declarations,
- forSetter: isSetter),
- kind,
- concrete,
- /*_isSuperClassMemberMixedIn =*/ false)
- .finalize();
- }
- }
- }
-
- @override
- Member getMember(ClassHierarchyBuilder hierarchy) {
- _ensureMemberAndCovariance(hierarchy);
- return abstractMember.getMember(hierarchy);
- }
-
- @override
- Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
- _ensureMemberAndCovariance(hierarchy);
- return abstractMember.getCovariance(hierarchy);
- }
-
- @override
- DelayedMember withParent(ClassBuilder parent) {
- return parent == this.classBuilder
- ? this
- : new AbstractMemberOverridingImplementation(
- parent,
- abstractMember,
- concreteImplementation,
- isProperty,
- isSetter,
- modifyKernel,
- isAbstract,
- name);
- }
-
- @override
- String toString() {
- return "AbstractMemberOverridingImplementation("
- "${classBuilder.fullNameForErrors}, "
- "[${declarations.join(', ')}])";
- }
-
- @override
- ClassMember get abstract => abstractMember;
-
- @override
- ClassMember get concrete => concreteImplementation;
-
- @override
- bool isSameDeclaration(ClassMember other) {
- if (identical(this, other)) return false;
- return other is AbstractMemberOverridingImplementation &&
- classBuilder == other.classBuilder &&
- abstract.isSameDeclaration(other.abstract) &&
- concrete.isSameDeclaration(other.concrete);
- }
-}
-
-void addDeclarationIfDifferent(
- ClassMember declaration, List<ClassMember> declarations) {
- for (int i = 0; i < declarations.length; i++) {
- if (declaration == declarations[i]) return;
- }
- declarations.add(declaration);
-}
-
-void addAllDeclarationsTo(ClassMember member, List<ClassMember> declarations) {
- assert(member.hasDeclarations);
- for (int i = 0; i < member.declarations.length; i++) {
- addDeclarationIfDifferent(member.declarations[i], declarations);
- }
- assert(declarations.toSet().length == declarations.length);
-}
-
int compareNamedParameters(VariableDeclaration a, VariableDeclaration b) {
return a.name.compareTo(b.name);
}
@@ -3227,3 +3751,482 @@
}
}
}
+
+Set<ClassMember> unfoldDeclarations(Iterable<ClassMember> members) {
+ Set<ClassMember> result = <ClassMember>{};
+ _unfoldDeclarations(members, result);
+ return result;
+}
+
+void _unfoldDeclarations(
+ Iterable<ClassMember> members, Set<ClassMember> result) {
+ for (ClassMember member in members) {
+ if (member.hasDeclarations) {
+ _unfoldDeclarations(member.declarations, result);
+ } else {
+ result.add(member);
+ }
+ }
+}
+
+abstract class SynthesizedMember extends ClassMember {
+ @override
+ final ClassBuilder classBuilder;
+
+ @override
+ final Name name;
+
+ @override
+ final bool forSetter;
+
+ @override
+ final bool isProperty;
+
+ SynthesizedMember(this.classBuilder, this.name,
+ {this.forSetter, this.isProperty})
+ : assert(forSetter != null),
+ assert(isProperty != null);
+
+ @override
+ List<ClassMember> get declarations => throw new UnimplementedError();
+
+ @override
+ void inferType(ClassHierarchyBuilder hierarchy) {}
+
+ @override
+ bool get isAssignable => throw new UnimplementedError();
+
+ @override
+ bool get isConst => throw new UnimplementedError();
+
+ @override
+ bool get isDuplicate => false;
+
+ @override
+ bool get isField => throw new UnimplementedError();
+
+ @override
+ bool get isFinal => throw new UnimplementedError();
+
+ @override
+ bool get isGetter => throw new UnimplementedError();
+
+ @override
+ bool get isInternalImplementation => false;
+
+ @override
+ bool get isSetter => forSetter;
+
+ @override
+ bool get isSourceDeclaration => false;
+
+ @override
+ bool get isStatic => false;
+
+ @override
+ bool get isSynthesized => true;
+
+ @override
+ void registerOverrideDependency(Set<ClassMember> overriddenMembers) {}
+}
+
+/// Class member for a set of interface members.
+///
+/// This is used to compute combined member signature of a set of interface
+/// members inherited into the same class, and to insert forwarding stubs,
+/// mixin stubs, and member signatures where needed.
+class SynthesizedInterfaceMember extends SynthesizedMember {
+ @override
+ final List<ClassMember> declarations;
+
+ /// The concrete member in the super class overridden by [declarations], if
+ /// any.
+ ///
+ /// This is used to as the target when creating concrete forwarding and mixin
+ /// stub. For instance:
+ ///
+ /// class Super {
+ /// method(int i) {}
+ /// }
+ /// class Interface {
+ /// method(covariant int i) {}
+ /// }
+ /// class Class extends Super implements Interface {
+ /// // Concrete forwarding stub calling [_superClassMember]:
+ /// method(covariant int i) => super.method(i);
+ ///
+ final ClassMember _superClassMember;
+
+ /// The canonical member of the combined member signature if it is known by
+ /// construction. The canonical member defines the type of combined member
+ /// signature.
+ ///
+ /// This is used when a declared member is part of a set of implemented
+ /// members. For instance
+ ///
+ /// class Super {
+ /// method(int i) {}
+ /// }
+ /// class Interface {
+ /// method(covariant num i) {}
+ /// }
+ /// class Class implements Interface {
+ /// // This member is updated to be a concrete forwarding stub with an
+ /// // covariant parameter but with its declared parameter type:
+ /// // method(covariant int i) => super.method(i);
+ /// method(int i);
+ /// }
+ final ClassMember _canonicalMember;
+
+ /// The member in [declarations] that is mixed in, if any.
+ ///
+ /// This is used to create mixin stubs. If the mixed in member is abstract,
+ /// an abstract mixin stub is created:
+ ///
+ /// class Super {
+ /// void method() {}
+ /// }
+ /// class Mixin {
+ /// void method();
+ /// }
+ /// // Abstract mixin stub with `Mixin.method` as target inserted:
+ /// // void method();
+ /// class Class = Super with Mixin;
+ ///
+ /// If the mixed in member is concrete, a concrete mixin member is created:
+ ///
+ /// class Super {
+ /// void method() {}
+ /// }
+ /// class Mixin {
+ /// void method() {}
+ /// }
+ /// // Concrete mixin stub with `Mixin.method` as target inserted:
+ /// // void method() => super.method();
+ /// class Class = Super with Mixin;
+ ///
+ /// If a forwarding stub is needed, the created stub will be a possibly
+ /// concrete forwarding stub:
+ ///
+ /// class Super {
+ /// void method(int i) {}
+ /// }
+ /// class Interface {
+ /// void method(covariant num i) {}
+ /// }
+ /// class Mixin {
+ /// void method(int i);
+ /// }
+ /// // Concrete forwarding stub with `Super.method` as target inserted:
+ /// // void method(covariant int i) => super.method(i);
+ /// class Class = Super with Mixin implements Interface;
+ ///
+ final ClassMember _mixedInMember;
+
+ /// If `true`, a stub should be inserted, if needed.
+ final bool _shouldModifyKernel;
+
+ Member _member;
+ Covariance _covariance;
+
+ SynthesizedInterfaceMember(
+ ClassBuilder classBuilder, Name name, this.declarations,
+ {ClassMember superClassMember,
+ ClassMember canonicalMember,
+ ClassMember mixedInMember,
+ bool isProperty,
+ bool forSetter,
+ bool shouldModifyKernel})
+ : this._superClassMember = superClassMember,
+ this._canonicalMember = canonicalMember,
+ this._mixedInMember = mixedInMember,
+ this._shouldModifyKernel = shouldModifyKernel,
+ super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
+
+ @override
+ bool get hasDeclarations => true;
+
+ void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+ if (_member != null) {
+ return;
+ }
+ if (classBuilder.library is! SourceLibraryBuilder) {
+ if (_canonicalMember != null) {
+ _member = _canonicalMember.getMember(hierarchy);
+ _covariance = _canonicalMember.getCovariance(hierarchy);
+ } else {
+ _member = declarations.first.getMember(hierarchy);
+ _covariance = declarations.first.getCovariance(hierarchy);
+ }
+ return;
+ }
+ CombinedClassMemberSignature combinedMemberSignature;
+ if (_canonicalMember != null) {
+ combinedMemberSignature = new CombinedClassMemberSignature.internal(
+ hierarchy,
+ classBuilder,
+ declarations.indexOf(_canonicalMember),
+ declarations,
+ forSetter: isSetter);
+ } else {
+ combinedMemberSignature = new CombinedClassMemberSignature(
+ hierarchy, classBuilder, declarations,
+ forSetter: isSetter);
+
+ if (combinedMemberSignature.canonicalMember == null) {
+ String name = classBuilder.fullNameForErrors;
+ int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
+ List<LocatedMessage> context = declarations.map((ClassMember d) {
+ return messageDeclaredMemberConflictsWithOverriddenMembersCause
+ .withLocation(
+ d.fileUri, d.charOffset, d.fullNameForErrors.length);
+ }).toList();
+
+ classBuilder.addProblem(
+ templateCombinedMemberSignatureFailed.withArguments(
+ classBuilder.fullNameForErrors,
+ declarations.first.fullNameForErrors),
+ classBuilder.charOffset,
+ length,
+ context: context);
+ // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
+ // cascading errors.
+ _member = declarations.first.getMember(hierarchy);
+ _covariance = declarations.first.getCovariance(hierarchy);
+ return;
+ }
+ }
+
+ if (_shouldModifyKernel) {
+ ProcedureKind kind = ProcedureKind.Method;
+ Member canonicalMember =
+ combinedMemberSignature.canonicalMember.getMember(hierarchy);
+ if (combinedMemberSignature.canonicalMember.isProperty) {
+ kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
+ } else if (canonicalMember is Procedure &&
+ canonicalMember.kind == ProcedureKind.Operator) {
+ kind = ProcedureKind.Operator;
+ }
+
+ Procedure stub = new ForwardingNode(
+ combinedMemberSignature, kind, _superClassMember, _mixedInMember)
+ .finalize();
+ if (stub != null) {
+ assert(classBuilder.cls == stub.enclosingClass);
+ assert(stub != canonicalMember);
+ classBuilder.cls.addProcedure(stub);
+ SourceLibraryBuilder library = classBuilder.library;
+ if (canonicalMember is Procedure) {
+ library.forwardersOrigins..add(stub)..add(canonicalMember);
+ }
+ _member = stub;
+ _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+ assert(
+ _covariance ==
+ new Covariance.fromMember(_member, forSetter: forSetter),
+ "Unexpected covariance for combined members signature "
+ "$_member. Found $_covariance, expected "
+ "${new Covariance.fromMember(_member, forSetter: forSetter)}.");
+ return;
+ }
+ }
+
+ _member = combinedMemberSignature.canonicalMember.getMember(hierarchy);
+ _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+ }
+
+ @override
+ Member getMember(ClassHierarchyBuilder hierarchy) {
+ _ensureMemberAndCovariance(hierarchy);
+ return _member;
+ }
+
+ @override
+ Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+ _ensureMemberAndCovariance(hierarchy);
+ return _covariance;
+ }
+
+ @override
+ ClassMember get interfaceMember => this;
+
+ @override
+ bool isObjectMember(ClassBuilder objectClass) {
+ return false;
+ }
+
+ @override
+ bool isSameDeclaration(ClassMember other) {
+ // TODO(johnniwinther): Optimize this.
+ return false;
+ }
+
+ @override
+ int get charOffset => declarations.first.charOffset;
+
+ @override
+ Uri get fileUri => declarations.first.fileUri;
+
+ @override
+ bool get isAbstract => true;
+
+ @override
+ String get fullNameForErrors =>
+ declarations.map((ClassMember m) => m.fullName).join("%");
+
+ @override
+ String get fullName {
+ String suffix = isSetter ? "=" : "";
+ return "${fullNameForErrors}$suffix";
+ }
+
+ String toString() => 'SynthesizedInterfaceMember($classBuilder,$name,'
+ '$declarations,forSetter=$forSetter)';
+}
+
+/// Class member for an inherited concrete member that implements an interface
+/// member.
+///
+/// This is used to ensure that both the inherited concrete member and the
+/// interface member is taken into account when computing the resulting [Member]
+/// node.
+///
+/// This is needed because an interface member, though initially abstract, can
+/// result in a concrete stub that overrides the concrete member. For instance
+///
+/// class Super {
+/// method(int i) {}
+/// }
+/// class Interface {
+/// method(covariant int i) {}
+/// }
+/// class Class extends Super implements Interface {
+/// // A concrete forwarding stub is inserted:
+/// method(covariant int i) => super.method(i);
+/// }
+/// class Sub extends Class implements Interface {
+/// // No forwarding stub should be inserted since `Class.method` is
+/// // adequate.
+/// }
+///
+///
+/// Here the create stub `Class.method` overrides `Super.method` and should
+/// be used to determine whether to insert a forwarding stub in subclasses.
+class InheritedClassMemberImplementsInterface extends SynthesizedMember {
+ final ClassMember inheritedClassMember;
+ final ClassMember implementedInterfaceMember;
+
+ Member _member;
+ Covariance _covariance;
+
+ InheritedClassMemberImplementsInterface(ClassBuilder classBuilder, Name name,
+ {this.inheritedClassMember,
+ this.implementedInterfaceMember,
+ bool isProperty,
+ bool forSetter})
+ : assert(inheritedClassMember != null),
+ assert(implementedInterfaceMember != null),
+ super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
+
+ void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+ if (_member == null) {
+ Member classMember = inheritedClassMember.getMember(hierarchy);
+ Member interfaceMember = implementedInterfaceMember.getMember(hierarchy);
+ if (!interfaceMember.isAbstract &&
+ interfaceMember.enclosingClass == classBuilder.cls) {
+ /// The interface member resulted in a concrete stub being inserted.
+ /// For instance for `method1` but _not_ for `method2` here:
+ ///
+ /// class Super {
+ /// method1(int i) {}
+ /// method2(covariant int i) {}
+ /// }
+ /// class Interface {
+ /// method1(covariant int i) {}
+ /// method2(int i) {}
+ /// }
+ /// class Class extends Super implements Interface {
+ /// // A concrete forwarding stub is inserted for `method1` since
+ /// // the parameter on `Super.method1` is _not_ marked as
+ /// // covariant:
+ /// method1(covariant int i) => super.method(i);
+ /// // No concrete forwarding stub is inserted for `method2` since
+ /// // the parameter on `Super.method2` is already marked as
+ /// // covariant.
+ /// }
+ ///
+ /// The inserted stub should be used as the resulting member.
+ _member = interfaceMember;
+ _covariance = implementedInterfaceMember.getCovariance(hierarchy);
+ } else {
+ /// The interface member did not result in an inserted stub or the
+ /// inserted stub was abstract. For instance:
+ ///
+ /// // Opt-in:
+ /// class Super {
+ /// method(int? i) {}
+ /// }
+ /// // Opt-out:
+ /// class Class extends Super {
+ /// // An abstract member signature stub is inserted:
+ /// method(int* i);
+ /// }
+ ///
+ /// The inserted stub should _not_ be used as the resulting member
+ /// since it is abstract and therefore not a class member.
+ _member = classMember;
+ _covariance = inheritedClassMember.getCovariance(hierarchy);
+ }
+ }
+ }
+
+ @override
+ Member getMember(ClassHierarchyBuilder hierarchy) {
+ _ensureMemberAndCovariance(hierarchy);
+ return _member;
+ }
+
+ @override
+ Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+ _ensureMemberAndCovariance(hierarchy);
+ return _covariance;
+ }
+
+ @override
+ ClassMember get interfaceMember => implementedInterfaceMember;
+
+ @override
+ bool isObjectMember(ClassBuilder objectClass) {
+ return inheritedClassMember.isObjectMember(objectClass);
+ }
+
+ @override
+ bool isSameDeclaration(ClassMember other) {
+ // TODO(johnniwinther): Optimize this.
+ return false;
+ }
+
+ @override
+ int get charOffset => inheritedClassMember.charOffset;
+
+ @override
+ Uri get fileUri => inheritedClassMember.fileUri;
+
+ @override
+ bool get hasDeclarations => false;
+
+ @override
+ bool get isAbstract => false;
+
+ @override
+ String get fullNameForErrors => inheritedClassMember.fullNameForErrors;
+
+ String get fullName => inheritedClassMember.fullName;
+
+ @override
+ String toString() =>
+ 'InheritedClassMemberImplementsInterface($classBuilder,$name,'
+ 'inheritedClassMember=$inheritedClassMember,'
+ 'implementedInterfaceMember=$implementedInterfaceMember,'
+ 'forSetter=$forSetter)';
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 00467ed..2f22878 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -263,17 +263,6 @@
return _containsNnbdTypes;
}
- /// Returns `true` if the covariance of the combined member signature is
- /// different from the covariance of the overridden member in the superclass.
- ///
- /// If `true` a concrete forwarding stub that checks the covariance must
- /// be generated.
- // TODO(johnniwinther): This is imprecise. It assumes that the 0th member is
- // from the superclass which might not be the case.
- bool get needsSuperImpl {
- return _getMemberCovariance(0) != combinedMemberSignatureCovariance;
- }
-
/// The this type of [classBuilder].
DartType get thisType {
return _thisType ??= _coreTypes.thisInterfaceType(
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index a647cbf..590534c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -40,14 +40,16 @@
final ClassMember _superClassMember;
- final bool _isSuperClassMemberMixedIn;
+ final ClassMember _mixedInMember;
ForwardingNode(this._combinedMemberSignature, this.kind,
- this._superClassMember, this._isSuperClassMemberMixedIn);
+ this._superClassMember, this._mixedInMember);
/// Finishes handling of this node by propagating covariance and creating
/// forwarding stubs if necessary.
- Member finalize() => _computeCovarianceFixes();
+ ///
+ /// If a stub is created, this is returned. Otherwise `null` is returned.
+ Procedure finalize() => _computeCovarianceFixes();
/// Tag the parameters of [interfaceMember] that need type checks
///
@@ -59,15 +61,16 @@
/// occurs in [enclosingClass]'s interface. If parameters need checks but
/// they would not be checked in an inherited implementation, a forwarding
/// stub is introduced as a place to put the checks.
- Member _computeCovarianceFixes() {
+ ///
+ /// If a stub is created, this is returned. Otherwise `null` is returned.
+ Procedure _computeCovarianceFixes() {
SourceClassBuilder classBuilder = _combinedMemberSignature.classBuilder;
ClassMember canonicalMember = _combinedMemberSignature.canonicalMember;
Member interfaceMember =
canonicalMember.getMember(_combinedMemberSignature.hierarchy);
- // TODO(johnniwinther): Support abstract mixin stubs.
bool needMixinStub =
- classBuilder.isMixinApplication && _isSuperClassMemberMixedIn;
+ classBuilder.isMixinApplication && _mixedInMember != null;
if (_combinedMemberSignature.members.length == 1 && !needMixinStub) {
// Covariance can only come from [interfaceMember] so we never need a
@@ -79,10 +82,13 @@
copyLocation: false);
} else {
// Nothing to do.
- return interfaceMember;
+ return null;
}
}
+ // TODO(johnniwinther): Remove this. This relies upon the order of the
+ // declarations matching the order in which members are returned from the
+ // [ClassHierarchy].
bool cannotReuseExistingMember =
!(_combinedMemberSignature.isCanonicalMemberFirst ||
_combinedMemberSignature.isCanonicalMemberDeclared);
@@ -94,43 +100,46 @@
(canonicalMember.classBuilder != classBuilder &&
needsTypeOrCovarianceUpdate) ||
needMixinStub;
+ bool needsSuperImpl = _superClassMember != null &&
+ _superClassMember.getCovariance(_combinedMemberSignature.hierarchy) !=
+ _combinedMemberSignature.combinedMemberSignatureCovariance;
if (stubNeeded) {
Procedure stub = _combinedMemberSignature.createMemberFromSignature(
copyLocation: false);
bool needsForwardingStub =
- _combinedMemberSignature.needsCovarianceMerging ||
- _combinedMemberSignature.needsSuperImpl;
+ _combinedMemberSignature.needsCovarianceMerging || needsSuperImpl;
if (needsForwardingStub || needMixinStub) {
ProcedureStubKind stubKind;
+ Member finalTarget;
if (needsForwardingStub) {
stubKind = ProcedureStubKind.AbstractForwardingStub;
- } else {
- stubKind = ProcedureStubKind.AbstractMixinStub;
- }
-
- // This is a forward stub.
- Member finalTarget;
- if (interfaceMember is Procedure) {
- switch (interfaceMember.stubKind) {
- case ProcedureStubKind.Regular:
- case ProcedureStubKind.NoSuchMethodForwarder:
- finalTarget = interfaceMember;
- break;
- case ProcedureStubKind.AbstractForwardingStub:
- case ProcedureStubKind.ConcreteForwardingStub:
- case ProcedureStubKind.AbstractMixinStub:
- case ProcedureStubKind.ConcreteMixinStub:
- case ProcedureStubKind.MemberSignature:
- finalTarget = interfaceMember.stubTarget;
- break;
+ if (interfaceMember is Procedure) {
+ switch (interfaceMember.stubKind) {
+ case ProcedureStubKind.Regular:
+ case ProcedureStubKind.NoSuchMethodForwarder:
+ finalTarget = interfaceMember;
+ break;
+ case ProcedureStubKind.AbstractForwardingStub:
+ case ProcedureStubKind.ConcreteForwardingStub:
+ case ProcedureStubKind.MemberSignature:
+ case ProcedureStubKind.AbstractMixinStub:
+ case ProcedureStubKind.ConcreteMixinStub:
+ finalTarget = interfaceMember.stubTarget;
+ break;
+ }
+ } else {
+ finalTarget = interfaceMember;
}
} else {
- finalTarget = interfaceMember;
+ stubKind = ProcedureStubKind.AbstractMixinStub;
+ finalTarget =
+ _mixedInMember.getMember(_combinedMemberSignature.hierarchy);
}
+
stub.stubKind = stubKind;
stub.stubTarget = finalTarget;
- if (_combinedMemberSignature.needsSuperImpl ||
- (needMixinStub && _superClassMember != null)) {
+ if (needsSuperImpl ||
+ (needMixinStub && _superClassMember == _mixedInMember)) {
_createForwardingImplIfNeeded(
stub.function, stub.name, classBuilder.cls,
isForwardingStub: needsForwardingStub);
@@ -143,12 +152,12 @@
_combinedMemberSignature.combinedMemberSignatureCovariance
.applyCovariance(interfaceMember);
}
- if (_combinedMemberSignature.needsSuperImpl) {
+ if (needsSuperImpl) {
_createForwardingImplIfNeeded(
interfaceMember.function, interfaceMember.name, classBuilder.cls,
isForwardingStub: true);
}
- return interfaceMember;
+ return null;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index e7f9b2a..1e80ebb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -5964,12 +5964,7 @@
}
assert(node.interfaceTarget == null || node.interfaceTarget is Procedure);
return inferrer.inferSuperMethodInvocation(
- node,
- typeContext,
- node.interfaceTarget != null
- ? new ObjectAccessTarget.interfaceMember(node.interfaceTarget,
- isPotentiallyNullable: false)
- : const ObjectAccessTarget.missing());
+ node, typeContext, node.interfaceTarget);
}
@override
@@ -5983,12 +5978,7 @@
new InstrumentationValueForMember(node.interfaceTarget));
}
return inferrer.inferSuperPropertyGet(
- node,
- typeContext,
- node.interfaceTarget != null
- ? new ObjectAccessTarget.interfaceMember(node.interfaceTarget,
- isPotentiallyNullable: false)
- : const ObjectAccessTarget.missing());
+ node, typeContext, node.interfaceTarget);
}
@override
@@ -6004,6 +5994,10 @@
isPotentiallyNullable: false)
: const ObjectAccessTarget.missing();
DartType writeContext = inferrer.getSetterType(writeTarget, receiverType);
+ if (node.interfaceTarget != null) {
+ writeContext = inferrer.computeTypeFromSuperClass(
+ node.interfaceTarget.enclosingClass, writeContext);
+ }
ExpressionInferenceResult rhsResult = inferrer.inferExpression(
node.value, writeContext ?? const UnknownType(), true,
isVoidAllowed: true);
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 5d920b5..32b969f 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
@@ -969,13 +969,11 @@
return count;
}
- void checkOverride(
- Types types,
- Member declaredMember,
- Member interfaceMember,
- bool isSetter,
- callback(Member declaredMember, Member interfaceMember, bool isSetter),
- {bool isInterfaceCheck = false}) {
+ void checkOverride(Types types, Member declaredMember, Member interfaceMember,
+ bool isSetter, callback(Member interfaceMember, bool isSetter),
+ {bool isInterfaceCheck, bool declaredNeedsLegacyErasure}) {
+ assert(isInterfaceCheck != null);
+ assert(declaredNeedsLegacyErasure != null);
if (declaredMember == interfaceMember) {
return;
}
@@ -989,21 +987,34 @@
if (declaredMember.kind == interfaceMember.kind) {
if (declaredMember.kind == ProcedureKind.Method ||
declaredMember.kind == ProcedureKind.Operator) {
- bool seenCovariant = checkMethodOverride(types, declaredMember,
- interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
+ bool seenCovariant = checkMethodOverride(
+ types,
+ declaredMember,
+ interfaceMember,
+ interfaceMemberOrigin,
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
if (seenCovariant) {
- handleSeenCovariant(
- types, declaredMember, interfaceMember, isSetter, callback);
+ handleSeenCovariant(types, interfaceMember, isSetter, callback);
}
} else if (declaredMember.kind == ProcedureKind.Getter) {
- checkGetterOverride(types, declaredMember, interfaceMember,
- interfaceMemberOrigin, isInterfaceCheck);
+ checkGetterOverride(
+ types,
+ declaredMember,
+ interfaceMember,
+ interfaceMemberOrigin,
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
} else if (declaredMember.kind == ProcedureKind.Setter) {
- bool seenCovariant = checkSetterOverride(types, declaredMember,
- interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
+ bool seenCovariant = checkSetterOverride(
+ types,
+ declaredMember,
+ interfaceMember,
+ interfaceMemberOrigin,
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
if (seenCovariant) {
- handleSeenCovariant(
- types, declaredMember, interfaceMember, isSetter, callback);
+ handleSeenCovariant(types, interfaceMember, isSetter, callback);
}
} else {
assert(
@@ -1026,15 +1037,24 @@
!interfaceMember.isConst) ||
interfaceMember is Procedure && interfaceMember.isSetter;
if (declaredMemberHasGetter && interfaceMemberHasGetter) {
- checkGetterOverride(types, declaredMember, interfaceMember,
- interfaceMemberOrigin, isInterfaceCheck);
+ checkGetterOverride(
+ types,
+ declaredMember,
+ interfaceMember,
+ interfaceMemberOrigin,
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
}
if (declaredMemberHasSetter && interfaceMemberHasSetter) {
- bool seenCovariant = checkSetterOverride(types, declaredMember,
- interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
+ bool seenCovariant = checkSetterOverride(
+ types,
+ declaredMember,
+ interfaceMember,
+ interfaceMemberOrigin,
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
if (seenCovariant) {
- handleSeenCovariant(
- types, declaredMember, interfaceMember, isSetter, callback);
+ handleSeenCovariant(types, interfaceMember, isSetter, callback);
}
}
}
@@ -1204,7 +1224,8 @@
Member interfaceMemberOrigin,
FunctionNode declaredFunction,
FunctionNode interfaceFunction,
- bool isInterfaceCheck) {
+ bool isInterfaceCheck,
+ bool declaredNeedsLegacyErasure) {
Substitution interfaceSubstitution = Substitution.empty;
if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
Class enclosingClass = interfaceMember.enclosingClass;
@@ -1257,6 +1278,9 @@
if (!library.isNonNullableByDefault) {
computedBound = legacyErasure(computedBound);
}
+ if (declaredNeedsLegacyErasure) {
+ declaredBound = legacyErasure(declaredBound);
+ }
if (!types
.performNullabilityAwareMutualSubtypesCheck(
declaredBound, computedBound)
@@ -1315,6 +1339,7 @@
bool isCovariant,
VariableDeclaration declaredParameter,
bool isInterfaceCheck,
+ bool declaredNeedsLegacyErasure,
{bool asIfDeclaredParameter = false}) {
if (interfaceSubstitution != null) {
interfaceType = interfaceSubstitution.substituteType(interfaceType);
@@ -1322,6 +1347,9 @@
if (declaredSubstitution != null) {
declaredType = declaredSubstitution.substituteType(declaredType);
}
+ if (declaredNeedsLegacyErasure) {
+ declaredType = legacyErasure(declaredType);
+ }
if (!declaredMember.isNonNullableByDefault &&
interfaceMember.isNonNullableByDefault) {
@@ -1411,7 +1439,8 @@
Procedure declaredMember,
Procedure interfaceMember,
Member interfaceMemberOrigin,
- bool isInterfaceCheck) {
+ bool isInterfaceCheck,
+ bool declaredNeedsLegacyErasure) {
assert(declaredMember.kind == interfaceMember.kind);
assert(declaredMember.kind == ProcedureKind.Method ||
declaredMember.kind == ProcedureKind.Operator);
@@ -1426,7 +1455,8 @@
interfaceMemberOrigin,
declaredFunction,
interfaceFunction,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
Substitution declaredSubstitution =
_computeDeclaredSubstitution(types, declaredMember);
@@ -1442,7 +1472,8 @@
interfaceFunction.returnType,
false,
null,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
if (declaredFunction.positionalParameters.length <
interfaceFunction.positionalParameters.length) {
reportInvalidOverride(
@@ -1451,15 +1482,15 @@
templateOverrideFewerPositionalArguments.withArguments(
"${declaredMember.enclosingClass.name}."
"${declaredMember.name.text}",
- "${interfaceMember.enclosingClass.name}."
- "${interfaceMember.name.text}"),
+ "${interfaceMemberOrigin.enclosingClass.name}."
+ "${interfaceMemberOrigin.name.text}"),
declaredMember.fileOffset,
noLength,
context: [
templateOverriddenMethodCause
- .withArguments(interfaceMember.name.text)
- .withLocation(interfaceMember.fileUri,
- interfaceMember.fileOffset, noLength)
+ .withArguments(interfaceMemberOrigin.name.text)
+ .withLocation(interfaceMemberOrigin.fileUri,
+ interfaceMemberOrigin.fileOffset, noLength)
]);
}
if (interfaceFunction.requiredParameterCount <
@@ -1470,15 +1501,15 @@
templateOverrideMoreRequiredArguments.withArguments(
"${declaredMember.enclosingClass.name}."
"${declaredMember.name.text}",
- "${interfaceMember.enclosingClass.name}."
- "${interfaceMember.name.text}"),
+ "${interfaceMemberOrigin.enclosingClass.name}."
+ "${interfaceMemberOrigin.name.text}"),
declaredMember.fileOffset,
noLength,
context: [
templateOverriddenMethodCause
- .withArguments(interfaceMember.name.text)
- .withLocation(interfaceMember.fileUri,
- interfaceMember.fileOffset, noLength)
+ .withArguments(interfaceMemberOrigin.name.text)
+ .withLocation(interfaceMemberOrigin.fileUri,
+ interfaceMemberOrigin.fileOffset, noLength)
]);
}
for (int i = 0;
@@ -1511,7 +1542,8 @@
interfaceParameter.type,
declaredParameter.isCovariant || interfaceParameter.isCovariant,
declaredParameter,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
if (declaredParameter.isCovariant) seenCovariant = true;
}
if (declaredFunction.namedParameters.isEmpty &&
@@ -1589,8 +1621,10 @@
interfaceNamedParameters.current.type,
declaredParameter.isCovariant,
declaredParameter,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
if (declaredMember.isNonNullableByDefault &&
+ !declaredNeedsLegacyErasure &&
declaredParameter.isRequired &&
interfaceMember.isNonNullableByDefault &&
!interfaceNamedParameters.current.isRequired) {
@@ -1627,7 +1661,8 @@
Member declaredMember,
Member interfaceMember,
Member interfaceMemberOrigin,
- bool isInterfaceCheck) {
+ bool isInterfaceCheck,
+ bool declaredNeedsLegacyErasure) {
Substitution interfaceSubstitution = _computeInterfaceSubstitution(
types,
declaredMember,
@@ -1635,7 +1670,8 @@
interfaceMemberOrigin,
/* declaredFunction = */ null,
/* interfaceFunction = */ null,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
Substitution declaredSubstitution =
_computeDeclaredSubstitution(types, declaredMember);
DartType declaredType = declaredMember.getterType;
@@ -1651,7 +1687,8 @@
interfaceType,
/* isCovariant = */ false,
/* declaredParameter = */ null,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
}
/// Checks whether [declaredMember] correctly overrides [interfaceMember].
@@ -1667,7 +1704,8 @@
Member declaredMember,
Member interfaceMember,
Member interfaceMemberOrigin,
- bool isInterfaceCheck) {
+ bool isInterfaceCheck,
+ bool declaredNeedsLegacyErasure) {
Substitution interfaceSubstitution = _computeInterfaceSubstitution(
types,
declaredMember,
@@ -1675,7 +1713,8 @@
interfaceMemberOrigin,
/* declaredFunction = */ null,
/* interfaceFunction = */ null,
- isInterfaceCheck);
+ isInterfaceCheck,
+ declaredNeedsLegacyErasure);
Substitution declaredSubstitution =
_computeDeclaredSubstitution(types, declaredMember);
DartType declaredType = declaredMember.setterType;
@@ -1701,6 +1740,7 @@
isCovariant,
declaredParameter,
isInterfaceCheck,
+ declaredNeedsLegacyErasure,
asIfDeclaredParameter: true);
return isCovariant;
}
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 b183c32..ec4dd29 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
@@ -1132,6 +1132,39 @@
return null;
}
+ /// Returns [type] as passed from [superClass] to the current class.
+ ///
+ /// If a legacy class occurs between the current class and [superClass] then
+ /// [type] needs to be legacy erased. For instance
+ ///
+ /// // Opt in:
+ /// class Super {
+ /// int extendedMethod(int i, {required int j}) => i;
+ /// }
+ /// class Mixin {
+ /// int mixedInMethod(int i, {required int j}) => i;
+ /// }
+ /// // Opt out:
+ /// class Legacy extends Super with Mixin {}
+ /// // Opt in:
+ /// class Class extends Legacy {
+ /// test() {
+ /// // Ok to call `Legacy.extendedMethod` since its type is
+ /// // `int* Function(int*, {int* j})`.
+ /// super.extendedMethod(null);
+ /// // Ok to call `Legacy.mixedInMethod` since its type is
+ /// // `int* Function(int*, {int* j})`.
+ /// super.mixedInMethod(null);
+ /// }
+ /// }
+ ///
+ DartType computeTypeFromSuperClass(Class superClass, DartType type) {
+ if (needsLegacyErasure(thisType.classNode, superClass)) {
+ type = legacyErasure(type);
+ }
+ return type;
+ }
+
/// Returns the type of [target] when accessed as a getter on [receiverType].
///
/// For instance
@@ -3479,9 +3512,11 @@
ExpressionInferenceResult inferSuperMethodInvocation(
SuperMethodInvocation expression,
DartType typeContext,
- ObjectAccessTarget target) {
- assert(
- target.isInstanceMember || target.isObjectMember || target.isMissing);
+ Procedure procedure) {
+ ObjectAccessTarget target = procedure != null
+ ? new ObjectAccessTarget.interfaceMember(procedure,
+ isPotentiallyNullable: false)
+ : const ObjectAccessTarget.missing();
int fileOffset = expression.fileOffset;
Name methodName = expression.name;
Arguments arguments = expression.arguments;
@@ -3490,6 +3525,12 @@
isSpecialCasedBinaryOperatorForReceiverType(target, receiverType);
DartType calleeType = getGetterType(target, receiverType);
FunctionType functionType = getFunctionType(target, receiverType);
+ if (procedure != null) {
+ calleeType =
+ computeTypeFromSuperClass(procedure.enclosingClass, calleeType);
+ functionType =
+ computeTypeFromSuperClass(procedure.enclosingClass, functionType);
+ }
if (isNonNullableByDefault &&
expression.name == equalsName &&
functionType.positionalParameters.length == 1) {
@@ -3503,7 +3544,7 @@
typeContext, fileOffset, functionType, arguments,
isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
receiverType: receiverType,
- isImplicitExtensionMember: target.isExtensionMember);
+ isImplicitExtensionMember: false);
DartType inferredType = result.inferredType;
if (methodName.text == '==') {
inferredType = coreTypes.boolRawType(library.nonNullable);
@@ -3534,18 +3575,20 @@
}
/// Performs the core type inference algorithm for super property get.
- ExpressionInferenceResult inferSuperPropertyGet(SuperPropertyGet expression,
- DartType typeContext, ObjectAccessTarget readTarget) {
- assert(readTarget.isInstanceMember ||
- readTarget.isObjectMember ||
- readTarget.isMissing);
+ ExpressionInferenceResult inferSuperPropertyGet(
+ SuperPropertyGet expression, DartType typeContext, Member member) {
+ ObjectAccessTarget readTarget = member != null
+ ? new ObjectAccessTarget.interfaceMember(member,
+ isPotentiallyNullable: false)
+ : const ObjectAccessTarget.missing();
DartType receiverType = thisType;
DartType inferredType = getGetterType(readTarget, receiverType);
- if (readTarget.isInstanceMember || readTarget.isObjectMember) {
- Member member = readTarget.member;
- if (member is Procedure && member.kind == ProcedureKind.Method) {
- return instantiateTearOff(inferredType, typeContext, expression);
- }
+ if (member != null) {
+ inferredType =
+ computeTypeFromSuperClass(member.enclosingClass, inferredType);
+ }
+ if (member is Procedure && member.kind == ProcedureKind.Method) {
+ return instantiateTearOff(inferredType, typeContext, expression);
}
return new ExpressionInferenceResult(inferredType, expression);
}
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 82e3414..69fb201 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -159,23 +159,21 @@
Member member;
int offset;
if (id.className != null) {
- Class cls = lookupClass(library, id.className);
- member = lookupClassMember(cls, id.memberName, required: false);
- if (member != null) {
- offset = member.fileOffset;
- if (offset == -1) {
+ Class cls = lookupClass(library, id.className, required: false);
+ if (cls != null) {
+ member = lookupClassMember(cls, id.memberName, required: false);
+ if (member != null) {
+ offset = member.fileOffset;
+ if (offset == -1) {
+ offset = cls.fileOffset;
+ }
+ } else {
offset = cls.fileOffset;
}
- } else {
- offset = cls.fileOffset;
}
} else {
member = lookupLibraryMember(library, id.memberName, required: false);
- if (member != null) {
- offset = member.fileOffset;
- } else {
- offset = 0;
- }
+ offset = member?.fileOffset ?? 0;
}
if (offset == -1) {
offset = 0;
@@ -188,8 +186,8 @@
if (extension != null) {
return extension.fileOffset;
}
- Class cls = lookupClass(library, id.className);
- return cls.fileOffset;
+ Class cls = lookupClass(library, id.className, required: false);
+ return cls?.fileOffset ?? 0;
}
return null;
}
diff --git a/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
new file mode 100644
index 0000000..5fb09fd
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
@@ -0,0 +1,309 @@
+// 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=2.9
+
+import 'dart:io' show Directory, Platform;
+import 'package:_fe_analyzer_shared/src/testing/features.dart';
+import 'package:_fe_analyzer_shared/src/testing/id.dart';
+import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+import 'package:front_end/src/fasta/kernel/kernel_api.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart';
+import 'package:front_end/src/testing/id_testing_utils.dart';
+import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart';
+import 'package:front_end/src/testing/id_extractor.dart';
+import 'package:kernel/ast.dart';
+
+main(List<String> args) async {
+ Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+ await runTests<Features>(dataDir,
+ args: args,
+ createUriForFileName: createUriForFileName,
+ onFailure: onFailure,
+ runTest: runTestFor(
+ const ClassHierarchyDataComputer(), [cfeNonNullableConfig]));
+}
+
+class ClassHierarchyDataComputer extends DataComputer<Features> {
+ const ClassHierarchyDataComputer();
+
+ /// Function that computes a data mapping for [library].
+ ///
+ /// Fills [actualMap] with the data.
+ void computeLibraryData(
+ TestConfig config,
+ InternalCompilerResult compilerResult,
+ Library library,
+ Map<Id, ActualData<Features>> actualMap,
+ {bool verbose}) {
+ new InheritanceDataExtractor(compilerResult, actualMap)
+ .computeForLibrary(library);
+ }
+
+ @override
+ void computeClassData(
+ TestConfig config,
+ InternalCompilerResult compilerResult,
+ Class cls,
+ Map<Id, ActualData<Features>> actualMap,
+ {bool verbose}) {
+ new InheritanceDataExtractor(compilerResult, actualMap)
+ .computeForClass(cls);
+ }
+
+ @override
+ bool get supportsErrors => true;
+
+ @override
+ Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
+ Id id, List<FormattedMessage> errors) {
+ return null; //errorsToText(errors, useCodes: true);
+ }
+
+ @override
+ DataInterpreter<Features> get dataValidator =>
+ const FeaturesDataInterpreter();
+}
+
+class Tag {
+ static const String superclasses = 'superclasses';
+ static const String interfaces = 'interfaces';
+ static const String hasNoSuchMethod = 'hasNoSuchMethod';
+ static const String abstractMembers = 'abstractMembers';
+ static const String classBuilder = 'classBuilder';
+ static const String isSourceDeclaration = 'isSourceDeclaration';
+ static const String isSynthesized = 'isSynthesized';
+ static const String member = 'member';
+ static const String maxInheritancePath = 'maxInheritancePath';
+ static const String declaredOverrides = 'declared-overrides';
+ static const String mixinApplicationOverrides = 'mixin-overrides';
+ static const String inheritedImplements = 'inherited-implements';
+ static const String abstractForwardingStub = 'abstractForwardingStub';
+ static const String concreteForwardingStub = 'concreteForwardingStub';
+ static const String memberSignature = 'memberSignature';
+ static const String abstractMixinStub = 'abstractMixinStub';
+ static const String concreteMixinStub = 'concreteMixinStub';
+ static const String declarations = 'declarations';
+ static const String stubTarget = 'stubTarget';
+ static const String type = 'type';
+ static const String covariance = 'covariance';
+}
+
+class InheritanceDataExtractor extends CfeDataExtractor<Features> {
+ final InternalCompilerResult _compilerResult;
+
+ InheritanceDataExtractor(
+ this._compilerResult, Map<Id, ActualData<Features>> actualMap)
+ : super(_compilerResult, actualMap);
+
+ CoreTypes get _coreTypes => _compilerResult.coreTypes;
+
+ ClassHierarchyBuilder get _classHierarchyBuilder =>
+ _compilerResult.kernelTargetForTesting.loader.builderHierarchy;
+
+ @override
+ void computeForClass(Class node) {
+ super.computeForClass(node);
+ ClassHierarchyNode classHierarchyNode =
+ _classHierarchyBuilder.getNodeFromClass(node);
+ ClassHierarchyNodeDataForTesting data = classHierarchyNode.dataForTesting;
+ void addMember(ClassMember classMember,
+ {bool isSetter, bool isClassMember}) {
+ Member member = classMember.getMember(_classHierarchyBuilder);
+ Member memberOrigin = member.memberSignatureOrigin ?? member;
+ if (memberOrigin.enclosingClass == _coreTypes.objectClass) {
+ return;
+ }
+ Features features = new Features();
+
+ String memberName = classMemberName(classMember);
+ memberName += isClassMember ? '#cls' : '#int';
+ MemberId id = new MemberId.internal(memberName, className: node.name);
+
+ TreeNode nodeWithOffset;
+ if (member.enclosingClass == node) {
+ nodeWithOffset = computeTreeNodeWithOffset(member);
+ } else {
+ nodeWithOffset = computeTreeNodeWithOffset(node);
+ }
+ if (classMember.isSourceDeclaration) {
+ features.add(Tag.isSourceDeclaration);
+ }
+ if (classMember.isSynthesized) {
+ features.add(Tag.isSynthesized);
+ if (member.enclosingClass != node) {
+ features[Tag.member] = memberQualifiedName(member);
+ }
+ if (classMember.hasDeclarations) {
+ for (ClassMember declaration in classMember.declarations) {
+ features.addElement(
+ Tag.declarations, classMemberQualifiedName(declaration));
+ }
+ }
+ }
+ features[Tag.classBuilder] = classMember.classBuilder.name;
+
+ Set<ClassMember> declaredOverrides =
+ data.declaredOverrides[data.aliasMap[classMember] ?? classMember];
+ if (declaredOverrides != null) {
+ for (ClassMember override in declaredOverrides) {
+ features.addElement(
+ Tag.declaredOverrides, classMemberQualifiedName(override));
+ }
+ }
+
+ Set<ClassMember> mixinApplicationOverrides = data
+ .mixinApplicationOverrides[data.aliasMap[classMember] ?? classMember];
+ if (mixinApplicationOverrides != null) {
+ for (ClassMember override in mixinApplicationOverrides) {
+ features.addElement(Tag.mixinApplicationOverrides,
+ classMemberQualifiedName(override));
+ }
+ }
+
+ Set<ClassMember> inheritedImplements =
+ data.inheritedImplements[data.aliasMap[classMember] ?? classMember];
+ if (inheritedImplements != null) {
+ for (ClassMember implement in inheritedImplements) {
+ features.addElement(
+ Tag.inheritedImplements, classMemberQualifiedName(implement));
+ }
+ }
+
+ if (member.enclosingClass == node && member is Procedure) {
+ switch (member.stubKind) {
+ case ProcedureStubKind.Regular:
+ // TODO: Handle this case.
+ break;
+ case ProcedureStubKind.AbstractForwardingStub:
+ features.add(Tag.abstractForwardingStub);
+ features[Tag.type] = procedureType(member);
+ features[Tag.covariance] =
+ classMember.getCovariance(_classHierarchyBuilder).toString();
+ break;
+ case ProcedureStubKind.ConcreteForwardingStub:
+ features.add(Tag.concreteForwardingStub);
+ features[Tag.type] = procedureType(member);
+ features[Tag.covariance] =
+ classMember.getCovariance(_classHierarchyBuilder).toString();
+ features[Tag.stubTarget] = memberQualifiedName(member.stubTarget);
+ break;
+ case ProcedureStubKind.NoSuchMethodForwarder:
+ // TODO: Handle this case.
+ break;
+ case ProcedureStubKind.MemberSignature:
+ features.add(Tag.memberSignature);
+ features[Tag.type] = procedureType(member);
+ features[Tag.covariance] =
+ classMember.getCovariance(_classHierarchyBuilder).toString();
+ break;
+ case ProcedureStubKind.AbstractMixinStub:
+ features.add(Tag.abstractMixinStub);
+ break;
+ case ProcedureStubKind.ConcreteMixinStub:
+ features.add(Tag.concreteMixinStub);
+ features[Tag.stubTarget] = memberQualifiedName(member.stubTarget);
+ break;
+ }
+ }
+
+ registerValue(nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset,
+ id, features, member);
+ }
+
+ classHierarchyNode.classMemberMap
+ ?.forEach((Name name, ClassMember classMember) {
+ addMember(classMember, isSetter: false, isClassMember: true);
+ });
+ classHierarchyNode.classSetterMap
+ ?.forEach((Name name, ClassMember classMember) {
+ addMember(classMember, isSetter: true, isClassMember: true);
+ });
+ classHierarchyNode.interfaceMemberMap
+ ?.forEach((Name name, ClassMember classMember) {
+ if (!identical(classMember, classHierarchyNode.classMemberMap[name])) {
+ addMember(classMember, isSetter: false, isClassMember: false);
+ }
+ });
+ classHierarchyNode.interfaceSetterMap
+ ?.forEach((Name name, ClassMember classMember) {
+ if (!identical(classMember, classHierarchyNode.classSetterMap[name])) {
+ addMember(classMember, isSetter: true, isClassMember: false);
+ }
+ });
+ }
+
+ @override
+ Features computeClassValue(Id id, Class node) {
+ Features features = new Features();
+ ClassHierarchyNode classHierarchyNode =
+ _classHierarchyBuilder.getNodeFromClass(node);
+ ClassHierarchyNodeDataForTesting data = classHierarchyNode.dataForTesting;
+ classHierarchyNode.superclasses.forEach((Supertype supertype) {
+ features.addElement(Tag.superclasses, supertypeToText(supertype));
+ });
+ classHierarchyNode.interfaces.forEach((Supertype supertype) {
+ features.addElement(Tag.interfaces, supertypeToText(supertype));
+ });
+ if (data.abstractMembers != null) {
+ for (ClassMember abstractMember in data.abstractMembers) {
+ features.addElement(
+ Tag.abstractMembers, classMemberQualifiedName(abstractMember));
+ }
+ }
+ features[Tag.maxInheritancePath] =
+ '${classHierarchyNode.maxInheritancePath}';
+ if (classHierarchyNode.hasNoSuchMethod) {
+ features.add(Tag.hasNoSuchMethod);
+ }
+ return features;
+ }
+}
+
+String classMemberName(ClassMember classMember) {
+ String name = classMember.name.text;
+ if (classMember.forSetter) {
+ name += '=';
+ }
+ return name;
+}
+
+String classMemberQualifiedName(ClassMember classMember) {
+ return '${classMember.classBuilder.name}.${classMemberName(classMember)}';
+}
+
+String memberName(Member member) {
+ String name = member.name.text;
+ if (member is Procedure && member.isSetter) {
+ name += '=';
+ }
+ return name;
+}
+
+String memberQualifiedName(Member member) {
+ return '${member.enclosingClass.name}.${memberName(member)}';
+}
+
+String procedureType(Procedure procedure) {
+ if (procedure.kind == ProcedureKind.Getter) {
+ return typeToText(procedure.function.returnType,
+ TypeRepresentation.analyzerNonNullableByDefault);
+ } else if (procedure.kind == ProcedureKind.Setter) {
+ return typeToText(procedure.function.positionalParameters.single.type,
+ TypeRepresentation.analyzerNonNullableByDefault);
+ } else {
+ Nullability functionTypeNullability;
+ if (procedure.enclosingLibrary.isNonNullableByDefault) {
+ functionTypeNullability = procedure.enclosingLibrary.nonNullable;
+ } else {
+ // We don't create a member signature when the member is just
+ // a substitution. We should still take the nullability to be
+ // legacy, though.
+ functionTypeNullability = procedure.enclosingLibrary.nonNullable;
+ }
+ return typeToText(
+ procedure.function.computeThisFunctionType(functionTypeNullability),
+ TypeRepresentation.analyzerNonNullableByDefault);
+ }
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_field.dart
new file mode 100644
index 0000000..fbd6127
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_field.dart
@@ -0,0 +1,197 @@
+// 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.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+ /*member: AbstractSuper.extendedConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractSuper.extendedConcreteField=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int extendedConcreteField = 0;
+
+ /*member: AbstractSuper.extendedAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractSuper.extendedAbstractField=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractField;
+
+ /*member: AbstractSuper.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractSuper.declaredConcreteExtendsConcreteField=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: AbstractSuper.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractSuper.declaredAbstractExtendsConcreteField=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int declaredAbstractExtendsConcreteField = 0;
+
+ /*member: AbstractSuper.declaredConcreteExtendsAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractSuper.declaredConcreteExtendsAbstractField=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ abstract int declaredConcreteExtendsAbstractField;
+
+ /*member: AbstractSuper.declaredAbstractExtendsAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractSuper.declaredAbstractExtendsAbstractField=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractExtendsAbstractField;
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+ AbstractSuper,
+ Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+ /*member: AbstractClass.extendedConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.extendedConcreteField=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.extendedAbstractField=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteField#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredConcreteField=#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ int declaredConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractField#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredAbstractField=#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractField;
+
+ /*member: AbstractClass.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ AbstractSuper.declaredConcreteExtendsConcreteField,
+ AbstractSuper.declaredConcreteExtendsConcreteField=],
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredConcreteExtendsConcreteField=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ AbstractSuper.declaredConcreteExtendsConcreteField,
+ AbstractSuper.declaredConcreteExtendsConcreteField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteField
+ */
+ /*member: AbstractClass.declaredAbstractExtendsConcreteField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsConcreteField,
+ AbstractSuper.declaredAbstractExtendsConcreteField],
+ declared-overrides=[
+ AbstractSuper.declaredAbstractExtendsConcreteField,
+ AbstractSuper.declaredAbstractExtendsConcreteField=],
+ isSynthesized
+ */
+ /*member: AbstractClass.declaredAbstractExtendsConcreteField=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteField
+ */
+ /*member: AbstractClass.declaredAbstractExtendsConcreteField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsConcreteField=,
+ AbstractSuper.declaredAbstractExtendsConcreteField=],
+ declared-overrides=[
+ AbstractSuper.declaredAbstractExtendsConcreteField,
+ AbstractSuper.declaredAbstractExtendsConcreteField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractExtendsConcreteField;
+
+ /*member: AbstractClass.declaredConcreteExtendsAbstractField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ AbstractSuper.declaredConcreteExtendsAbstractField,
+ AbstractSuper.declaredConcreteExtendsAbstractField=],
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredConcreteExtendsAbstractField=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ AbstractSuper.declaredConcreteExtendsAbstractField,
+ AbstractSuper.declaredConcreteExtendsAbstractField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteExtendsAbstractField = 0;
+
+ /*member: AbstractClass.declaredAbstractExtendsAbstractField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ AbstractSuper.declaredAbstractExtendsAbstractField,
+ AbstractSuper.declaredAbstractExtendsAbstractField=],
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredAbstractExtendsAbstractField=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ AbstractSuper.declaredAbstractExtendsAbstractField,
+ AbstractSuper.declaredAbstractExtendsAbstractField=],
+ isSourceDeclaration
+ */
+ int declaredAbstractExtendsAbstractField = 0;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_final_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_final_field.dart
new file mode 100644
index 0000000..b5ed4db
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_final_field.dart
@@ -0,0 +1,116 @@
+// 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.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+ /*member: AbstractSuper.extendedConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ final int extendedConcreteField = 0;
+
+ /*member: AbstractSuper.extendedAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractField;
+
+ /*member: AbstractSuper.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ final int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: AbstractSuper.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ final int declaredAbstractExtendsConcreteField = 0;
+
+ /*member: AbstractSuper.declaredConcreteExtendsAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ abstract final int declaredConcreteExtendsAbstractField;
+
+ /*member: AbstractSuper.declaredAbstractExtendsAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractExtendsAbstractField;
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+ AbstractSuper,
+ Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+ /*member: AbstractClass.extendedConcreteField#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractField#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteField#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ final int declaredConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractField#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractField;
+
+ /*member: AbstractClass.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteField
+ */
+ /*member: AbstractClass.declaredAbstractExtendsConcreteField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsConcreteField,
+ AbstractSuper.declaredAbstractExtendsConcreteField],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractExtendsConcreteField;
+
+ /*member: AbstractClass.declaredConcreteExtendsAbstractField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteExtendsAbstractField = 0;
+
+ /*member: AbstractClass.declaredAbstractExtendsAbstractField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsAbstractField,
+ AbstractSuper.declaredAbstractExtendsAbstractField],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractExtendsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_getter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_getter.dart
new file mode 100644
index 0000000..6900a41
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_getter.dart
@@ -0,0 +1,116 @@
+// 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.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+ /*member: AbstractSuper.extendedConcreteGetter#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int get extendedConcreteGetter => 0;
+
+ /*member: AbstractSuper.extendedAbstractGetter#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int get extendedAbstractGetter;
+
+ /*member: AbstractSuper.declaredConcreteExtendsConcreteGetter#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsConcreteGetter => 0;
+
+ /*member: AbstractSuper.declaredAbstractExtendsConcreteGetter#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int get declaredAbstractExtendsConcreteGetter => 0;
+
+ /*member: AbstractSuper.declaredConcreteExtendsAbstractGetter#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsAbstractGetter;
+
+ /*member: AbstractSuper.declaredAbstractExtendsAbstractGetter#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ int get declaredAbstractExtendsAbstractGetter;
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+ AbstractSuper,
+ Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+ /*member: AbstractClass.extendedConcreteGetter#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractGetter#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteGetter#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ int get declaredConcreteGetter => 0;
+
+ /*member: AbstractClass.declaredAbstractGetter#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ int get declaredAbstractGetter;
+
+ /*member: AbstractClass.declaredConcreteExtendsConcreteGetter#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsConcreteGetter => 0;
+
+ /*member: AbstractClass.declaredAbstractExtendsConcreteGetter#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteGetter
+ */
+ /*member: AbstractClass.declaredAbstractExtendsConcreteGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsConcreteGetter,
+ AbstractSuper.declaredAbstractExtendsConcreteGetter],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteGetter],
+ isSynthesized
+ */
+ int get declaredAbstractExtendsConcreteGetter;
+
+ /*member: AbstractClass.declaredConcreteExtendsAbstractGetter#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsAbstractGetter => 0;
+
+ /*member: AbstractClass.declaredAbstractExtendsAbstractGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsAbstractGetter,
+ AbstractSuper.declaredAbstractExtendsAbstractGetter],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractGetter],
+ isSynthesized
+ */
+ int get declaredAbstractExtendsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_method.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_method.dart
new file mode 100644
index 0000000..7bbce15
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_method.dart
@@ -0,0 +1,114 @@
+// 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.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+ /*member: AbstractSuper.extendedConcreteMethod#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void extendedConcreteMethod() {}
+
+ /*member: AbstractSuper.extendedAbstractMethod#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void extendedAbstractMethod();
+
+ /*member: AbstractSuper.declaredConcreteExtendsConcreteMethod#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsConcreteMethod() {}
+
+ /*member: AbstractSuper.declaredAbstractExtendsConcreteMethod#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void declaredAbstractExtendsConcreteMethod() {}
+
+ /*member: AbstractSuper.declaredConcreteExtendsAbstractMethod#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsAbstractMethod();
+
+ /*member: AbstractSuper.declaredAbstractExtendsAbstractMethod#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void declaredAbstractExtendsAbstractMethod();
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+ AbstractSuper,
+ Object]
+*/
+/*member: AbstractClass.declaredAbstractExtendsConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteMethod
+*/
+abstract class AbstractClass extends AbstractSuper {
+ /*member: AbstractClass.extendedConcreteMethod#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractMethod#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void declaredConcreteMethod() {}
+
+ /*member: AbstractClass.declaredAbstractMethod#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void declaredAbstractMethod();
+
+ /*member: AbstractClass.declaredConcreteExtendsConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsConcreteMethod() {}
+
+ /*member: AbstractClass.declaredAbstractExtendsConcreteMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsConcreteMethod,
+ AbstractSuper.declaredAbstractExtendsConcreteMethod],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteMethod],
+ isSynthesized
+ */
+ void declaredAbstractExtendsConcreteMethod();
+
+ /*member: AbstractClass.declaredConcreteExtendsAbstractMethod#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsAbstractMethod() {}
+
+ /*member: AbstractClass.declaredAbstractExtendsAbstractMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsAbstractMethod,
+ AbstractSuper.declaredAbstractExtendsAbstractMethod],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractMethod],
+ isSynthesized
+ */
+ void declaredAbstractExtendsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_extends_setter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_extends_setter.dart
new file mode 100644
index 0000000..dbbd9a1
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_extends_setter.dart
@@ -0,0 +1,116 @@
+// 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.
+
+/*class: AbstractSuper:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class AbstractSuper {
+ /*member: AbstractSuper.extendedConcreteSetter=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void set extendedConcreteSetter(int value) {}
+
+ /*member: AbstractSuper.extendedAbstractSetter=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void set extendedAbstractSetter(int value);
+
+ /*member: AbstractSuper.declaredConcreteExtendsConcreteSetter=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+ /*member: AbstractSuper.declaredAbstractExtendsConcreteSetter=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void set declaredAbstractExtendsConcreteSetter(int value) {}
+
+ /*member: AbstractSuper.declaredConcreteExtendsAbstractSetter=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsAbstractSetter(int value);
+
+ /*member: AbstractSuper.declaredAbstractExtendsAbstractSetter=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+ void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+/*class: AbstractClass:
+ maxInheritancePath=2,
+ superclasses=[
+ AbstractSuper,
+ Object]
+*/
+abstract class AbstractClass extends AbstractSuper {
+ /*member: AbstractClass.extendedConcreteSetter=#cls:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractSetter=#int:
+ classBuilder=AbstractSuper,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteSetter=#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void set declaredConcreteSetter(int value) {}
+
+ /*member: AbstractClass.declaredAbstractSetter=#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void set declaredAbstractSetter(int value);
+
+ /*member: AbstractClass.declaredConcreteExtendsConcreteSetter=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsConcreteSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+ /*member: AbstractClass.declaredAbstractExtendsConcreteSetter=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=AbstractSuper.declaredAbstractExtendsConcreteSetter=
+ */
+ /*member: AbstractClass.declaredAbstractExtendsConcreteSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsConcreteSetter=,
+ AbstractSuper.declaredAbstractExtendsConcreteSetter=],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsConcreteSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractExtendsConcreteSetter(int value);
+
+ /*member: AbstractClass.declaredConcreteExtendsAbstractSetter=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[AbstractSuper.declaredConcreteExtendsAbstractSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsAbstractSetter(int value) {}
+
+ /*member: AbstractClass.declaredAbstractExtendsAbstractSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractExtendsAbstractSetter=,
+ AbstractSuper.declaredAbstractExtendsAbstractSetter=],
+ declared-overrides=[AbstractSuper.declaredAbstractExtendsAbstractSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_field.dart
new file mode 100644
index 0000000..273a40d
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_field.dart
@@ -0,0 +1,192 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+ /*member: Interface.implementedConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.implementedConcreteField=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int implementedConcreteField = 0;
+
+ /*member: Interface.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.implementedAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract int implementedAbstractField;
+
+ /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredConcreteImplementsConcreteField=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredAbstractImplementsConcreteField=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int declaredAbstractImplementsConcreteField = 0;
+
+ /*member: Interface.declaredConcreteImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredConcreteImplementsAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract int declaredConcreteImplementsAbstractField;
+
+ /*member: Interface.declaredAbstractImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredAbstractImplementsAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractImplementsAbstractField;
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+ /*member: AbstractClass.implementedConcreteField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.implementedConcreteField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.implementedAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteField#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredConcreteField=#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ int declaredConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractField#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredAbstractField=#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractField;
+
+ /*member: AbstractClass.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsConcreteField,
+ Interface.declaredConcreteImplementsConcreteField=],
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredConcreteImplementsConcreteField=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsConcreteField,
+ Interface.declaredConcreteImplementsConcreteField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractImplementsConcreteField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField=],
+ isSynthesized
+ */
+ /*member: AbstractClass.declaredAbstractImplementsConcreteField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsConcreteField=,
+ Interface.declaredAbstractImplementsConcreteField=],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractImplementsConcreteField;
+
+ /*member: AbstractClass.declaredConcreteImplementsAbstractField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsAbstractField,
+ Interface.declaredConcreteImplementsAbstractField=],
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declaredConcreteImplementsAbstractField=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsAbstractField,
+ Interface.declaredConcreteImplementsAbstractField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteImplementsAbstractField = 0;
+
+ /*member: AbstractClass.declaredAbstractImplementsAbstractField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField=],
+ isSynthesized
+ */
+ /*member: AbstractClass.declaredAbstractImplementsAbstractField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsAbstractField=,
+ Interface.declaredAbstractImplementsAbstractField=],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_final_field.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_final_field.dart
new file mode 100644
index 0000000..cb20cef
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_final_field.dart
@@ -0,0 +1,110 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+ /*member: Interface.implementedConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int implementedConcreteField = 0;
+
+ /*member: Interface.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract final int implementedAbstractField;
+
+ /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int declaredAbstractImplementsConcreteField = 0;
+
+ /*member: Interface.declaredConcreteImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract final int declaredConcreteImplementsAbstractField;
+
+ /*member: Interface.declaredAbstractImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractImplementsAbstractField;
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+ /*member: AbstractClass.implementedConcreteField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteField#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ final int declaredConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractField#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractField;
+
+ /*member: AbstractClass.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: AbstractClass.declaredAbstractImplementsConcreteField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractImplementsConcreteField;
+
+ /*member: AbstractClass.declaredConcreteImplementsAbstractField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteImplementsAbstractField = 0;
+
+ /*member: AbstractClass.declaredAbstractImplementsAbstractField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_getter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_getter.dart
new file mode 100644
index 0000000..2c44f41
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_getter.dart
@@ -0,0 +1,110 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+ /*member: Interface.implementedConcreteGetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get implementedConcreteGetter => 0;
+
+ /*member: Interface.implementedAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get implementedAbstractGetter;
+
+ /*member: Interface.declaredConcreteImplementsConcreteGetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsConcreteGetter => 0;
+
+ /*member: Interface.declaredAbstractImplementsConcreteGetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredAbstractImplementsConcreteGetter => 0;
+
+ /*member: Interface.declaredConcreteImplementsAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsAbstractGetter;
+
+ /*member: Interface.declaredAbstractImplementsAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredAbstractImplementsAbstractGetter;
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+ /*member: AbstractClass.implementedConcreteGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.implementedAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteGetter#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ int get declaredConcreteGetter => 0;
+
+ /*member: AbstractClass.declaredAbstractGetter#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ int get declaredAbstractGetter;
+
+ /*member: AbstractClass.declaredConcreteImplementsConcreteGetter#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsConcreteGetter => 0;
+
+ /*member: AbstractClass.declaredAbstractImplementsConcreteGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsConcreteGetter,
+ Interface.declaredAbstractImplementsConcreteGetter],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteGetter],
+ isSynthesized
+ */
+ int get declaredAbstractImplementsConcreteGetter;
+
+ /*member: AbstractClass.declaredConcreteImplementsAbstractGetter#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsAbstractGetter => 0;
+
+ /*member: AbstractClass.declaredAbstractImplementsAbstractGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsAbstractGetter,
+ Interface.declaredAbstractImplementsAbstractGetter],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractGetter],
+ isSynthesized
+ */
+ int get declaredAbstractImplementsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_method.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_method.dart
new file mode 100644
index 0000000..3b9071e
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_method.dart
@@ -0,0 +1,108 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+ /*member: Interface.implementedConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void implementedConcreteMethod() {}
+
+ /*member: Interface.implementedAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void implementedAbstractMethod();
+
+ /*member: Interface.declaredConcreteImplementsConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsConcreteMethod() {}
+
+ /*member: Interface.declaredAbstractImplementsConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredAbstractImplementsConcreteMethod() {}
+
+ /*member: Interface.declaredConcreteImplementsAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsAbstractMethod();
+
+ /*member: Interface.declaredAbstractImplementsAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredAbstractImplementsAbstractMethod();
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+ /*member: AbstractClass.implementedConcreteMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.implementedAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void declaredConcreteMethod() {}
+
+ /*member: AbstractClass.declaredAbstractMethod#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void declaredAbstractMethod();
+
+ /*member: AbstractClass.declaredConcreteImplementsConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsConcreteMethod() {}
+
+ /*member: AbstractClass.declaredAbstractImplementsConcreteMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsConcreteMethod,
+ Interface.declaredAbstractImplementsConcreteMethod],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteMethod],
+ isSynthesized
+ */
+ void declaredAbstractImplementsConcreteMethod();
+
+ /*member: AbstractClass.declaredConcreteImplementsAbstractMethod#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsAbstractMethod() {}
+
+ /*member: AbstractClass.declaredAbstractImplementsAbstractMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsAbstractMethod,
+ Interface.declaredAbstractImplementsAbstractMethod],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractMethod],
+ isSynthesized
+ */
+ void declaredAbstractImplementsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/abstract_implements_setter.dart b/pkg/front_end/test/class_hierarchy/data/abstract_implements_setter.dart
new file mode 100644
index 0000000..601fb9d
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/abstract_implements_setter.dart
@@ -0,0 +1,110 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+ /*member: Interface.implementedConcreteSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set implementedConcreteSetter(int value) {}
+
+ /*member: Interface.implementedAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set implementedAbstractSetter(int value);
+
+ /*member: Interface.declaredConcreteImplementsConcreteSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+ /*member: Interface.declaredAbstractImplementsConcreteSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredAbstractImplementsConcreteSetter(int value) {}
+
+ /*member: Interface.declaredConcreteImplementsAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsAbstractSetter(int value);
+
+ /*member: Interface.declaredAbstractImplementsAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+/*class: AbstractClass:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface {
+ /*member: AbstractClass.implementedConcreteSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.implementedAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.declaredConcreteSetter=#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void set declaredConcreteSetter(int value) {}
+
+ /*member: AbstractClass.declaredAbstractSetter=#int:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ void set declaredAbstractSetter(int value);
+
+ /*member: AbstractClass.declaredConcreteImplementsConcreteSetter=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+ /*member: AbstractClass.declaredAbstractImplementsConcreteSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsConcreteSetter=,
+ Interface.declaredAbstractImplementsConcreteSetter=],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractImplementsConcreteSetter(int value);
+
+ /*member: AbstractClass.declaredConcreteImplementsAbstractSetter=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsAbstractSetter(int value) {}
+
+ /*member: AbstractClass.declaredAbstractImplementsAbstractSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declaredAbstractImplementsAbstractSetter=,
+ Interface.declaredAbstractImplementsAbstractSetter=],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_field.dart
new file mode 100644
index 0000000..549ab8d
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_field.dart
@@ -0,0 +1,219 @@
+// 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.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+ ConcreteSuper.declaredAbstractExtendsAbstractField,
+ ConcreteSuper.declaredAbstractExtendsAbstractField=,
+ ConcreteSuper.declaredConcreteExtendsAbstractField,
+ ConcreteSuper.declaredConcreteExtendsAbstractField=,
+ ConcreteSuper.extendedAbstractField,
+ ConcreteSuper.extendedAbstractField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+ /*member: ConcreteSuper.extendedConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSuper.extendedConcreteField=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int extendedConcreteField = 0;
+
+ /*member: ConcreteSuper.extendedAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSuper.extendedAbstractField=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractField;
+
+ /*member: ConcreteSuper.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSuper.declaredConcreteExtendsConcreteField=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: ConcreteSuper.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSuper.declaredAbstractExtendsConcreteField=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int declaredAbstractExtendsConcreteField = 0;
+
+ /*member: ConcreteSuper.declaredConcreteExtendsAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSuper.declaredConcreteExtendsAbstractField=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ abstract int declaredConcreteExtendsAbstractField;
+
+ /*member: ConcreteSuper.declaredAbstractExtendsAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSuper.declaredAbstractExtendsAbstractField=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractExtendsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractExtendsAbstractField,
+ ConcreteClass.declaredAbstractExtendsAbstractField=,
+ ConcreteClass.declaredAbstractField,
+ ConcreteClass.declaredAbstractField=,
+ ConcreteSuper.extendedAbstractField,
+ ConcreteSuper.extendedAbstractField=],
+ maxInheritancePath=2,
+ superclasses=[
+ ConcreteSuper,
+ Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+ /*member: ConcreteClass.extendedConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.extendedConcreteField=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.extendedAbstractField=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteField#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredConcreteField=#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ int declaredConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractField#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredAbstractField=#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractField;
+
+ /*member: ConcreteClass.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ ConcreteSuper.declaredConcreteExtendsConcreteField,
+ ConcreteSuper.declaredConcreteExtendsConcreteField=],
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredConcreteExtendsConcreteField=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ ConcreteSuper.declaredConcreteExtendsConcreteField,
+ ConcreteSuper.declaredConcreteExtendsConcreteField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteField],
+ isSynthesized,
+ member=ConcreteSuper.declaredAbstractExtendsConcreteField
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsConcreteField,
+ ConcreteSuper.declaredAbstractExtendsConcreteField],
+ declared-overrides=[
+ ConcreteSuper.declaredAbstractExtendsConcreteField,
+ ConcreteSuper.declaredAbstractExtendsConcreteField=],
+ isSynthesized
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteField=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteField=],
+ isSynthesized,
+ member=ConcreteSuper.declaredAbstractExtendsConcreteField
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsConcreteField=,
+ ConcreteSuper.declaredAbstractExtendsConcreteField=],
+ declared-overrides=[
+ ConcreteSuper.declaredAbstractExtendsConcreteField,
+ ConcreteSuper.declaredAbstractExtendsConcreteField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractExtendsConcreteField;
+
+ /*member: ConcreteClass.declaredConcreteExtendsAbstractField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ ConcreteSuper.declaredConcreteExtendsAbstractField,
+ ConcreteSuper.declaredConcreteExtendsAbstractField=],
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredConcreteExtendsAbstractField=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ ConcreteSuper.declaredConcreteExtendsAbstractField,
+ ConcreteSuper.declaredConcreteExtendsAbstractField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteExtendsAbstractField = 0;
+
+ /*member: ConcreteClass.declaredAbstractExtendsAbstractField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsAbstractField,
+ ConcreteSuper.declaredAbstractExtendsAbstractField],
+ declared-overrides=[
+ ConcreteSuper.declaredAbstractExtendsAbstractField,
+ ConcreteSuper.declaredAbstractExtendsAbstractField=],
+ isSynthesized
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsAbstractField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsAbstractField=,
+ ConcreteSuper.declaredAbstractExtendsAbstractField=],
+ declared-overrides=[
+ ConcreteSuper.declaredAbstractExtendsAbstractField,
+ ConcreteSuper.declaredAbstractExtendsAbstractField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractExtendsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_final_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_final_field.dart
new file mode 100644
index 0000000..10334b2
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_final_field.dart
@@ -0,0 +1,125 @@
+// 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.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+ ConcreteSuper.declaredAbstractExtendsAbstractField,
+ ConcreteSuper.declaredConcreteExtendsAbstractField,
+ ConcreteSuper.extendedAbstractField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+ /*member: ConcreteSuper.extendedConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ final int extendedConcreteField = 0;
+
+ /*member: ConcreteSuper.extendedAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractField;
+
+ /*member: ConcreteSuper.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ final int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: ConcreteSuper.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ final int declaredAbstractExtendsConcreteField = 0;
+
+ /*member: ConcreteSuper.declaredConcreteExtendsAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ abstract final int declaredConcreteExtendsAbstractField;
+
+ /*member: ConcreteSuper.declaredAbstractExtendsAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractExtendsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractExtendsAbstractField,
+ ConcreteClass.declaredAbstractField,
+ ConcreteSuper.extendedAbstractField],
+ maxInheritancePath=2,
+ superclasses=[
+ ConcreteSuper,
+ Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+ /*member: ConcreteClass.extendedConcreteField#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractField#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteField#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ final int declaredConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractField#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractField;
+
+ /*member: ConcreteClass.declaredConcreteExtendsConcreteField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteExtendsConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteField],
+ isSynthesized,
+ member=ConcreteSuper.declaredAbstractExtendsConcreteField
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsConcreteField,
+ ConcreteSuper.declaredAbstractExtendsConcreteField],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractExtendsConcreteField;
+
+ /*member: ConcreteClass.declaredConcreteExtendsAbstractField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteExtendsAbstractField = 0;
+
+ /*member: ConcreteClass.declaredAbstractExtendsAbstractField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsAbstractField,
+ ConcreteSuper.declaredAbstractExtendsAbstractField],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractExtendsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_getter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_getter.dart
new file mode 100644
index 0000000..8bf90fe
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_getter.dart
@@ -0,0 +1,125 @@
+// 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.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+ ConcreteSuper.declaredAbstractExtendsAbstractGetter,
+ ConcreteSuper.declaredConcreteExtendsAbstractGetter,
+ ConcreteSuper.extendedAbstractGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+ /*member: ConcreteSuper.extendedConcreteGetter#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int get extendedConcreteGetter => 0;
+
+ /*member: ConcreteSuper.extendedAbstractGetter#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int get extendedAbstractGetter;
+
+ /*member: ConcreteSuper.declaredConcreteExtendsConcreteGetter#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsConcreteGetter => 0;
+
+ /*member: ConcreteSuper.declaredAbstractExtendsConcreteGetter#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int get declaredAbstractExtendsConcreteGetter => 0;
+
+ /*member: ConcreteSuper.declaredConcreteExtendsAbstractGetter#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsAbstractGetter;
+
+ /*member: ConcreteSuper.declaredAbstractExtendsAbstractGetter#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ int get declaredAbstractExtendsAbstractGetter;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractExtendsAbstractGetter,
+ ConcreteClass.declaredAbstractGetter,
+ ConcreteSuper.extendedAbstractGetter],
+ maxInheritancePath=2,
+ superclasses=[
+ ConcreteSuper,
+ Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+ /*member: ConcreteClass.extendedConcreteGetter#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractGetter#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteGetter#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ int get declaredConcreteGetter => 0;
+
+ /*member: ConcreteClass.declaredAbstractGetter#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ int get declaredAbstractGetter;
+
+ /*member: ConcreteClass.declaredConcreteExtendsConcreteGetter#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsConcreteGetter => 0;
+
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteGetter#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteGetter],
+ isSynthesized,
+ member=ConcreteSuper.declaredAbstractExtendsConcreteGetter
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsConcreteGetter,
+ ConcreteSuper.declaredAbstractExtendsConcreteGetter],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteGetter],
+ isSynthesized
+ */
+ int get declaredAbstractExtendsConcreteGetter;
+
+ /*member: ConcreteClass.declaredConcreteExtendsAbstractGetter#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteExtendsAbstractGetter => 0;
+
+ /*member: ConcreteClass.declaredAbstractExtendsAbstractGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsAbstractGetter,
+ ConcreteSuper.declaredAbstractExtendsAbstractGetter],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractGetter],
+ isSynthesized
+ */
+ int get declaredAbstractExtendsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_method.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_method.dart
new file mode 100644
index 0000000..d35a461
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_method.dart
@@ -0,0 +1,123 @@
+// 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.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+ ConcreteSuper.declaredAbstractExtendsAbstractMethod,
+ ConcreteSuper.declaredConcreteExtendsAbstractMethod,
+ ConcreteSuper.extendedAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+ /*member: ConcreteSuper.extendedConcreteMethod#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void extendedConcreteMethod() {}
+
+ /*member: ConcreteSuper.extendedAbstractMethod#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void extendedAbstractMethod();
+
+ /*member: ConcreteSuper.declaredConcreteExtendsConcreteMethod#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsConcreteMethod() {}
+
+ /*member: ConcreteSuper.declaredAbstractExtendsConcreteMethod#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void declaredAbstractExtendsConcreteMethod() {}
+
+ /*member: ConcreteSuper.declaredConcreteExtendsAbstractMethod#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsAbstractMethod();
+
+ /*member: ConcreteSuper.declaredAbstractExtendsAbstractMethod#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void declaredAbstractExtendsAbstractMethod();
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractExtendsAbstractMethod,
+ ConcreteClass.declaredAbstractMethod,
+ ConcreteSuper.extendedAbstractMethod],
+ maxInheritancePath=2,
+ superclasses=[
+ ConcreteSuper,
+ Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+ /*member: ConcreteClass.extendedConcreteMethod#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractMethod#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteMethod#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void declaredConcreteMethod() {}
+
+ /*member: ConcreteClass.declaredAbstractMethod#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void declaredAbstractMethod();
+
+ /*member: ConcreteClass.declaredConcreteExtendsConcreteMethod#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsConcreteMethod() {}
+
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteMethod#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteMethod],
+ isSynthesized,
+ member=ConcreteSuper.declaredAbstractExtendsConcreteMethod
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsConcreteMethod,
+ ConcreteSuper.declaredAbstractExtendsConcreteMethod],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteMethod],
+ isSynthesized
+ */
+ void declaredAbstractExtendsConcreteMethod();
+
+ /*member: ConcreteClass.declaredConcreteExtendsAbstractMethod#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteExtendsAbstractMethod() {}
+
+ /*member: ConcreteClass.declaredAbstractExtendsAbstractMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsAbstractMethod,
+ ConcreteSuper.declaredAbstractExtendsAbstractMethod],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractMethod],
+ isSynthesized
+ */
+ void declaredAbstractExtendsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_extends_setter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_extends_setter.dart
new file mode 100644
index 0000000..35a7340
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_extends_setter.dart
@@ -0,0 +1,125 @@
+// 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.
+
+/*class: ConcreteSuper:
+ abstractMembers=[
+ ConcreteSuper.declaredAbstractExtendsAbstractSetter=,
+ ConcreteSuper.declaredConcreteExtendsAbstractSetter=,
+ ConcreteSuper.extendedAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class ConcreteSuper {
+ /*member: ConcreteSuper.extendedConcreteSetter=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void set extendedConcreteSetter(int value) {}
+
+ /*member: ConcreteSuper.extendedAbstractSetter=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void set extendedAbstractSetter(int value);
+
+ /*member: ConcreteSuper.declaredConcreteExtendsConcreteSetter=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+ /*member: ConcreteSuper.declaredAbstractExtendsConcreteSetter=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void set declaredAbstractExtendsConcreteSetter(int value) {}
+
+ /*member: ConcreteSuper.declaredConcreteExtendsAbstractSetter=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsAbstractSetter(int value);
+
+ /*member: ConcreteSuper.declaredAbstractExtendsAbstractSetter=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+ void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractExtendsAbstractSetter=,
+ ConcreteClass.declaredAbstractSetter=,
+ ConcreteSuper.extendedAbstractSetter=],
+ maxInheritancePath=2,
+ superclasses=[
+ ConcreteSuper,
+ Object]
+*/
+class ConcreteClass extends ConcreteSuper {
+ /*member: ConcreteClass.extendedConcreteSetter=#cls:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractSetter=#int:
+ classBuilder=ConcreteSuper,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteSetter=#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void set declaredConcreteSetter(int value) {}
+
+ /*member: ConcreteClass.declaredAbstractSetter=#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void set declaredAbstractSetter(int value);
+
+ /*member: ConcreteClass.declaredConcreteExtendsConcreteSetter=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsConcreteSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsConcreteSetter(int value) {}
+
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteSetter=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.declaredAbstractExtendsConcreteSetter=],
+ isSynthesized,
+ member=ConcreteSuper.declaredAbstractExtendsConcreteSetter=
+ */
+ /*member: ConcreteClass.declaredAbstractExtendsConcreteSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsConcreteSetter=,
+ ConcreteSuper.declaredAbstractExtendsConcreteSetter=],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsConcreteSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractExtendsConcreteSetter(int value);
+
+ /*member: ConcreteClass.declaredConcreteExtendsAbstractSetter=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[ConcreteSuper.declaredConcreteExtendsAbstractSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteExtendsAbstractSetter(int value) {}
+
+ /*member: ConcreteClass.declaredAbstractExtendsAbstractSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractExtendsAbstractSetter=,
+ ConcreteSuper.declaredAbstractExtendsAbstractSetter=],
+ declared-overrides=[ConcreteSuper.declaredAbstractExtendsAbstractSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractExtendsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_field.dart
new file mode 100644
index 0000000..dabaa18
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_field.dart
@@ -0,0 +1,210 @@
+// 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.
+
+/*class: Interface:
+ abstractMembers=[
+ Interface.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField=,
+ Interface.declaredConcreteImplementsAbstractField,
+ Interface.declaredConcreteImplementsAbstractField=,
+ Interface.implementedAbstractField,
+ Interface.implementedAbstractField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.implementedConcreteField=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int implementedConcreteField = 0;
+
+ /*member: Interface.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.implementedAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract int implementedAbstractField;
+
+ /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredConcreteImplementsConcreteField=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredAbstractImplementsConcreteField=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int declaredAbstractImplementsConcreteField = 0;
+
+ /*member: Interface.declaredConcreteImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredConcreteImplementsAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract int declaredConcreteImplementsAbstractField;
+
+ /*member: Interface.declaredAbstractImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.declaredAbstractImplementsAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractImplementsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractField,
+ ConcreteClass.declaredAbstractField=,
+ ConcreteClass.declaredAbstractImplementsAbstractField,
+ ConcreteClass.declaredAbstractImplementsAbstractField=,
+ ConcreteClass.declaredAbstractImplementsConcreteField,
+ ConcreteClass.declaredAbstractImplementsConcreteField=,
+ Interface.implementedAbstractField,
+ Interface.implementedAbstractField=,
+ Interface.implementedConcreteField,
+ Interface.implementedConcreteField=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+ /*member: ConcreteClass.implementedConcreteField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.implementedConcreteField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.implementedAbstractField=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteField#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredConcreteField=#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ int declaredConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractField#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredAbstractField=#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ abstract int declaredAbstractField;
+
+ /*member: ConcreteClass.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsConcreteField,
+ Interface.declaredConcreteImplementsConcreteField=],
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredConcreteImplementsConcreteField=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsConcreteField,
+ Interface.declaredConcreteImplementsConcreteField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractImplementsConcreteField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField=],
+ isSynthesized
+ */
+ /*member: ConcreteClass.declaredAbstractImplementsConcreteField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsConcreteField=,
+ Interface.declaredAbstractImplementsConcreteField=],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractImplementsConcreteField;
+
+ /*member: ConcreteClass.declaredConcreteImplementsAbstractField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsAbstractField,
+ Interface.declaredConcreteImplementsAbstractField=],
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declaredConcreteImplementsAbstractField=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface.declaredConcreteImplementsAbstractField,
+ Interface.declaredConcreteImplementsAbstractField=],
+ isSourceDeclaration
+ */
+ int declaredConcreteImplementsAbstractField = 0;
+
+ /*member: ConcreteClass.declaredAbstractImplementsAbstractField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField=],
+ isSynthesized
+ */
+ /*member: ConcreteClass.declaredAbstractImplementsAbstractField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsAbstractField=,
+ Interface.declaredAbstractImplementsAbstractField=],
+ declared-overrides=[
+ Interface.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField=],
+ isSynthesized
+ */
+ abstract int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_final_field.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_final_field.dart
new file mode 100644
index 0000000..20a42b0
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_final_field.dart
@@ -0,0 +1,120 @@
+// 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.
+
+/*class: Interface:
+ abstractMembers=[
+ Interface.declaredAbstractImplementsAbstractField,
+ Interface.declaredConcreteImplementsAbstractField,
+ Interface.implementedAbstractField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int implementedConcreteField = 0;
+
+ /*member: Interface.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract final int implementedAbstractField;
+
+ /*member: Interface.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: Interface.declaredAbstractImplementsConcreteField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int declaredAbstractImplementsConcreteField = 0;
+
+ /*member: Interface.declaredConcreteImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract final int declaredConcreteImplementsAbstractField;
+
+ /*member: Interface.declaredAbstractImplementsAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractImplementsAbstractField;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractField,
+ ConcreteClass.declaredAbstractImplementsAbstractField,
+ ConcreteClass.declaredAbstractImplementsConcreteField,
+ Interface.implementedAbstractField,
+ Interface.implementedConcreteField],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+ /*member: ConcreteClass.implementedConcreteField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.implementedAbstractField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteField#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ final int declaredConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractField#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ abstract final int declaredAbstractField;
+
+ /*member: ConcreteClass.declaredConcreteImplementsConcreteField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteImplementsConcreteField = 0;
+
+ /*member: ConcreteClass.declaredAbstractImplementsConcreteField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsConcreteField,
+ Interface.declaredAbstractImplementsConcreteField],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractImplementsConcreteField;
+
+ /*member: ConcreteClass.declaredConcreteImplementsAbstractField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractField],
+ isSourceDeclaration
+ */
+ final int declaredConcreteImplementsAbstractField = 0;
+
+ /*member: ConcreteClass.declaredAbstractImplementsAbstractField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsAbstractField,
+ Interface.declaredAbstractImplementsAbstractField],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractField],
+ isSynthesized
+ */
+ abstract final int declaredAbstractImplementsAbstractField;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_getter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_getter.dart
new file mode 100644
index 0000000..80dbb0a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_getter.dart
@@ -0,0 +1,118 @@
+// 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.
+
+/*class: Interface:
+ abstractMembers=[
+ Interface.declaredAbstractImplementsAbstractGetter,
+ Interface.declaredConcreteImplementsAbstractGetter,
+ Interface.implementedAbstractGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedConcreteGetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get implementedConcreteGetter => 0;
+
+ /*member: Interface.implementedAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get implementedAbstractGetter;
+
+ /*member: Interface.declaredConcreteImplementsConcreteGetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsConcreteGetter => 0;
+
+ /*member: Interface.declaredAbstractImplementsConcreteGetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredAbstractImplementsConcreteGetter => 0;
+
+ /*member: Interface.declaredConcreteImplementsAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsAbstractGetter;
+
+ /*member: Interface.declaredAbstractImplementsAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get declaredAbstractImplementsAbstractGetter;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractGetter,
+ ConcreteClass.declaredAbstractImplementsAbstractGetter,
+ ConcreteClass.declaredAbstractImplementsConcreteGetter,
+ Interface.implementedAbstractGetter,
+ Interface.implementedConcreteGetter],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+/*member: ConcreteClass.implementedConcreteGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+*/
+/*member: ConcreteClass.implementedAbstractGetter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+*/
+class ConcreteClass implements Interface {
+ /*member: ConcreteClass.declaredConcreteGetter#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ int get declaredConcreteGetter => 0;
+
+ /*member: ConcreteClass.declaredAbstractGetter#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ int get declaredAbstractGetter;
+
+ /*member: ConcreteClass.declaredConcreteImplementsConcreteGetter#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsConcreteGetter => 0;
+
+ /*member: ConcreteClass.declaredAbstractImplementsConcreteGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsConcreteGetter,
+ Interface.declaredAbstractImplementsConcreteGetter],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteGetter],
+ isSynthesized
+ */
+ int get declaredAbstractImplementsConcreteGetter;
+
+ /*member: ConcreteClass.declaredConcreteImplementsAbstractGetter#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractGetter],
+ isSourceDeclaration
+ */
+ int get declaredConcreteImplementsAbstractGetter => 0;
+
+ /*member: ConcreteClass.declaredAbstractImplementsAbstractGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsAbstractGetter,
+ Interface.declaredAbstractImplementsAbstractGetter],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractGetter],
+ isSynthesized
+ */
+ int get declaredAbstractImplementsAbstractGetter;
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_method.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_method.dart
new file mode 100644
index 0000000..a040731
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_method.dart
@@ -0,0 +1,118 @@
+// 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.
+
+/*class: Interface:
+ abstractMembers=[
+ Interface.declaredAbstractImplementsAbstractMethod,
+ Interface.declaredConcreteImplementsAbstractMethod,
+ Interface.implementedAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void implementedConcreteMethod() {}
+
+ /*member: Interface.implementedAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void implementedAbstractMethod();
+
+ /*member: Interface.declaredConcreteImplementsConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsConcreteMethod() {}
+
+ /*member: Interface.declaredAbstractImplementsConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredAbstractImplementsConcreteMethod() {}
+
+ /*member: Interface.declaredConcreteImplementsAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsAbstractMethod();
+
+ /*member: Interface.declaredAbstractImplementsAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void declaredAbstractImplementsAbstractMethod();
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractImplementsAbstractMethod,
+ ConcreteClass.declaredAbstractImplementsConcreteMethod,
+ ConcreteClass.declaredAbstractMethod,
+ Interface.implementedAbstractMethod,
+ Interface.implementedConcreteMethod],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+ /*member: ConcreteClass.implementedConcreteMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.implementedAbstractMethod#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteMethod#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void declaredConcreteMethod() {}
+
+ /*member: ConcreteClass.declaredAbstractMethod#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void declaredAbstractMethod();
+
+ /*member: ConcreteClass.declaredConcreteImplementsConcreteMethod#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsConcreteMethod() {}
+
+ /*member: ConcreteClass.declaredAbstractImplementsConcreteMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsConcreteMethod,
+ Interface.declaredAbstractImplementsConcreteMethod],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteMethod],
+ isSynthesized
+ */
+ void declaredAbstractImplementsConcreteMethod();
+
+ /*member: ConcreteClass.declaredConcreteImplementsAbstractMethod#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractMethod],
+ isSourceDeclaration
+ */
+ void declaredConcreteImplementsAbstractMethod() {}
+
+ /*member: ConcreteClass.declaredAbstractImplementsAbstractMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsAbstractMethod,
+ Interface.declaredAbstractImplementsAbstractMethod],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractMethod],
+ isSynthesized
+ */
+ void declaredAbstractImplementsAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/concrete_implements_setter.dart b/pkg/front_end/test/class_hierarchy/data/concrete_implements_setter.dart
new file mode 100644
index 0000000..92279c3
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/concrete_implements_setter.dart
@@ -0,0 +1,120 @@
+// 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.
+
+/*class: Interface:
+ abstractMembers=[
+ Interface.declaredAbstractImplementsAbstractSetter=,
+ Interface.declaredConcreteImplementsAbstractSetter=,
+ Interface.implementedAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedConcreteSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set implementedConcreteSetter(int value) {}
+
+ /*member: Interface.implementedAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set implementedAbstractSetter(int value);
+
+ /*member: Interface.declaredConcreteImplementsConcreteSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+ /*member: Interface.declaredAbstractImplementsConcreteSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredAbstractImplementsConcreteSetter(int value) {}
+
+ /*member: Interface.declaredConcreteImplementsAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsAbstractSetter(int value);
+
+ /*member: Interface.declaredAbstractImplementsAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declaredAbstractImplementsAbstractSetter=,
+ ConcreteClass.declaredAbstractImplementsConcreteSetter=,
+ ConcreteClass.declaredAbstractSetter=,
+ Interface.implementedAbstractSetter=,
+ Interface.implementedConcreteSetter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface {
+ /*member: ConcreteClass.implementedConcreteSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.implementedAbstractSetter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.declaredConcreteSetter=#cls:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void set declaredConcreteSetter(int value) {}
+
+ /*member: ConcreteClass.declaredAbstractSetter=#int:
+ classBuilder=ConcreteClass,
+ isSourceDeclaration
+ */
+ void set declaredAbstractSetter(int value);
+
+ /*member: ConcreteClass.declaredConcreteImplementsConcreteSetter=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsConcreteSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsConcreteSetter(int value) {}
+
+ /*member: ConcreteClass.declaredAbstractImplementsConcreteSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsConcreteSetter=,
+ Interface.declaredAbstractImplementsConcreteSetter=],
+ declared-overrides=[Interface.declaredAbstractImplementsConcreteSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractImplementsConcreteSetter(int value);
+
+ /*member: ConcreteClass.declaredConcreteImplementsAbstractSetter=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[Interface.declaredConcreteImplementsAbstractSetter=],
+ isSourceDeclaration
+ */
+ void set declaredConcreteImplementsAbstractSetter(int value) {}
+
+ /*member: ConcreteClass.declaredAbstractImplementsAbstractSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declaredAbstractImplementsAbstractSetter=,
+ Interface.declaredAbstractImplementsAbstractSetter=],
+ declared-overrides=[Interface.declaredAbstractImplementsAbstractSetter=],
+ isSynthesized
+ */
+ void set declaredAbstractImplementsAbstractSetter(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/conflict.dart b/pkg/front_end/test/class_hierarchy/data/conflict.dart
new file mode 100644
index 0000000..10003cd
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/conflict.dart
@@ -0,0 +1,37 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedFieldDeclaredMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedFieldDeclaredMethod=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedFieldDeclaredMethod = 0;
+}
+
+/*class: Class:
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+/*member: Class.extendedFieldDeclaredMethod=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class Class extends Super {
+ /*member: Class.extendedFieldDeclaredMethod#cls:
+ classBuilder=Class,
+ isSourceDeclaration
+ */
+ void extendedFieldDeclaredMethod() {}
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/covariance.dart b/pkg/front_end/test/class_hierarchy/data/covariance.dart
new file mode 100644
index 0000000..e65d4ea
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/covariance.dart
@@ -0,0 +1,438 @@
+// 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.
+
+// From language/covariant_override/tear_off_type_test
+
+// If a parameter is directly or indirectly a covariant override, its type in
+// the method tear-off should become Object?.
+
+/*class: M1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class M1 {
+ /*member: M1.method#cls:
+ classBuilder=M1,
+ isSourceDeclaration
+ */
+ method(covariant int a, int b) {}
+}
+
+/*class: M2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class M2 {
+ /*member: M2.method#cls:
+ classBuilder=M2,
+ isSourceDeclaration
+ */
+ method(int a, covariant int b) {}
+}
+
+/*class: _C&Object&M1:
+ interfaces=[M1],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+/*member: _C&Object&M1.method#cls:
+ classBuilder=_C&Object&M1,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=M1.method
+*/
+/*member: _C&Object&M1.method#int:
+ classBuilder=_C&Object&M1,
+ concreteMixinStub,
+ declarations=[M1.method],
+ isSynthesized,
+ stubTarget=M1.method
+*/
+
+/*class: _C&Object&M1&M2:
+ interfaces=[
+ M1,
+ M2],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ _C&Object&M1]
+*/
+
+/*member: _C&Object&M1&M2.method#cls:
+ classBuilder=_C&Object&M1&M2,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant,1:Covariant),
+ isSynthesized,
+ stubTarget=M2.method,
+ type=dynamic Function(int, int)
+*/
+/*member: _C&Object&M1&M2.method#int:
+ classBuilder=_C&Object&M1&M2,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant,1:Covariant),
+ declarations=[
+ M2.method,
+ _C&Object&M1.method],
+ isSynthesized,
+ stubTarget=M2.method,
+ type=dynamic Function(int, int)
+*/
+
+/*class: C:
+ interfaces=[
+ M1,
+ M2],
+ maxInheritancePath=4,
+ superclasses=[
+ Object,
+ _C&Object&M1,
+ _C&Object&M1&M2]
+*/
+class C extends Object with M1, M2 {
+ /*member: C.method#cls:
+ classBuilder=C,
+ inherited-implements=[_C&Object&M1&M2.method],
+ isSynthesized,
+ member=_C&Object&M1&M2.method
+ */
+ /*member: C.method#int:
+ classBuilder=_C&Object&M1&M2,
+ declarations=[
+ M2.method,
+ _C&Object&M1.method],
+ isSynthesized,
+ member=_C&Object&M1&M2.method
+ */
+}
+
+/*class: Direct:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Direct {
+ /*member: Direct.positional#cls:
+ classBuilder=Direct,
+ isSourceDeclaration
+ */
+ void positional(covariant int a, int b, covariant int c, int d, int e) {}
+
+ /*member: Direct.optional#cls:
+ classBuilder=Direct,
+ isSourceDeclaration
+ */
+ void optional(
+ [covariant int a = 0, int b = 0, covariant int c = 0, int d = 0]) {}
+
+ /*member: Direct.named#cls:
+ classBuilder=Direct,
+ isSourceDeclaration
+ */
+ void named(
+ {covariant int a = 0, int b = 0, covariant int c = 0, int d = 0}) {}
+}
+
+/*class: Inherited:
+ maxInheritancePath=2,
+ superclasses=[
+ Direct,
+ Object]
+*/
+class Inherited extends Direct {
+ /*member: Inherited.positional#cls:
+ classBuilder=Direct,
+ isSourceDeclaration
+ */
+
+ /*member: Inherited.optional#cls:
+ classBuilder=Direct,
+ isSourceDeclaration
+ */
+
+ /*member: Inherited.named#cls:
+ classBuilder=Direct,
+ isSourceDeclaration
+ */
+}
+
+// ---
+
+/*class: Override1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Override1 {
+ /*member: Override1.method#cls:
+ classBuilder=Override1,
+ isSourceDeclaration
+ */
+ void method(covariant int a, int b, int c, int d, int e) {}
+}
+
+/*class: Override2:
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Override1]
+*/
+class Override2 extends Override1 {
+ /*member: Override2.method#cls:
+ classBuilder=Override2,
+ declared-overrides=[Override1.method],
+ isSourceDeclaration
+ */
+ void method(int a, int b, covariant int c, int d, int e) {}
+}
+
+/*class: Override3:
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Override1,
+ Override2]
+*/
+class Override3 extends Override2 {
+ /*member: Override3.method#cls:
+ classBuilder=Override3,
+ declared-overrides=[Override2.method],
+ isSourceDeclaration
+ */
+ void method(int a, int b, int c, int d, int e) {}
+}
+
+// ---
+
+/*class: Implement1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Implement1 {
+ /*member: Implement1.method#cls:
+ classBuilder=Implement1,
+ isSourceDeclaration
+ */
+ void method(covariant int a, int b, int c, int d, int e) {}
+}
+
+/*class: Implement2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Implement2 {
+ /*member: Implement2.method#cls:
+ classBuilder=Implement2,
+ isSourceDeclaration
+ */
+ void method(int a, covariant int b, int c, int d, int e) {}
+}
+
+/*class: Implement3:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Implement3 {
+ /*member: Implement3.method#cls:
+ classBuilder=Implement3,
+ isSourceDeclaration
+ */
+ void method(int a, int b, covariant int c, int d, int e) {}
+}
+
+/*class: Implement4:
+ interfaces=[Implement3],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class Implement4 implements Implement3 {
+ /*member: Implement4.method#cls:
+ classBuilder=Implement4,
+ declared-overrides=[Implement3.method],
+ isSourceDeclaration
+ */
+ void method(int a, int b, int c, covariant int d, int e) {}
+}
+
+/*class: Implement5:
+ interfaces=[
+ Implement1,
+ Implement2,
+ Implement3,
+ Implement4],
+ maxInheritancePath=3,
+ superclasses=[Object]
+*/
+class Implement5 implements Implement1, Implement2, Implement4 {
+ /*member: Implement5.method#cls:
+ classBuilder=Implement5,
+ declared-overrides=[
+ Implement1.method,
+ Implement2.method,
+ Implement4.method],
+ isSourceDeclaration
+ */
+ void method(int a, int b, int c, int d, covariant int e) {}
+}
+
+// ---
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.method#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void method(covariant int a, int b, int c, int d, int e) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.method#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void method(int a, covariant int b, int c, int d, int e) {}
+}
+
+/*class: Mixin1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin1 {
+ /*member: Mixin1.method#cls:
+ classBuilder=Mixin1,
+ isSourceDeclaration
+ */
+ void method(int a, int b, covariant int c, int d, int e) {}
+}
+
+/*class: Mixin2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin2 {
+ /*member: Mixin2.method#cls:
+ classBuilder=Mixin2,
+ isSourceDeclaration
+ */
+ void method(int a, int b, int c, covariant int d, int e) {}
+}
+
+/*class: Superclass:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Superclass {
+ /*member: Superclass.method#cls:
+ classBuilder=Superclass,
+ isSourceDeclaration
+ */
+ void method(int a, int b, int c, int d, covariant int e) {}
+}
+
+/*class: _Mixed&Superclass&Mixin1:
+ interfaces=[Mixin1],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Superclass]
+*/
+
+/*member: _Mixed&Superclass&Mixin1.method#cls:
+ classBuilder=_Mixed&Superclass&Mixin1,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,4:Covariant),
+ isSynthesized,
+ stubTarget=Mixin1.method,
+ type=void Function(int, int, int, int, int)
+*/
+/*member: _Mixed&Superclass&Mixin1.method#int:
+ classBuilder=_Mixed&Superclass&Mixin1,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,4:Covariant),
+ declarations=[
+ Mixin1.method,
+ Superclass.method],
+ isSynthesized,
+ stubTarget=Mixin1.method,
+ type=void Function(int, int, int, int, int)
+*/
+
+/*class: _Mixed&Superclass&Mixin1&Mixin2:
+ interfaces=[
+ Mixin1,
+ Mixin2],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Superclass,
+ _Mixed&Superclass&Mixin1]
+*/
+
+/*member: _Mixed&Superclass&Mixin1&Mixin2.method#cls:
+ classBuilder=_Mixed&Superclass&Mixin1&Mixin2,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,3:Covariant,4:Covariant),
+ isSynthesized,
+ stubTarget=Mixin2.method,
+ type=void Function(int, int, int, int, int)
+*/
+/*member: _Mixed&Superclass&Mixin1&Mixin2.method#int:
+ classBuilder=_Mixed&Superclass&Mixin1&Mixin2,
+ concreteForwardingStub,
+ covariance=Covariance(2:Covariant,3:Covariant,4:Covariant),
+ declarations=[
+ Mixin2.method,
+ _Mixed&Superclass&Mixin1.method],
+ isSynthesized,
+ stubTarget=Mixin2.method,
+ type=void Function(int, int, int, int, int)
+*/
+
+/*class: Mixed:
+ interfaces=[
+ Interface1,
+ Interface2,
+ Mixin1,
+ Mixin2],
+ maxInheritancePath=4,
+ superclasses=[
+ Object,
+ Superclass,
+ _Mixed&Superclass&Mixin1,
+ _Mixed&Superclass&Mixin1&Mixin2]
+*/
+class Mixed extends Superclass
+ with Mixin1, Mixin2
+ implements Interface1, Interface2 {
+ /*member: Mixed.method#cls:
+ classBuilder=Mixed,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant,1:Covariant,2:Covariant,3:Covariant,4:Covariant),
+ inherited-implements=[Mixed.method],
+ isSynthesized,
+ stubTarget=Mixin2.method,
+ type=void Function(int, int, int, int, int)
+ */
+ /*member: Mixed.method#int:
+ classBuilder=Mixed,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant,1:Covariant,2:Covariant,3:Covariant,4:Covariant),
+ declarations=[
+ Interface1.method,
+ Interface2.method,
+ _Mixed&Superclass&Mixin1&Mixin2.method],
+ isSynthesized,
+ stubTarget=Mixin2.method,
+ type=void Function(int, int, int, int, int)
+ */
+}
+
+void main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/covariant_equals.dart b/pkg/front_end/test/class_hierarchy/data/covariant_equals.dart
new file mode 100644
index 0000000..5c20e81
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/covariant_equals.dart
@@ -0,0 +1,61 @@
+// 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=2.9
+
+/*class: A:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class A {
+ /*member: A.==#cls:
+ classBuilder=A,
+ declared-overrides=[Object.==],
+ isSourceDeclaration
+ */
+ bool operator ==(covariant A other) => true;
+}
+
+/*class: B:
+ maxInheritancePath=2,
+ superclasses=[
+ A,
+ Object]
+*/
+class B extends A {
+ /*member: B.==#cls:
+ classBuilder=B,
+ declared-overrides=[A.==],
+ isSourceDeclaration
+ */
+ bool operator ==(other) => true;
+}
+
+/*class: C:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class C<T> {
+ /*member: C.==#cls:
+ classBuilder=C,
+ declared-overrides=[Object.==],
+ isSourceDeclaration
+ */
+ bool operator ==(covariant C<T> other) => true;
+}
+
+/*class: D:
+ maxInheritancePath=2,
+ superclasses=[
+ C<int>,
+ Object]
+*/
+class D extends C<int> {
+ /*member: D.==#cls:
+ classBuilder=C,
+ isSourceDeclaration
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/declares.dart b/pkg/front_end/test/class_hierarchy/data/declares.dart
new file mode 100644
index 0000000..ea7fd5b
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/declares.dart
@@ -0,0 +1,223 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractDeclaredAbstractMethod,
+ Super.extendedAbstractDeclaredConcreteMethod,
+ Super.extendedAbstractImplementedDeclaredAbstractMethod,
+ Super.extendedAbstractImplementedDeclaredConcreteMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteDeclaredConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteDeclaredConcreteMethod() {}
+
+ /*member: Super.extendedAbstractDeclaredConcreteMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractDeclaredConcreteMethod();
+
+ /*member: Super.extendedConcreteDeclaredAbstractMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteDeclaredAbstractMethod() {}
+ /*member: Super.extendedAbstractDeclaredAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractDeclaredAbstractMethod();
+
+ /*member: Super.extendedConcreteImplementedDeclaredConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedDeclaredConcreteMethod() {}
+
+ /*member: Super.extendedAbstractImplementedDeclaredConcreteMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedDeclaredConcreteMethod();
+
+ /*member: Super.extendedConcreteImplementedDeclaredAbstractMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedDeclaredAbstractMethod() {}
+
+ /*member: Super.extendedAbstractImplementedDeclaredAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedDeclaredAbstractMethod();
+}
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedDeclaredConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void implementedDeclaredConcreteMethod() {}
+
+ /*member: Interface.implementedDeclaredAbstractMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void implementedDeclaredAbstractMethod() {}
+
+ /*member: Interface.extendedConcreteImplementedDeclaredConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedDeclaredConcreteMethod() {}
+
+ /*member: Interface.extendedAbstractImplementedDeclaredConcreteMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedDeclaredConcreteMethod() {}
+
+ /*member: Interface.extendedConcreteImplementedDeclaredAbstractMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedDeclaredAbstractMethod() {}
+
+ /*member: Interface.extendedAbstractImplementedDeclaredAbstractMethod#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedDeclaredAbstractMethod() {}
+}
+
+/*class: Class:
+ abstractMembers=[
+ Class.extendedAbstractDeclaredAbstractMethod,
+ Class.extendedAbstractImplementedDeclaredAbstractMethod,
+ Class.implementedDeclaredAbstractMethod],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class Class extends Super implements Interface {
+ /*member: Class.extendedConcreteDeclaredConcreteMethod#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedConcreteDeclaredConcreteMethod],
+ isSourceDeclaration
+ */
+ void extendedConcreteDeclaredConcreteMethod() {}
+
+ /*member: Class.extendedAbstractDeclaredConcreteMethod#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedAbstractDeclaredConcreteMethod],
+ isSourceDeclaration
+ */
+ void extendedAbstractDeclaredConcreteMethod() {}
+
+ /*member: Class.extendedConcreteDeclaredAbstractMethod#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.extendedConcreteDeclaredAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteDeclaredAbstractMethod
+ */
+ /*member: Class.extendedConcreteDeclaredAbstractMethod#int:
+ classBuilder=Class,
+ declarations=[
+ Class.extendedConcreteDeclaredAbstractMethod,
+ Super.extendedConcreteDeclaredAbstractMethod],
+ declared-overrides=[Super.extendedConcreteDeclaredAbstractMethod],
+ isSynthesized
+ */
+ void extendedConcreteDeclaredAbstractMethod();
+
+ /*member: Class.extendedAbstractDeclaredAbstractMethod#int:
+ classBuilder=Class,
+ declarations=[
+ Class.extendedAbstractDeclaredAbstractMethod,
+ Super.extendedAbstractDeclaredAbstractMethod],
+ declared-overrides=[Super.extendedAbstractDeclaredAbstractMethod],
+ isSynthesized
+ */
+ void extendedAbstractDeclaredAbstractMethod();
+
+ /*member: Class.implementedDeclaredConcreteMethod#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface.implementedDeclaredConcreteMethod],
+ isSourceDeclaration
+ */
+ void implementedDeclaredConcreteMethod() {}
+
+ /*member: Class.implementedDeclaredAbstractMethod#int:
+ classBuilder=Class,
+ declarations=[
+ Class.implementedDeclaredAbstractMethod,
+ Interface.implementedDeclaredAbstractMethod],
+ declared-overrides=[Interface.implementedDeclaredAbstractMethod],
+ isSynthesized
+ */
+ void implementedDeclaredAbstractMethod();
+
+ /*member: Class.extendedConcreteImplementedDeclaredConcreteMethod#cls:
+ classBuilder=Class,
+ declared-overrides=[
+ Interface.extendedConcreteImplementedDeclaredConcreteMethod,
+ Super.extendedConcreteImplementedDeclaredConcreteMethod],
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedDeclaredConcreteMethod() {}
+
+ /*member: Class.extendedAbstractImplementedDeclaredConcreteMethod#cls:
+ classBuilder=Class,
+ declared-overrides=[
+ Interface.extendedAbstractImplementedDeclaredConcreteMethod,
+ Super.extendedAbstractImplementedDeclaredConcreteMethod],
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedDeclaredConcreteMethod() {}
+
+ /*member: Class.extendedConcreteImplementedDeclaredAbstractMethod#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.extendedConcreteImplementedDeclaredAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedDeclaredAbstractMethod
+ */
+ /*member: Class.extendedConcreteImplementedDeclaredAbstractMethod#int:
+ classBuilder=Class,
+ declarations=[
+ Class.extendedConcreteImplementedDeclaredAbstractMethod,
+ Interface.extendedConcreteImplementedDeclaredAbstractMethod,
+ Super.extendedConcreteImplementedDeclaredAbstractMethod],
+ declared-overrides=[
+ Interface.extendedConcreteImplementedDeclaredAbstractMethod,
+ Super.extendedConcreteImplementedDeclaredAbstractMethod],
+ isSynthesized
+ */
+ void extendedConcreteImplementedDeclaredAbstractMethod();
+
+ /*member: Class.extendedAbstractImplementedDeclaredAbstractMethod#int:
+ classBuilder=Class,
+ declarations=[
+ Class.extendedAbstractImplementedDeclaredAbstractMethod,
+ Interface.extendedAbstractImplementedDeclaredAbstractMethod,
+ Super.extendedAbstractImplementedDeclaredAbstractMethod],
+ declared-overrides=[
+ Interface.extendedAbstractImplementedDeclaredAbstractMethod,
+ Super.extendedAbstractImplementedDeclaredAbstractMethod],
+ isSynthesized
+ */
+ void extendedAbstractImplementedDeclaredAbstractMethod();
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_field.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_field.dart
new file mode 100644
index 0000000..ab7a907
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_field.dart
@@ -0,0 +1,535 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteField = 0;
+
+ /*member: Super.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractField;
+
+ /*member: Super.extendedConcreteImplementedField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteImplementedField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteImplementedField = 0;
+
+ /*member: Super.extendedAbstractImplementedField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractImplementedField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractImplementedField;
+
+ /*member: Super.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteImplementedMultipleField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteImplementedMultipleField = 0;
+
+ /*member: Super.extendedAbstractImplementedMultipleField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractImplementedMultipleField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractImplementedMultipleField;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedConcreteImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedConcreteImplementedField = 0;
+
+ /*member: Interface1.extendedAbstractImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedAbstractImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedAbstractImplementedField = 0;
+
+ /*member: Interface1.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedConcreteImplementedMultipleField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedConcreteImplementedMultipleField = 0;
+
+ /*member: Interface1.extendedAbstractImplementedMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedAbstractImplementedMultipleField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.extendedConcreteImplementedMultipleField=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int extendedConcreteImplementedMultipleField = 0;
+
+ /*member: Interface2.extendedAbstractImplementedMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.extendedAbstractImplementedMultipleField=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField,
+ Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedField=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField=,
+ Super.extendedConcreteImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField,
+ Interface2.extendedConcreteImplementedMultipleField,
+ Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleField=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField=,
+ Interface2.extendedConcreteImplementedMultipleField=,
+ Super.extendedConcreteImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+
+ /*member: AbstractClass.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+ */
+ /*member: AbstractClass.extendedAbstractImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField=,
+ Super.extendedAbstractImplementedField=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField=
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+ */
+ /*member: AbstractClass.extendedAbstractImplementedMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField=,
+ Interface2.extendedAbstractImplementedMultipleField=,
+ Super.extendedAbstractImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField=
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractImplementedField,
+ AbstractClass.extendedAbstractImplementedField=,
+ AbstractClass.extendedAbstractImplementedMultipleField,
+ AbstractClass.extendedAbstractImplementedMultipleField=,
+ Super.extendedAbstractField,
+ Super.extendedAbstractField=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSub.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedField#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField,
+ Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedField=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField=,
+ Super.extendedConcreteImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField,
+ Interface2.extendedConcreteImplementedMultipleField,
+ Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleField=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField=,
+ Interface2.extendedConcreteImplementedMultipleField=,
+ Super.extendedConcreteImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+
+ /*member: ConcreteSub.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSub.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+ */
+ /*member: ConcreteSub.extendedAbstractImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField=,
+ Super.extendedAbstractImplementedField=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField=
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+ */
+ /*member: ConcreteSub.extendedAbstractImplementedMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField=,
+ Interface2.extendedAbstractImplementedMultipleField=,
+ Super.extendedAbstractImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField=
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractImplementedField,
+ Interface1.extendedAbstractImplementedField=,
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface1.extendedAbstractImplementedMultipleField=,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField=,
+ Super.extendedAbstractField,
+ Super.extendedAbstractField=,
+ Super.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField=,
+ Super.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField,
+ Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedField=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField=,
+ Super.extendedConcreteImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField,
+ Interface2.extendedConcreteImplementedMultipleField,
+ Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleField=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField=,
+ Interface2.extendedConcreteImplementedMultipleField=,
+ Super.extendedConcreteImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+
+ /*member: ConcreteClass.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+ */
+ /*member: ConcreteClass.extendedAbstractImplementedField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField=,
+ Super.extendedAbstractImplementedField=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField=
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+ */
+ /*member: ConcreteClass.extendedAbstractImplementedMultipleField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField=,
+ Interface2.extendedAbstractImplementedMultipleField=,
+ Super.extendedAbstractImplementedMultipleField=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField=
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_final_field.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_final_field.dart
new file mode 100644
index 0000000..72bcf32
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_final_field.dart
@@ -0,0 +1,311 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final int extendedConcreteField = 0;
+
+ /*member: Super.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractField;
+
+ /*member: Super.extendedConcreteImplementedField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final int extendedConcreteImplementedField = 0;
+
+ /*member: Super.extendedAbstractImplementedField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractImplementedField;
+
+ /*member: Super.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final int extendedConcreteImplementedMultipleField = 0;
+
+ /*member: Super.extendedAbstractImplementedMultipleField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractImplementedMultipleField;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int extendedConcreteImplementedField = 0;
+
+ /*member: Interface1.extendedAbstractImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int extendedAbstractImplementedField = 0;
+
+ /*member: Interface1.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int extendedConcreteImplementedMultipleField = 0;
+
+ /*member: Interface1.extendedAbstractImplementedMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ final int extendedConcreteImplementedMultipleField = 0;
+
+ /*member: Interface2.extendedAbstractImplementedMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ final int extendedAbstractImplementedMultipleField = 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField,
+ Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField,
+ Interface2.extendedConcreteImplementedMultipleField,
+ Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+ */
+
+ /*member: AbstractClass.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractImplementedField,
+ AbstractClass.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractField],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedField#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField,
+ Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField,
+ Interface2.extendedConcreteImplementedMultipleField,
+ Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+ */
+
+ /*member: ConcreteSub.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSub.extendedAbstractImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractImplementedField,
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractField,
+ Super.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedMultipleField],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+/*member: ConcreteClass.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: ConcreteClass.extendedConcreteImplementedField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+*/
+/*member: ConcreteClass.extendedConcreteImplementedMultipleField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+*/
+/*member: ConcreteClass.extendedConcreteImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedField,
+ Super.extendedConcreteImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedField
+*/
+/*member: ConcreteClass.extendedConcreteImplementedMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleField,
+ Interface2.extendedConcreteImplementedMultipleField,
+ Super.extendedConcreteImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleField
+*/
+/*member: ConcreteClass.extendedAbstractImplementedMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleField,
+ Interface2.extendedAbstractImplementedMultipleField,
+ Super.extendedAbstractImplementedMultipleField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleField
+*/
+/*member: ConcreteClass.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: ConcreteClass.extendedAbstractImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedField,
+ Super.extendedAbstractImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedField
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_getter.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_getter.dart
new file mode 100644
index 0000000..ba561c9
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_getter.dart
@@ -0,0 +1,318 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedConcreteGetter => 0;
+
+ /*member: Super.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedAbstractGetter;
+
+ /*member: Super.extendedConcreteImplementedGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedConcreteImplementedGetter => 0;
+
+ /*member: Super.extendedAbstractImplementedGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedAbstractImplementedGetter;
+
+ /*member: Super.extendedConcreteImplementedMultipleGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedConcreteImplementedMultipleGetter => 0;
+
+ /*member: Super.extendedAbstractImplementedMultipleGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedAbstractImplementedMultipleGetter;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteImplementedGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get extendedConcreteImplementedGetter => 0;
+
+ /*member: Interface1.extendedAbstractImplementedGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get extendedAbstractImplementedGetter => 0;
+
+ /*member: Interface1.extendedConcreteImplementedMultipleGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get extendedConcreteImplementedMultipleGetter => 0;
+
+ /*member: Interface1.extendedAbstractImplementedMultipleGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get extendedAbstractImplementedMultipleGetter => 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.extendedConcreteImplementedMultipleGetter#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int get extendedConcreteImplementedMultipleGetter => 0;
+
+ /*member: Interface2.extendedAbstractImplementedMultipleGetter#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int get extendedAbstractImplementedMultipleGetter => 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedGetter#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedGetter
+ */
+ /*member: AbstractClass.extendedConcreteImplementedGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedGetter,
+ Super.extendedConcreteImplementedGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedGetter
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMultipleGetter#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleGetter
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleGetter,
+ Interface2.extendedConcreteImplementedMultipleGetter,
+ Super.extendedConcreteImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleGetter
+ */
+
+ /*member: AbstractClass.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedGetter,
+ Super.extendedAbstractImplementedGetter],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedGetter
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleGetter,
+ Interface2.extendedAbstractImplementedMultipleGetter,
+ Super.extendedAbstractImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleGetter
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractImplementedGetter,
+ AbstractClass.extendedAbstractImplementedMultipleGetter,
+ Super.extendedAbstractGetter],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedGetter#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedGetter
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedGetter,
+ Super.extendedConcreteImplementedGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedGetter
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleGetter#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleGetter
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleGetter,
+ Interface2.extendedConcreteImplementedMultipleGetter,
+ Super.extendedConcreteImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleGetter
+ */
+
+ /*member: ConcreteSub.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedGetter,
+ Super.extendedAbstractImplementedGetter],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedGetter
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleGetter,
+ Interface2.extendedAbstractImplementedMultipleGetter,
+ Super.extendedAbstractImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleGetter
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractImplementedGetter,
+ Interface1.extendedAbstractImplementedMultipleGetter,
+ Interface2.extendedAbstractImplementedMultipleGetter,
+ Super.extendedAbstractGetter,
+ Super.extendedAbstractImplementedGetter,
+ Super.extendedAbstractImplementedMultipleGetter],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedGetter#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedGetter
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedGetter,
+ Super.extendedConcreteImplementedGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedGetter
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleGetter#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleGetter
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleGetter,
+ Interface2.extendedConcreteImplementedMultipleGetter,
+ Super.extendedConcreteImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleGetter
+ */
+
+ /*member: ConcreteClass.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedGetter,
+ Super.extendedAbstractImplementedGetter],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedGetter
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedMultipleGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleGetter,
+ Interface2.extendedAbstractImplementedMultipleGetter,
+ Super.extendedAbstractImplementedMultipleGetter],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleGetter
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_method.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_method.dart
new file mode 100644
index 0000000..c0b274a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_method.dart
@@ -0,0 +1,314 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMethod() {}
+
+ /*member: Super.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMethod();
+
+ /*member: Super.extendedConcreteImplementedMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMethod() {}
+
+ /*member: Super.extendedAbstractImplementedMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMethod();
+
+ /*member: Super.extendedConcreteImplementedMultipleMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMultipleMethod() {}
+
+ /*member: Super.extendedAbstractImplementedMultipleMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMultipleMethod();
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteImplementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMethod() {}
+
+ /*member: Interface1.extendedAbstractImplementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMethod() {}
+
+ /*member: Interface1.extendedConcreteImplementedMultipleMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMultipleMethod() {}
+
+ /*member: Interface1.extendedAbstractImplementedMultipleMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMultipleMethod() {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.extendedConcreteImplementedMultipleMethod#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMultipleMethod() {}
+ /*member: Interface2.extendedAbstractImplementedMultipleMethod#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMultipleMethod() {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Super,
+ Object]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMultipleMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleMethod
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleMethod,
+ Interface2.extendedConcreteImplementedMultipleMethod,
+ Super.extendedConcreteImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleMethod
+ */
+
+ /*member: AbstractClass.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMethod
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleMethod,
+ Interface2.extendedAbstractImplementedMultipleMethod,
+ Super.extendedAbstractImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleMethod
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractImplementedMethod,
+ AbstractClass.extendedAbstractImplementedMultipleMethod,
+ Super.extendedAbstractMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMethod#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleMethod#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleMethod
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleMethod,
+ Interface2.extendedConcreteImplementedMultipleMethod,
+ Super.extendedConcreteImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleMethod
+ */
+
+ /*member: ConcreteSub.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMethod
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleMethod,
+ Interface2.extendedAbstractImplementedMultipleMethod,
+ Super.extendedAbstractImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleMethod
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractImplementedMethod,
+ Interface1.extendedAbstractImplementedMultipleMethod,
+ Interface2.extendedAbstractImplementedMultipleMethod,
+ Super.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMultipleMethod,
+ Super.extendedAbstractMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedMethod#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleMethod#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleMethod
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleMethod,
+ Interface2.extendedConcreteImplementedMultipleMethod,
+ Super.extendedConcreteImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleMethod
+ */
+
+ /*member: ConcreteClass.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMethod
+ */
+ /*member: ConcreteClass.extendedAbstractImplementedMultipleMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleMethod,
+ Interface2.extendedAbstractImplementedMultipleMethod,
+ Super.extendedAbstractImplementedMultipleMethod],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleMethod
+ */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/extend_multiple_setter.dart b/pkg/front_end/test/class_hierarchy/data/extend_multiple_setter.dart
new file mode 100644
index 0000000..fbfc164
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/extend_multiple_setter.dart
@@ -0,0 +1,318 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteSetter(int value) {}
+
+ /*member: Super.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractSetter(int value);
+
+ /*member: Super.extendedConcreteImplementedSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedSetter(int value) {}
+
+ /*member: Super.extendedAbstractImplementedSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedSetter(int value);
+
+ /*member: Super.extendedConcreteImplementedMultipleSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedMultipleSetter(int value) {}
+
+ /*member: Super.extendedAbstractImplementedMultipleSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedMultipleSetter(int value);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedSetter(int value) {}
+
+ /*member: Interface1.extendedAbstractImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedSetter(int value) {}
+
+ /*member: Interface1.extendedConcreteImplementedMultipleSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedMultipleSetter(int value) {}
+
+ /*member: Interface1.extendedAbstractImplementedMultipleSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedMultipleSetter(int value) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.extendedConcreteImplementedMultipleSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedMultipleSetter(int value) {}
+
+ /*member: Interface2.extendedAbstractImplementedMultipleSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedMultipleSetter(int value) {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedSetter=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedSetter=
+ */
+ /*member: AbstractClass.extendedConcreteImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedSetter=,
+ Super.extendedConcreteImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedSetter=
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMultipleSetter=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleSetter=
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleSetter=,
+ Interface2.extendedConcreteImplementedMultipleSetter=,
+ Super.extendedConcreteImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleSetter=
+ */
+
+ /*member: AbstractClass.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedSetter=,
+ Super.extendedAbstractImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedSetter=
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleSetter=,
+ Interface2.extendedAbstractImplementedMultipleSetter=,
+ Super.extendedAbstractImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleSetter=
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractImplementedMultipleSetter=,
+ AbstractClass.extendedAbstractImplementedSetter=,
+ Super.extendedAbstractSetter=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedSetter=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedSetter=
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedSetter=,
+ Super.extendedConcreteImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedSetter=
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleSetter=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleSetter=
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleSetter=,
+ Interface2.extendedConcreteImplementedMultipleSetter=,
+ Super.extendedConcreteImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleSetter=
+ */
+
+ /*member: ConcreteSub.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedSetter=,
+ Super.extendedAbstractImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedSetter=
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleSetter=,
+ Interface2.extendedAbstractImplementedMultipleSetter=,
+ Super.extendedAbstractImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleSetter=
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractImplementedMultipleSetter=,
+ Interface1.extendedAbstractImplementedSetter=,
+ Interface2.extendedAbstractImplementedMultipleSetter=,
+ Super.extendedAbstractImplementedMultipleSetter=,
+ Super.extendedAbstractImplementedSetter=,
+ Super.extendedAbstractSetter=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedSetter=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedSetter=
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedSetter=,
+ Super.extendedConcreteImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedSetter=
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleSetter=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleSetter=
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMultipleSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMultipleSetter=,
+ Interface2.extendedConcreteImplementedMultipleSetter=,
+ Super.extendedConcreteImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMultipleSetter=
+ */
+
+ /*member: ConcreteClass.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedSetter=,
+ Super.extendedAbstractImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedSetter=
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedMultipleSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMultipleSetter=,
+ Interface2.extendedAbstractImplementedMultipleSetter=,
+ Super.extendedAbstractImplementedMultipleSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedMultipleSetter=
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_field.dart b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_field.dart
new file mode 100644
index 0000000..d9a3756
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_field.dart
@@ -0,0 +1,675 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteCovariantField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteCovariantField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ covariant int extendedConcreteCovariantField = 0;
+
+ /*member: Super.extendedAbstractCovariantField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractCovariantField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract covariant int extendedAbstractCovariantField;
+
+ /*member: Super.extendedConcreteCovariantImplementedField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteCovariantImplementedField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ covariant int extendedConcreteCovariantImplementedField = 0;
+
+ /*member: Super.extendedAbstractCovariantImplementedField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractCovariantImplementedField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract covariant int extendedAbstractCovariantImplementedField;
+
+ /*member: Super.extendedConcreteImplementedCovariantField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteImplementedCovariantField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteImplementedCovariantField = 0;
+
+ /*member: Super.extendedAbstractImplementedCovariantField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractImplementedCovariantField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractImplementedCovariantField;
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteCovariantImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedConcreteCovariantImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedConcreteCovariantImplementedField = 0;
+
+ /*member: Interface1.extendedAbstractCovariantImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedAbstractCovariantImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedAbstractCovariantImplementedField = 0;
+
+ /*member: Interface1.extendedConcreteImplementedCovariantField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedConcreteImplementedCovariantField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ covariant int extendedConcreteImplementedCovariantField = 0;
+
+ /*member: Interface1.extendedAbstractImplementedCovariantField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedAbstractImplementedCovariantField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ covariant int extendedAbstractImplementedCovariantField = 0;
+
+ /*member: Interface1.implementsMultipleCovariantField1#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.implementsMultipleCovariantField1=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ covariant int implementsMultipleCovariantField1 = 0;
+
+ /*member: Interface1.implementsMultipleCovariantField2#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.implementsMultipleCovariantField2=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int implementsMultipleCovariantField2 = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementsMultipleCovariantField1#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.implementsMultipleCovariantField1=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int implementsMultipleCovariantField1 = 0;
+
+ /*member: Interface2.implementsMultipleCovariantField2#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.implementsMultipleCovariantField2=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ covariant int implementsMultipleCovariantField2 = 0;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteCovariantField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.extendedConcreteCovariantField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteCovariantImplementedField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteCovariantImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedField,
+ Super.extendedConcreteCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteCovariantImplementedField=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: AbstractClass.extendedConcreteCovariantImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedField=,
+ Super.extendedConcreteCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedCovariantField#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedCovariantField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedCovariantField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantField,
+ Super.extendedConcreteImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedCovariantField
+ */
+ /*member: AbstractClass.extendedConcreteImplementedCovariantField=#cls:
+ classBuilder=AbstractClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantField,
+ type=int
+ */
+ /*member: AbstractClass.extendedConcreteImplementedCovariantField=#int:
+ classBuilder=AbstractClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantField=,
+ Super.extendedConcreteImplementedCovariantField=],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantField,
+ type=int
+ */
+
+ /*member: AbstractClass.extendedAbstractCovariantField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.extendedAbstractCovariantField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractCovariantImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedField,
+ Super.extendedAbstractCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedField
+ */
+ /*member: AbstractClass.extendedAbstractCovariantImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedField=,
+ Super.extendedAbstractCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedField=
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedCovariantField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantField,
+ Super.extendedAbstractImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedCovariantField
+ */
+ /*member: AbstractClass.extendedAbstractImplementedCovariantField=#int:
+ abstractForwardingStub,
+ classBuilder=AbstractClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantField=,
+ Super.extendedAbstractImplementedCovariantField=],
+ isSynthesized,
+ type=int
+ */
+
+ /*member: AbstractClass.implementsMultipleCovariantField1#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField1,
+ Interface2.implementsMultipleCovariantField1],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField1
+ */
+ /*member: AbstractClass.implementsMultipleCovariantField1=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField1=,
+ Interface2.implementsMultipleCovariantField1=],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField1
+ */
+
+ /*member: AbstractClass.implementsMultipleCovariantField2#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField2,
+ Interface2.implementsMultipleCovariantField2],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField2
+ */
+ /*member: AbstractClass.implementsMultipleCovariantField2=#int:
+ abstractForwardingStub,
+ classBuilder=AbstractClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.implementsMultipleCovariantField2=,
+ Interface2.implementsMultipleCovariantField2=],
+ isSynthesized,
+ type=int
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractCovariantImplementedField,
+ AbstractClass.extendedAbstractCovariantImplementedField=,
+ AbstractClass.extendedAbstractImplementedCovariantField,
+ AbstractClass.extendedAbstractImplementedCovariantField=,
+ AbstractClass.implementsMultipleCovariantField1,
+ AbstractClass.implementsMultipleCovariantField1=,
+ AbstractClass.implementsMultipleCovariantField2,
+ AbstractClass.implementsMultipleCovariantField2=,
+ Super.extendedAbstractCovariantField,
+ Super.extendedAbstractCovariantField=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteCovariantField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSub.extendedConcreteCovariantField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedField#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedField,
+ Super.extendedConcreteCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedField=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedField=,
+ Super.extendedConcreteCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantField#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedCovariantField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantField,
+ Super.extendedConcreteImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedCovariantField
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantField=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantField=],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedCovariantField=
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantField=,
+ Super.extendedConcreteImplementedCovariantField=],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedCovariantField=
+ */
+
+ /*member: ConcreteSub.extendedAbstractCovariantField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSub.extendedAbstractCovariantField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractCovariantImplementedField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedField,
+ Super.extendedAbstractCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedField
+ */
+ /*member: ConcreteSub.extendedAbstractCovariantImplementedField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedField=,
+ Super.extendedAbstractCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedField=
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedCovariantField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantField,
+ Super.extendedAbstractImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedCovariantField
+ */
+ /*member: ConcreteSub.extendedAbstractImplementedCovariantField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantField=,
+ Super.extendedAbstractImplementedCovariantField=],
+ isSynthesized,
+ member=AbstractClass.extendedAbstractImplementedCovariantField=
+ */
+
+ /*member: ConcreteSub.implementsMultipleCovariantField1#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField1,
+ Interface2.implementsMultipleCovariantField1],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField1
+ */
+ /*member: ConcreteSub.implementsMultipleCovariantField1=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField1=,
+ Interface2.implementsMultipleCovariantField1=],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField1
+ */
+
+ /*member: ConcreteSub.implementsMultipleCovariantField2#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField2,
+ Interface2.implementsMultipleCovariantField2],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField2
+ */
+ /*member: ConcreteSub.implementsMultipleCovariantField2=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField2=,
+ Interface2.implementsMultipleCovariantField2=],
+ isSynthesized,
+ member=AbstractClass.implementsMultipleCovariantField2=
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractCovariantImplementedField,
+ Interface1.extendedAbstractCovariantImplementedField=,
+ Interface1.extendedAbstractImplementedCovariantField,
+ Interface1.extendedAbstractImplementedCovariantField=,
+ Interface1.implementsMultipleCovariantField1,
+ Interface1.implementsMultipleCovariantField1=,
+ Interface1.implementsMultipleCovariantField2,
+ Interface1.implementsMultipleCovariantField2=,
+ Interface2.implementsMultipleCovariantField1,
+ Interface2.implementsMultipleCovariantField1=,
+ Interface2.implementsMultipleCovariantField2,
+ Interface2.implementsMultipleCovariantField2=,
+ Super.extendedAbstractCovariantField,
+ Super.extendedAbstractCovariantField=,
+ Super.extendedAbstractCovariantImplementedField,
+ Super.extendedAbstractCovariantImplementedField=,
+ Super.extendedAbstractImplementedCovariantField,
+ Super.extendedAbstractImplementedCovariantField=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteCovariantField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.extendedConcreteCovariantField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedField,
+ Super.extendedConcreteCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedField=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedField=,
+ Super.extendedConcreteCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedField
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantField#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedCovariantField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantField,
+ Super.extendedConcreteImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedCovariantField
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantField=#cls:
+ classBuilder=ConcreteClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantField=],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantField,
+ type=int
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantField=#int:
+ classBuilder=ConcreteClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantField=,
+ Super.extendedConcreteImplementedCovariantField=],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantField,
+ type=int
+ */
+
+ /*member: ConcreteClass.extendedAbstractCovariantField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.extendedAbstractCovariantField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractCovariantImplementedField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedField,
+ Super.extendedAbstractCovariantImplementedField],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedField
+ */
+ /*member: ConcreteClass.extendedAbstractCovariantImplementedField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedField=,
+ Super.extendedAbstractCovariantImplementedField=],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedField=
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedCovariantField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantField,
+ Super.extendedAbstractImplementedCovariantField],
+ isSynthesized,
+ member=Super.extendedAbstractImplementedCovariantField
+ */
+ /*member: ConcreteClass.extendedAbstractImplementedCovariantField=#int:
+ abstractForwardingStub,
+ classBuilder=ConcreteClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantField=,
+ Super.extendedAbstractImplementedCovariantField=],
+ isSynthesized,
+ type=int
+ */
+
+ /*member: ConcreteClass.implementsMultipleCovariantField1#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField1,
+ Interface2.implementsMultipleCovariantField1],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField1
+ */
+ /*member: ConcreteClass.implementsMultipleCovariantField1=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField1=,
+ Interface2.implementsMultipleCovariantField1=],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField1
+ */
+
+ /*member: ConcreteClass.implementsMultipleCovariantField2#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantField2,
+ Interface2.implementsMultipleCovariantField2],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantField2
+ */
+ /*member: ConcreteClass.implementsMultipleCovariantField2=#int:
+ abstractForwardingStub,
+ classBuilder=ConcreteClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.implementsMultipleCovariantField2=,
+ Interface2.implementsMultipleCovariantField2=],
+ isSynthesized,
+ type=int
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_method.dart b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_method.dart
new file mode 100644
index 0000000..b2174b7
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_method.dart
@@ -0,0 +1,400 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteCovariantMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteCovariantMethod(covariant int i) {}
+
+ /*member: Super.extendedAbstractCovariantMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractCovariantMethod(covariant int i);
+
+ /*member: Super.extendedConcreteCovariantImplementedMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteCovariantImplementedMethod(covariant int i) {}
+
+ /*member: Super.extendedAbstractCovariantImplementedMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractCovariantImplementedMethod(covariant int i);
+
+ /*member: Super.extendedConcreteImplementedCovariantMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedCovariantMethod(int i) {}
+
+ /*member: Super.extendedAbstractImplementedCovariantMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedCovariantMethod(int i);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteCovariantImplementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedConcreteCovariantImplementedMethod(int i) {}
+
+ /*member: Interface1.extendedAbstractCovariantImplementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedAbstractCovariantImplementedMethod(int i) {}
+
+ /*member: Interface1.extendedConcreteImplementedCovariantMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedCovariantMethod(covariant int i) {}
+
+ /*member: Interface1.extendedAbstractImplementedCovariantMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+
+ /*member: Interface1.implementsMultipleCovariantMethod1#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ void implementsMultipleCovariantMethod1(covariant int i) {}
+ /*member: Interface1.implementsMultipleCovariantMethod2#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void implementsMultipleCovariantMethod2(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementsMultipleCovariantMethod1#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+
+ void implementsMultipleCovariantMethod1(int i) {}
+ /*member: Interface2.implementsMultipleCovariantMethod2#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void implementsMultipleCovariantMethod2(covariant int i) {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Super,
+ Object]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteCovariantMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractCovariantMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteCovariantImplementedMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedMethod
+ */
+ /*member: AbstractClass.extendedConcreteCovariantImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedMethod,
+ Super.extendedConcreteCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedMethod
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedCovariantMethod#int:
+ abstractForwardingStub,
+ classBuilder=AbstractClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantMethod,
+ Super.extendedAbstractImplementedCovariantMethod],
+ isSynthesized,
+ type=void Function(int)
+ */
+ /*member: AbstractClass.extendedAbstractCovariantImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedMethod,
+ Super.extendedAbstractCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedMethod
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedCovariantMethod#cls:
+ classBuilder=AbstractClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+ type=void Function(int)
+ */
+ /*member: AbstractClass.extendedConcreteImplementedCovariantMethod#int:
+ classBuilder=AbstractClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantMethod,
+ Super.extendedConcreteImplementedCovariantMethod],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+ type=void Function(int)
+ */
+
+ /*member: AbstractClass.implementsMultipleCovariantMethod1#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantMethod1,
+ Interface2.implementsMultipleCovariantMethod1],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantMethod1
+ */
+
+ /*member: AbstractClass.implementsMultipleCovariantMethod2#int:
+ abstractForwardingStub,
+ classBuilder=AbstractClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.implementsMultipleCovariantMethod2,
+ Interface2.implementsMultipleCovariantMethod2],
+ isSynthesized,
+ type=void Function(int)
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractCovariantImplementedMethod,
+ AbstractClass.extendedAbstractImplementedCovariantMethod,
+ AbstractClass.implementsMultipleCovariantMethod1,
+ AbstractClass.implementsMultipleCovariantMethod2,
+ Super.extendedAbstractCovariantMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteCovariantMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractCovariantMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedMethod#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedMethod
+ */
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedMethod,
+ Super.extendedConcreteCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedMethod
+ */
+
+ /*member: ConcreteSub.extendedAbstractCovariantImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedMethod,
+ Super.extendedAbstractCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedMethod
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantMethod#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantMethod],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedCovariantMethod
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantMethod,
+ Super.extendedConcreteImplementedCovariantMethod],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedCovariantMethod
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedCovariantMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantMethod,
+ Super.extendedAbstractImplementedCovariantMethod],
+ isSynthesized,
+ member=AbstractClass.extendedAbstractImplementedCovariantMethod
+ */
+
+ /*member: ConcreteSub.implementsMultipleCovariantMethod1#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantMethod1,
+ Interface2.implementsMultipleCovariantMethod1],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantMethod1
+ */
+
+ /*member: ConcreteSub.implementsMultipleCovariantMethod2#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantMethod2,
+ Interface2.implementsMultipleCovariantMethod2],
+ isSynthesized,
+ member=AbstractClass.implementsMultipleCovariantMethod2
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractCovariantImplementedMethod,
+ Interface1.extendedAbstractImplementedCovariantMethod,
+ Interface1.implementsMultipleCovariantMethod1,
+ Interface1.implementsMultipleCovariantMethod2,
+ Interface2.implementsMultipleCovariantMethod1,
+ Interface2.implementsMultipleCovariantMethod2,
+ Super.extendedAbstractCovariantImplementedMethod,
+ Super.extendedAbstractCovariantMethod,
+ Super.extendedAbstractImplementedCovariantMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteCovariantMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractCovariantMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedMethod#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedMethod
+ */
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedMethod,
+ Super.extendedConcreteCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedMethod
+ */
+
+ /*member: ConcreteClass.extendedAbstractCovariantImplementedMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedMethod,
+ Super.extendedAbstractCovariantImplementedMethod],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedMethod
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantMethod#cls:
+ classBuilder=ConcreteClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantMethod],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+ type=void Function(int)
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantMethod#int:
+ classBuilder=ConcreteClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantMethod,
+ Super.extendedConcreteImplementedCovariantMethod],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantMethod,
+ type=void Function(int)
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedCovariantMethod#int:
+ abstractForwardingStub,
+ classBuilder=ConcreteClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantMethod,
+ Super.extendedAbstractImplementedCovariantMethod],
+ isSynthesized,
+ type=void Function(int)
+ */
+
+ /*member: ConcreteClass.implementsMultipleCovariantMethod1#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantMethod1,
+ Interface2.implementsMultipleCovariantMethod1],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantMethod1
+ */
+
+ /*member: ConcreteClass.implementsMultipleCovariantMethod2#int:
+ abstractForwardingStub,
+ classBuilder=ConcreteClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.implementsMultipleCovariantMethod2,
+ Interface2.implementsMultipleCovariantMethod2],
+ isSynthesized,
+ type=void Function(int)
+ */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_setter.dart b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_setter.dart
new file mode 100644
index 0000000..82c0ead
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/forwarding_stubs_setter.dart
@@ -0,0 +1,403 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteCovariantSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteCovariantSetter(covariant int i) {}
+
+ /*member: Super.extendedAbstractCovariantSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractCovariantSetter(covariant int i);
+
+ /*member: Super.extendedConcreteCovariantImplementedSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteCovariantImplementedSetter(covariant int i) {}
+
+ /*member: Super.extendedAbstractCovariantImplementedSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractCovariantImplementedSetter(covariant int i);
+
+ /*member: Super.extendedConcreteImplementedCovariantSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedCovariantSetter(int i) {}
+
+ /*member: Super.extendedAbstractImplementedCovariantSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedCovariantSetter(int i);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.extendedConcreteCovariantImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedConcreteCovariantImplementedSetter(int i) {}
+
+ /*member: Interface1.extendedAbstractCovariantImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedAbstractCovariantImplementedSetter(int i) {}
+
+ /*member: Interface1.extendedConcreteImplementedCovariantSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedConcreteImplementedCovariantSetter(covariant int i) {}
+
+ /*member: Interface1.extendedAbstractImplementedCovariantSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+
+ /*member: Interface1.implementsMultipleCovariantSetter1=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementsMultipleCovariantSetter1(covariant int i) {}
+
+ /*member: Interface1.implementsMultipleCovariantSetter2=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementsMultipleCovariantSetter2(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementsMultipleCovariantSetter1=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set implementsMultipleCovariantSetter1(int i) {}
+
+ /*member: Interface2.implementsMultipleCovariantSetter2=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set implementsMultipleCovariantSetter2(covariant int i) {}
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteCovariantSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedConcreteCovariantImplementedSetter=#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedSetter=
+ */
+ /*member: AbstractClass.extendedConcreteCovariantImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedSetter=,
+ Super.extendedConcreteCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedSetter=
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedCovariantSetter=#cls:
+ classBuilder=AbstractClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+ type=int
+ */
+ /*member: AbstractClass.extendedConcreteImplementedCovariantSetter=#int:
+ classBuilder=AbstractClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantSetter=,
+ Super.extendedConcreteImplementedCovariantSetter=],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+ type=int
+ */
+
+ /*member: AbstractClass.extendedAbstractCovariantSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: AbstractClass.extendedAbstractCovariantImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedSetter=,
+ Super.extendedAbstractCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedSetter=
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedCovariantSetter=#int:
+ abstractForwardingStub,
+ classBuilder=AbstractClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantSetter=,
+ Super.extendedAbstractImplementedCovariantSetter=],
+ isSynthesized,
+ type=int
+ */
+
+ /*member: AbstractClass.implementsMultipleCovariantSetter1=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantSetter1=,
+ Interface2.implementsMultipleCovariantSetter1=],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantSetter1=
+ */
+
+ /*member: AbstractClass.implementsMultipleCovariantSetter2=#int:
+ abstractForwardingStub,
+ classBuilder=AbstractClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.implementsMultipleCovariantSetter2=,
+ Interface2.implementsMultipleCovariantSetter2=],
+ isSynthesized,
+ type=int
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractCovariantImplementedSetter=,
+ AbstractClass.extendedAbstractImplementedCovariantSetter=,
+ AbstractClass.implementsMultipleCovariantSetter1=,
+ AbstractClass.implementsMultipleCovariantSetter2=,
+ Super.extendedAbstractCovariantSetter=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object,
+ Super]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteCovariantSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedSetter=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedSetter=
+ */
+ /*member: ConcreteSub.extendedConcreteCovariantImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedSetter=,
+ Super.extendedConcreteCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedSetter=
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantSetter=#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedCovariantSetter=],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedCovariantSetter=
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedCovariantSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantSetter=,
+ Super.extendedConcreteImplementedCovariantSetter=],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedCovariantSetter=
+ */
+
+ /*member: ConcreteSub.extendedAbstractCovariantSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.extendedAbstractCovariantImplementedSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedSetter=,
+ Super.extendedAbstractCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedSetter=
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedCovariantSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantSetter=,
+ Super.extendedAbstractImplementedCovariantSetter=],
+ isSynthesized,
+ member=AbstractClass.extendedAbstractImplementedCovariantSetter=
+ */
+
+ /*member: ConcreteSub.implementsMultipleCovariantSetter1=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantSetter1=,
+ Interface2.implementsMultipleCovariantSetter1=],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantSetter1=
+ */
+
+ /*member: ConcreteSub.implementsMultipleCovariantSetter2=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantSetter2=,
+ Interface2.implementsMultipleCovariantSetter2=],
+ isSynthesized,
+ member=AbstractClass.implementsMultipleCovariantSetter2=
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Interface1.extendedAbstractCovariantImplementedSetter=,
+ Interface1.extendedAbstractImplementedCovariantSetter=,
+ Interface1.implementsMultipleCovariantSetter1=,
+ Interface1.implementsMultipleCovariantSetter2=,
+ Interface2.implementsMultipleCovariantSetter1=,
+ Interface2.implementsMultipleCovariantSetter2=,
+ Super.extendedAbstractCovariantImplementedSetter=,
+ Super.extendedAbstractCovariantSetter=,
+ Super.extendedAbstractImplementedCovariantSetter=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteCovariantSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedSetter=#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedSetter=
+ */
+ /*member: ConcreteClass.extendedConcreteCovariantImplementedSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedConcreteCovariantImplementedSetter=,
+ Super.extendedConcreteCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteCovariantImplementedSetter=
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantSetter=#cls:
+ classBuilder=ConcreteClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedCovariantSetter=],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+ type=int
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedCovariantSetter=#int:
+ classBuilder=ConcreteClass,
+ concreteForwardingStub,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedConcreteImplementedCovariantSetter=,
+ Super.extendedConcreteImplementedCovariantSetter=],
+ isSynthesized,
+ stubTarget=Super.extendedConcreteImplementedCovariantSetter=,
+ type=int
+ */
+
+ /*member: ConcreteClass.extendedAbstractCovariantSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteClass.extendedAbstractCovariantImplementedSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.extendedAbstractCovariantImplementedSetter=,
+ Super.extendedAbstractCovariantImplementedSetter=],
+ isSynthesized,
+ member=Super.extendedAbstractCovariantImplementedSetter=
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedCovariantSetter=#int:
+ abstractForwardingStub,
+ classBuilder=ConcreteClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.extendedAbstractImplementedCovariantSetter=,
+ Super.extendedAbstractImplementedCovariantSetter=],
+ isSynthesized,
+ type=int
+ */
+
+ /*member: ConcreteClass.implementsMultipleCovariantSetter1=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementsMultipleCovariantSetter1=,
+ Interface2.implementsMultipleCovariantSetter1=],
+ isSynthesized,
+ member=Interface1.implementsMultipleCovariantSetter1=
+ */
+
+ /*member: ConcreteClass.implementsMultipleCovariantSetter2=#int:
+ abstractForwardingStub,
+ classBuilder=ConcreteClass,
+ covariance=Covariance(0:Covariant),
+ declarations=[
+ Interface1.implementsMultipleCovariantSetter2=,
+ Interface2.implementsMultipleCovariantSetter2=],
+ isSynthesized,
+ type=int
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/getter_setter.dart b/pkg/front_end/test/class_hierarchy/data/getter_setter.dart
new file mode 100644
index 0000000..7823072
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/getter_setter.dart
@@ -0,0 +1,1184 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedGetterDeclaredField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedGetterDeclaredField => '';
+
+ /*member: Super.extendedGetterMixedInField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedGetterMixedInField => '';
+
+ /*member: Super.extendedGetterImplementedField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedGetterImplementedField => '';
+
+ /*member: Super.extendedGetterDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedGetterDeclaredSetter => '';
+
+ /*member: Super.extendedGetterMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedGetterMixedInSetter => '';
+
+ /*member: Super.extendedGetterImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedGetterImplementedSetter => '';
+
+ /*member: Super.extendedFieldDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final String extendedFieldDeclaredSetter = '';
+
+ /*member: Super.extendedFieldMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final String extendedFieldMixedInSetter = '';
+
+ /*member: Super.extendedFieldImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final String extendedFieldImplementedSetter = '';
+
+ /*member: Super.extendedSetterDeclaredField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedSetterDeclaredField(int value) {}
+
+ /*member: Super.extendedSetterMixedInField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedSetterMixedInField(int value) {}
+
+ /*member: Super.extendedSetterImplementedField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedSetterImplementedField(int value) {}
+
+ /*member: Super.extendedSetterDeclaredGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedSetterDeclaredGetter(int value) {}
+
+ /*member: Super.extendedSetterMixedInGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedSetterMixedInGetter(int value) {}
+
+ /*member: Super.extendedSetterImplementedGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedSetterImplementedGetter(int value) {}
+}
+
+/*class: Mixin:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Mixin {
+ /*member: Mixin.extendedGetterMixedInField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.extendedGetterMixedInField=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int extendedGetterMixedInField = 0;
+
+ /*member: Mixin.extendedGetterMixedInSetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set extendedGetterMixedInSetter(int value) {}
+
+ /*member: Mixin.extendedFieldMixedInSetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set extendedFieldMixedInSetter(int value) {}
+
+ /*member: Mixin.extendedSetterMixedInField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ final String extendedSetterMixedInField = '';
+
+ /*member: Mixin.extendedSetterMixedInGetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ String get extendedSetterMixedInGetter => '';
+
+ /*member: Mixin.mixedInGetterDeclaredField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ String get mixedInGetterDeclaredField => '';
+
+ /*member: Mixin.mixedInGetterImplementedField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ String get mixedInGetterImplementedField => '';
+
+ /*member: Mixin.mixedInGetterDeclaredSetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ String get mixedInGetterDeclaredSetter => '';
+
+ /*member: Mixin.mixedInGetterImplementedSetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ String get mixedInGetterImplementedSetter => '';
+
+ /*member: Mixin.mixedInFieldDeclaredSetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ final String mixedInFieldDeclaredSetter = '';
+
+ /*member: Mixin.mixedInFieldImplementedSetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ final String mixedInFieldImplementedSetter = '';
+
+ /*member: Mixin.mixedInSetterDeclaredField=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set mixedInSetterDeclaredField(int value) {}
+
+ /*member: Mixin.mixedInSetterImplementedField=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set mixedInSetterImplementedField(int value) {}
+
+ /*member: Mixin.mixedInSetterDeclaredGetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set mixedInSetterDeclaredGetter(int value) {}
+
+ /*member: Mixin.mixedInSetterImplementedGetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set mixedInSetterImplementedGetter(int value) {}
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface1 {
+ /*member: Interface1.extendedGetterImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.extendedGetterImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int extendedGetterImplementedField = 0;
+
+ /*member: Interface1.extendedGetterImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedGetterImplementedSetter(int value) {}
+
+ /*member: Interface1.extendedFieldImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set extendedFieldImplementedSetter(int value) {}
+
+ /*member: Interface1.extendedSetterImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final String extendedSetterImplementedField = '';
+
+ /*member: Interface1.extendedSetterImplementedGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get extendedSetterImplementedGetter => '';
+
+ /*member: Interface1.mixedInGetterImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.mixedInGetterImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int mixedInGetterImplementedField = 0;
+
+ /*member: Interface1.mixedInGetterImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set mixedInGetterImplementedSetter(int value) {}
+
+ /*member: Interface1.mixedInFieldImplementedSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set mixedInFieldImplementedSetter(int value) {}
+
+ /*member: Interface1.mixedInSetterImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final String mixedInSetterImplementedField = '';
+
+ /*member: Interface1.mixedInSetterImplementedGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get mixedInSetterImplementedGetter => '';
+
+ /*member: Interface1.implementedGetterDeclaredField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get implementedGetterDeclaredField => '';
+
+ /*member: Interface1.implementedGetterImplementedField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get implementedGetterImplementedField => '';
+
+ /*member: Interface1.implementedGetterDeclaredSetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get implementedGetterDeclaredSetter => '';
+
+ /*member: Interface1.implementedGetterImplementedSetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get implementedGetterImplementedSetter => '';
+
+ /*member: Interface1.implementedFieldDeclaredSetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final String implementedFieldDeclaredSetter = '';
+
+ /*member: Interface1.implementedFieldImplementedSetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final String implementedFieldImplementedSetter = '';
+
+ /*member: Interface1.implementedSetterDeclaredField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementedSetterDeclaredField(int value) {}
+
+ /*member: Interface1.implementedSetterImplementedField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementedSetterImplementedField(int value) {}
+
+ /*member: Interface1.implementedSetterDeclaredGetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementedSetterDeclaredGetter(int value) {}
+
+ /*member: Interface1.implementedSetterImplementedGetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementedSetterImplementedGetter(int value) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface2 {
+ /*member: Interface2.implementedGetterImplementedField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.implementedGetterImplementedField=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int implementedGetterImplementedField = 0;
+
+ /*member: Interface2.implementedGetterImplementedSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set implementedGetterImplementedSetter(int value) {}
+
+ /*member: Interface2.implementedFieldImplementedSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set implementedFieldImplementedSetter(int value) {}
+
+ /*member: Interface2.implementedSetterImplementedField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ final String implementedSetterImplementedField = '';
+
+ /*member: Interface2.implementedSetterImplementedGetter#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ String get implementedSetterImplementedGetter => '';
+}
+
+/*class: _Class&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterMixedInField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedGetterMixedInField,
+ Super.extendedGetterMixedInField],
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInField=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInField=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedGetterMixedInField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInField
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterMixedInField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedSetterMixedInField],
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInField
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterMixedInGetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInGetter
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInGetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedSetterMixedInGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedSetterMixedInGetter
+*/
+/*member: _Class&Super&Mixin.extendedSetterMixedInGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredField
+*/
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterDeclaredField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredField
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterImplementedField#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedField
+*/
+/*member: _Class&Super&Mixin.mixedInGetterImplementedField#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterImplementedField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedField
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredSetter
+*/
+/*member: _Class&Super&Mixin.mixedInGetterDeclaredSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterDeclaredSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterDeclaredSetter
+*/
+
+/*member: _Class&Super&Mixin.mixedInGetterImplementedSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedSetter
+*/
+/*member: _Class&Super&Mixin.mixedInGetterImplementedSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInGetterImplementedSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInGetterImplementedSetter
+*/
+
+/*member: _Class&Super&Mixin.mixedInFieldDeclaredSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldDeclaredSetter
+*/
+/*member: _Class&Super&Mixin.mixedInFieldDeclaredSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInFieldDeclaredSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldDeclaredSetter
+*/
+
+/*member: _Class&Super&Mixin.mixedInFieldImplementedSetter#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldImplementedSetter
+*/
+/*member: _Class&Super&Mixin.mixedInFieldImplementedSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInFieldImplementedSetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInFieldImplementedSetter
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInSetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInSetter=
+*/
+/*member: _Class&Super&Mixin.extendedGetterMixedInSetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedGetterMixedInSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedGetterMixedInSetter=
+*/
+
+/*member: _Class&Super&Mixin.extendedFieldMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _Class&Super&Mixin.extendedFieldMixedInSetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedFieldMixedInSetter=
+*/
+/*member: _Class&Super&Mixin.extendedFieldMixedInSetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.extendedFieldMixedInSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedFieldMixedInSetter=
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterDeclaredField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterImplementedField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedGetterImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedFieldDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedFieldImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredField=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredField=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredField=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterDeclaredField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredField=
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterImplementedField=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedField=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterImplementedField=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterImplementedField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedField=
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredGetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredGetter=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterDeclaredGetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterDeclaredGetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterDeclaredGetter=
+*/
+
+/*member: _Class&Super&Mixin.mixedInSetterImplementedGetter=#cls:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedGetter=
+*/
+/*member: _Class&Super&Mixin.mixedInSetterImplementedGetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInSetterImplementedGetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInSetterImplementedGetter=
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterDeclaredField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterImplementedField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterDeclaredGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _Class&Super&Mixin.extendedSetterImplementedGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: Class:
+ interfaces=[
+ Interface1,
+ Interface2,
+ Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _Class&Super&Mixin]
+*/
+abstract class Class extends Super
+ with Mixin
+ implements Interface1, Interface2 {
+ /*member: Class.extendedGetterMixedInField#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedGetterMixedInField
+ */
+ /*member: Class.extendedGetterMixedInField#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[
+ Mixin.extendedGetterMixedInField,
+ Super.extendedGetterMixedInField],
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedGetterMixedInField
+ */
+ /*member: Class.extendedGetterMixedInField=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedGetterMixedInField=
+ */
+ /*member: Class.extendedGetterMixedInField=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.extendedGetterMixedInField=],
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedGetterMixedInField=
+ */
+
+ /*member: Class.extendedSetterMixedInField#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedSetterMixedInField
+ */
+ /*member: Class.extendedSetterMixedInField#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.extendedSetterMixedInField],
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedSetterMixedInField
+ */
+ /*member: Class.extendedSetterMixedInField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: Class.extendedSetterMixedInGetter#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedSetterMixedInGetter
+ */
+ /*member: Class.extendedSetterMixedInGetter#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.extendedSetterMixedInGetter],
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedSetterMixedInGetter
+ */
+ /*member: Class.extendedSetterMixedInGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: Class.mixedInGetterImplementedField#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInGetterImplementedField
+ */
+ /*member: Class.mixedInGetterImplementedField#int:
+ classBuilder=Class,
+ declarations=[
+ Interface1.mixedInGetterImplementedField,
+ _Class&Super&Mixin.mixedInGetterImplementedField],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInGetterImplementedField
+ */
+ /*member: Class.mixedInGetterImplementedField=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.mixedInGetterImplementedSetter#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInGetterImplementedSetter
+ */
+ /*member: Class.mixedInGetterImplementedSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInGetterImplementedSetter],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInGetterImplementedSetter
+ */
+ /*member: Class.mixedInGetterImplementedSetter=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.mixedInFieldImplementedSetter#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInFieldImplementedSetter
+ */
+ /*member: Class.mixedInFieldImplementedSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInFieldImplementedSetter],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInFieldImplementedSetter
+ */
+ /*member: Class.mixedInFieldImplementedSetter=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.extendedGetterMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedGetterMixedInSetter=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedGetterMixedInSetter=
+ */
+ /*member: Class.extendedGetterMixedInSetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.extendedGetterMixedInSetter=],
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedGetterMixedInSetter=
+ */
+
+ /*member: Class.extendedFieldMixedInSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedFieldMixedInSetter=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedFieldMixedInSetter=
+ */
+ /*member: Class.extendedFieldMixedInSetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.extendedFieldMixedInSetter=],
+ isSynthesized,
+ member=_Class&Super&Mixin.extendedFieldMixedInSetter=
+ */
+
+ /*member: Class.extendedGetterImplementedField#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=Super.extendedGetterImplementedField
+ */
+ /*member: Class.extendedGetterImplementedField#int:
+ classBuilder=Class,
+ declarations=[
+ Interface1.extendedGetterImplementedField,
+ Super.extendedGetterImplementedField],
+ isSynthesized,
+ member=Super.extendedGetterImplementedField
+ */
+ /*member: Class.extendedGetterImplementedField=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.extendedGetterImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedGetterImplementedSetter=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.extendedFieldImplementedSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedFieldImplementedSetter=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.mixedInSetterImplementedField#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.mixedInSetterImplementedField=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterImplementedField=
+ */
+ /*member: Class.mixedInSetterImplementedField=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInSetterImplementedField=],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterImplementedField=
+ */
+
+ /*member: Class.mixedInSetterImplementedGetter#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.mixedInSetterImplementedGetter=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterImplementedGetter=
+ */
+ /*member: Class.mixedInSetterImplementedGetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInSetterImplementedGetter=],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterImplementedGetter=
+ */
+
+ /*member: Class.extendedSetterImplementedField#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedSetterImplementedField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: Class.extendedSetterImplementedGetter#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedSetterImplementedGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: Class.implementedGetterImplementedField#int:
+ classBuilder=Class,
+ declarations=[
+ Interface1.implementedGetterImplementedField,
+ Interface2.implementedGetterImplementedField],
+ isSynthesized,
+ member=Interface1.implementedGetterImplementedField
+ */
+ /*member: Class.implementedGetterImplementedField=#int:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+
+ /*member: Class.implementedGetterImplementedSetter#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.implementedGetterImplementedSetter=#int:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+
+ /*member: Class.implementedFieldImplementedSetter#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.implementedFieldImplementedSetter=#int:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+
+ /*member: Class.implementedSetterImplementedField#int:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Class.implementedSetterImplementedField=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.implementedSetterImplementedGetter#int:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Class.implementedSetterImplementedGetter=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+
+ /*member: Class.extendedGetterDeclaredField#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedGetterDeclaredField],
+ isSourceDeclaration
+ */
+ /*member: Class.extendedGetterDeclaredField=#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedGetterDeclaredField],
+ isSourceDeclaration
+ */
+ int extendedGetterDeclaredField = 0;
+
+ /*member: Class.extendedGetterDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedGetterDeclaredSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedGetterDeclaredSetter],
+ isSourceDeclaration
+ */
+ void set extendedGetterDeclaredSetter(int value) {}
+
+ /*member: Class.extendedFieldDeclaredSetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Class.extendedFieldDeclaredSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedFieldDeclaredSetter],
+ isSourceDeclaration
+ */
+ void set extendedFieldDeclaredSetter(int value) {}
+
+ /*member: Class.extendedSetterDeclaredField#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedSetterDeclaredField=],
+ isSourceDeclaration
+ */
+ /*member: Class.extendedSetterDeclaredField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final String extendedSetterDeclaredField = '';
+
+ /*member: Class.extendedSetterDeclaredGetter#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.extendedSetterDeclaredGetter=],
+ isSourceDeclaration
+ */
+ /*member: Class.extendedSetterDeclaredGetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ String get extendedSetterDeclaredGetter => '';
+
+ /*member: Class.mixedInGetterDeclaredField#cls:
+ classBuilder=Class,
+ declared-overrides=[_Class&Super&Mixin.mixedInGetterDeclaredField],
+ isSourceDeclaration
+ */
+ /*member: Class.mixedInGetterDeclaredField=#cls:
+ classBuilder=Class,
+ declared-overrides=[_Class&Super&Mixin.mixedInGetterDeclaredField],
+ isSourceDeclaration
+ */
+ int mixedInGetterDeclaredField = 0;
+
+ /*member: Class.mixedInGetterDeclaredSetter#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInGetterDeclaredSetter
+ */
+ /*member: Class.mixedInGetterDeclaredSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInGetterDeclaredSetter],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInGetterDeclaredSetter
+ */
+ /*member: Class.mixedInGetterDeclaredSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[_Class&Super&Mixin.mixedInGetterDeclaredSetter],
+ isSourceDeclaration
+ */
+ void set mixedInGetterDeclaredSetter(int value) {}
+
+ /*member: Class.mixedInFieldDeclaredSetter#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInFieldDeclaredSetter
+ */
+ /*member: Class.mixedInFieldDeclaredSetter#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInFieldDeclaredSetter],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInFieldDeclaredSetter
+ */
+ /*member: Class.mixedInFieldDeclaredSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[_Class&Super&Mixin.mixedInFieldDeclaredSetter],
+ isSourceDeclaration
+ */
+ void set mixedInFieldDeclaredSetter(int value) {}
+
+ /*member: Class.mixedInSetterDeclaredField#cls:
+ classBuilder=Class,
+ declared-overrides=[_Class&Super&Mixin.mixedInSetterDeclaredField=],
+ isSourceDeclaration
+ */
+ /*member: Class.mixedInSetterDeclaredField=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterDeclaredField=
+ */
+ /*member: Class.mixedInSetterDeclaredField=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInSetterDeclaredField=],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterDeclaredField=
+ */
+ final String mixedInSetterDeclaredField = '';
+
+ /*member: Class.mixedInSetterDeclaredGetter#cls:
+ classBuilder=Class,
+ declared-overrides=[_Class&Super&Mixin.mixedInSetterDeclaredGetter=],
+ isSourceDeclaration
+ */
+ /*member: Class.mixedInSetterDeclaredGetter=#cls:
+ classBuilder=Class,
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterDeclaredGetter=
+ */
+ /*member: Class.mixedInSetterDeclaredGetter=#int:
+ classBuilder=_Class&Super&Mixin,
+ declarations=[Mixin.mixedInSetterDeclaredGetter=],
+ isSynthesized,
+ member=_Class&Super&Mixin.mixedInSetterDeclaredGetter=
+ */
+ String get mixedInSetterDeclaredGetter => '';
+
+ /*member: Class.implementedGetterDeclaredField#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface1.implementedGetterDeclaredField],
+ isSourceDeclaration
+ */
+ /*member: Class.implementedGetterDeclaredField=#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface1.implementedGetterDeclaredField],
+ isSourceDeclaration
+ */
+ int implementedGetterDeclaredField = 0;
+
+ /*member: Class.implementedGetterDeclaredSetter#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.implementedGetterDeclaredSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface1.implementedGetterDeclaredSetter],
+ isSourceDeclaration
+ */
+ void set implementedGetterDeclaredSetter(int value) {}
+
+ /*member: Class.implementedFieldDeclaredSetter#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Class.implementedFieldDeclaredSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface1.implementedFieldDeclaredSetter],
+ isSourceDeclaration
+ */
+ void set implementedFieldDeclaredSetter(int value) {}
+
+ /*member: Class.implementedSetterDeclaredField#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface1.implementedSetterDeclaredField=],
+ isSourceDeclaration
+ */
+ /*member: Class.implementedSetterDeclaredField=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final String implementedSetterDeclaredField = '';
+
+ /*member: Class.implementedSetterDeclaredGetter#cls:
+ classBuilder=Class,
+ declared-overrides=[Interface1.implementedSetterDeclaredGetter=],
+ isSourceDeclaration
+ */
+
+ /*member: Class.implementedSetterDeclaredGetter=#int:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ String get implementedSetterDeclaredGetter => '';
+
+ /*member: Class.declaredGetterDeclaredSetter#cls:
+ classBuilder=Class,
+ isSourceDeclaration
+ */
+ String get declaredGetterDeclaredSetter => '';
+
+ /*member: Class.declaredGetterDeclaredSetter=#cls:
+ classBuilder=Class,
+ isSourceDeclaration
+ */
+ void set declaredGetterDeclaredSetter(int value) {}
+
+ /*member: Class.declaredFieldDeclaredSetter#cls:
+ classBuilder=Class,
+ isSourceDeclaration
+ */
+ final String declaredFieldDeclaredSetter = '';
+
+ /*member: Class.declaredFieldDeclaredSetter=#cls:
+ classBuilder=Class,
+ isSourceDeclaration
+ */
+ void set declaredFieldDeclaredSetter(int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_field.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_field.dart
new file mode 100644
index 0000000..b68d55b
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_field.dart
@@ -0,0 +1,293 @@
+// 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.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.implementMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.implementMultipleField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int implementMultipleField = 0;
+
+ /*member: Interface1.declareConcreteImplementMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.declareConcreteImplementMultipleField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int declareConcreteImplementMultipleField = 0;
+
+ /*member: Interface1.declareAbstractImplementMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ /*member: Interface1.declareAbstractImplementMultipleField=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.implementMultipleField=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int implementMultipleField = 0;
+
+ /*member: Interface2.declareConcreteImplementMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.declareConcreteImplementMultipleField=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int declareConcreteImplementMultipleField = 0;
+
+ /*member: Interface2.declareAbstractImplementMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ /*member: Interface2.declareAbstractImplementMultipleField=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declareAbstractImplementMultipleField,
+ ConcreteClass.declareAbstractImplementMultipleField=,
+ Interface1.implementMultipleField,
+ Interface1.implementMultipleField=,
+ Interface2.implementMultipleField,
+ Interface2.implementMultipleField=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+ /*member: ConcreteClass.implementMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+ /*member: ConcreteClass.implementMultipleField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementMultipleField=,
+ Interface2.implementMultipleField=],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+
+ /*member: ConcreteClass.declareConcreteImplementMultipleField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleField,
+ Interface1.declareConcreteImplementMultipleField=,
+ Interface2.declareConcreteImplementMultipleField,
+ Interface2.declareConcreteImplementMultipleField=],
+ isSourceDeclaration
+ */
+ /*member: ConcreteClass.declareConcreteImplementMultipleField=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleField,
+ Interface1.declareConcreteImplementMultipleField=,
+ Interface2.declareConcreteImplementMultipleField,
+ Interface2.declareConcreteImplementMultipleField=],
+ isSourceDeclaration
+ */
+ int declareConcreteImplementMultipleField = 0;
+
+ /*member: ConcreteClass.declareAbstractImplementMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField=],
+ isSynthesized
+ */
+ /*member: ConcreteClass.declareAbstractImplementMultipleField=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declareAbstractImplementMultipleField=,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField=],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField=],
+ isSynthesized
+ */
+ abstract int declareAbstractImplementMultipleField;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+ /*member: AbstractClass.implementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+ /*member: AbstractClass.implementMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleField=,
+ Interface2.implementMultipleField=],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+
+ /*member: AbstractClass.declareConcreteImplementMultipleField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleField,
+ Interface1.declareConcreteImplementMultipleField=,
+ Interface2.declareConcreteImplementMultipleField,
+ Interface2.declareConcreteImplementMultipleField=],
+ isSourceDeclaration
+ */
+ /*member: AbstractClass.declareConcreteImplementMultipleField=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleField,
+ Interface1.declareConcreteImplementMultipleField=,
+ Interface2.declareConcreteImplementMultipleField,
+ Interface2.declareConcreteImplementMultipleField=],
+ isSourceDeclaration
+ */
+ int declareConcreteImplementMultipleField = 0;
+
+ /*member: AbstractClass.declareAbstractImplementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField=],
+ isSynthesized
+ */
+ /*member: AbstractClass.declareAbstractImplementMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleField=,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField=],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField=],
+ isSynthesized
+ */
+ abstract int declareAbstractImplementMultipleField;
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.declareAbstractImplementMultipleField,
+ AbstractClass.declareAbstractImplementMultipleField=,
+ AbstractClass.implementMultipleField,
+ AbstractClass.implementMultipleField=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.declareConcreteImplementMultipleField#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+ /*member: ConcreteSub.declareConcreteImplementMultipleField=#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.declareAbstractImplementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ isSynthesized,
+ member=AbstractClass.declareAbstractImplementMultipleField
+ */
+ /*member: ConcreteSub.declareAbstractImplementMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleField=,
+ Interface1.declareAbstractImplementMultipleField=,
+ Interface2.declareAbstractImplementMultipleField=],
+ isSynthesized,
+ member=AbstractClass.declareAbstractImplementMultipleField=
+ */
+
+ /*member: ConcreteSub.implementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+ /*member: ConcreteSub.implementMultipleField=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleField=,
+ Interface2.implementMultipleField=],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_final_field.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_final_field.dart
new file mode 100644
index 0000000..c3a5321
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_final_field.dart
@@ -0,0 +1,175 @@
+// 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.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.implementMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int implementMultipleField = 0;
+
+ /*member: Interface1.declareConcreteImplementMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int declareConcreteImplementMultipleField = 0;
+
+ /*member: Interface1.declareAbstractImplementMultipleField#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ final int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ final int implementMultipleField = 0;
+
+ /*member: Interface2.declareConcreteImplementMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ final int declareConcreteImplementMultipleField = 0;
+
+ /*member: Interface2.declareAbstractImplementMultipleField#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ final int declareAbstractImplementMultipleField = 0;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declareAbstractImplementMultipleField,
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+ /*member: ConcreteClass.implementMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+
+ /*member: ConcreteClass.declareConcreteImplementMultipleField#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleField,
+ Interface2.declareConcreteImplementMultipleField],
+ isSourceDeclaration
+ */
+ final int declareConcreteImplementMultipleField = 0;
+
+ /*member: ConcreteClass.declareAbstractImplementMultipleField#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ isSynthesized
+ */
+ abstract final int declareAbstractImplementMultipleField;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+ /*member: AbstractClass.implementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+
+ /*member: AbstractClass.declareConcreteImplementMultipleField#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleField,
+ Interface2.declareConcreteImplementMultipleField],
+ isSourceDeclaration
+ */
+ final int declareConcreteImplementMultipleField = 0;
+
+ /*member: AbstractClass.declareAbstractImplementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ isSynthesized
+ */
+ abstract final int declareAbstractImplementMultipleField;
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.declareAbstractImplementMultipleField,
+ AbstractClass.implementMultipleField],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.declareConcreteImplementMultipleField#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.declareAbstractImplementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleField,
+ Interface1.declareAbstractImplementMultipleField,
+ Interface2.declareAbstractImplementMultipleField],
+ isSynthesized,
+ member=AbstractClass.declareAbstractImplementMultipleField
+ */
+
+ /*member: ConcreteSub.implementMultipleField#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleField,
+ Interface2.implementMultipleField],
+ isSynthesized,
+ member=Interface1.implementMultipleField
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_getter.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_getter.dart
new file mode 100644
index 0000000..2460469
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_getter.dart
@@ -0,0 +1,175 @@
+// 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.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.implementMultipleGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get implementMultipleGetter => 0;
+
+ /*member: Interface1.declareConcreteImplementMultipleGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get declareConcreteImplementMultipleGetter => 0;
+
+ /*member: Interface1.declareAbstractImplementMultipleGetter#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ int get declareAbstractImplementMultipleGetter => 0;
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementMultipleGetter#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int get implementMultipleGetter => 0;
+
+ /*member: Interface2.declareConcreteImplementMultipleGetter#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int get declareConcreteImplementMultipleGetter => 0;
+
+ /*member: Interface2.declareAbstractImplementMultipleGetter#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ int get declareAbstractImplementMultipleGetter => 0;
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declareAbstractImplementMultipleGetter,
+ Interface1.implementMultipleGetter,
+ Interface2.implementMultipleGetter],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+ /*member: ConcreteClass.implementMultipleGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementMultipleGetter,
+ Interface2.implementMultipleGetter],
+ isSynthesized,
+ member=Interface1.implementMultipleGetter
+ */
+
+ /*member: ConcreteClass.declareConcreteImplementMultipleGetter#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleGetter,
+ Interface2.declareConcreteImplementMultipleGetter],
+ isSourceDeclaration
+ */
+ int get declareConcreteImplementMultipleGetter => 0;
+
+ /*member: ConcreteClass.declareAbstractImplementMultipleGetter#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declareAbstractImplementMultipleGetter,
+ Interface1.declareAbstractImplementMultipleGetter,
+ Interface2.declareAbstractImplementMultipleGetter],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleGetter,
+ Interface2.declareAbstractImplementMultipleGetter],
+ isSynthesized
+ */
+ int get declareAbstractImplementMultipleGetter;
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+ /*member: AbstractClass.implementMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleGetter,
+ Interface2.implementMultipleGetter],
+ isSynthesized,
+ member=Interface1.implementMultipleGetter
+ */
+
+ /*member: AbstractClass.declareConcreteImplementMultipleGetter#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleGetter,
+ Interface2.declareConcreteImplementMultipleGetter],
+ isSourceDeclaration
+ */
+ int get declareConcreteImplementMultipleGetter => 0;
+
+ /*member: AbstractClass.declareAbstractImplementMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleGetter,
+ Interface1.declareAbstractImplementMultipleGetter,
+ Interface2.declareAbstractImplementMultipleGetter],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleGetter,
+ Interface2.declareAbstractImplementMultipleGetter],
+ isSynthesized
+ */
+ int get declareAbstractImplementMultipleGetter;
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.declareAbstractImplementMultipleGetter,
+ AbstractClass.implementMultipleGetter],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.declareConcreteImplementMultipleGetter#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.declareAbstractImplementMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleGetter,
+ Interface1.declareAbstractImplementMultipleGetter,
+ Interface2.declareAbstractImplementMultipleGetter],
+ isSynthesized,
+ member=AbstractClass.declareAbstractImplementMultipleGetter
+ */
+
+ /*member: ConcreteSub.implementMultipleGetter#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleGetter,
+ Interface2.implementMultipleGetter],
+ isSynthesized,
+ member=Interface1.implementMultipleGetter
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_method.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_method.dart
new file mode 100644
index 0000000..99d540c
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_method.dart
@@ -0,0 +1,171 @@
+// 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.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.implementMultipleMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void implementMultipleMethod() {}
+
+ /*member: Interface1.declareConcreteImplementMultipleMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void declareConcreteImplementMultipleMethod() {}
+
+ /*member: Interface1.declareAbstractImplementMultipleMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void declareAbstractImplementMultipleMethod() {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementMultipleMethod#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void implementMultipleMethod() {}
+ /*member: Interface2.declareConcreteImplementMultipleMethod#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void declareConcreteImplementMultipleMethod() {}
+ /*member: Interface2.declareAbstractImplementMultipleMethod#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void declareAbstractImplementMultipleMethod() {}
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declareAbstractImplementMultipleMethod,
+ Interface1.implementMultipleMethod,
+ Interface2.implementMultipleMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+ /*member: ConcreteClass.implementMultipleMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementMultipleMethod,
+ Interface2.implementMultipleMethod],
+ isSynthesized,
+ member=Interface1.implementMultipleMethod
+ */
+
+ /*member: ConcreteClass.declareConcreteImplementMultipleMethod#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleMethod,
+ Interface2.declareConcreteImplementMultipleMethod],
+ isSourceDeclaration
+ */
+ void declareConcreteImplementMultipleMethod() {}
+
+ /*member: ConcreteClass.declareAbstractImplementMultipleMethod#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declareAbstractImplementMultipleMethod,
+ Interface1.declareAbstractImplementMultipleMethod,
+ Interface2.declareAbstractImplementMultipleMethod],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleMethod,
+ Interface2.declareAbstractImplementMultipleMethod],
+ isSynthesized
+ */
+ void declareAbstractImplementMultipleMethod();
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+abstract class AbstractClass implements Interface1, Interface2 {
+ /*member: AbstractClass.implementMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleMethod,
+ Interface2.implementMultipleMethod],
+ isSynthesized,
+ member=Interface1.implementMultipleMethod
+ */
+
+ /*member: AbstractClass.declareConcreteImplementMultipleMethod#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleMethod,
+ Interface2.declareConcreteImplementMultipleMethod],
+ isSourceDeclaration
+ */
+ void declareConcreteImplementMultipleMethod() {}
+
+ /*member: AbstractClass.declareAbstractImplementMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleMethod,
+ Interface1.declareAbstractImplementMultipleMethod,
+ Interface2.declareAbstractImplementMultipleMethod],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleMethod,
+ Interface2.declareAbstractImplementMultipleMethod],
+ isSynthesized
+ */
+ void declareAbstractImplementMultipleMethod();
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.declareAbstractImplementMultipleMethod,
+ AbstractClass.implementMultipleMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.declareConcreteImplementMultipleMethod#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.declareAbstractImplementMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleMethod,
+ Interface1.declareAbstractImplementMultipleMethod,
+ Interface2.declareAbstractImplementMultipleMethod],
+ isSynthesized,
+ member=AbstractClass.declareAbstractImplementMultipleMethod
+ */
+
+ /*member: ConcreteSub.implementMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleMethod,
+ Interface2.implementMultipleMethod],
+ isSynthesized,
+ member=Interface1.implementMultipleMethod
+ */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/implement_multiple_setter.dart b/pkg/front_end/test/class_hierarchy/data/implement_multiple_setter.dart
new file mode 100644
index 0000000..1ddc683
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/implement_multiple_setter.dart
@@ -0,0 +1,176 @@
+// 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.
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface1 {
+ /*member: Interface1.implementMultipleSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set implementMultipleSetter(int i) {}
+
+ /*member: Interface1.declareConcreteImplementMultipleSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set declareConcreteImplementMultipleSetter(int i) {}
+
+ /*member: Interface1.declareAbstractImplementMultipleSetter=#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void set declareAbstractImplementMultipleSetter(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface2 {
+ /*member: Interface2.implementMultipleSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set implementMultipleSetter(int i) {}
+
+ /*member: Interface2.declareConcreteImplementMultipleSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set declareConcreteImplementMultipleSetter(int i) {}
+
+ /*member: Interface2.declareAbstractImplementMultipleSetter=#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void set declareAbstractImplementMultipleSetter(int i) {}
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ ConcreteClass.declareAbstractImplementMultipleSetter=,
+ Interface1.implementMultipleSetter=,
+ Interface2.implementMultipleSetter=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class ConcreteClass implements Interface1, Interface2 {
+ /*member: ConcreteClass.implementMultipleSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ Interface1.implementMultipleSetter=,
+ Interface2.implementMultipleSetter=],
+ isSynthesized,
+ member=Interface1.implementMultipleSetter=
+ */
+
+ /*member: ConcreteClass.declareConcreteImplementMultipleSetter=#cls:
+ classBuilder=ConcreteClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleSetter=,
+ Interface2.declareConcreteImplementMultipleSetter=],
+ isSourceDeclaration
+ */
+ void set declareConcreteImplementMultipleSetter(int i) {}
+
+ /*member: ConcreteClass.declareAbstractImplementMultipleSetter=#int:
+ classBuilder=ConcreteClass,
+ declarations=[
+ ConcreteClass.declareAbstractImplementMultipleSetter=,
+ Interface1.declareAbstractImplementMultipleSetter=,
+ Interface2.declareAbstractImplementMultipleSetter=],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleSetter=,
+ Interface2.declareAbstractImplementMultipleSetter=],
+ isSynthesized
+ */
+ void set declareAbstractImplementMultipleSetter(int i);
+}
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+abstract class AbstractClass implements Interface1, Interface2 {
+ /*member: AbstractClass.implementMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleSetter=,
+ Interface2.implementMultipleSetter=],
+ isSynthesized,
+ member=Interface1.implementMultipleSetter=
+ */
+
+ /*member: AbstractClass.declareConcreteImplementMultipleSetter=#cls:
+ classBuilder=AbstractClass,
+ declared-overrides=[
+ Interface1.declareConcreteImplementMultipleSetter=,
+ Interface2.declareConcreteImplementMultipleSetter=],
+ isSourceDeclaration
+ */
+ void set declareConcreteImplementMultipleSetter(int i) {}
+
+ /*member: AbstractClass.declareAbstractImplementMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleSetter=,
+ Interface1.declareAbstractImplementMultipleSetter=,
+ Interface2.declareAbstractImplementMultipleSetter=],
+ declared-overrides=[
+ Interface1.declareAbstractImplementMultipleSetter=,
+ Interface2.declareAbstractImplementMultipleSetter=],
+ isSynthesized
+ */
+ void set declareAbstractImplementMultipleSetter(int i);
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.declareAbstractImplementMultipleSetter=,
+ AbstractClass.implementMultipleSetter=],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ AbstractClass,
+ Object]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.declareConcreteImplementMultipleSetter=#cls:
+ classBuilder=AbstractClass,
+ isSourceDeclaration
+ */
+
+ /*member: ConcreteSub.declareAbstractImplementMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ AbstractClass.declareAbstractImplementMultipleSetter=,
+ Interface1.declareAbstractImplementMultipleSetter=,
+ Interface2.declareAbstractImplementMultipleSetter=],
+ isSynthesized,
+ member=AbstractClass.declareAbstractImplementMultipleSetter=
+ */
+
+ /*member: ConcreteSub.implementMultipleSetter=#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementMultipleSetter=,
+ Interface2.implementMultipleSetter=],
+ isSynthesized,
+ member=Interface1.implementMultipleSetter=
+ */
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/in_out_in/in.dart b/pkg/front_end/test/class_hierarchy/data/in_out_in/in.dart
new file mode 100644
index 0000000..2c7d774
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/in_out_in/in.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.method#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int method(int i) => i;
+}
+
+/*class: SuperQ:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class SuperQ {
+ /*member: SuperQ.method#cls:
+ classBuilder=SuperQ,
+ isSourceDeclaration
+ */
+ int? method(int? i) => i;
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/in_out_in/main.dart b/pkg/front_end/test/class_hierarchy/data/in_out_in/main.dart
new file mode 100644
index 0000000..1eb489c
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/in_out_in/main.dart
@@ -0,0 +1,59 @@
+// 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 'in.dart';
+import 'out.dart';
+
+/*class: Class:
+ interfaces=[SuperQ],
+ maxInheritancePath=3,
+ superclasses=[
+ LegacyClass,
+ Object,
+ Super]
+*/
+class Class extends LegacyClass implements SuperQ {
+ /*member: Class.method#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.method],
+ isSynthesized,
+ member=Super.method
+ */
+ /*member: Class.method#int:
+ classBuilder=Class,
+ covariance=Covariance.empty(),
+ declarations=[
+ LegacyClass.method,
+ SuperQ.method],
+ isSynthesized,
+ memberSignature,
+ type=int? Function(int?)
+ */
+}
+
+/*class: ClassQ:
+ interfaces=[Super],
+ maxInheritancePath=3,
+ superclasses=[
+ LegacyClassQ,
+ Object,
+ SuperQ]
+*/
+/*member: ClassQ.method#cls:
+ classBuilder=ClassQ,
+ inherited-implements=[ClassQ.method],
+ isSynthesized,
+ member=SuperQ.method
+*/
+/*member: ClassQ.method#int:
+ classBuilder=ClassQ,
+ covariance=Covariance.empty(),
+ declarations=[
+ LegacyClassQ.method,
+ Super.method],
+ isSynthesized,
+ memberSignature,
+ type=int Function(int)
+*/
+class ClassQ extends LegacyClassQ implements Super {}
diff --git a/pkg/front_end/test/class_hierarchy/data/in_out_in/out.dart b/pkg/front_end/test/class_hierarchy/data/in_out_in/out.dart
new file mode 100644
index 0000000..ddfc71b
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/in_out_in/out.dart
@@ -0,0 +1,51 @@
+// 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=2.9
+
+import 'in.dart';
+
+/*class: LegacyClass:
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+class LegacyClass extends Super {
+ /*member: LegacyClass.method#cls:
+ classBuilder=LegacyClass,
+ isSynthesized,
+ member=Super.method
+ */
+ /*member: LegacyClass.method#int:
+ classBuilder=LegacyClass,
+ covariance=Covariance.empty(),
+ declarations=[Super.method],
+ isSynthesized,
+ memberSignature,
+ type=int* Function(int*)*
+ */
+}
+
+/*class: LegacyClassQ:
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ SuperQ]
+*/
+class LegacyClassQ extends SuperQ {
+ /*member: LegacyClassQ.method#cls:
+ classBuilder=LegacyClassQ,
+ isSynthesized,
+ member=SuperQ.method
+ */
+ /*member: LegacyClassQ.method#int:
+ classBuilder=LegacyClassQ,
+ covariance=Covariance.empty(),
+ declarations=[SuperQ.method],
+ isSynthesized,
+ memberSignature,
+ type=int* Function(int*)*
+ */
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/infer_parameter_opt_out.dart b/pkg/front_end/test/class_hierarchy/data/infer_parameter_opt_out.dart
new file mode 100644
index 0000000..4c1858f
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/infer_parameter_opt_out.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+/*class: A:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class A {
+ /*member: A.method#cls:
+ classBuilder=A,
+ isSourceDeclaration
+ */
+ dynamic method(dynamic o, {dynamic named}) {}
+}
+
+/*class: B:
+ maxInheritancePath=2,
+ superclasses=[
+ A,
+ Object]
+*/
+abstract class B extends A {
+ /*member: B.method#cls:
+ classBuilder=B,
+ isSynthesized,
+ member=A.method
+ */
+ /*member: B.method#int:
+ classBuilder=B,
+ declarations=[
+ A.method,
+ B.method],
+ declared-overrides=[A.method],
+ isSynthesized
+ */
+ Object method(Object o, {Object named});
+}
+
+/*class: C1:
+ interfaces=[B],
+ maxInheritancePath=3,
+ superclasses=[
+ A,
+ Object]
+*/
+class C1 extends A implements B {
+ /*member: C1.method#cls:
+ classBuilder=C1,
+ declared-overrides=[
+ A.method,
+ B.method],
+ isSourceDeclaration
+ */
+ method(o, {named}) {}
+}
+
+/*class: C2:
+ maxInheritancePath=3,
+ superclasses=[
+ A,
+ B,
+ Object]
+*/
+class C2 extends B implements A {
+ /*member: C2.method#cls:
+ classBuilder=C2,
+ declared-overrides=[
+ A.method,
+ B.method],
+ isSourceDeclaration
+ */
+ method(o, {named}) {}
+}
+
+/*class: C3:
+ interfaces=[
+ A,
+ B],
+ maxInheritancePath=3,
+ superclasses=[Object]
+*/
+class C3 implements A, B {
+ /*member: C3.method#cls:
+ classBuilder=C3,
+ declared-overrides=[
+ A.method,
+ B.method],
+ isSourceDeclaration
+ */
+ method(o, {named}) {}
+}
+
+/*class: C4:
+ interfaces=[
+ A,
+ B],
+ maxInheritancePath=3,
+ superclasses=[Object]
+*/
+class C4 implements B, A {
+ /*member: C4.method#cls:
+ classBuilder=C4,
+ declared-overrides=[
+ A.method,
+ B.method],
+ isSourceDeclaration
+ */
+ method(o, {named}) {}
+}
+
+/*class: D:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class D {
+ /*member: D.==#int:
+ classBuilder=D,
+ declarations=[
+ D.==,
+ Object.==],
+ declared-overrides=[Object.==],
+ isSynthesized
+ */
+ bool operator ==(Object other);
+}
+
+/*class: F:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class F {}
+
+/*class: E:
+ interfaces=[
+ D,
+ F],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class E implements D, F {
+ /*member: E.==#cls:
+ classBuilder=E,
+ declared-overrides=[
+ D.==,
+ F.==,
+ Object.==],
+ isSourceDeclaration
+ */
+ bool operator ==(other) => true;
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/late.dart b/pkg/front_end/test/class_hierarchy/data/late.dart
new file mode 100644
index 0000000..5b0ff6a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/late.dart
@@ -0,0 +1,44 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Interface {
+ /*member: Interface.implementedLateFieldDeclaredGetterSetter#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.implementedLateFieldDeclaredGetterSetter=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ late int implementedLateFieldDeclaredGetterSetter;
+}
+
+/*class: Class:
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class Class implements Interface {
+/*member: Class.implementedLateFieldDeclaredGetterSetter#cls:
+ classBuilder=Class,
+ declared-overrides=[
+ Interface.implementedLateFieldDeclaredGetterSetter,
+ Interface.implementedLateFieldDeclaredGetterSetter=],
+ isSourceDeclaration
+*/
+ int get implementedLateFieldDeclaredGetterSetter => 0;
+
+/*member: Class.implementedLateFieldDeclaredGetterSetter=#cls:
+ classBuilder=Class,
+ declared-overrides=[
+ Interface.implementedLateFieldDeclaredGetterSetter,
+ Interface.implementedLateFieldDeclaredGetterSetter=],
+ isSourceDeclaration
+*/
+ void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/marker.options b/pkg/front_end/test/class_hierarchy/data/marker.options
new file mode 100644
index 0000000..8b2da11
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/marker.options
@@ -0,0 +1 @@
+cfe:nnbd=pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
diff --git a/pkg/front_end/test/class_hierarchy/data/member_signatures/lib.dart b/pkg/front_end/test/class_hierarchy/data/member_signatures/lib.dart
new file mode 100644
index 0000000..af6c533
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/member_signatures/lib.dart
@@ -0,0 +1,75 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Super {
+ /*member: Super.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMethod(int i) {}
+
+ /*member: Super.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMethod(int i);
+
+ /*member: Super.extendedConcreteImplementedMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMethod(int i) {}
+
+ /*member: Super.extendedAbstractImplementedMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMethod(int i);
+}
+
+/*class: Interface1:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface1 {
+ /*member: Interface1.extendedConcreteImplementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedConcreteImplementedMethod(int i) {}
+
+ /*member: Interface1.extendedAbstractImplementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void extendedAbstractImplementedMethod(int i) {}
+
+ /*member: Interface1.implementedMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void implementedMethod(int i) {}
+
+ /*member: Interface1.implementedMultipleMethod#cls:
+ classBuilder=Interface1,
+ isSourceDeclaration
+ */
+ void implementedMultipleMethod(int i) {}
+}
+
+/*class: Interface2:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface2 {
+ /*member: Interface2.implementedMultipleMethod#cls:
+ classBuilder=Interface2,
+ isSourceDeclaration
+ */
+ void implementedMultipleMethod(int i) {}
+}
diff --git a/pkg/front_end/test/class_hierarchy/data/member_signatures/main.dart b/pkg/front_end/test/class_hierarchy/data/member_signatures/main.dart
new file mode 100644
index 0000000..a7260ed
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/member_signatures/main.dart
@@ -0,0 +1,364 @@
+// 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=2.9
+
+import 'lib.dart';
+
+/*class: AbstractClass:
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Super,
+ Object]
+*/
+abstract class AbstractClass extends Super implements Interface1, Interface2 {
+ /*member: AbstractClass.extendedConcreteMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+ */
+ /*member: AbstractClass.extendedConcreteMethod#int:
+ classBuilder=AbstractClass,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedConcreteMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: AbstractClass.extendedAbstractMethod#int:
+ classBuilder=AbstractClass,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedAbstractMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: AbstractClass.extendedConcreteImplementedMethod#cls:
+ classBuilder=AbstractClass,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+ /*member: AbstractClass.extendedConcreteImplementedMethod#int:
+ classBuilder=AbstractClass,
+ covariance=Covariance.empty(),
+ declarations=[
+ Interface1.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: AbstractClass.extendedAbstractImplementedMethod#int:
+ classBuilder=AbstractClass,
+ covariance=Covariance.empty(),
+ declarations=[
+ Interface1.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: AbstractClass.implementedMethod#int:
+ classBuilder=AbstractClass,
+ covariance=Covariance.empty(),
+ declarations=[Interface1.implementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: AbstractClass.implementedMultipleMethod#int:
+ classBuilder=AbstractClass,
+ covariance=Covariance.empty(),
+ declarations=[
+ Interface1.implementedMultipleMethod,
+ Interface2.implementedMultipleMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+}
+
+/*class: ConcreteSub:
+ abstractMembers=[
+ AbstractClass.extendedAbstractImplementedMethod,
+ AbstractClass.extendedAbstractMethod,
+ AbstractClass.implementedMethod,
+ AbstractClass.implementedMultipleMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=3,
+ superclasses=[
+ Super,
+ AbstractClass,
+ Object]
+*/
+class ConcreteSub extends AbstractClass {
+ /*member: ConcreteSub.extendedConcreteMethod#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+ */
+ /*member: ConcreteSub.extendedConcreteMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[Super.extendedConcreteMethod],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteMethod
+ */
+
+ /*member: ConcreteSub.extendedAbstractMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[Super.extendedAbstractMethod],
+ isSynthesized,
+ member=AbstractClass.extendedAbstractMethod
+ */
+
+ /*member: ConcreteSub.extendedConcreteImplementedMethod#cls:
+ classBuilder=ConcreteSub,
+ inherited-implements=[AbstractClass.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+ /*member: ConcreteSub.extendedConcreteImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=AbstractClass.extendedConcreteImplementedMethod
+ */
+
+ /*member: ConcreteSub.extendedAbstractImplementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ member=AbstractClass.extendedAbstractImplementedMethod
+ */
+
+ /*member: ConcreteSub.implementedMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[Interface1.implementedMethod],
+ isSynthesized,
+ member=AbstractClass.implementedMethod
+ */
+
+ /*member: ConcreteSub.implementedMultipleMethod#int:
+ classBuilder=AbstractClass,
+ declarations=[
+ Interface1.implementedMultipleMethod,
+ Interface2.implementedMultipleMethod],
+ isSynthesized,
+ member=AbstractClass.implementedMultipleMethod
+ */
+}
+
+/*class: ConcreteClass:
+ abstractMembers=[
+ Super.extendedAbstractImplementedMethod,
+ Super.extendedAbstractMethod,
+ Interface1.extendedAbstractImplementedMethod,
+ Interface1.implementedMethod,
+ Interface1.implementedMultipleMethod,
+ Interface2.implementedMultipleMethod],
+ interfaces=[
+ Interface1,
+ Interface2],
+ maxInheritancePath=2,
+ superclasses=[
+ Super,
+ Object]
+*/
+class ConcreteClass extends Super implements Interface1, Interface2 {
+ /*member: ConcreteClass.extendedConcreteMethod#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+ */
+ /*member: ConcreteClass.extendedConcreteMethod#int:
+ classBuilder=ConcreteClass,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedConcreteMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: ConcreteClass.extendedAbstractMethod#int:
+ classBuilder=ConcreteClass,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedAbstractMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: ConcreteClass.extendedConcreteImplementedMethod#cls:
+ classBuilder=ConcreteClass,
+ inherited-implements=[ConcreteClass.extendedConcreteImplementedMethod],
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+ */
+ /*member: ConcreteClass.extendedConcreteImplementedMethod#int:
+ classBuilder=ConcreteClass,
+ covariance=Covariance.empty(),
+ declarations=[
+ Interface1.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: ConcreteClass.extendedAbstractImplementedMethod#int:
+ classBuilder=ConcreteClass,
+ covariance=Covariance.empty(),
+ declarations=[
+ Interface1.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: ConcreteClass.implementedMethod#int:
+ classBuilder=ConcreteClass,
+ covariance=Covariance.empty(),
+ declarations=[Interface1.implementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+
+ /*member: ConcreteClass.implementedMultipleMethod#int:
+ classBuilder=ConcreteClass,
+ covariance=Covariance.empty(),
+ declarations=[
+ Interface1.implementedMultipleMethod,
+ Interface2.implementedMultipleMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+ */
+}
+
+/*class: OptOutInterface:
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+/*member: OptOutInterface.extendedConcreteImplementedMethod#cls:
+ classBuilder=OptOutInterface,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+*/
+/*member: OptOutInterface.extendedConcreteImplementedMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: OptOutInterface.extendedAbstractImplementedMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: OptOutInterface.extendedConcreteMethod#cls:
+ classBuilder=OptOutInterface,
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+*/
+/*member: OptOutInterface.extendedConcreteMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedConcreteMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: OptOutInterface.extendedAbstractMethod#int:
+ classBuilder=OptOutInterface,
+ covariance=Covariance.empty(),
+ declarations=[Super.extendedAbstractMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+abstract class OptOutInterface extends Super {}
+
+/*class: ClassImplementsOptOut:
+ interfaces=[OptOutInterface],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super]
+*/
+/*member: ClassImplementsOptOut.extendedConcreteImplementedMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+ OptOutInterface.extendedConcreteImplementedMethod,
+ Super.extendedConcreteImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: ClassImplementsOptOut.extendedAbstractImplementedMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+ OptOutInterface.extendedAbstractImplementedMethod,
+ Super.extendedAbstractImplementedMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: ClassImplementsOptOut.extendedConcreteMethod#cls:
+ classBuilder=ClassImplementsOptOut,
+ isSynthesized,
+ member=Super.extendedConcreteMethod
+*/
+/*member: ClassImplementsOptOut.extendedConcreteImplementedMethod#cls:
+ classBuilder=ClassImplementsOptOut,
+ isSynthesized,
+ member=Super.extendedConcreteImplementedMethod
+*/
+/*member: ClassImplementsOptOut.extendedConcreteMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+ OptOutInterface.extendedConcreteMethod,
+ Super.extendedConcreteMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+/*member: ClassImplementsOptOut.extendedAbstractMethod#int:
+ classBuilder=ClassImplementsOptOut,
+ covariance=Covariance.empty(),
+ declarations=[
+ OptOutInterface.extendedAbstractMethod,
+ Super.extendedAbstractMethod],
+ isSynthesized,
+ memberSignature,
+ type=void Function(int*)*
+*/
+abstract class ClassImplementsOptOut extends Super implements OptOutInterface {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_field.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_field.dart
new file mode 100644
index 0000000..01f7b92
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_field.dart
@@ -0,0 +1,765 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractField,
+ Super.extendedAbstractField=,
+ Super.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteField = 0;
+
+ /*member: Super.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractField;
+
+ /*member: Super.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteMixedInConcreteField = 0;
+
+ /*member: Super.extendedAbstractMixedInConcreteField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractMixedInConcreteField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractMixedInConcreteField;
+
+ /*member: Super.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedConcreteMixedInAbstractField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int extendedConcreteMixedInAbstractField = 0;
+
+ /*member: Super.extendedAbstractMixedInAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: Super.extendedAbstractMixedInAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractMixedInAbstractField;
+}
+
+/*class: Mixin:
+ abstractMembers=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Mixin.extendedConcreteMixedInAbstractField,
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Mixin.mixedInAbstractField,
+ Mixin.mixedInAbstractField=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+ /*member: Mixin.mixedInConcreteField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.mixedInConcreteField=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int mixedInConcreteField = 0;
+
+ /*member: Mixin.mixedInAbstractField#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.mixedInAbstractField=#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ abstract int mixedInAbstractField;
+
+ /*member: Mixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int extendedConcreteMixedInConcreteField = 0;
+
+ /*member: Mixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.extendedAbstractMixedInConcreteField=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int extendedAbstractMixedInConcreteField = 0;
+
+ /*member: Mixin.extendedConcreteMixedInAbstractField#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.extendedConcreteMixedInAbstractField=#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ abstract int extendedConcreteMixedInAbstractField;
+
+ /*member: Mixin.extendedAbstractMixedInAbstractField#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ /*member: Mixin.extendedAbstractMixedInAbstractField=#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ abstract int extendedAbstractMixedInAbstractField;
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/ /*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField=,
+ Super.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField=,
+ Super.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField=]
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.mixedInAbstractField,
+ Mixin.mixedInAbstractField=]
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.mixedInAbstractField,
+ Mixin.mixedInAbstractField=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField=]
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+ Super.extendedAbstractField,
+ Super.extendedAbstractField=,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField=,
+ _ClassMixin&Super&Mixin.mixedInAbstractField,
+ _ClassMixin&Super&Mixin.mixedInAbstractField=],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+ /*member: ClassMixin.mixedInConcreteField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteField
+ */
+ /*member: ClassMixin.mixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteField
+ */
+ /*member: ClassMixin.mixedInConcreteField=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteField=
+ */
+ /*member: ClassMixin.mixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteField=
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=
+ */
+ /*member: ClassMixin.extendedConcreteMixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField=,
+ Super.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField=
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+ */
+ /*member: ClassMixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+ */
+ /*member: ClassMixin.extendedAbstractMixedInConcreteField=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=
+ */
+ /*member: ClassMixin.extendedAbstractMixedInConcreteField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField=,
+ Super.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField=
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractField=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField=
+ */
+
+ /*member: ClassMixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ClassMixin.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ClassMixin.mixedInAbstractField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractField
+ */
+ /*member: ClassMixin.mixedInAbstractField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractField=
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInAbstractField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField
+ */
+ /*member: ClassMixin.extendedAbstractMixedInAbstractField=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField=
+ */
+
+ /*member: ClassMixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ /*member: ClassMixin.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+ NamedMixin.extendedAbstractMixedInAbstractField,
+ NamedMixin.extendedAbstractMixedInAbstractField=,
+ NamedMixin.mixedInAbstractField,
+ NamedMixin.mixedInAbstractField=,
+ Super.extendedAbstractField,
+ Super.extendedAbstractField=],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.mixedInConcreteField,
+ Mixin.mixedInConcreteField=],
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.mixedInConcreteField,
+ Mixin.mixedInConcreteField=],
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Mixin.extendedConcreteMixedInConcreteField=,
+ Super.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField=],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Mixin.extendedConcreteMixedInConcreteField=,
+ Super.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField=],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField=,
+ Super.extendedConcreteMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Mixin.extendedAbstractMixedInConcreteField=,
+ Super.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField=],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Mixin.extendedAbstractMixedInConcreteField=,
+ Super.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField=],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField=,
+ Super.extendedAbstractMixedInConcreteField=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField=]
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField=#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Mixin.extendedConcreteMixedInAbstractField=,
+ Super.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField=]
+*/
+
+/*member: NamedMixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.extendedConcreteField=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.mixedInAbstractField,
+ Mixin.mixedInAbstractField=]
+*/
+/*member: NamedMixin.mixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.mixedInAbstractField,
+ Mixin.mixedInAbstractField=]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField=]
+*/
+/*member: NamedMixin.extendedAbstractMixedInAbstractField=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Mixin.extendedAbstractMixedInAbstractField=,
+ Super.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField=]
+*/
+
+/*member: NamedMixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.extendedAbstractField=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_final_field.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_final_field.dart
new file mode 100644
index 0000000..b1e0208
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_final_field.dart
@@ -0,0 +1,413 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractField,
+ Super.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInConcreteField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final int extendedConcreteField = 0;
+
+ /*member: Super.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractField;
+
+ /*member: Super.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final int extendedConcreteMixedInConcreteField = 0;
+
+ /*member: Super.extendedAbstractMixedInConcreteField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractMixedInConcreteField;
+
+ /*member: Super.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ final int extendedConcreteMixedInAbstractField = 0;
+
+ /*member: Super.extendedAbstractMixedInAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractMixedInAbstractField;
+}
+
+/*class: Mixin:
+ abstractMembers=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Mixin.extendedConcreteMixedInAbstractField,
+ Mixin.mixedInAbstractField],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+ /*member: Mixin.mixedInConcreteField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ final int mixedInConcreteField = 0;
+
+ /*member: Mixin.mixedInAbstractField#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ abstract final int mixedInAbstractField;
+
+ /*member: Mixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ final int extendedConcreteMixedInConcreteField = 0;
+
+ /*member: Mixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ final int extendedAbstractMixedInConcreteField = 0;
+
+ /*member: Mixin.extendedConcreteMixedInAbstractField#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ abstract final int extendedConcreteMixedInAbstractField;
+
+ /*member: Mixin.extendedAbstractMixedInAbstractField#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ abstract final int extendedAbstractMixedInAbstractField;
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractField]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+ Super.extendedAbstractField,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField,
+ _ClassMixin&Super&Mixin.mixedInAbstractField],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+ /*member: ClassMixin.mixedInConcreteField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteField
+ */
+ /*member: ClassMixin.mixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteField
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteField
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+ */
+ /*member: ClassMixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteField
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractField
+ */
+
+ /*member: ClassMixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ClassMixin.mixedInAbstractField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractField
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInAbstractField#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractField
+ */
+
+ /*member: ClassMixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+ NamedMixin.extendedAbstractMixedInAbstractField,
+ NamedMixin.mixedInAbstractField,
+ Super.extendedAbstractField],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteField],
+ stubTarget=Mixin.mixedInConcreteField
+*/
+/*member: NamedMixin.mixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteField,
+ Super.extendedConcreteMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteField#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteField,
+ Super.extendedAbstractMixedInConcreteField],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteField
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractField
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractField,
+ Super.extendedConcreteMixedInAbstractField]
+*/
+
+/*member: NamedMixin.extendedConcreteField#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractField]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractField#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractField,
+ Super.extendedAbstractMixedInAbstractField]
+*/
+
+/*member: NamedMixin.extendedAbstractField#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_getter.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_getter.dart
new file mode 100644
index 0000000..e4edc5c
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_getter.dart
@@ -0,0 +1,412 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractGetter,
+ Super.extendedAbstractMixedInAbstractGetter,
+ Super.extendedAbstractMixedInConcreteGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedConcreteGetter => 0;
+
+ /*member: Super.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedAbstractGetter;
+
+ /*member: Super.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedConcreteMixedInConcreteGetter => 0;
+
+ /*member: Super.extendedAbstractMixedInConcreteGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedAbstractMixedInConcreteGetter;
+
+ /*member: Super.extendedConcreteMixedInAbstractGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedConcreteMixedInAbstractGetter => 0;
+
+ /*member: Super.extendedAbstractMixedInAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ int get extendedAbstractMixedInAbstractGetter;
+}
+
+/*class: Mixin:
+ abstractMembers=[
+ Mixin.extendedAbstractMixedInAbstractGetter,
+ Mixin.extendedConcreteMixedInAbstractGetter,
+ Mixin.mixedInAbstractGetter],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+ /*member: Mixin.mixedInConcreteGetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int get mixedInConcreteGetter => 0;
+
+ /*member: Mixin.mixedInAbstractGetter#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int get mixedInAbstractGetter;
+
+ /*member: Mixin.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int get extendedConcreteMixedInConcreteGetter => 0;
+
+ /*member: Mixin.extendedAbstractMixedInConcreteGetter#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int get extendedAbstractMixedInConcreteGetter => 0;
+
+ /*member: Mixin.extendedConcreteMixedInAbstractGetter#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int get extendedConcreteMixedInAbstractGetter;
+
+ /*member: Mixin.extendedAbstractMixedInAbstractGetter#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ int get extendedAbstractMixedInAbstractGetter;
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteGetter,
+ Super.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteGetter,
+ Super.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractGetter
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractGetter,
+ Super.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractGetter,
+ Super.extendedConcreteMixedInAbstractGetter]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractGetter]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractGetter,
+ Super.extendedAbstractMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractGetter,
+ Super.extendedAbstractMixedInAbstractGetter]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+ Super.extendedAbstractGetter,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractGetter,
+ _ClassMixin&Super&Mixin.mixedInAbstractGetter],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+ /*member: ClassMixin.mixedInConcreteGetter#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteGetter
+ */
+ /*member: ClassMixin.mixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteGetter
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter
+ */
+ /*member: ClassMixin.extendedConcreteMixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteGetter,
+ Super.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteGetter
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInConcreteGetter#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter
+ */
+ /*member: ClassMixin.extendedAbstractMixedInConcreteGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteGetter,
+ Super.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteGetter
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInAbstractGetter#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractGetter
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractGetter,
+ Super.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractGetter
+ */
+
+ /*member: ClassMixin.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ClassMixin.mixedInAbstractGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractGetter
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInAbstractGetter#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractGetter,
+ Super.extendedAbstractMixedInAbstractGetter],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractGetter
+ */
+
+ /*member: ClassMixin.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+ NamedMixin.extendedAbstractMixedInAbstractGetter,
+ NamedMixin.mixedInAbstractGetter,
+ Super.extendedAbstractGetter],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteGetter#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteGetter],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteGetter],
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+/*member: NamedMixin.mixedInConcreteGetter#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteGetter
+*/
+/*member: NamedMixin.mixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractGetter]
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteGetter#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteGetter,
+ Super.extendedConcreteMixedInConcreteGetter],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteGetter#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteGetter,
+ Super.extendedConcreteMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteGetter
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteGetter#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteGetter,
+ Super.extendedAbstractMixedInConcreteGetter],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteGetter#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteGetter,
+ Super.extendedAbstractMixedInConcreteGetter],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteGetter
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractGetter#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractGetter
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractGetter,
+ Super.extendedConcreteMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractGetter,
+ Super.extendedConcreteMixedInAbstractGetter]
+*/
+
+/*member: NamedMixin.extendedConcreteGetter#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractGetter#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractGetter,
+ Super.extendedAbstractMixedInAbstractGetter],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractGetter,
+ Super.extendedAbstractMixedInAbstractGetter]
+*/
+
+/*member: NamedMixin.extendedAbstractGetter#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_method.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_method.dart
new file mode 100644
index 0000000..9e80172
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_method.dart
@@ -0,0 +1,403 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMethod() {}
+
+ /*member: Super.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMethod();
+
+ /*member: Super.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInConcreteMethod() {}
+
+ /*member: Super.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInConcreteMethod();
+
+ /*member: Super.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInAbstractMethod() {}
+
+ /*member: Super.extendedAbstractMixedInAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInAbstractMethod();
+}
+
+/*class: Mixin:
+ abstractMembers=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Mixin.mixedInAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+ /*member: Mixin.mixedInConcreteMethod#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void mixedInConcreteMethod() {}
+
+ /*member: Mixin.mixedInAbstractMethod#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void mixedInAbstractMethod();
+
+ /*member: Mixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInConcreteMethod() {}
+
+ /*member: Mixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInConcreteMethod() {}
+
+ /*member: Mixin.extendedConcreteMixedInAbstractMethod#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInAbstractMethod();
+
+ /*member: Mixin.extendedAbstractMixedInAbstractMethod#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInAbstractMethod();
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+ Super.extendedAbstractMethod,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod,
+ _ClassMixin&Super&Mixin.mixedInAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _ClassMixin&Super&Mixin]
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: ClassMixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class ClassMixin extends Super with Mixin {
+ /*member: ClassMixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+ */
+
+ /*member: ClassMixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod
+ */
+
+ /*member: ClassMixin.mixedInConcreteMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+ */
+
+ /*member: ClassMixin.mixedInAbstractMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractMethod
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInAbstractMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod
+ */
+
+ /*member: ClassMixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+ NamedMixin.extendedAbstractMixedInAbstractMethod,
+ NamedMixin.mixedInAbstractMethod,
+ Super.extendedAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod]
+*/
+/*member: NamedMixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod]
+*/
+/*member: NamedMixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: NamedMixin.mixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteMethod],
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: NamedMixin.mixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class NamedMixin = Super with Mixin;
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_override.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_override.dart
new file mode 100644
index 0000000..2f8edef
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_override.dart
@@ -0,0 +1,411 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMethod() {}
+
+ /*member: Super.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMethod();
+
+ /*member: Super.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInConcreteMethod() {}
+
+ /*member: Super.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInConcreteMethod();
+
+ /*member: Super.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInAbstractMethod() {}
+
+ /*member: Super.extendedAbstractMixedInAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInAbstractMethod();
+}
+
+/*class: Mixin:
+ abstractMembers=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Mixin.mixedInAbstractMethod],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+ /*member: Mixin.mixedInConcreteMethod#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void mixedInConcreteMethod(int i) {}
+
+ /*member: Mixin.mixedInAbstractMethod#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void mixedInAbstractMethod(int i);
+
+ /*member: Mixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInConcreteMethod(int i) {}
+
+ /*member: Mixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInConcreteMethod(int i) {}
+
+ /*member: Mixin.extendedConcreteMixedInAbstractMethod#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedConcreteMixedInAbstractMethod(int i);
+
+ /*member: Mixin.extendedAbstractMixedInAbstractMethod#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void extendedAbstractMixedInAbstractMethod(int i);
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+ Super.extendedAbstractMethod,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod,
+ _ClassMixin&Super&Mixin.mixedInAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _ClassMixin&Super&Mixin]
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: ClassMixin.mixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: ClassMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class ClassMixin extends Super with Mixin {
+ /*member: ClassMixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteMethod
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractMethod
+ */
+
+ /*member: ClassMixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ClassMixin.mixedInAbstractMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractMethod
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInAbstractMethod#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractMethod
+ */
+
+ /*member: ClassMixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: _ClassMixin&Super&Mixin.mixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+ */
+
+ /*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+ */
+
+ /*member: ClassMixin.mixedInConcreteMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteMethod
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteMethod
+ */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+ NamedMixin.extendedAbstractMixedInAbstractMethod,
+ NamedMixin.mixedInAbstractMethod,
+ Super.extendedAbstractMethod],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractMethod
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractMethod,
+ Super.extendedConcreteMixedInAbstractMethod]
+*/
+
+/*member: NamedMixin.extendedConcreteMethod#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractMethod]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractMethod#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractMethod,
+ Super.extendedAbstractMixedInAbstractMethod]
+*/
+
+/*member: NamedMixin.extendedAbstractMethod#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteMethod],
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+/*member: NamedMixin.mixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteMethod,
+ Super.extendedConcreteMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteMethod
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteMethod#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteMethod,
+ Super.extendedAbstractMixedInConcreteMethod],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteMethod
+*/
+class NamedMixin = Super with Mixin;
diff --git a/pkg/front_end/test/class_hierarchy/data/mix_in_setter.dart b/pkg/front_end/test/class_hierarchy/data/mix_in_setter.dart
new file mode 100644
index 0000000..758f3dd
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/mix_in_setter.dart
@@ -0,0 +1,413 @@
+// 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.
+
+/*class: Super:
+ abstractMembers=[
+ Super.extendedAbstractMixedInAbstractSetter=,
+ Super.extendedAbstractMixedInConcreteSetter=,
+ Super.extendedAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteSetter(int i) {}
+
+ /*member: Super.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractSetter(int i);
+
+ /*member: Super.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteMixedInConcreteSetter(int i) {}
+
+ /*member: Super.extendedAbstractMixedInConcreteSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractMixedInConcreteSetter(int i);
+
+ /*member: Super.extendedConcreteMixedInAbstractSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedConcreteMixedInAbstractSetter(int i) {}
+
+ /*member: Super.extendedAbstractMixedInAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void set extendedAbstractMixedInAbstractSetter(int i);
+}
+
+/*class: Mixin:
+ abstractMembers=[
+ Mixin.extendedAbstractMixedInAbstractSetter=,
+ Mixin.extendedConcreteMixedInAbstractSetter=,
+ Mixin.mixedInAbstractSetter=],
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Mixin {
+ /*member: Mixin.mixedInConcreteSetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set mixedInConcreteSetter(int i) {}
+
+ /*member: Mixin.mixedInAbstractSetter=#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set mixedInAbstractSetter(int i);
+
+ /*member: Mixin.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set extendedConcreteMixedInConcreteSetter(int i) {}
+
+ /*member: Mixin.extendedAbstractMixedInConcreteSetter=#cls:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set extendedAbstractMixedInConcreteSetter(int i) {}
+
+ /*member: Mixin.extendedConcreteMixedInAbstractSetter=#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set extendedConcreteMixedInAbstractSetter(int i);
+
+ /*member: Mixin.extendedAbstractMixedInAbstractSetter=#int:
+ classBuilder=Mixin,
+ isSourceDeclaration
+ */
+ void set extendedAbstractMixedInAbstractSetter(int i);
+}
+
+/*class: _ClassMixin&Super&Mixin:
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.mixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteSetter=,
+ Super.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteSetter=,
+ Super.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=#cls:
+ classBuilder=_ClassMixin&Super&Mixin,
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractSetter=
+*/
+/*member: _ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractSetter=,
+ Super.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractSetter=,
+ Super.extendedConcreteMixedInAbstractSetter=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: _ClassMixin&Super&Mixin.mixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractSetter=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractSetter=,
+ Super.extendedAbstractMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractSetter=,
+ Super.extendedAbstractMixedInAbstractSetter=]
+*/
+
+/*member: _ClassMixin&Super&Mixin.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*class: ClassMixin:
+ abstractMembers=[
+ Super.extendedAbstractSetter=,
+ _ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractSetter=,
+ _ClassMixin&Super&Mixin.mixedInAbstractSetter=],
+ interfaces=[Mixin],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ Super,
+ _ClassMixin&Super&Mixin]
+*/
+class ClassMixin extends Super with Mixin {
+ /*member: ClassMixin.mixedInConcreteSetter=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.mixedInConcreteSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteSetter=
+ */
+ /*member: ClassMixin.mixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInConcreteSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInConcreteSetter=
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=
+ */
+ /*member: ClassMixin.extendedConcreteMixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteSetter=,
+ Super.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInConcreteSetter=
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInConcreteSetter=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=
+ */
+ /*member: ClassMixin.extendedAbstractMixedInConcreteSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteSetter=,
+ Super.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInConcreteSetter=
+ */
+
+ /*member: ClassMixin.extendedConcreteMixedInAbstractSetter=#cls:
+ classBuilder=ClassMixin,
+ inherited-implements=[_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractSetter=
+ */
+ /*member: ClassMixin.extendedConcreteMixedInAbstractSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractSetter=,
+ Super.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedConcreteMixedInAbstractSetter=
+ */
+
+ /*member: ClassMixin.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+
+ /*member: ClassMixin.mixedInAbstractSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[Mixin.mixedInAbstractSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.mixedInAbstractSetter=
+ */
+
+ /*member: ClassMixin.extendedAbstractMixedInAbstractSetter=#int:
+ classBuilder=_ClassMixin&Super&Mixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractSetter=,
+ Super.extendedAbstractMixedInAbstractSetter=],
+ isSynthesized,
+ member=_ClassMixin&Super&Mixin.extendedAbstractMixedInAbstractSetter=
+ */
+
+ /*member: ClassMixin.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+}
+
+/*class: NamedMixin:
+ abstractMembers=[
+ NamedMixin.extendedAbstractMixedInAbstractSetter=,
+ NamedMixin.mixedInAbstractSetter=,
+ Super.extendedAbstractSetter=],
+ interfaces=[Mixin],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+
+/*member: NamedMixin.mixedInConcreteSetter=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.mixedInConcreteSetter=],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInConcreteSetter=],
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+/*member: NamedMixin.mixedInConcreteSetter=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[Mixin.mixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.mixedInConcreteSetter=
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInConcreteSetter=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInConcreteSetter=,
+ Super.extendedConcreteMixedInConcreteSetter=],
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+/*member: NamedMixin.extendedConcreteMixedInConcreteSetter=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedConcreteMixedInConcreteSetter=,
+ Super.extendedConcreteMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedConcreteMixedInConcreteSetter=
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInConcreteSetter=#cls:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ inherited-implements=[NamedMixin.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInConcreteSetter=,
+ Super.extendedAbstractMixedInConcreteSetter=],
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+/*member: NamedMixin.extendedAbstractMixedInConcreteSetter=#int:
+ classBuilder=NamedMixin,
+ concreteMixinStub,
+ declarations=[
+ Mixin.extendedAbstractMixedInConcreteSetter=,
+ Super.extendedAbstractMixedInConcreteSetter=],
+ isSynthesized,
+ stubTarget=Mixin.extendedAbstractMixedInConcreteSetter=
+*/
+
+/*member: NamedMixin.extendedConcreteMixedInAbstractSetter=#cls:
+ classBuilder=NamedMixin,
+ inherited-implements=[NamedMixin.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ member=Super.extendedConcreteMixedInAbstractSetter=
+*/
+/*member: NamedMixin.extendedConcreteMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedConcreteMixedInAbstractSetter=,
+ Super.extendedConcreteMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedConcreteMixedInAbstractSetter=,
+ Super.extendedConcreteMixedInAbstractSetter=]
+*/
+
+/*member: NamedMixin.extendedConcreteSetter=#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+
+/*member: NamedMixin.mixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[Mixin.mixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[Mixin.mixedInAbstractSetter=]
+*/
+
+/*member: NamedMixin.extendedAbstractMixedInAbstractSetter=#int:
+ abstractMixinStub,
+ classBuilder=NamedMixin,
+ declarations=[
+ Mixin.extendedAbstractMixedInAbstractSetter=,
+ Super.extendedAbstractMixedInAbstractSetter=],
+ isSynthesized,
+ mixin-overrides=[
+ Mixin.extendedAbstractMixedInAbstractSetter=,
+ Super.extendedAbstractMixedInAbstractSetter=]
+*/
+
+/*member: NamedMixin.extendedAbstractSetter=#int:
+ classBuilder=Super,
+ isSourceDeclaration
+*/
+class NamedMixin = Super with Mixin;
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/no_such_method.dart b/pkg/front_end/test/class_hierarchy/data/no_such_method.dart
new file mode 100644
index 0000000..c29b312
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/no_such_method.dart
@@ -0,0 +1,780 @@
+// 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.
+
+/*class: Interface:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+abstract class Interface {
+ /*member: Interface.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void method();
+
+ /*member: Interface.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int get getter;
+
+ /*member: Interface.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ void set setter(int value);
+
+ /*member: Interface.field#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: Interface.field=#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ int field;
+
+ /*member: Interface.finalField#cls:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ final int finalField;
+}
+
+/*class: SuperAbstract:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class SuperAbstract {
+ /*member: SuperAbstract.noSuchMethod#int:
+ classBuilder=SuperAbstract,
+ declarations=[
+ Object.noSuchMethod,
+ SuperAbstract.noSuchMethod],
+ declared-overrides=[Object.noSuchMethod],
+ isSynthesized
+ */
+ noSuchMethod(Invocation invocation);
+}
+
+/*class: FromSuperAbstract:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ SuperAbstract]
+*/
+class FromSuperAbstract extends SuperAbstract implements Interface {
+ /*member: FromSuperAbstract.noSuchMethod#int:
+ classBuilder=FromSuperAbstract,
+ declarations=[
+ Object.noSuchMethod,
+ SuperAbstract.noSuchMethod],
+ isSynthesized,
+ member=SuperAbstract.noSuchMethod
+ */
+
+ /*member: FromSuperAbstract.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromSuperAbstract.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperAbstract.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperAbstract.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperAbstract.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperAbstract.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: SuperConcrete:
+ hasNoSuchMethod,
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class SuperConcrete {
+ /*member: SuperConcrete.noSuchMethod#cls:
+ classBuilder=SuperConcrete,
+ declared-overrides=[Object.noSuchMethod],
+ isSourceDeclaration
+ */
+ @override
+ noSuchMethod(Invocation invocation) {
+ return null;
+ }
+}
+
+/*class: FromSuperConcrete:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ SuperConcrete]
+*/
+class FromSuperConcrete extends SuperConcrete implements Interface {
+ /*member: FromSuperConcrete.noSuchMethod#cls:
+ classBuilder=FromSuperConcrete,
+ inherited-implements=[FromSuperConcrete.noSuchMethod],
+ isSynthesized,
+ member=SuperConcrete.noSuchMethod
+ */
+ /*member: FromSuperConcrete.noSuchMethod#int:
+ classBuilder=FromSuperConcrete,
+ declarations=[
+ Object.noSuchMethod,
+ SuperConcrete.noSuchMethod],
+ isSynthesized,
+ member=SuperConcrete.noSuchMethod
+ */
+
+ /*member: FromSuperConcrete.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromSuperConcrete.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcrete.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcrete.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcrete.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcrete.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: FromSuperConcreteAbstract:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[
+ Interface,
+ SuperAbstract],
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ SuperConcrete]
+*/
+class FromSuperConcreteAbstract extends SuperConcrete
+ implements SuperAbstract, Interface {
+ /*member: FromSuperConcreteAbstract.noSuchMethod#cls:
+ classBuilder=FromSuperConcreteAbstract,
+ inherited-implements=[FromSuperConcreteAbstract.noSuchMethod],
+ isSynthesized,
+ member=SuperConcrete.noSuchMethod
+ */
+ /*member: FromSuperConcreteAbstract.noSuchMethod#int:
+ classBuilder=FromSuperConcreteAbstract,
+ declarations=[
+ Object.noSuchMethod,
+ SuperAbstract.noSuchMethod,
+ SuperConcrete.noSuchMethod],
+ isSynthesized,
+ member=SuperConcrete.noSuchMethod
+ */
+
+ /*member: FromSuperConcreteAbstract.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromSuperConcreteAbstract.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcreteAbstract.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcreteAbstract.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcreteAbstract.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromSuperConcreteAbstract.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: MixinAbstract:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class MixinAbstract {
+ /*member: MixinAbstract.noSuchMethod#int:
+ classBuilder=MixinAbstract,
+ declarations=[
+ MixinAbstract.noSuchMethod,
+ Object.noSuchMethod],
+ declared-overrides=[Object.noSuchMethod],
+ isSynthesized
+ */
+ noSuchMethod(Invocation invocation);
+}
+
+/*class: FromMixinAbstract:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[
+ MixinAbstract,
+ Object]
+*/
+class FromMixinAbstract extends MixinAbstract implements Interface {
+ /*member: FromMixinAbstract.noSuchMethod#int:
+ classBuilder=FromMixinAbstract,
+ declarations=[
+ MixinAbstract.noSuchMethod,
+ Object.noSuchMethod],
+ isSynthesized,
+ member=MixinAbstract.noSuchMethod
+ */
+
+ /*member: FromMixinAbstract.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromMixinAbstract.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinAbstract.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinAbstract.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinAbstract.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinAbstract.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: MixinConcrete:
+ hasNoSuchMethod,
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class MixinConcrete {
+ /*member: MixinConcrete.noSuchMethod#cls:
+ classBuilder=MixinConcrete,
+ declared-overrides=[Object.noSuchMethod],
+ isSourceDeclaration
+ */
+ @override
+ noSuchMethod(Invocation invocation) {
+ return null;
+ }
+}
+
+/*class: _FromMixinConcrete&Object&MixinConcrete:
+ hasNoSuchMethod,
+ interfaces=[MixinConcrete],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+/*member: _FromMixinConcrete&Object&MixinConcrete.noSuchMethod#cls:
+ classBuilder=_FromMixinConcrete&Object&MixinConcrete,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+/*member: _FromMixinConcrete&Object&MixinConcrete.noSuchMethod#int:
+ classBuilder=_FromMixinConcrete&Object&MixinConcrete,
+ concreteMixinStub,
+ declarations=[
+ MixinConcrete.noSuchMethod,
+ Object.noSuchMethod],
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+
+/*class: FromMixinConcrete:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[
+ Interface,
+ MixinConcrete],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ _FromMixinConcrete&Object&MixinConcrete]
+*/
+class FromMixinConcrete with MixinConcrete implements Interface {
+ /*member: FromMixinConcrete.noSuchMethod#cls:
+ classBuilder=FromMixinConcrete,
+ inherited-implements=[FromMixinConcrete.noSuchMethod],
+ isSynthesized,
+ member=_FromMixinConcrete&Object&MixinConcrete.noSuchMethod
+ */
+ /*member: FromMixinConcrete.noSuchMethod#int:
+ classBuilder=FromMixinConcrete,
+ declarations=[
+ Object.noSuchMethod,
+ _FromMixinConcrete&Object&MixinConcrete.noSuchMethod],
+ isSynthesized,
+ member=_FromMixinConcrete&Object&MixinConcrete.noSuchMethod
+ */
+
+ /*member: FromMixinConcrete.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromMixinConcrete.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcrete.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcrete.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcrete.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcrete.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: _FromMixinConcreteAbstract&Object&MixinConcrete:
+ hasNoSuchMethod,
+ interfaces=[MixinConcrete],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod#cls:
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete,
+ concreteMixinStub,
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod#int:
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete,
+ concreteMixinStub,
+ declarations=[
+ MixinConcrete.noSuchMethod,
+ Object.noSuchMethod],
+ isSynthesized,
+ stubTarget=MixinConcrete.noSuchMethod
+*/
+
+/*class: _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract:
+ hasNoSuchMethod,
+ interfaces=[
+ MixinAbstract,
+ MixinConcrete],
+ maxInheritancePath=3,
+ superclasses=[
+ Object,
+ _FromMixinConcreteAbstract&Object&MixinConcrete]
+*/
+
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod#cls:
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract,
+ isSynthesized,
+ member=_FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod
+*/
+/*member: _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod#int:
+ abstractMixinStub,
+ classBuilder=_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract,
+ declarations=[
+ MixinAbstract.noSuchMethod,
+ MixinAbstract.noSuchMethod,
+ _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod],
+ isSynthesized,
+ mixin-overrides=[
+ MixinAbstract.noSuchMethod,
+ _FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod]
+*/
+
+/*class: FromMixinConcreteAbstract:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[
+ Interface,
+ MixinAbstract,
+ MixinConcrete],
+ maxInheritancePath=4,
+ superclasses=[
+ Object,
+ _FromMixinConcreteAbstract&Object&MixinConcrete,
+ _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract]
+*/
+class FromMixinConcreteAbstract
+ with MixinConcrete, MixinAbstract
+ implements Interface {
+ /*member: FromMixinConcreteAbstract.noSuchMethod#cls:
+ classBuilder=FromMixinConcreteAbstract,
+ inherited-implements=[FromMixinConcreteAbstract.noSuchMethod],
+ isSynthesized,
+ member=_FromMixinConcreteAbstract&Object&MixinConcrete.noSuchMethod
+ */
+ /*member: FromMixinConcreteAbstract.noSuchMethod#int:
+ classBuilder=FromMixinConcreteAbstract,
+ declarations=[
+ Object.noSuchMethod,
+ _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod],
+ isSynthesized,
+ member=_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract.noSuchMethod
+ */
+
+ /*member: FromMixinConcreteAbstract.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromMixinConcreteAbstract.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcreteAbstract.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcreteAbstract.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcreteAbstract.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromMixinConcreteAbstract.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: InterfaceAbstract:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class InterfaceAbstract {
+ /*member: InterfaceAbstract.noSuchMethod#int:
+ classBuilder=InterfaceAbstract,
+ declarations=[
+ InterfaceAbstract.noSuchMethod,
+ Object.noSuchMethod],
+ declared-overrides=[Object.noSuchMethod],
+ isSynthesized
+ */
+ noSuchMethod(Invocation invocation);
+}
+
+/*class: FromInterfaceAbstract:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ interfaces=[
+ Interface,
+ InterfaceAbstract],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class FromInterfaceAbstract implements InterfaceAbstract, Interface {
+ /*member: FromInterfaceAbstract.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromInterfaceAbstract.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceAbstract.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceAbstract.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceAbstract.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceAbstract.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: InterfaceConcrete:
+ hasNoSuchMethod,
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class InterfaceConcrete {
+ /*member: InterfaceConcrete.noSuchMethod#cls:
+ classBuilder=InterfaceConcrete,
+ declared-overrides=[Object.noSuchMethod],
+ isSourceDeclaration
+ */
+ @override
+ noSuchMethod(Invocation invocation) {
+ return null;
+ }
+}
+
+/*class: FromInterfaceConcrete:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ interfaces=[
+ Interface,
+ InterfaceConcrete],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class FromInterfaceConcrete implements InterfaceConcrete, Interface {
+ /*member: FromInterfaceConcrete.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: FromInterfaceConcrete.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceConcrete.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceConcrete.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceConcrete.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: FromInterfaceConcrete.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+}
+
+/*class: DeclaredAbstract:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class DeclaredAbstract implements Interface {
+ /*member: DeclaredAbstract.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: DeclaredAbstract.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredAbstract.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredAbstract.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredAbstract.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredAbstract.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredAbstract.noSuchMethod#int:
+ classBuilder=DeclaredAbstract,
+ declarations=[
+ DeclaredAbstract.noSuchMethod,
+ Object.noSuchMethod],
+ declared-overrides=[Object.noSuchMethod],
+ isSynthesized
+ */
+ noSuchMethod(Invocation invocation);
+}
+
+/*class: DeclaredConcrete:
+ abstractMembers=[
+ Interface.field,
+ Interface.field=,
+ Interface.finalField,
+ Interface.getter,
+ Interface.method,
+ Interface.setter=],
+ hasNoSuchMethod,
+ interfaces=[Interface],
+ maxInheritancePath=2,
+ superclasses=[Object]
+*/
+class DeclaredConcrete implements Interface {
+ /*member: DeclaredConcrete.field#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+ /*member: DeclaredConcrete.field=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredConcrete.finalField#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredConcrete.method#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredConcrete.getter#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredConcrete.setter=#int:
+ classBuilder=Interface,
+ isSourceDeclaration
+ */
+
+ /*member: DeclaredConcrete.noSuchMethod#cls:
+ classBuilder=DeclaredConcrete,
+ declared-overrides=[Object.noSuchMethod],
+ isSourceDeclaration
+ */
+ @override
+ noSuchMethod(Invocation invocation) {
+ return null;
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/test/class_hierarchy/data/override.dart b/pkg/front_end/test/class_hierarchy/data/override.dart
new file mode 100644
index 0000000..a3e687a
--- /dev/null
+++ b/pkg/front_end/test/class_hierarchy/data/override.dart
@@ -0,0 +1,87 @@
+// 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.
+
+/*class: Super:
+ maxInheritancePath=1,
+ superclasses=[Object]
+*/
+class Super {
+ /*member: Super.extendedMethod1#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedMethod1(int i) {}
+
+ /*member: Super.extendedMethod2#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void extendedMethod2(num i) {}
+
+ /*member: Super.overriddenMethod1#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void overriddenMethod1(int i) {}
+
+ /*member: Super.overriddenMethod2#cls:
+ classBuilder=Super,
+ isSourceDeclaration
+ */
+ void overriddenMethod2(num n) {}
+}
+
+/*class: Class:
+ maxInheritancePath=2,
+ superclasses=[
+ Object,
+ Super]
+*/
+/*member: Class.extendedMethod1#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.extendedMethod1],
+ isSynthesized,
+ member=Super.extendedMethod1
+*/
+/*member: Class.extendedMethod2#cls:
+ classBuilder=Class,
+ inherited-implements=[Class.extendedMethod2],
+ isSynthesized,
+ member=Super.extendedMethod2
+*/
+class Class extends Super {
+ /*member: Class.extendedMethod1#int:
+ classBuilder=Class,
+ declarations=[
+ Class.extendedMethod1,
+ Super.extendedMethod1],
+ declared-overrides=[Super.extendedMethod1],
+ isSynthesized
+ */
+ void extendedMethod1(num n);
+
+ /*member: Class.extendedMethod2#int:
+ classBuilder=Class,
+ declarations=[
+ Class.extendedMethod2,
+ Super.extendedMethod2],
+ declared-overrides=[Super.extendedMethod2],
+ isSynthesized
+ */
+ void extendedMethod2(int i);
+
+ /*member: Class.overriddenMethod1#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.overriddenMethod1],
+ isSourceDeclaration
+ */
+ void overriddenMethod1(num n) {}
+
+ /*member: Class.overriddenMethod2#cls:
+ classBuilder=Class,
+ declared-overrides=[Super.overriddenMethod2],
+ isSourceDeclaration
+ */
+ void overriddenMethod2(int n) {}
+}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 1324c7e..572493d 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -21,6 +21,7 @@
acov
across
activated
+adequate
adi
affecting
afterwards
@@ -377,6 +378,7 @@
eof
eq
equation
+erased
erasure
es
establish
@@ -464,6 +466,8 @@
gardening
gen
generation
+getable
+getables
gets
getter1a
getter1b
@@ -1004,6 +1008,7 @@
rs
runnable
s
+sanitizing
saw
say
sb
@@ -1027,6 +1032,8 @@
server
service
session
+setable
+setables
setaf
sh
sha1hash
@@ -1208,6 +1215,7 @@
trees
tricky
trips
+trivially
ts
tty
tuple
@@ -1246,7 +1254,9 @@
unequal
unescape
unexact
+unexpectedly
unfinalized
+unfold
unfolds
unfuture
unfutured
@@ -1293,6 +1303,7 @@
util
utils
v
+validly
variable's
variances
variant
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
index c556119..d4b2ca4 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
@@ -12,6 +12,26 @@
// var interfaceMethod1;
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/abstract_members.dart:27:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+// ^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
// - A.abstractMethod
// - A.property1=
@@ -50,6 +70,36 @@
// void interfaceMethod3() {}
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/abstract_members.dart:42:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:48:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
// - A.abstractMethod
// - A.property1=
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.strong.expect b/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
index 9a2d8e1..a798711 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
@@ -12,6 +12,26 @@
// var interfaceMethod1;
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/abstract_members.dart:27:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+// ^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
// - A.abstractMethod
// - A.property1=
@@ -50,6 +70,36 @@
// void interfaceMethod3() {}
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/abstract_members.dart:42:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:48:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
// - A.abstractMethod
// - A.property1=
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
index 2f6b693..d789cb9 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
@@ -25,12 +25,12 @@
// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
// class F extends E {}
// ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
// void foo() {}
// ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:21:16: Context: This is the overridden method ('foo').
-// abstract class E extends A implements I {}
-// ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+// void foo([a]);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
index 0529482..90c7a87 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
@@ -25,12 +25,12 @@
// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
// class F extends E {}
// ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
// void foo() {}
// ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:21:16: Context: This is the overridden method ('foo').
-// abstract class E extends A implements I {}
-// ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+// void foo([a]);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
index 0529482..90c7a87 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
@@ -25,12 +25,12 @@
// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
// class F extends E {}
// ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'E.foo'.
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
// void foo() {}
// ^
-// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:21:16: Context: This is the overridden method ('foo').
-// abstract class E extends A implements I {}
-// ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+// void foo([a]);
+// ^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
index 54ce84a..c9348b9 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
@@ -7,6 +7,7 @@
;
method foo() → self::A*
;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -15,7 +16,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
@@ -8,6 +8,7 @@
;
method foo() → self::A*
return null;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
@@ -8,6 +8,7 @@
;
method foo() → self::A*
return null;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
index 43701f7..63c6cb2 100644
--- a/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
@@ -385,141 +385,169 @@
synthetic constructor •() → self::_Class&Super&M0*
: super self::Super::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M0::property
}
abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1*
: super self::_Class&Super&M0::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M1::property
}
abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2*
: super self::_Class&Super&M0&M1::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M2::property
}
abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
: super self::_Class&Super&M0&M1&M2::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M3::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
: super self::_Class&Super&M0&M1&M2&M3::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M4::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
: super self::_Class&Super&M0&M1&M2&M3&M4::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M5::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M6::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M7::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M8::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M9::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M10::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M11::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M12::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M13::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M14::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M15::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M16::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M17::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M18::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M19::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M20::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M21::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M22::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M23::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M24::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M25::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M26::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M27::property
}
class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
index eee4f5a..226f3df 100644
--- a/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
@@ -386,141 +386,169 @@
synthetic constructor •() → self::_Class&Super&M0*
: super self::Super::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M0::property
}
abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1*
: super self::_Class&Super&M0::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M1::property
}
abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2*
: super self::_Class&Super&M0&M1::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M2::property
}
abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
: super self::_Class&Super&M0&M1&M2::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M3::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
: super self::_Class&Super&M0&M1&M2&M3::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M4::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
: super self::_Class&Super&M0&M1&M2&M3&M4::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M5::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M6::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M7::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M8::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M9::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M10::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M11::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M12::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M13::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M14::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M15::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M16::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M17::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M18::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M19::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M20::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M21::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M22::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M23::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M24::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M25::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M26::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
;
+ abstract mixin-stub get property() → core::int*; -> self::M27::property
}
class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect
index 587242a..597b9c0 100644
--- a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.outline.expect
@@ -58,6 +58,20 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
+// int get property5; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
+// String property5;
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
+// String get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The return type of the method 'C2.property5' is 'int', which does not match the return type, 'String', of the overridden method, 'C1.property5'.
// Change to a subtype of 'String'.
// int get property5; // error
@@ -66,13 +80,6 @@
// String property5;
// ^
//
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
-// int get property5; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
-// String property5;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The return type of the method 'C2.property6' is 'String', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// String get property6; // error
@@ -81,13 +88,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
-// String get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/general/getter_vs_setter_type.dart:115:16: Error: The type 'int' of the inherited getter 'D1.property2' is not assignable to the type 'String' of the inherited setter 'D2.property2'.
// abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect
index 1515fe4..3a83a52 100644
--- a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.strong.expect
@@ -58,6 +58,20 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
+// int get property5; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
+// String property5;
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
+// String get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The return type of the method 'C2.property5' is 'int', which does not match the return type, 'String', of the overridden method, 'C1.property5'.
// Change to a subtype of 'String'.
// int get property5; // error
@@ -66,13 +80,6 @@
// String property5;
// ^
//
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
-// int get property5; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
-// String property5;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The return type of the method 'C2.property6' is 'String', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// String get property6; // error
@@ -81,13 +88,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
-// String get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/general/getter_vs_setter_type.dart:115:16: Error: The type 'int' of the inherited getter 'D1.property2' is not assignable to the type 'String' of the inherited setter 'D2.property2'.
// abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/general/hierarchy.dart b/pkg/front_end/testcases/general/hierarchy.dart
new file mode 100644
index 0000000..8c4f658
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class A1 {
+ void extendedClassMember() {}
+ void extendedInterfaceMember();
+}
+
+abstract class A2 {
+ void mixedInClassMember() {}
+ void mixedInInterfaceMember();
+}
+
+abstract class A3 extends A1 with A2 {
+ void declaredClassMember() {}
+ void declaredInterfaceMember();
+}
+
+abstract class A4 = A1 with A2;
+
+abstract class A5 implements A1 {}
+
+class A6 extends A1 implements A1 {}
+
+abstract class B1 {
+ void twiceInterfaceMember() {}
+ void extendedAndImplementedMember() {}
+}
+
+abstract class B2 {
+ void twiceInterfaceMember() {}
+}
+
+abstract class B3 {
+ void extendedAndImplementedMember() {}
+}
+
+abstract class B4 extends B3 implements B1, B2 {}
+
+class B5 extends B4 {}
+
+class B6 extends B3 implements B1, B2 {}
+
+abstract class C1 {
+ void mixedInAndImplementedClassMember() {}
+ void mixedInAndImplementedInterfaceMember();
+}
+
+class C2 {
+ void mixedInAndImplementedClassMember() {}
+ void mixedInAndImplementedInterfaceMember() {}
+}
+
+abstract class C3 with C1 implements C2 {}
+
+class C4 extends C3 {}
+
+class C5 with C1 implements C2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.outline.expect b/pkg/front_end/testcases/general/hierarchy.dart.outline.expect
new file mode 100644
index 0000000..66c5f61
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.outline.expect
@@ -0,0 +1,320 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+// - A1.extendedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+// void extendedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+// - B1.twiceInterfaceMember
+// - B2.twiceInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+// - B1.twiceInterfaceMember
+// - B2.twiceInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+// - C1.mixedInAndImplementedInterfaceMember
+// - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+// - C1.mixedInAndImplementedInterfaceMember
+// - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+ synthetic constructor •() → self::A1*
+ ;
+ method extendedClassMember() → void
+ ;
+ abstract method extendedInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+ synthetic constructor •() → self::A2*
+ ;
+ method mixedInClassMember() → void
+ ;
+ abstract method mixedInInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 = self::A1 with self::A2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_A3&A1&A2*
+ : super self::A1::•()
+ ;
+ mixin-super-stub method mixedInClassMember() → void
+ return super.{self::A2::mixedInClassMember}();
+ abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A3 extends self::_A3&A1&A2 {
+ synthetic constructor •() → self::A3*
+ ;
+ method declaredClassMember() → void
+ ;
+ abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 = self::A1 with self::A2 {
+ synthetic constructor •() → self::A4*
+ : super self::A1::•()
+ ;
+ mixin-super-stub method mixedInClassMember() → void
+ return super.{self::A2::mixedInClassMember}();
+ abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A5 extends core::Object implements self::A1 {
+ synthetic constructor •() → self::A5*
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+ synthetic constructor •() → self::A6*
+ ;
+}
+abstract class B1 extends core::Object {
+ synthetic constructor •() → self::B1*
+ ;
+ method twiceInterfaceMember() → void
+ ;
+ method extendedAndImplementedMember() → void
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+ synthetic constructor •() → self::B2*
+ ;
+ method twiceInterfaceMember() → void
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+ synthetic constructor •() → self::B3*
+ ;
+ method extendedAndImplementedMember() → void
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+ synthetic constructor •() → self::B4*
+ ;
+}
+class B5 extends self::B4 {
+ synthetic constructor •() → self::B5*
+ ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+ synthetic constructor •() → self::B6*
+ ;
+}
+abstract class C1 extends core::Object {
+ synthetic constructor •() → self::C1*
+ ;
+ method mixedInAndImplementedClassMember() → void
+ ;
+ abstract method mixedInAndImplementedInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+ synthetic constructor •() → self::C2*
+ ;
+ method mixedInAndImplementedClassMember() → void
+ ;
+ method mixedInAndImplementedInterfaceMember() → void
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_C3&Object&C1*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method mixedInAndImplementedClassMember() → void
+ return super.{self::C1::mixedInAndImplementedClassMember}();
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+ synthetic constructor •() → self::C3*
+ ;
+}
+class C4 extends self::C3 {
+ synthetic constructor •() → self::C4*
+ ;
+}
+abstract class _C5&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_C5&Object&C1*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method mixedInAndImplementedClassMember() → void
+ return super.{self::C1::mixedInAndImplementedClassMember}();
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+ synthetic constructor •() → self::C5*
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.strong.expect b/pkg/front_end/testcases/general/hierarchy.dart.strong.expect
new file mode 100644
index 0000000..3c3d062
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.strong.expect
@@ -0,0 +1,325 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+// - A1.extendedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+// void extendedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+// - B1.twiceInterfaceMember
+// - B2.twiceInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+// - B1.twiceInterfaceMember
+// - B2.twiceInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+// - C1.mixedInAndImplementedInterfaceMember
+// - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+// - C1.mixedInAndImplementedInterfaceMember
+// - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+ synthetic constructor •() → self::A1*
+ : super core::Object::•()
+ ;
+ method extendedClassMember() → void {}
+ abstract method extendedInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+ synthetic constructor •() → self::A2*
+ : super core::Object::•()
+ ;
+ method mixedInClassMember() → void {}
+ abstract method mixedInInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 = self::A1 with self::A2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_A3&A1&A2*
+ : super self::A1::•()
+ ;
+ mixin-super-stub method mixedInClassMember() → void
+ return super.{self::A2::mixedInClassMember}();
+ abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A3 extends self::_A3&A1&A2 {
+ synthetic constructor •() → self::A3*
+ : super self::_A3&A1&A2::•()
+ ;
+ method declaredClassMember() → void {}
+ abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 = self::A1 with self::A2 {
+ synthetic constructor •() → self::A4*
+ : super self::A1::•()
+ ;
+ mixin-super-stub method mixedInClassMember() → void
+ return super.{self::A2::mixedInClassMember}();
+ abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A5 extends core::Object implements self::A1 {
+ synthetic constructor •() → self::A5*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+ synthetic constructor •() → self::A6*
+ : super self::A1::•()
+ ;
+}
+abstract class B1 extends core::Object {
+ synthetic constructor •() → self::B1*
+ : super core::Object::•()
+ ;
+ method twiceInterfaceMember() → void {}
+ method extendedAndImplementedMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+ synthetic constructor •() → self::B2*
+ : super core::Object::•()
+ ;
+ method twiceInterfaceMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+ synthetic constructor •() → self::B3*
+ : super core::Object::•()
+ ;
+ method extendedAndImplementedMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+ synthetic constructor •() → self::B4*
+ : super self::B3::•()
+ ;
+}
+class B5 extends self::B4 {
+ synthetic constructor •() → self::B5*
+ : super self::B4::•()
+ ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+ synthetic constructor •() → self::B6*
+ : super self::B3::•()
+ ;
+}
+abstract class C1 extends core::Object {
+ synthetic constructor •() → self::C1*
+ : super core::Object::•()
+ ;
+ method mixedInAndImplementedClassMember() → void {}
+ abstract method mixedInAndImplementedInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+ synthetic constructor •() → self::C2*
+ : super core::Object::•()
+ ;
+ method mixedInAndImplementedClassMember() → void {}
+ method mixedInAndImplementedInterfaceMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_C3&Object&C1*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method mixedInAndImplementedClassMember() → void
+ return super.{self::C1::mixedInAndImplementedClassMember}();
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+ synthetic constructor •() → self::C3*
+ : super self::_C3&Object&C1::•()
+ ;
+}
+class C4 extends self::C3 {
+ synthetic constructor •() → self::C4*
+ : super self::C3::•()
+ ;
+}
+abstract class _C5&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_C5&Object&C1*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method mixedInAndImplementedClassMember() → void
+ return super.{self::C1::mixedInAndImplementedClassMember}();
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+ synthetic constructor •() → self::C5*
+ : super self::_C5&Object&C1::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/general/hierarchy.dart.strong.transformed.expect
new file mode 100644
index 0000000..ec7dd97
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.strong.transformed.expect
@@ -0,0 +1,341 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+// - A1.extendedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+// void extendedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+// - B1.twiceInterfaceMember
+// - B2.twiceInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+// - B1.twiceInterfaceMember
+// - B2.twiceInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+// void twiceInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+// - C1.mixedInAndImplementedInterfaceMember
+// - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+// - C1.mixedInAndImplementedInterfaceMember
+// - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+// ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+// void mixedInAndImplementedInterfaceMember() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+ synthetic constructor •() → self::A1*
+ : super core::Object::•()
+ ;
+ method extendedClassMember() → void {}
+ abstract method extendedInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+ synthetic constructor •() → self::A2*
+ : super core::Object::•()
+ ;
+ method mixedInClassMember() → void {}
+ abstract method mixedInInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 extends self::A1 implements self::A2 /*isAnonymousMixin,isEliminatedMixin*/ {
+ synthetic constructor •() → self::_A3&A1&A2*
+ : super self::A1::•()
+ ;
+ method mixedInClassMember() → void {}
+ abstract method mixedInInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A3 extends self::_A3&A1&A2 {
+ synthetic constructor •() → self::A3*
+ : super self::_A3&A1&A2::•()
+ ;
+ method declaredClassMember() → void {}
+ abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 extends self::A1 implements self::A2 /*isEliminatedMixin*/ {
+ synthetic constructor •() → self::A4*
+ : super self::A1::•()
+ ;
+ method mixedInClassMember() → void {}
+ abstract method mixedInInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A5 extends core::Object implements self::A1 {
+ synthetic constructor •() → self::A5*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+ synthetic constructor •() → self::A6*
+ : super self::A1::•()
+ ;
+}
+abstract class B1 extends core::Object {
+ synthetic constructor •() → self::B1*
+ : super core::Object::•()
+ ;
+ method twiceInterfaceMember() → void {}
+ method extendedAndImplementedMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+ synthetic constructor •() → self::B2*
+ : super core::Object::•()
+ ;
+ method twiceInterfaceMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+ synthetic constructor •() → self::B3*
+ : super core::Object::•()
+ ;
+ method extendedAndImplementedMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+ synthetic constructor •() → self::B4*
+ : super self::B3::•()
+ ;
+}
+class B5 extends self::B4 {
+ synthetic constructor •() → self::B5*
+ : super self::B4::•()
+ ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+ synthetic constructor •() → self::B6*
+ : super self::B3::•()
+ ;
+}
+abstract class C1 extends core::Object {
+ synthetic constructor •() → self::C1*
+ : super core::Object::•()
+ ;
+ method mixedInAndImplementedClassMember() → void {}
+ abstract method mixedInAndImplementedInterfaceMember() → void;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+ synthetic constructor •() → self::C2*
+ : super core::Object::•()
+ ;
+ method mixedInAndImplementedClassMember() → void {}
+ method mixedInAndImplementedInterfaceMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 extends core::Object implements self::C1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_C3&Object&C1*
+ : super core::Object::•()
+ ;
+ method mixedInAndImplementedClassMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract method mixedInAndImplementedInterfaceMember() → void;
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+ synthetic constructor •() → self::C3*
+ : super self::_C3&Object&C1::•()
+ ;
+}
+class C4 extends self::C3 {
+ synthetic constructor •() → self::C4*
+ : super self::C3::•()
+ ;
+}
+abstract class _C5&Object&C1 extends core::Object implements self::C1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_C5&Object&C1*
+ : super core::Object::•()
+ ;
+ method mixedInAndImplementedClassMember() → void {}
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract method mixedInAndImplementedInterfaceMember() → void;
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+ synthetic constructor •() → self::C5*
+ : super self::_C5&Object&C1::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.textual_outline.expect b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline.expect
new file mode 100644
index 0000000..15a7cc5
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline.expect
@@ -0,0 +1,57 @@
+abstract class A1 {
+ void extendedClassMember() {}
+ void extendedInterfaceMember();
+}
+
+abstract class A2 {
+ void mixedInClassMember() {}
+ void mixedInInterfaceMember();
+}
+
+abstract class A3 extends A1 with A2 {
+ void declaredClassMember() {}
+ void declaredInterfaceMember();
+}
+
+abstract class A4 = A1 with A2;
+
+abstract class A5 implements A1 {}
+
+class A6 extends A1 implements A1 {}
+
+abstract class B1 {
+ void twiceInterfaceMember() {}
+ void extendedAndImplementedMember() {}
+}
+
+abstract class B2 {
+ void twiceInterfaceMember() {}
+}
+
+abstract class B3 {
+ void extendedAndImplementedMember() {}
+}
+
+abstract class B4 extends B3 implements B1, B2 {}
+
+class B5 extends B4 {}
+
+class B6 extends B3 implements B1, B2 {}
+
+abstract class C1 {
+ void mixedInAndImplementedClassMember() {}
+ void mixedInAndImplementedInterfaceMember();
+}
+
+class C2 {
+ void mixedInAndImplementedClassMember() {}
+ void mixedInAndImplementedInterfaceMember() {}
+}
+
+abstract class C3 with C1 implements C2 {}
+
+class C4 extends C3 {}
+
+class C5 with C1 implements C2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..916bcc2
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.textual_outline_modelled.expect
@@ -0,0 +1,57 @@
+abstract class A1 {
+ void extendedClassMember() {}
+ void extendedInterfaceMember();
+}
+
+abstract class A2 {
+ void mixedInClassMember() {}
+ void mixedInInterfaceMember();
+}
+
+abstract class A3 extends A1 with A2 {
+ void declaredClassMember() {}
+ void declaredInterfaceMember();
+}
+
+abstract class A4 = A1 with A2;
+
+abstract class A5 implements A1 {}
+
+abstract class B1 {
+ void extendedAndImplementedMember() {}
+ void twiceInterfaceMember() {}
+}
+
+abstract class B2 {
+ void twiceInterfaceMember() {}
+}
+
+abstract class B3 {
+ void extendedAndImplementedMember() {}
+}
+
+abstract class B4 extends B3 implements B1, B2 {}
+
+abstract class C1 {
+ void mixedInAndImplementedClassMember() {}
+ void mixedInAndImplementedInterfaceMember();
+}
+
+abstract class C3 with C1 implements C2 {}
+
+class A6 extends A1 implements A1 {}
+
+class B5 extends B4 {}
+
+class B6 extends B3 implements B1, B2 {}
+
+class C2 {
+ void mixedInAndImplementedClassMember() {}
+ void mixedInAndImplementedInterfaceMember() {}
+}
+
+class C4 extends C3 {}
+
+class C5 with C1 implements C2 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect
index f522e20..2bf067c 100644
--- a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.outline.expect
@@ -35,6 +35,7 @@
synthetic constructor •() → self::_Class&Base&MixinA*
: super self::Base::•()
;
+ abstract mixin-stub method method(core::Object* t) → dynamic; -> self::MixinA::method
}
abstract class Class extends self::_Class&Base&MixinA {
synthetic constructor •() → self::Class*
@@ -104,6 +105,7 @@
synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin*
: super self::YamlNode::•()
;
+ abstract mixin-stub operator [](core::Object* key) → dynamic; -> self::MapMixin::[]
}
abstract class _YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin = self::_YamlMap&YamlNode&MapMixin with self::UnmodifiableMapMixin<dynamic, dynamic> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin*
diff --git a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect
index 1f40ec1..bf294a6 100644
--- a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.strong.expect
@@ -37,6 +37,7 @@
synthetic constructor •() → self::_Class&Base&MixinA*
: super self::Base::•()
;
+ abstract mixin-stub method method(core::Object* t) → dynamic; -> self::MixinA::method
}
abstract class Class extends self::_Class&Base&MixinA {
synthetic constructor •() → self::Class*
@@ -110,6 +111,7 @@
synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin*
: super self::YamlNode::•()
;
+ abstract mixin-stub operator [](core::Object* key) → dynamic; -> self::MapMixin::[]
}
abstract class _YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin = self::_YamlMap&YamlNode&MapMixin with self::UnmodifiableMapMixin<dynamic, dynamic> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin*
diff --git a/pkg/front_end/testcases/general/issue41210a.dart b/pkg/front_end/testcases/general/issue41210a.dart
index 7f16a06..78cfc3c 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart
+++ b/pkg/front_end/testcases/general/issue41210a.dart
@@ -24,6 +24,10 @@
class E with A, D {} // ok
+abstract class F implements Interface {}
+
+class G with A, F {} // ok
+
main() {
print(C().method(0));
}
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
index 2c30295..20bf60b 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
@@ -95,16 +95,16 @@
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
- abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
+ abstract mixin-stub method method(core::num* i) → core::String*; -> self::B::method
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
;
- abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
}
abstract class D extends core::Object implements self::Interface, self::Interface2 {
synthetic constructor •() → self::D*
;
+ abstract forwarding-stub method method(covariant core::num* i) → core::String*;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -115,7 +115,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract forwarding-stub method method(covariant core::num* i) → core::String*;
}
abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&A*
@@ -139,11 +138,51 @@
: super self::_E&Object&A::•()
;
forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*
- return super.{self::A::method}(i, s: s);
+ return super.{self::_E&Object&A::method}(i, s: s);
}
class E extends self::_E&Object&A&D {
synthetic constructor •() → self::E*
;
}
+abstract class F extends core::Object implements self::Interface {
+ synthetic constructor •() → self::F*
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+ return super.{self::A::method}(i, s: s);
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A&F*
+ : super self::_G&Object&A::•()
+ ;
+}
+class G extends self::_G&Object&A&F {
+ synthetic constructor •() → self::G*
+ ;
+}
static method main() → dynamic
;
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
index e33f9ba..2766232 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
@@ -98,18 +98,18 @@
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
- abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
+ abstract mixin-stub method method(core::num* i) → core::String*; -> self::B::method
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
: super self::_C&Object&A&B::•()
;
- abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
}
abstract class D extends core::Object implements self::Interface, self::Interface2 {
synthetic constructor •() → self::D*
: super core::Object::•()
;
+ abstract forwarding-stub method method(covariant core::num* i) → core::String*;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -120,7 +120,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract forwarding-stub method method(covariant core::num* i) → core::String*;
}
abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&A*
@@ -144,15 +143,57 @@
: super self::_E&Object&A::•()
;
forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*
- return super.{self::A::method}(i, s: s);
+ return super.{self::_E&Object&A::method}(i, s: s);
}
class E extends self::_E&Object&A&D {
synthetic constructor •() → self::E*
: super self::_E&Object&A&D::•()
;
}
+abstract class F extends core::Object implements self::Interface {
+ synthetic constructor •() → self::F*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+ return super.{self::A::method}(i, s: s);
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A&F*
+ : super self::_G&Object&A::•()
+ ;
+}
+class G extends self::_G&Object&A&F {
+ synthetic constructor •() → self::G*
+ : super self::_G&Object&A&F::•()
+ ;
+}
static method main() → dynamic {
- core::print(new self::C::•().{self::C::method}(0));
+ core::print(new self::C::•().{self::_C&Object&A&B::method}(0));
}
constants {
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect
index 8fc1032..599fc0f 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline.expect
@@ -20,4 +20,8 @@
class E with A, D {}
+abstract class F implements Interface {}
+
+class G with A, F {}
+
main() {}
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect
index 6ec25da..d6c9646 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.textual_outline_modelled.expect
@@ -4,6 +4,8 @@
abstract class D implements Interface, Interface2 {}
+abstract class F implements Interface {}
+
abstract class Interface {
String method(num i);
}
@@ -16,6 +18,8 @@
class E with A, D {}
+class G with A, F {}
+
main() {}
mixin A implements Interface {
String method(num i, {String s = "hello"}) => s;
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart b/pkg/front_end/testcases/general/issue41210b/issue41210.dart
index 01f7b3b..08bd4e4 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart
@@ -8,6 +8,8 @@
class E with A, D {} // ok
+class G with A, F {} // ok
+
main() {
print(C().method(0));
}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
index 8ea72fc..525ba41 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
@@ -24,22 +24,51 @@
;
mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
return super.{iss::A::method}(i, s: s);
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
}
abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
- abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
+ abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::B::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
;
- abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::_C&Object&A::method
}
abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&A*
: super core::Object::•()
;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
return super.{iss::A::method}(i, s: s);
}
@@ -47,12 +76,58 @@
const synthetic constructor •() → self::_E&Object&A&D*
: super self::_E&Object&A::•()
;
- abstract forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::D::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::D::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::D::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::D::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::D::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::D::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::D::runtimeType
+ forwarding-stub method method(covariant core::num* i) → core::String*
+ return super.{self::_E&Object&A::method}(i);
}
class E extends self::_E&Object&A&D {
synthetic constructor •() → self::E*
;
- abstract member-signature method method(covariant core::num* i, {core::String* s}) → core::String*; -> self::_E&Object&A&D::method
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A*
+ : super core::Object::•()
+ ;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+ mixin-super-stub method method(core::num* i, {core::String* s}) → core::String*
+ return super.{iss::A::method}(i, s: s);
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A&F*
+ : super self::_G&Object&A::•()
+ ;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::F::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::F::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::F::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::F::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::F::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::F::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::F::runtimeType
+}
+class G extends self::_G&Object&A&F {
+ synthetic constructor •() → self::G*
+ ;
}
static method main() → dynamic
;
@@ -135,6 +210,20 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
abstract forwarding-stub method method(covariant core::num* i) → core::String*;
}
+abstract class F extends core::Object implements iss::Interface {
+ synthetic constructor •() → iss::F*
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
constants {
#C1 = "hello"
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
index 91814ab..eb41372 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
@@ -24,23 +24,52 @@
;
mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
return super.{iss::A::method}(i, s: s);
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
}
abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
- abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
+ abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::B::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
: super self::_C&Object&A&B::•()
;
- abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
}
abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E&Object&A*
: super core::Object::•()
;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
return super.{iss::A::method}(i, s: s);
}
@@ -48,16 +77,63 @@
const synthetic constructor •() → self::_E&Object&A&D*
: super self::_E&Object&A::•()
;
- abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::D::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::D::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::D::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::D::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::D::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::D::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::D::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::D::runtimeType
+ forwarding-stub method method(covariant core::num* i) → core::String*
+ return super.{self::_E&Object&A::method}(i);
}
class E extends self::_E&Object&A&D {
synthetic constructor •() → self::E*
: super self::_E&Object&A&D::•()
;
- abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E&Object&A&D::method
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A*
+ : super core::Object::•()
+ ;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
+ mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+ return super.{iss::A::method}(i, s: s);
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_G&Object&A&F*
+ : super self::_G&Object&A::•()
+ ;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::F::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::F::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::F::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::F::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::F::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::F::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::F::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::F::runtimeType
+}
+class G extends self::_G&Object&A&F {
+ synthetic constructor •() → self::G*
+ : super self::_G&Object&A&F::•()
+ ;
}
static method main() → dynamic {
- core::print(new self::C::•().{self::C::method}(0));
+ core::print(new self::C::•().{self::_C&Object&A&B::method}(0));
}
library;
@@ -142,6 +218,21 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
abstract forwarding-stub method method(covariant core::num* i) → core::String*;
}
+abstract class F extends core::Object implements iss::Interface {
+ synthetic constructor •() → iss::F*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
constants {
#C1 = "hello"
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect
index 7354b67..8c473d0 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline.expect
@@ -4,4 +4,6 @@
class E with A, D {}
+class G with A, F {}
+
main() {}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect
index 7354b67..8c473d0 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.textual_outline_modelled.expect
@@ -4,4 +4,6 @@
class E with A, D {}
+class G with A, F {}
+
main() {}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart b/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart
index 61a4823..a209b30 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart
@@ -19,3 +19,5 @@
}
abstract class D implements Interface, Interface2 {}
+
+abstract class F implements Interface {}
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
index 3ede97f..db60ecb 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -203,8 +203,8 @@
synthetic constructor •() → self::A0*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A1&S&M1*
@@ -215,8 +215,8 @@
synthetic constructor •() → self::A1*
: super self::_A1&S&M1::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A2&S&M1*
@@ -232,15 +232,15 @@
synthetic constructor •() → self::A2*
: super self::_A2&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A0X&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A0X = self::_A0X&S&M with self::MX {
synthetic constructor •() → self::A0X*
@@ -256,8 +256,8 @@
synthetic constructor •() → self::_A1X&S&M1&M*
: super self::_A1X&S&M1::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A1X = self::_A1X&S&M1&M with self::MX {
synthetic constructor •() → self::A1X*
@@ -278,8 +278,8 @@
synthetic constructor •() → self::_A2X&S&M1&M2&M*
: super self::_A2X&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A2X = self::_A2X&S&M1&M2&M with self::MX {
synthetic constructor •() → self::A2X*
@@ -290,8 +290,8 @@
synthetic constructor •() → self::_B0&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B0 extends self::_B0&S&M {
synthetic constructor •() → self::B0*
@@ -306,8 +306,8 @@
synthetic constructor •() → self::_B1&S&M1&M*
: super self::_B1&S&M1::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B1 extends self::_B1&S&M1&M {
synthetic constructor •() → self::B1*
@@ -327,8 +327,8 @@
synthetic constructor •() → self::_B2&S&M1&M2&M*
: super self::_B2&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B2 extends self::_B2&S&M1&M2&M {
synthetic constructor •() → self::B2*
@@ -338,8 +338,8 @@
synthetic constructor •() → self::_B0X&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B0X&S&M&MX*
@@ -359,8 +359,8 @@
synthetic constructor •() → self::_B1X&S&M1&M*
: super self::_B1X&S&M1::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -385,8 +385,8 @@
synthetic constructor •() → self::_B2X&S&M1&M2&M*
: super self::_B2X&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
index a0c20c5..56cdffa 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
@@ -206,8 +206,8 @@
synthetic constructor •() → self::A0*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A1&S&M1*
@@ -218,8 +218,8 @@
synthetic constructor •() → self::A1*
: super self::_A1&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A2&S&M1*
@@ -235,15 +235,15 @@
synthetic constructor •() → self::A2*
: super self::_A2&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A0X&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A0X = self::_A0X&S&M with self::MX {
synthetic constructor •() → self::A0X*
@@ -259,8 +259,8 @@
synthetic constructor •() → self::_A1X&S&M1&M*
: super self::_A1X&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A1X = self::_A1X&S&M1&M with self::MX {
synthetic constructor •() → self::A1X*
@@ -281,8 +281,8 @@
synthetic constructor •() → self::_A2X&S&M1&M2&M*
: super self::_A2X&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A2X = self::_A2X&S&M1&M2&M with self::MX {
synthetic constructor •() → self::A2X*
@@ -293,8 +293,8 @@
synthetic constructor •() → self::_B0&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B0 extends self::_B0&S&M {
synthetic constructor •() → self::B0*
@@ -310,8 +310,8 @@
synthetic constructor •() → self::_B1&S&M1&M*
: super self::_B1&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B1 extends self::_B1&S&M1&M {
synthetic constructor •() → self::B1*
@@ -332,8 +332,8 @@
synthetic constructor •() → self::_B2&S&M1&M2&M*
: super self::_B2&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B2 extends self::_B2&S&M1&M2&M {
synthetic constructor •() → self::B2*
@@ -344,8 +344,8 @@
synthetic constructor •() → self::_B0X&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B0X&S&M&MX*
@@ -366,8 +366,8 @@
synthetic constructor •() → self::_B1X&S&M1&M*
: super self::_B1X&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -393,8 +393,8 @@
synthetic constructor •() → self::_B2X&S&M1&M2&M*
: super self::_B2X&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
index 5adab63..01e76d1 100644
--- a/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
@@ -52,11 +52,11 @@
;
mixin-super-stub method method1(core::num* argument1, core::num* argument2) → core::String*
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*
+ mixin-super-stub method method2(covariant core::int* argument1, core::num* argument2) → core::String*
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
+ forwarding-stub method method4(covariant core::int* argument1, covariant core::int* argument2) → core::String*
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
index 716fe27..f6a8a4d 100644
--- a/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
@@ -54,11 +54,11 @@
;
mixin-super-stub method method1(core::num* argument1, core::num* argument2) → core::String*
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*
+ mixin-super-stub method method2(covariant core::int* argument1, core::num* argument2) → core::String*
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
+ forwarding-stub method method4(covariant core::int* argument1, covariant core::int* argument2) → core::String*
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect
index a5302a7..8f9542d 100644
--- a/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.outline.expect
@@ -72,10 +72,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::MixinClass::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
}
abstract class _ClassExtendsMixinClass&Super&MixinClass = self::Super with self::MixinClass /*isAnonymousMixin*/ {
synthetic constructor •() → self::_ClassExtendsMixinClass&Super&MixinClass*
@@ -83,10 +86,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::MixinClass::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
}
abstract class ClassExtendsMixinClass extends self::_ClassExtendsMixinClass&Super&MixinClass {
synthetic constructor •() → self::ClassExtendsMixinClass*
@@ -98,10 +104,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::Mixin::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::Mixin::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::Mixin::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
}
abstract class _ClassExtendsMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/ {
synthetic constructor •() → self::_ClassExtendsMixin&Super&Mixin*
@@ -109,10 +118,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::Mixin::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::Mixin::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::Mixin::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
}
abstract class ClassExtendsMixin extends self::_ClassExtendsMixin&Super&Mixin {
synthetic constructor •() → self::ClassExtendsMixin*
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect
index 940088e..1a74047 100644
--- a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.expect
@@ -66,10 +66,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::MixinClass::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
}
abstract class _ClassExtendsMixinClass&Super&MixinClass = self::Super with self::MixinClass /*isAnonymousMixin*/ {
synthetic constructor •() → self::_ClassExtendsMixinClass&Super&MixinClass*
@@ -77,10 +80,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::MixinClass::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
}
abstract class ClassExtendsMixinClass extends self::_ClassExtendsMixinClass&Super&MixinClass {
synthetic constructor •() → self::ClassExtendsMixinClass*
@@ -93,10 +99,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::Mixin::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::Mixin::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::Mixin::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
}
abstract class _ClassExtendsMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/ {
synthetic constructor •() → self::_ClassExtendsMixin&Super&Mixin*
@@ -104,10 +113,13 @@
;
mixin-super-stub method concreteExtendsConcreteMixin() → void
return super.{self::Mixin::concreteExtendsConcreteMixin}();
+ abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
mixin-super-stub method concreteMixin() → void
return super.{self::Mixin::concreteMixin}();
mixin-super-stub method abstractExtendsConcreteMixin() → void
return super.{self::Mixin::abstractExtendsConcreteMixin}();
+ abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+ abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
}
abstract class ClassExtendsMixin extends self::_ClassExtendsMixin&Super&Mixin {
synthetic constructor •() → self::ClassExtendsMixin*
@@ -120,11 +132,11 @@
;
method method() → dynamic {
this.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
- this.{self::MixinClass::concreteExtendsAbstractMixin}();
+ this.{self::ClassEqMixinClass::concreteExtendsAbstractMixin}();
this.{self::ClassEqMixinClass::concreteMixin}();
this.{self::ClassEqMixinClass::abstractExtendsConcreteMixin}();
- this.{self::MixinClass::abstractExtendsAbstractMixin}();
- this.{self::MixinClass::abstractMixin}();
+ this.{self::ClassEqMixinClass::abstractExtendsAbstractMixin}();
+ this.{self::ClassEqMixinClass::abstractMixin}();
super.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::ClassEqMixinClass::concreteMixin}();
@@ -138,10 +150,10 @@
method method() → dynamic {
this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
- this.{self::MixinClass::concreteExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsAbstractMixin}();
this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsConcreteMixin}();
- this.{self::MixinClass::abstractExtendsAbstractMixin}();
- this.{self::MixinClass::abstractMixin}();
+ this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractMixin}();
super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
@@ -154,11 +166,11 @@
;
method method() → dynamic {
this.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
- this.{self::Mixin::concreteExtendsAbstractMixin}();
+ this.{self::ClassEqMixin::concreteExtendsAbstractMixin}();
this.{self::ClassEqMixin::concreteMixin}();
this.{self::ClassEqMixin::abstractExtendsConcreteMixin}();
- this.{self::Mixin::abstractExtendsAbstractMixin}();
- this.{self::Mixin::abstractMixin}();
+ this.{self::ClassEqMixin::abstractExtendsAbstractMixin}();
+ this.{self::ClassEqMixin::abstractMixin}();
super.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::ClassEqMixin::concreteMixin}();
@@ -171,11 +183,11 @@
;
method method() → dynamic {
this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
- this.{self::Mixin::concreteExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsAbstractMixin}();
this.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsConcreteMixin}();
- this.{self::Mixin::abstractExtendsAbstractMixin}();
- this.{self::Mixin::abstractMixin}();
+ this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixin&Super&Mixin::abstractMixin}();
super.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect
index 01a2d50..53cf7f1 100644
--- a/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.strong.transformed.expect
@@ -65,9 +65,9 @@
: super self::Super::•()
;
method concreteExtendsConcreteMixin() → void {}
+ abstract method concreteExtendsAbstractMixin() → void;
method concreteMixin() → void {}
method abstractExtendsConcreteMixin() → void {}
- abstract method concreteExtendsAbstractMixin() → void;
abstract method abstractExtendsAbstractMixin() → void;
abstract method abstractMixin() → void;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,9 +86,9 @@
: super self::Super::•()
;
method concreteExtendsConcreteMixin() → void {}
+ abstract method concreteExtendsAbstractMixin() → void;
method concreteMixin() → void {}
method abstractExtendsConcreteMixin() → void {}
- abstract method concreteExtendsAbstractMixin() → void;
abstract method abstractExtendsAbstractMixin() → void;
abstract method abstractMixin() → void;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -112,9 +112,9 @@
: super self::Super::•()
;
method concreteExtendsConcreteMixin() → void {}
+ abstract method concreteExtendsAbstractMixin() → void;
method concreteMixin() → void {}
method abstractExtendsConcreteMixin() → void {}
- abstract method concreteExtendsAbstractMixin() → void;
abstract method abstractExtendsAbstractMixin() → void;
abstract method abstractMixin() → void;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -133,9 +133,9 @@
: super self::Super::•()
;
method concreteExtendsConcreteMixin() → void {}
+ abstract method concreteExtendsAbstractMixin() → void;
method concreteMixin() → void {}
method abstractExtendsConcreteMixin() → void {}
- abstract method concreteExtendsAbstractMixin() → void;
abstract method abstractExtendsAbstractMixin() → void;
abstract method abstractMixin() → void;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -160,11 +160,11 @@
;
method method() → dynamic {
this.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
- this.{self::MixinClass::concreteExtendsAbstractMixin}();
+ this.{self::ClassEqMixinClass::concreteExtendsAbstractMixin}();
this.{self::ClassEqMixinClass::concreteMixin}();
this.{self::ClassEqMixinClass::abstractExtendsConcreteMixin}();
- this.{self::MixinClass::abstractExtendsAbstractMixin}();
- this.{self::MixinClass::abstractMixin}();
+ this.{self::ClassEqMixinClass::abstractExtendsAbstractMixin}();
+ this.{self::ClassEqMixinClass::abstractMixin}();
super.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::ClassEqMixinClass::concreteMixin}();
@@ -178,10 +178,10 @@
method method() → dynamic {
this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
- this.{self::MixinClass::concreteExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsAbstractMixin}();
this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsConcreteMixin}();
- this.{self::MixinClass::abstractExtendsAbstractMixin}();
- this.{self::MixinClass::abstractMixin}();
+ this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractMixin}();
super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
@@ -194,11 +194,11 @@
;
method method() → dynamic {
this.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
- this.{self::Mixin::concreteExtendsAbstractMixin}();
+ this.{self::ClassEqMixin::concreteExtendsAbstractMixin}();
this.{self::ClassEqMixin::concreteMixin}();
this.{self::ClassEqMixin::abstractExtendsConcreteMixin}();
- this.{self::Mixin::abstractExtendsAbstractMixin}();
- this.{self::Mixin::abstractMixin}();
+ this.{self::ClassEqMixin::abstractExtendsAbstractMixin}();
+ this.{self::ClassEqMixin::abstractMixin}();
super.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::ClassEqMixin::concreteMixin}();
@@ -211,11 +211,11 @@
;
method method() → dynamic {
this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
- this.{self::Mixin::concreteExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsAbstractMixin}();
this.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsConcreteMixin}();
- this.{self::Mixin::abstractExtendsAbstractMixin}();
- this.{self::Mixin::abstractMixin}();
+ this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsAbstractMixin}();
+ this.{self::_ClassExtendsMixin&Super&Mixin::abstractMixin}();
super.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
super.{self::Super::concreteExtendsAbstractMixin}();
super.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
index 4c683ea..d815435 100644
--- a/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
@@ -22,7 +22,6 @@
class C extends core::Iterable<core::Object*> {
synthetic constructor •() → self::C*
;
- abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -59,6 +58,7 @@
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
}
static method test() → dynamic
;
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
index ae6ded4..2418880 100644
--- a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
@@ -30,7 +30,6 @@
synthetic constructor •() → self::C*
: super core::Iterable::•()
;
- abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
}
static method test() → dynamic {
invalid-expression "pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
index ae6ded4..2418880 100644
--- a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
@@ -30,7 +30,6 @@
synthetic constructor •() → self::C*
: super core::Iterable::•()
;
- abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
}
static method test() → dynamic {
invalid-expression "pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect
index 3fb40fc..999fa79 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart.weak.expect
@@ -12,6 +12,26 @@
// var interfaceMethod1;
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:29:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+// ^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:35:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:35:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
// - A.abstractMethod
// - A.property1=
@@ -50,6 +70,36 @@
// void interfaceMethod3() {}
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:44:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:50:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+// ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:56:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+// ^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:8:8: Context: This is one inherited member.
+// void interfaceMethod1() {}
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:14:7: Context: This is the other inherited member.
+// var interfaceMethod1;
+// ^^^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/general_nnbd_opt_out/abstract_members.dart:56:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
// - A.abstractMethod
// - A.property1=
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.expect
@@ -8,6 +8,7 @@
;
method foo() → self::A*
return null;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect
index 732160e..c52e1a4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/abstract_overrides_concrete_with_no_such_method.dart.weak.transformed.expect
@@ -8,6 +8,7 @@
;
method foo() → self::A*
return null;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -16,7 +17,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class B extends self::A {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
index df77c0e..9bddb8c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
@@ -206,8 +206,8 @@
synthetic constructor •() → self::A0*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A1&S&M1*
@@ -218,8 +218,8 @@
synthetic constructor •() → self::A1*
: super self::_A1&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A2&S&M1*
@@ -235,15 +235,15 @@
synthetic constructor •() → self::A2*
: super self::_A2&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A0X&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A0X = self::_A0X&S&M with self::MX {
synthetic constructor •() → self::A0X*
@@ -259,8 +259,8 @@
synthetic constructor •() → self::_A1X&S&M1&M*
: super self::_A1X&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A1X = self::_A1X&S&M1&M with self::MX {
synthetic constructor •() → self::A1X*
@@ -281,8 +281,8 @@
synthetic constructor •() → self::_A2X&S&M1&M2&M*
: super self::_A2X&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class A2X = self::_A2X&S&M1&M2&M with self::MX {
synthetic constructor •() → self::A2X*
@@ -293,8 +293,8 @@
synthetic constructor •() → self::_B0&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B0 extends self::_B0&S&M {
synthetic constructor •() → self::B0*
@@ -310,8 +310,8 @@
synthetic constructor •() → self::_B1&S&M1&M*
: super self::_B1&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B1 extends self::_B1&S&M1&M {
synthetic constructor •() → self::B1*
@@ -332,8 +332,8 @@
synthetic constructor •() → self::_B2&S&M1&M2&M*
: super self::_B2&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
class B2 extends self::_B2&S&M1&M2&M {
synthetic constructor •() → self::B2*
@@ -344,8 +344,8 @@
synthetic constructor •() → self::_B0X&S&M*
: super self::S::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B0X&S&M&MX*
@@ -366,8 +366,8 @@
synthetic constructor •() → self::_B1X&S&M1&M*
: super self::_B1X&S&M1::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -393,8 +393,8 @@
synthetic constructor •() → self::_B2X&S&M1&M2&M*
: super self::_B2X&S&M1&M2::•()
;
- mixin-super-stub method foo([dynamic x = #C1]) → dynamic
- return super.{self::M::foo}(x);
+ mixin-super-stub method foo() → dynamic
+ return super.{self::M::foo}();
}
abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/ {
synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect
index e603673..50bca4d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.expect
@@ -30,7 +30,6 @@
synthetic constructor •() → self::C*
: super core::Iterable::•()
;
- abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
}
static method test() → dynamic {
invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart:14:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect
index e603673..50bca4d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart.weak.transformed.expect
@@ -30,7 +30,6 @@
synthetic constructor •() → self::C*
: super core::Iterable::•()
;
- abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* f) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
@@ -67,6 +66,7 @@
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
}
static method test() → dynamic {
invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/sdk_diagnostic.dart:14:8: Error: Too few positional arguments: 1 required, 0 given.
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
index 136a4b6..cd92eb8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_13.yaml.world.1.expect
@@ -7,6 +7,16 @@
synthetic constructor •() → main::ABC*
: super a::AB::•()
;
+ abstract mixin-stub get _identityHashCode() → dart.core::int*; -> a::C::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> a::C::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> a::C::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → dart.core::bool*; -> a::C::==
+ abstract mixin-stub get hashCode() → dart.core::int*; -> a::C::hashCode
+ abstract mixin-stub method toString() → dart.core::String*; -> a::C::toString
+ abstract mixin-stub method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> a::C::noSuchMethod
+ abstract mixin-stub get runtimeType() → dart.core::Type*; -> a::C::runtimeType
}
}
library from "package:module/a.dart" as a {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
index 20bd0f2..83dfce6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -6,6 +6,7 @@
abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/ {
abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+ abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
@@ -68,6 +69,7 @@
;
abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> fra::State::_widget
+ abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
index 89c1841..7e07afc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -6,6 +6,7 @@
abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/ {
abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+ abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
@@ -66,6 +67,13 @@
synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
: super fra::State::•()
;
+ abstract mixin-stub get _widget() → main::HotReloadIssue*; -> aft::AfterLayoutMixin::_widget
+ abstract mixin-stub set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> aft::AfterLayoutMixin::_widget
+ abstract mixin-stub method toString() → dart.core::String*; -> aft::AfterLayoutMixin::toString
+ abstract mixin-stub operator ==(dynamic other) → dart.core::bool*; -> aft::AfterLayoutMixin::==
+ abstract mixin-stub get hashCode() → dart.core::int*; -> aft::AfterLayoutMixin::hashCode
+ abstract mixin-stub method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> aft::AfterLayoutMixin::noSuchMethod
+ abstract mixin-stub get runtimeType() → dart.core::Type*; -> aft::AfterLayoutMixin::runtimeType
}
class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
synthetic constructor •() → main::_HotReloadIssueState*
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
index 4ebbef1..3cb283a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
@@ -5,7 +5,6 @@
synthetic constructor •() → main::AIterator*
: super dart.core::Iterator::•()
;
- abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -16,6 +15,7 @@
abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
}
class Foo extends dart.core::Object {
final field dynamic a;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
index f8aea1f..e82a2d4 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
@@ -34,7 +34,6 @@
synthetic constructor •() → main::BIterator*
: super dart.core::Iterator::•()
;
- abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -45,6 +44,7 @@
abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ abstract member-signature method moveNext() → dart.core::bool*; -> dart.core::Iterator::moveNext
}
class Foo extends dart.core::Object {
final field invalid-type kjsdf = null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
index daf5d03..9f2d3d5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
@@ -10,7 +10,6 @@
;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -55,6 +54,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method F<T extends core::Object* = dynamic>() → self::F::T*
;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
index 503c83f..0887aa4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
@@ -10,7 +10,6 @@
return null;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -55,6 +54,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method F<T extends core::Object* = dynamic>() → self::F::T*
return null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 21dd720..7754fb8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -11,7 +11,6 @@
return null;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -56,6 +55,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method F<T extends core::Object* = dynamic>() → self::F::T*
return null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
index e2413d9..fa0d3a1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
@@ -10,7 +10,6 @@
;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -55,6 +54,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method foo() → asy::Stream<core::List<core::int*>*>* async*
;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index 2420358..d6d38a5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -37,7 +37,6 @@
return null;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -82,6 +81,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method foo() → asy::Stream<core::List<core::int*>*>* async* {
yield<core::int*>[];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
index 5557102..5421bab 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
@@ -37,7 +37,6 @@
return null;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -82,6 +81,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method foo() → asy::Stream<core::List<core::int*>*>* /* originally async* */ {
asy::_AsyncStarStreamController<core::List<core::int*>*>* :controller;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index 3ceab23e..98b90b7 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -57,7 +57,6 @@
;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -102,6 +101,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError, () →* void onDone, core::bool* cancelOnError}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method test() → dynamic async
;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 040669a..fc3c8e8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -100,7 +100,6 @@
return null;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -145,6 +144,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method test() → dynamic async {
self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 4aa6578..e1ed3dc 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -195,7 +195,6 @@
return null;
abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
- abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
@@ -240,6 +239,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
}
static method test() → dynamic /* originally async */ {
final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
index db93300..1575bda 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
@@ -23,6 +23,7 @@
class E extends core::StackTrace {
synthetic constructor •() → self::E*
;
+ abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
index 17d888d..adbb087 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
@@ -26,6 +26,7 @@
synthetic constructor •() → self::E*
: super core::StackTrace::•()
;
+ abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
index 17d888d..adbb087 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
@@ -26,6 +26,7 @@
synthetic constructor •() → self::E*
: super core::StackTrace::•()
;
+ abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect
index 7c87b5f..08e7b3e 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.outline.expect
@@ -2,6 +2,13 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+// void set property6(int i); // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+// late final int? property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
// void set property6(int i); // error
@@ -10,12 +17,12 @@
// late final int? property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-// void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-// late final int? property6;
-// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
index 1e3b9c1..f982c6a 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
@@ -2,6 +2,13 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+// void set property6(int i); // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+// late final int? property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
// void set property6(int i); // error
@@ -10,12 +17,12 @@
// late final int? property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-// void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-// late final int? property6;
-// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
index 1e3b9c1..f982c6a 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
@@ -2,6 +2,13 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+// void set property6(int i); // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+// late final int? property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
// void set property6(int i); // error
@@ -10,12 +17,12 @@
// late final int? property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-// void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-// late final int? property6;
-// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
index f3ffff6..8d9af18 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
@@ -2,6 +2,13 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+// void set property6(int i); // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+// late final int? property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
// void set property6(int i); // error
@@ -10,12 +17,12 @@
// late final int? property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-// void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-// late final int? property6;
-// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
index f3ffff6..8d9af18 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
@@ -2,6 +2,13 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+// void set property6(int i); // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+// late final int? property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
// void set property6(int i); // error
@@ -10,12 +17,12 @@
// late final int? property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
-// void set property6(int i); // error
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
-// late final int? property6;
-// ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
//
// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
@@ -25,13 +32,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart b/pkg/front_end/testcases/late_lowering/late_override.dart
new file mode 100644
index 0000000..d2a3ddd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart
@@ -0,0 +1,15 @@
+// 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.
+
+class Interface {
+ late int implementedLateFieldDeclaredGetterSetter;
+}
+
+class Class implements Interface {
+ int get implementedLateFieldDeclaredGetterSetter => 0;
+
+ void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.outline.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.outline.expect
new file mode 100644
index 0000000..4278a64
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+ field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter;
+ synthetic constructor •() → self::Interface
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int;
+ set implementedLateFieldDeclaredGetterSetter(core::int #t1) → void;
+}
+class Class extends core::Object implements self::Interface {
+ synthetic constructor •() → self::Class
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ ;
+ set implementedLateFieldDeclaredGetterSetter(core::int value) → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.expect
new file mode 100644
index 0000000..0dffea5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+ field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+ synthetic constructor •() → self::Interface
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter") : #t1{core::int};
+ set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void
+ this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+}
+class Class extends core::Object implements self::Interface {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return 0;
+ set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.transformed.expect
new file mode 100644
index 0000000..0dffea5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+ field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+ synthetic constructor •() → self::Interface
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter") : #t1{core::int};
+ set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void
+ this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+}
+class Class extends core::Object implements self::Interface {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return 0;
+ set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline.expect
new file mode 100644
index 0000000..24986e8
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+class Interface {
+ late int implementedLateFieldDeclaredGetterSetter;
+}
+
+class Class implements Interface {
+ int get implementedLateFieldDeclaredGetterSetter => 0;
+ void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..61b08f4
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+class Class implements Interface {
+ int get implementedLateFieldDeclaredGetterSetter => 0;
+ void set implementedLateFieldDeclaredGetterSetter(int value) {}
+}
+class Interface {
+ ---- unknown chunk starts ----
+late
+---- unknown chunk ends ----
+ int implementedLateFieldDeclaredGetterSetter;
+}
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.expect
new file mode 100644
index 0000000..3f8b983
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+ field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+ field core::bool _#Interface#implementedLateFieldDeclaredGetterSetter#isSet = false;
+ synthetic constructor •() → self::Interface
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} ?{core::int} let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1{core::int} : throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter");
+ set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void {
+ this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} = true;
+ this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+ }
+}
+class Class extends core::Object implements self::Interface {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return 0;
+ set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.transformed.expect
new file mode 100644
index 0000000..3f8b983
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+ field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+ field core::bool _#Interface#implementedLateFieldDeclaredGetterSetter#isSet = false;
+ synthetic constructor •() → self::Interface
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} ?{core::int} let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} in #t1{core::int} : throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter");
+ set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void {
+ this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} = true;
+ this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+ }
+}
+class Class extends core::Object implements self::Interface {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ get implementedLateFieldDeclaredGetterSetter() → core::int
+ return 0;
+ set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
index 8b55238..f0666bf 100644
--- a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
@@ -95,141 +95,169 @@
synthetic constructor •() → self::_Class&Super&M0
: super self::Super::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M0::property
}
abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1
: super self::_Class&Super&M0::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M1::property
}
abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2
: super self::_Class&Super&M0&M1::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M2::property
}
abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
: super self::_Class&Super&M0&M1&M2::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M3::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
: super self::_Class&Super&M0&M1&M2&M3::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M4::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
: super self::_Class&Super&M0&M1&M2&M3&M4::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M5::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
: super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M6::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M7::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M8::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M9::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M10::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M11::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M12::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M13::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M14::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M15::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M16::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M17::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M18::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M19::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M20::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M21::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M22::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M23::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M24::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M25::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M26::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M27::property
}
class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
index 974275d..2ae4ce3 100644
--- a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
@@ -96,141 +96,169 @@
synthetic constructor •() → self::_Class&Super&M0
: super self::Super::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M0::property
}
abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1
: super self::_Class&Super&M0::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M1::property
}
abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2
: super self::_Class&Super&M0&M1::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M2::property
}
abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
: super self::_Class&Super&M0&M1&M2::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M3::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
: super self::_Class&Super&M0&M1&M2&M3::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M4::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
: super self::_Class&Super&M0&M1&M2&M3&M4::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M5::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
: super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M6::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M7::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M8::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M9::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M10::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M11::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M12::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M13::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M14::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M15::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M16::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M17::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M18::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M19::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M20::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M21::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M22::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M23::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M24::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M25::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M26::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M27::property
}
class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
index 974275d..2ae4ce3 100644
--- a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
@@ -96,141 +96,169 @@
synthetic constructor •() → self::_Class&Super&M0
: super self::Super::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M0::property
}
abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1
: super self::_Class&Super&M0::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M1::property
}
abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2
: super self::_Class&Super&M0&M1::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M2::property
}
abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
: super self::_Class&Super&M0&M1&M2::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M3::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
: super self::_Class&Super&M0&M1&M2&M3::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M4::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
: super self::_Class&Super&M0&M1&M2&M3&M4::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M5::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
: super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M6::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M7::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M8::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M9::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M10::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M11::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M12::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M13::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M14::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M15::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M16::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M17::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M18::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M19::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M20::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M21::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M22::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M23::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M24::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M25::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M26::property
}
abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
: super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
;
+ abstract mixin-stub get property() → core::int; -> self::M27::property
}
class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect
index da98632..a05e6c9 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.outline.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// num get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6 = 0;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// num get property6; // error
@@ -45,13 +52,6 @@
// int property6 = 0;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// num get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6 = 0;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect
index f2f3537..c6058f6 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.strong.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// num get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6 = 0;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// num get property6; // error
@@ -45,13 +52,6 @@
// int property6 = 0;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// num get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6 = 0;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect
index f2f3537..c6058f6 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// num get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6 = 0;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// num get property6; // error
@@ -45,13 +52,6 @@
// int property6 = 0;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// num get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6 = 0;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect
index 36042d2..40bce371 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.outline.expect
@@ -9,6 +9,13 @@
// late final int? property6;
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -17,13 +24,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect
index e53ccba4..4d7c28b 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.expect
@@ -9,6 +9,13 @@
// late final int? property6;
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -17,13 +24,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect
index e53ccba4..4d7c28b 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.strong.transformed.expect
@@ -9,6 +9,13 @@
// late final int? property6;
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -17,13 +24,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect
index e53ccba4..4d7c28b 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.expect
@@ -9,6 +9,13 @@
// late final int? property6;
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -17,13 +24,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect
index e53ccba4..4d7c28b 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.transformed.expect
@@ -9,6 +9,13 @@
// late final int? property6;
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+// late int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -17,13 +24,6 @@
// late int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
-// late int property6;
-// ^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect
index ced9893..73e689a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.outline.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -45,13 +52,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -45,13 +52,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -45,13 +52,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -45,13 +52,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
index 93b128d..c6bf46a 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
@@ -37,6 +37,13 @@
// void set property3(int i);
// ^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+// int? get property6; // error
+// ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+// int property6;
+// ^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
// Change to a subtype of 'int'.
// int? get property6; // error
@@ -45,13 +52,6 @@
// int property6;
// ^
//
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
-// int? get property6; // error
-// ^^^^^^^^^
-// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
-// int property6;
-// ^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
// abstract class D3 implements D1, D2 /* error on property3 */ {}
// ^
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
index e08ec43..30674ab 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
@@ -173,6 +173,16 @@
synthetic constructor •() → gen::LegacyClass3*
: super self::Class1::•()
;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
@@ -185,15 +195,5 @@
abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
- abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
- abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
- abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
- abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
- abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
- abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
- abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
- abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
- abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
index e08ec43..30674ab 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
@@ -173,6 +173,16 @@
synthetic constructor •() → gen::LegacyClass3*
: super self::Class1::•()
;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
@@ -185,15 +195,5 @@
abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
- abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
- abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
- abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
- abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
- abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
- abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
- abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
- abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
- abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect
index e1f73da..0f16923 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.expect
@@ -28,10 +28,12 @@
synthetic constructor •() → self::Class
: super self::Super::•()
;
+ abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
mixin-super-stub method extendedConcreteMixedInConcreteMethod() → void
return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
- abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
- forwarding-stub method extendedConcreteMixedInConcreteImplementedMethod(covariant core::num i) → void
+ forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void
+ return super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(i);
+ forwarding-stub method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void
return super.{self::Mixin::extendedConcreteMixedInConcreteImplementedMethod}(i);
}
class Sub extends self::Class {
@@ -39,15 +41,14 @@
: super self::Class::•()
;
method test() → void {
- this.{self::Mixin::extendedConcreteMixedInAbstractMethod}();
+ this.{self::Class::extendedConcreteMixedInAbstractMethod}();
super.{self::Super::extendedConcreteMixedInAbstractMethod}();
this.{self::Class::extendedConcreteMixedInConcreteMethod}();
super.{self::Class::extendedConcreteMixedInConcreteMethod}();
- this.{self::Sub::extendedConcreteMixedInAbstractImplementedMethod}(0);
- super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(0);
+ this.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
+ super.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
this.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
super.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
}
- abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
index 709b09a..8f44020 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
@@ -28,25 +28,24 @@
synthetic constructor •() → self::Class
: super self::Super::•()
;
+ abstract method extendedConcreteMixedInAbstractMethod() → void;
method extendedConcreteMixedInConcreteMethod() → void {}
abstract method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void;
method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void {}
- abstract method extendedConcreteMixedInAbstractMethod() → void;
}
class Sub extends self::Class {
synthetic constructor •() → self::Sub
: super self::Class::•()
;
method test() → void {
- this.{self::Mixin::extendedConcreteMixedInAbstractMethod}();
+ this.{self::Class::extendedConcreteMixedInAbstractMethod}();
super.{self::Super::extendedConcreteMixedInAbstractMethod}();
this.{self::Class::extendedConcreteMixedInConcreteMethod}();
super.{self::Class::extendedConcreteMixedInConcreteMethod}();
- this.{self::Sub::extendedConcreteMixedInAbstractImplementedMethod}(0);
- super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(0);
+ this.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
+ super.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
this.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
super.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
}
- abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect
index 825a474..f1538ce 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.expect
@@ -12,13 +12,6 @@
// int get extendedMethodMixedInGetter => 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Error: Can't declare a member that conflicts with an inherited one.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:17:12: Context: This is the inherited member.
-// void set extendedSetterMixedInMethod(int value) {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:93:11: Error: Can't declare a member that conflicts with an inherited one.
// int get extendedMethodDeclaredGetter => 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -57,51 +50,37 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:100:11: Error: Can't declare a member that conflicts with an inherited one.
// int get mixedInMethodDeclaredGetter => 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:29:8: Context: This is the inherited member.
+// void mixedInMethodDeclaredGetter() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:102:7: Error: Can't declare a member that conflicts with an inherited one.
// int mixedInMethodDeclaredField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:31:8: Context: This is the inherited member.
+// void mixedInMethodDeclaredField() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:103:8: Error: Can't declare a member that conflicts with an inherited one.
// void mixedInGetterDeclaredMethod() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:32:11: Context: This is the inherited member.
+// int get mixedInGetterDeclaredMethod => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:104:8: Error: Can't declare a member that conflicts with an inherited one.
// void mixedInSetterDeclaredMethod() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:104:8: Error: 'Mixin.mixedInSetterDeclaredMethod==' is already declared in this scope.
-// void mixedInSetterDeclaredMethod() {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: Previous declaration of 'Mixin.mixedInSetterDeclaredMethod=='.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:33:12: Context: This is the inherited member.
+// void set mixedInSetterDeclaredMethod(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:105:8: Error: Can't declare a member that conflicts with an inherited one.
// void mixedInFieldDeclaredMethod() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:105:8: Error: 'Mixin.mixedInFieldDeclaredMethod=' is already declared in this scope.
-// void mixedInFieldDeclaredMethod() {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: Previous declaration of 'Mixin.mixedInFieldDeclaredMethod='.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:34:7: Context: This is the inherited member.
+// int mixedInFieldDeclaredMethod = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:107:11: Error: Can't declare a member that conflicts with an inherited one.
// int get implementedMethodDeclaredGetter => 0;
@@ -155,16 +134,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:101:12: Error: Can't declare a member that conflicts with an inherited one.
// void set mixedInMethodDeclaredSetter(int value) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: This is the inherited member.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:101:12: Error: 'Mixin.mixedInMethodDeclaredSetter' is already declared in this scope.
-// void set mixedInMethodDeclaredSetter(int value) {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Context: Previous declaration of 'Mixin.mixedInMethodDeclaredSetter'.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:30:8: Context: This is the inherited member.
+// void mixedInMethodDeclaredSetter() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:108:12: Error: Can't declare a member that conflicts with an inherited one.
// void set implementedMethodDeclaredSetter(int value) {}
@@ -277,6 +249,8 @@
synthetic constructor •() → self::_Class&Super&Mixin
: super self::Super::•()
;
+ mixin-super-stub method mixedInMethodDeclaredSetter() → void
+ return super.{self::Mixin::mixedInMethodDeclaredSetter}();
mixin-super-stub get mixedInFieldDeclaredMethod() → core::int
return super.{self::Mixin::mixedInFieldDeclaredMethod};
mixin-super-stub set mixedInFieldDeclaredMethod(core::int value) → void
@@ -285,12 +259,12 @@
return super.{self::Mixin::mixedInFieldImplementedMethod};
mixin-super-stub set mixedInFieldImplementedMethod(core::int value) → void
return super.{self::Mixin::mixedInFieldImplementedMethod} = value;
+ mixin-super-stub get extendedMethodMixedInField() → core::int
+ return super.{self::Mixin::extendedMethodMixedInField};
mixin-super-stub set extendedMethodMixedInField(core::int value) → void
return super.{self::Mixin::extendedMethodMixedInField} = value;
mixin-super-stub method mixedInMethodDeclaredGetter() → void
return super.{self::Mixin::mixedInMethodDeclaredGetter}();
- mixin-super-stub method mixedInMethodDeclaredSetter() → void
- return super.{self::Mixin::mixedInMethodDeclaredSetter}();
mixin-super-stub method mixedInMethodDeclaredField() → void
return super.{self::Mixin::mixedInMethodDeclaredField}();
mixin-super-stub get mixedInGetterDeclaredMethod() → core::int
@@ -303,8 +277,14 @@
return super.{self::Mixin::mixedInMethodImplementedField}();
mixin-super-stub get mixedInGetterImplementedMethod() → core::int
return super.{self::Mixin::mixedInGetterImplementedMethod};
+ mixin-super-stub get extendedMethodMixedInGetter() → core::int
+ return super.{self::Mixin::extendedMethodMixedInGetter};
+ mixin-super-stub method extendedGetterMixedInMethod() → void
+ return super.{self::Mixin::extendedGetterMixedInMethod}();
mixin-super-stub method extendedSetterMixedInMethod() → void
return super.{self::Mixin::extendedSetterMixedInMethod}();
+ mixin-super-stub method extendedFieldMixedInMethod() → void
+ return super.{self::Mixin::extendedFieldMixedInMethod}();
mixin-super-stub set mixedInSetterDeclaredMethod(core::int value) → void
return super.{self::Mixin::mixedInSetterDeclaredMethod} = value;
mixin-super-stub set mixedInSetterImplementedMethod(core::int value) → void
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect
index fd7af41..becdaa6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.expect
@@ -3,12 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-// - AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=
-// - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
-// - AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
+// - Super.extendedAbstractImplementedField
+// - Super.extendedAbstractImplementedField=
+// - Super.extendedAbstractImplementedMultipleField
+// - Super.extendedAbstractImplementedMultipleField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -17,26 +20,38 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField' is defined here.
+// abstract int extendedAbstractImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField=' is defined here.
+// abstract int extendedAbstractImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+// abstract int extendedAbstractImplementedMultipleField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField=' is defined here.
+// abstract int extendedAbstractImplementedMultipleField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
// - Super.extendedAbstractImplementedField
@@ -51,6 +66,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect
index fd7af41..becdaa6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.transformed.expect
@@ -3,12 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-// - AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=
-// - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
-// - AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
+// - Super.extendedAbstractImplementedField
+// - Super.extendedAbstractImplementedField=
+// - Super.extendedAbstractImplementedMultipleField
+// - Super.extendedAbstractImplementedMultipleField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -17,26 +20,38 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField=%Interface1.extendedAbstractImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField=%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField' is defined here.
+// abstract int extendedAbstractImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField=' is defined here.
+// abstract int extendedAbstractImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+// abstract int extendedAbstractImplementedMultipleField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField=' is defined here.
+// abstract int extendedAbstractImplementedMultipleField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
// - Super.extendedAbstractImplementedField
@@ -51,6 +66,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect
index 1fe2215..e65fe64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.expect
@@ -3,9 +3,12 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-// - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
+// - Super.extendedAbstractImplementedField
+// - Super.extendedAbstractImplementedMultipleField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// final int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:12:22: Context: 'Super.extendedAbstractImplementedField' is defined here.
+// abstract final int extendedAbstractImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:16:22: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+// abstract final int extendedAbstractImplementedMultipleField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
// - Super.extendedAbstractImplementedField
// - Super.extendedAbstractImplementedMultipleField
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// final int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect
index 1fe2215..e65fe64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.transformed.expect
@@ -3,9 +3,12 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField
-// - AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
+// - Super.extendedAbstractImplementedField
+// - Super.extendedAbstractImplementedMultipleField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedField%Interface1.extendedAbstractImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleField%Interface1.extendedAbstractImplementedMultipleField%Interface2.extendedAbstractImplementedMultipleField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// final int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:12:22: Context: 'Super.extendedAbstractImplementedField' is defined here.
+// abstract final int extendedAbstractImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:16:22: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+// abstract final int extendedAbstractImplementedMultipleField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedField
+// - Interface1.extendedAbstractImplementedMultipleField
+// - Interface2.extendedAbstractImplementedMultipleField
// - Super.extendedAbstractField
// - Super.extendedAbstractImplementedField
// - Super.extendedAbstractImplementedMultipleField
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+// final int extendedAbstractImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+// final int extendedAbstractImplementedMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect
index 68eae42..39f968f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.expect
@@ -3,9 +3,12 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter
-// - AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter
+// - Interface1.extendedAbstractImplementedGetter
+// - Interface1.extendedAbstractImplementedMultipleGetter
+// - Interface2.extendedAbstractImplementedMultipleGetter
// - Super.extendedAbstractGetter
+// - Super.extendedAbstractImplementedGetter
+// - Super.extendedAbstractImplementedMultipleGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+// int get extendedAbstractImplementedGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:12:11: Context: 'Super.extendedAbstractImplementedGetter' is defined here.
+// int get extendedAbstractImplementedGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:16:11: Context: 'Super.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedGetter
+// - Interface1.extendedAbstractImplementedMultipleGetter
+// - Interface2.extendedAbstractImplementedMultipleGetter
// - Super.extendedAbstractGetter
// - Super.extendedAbstractImplementedGetter
// - Super.extendedAbstractImplementedMultipleGetter
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+// int get extendedAbstractImplementedGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect
index 68eae42..39f968f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.transformed.expect
@@ -3,9 +3,12 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter
-// - AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter
+// - Interface1.extendedAbstractImplementedGetter
+// - Interface1.extendedAbstractImplementedMultipleGetter
+// - Interface2.extendedAbstractImplementedMultipleGetter
// - Super.extendedAbstractGetter
+// - Super.extendedAbstractImplementedGetter
+// - Super.extendedAbstractImplementedMultipleGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedGetter%Interface1.extendedAbstractImplementedGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleGetter%Interface1.extendedAbstractImplementedMultipleGetter%Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+// int get extendedAbstractImplementedGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:12:11: Context: 'Super.extendedAbstractImplementedGetter' is defined here.
+// int get extendedAbstractImplementedGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:16:11: Context: 'Super.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedGetter
+// - Interface1.extendedAbstractImplementedMultipleGetter
+// - Interface2.extendedAbstractImplementedMultipleGetter
// - Super.extendedAbstractGetter
// - Super.extendedAbstractImplementedGetter
// - Super.extendedAbstractImplementedMultipleGetter
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+// int get extendedAbstractImplementedGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+// int get extendedAbstractImplementedMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect
index 7d6110d..2bb4d30 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.expect
@@ -3,8 +3,11 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-// - AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod
+// - Interface1.extendedAbstractImplementedMethod
+// - Interface1.extendedAbstractImplementedMultipleMethod
+// - Interface2.extendedAbstractImplementedMultipleMethod
+// - Super.extendedAbstractImplementedMethod
+// - Super.extendedAbstractImplementedMultipleMethod
// - Super.extendedAbstractMethod
// Try to either
// - provide an implementation,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:16:8: Context: 'Super.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedMethod
+// - Interface1.extendedAbstractImplementedMultipleMethod
+// - Interface2.extendedAbstractImplementedMultipleMethod
// - Super.extendedAbstractImplementedMethod
// - Super.extendedAbstractImplementedMultipleMethod
// - Super.extendedAbstractMethod
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
// void extendedAbstractImplementedMethod();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect
index 7d6110d..2bb4d30 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.transformed.expect
@@ -3,8 +3,11 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-// - AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod
+// - Interface1.extendedAbstractImplementedMethod
+// - Interface1.extendedAbstractImplementedMultipleMethod
+// - Interface2.extendedAbstractImplementedMultipleMethod
+// - Super.extendedAbstractImplementedMethod
+// - Super.extendedAbstractImplementedMultipleMethod
// - Super.extendedAbstractMethod
// Try to either
// - provide an implementation,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleMethod%Interface1.extendedAbstractImplementedMultipleMethod%Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:16:8: Context: 'Super.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedMethod
+// - Interface1.extendedAbstractImplementedMultipleMethod
+// - Interface2.extendedAbstractImplementedMultipleMethod
// - Super.extendedAbstractImplementedMethod
// - Super.extendedAbstractImplementedMultipleMethod
// - Super.extendedAbstractMethod
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+// void extendedAbstractImplementedMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
// void extendedAbstractImplementedMethod();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect
index 9a3a3e9..e2cfcb3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.expect
@@ -3,8 +3,11 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==
-// - AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==
+// - Interface1.extendedAbstractImplementedMultipleSetter=
+// - Interface1.extendedAbstractImplementedSetter=
+// - Interface2.extendedAbstractImplementedMultipleSetter=
+// - Super.extendedAbstractImplementedMultipleSetter=
+// - Super.extendedAbstractImplementedSetter=
// - Super.extendedAbstractSetter=
// Try to either
// - provide an implementation,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+// void set extendedAbstractImplementedSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:12:12: Context: 'Super.extendedAbstractImplementedSetter=' is defined here.
+// void set extendedAbstractImplementedSetter(int value);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
// void set extendedAbstractSetter(int value);
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedMultipleSetter=
+// - Interface1.extendedAbstractImplementedSetter=
+// - Interface2.extendedAbstractImplementedMultipleSetter=
// - Super.extendedAbstractImplementedMultipleSetter=
// - Super.extendedAbstractImplementedSetter=
// - Super.extendedAbstractSetter=
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+// void set extendedAbstractImplementedSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
// void set extendedAbstractImplementedMultipleSetter(int value);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect
index 9a3a3e9..e2cfcb3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.transformed.expect
@@ -3,8 +3,11 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==
-// - AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==
+// - Interface1.extendedAbstractImplementedMultipleSetter=
+// - Interface1.extendedAbstractImplementedSetter=
+// - Interface2.extendedAbstractImplementedMultipleSetter=
+// - Super.extendedAbstractImplementedMultipleSetter=
+// - Super.extendedAbstractImplementedSetter=
// - Super.extendedAbstractSetter=
// Try to either
// - provide an implementation,
@@ -14,17 +17,29 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMultipleSetter=%Interface1.extendedAbstractImplementedMultipleSetter=%Interface2.extendedAbstractImplementedMultipleSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:35:16: Context: 'AbstractClass.Super.extendedAbstractImplementedSetter=%Interface1.extendedAbstractImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+// void set extendedAbstractImplementedSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:12:12: Context: 'Super.extendedAbstractImplementedSetter=' is defined here.
+// void set extendedAbstractImplementedSetter(int value);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
// void set extendedAbstractSetter(int value);
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedMultipleSetter=
+// - Interface1.extendedAbstractImplementedSetter=
+// - Interface2.extendedAbstractImplementedMultipleSetter=
// - Super.extendedAbstractImplementedMultipleSetter=
// - Super.extendedAbstractImplementedSetter=
// - Super.extendedAbstractSetter=
@@ -36,6 +51,15 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+// void set extendedAbstractImplementedSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+// void set extendedAbstractImplementedMultipleSetter(int value) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
// void set extendedAbstractImplementedMultipleSetter(int value);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect
index d886bdb..fe7b938 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.expect
@@ -2,17 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field1' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:6:7: Context: The return type of the method 'Super.field1' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field1'.
-// Change to a subtype of 'int'.
-// num field1 = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:23:16: Context: This is the overridden method ('field1').
-// abstract int field1;
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The return type of the method 'Class.field2' is 'String', which does not match the return type, 'num', of the overridden method, 'Super.field2'.
// Change to a subtype of 'num'.
// abstract String field2;
@@ -21,17 +10,6 @@
// num field2 = 0;
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field2' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: The return type of the method 'Super.field2' is 'num', which does not match the return type, 'String', of the overridden method, 'Class.field2'.
-// Change to a subtype of 'String'.
-// num field2 = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Context: This is the overridden method ('field2').
-// abstract String field2;
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The return type of the method 'Class.field2' is 'String', which does not match the return type, 'int', of the overridden method, 'Interface.field2'.
// Change to a subtype of 'int'.
// abstract String field2;
@@ -56,17 +34,6 @@
// covariant int field2 = 0;
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field3' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:8:7: Context: The return type of the method 'Super.field3' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field3'.
-// Change to a subtype of 'int'.
-// num field3 = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Context: This is the overridden method ('field3').
-// abstract int field3;
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Error: The parameter '#externalFieldValue' of the method 'Class.field3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.field3'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
// abstract int field3;
@@ -75,17 +42,6 @@
// num field3 = 0;
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field4' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:10:17: Context: The return type of the method 'Super.field4' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field4'.
-// Change to a subtype of 'int'.
-// covariant num field4 = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:27:16: Context: This is the overridden method ('field4').
-// abstract int field4;
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:28:16: Error: The return type of the method 'Class.field5' is 'num', which does not match the return type, 'int', of the overridden method, 'Super.field5'.
// Change to a subtype of 'int'.
// abstract num field5;
@@ -102,6 +58,50 @@
// int field5 = 0;
// ^
//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field1' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:6:7: Context: The return type of the method 'Super.field1' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field1'.
+// Change to a subtype of 'int'.
+// num field1 = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:23:16: Context: This is the overridden method ('field1').
+// abstract int field1;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: The return type of the method 'Super.field2' is 'num', which does not match the return type, 'String', of the overridden method, 'Class.field2'.
+// Change to a subtype of 'String'.
+// num field2 = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Context: This is the overridden method ('field2').
+// abstract String field2;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field3' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:8:7: Context: The return type of the method 'Super.field3' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field3'.
+// Change to a subtype of 'int'.
+// num field3 = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Context: This is the overridden method ('field3').
+// abstract int field3;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field4' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:10:17: Context: The return type of the method 'Super.field4' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field4'.
+// Change to a subtype of 'int'.
+// covariant num field4 = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:27:16: Context: This is the overridden method ('field4').
+// abstract int field4;
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect
index 9e0138f..e46c242 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.expect
@@ -10,17 +10,6 @@
// void method2(num n) {}
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:22:7: Error: The implementation of 'method2' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:20: Context: The parameter 'n' of the method 'Super.method2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.method2'.
-// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
-// void method2(num n) {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:8: Context: This is the overridden method ('method2').
-// void method2(String i);
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:23: Error: The parameter 'i' of the method 'Class.method2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.method2'.
// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
// void method2(String i);
@@ -37,6 +26,17 @@
// void method3(num n) {}
// ^
//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:22:7: Error: The implementation of 'method2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:20: Context: The parameter 'n' of the method 'Super.method2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.method2'.
+// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
+// void method2(num n) {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:8: Context: This is the overridden method ('method2').
+// void method2(String i);
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect
index a58eb8f..a95406c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.expect
@@ -10,17 +10,6 @@
// void set setter2(num n) {}
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:22:7: Error: The implementation of 'setter2' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super implements Interface {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:24: Context: The parameter 'n' of the method 'Super.setter2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.setter2'.
-// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
-// void set setter2(num n) {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:12: Context: This is the overridden method ('setter2').
-// void set setter2(String i);
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:27: Error: The parameter 'i' of the method 'Class.setter2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.setter2'.
// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
// void set setter2(String i);
@@ -37,6 +26,17 @@
// void set setter3(num n) {}
// ^
//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:22:7: Error: The implementation of 'setter2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:24: Context: The parameter 'n' of the method 'Super.setter2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.setter2'.
+// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
+// void set setter2(num n) {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:12: Context: This is the overridden method ('setter2').
+// void set setter2(String i);
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect
index 638bf6e..e9fa156 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.expect
@@ -3,16 +3,18 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1
-// - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=
-// - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2
-// - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=
-// - AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField
-// - AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=
-// - AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField
-// - AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=
+// - Interface1.extendedAbstractCovariantImplementedField
+// - Interface1.extendedAbstractImplementedCovariantField
+// - Interface1.implementsMultipleCovariantField1
+// - Interface1.implementsMultipleCovariantField2
+// - Interface2.implementsMultipleCovariantField1
+// - Interface2.implementsMultipleCovariantField2
// - Super.extendedAbstractCovariantField
// - Super.extendedAbstractCovariantField=
+// - Super.extendedAbstractCovariantImplementedField
+// - Super.extendedAbstractCovariantImplementedField=
+// - Super.extendedAbstractImplementedCovariantField
+// - Super.extendedAbstractImplementedCovariantField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -21,38 +23,46 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+// int extendedAbstractCovariantImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+// covariant int extendedAbstractImplementedCovariantField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
+// covariant int implementsMultipleCovariantField1 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:30:7: Context: 'Interface1.implementsMultipleCovariantField2' is defined here.
+// int implementsMultipleCovariantField2 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:34:7: Context: 'Interface2.implementsMultipleCovariantField1' is defined here.
+// int implementsMultipleCovariantField1 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:36:17: Context: 'Interface2.implementsMultipleCovariantField2' is defined here.
+// covariant int implementsMultipleCovariantField2 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField' is defined here.
// abstract covariant int extendedAbstractCovariantField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField=' is defined here.
// abstract covariant int extendedAbstractCovariantField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField' is defined here.
+// abstract covariant int extendedAbstractCovariantImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField=' is defined here.
+// abstract covariant int extendedAbstractCovariantImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField' is defined here.
+// abstract int extendedAbstractImplementedCovariantField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField=' is defined here.
+// abstract int extendedAbstractImplementedCovariantField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractCovariantImplementedField
+// - Interface1.extendedAbstractImplementedCovariantField
// - Interface1.implementsMultipleCovariantField1
// - Interface1.implementsMultipleCovariantField2
// - Interface2.implementsMultipleCovariantField1
@@ -71,6 +81,12 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+// int extendedAbstractCovariantImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+// covariant int extendedAbstractImplementedCovariantField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
// covariant int implementsMultipleCovariantField1 = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect
index 638bf6e..e9fa156 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.transformed.expect
@@ -3,16 +3,18 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1
-// - AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=
-// - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2
-// - AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=
-// - AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField
-// - AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=
-// - AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField
-// - AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=
+// - Interface1.extendedAbstractCovariantImplementedField
+// - Interface1.extendedAbstractImplementedCovariantField
+// - Interface1.implementsMultipleCovariantField1
+// - Interface1.implementsMultipleCovariantField2
+// - Interface2.implementsMultipleCovariantField1
+// - Interface2.implementsMultipleCovariantField2
// - Super.extendedAbstractCovariantField
// - Super.extendedAbstractCovariantField=
+// - Super.extendedAbstractCovariantImplementedField
+// - Super.extendedAbstractCovariantImplementedField=
+// - Super.extendedAbstractImplementedCovariantField
+// - Super.extendedAbstractImplementedCovariantField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -21,38 +23,46 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField1%Interface2.implementsMultipleCovariantField1=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantField2%Interface2.implementsMultipleCovariantField2=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField%Interface1.extendedAbstractCovariantImplementedField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedField=%Interface1.extendedAbstractCovariantImplementedField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField%Interface1.extendedAbstractImplementedCovariantField' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantField=%Interface1.extendedAbstractImplementedCovariantField=' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+// int extendedAbstractCovariantImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+// covariant int extendedAbstractImplementedCovariantField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
+// covariant int implementsMultipleCovariantField1 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:30:7: Context: 'Interface1.implementsMultipleCovariantField2' is defined here.
+// int implementsMultipleCovariantField2 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:34:7: Context: 'Interface2.implementsMultipleCovariantField1' is defined here.
+// int implementsMultipleCovariantField1 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:36:17: Context: 'Interface2.implementsMultipleCovariantField2' is defined here.
+// covariant int implementsMultipleCovariantField2 = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField' is defined here.
// abstract covariant int extendedAbstractCovariantField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField=' is defined here.
// abstract covariant int extendedAbstractCovariantField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField' is defined here.
+// abstract covariant int extendedAbstractCovariantImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField=' is defined here.
+// abstract covariant int extendedAbstractCovariantImplementedField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField' is defined here.
+// abstract int extendedAbstractImplementedCovariantField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField=' is defined here.
+// abstract int extendedAbstractImplementedCovariantField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractCovariantImplementedField
+// - Interface1.extendedAbstractImplementedCovariantField
// - Interface1.implementsMultipleCovariantField1
// - Interface1.implementsMultipleCovariantField2
// - Interface2.implementsMultipleCovariantField1
@@ -71,6 +81,12 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+// int extendedAbstractCovariantImplementedField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+// covariant int extendedAbstractImplementedCovariantField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
// covariant int implementsMultipleCovariantField1 = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect
index a4f6917..e15c8ba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.expect
@@ -3,11 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1
-// - AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2
-// - AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod
-// - AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod
+// - Interface1.extendedAbstractCovariantImplementedMethod
+// - Interface1.extendedAbstractImplementedCovariantMethod
+// - Interface1.implementsMultipleCovariantMethod1
+// - Interface1.implementsMultipleCovariantMethod2
+// - Interface2.implementsMultipleCovariantMethod1
+// - Interface2.implementsMultipleCovariantMethod2
+// - Super.extendedAbstractCovariantImplementedMethod
// - Super.extendedAbstractCovariantMethod
+// - Super.extendedAbstractImplementedCovariantMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+// void extendedAbstractCovariantImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+// void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
+// void implementsMultipleCovariantMethod1(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:30:8: Context: 'Interface1.implementsMultipleCovariantMethod2' is defined here.
+// void implementsMultipleCovariantMethod2(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:34:8: Context: 'Interface2.implementsMultipleCovariantMethod1' is defined here.
+// void implementsMultipleCovariantMethod1(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:36:8: Context: 'Interface2.implementsMultipleCovariantMethod2' is defined here.
+// void implementsMultipleCovariantMethod2(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:12:8: Context: 'Super.extendedAbstractCovariantImplementedMethod' is defined here.
+// void extendedAbstractCovariantImplementedMethod(covariant int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:8:8: Context: 'Super.extendedAbstractCovariantMethod' is defined here.
// void extendedAbstractCovariantMethod(covariant int i);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:16:8: Context: 'Super.extendedAbstractImplementedCovariantMethod' is defined here.
+// void extendedAbstractImplementedCovariantMethod(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractCovariantImplementedMethod
+// - Interface1.extendedAbstractImplementedCovariantMethod
// - Interface1.implementsMultipleCovariantMethod1
// - Interface1.implementsMultipleCovariantMethod2
// - Interface2.implementsMultipleCovariantMethod1
@@ -48,6 +66,12 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+// void extendedAbstractCovariantImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+// void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
// void implementsMultipleCovariantMethod1(covariant int i) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect
index a4f6917..e15c8ba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.transformed.expect
@@ -3,11 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1
-// - AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2
-// - AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod
-// - AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod
+// - Interface1.extendedAbstractCovariantImplementedMethod
+// - Interface1.extendedAbstractImplementedCovariantMethod
+// - Interface1.implementsMultipleCovariantMethod1
+// - Interface1.implementsMultipleCovariantMethod2
+// - Interface2.implementsMultipleCovariantMethod1
+// - Interface2.implementsMultipleCovariantMethod2
+// - Super.extendedAbstractCovariantImplementedMethod
// - Super.extendedAbstractCovariantMethod
+// - Super.extendedAbstractImplementedCovariantMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod1%Interface2.implementsMultipleCovariantMethod1' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantMethod2%Interface2.implementsMultipleCovariantMethod2' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedMethod%Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantMethod%Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+// void extendedAbstractCovariantImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+// void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
+// void implementsMultipleCovariantMethod1(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:30:8: Context: 'Interface1.implementsMultipleCovariantMethod2' is defined here.
+// void implementsMultipleCovariantMethod2(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:34:8: Context: 'Interface2.implementsMultipleCovariantMethod1' is defined here.
+// void implementsMultipleCovariantMethod1(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:36:8: Context: 'Interface2.implementsMultipleCovariantMethod2' is defined here.
+// void implementsMultipleCovariantMethod2(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:12:8: Context: 'Super.extendedAbstractCovariantImplementedMethod' is defined here.
+// void extendedAbstractCovariantImplementedMethod(covariant int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:8:8: Context: 'Super.extendedAbstractCovariantMethod' is defined here.
// void extendedAbstractCovariantMethod(covariant int i);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:16:8: Context: 'Super.extendedAbstractImplementedCovariantMethod' is defined here.
+// void extendedAbstractImplementedCovariantMethod(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractCovariantImplementedMethod
+// - Interface1.extendedAbstractImplementedCovariantMethod
// - Interface1.implementsMultipleCovariantMethod1
// - Interface1.implementsMultipleCovariantMethod2
// - Interface2.implementsMultipleCovariantMethod1
@@ -48,6 +66,12 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+// void extendedAbstractCovariantImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+// void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
// void implementsMultipleCovariantMethod1(covariant int i) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect
index 5aca172..bb95986 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.expect
@@ -3,11 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==
-// - AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==
-// - AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==
-// - AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==
+// - Interface1.extendedAbstractCovariantImplementedSetter=
+// - Interface1.extendedAbstractImplementedCovariantSetter=
+// - Interface1.implementsMultipleCovariantSetter1=
+// - Interface1.implementsMultipleCovariantSetter2=
+// - Interface2.implementsMultipleCovariantSetter1=
+// - Interface2.implementsMultipleCovariantSetter2=
+// - Super.extendedAbstractCovariantImplementedSetter=
// - Super.extendedAbstractCovariantSetter=
+// - Super.extendedAbstractImplementedCovariantSetter=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+// void set extendedAbstractCovariantImplementedSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+// void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
+// void set implementsMultipleCovariantSetter1(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:30:12: Context: 'Interface1.implementsMultipleCovariantSetter2=' is defined here.
+// void set implementsMultipleCovariantSetter2(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:34:12: Context: 'Interface2.implementsMultipleCovariantSetter1=' is defined here.
+// void set implementsMultipleCovariantSetter1(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:36:12: Context: 'Interface2.implementsMultipleCovariantSetter2=' is defined here.
+// void set implementsMultipleCovariantSetter2(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:12:12: Context: 'Super.extendedAbstractCovariantImplementedSetter=' is defined here.
+// void set extendedAbstractCovariantImplementedSetter(covariant int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:8:12: Context: 'Super.extendedAbstractCovariantSetter=' is defined here.
// void set extendedAbstractCovariantSetter(covariant int i);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedCovariantSetter=' is defined here.
+// void set extendedAbstractImplementedCovariantSetter(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractCovariantImplementedSetter=
+// - Interface1.extendedAbstractImplementedCovariantSetter=
// - Interface1.implementsMultipleCovariantSetter1=
// - Interface1.implementsMultipleCovariantSetter2=
// - Interface2.implementsMultipleCovariantSetter1=
@@ -48,6 +66,12 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+// void set extendedAbstractCovariantImplementedSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+// void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
// void set implementsMultipleCovariantSetter1(covariant int i) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect
index 5aca172..bb95986 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.transformed.expect
@@ -3,11 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==
-// - AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==
-// - AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==
-// - AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==
+// - Interface1.extendedAbstractCovariantImplementedSetter=
+// - Interface1.extendedAbstractImplementedCovariantSetter=
+// - Interface1.implementsMultipleCovariantSetter1=
+// - Interface1.implementsMultipleCovariantSetter2=
+// - Interface2.implementsMultipleCovariantSetter1=
+// - Interface2.implementsMultipleCovariantSetter2=
+// - Super.extendedAbstractCovariantImplementedSetter=
// - Super.extendedAbstractCovariantSetter=
+// - Super.extendedAbstractImplementedCovariantSetter=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -16,23 +20,37 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter1=%Interface2.implementsMultipleCovariantSetter1==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Interface1.implementsMultipleCovariantSetter2=%Interface2.implementsMultipleCovariantSetter2==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractCovariantImplementedSetter=%Interface1.extendedAbstractCovariantImplementedSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:39:16: Context: 'AbstractClass.Super.extendedAbstractImplementedCovariantSetter=%Interface1.extendedAbstractImplementedCovariantSetter==' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+// void set extendedAbstractCovariantImplementedSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+// void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
+// void set implementsMultipleCovariantSetter1(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:30:12: Context: 'Interface1.implementsMultipleCovariantSetter2=' is defined here.
+// void set implementsMultipleCovariantSetter2(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:34:12: Context: 'Interface2.implementsMultipleCovariantSetter1=' is defined here.
+// void set implementsMultipleCovariantSetter1(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:36:12: Context: 'Interface2.implementsMultipleCovariantSetter2=' is defined here.
+// void set implementsMultipleCovariantSetter2(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:12:12: Context: 'Super.extendedAbstractCovariantImplementedSetter=' is defined here.
+// void set extendedAbstractCovariantImplementedSetter(covariant int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:8:12: Context: 'Super.extendedAbstractCovariantSetter=' is defined here.
// void set extendedAbstractCovariantSetter(covariant int i);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedCovariantSetter=' is defined here.
+// void set extendedAbstractImplementedCovariantSetter(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractCovariantImplementedSetter=
+// - Interface1.extendedAbstractImplementedCovariantSetter=
// - Interface1.implementsMultipleCovariantSetter1=
// - Interface1.implementsMultipleCovariantSetter2=
// - Interface2.implementsMultipleCovariantSetter1=
@@ -48,6 +66,12 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+// void set extendedAbstractCovariantImplementedSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+// void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
// void set implementsMultipleCovariantSetter1(covariant int i) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect
index 613c55c..894fe23 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.expect
@@ -2,28 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedGetterMixedInField'.
-// abstract class Class extends Super
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: The return type of the method 'Mixin.extendedGetterMixedInField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterMixedInField'.
-// Change to a subtype of 'String'.
-// int extendedGetterMixedInField = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is the overridden method ('extendedGetterMixedInField').
-// String get extendedGetterMixedInField => '';
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Class 'Super with Mixin' inherits multiple members named 'extendedGetterMixedInField' with incompatible signatures.
-// Try adding a declaration of 'extendedGetterMixedInField' to 'Super with Mixin'.
-// abstract class Class extends Super
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: This is one of the overridden members.
-// int extendedGetterMixedInField = 0;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is one of the overridden members.
-// String get extendedGetterMixedInField => '';
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the getter 'Super with Mixin.extendedSetterMixedInField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterMixedInField'.
// abstract class Class extends Super
// ^^^^^^^^^^^^^^^^^^^^...
@@ -52,12 +30,15 @@
// final String extendedFieldMixedInSetter = '';
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:90:7: Error: The return type of the method 'Class.extendedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterDeclaredField'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedGetterMixedInField'.
+// abstract class Class extends Super
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: The return type of the method 'Mixin.extendedGetterMixedInField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterMixedInField'.
// Change to a subtype of 'String'.
-// int extendedGetterDeclaredField = 0;
+// int extendedGetterMixedInField = 0;
// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:6:14: Context: This is the overridden method ('extendedGetterDeclaredField').
-// String get extendedGetterDeclaredField => '';
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is the overridden method ('extendedGetterMixedInField').
+// String get extendedGetterMixedInField => '';
// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:93:16: Error: The type 'String' of the field 'Class.extendedSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterDeclaredField'.
@@ -74,14 +55,6 @@
// void set extendedSetterDeclaredGetter(int value) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:96:7: Error: The return type of the method 'Class.mixedInGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super with Mixin.mixedInGetterDeclaredField'.
-// Change to a subtype of 'String'.
-// int mixedInGetterDeclaredField = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the overridden method ('mixedInGetterDeclaredField').
-// abstract class Class extends Super
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:99:16: Error: The type 'String' of the field 'Class.mixedInSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.mixedInSetterDeclaredField'.
// final String mixedInSetterDeclaredField = '';
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -96,14 +69,6 @@
// abstract class Class extends Super
// ^^^^^^^^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:102:7: Error: The return type of the method 'Class.implementedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Interface1.implementedGetterDeclaredField'.
-// Change to a subtype of 'String'.
-// int implementedGetterDeclaredField = 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:63:14: Context: This is the overridden method ('implementedGetterDeclaredField').
-// String get implementedGetterDeclaredField => '';
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:105:16: Error: The type 'String' of the field 'Class.implementedSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Interface1.implementedSetterDeclaredField'.
// final String implementedSetterDeclaredField = '';
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -198,9 +163,9 @@
// Try adding a declaration of 'Mixin.mixedInGetterImplementedField' to 'Class'.
// abstract class Class extends Super
// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is one of the overridden members.
-// abstract class Class extends Super
-// ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:35:14: Context: This is one of the overridden members.
+// String get mixedInGetterImplementedField => '';
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:57:7: Context: This is one of the overridden members.
// int mixedInGetterImplementedField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -397,6 +362,30 @@
// void set implementedSetterImplementedGetter(int value) {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:90:7: Error: The return type of the method 'Class.extendedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterDeclaredField'.
+// Change to a subtype of 'String'.
+// int extendedGetterDeclaredField = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:6:14: Context: This is the overridden method ('extendedGetterDeclaredField').
+// String get extendedGetterDeclaredField => '';
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:96:7: Error: The return type of the method 'Class.mixedInGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super with Mixin.mixedInGetterDeclaredField'.
+// Change to a subtype of 'String'.
+// int mixedInGetterDeclaredField = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the overridden method ('mixedInGetterDeclaredField').
+// abstract class Class extends Super
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:102:7: Error: The return type of the method 'Class.implementedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Interface1.implementedGetterDeclaredField'.
+// Change to a subtype of 'String'.
+// int implementedGetterDeclaredField = 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:63:14: Context: This is the overridden method ('implementedGetterDeclaredField').
+// String get implementedGetterDeclaredField => '';
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -505,6 +494,8 @@
return super.{self::Mixin::mixedInGetterDeclaredSetter};
mixin-super-stub get mixedInFieldDeclaredSetter() → core::String
return super.{self::Mixin::mixedInFieldDeclaredSetter};
+ mixin-super-stub get extendedGetterMixedInField() → core::int
+ return super.{self::Mixin::extendedGetterMixedInField};
mixin-super-stub set extendedGetterMixedInField(core::int value) → void
return super.{self::Mixin::extendedGetterMixedInField} = value;
mixin-super-stub get extendedSetterMixedInField() → core::String
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect
index 46a2aa3..4701040 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.expect
@@ -29,10 +29,12 @@
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
-// - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=
// - AbstractClass.declareAbstractImplementMultipleField
// - AbstractClass.declareAbstractImplementMultipleField=
+// - Interface1.declareAbstractImplementMultipleField
+// - Interface1.implementMultipleField
+// - Interface2.declareAbstractImplementMultipleField
+// - Interface2.implementMultipleField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -41,18 +43,24 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
// abstract int declareAbstractImplementMultipleField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField=' is defined here.
// abstract int declareAbstractImplementMultipleField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:10:7: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+// int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:6:7: Context: 'Interface1.implementMultipleField' is defined here.
+// int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:18:7: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+// int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:14:7: Context: 'Interface2.implementMultipleField' is defined here.
+// int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect
index 46a2aa3..4701040 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.transformed.expect
@@ -29,10 +29,12 @@
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
-// - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=
// - AbstractClass.declareAbstractImplementMultipleField
// - AbstractClass.declareAbstractImplementMultipleField=
+// - Interface1.declareAbstractImplementMultipleField
+// - Interface1.implementMultipleField
+// - Interface2.declareAbstractImplementMultipleField
+// - Interface2.implementMultipleField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -41,18 +43,24 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField=' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
// abstract int declareAbstractImplementMultipleField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField=' is defined here.
// abstract int declareAbstractImplementMultipleField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:10:7: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+// int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:6:7: Context: 'Interface1.implementMultipleField' is defined here.
+// int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:18:7: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+// int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:14:7: Context: 'Interface2.implementMultipleField' is defined here.
+// int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect
index eef1c6c..5ebd497f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
// - AbstractClass.declareAbstractImplementMultipleField
+// - Interface1.declareAbstractImplementMultipleField
+// - Interface1.implementMultipleField
+// - Interface2.declareAbstractImplementMultipleField
+// - Interface2.implementMultipleField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:30:22: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
// abstract final int declareAbstractImplementMultipleField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:10:13: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+// final int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
+// final int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:18:13: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+// final int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
+// final int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect
index eef1c6c..5ebd497f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField
// - AbstractClass.declareAbstractImplementMultipleField
+// - Interface1.declareAbstractImplementMultipleField
+// - Interface1.implementMultipleField
+// - Interface2.declareAbstractImplementMultipleField
+// - Interface2.implementMultipleField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleField%Interface2.implementMultipleField' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:30:22: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
// abstract final int declareAbstractImplementMultipleField;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:10:13: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+// final int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
+// final int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:18:13: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+// final int declareAbstractImplementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
+// final int implementMultipleField = 0;
+// ^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect
index 0083177..538cee7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter
// - AbstractClass.declareAbstractImplementMultipleGetter
+// - Interface1.declareAbstractImplementMultipleGetter
+// - Interface1.implementMultipleGetter
+// - Interface2.declareAbstractImplementMultipleGetter
+// - Interface2.implementMultipleGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:30:11: Context: 'AbstractClass.declareAbstractImplementMultipleGetter' is defined here.
// int get declareAbstractImplementMultipleGetter;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:10:11: Context: 'Interface1.declareAbstractImplementMultipleGetter' is defined here.
+// int get declareAbstractImplementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:6:11: Context: 'Interface1.implementMultipleGetter' is defined here.
+// int get implementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:18:11: Context: 'Interface2.declareAbstractImplementMultipleGetter' is defined here.
+// int get declareAbstractImplementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:14:11: Context: 'Interface2.implementMultipleGetter' is defined here.
+// int get implementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect
index 0083177..538cee7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter
// - AbstractClass.declareAbstractImplementMultipleGetter
+// - Interface1.declareAbstractImplementMultipleGetter
+// - Interface1.implementMultipleGetter
+// - Interface2.declareAbstractImplementMultipleGetter
+// - Interface2.implementMultipleGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleGetter%Interface2.implementMultipleGetter' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:30:11: Context: 'AbstractClass.declareAbstractImplementMultipleGetter' is defined here.
// int get declareAbstractImplementMultipleGetter;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:10:11: Context: 'Interface1.declareAbstractImplementMultipleGetter' is defined here.
+// int get declareAbstractImplementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:6:11: Context: 'Interface1.implementMultipleGetter' is defined here.
+// int get implementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:18:11: Context: 'Interface2.declareAbstractImplementMultipleGetter' is defined here.
+// int get declareAbstractImplementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:14:11: Context: 'Interface2.implementMultipleGetter' is defined here.
+// int get implementMultipleGetter => 0;
+// ^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect
index 3bbc542..66a5d5e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod
// - AbstractClass.declareAbstractImplementMultipleMethod
+// - Interface1.declareAbstractImplementMultipleMethod
+// - Interface1.implementMultipleMethod
+// - Interface2.declareAbstractImplementMultipleMethod
+// - Interface2.implementMultipleMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:30:8: Context: 'AbstractClass.declareAbstractImplementMultipleMethod' is defined here.
// void declareAbstractImplementMultipleMethod();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:10:8: Context: 'Interface1.declareAbstractImplementMultipleMethod' is defined here.
+// void declareAbstractImplementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:6:8: Context: 'Interface1.implementMultipleMethod' is defined here.
+// void implementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:18:8: Context: 'Interface2.declareAbstractImplementMultipleMethod' is defined here.
+// void declareAbstractImplementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:14:8: Context: 'Interface2.implementMultipleMethod' is defined here.
+// void implementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect
index 3bbc542..66a5d5e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod
// - AbstractClass.declareAbstractImplementMultipleMethod
+// - Interface1.declareAbstractImplementMultipleMethod
+// - Interface1.implementMultipleMethod
+// - Interface2.declareAbstractImplementMultipleMethod
+// - Interface2.implementMultipleMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleMethod%Interface2.implementMultipleMethod' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:30:8: Context: 'AbstractClass.declareAbstractImplementMultipleMethod' is defined here.
// void declareAbstractImplementMultipleMethod();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:10:8: Context: 'Interface1.declareAbstractImplementMultipleMethod' is defined here.
+// void declareAbstractImplementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:6:8: Context: 'Interface1.implementMultipleMethod' is defined here.
+// void implementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:18:8: Context: 'Interface2.declareAbstractImplementMultipleMethod' is defined here.
+// void declareAbstractImplementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:14:8: Context: 'Interface2.implementMultipleMethod' is defined here.
+// void implementMultipleMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect
index 773632f..c960de6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==
// - AbstractClass.declareAbstractImplementMultipleSetter=
+// - Interface1.declareAbstractImplementMultipleSetter=
+// - Interface1.implementMultipleSetter=
+// - Interface2.declareAbstractImplementMultipleSetter=
+// - Interface2.implementMultipleSetter=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:30:12: Context: 'AbstractClass.declareAbstractImplementMultipleSetter=' is defined here.
// void set declareAbstractImplementMultipleSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:10:12: Context: 'Interface1.declareAbstractImplementMultipleSetter=' is defined here.
+// void set declareAbstractImplementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:6:12: Context: 'Interface1.implementMultipleSetter=' is defined here.
+// void set implementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:18:12: Context: 'Interface2.declareAbstractImplementMultipleSetter=' is defined here.
+// void set declareAbstractImplementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:14:12: Context: 'Interface2.implementMultipleSetter=' is defined here.
+// void set implementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect
index 773632f..c960de6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.transformed.expect
@@ -25,8 +25,11 @@
// ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==
// - AbstractClass.declareAbstractImplementMultipleSetter=
+// - Interface1.declareAbstractImplementMultipleSetter=
+// - Interface1.implementMultipleSetter=
+// - Interface2.declareAbstractImplementMultipleSetter=
+// - Interface2.implementMultipleSetter=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -35,12 +38,21 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:27:16: Context: 'AbstractClass.Interface1.implementMultipleSetter=%Interface2.implementMultipleSetter==' is defined here.
-// abstract class AbstractClass implements Interface1, Interface2 {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:30:12: Context: 'AbstractClass.declareAbstractImplementMultipleSetter=' is defined here.
// void set declareAbstractImplementMultipleSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:10:12: Context: 'Interface1.declareAbstractImplementMultipleSetter=' is defined here.
+// void set declareAbstractImplementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:6:12: Context: 'Interface1.implementMultipleSetter=' is defined here.
+// void set implementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:18:12: Context: 'Interface2.declareAbstractImplementMultipleSetter=' is defined here.
+// void set declareAbstractImplementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:14:12: Context: 'Interface2.implementMultipleSetter=' is defined here.
+// void set implementMultipleSetter(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect
index 995b5ba..350fd3f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.expect
@@ -5,43 +5,32 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
// class Class /* error */ extends LegacyClass implements SuperQ {
// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyClass.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
// int optionalArgumentsMethod(int i) => i;
// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:9:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyClass extends Super implements SuperExtra {}
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
// class ClassQ /* error */ extends LegacyClassQ implements Super {
// ^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyClassQ.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
// int? optionalArgumentsMethod(int? i) => i;
// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:11:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyClassQ extends SuperQ implements SuperExtra {}
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
// ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyMixedIn.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
// int optionalArgumentsMethod(int i) => i;
// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:13:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyMixedIn with Super implements SuperExtra {}
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'nullabilityMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
-// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
-// ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:6:29: Context: The parameter 'i' of the method 'Object with Super.nullabilityMethod' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'SuperQ.nullabilityMethod'.
-// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
-// int nullabilityMethod(int i, {required int j}) => i;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:17:8: Context: This is the overridden method ('nullabilityMethod').
-// int? nullabilityMethod(int? i, {int? j}) => i;
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: Class 'ClassMixedIn' inherits multiple members named 'nullabilityMethod' with incompatible signatures.
// Try adding a declaration of 'nullabilityMethod' to 'ClassMixedIn'.
@@ -54,36 +43,14 @@
// int? nullabilityMethod(int? i, {int? j}) => i;
// ^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'nullabilitySetter' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
-// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
-// ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:8:34: Context: The parameter 'value' of the method 'Object with Super.nullabilitySetter' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'SuperQ.nullabilitySetter'.
-// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
-// void set nullabilitySetter(int value) {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:19:12: Context: This is the overridden method ('nullabilitySetter').
-// void set nullabilitySetter(int? value) {}
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
// ^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'LegacyMixedInQ.optionalArgumentsMethod'.
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
// int? optionalArgumentsMethod(int? i) => i;
// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib2.dart:15:16: Context: This is the overridden method ('optionalArgumentsMethod').
-// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'nullabilityMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
-// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
-// ^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:17:8: Context: The return type of the method 'Object with SuperQ.nullabilityMethod' is 'int?', which does not match the return type, 'int', of the overridden method, 'Super.nullabilityMethod'.
-// Change to a subtype of 'int'.
-// int? nullabilityMethod(int? i, {int? j}) => i;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:6:7: Context: This is the overridden method ('nullabilityMethod').
-// int nullabilityMethod(int i, {required int j}) => i;
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: Class 'ClassMixedInQ' inherits multiple members named 'nullabilityMethod' with incompatible signatures.
@@ -97,51 +64,16 @@
// int nullabilityMethod(int i, {required int j}) => i;
// ^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'nullabilityGetter' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
-// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
-// ^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:18:12: Context: The return type of the method 'Object with SuperQ.nullabilityGetter' is 'int?', which does not match the return type, 'int', of the overridden method, 'Super.nullabilityGetter'.
-// Change to a subtype of 'int'.
-// int? get nullabilityGetter => null;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:7:11: Context: This is the overridden method ('nullabilityGetter').
-// int get nullabilityGetter => 0;
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
-// i = super.nullabilityMethod(null); // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-// super.nullabilitySetter = null; // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityMethod(null); // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityGetter; // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
// nullabilitySetter = null; // error
// ^
@@ -150,40 +82,16 @@
// var v1 = nullabilityMethod(null); // ok
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:65:32: Error: Required named parameter 'j' must be provided.
-// i = super.nullabilityMethod(null); // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:69:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:79:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-// super.nullabilitySetter = null; // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:90:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityMethod(null); // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:94:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:100:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityGetter; // ok
-// ^
-//
import self as self;
import "in_out_in_lib2.dart" as in_;
import "in_out_in_lib1.dart" as in_2;
@@ -199,23 +107,17 @@
method test() → dynamic {
core::int i;
core::int? v1 = this.{self::Class::nullabilityMethod}(null);
- i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_2::Super::nullabilityMethod}(null);
+ i = super.{in_2::Super::nullabilityMethod}(null);
i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null);
- i = super.{in_2::Super::optionalArgumentsMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int);
- let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_2::Super::optionalArgumentsMethod}(null);
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
core::int? v2 = this.{self::Class::nullabilityGetter};
i = super.{in_2::Super::nullabilityGetter};
this.{self::Class::nullabilitySetter} = null;
- super.{in_2::Super::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
- super.nullabilitySetter = null; // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+ super.{in_2::Super::nullabilitySetter} = null;
}
abstract member-signature method nullabilityMethod(core::int? i, {core::int? j = #C1}) → core::int?; -> in_2::Super::nullabilityMethod
abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
@@ -237,22 +139,16 @@
method test() → dynamic {
core::int i;
this.{in_::LegacyClassQ::nullabilityMethod}(null);
- i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_2::SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+ i = super.{in_2::SuperQ::nullabilityMethod}(null);
i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null);
- i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
- let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
i = this.{self::ClassQ::nullabilityGetter};
- i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityGetter; // ok
- ^" in super.{in_2::SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
- this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+ i = super.{in_2::SuperQ::nullabilityGetter};
+ this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
nullabilitySetter = null; // error
^" in null as{TypeError,ForNonNullableByDefault} core::int;
super.{in_2::SuperQ::nullabilitySetter} = null;
@@ -275,26 +171,20 @@
;
method test() → dynamic {
core::int i;
- invalid-type v1 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:63:31: Error: Required named parameter 'j' must be provided.
+ invalid-type v1 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:63:31: Error: Required named parameter 'j' must be provided.
var v1 = nullabilityMethod(null); // ok
^" in this.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
- i = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:65:32: Error: Required named parameter 'j' must be provided.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
+ i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null);
- i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:69:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int);
- let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
core::int v2 = this.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
this.{self::ClassMixedIn::nullabilitySetter} = null;
- super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:79:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
- super.nullabilitySetter = null; // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+ super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = null;
}
abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -314,21 +204,15 @@
method test() → dynamic {
core::int i;
this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
- i = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:90:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+ i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null);
- i = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:94:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
- let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
+ let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
i = this.{self::ClassMixedInQ::nullabilityGetter};
- i = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:100:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityGetter; // ok
- ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
+ i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect
index d8b7132..8700bf7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.expect
@@ -2,40 +2,56 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
-// i = super.nullabilityMethod(null); // ok
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// int optionalArgumentsMethod(int i) => i;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+// ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// int? optionalArgumentsMethod(int? i) => i;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+// ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib2.dart:13:16: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedIn with Super implements SuperExtra {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib2.dart:15:16: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-// super.nullabilitySetter = null; // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityMethod(null); // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityGetter; // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
// nullabilitySetter = null; // error
// ^
@@ -69,23 +85,17 @@
method test() → dynamic {
core::int i;
core::int? v1 = this.{self::Class::nullabilityMethod}(null);
- i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:15:32: Error: Required named parameter 'j' must be provided.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_2::Super::nullabilityMethod}(null);
+ i = super.{in_2::Super::nullabilityMethod}(null);
i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null);
- i = super.{in_2::Super::optionalArgumentsMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int);
- let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_2::Super::optionalArgumentsMethod}(null);
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
core::int? v2 = this.{self::Class::nullabilityGetter};
i = super.{in_2::Super::nullabilityGetter};
this.{self::Class::nullabilitySetter} = null;
- super.{in_2::Super::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
- super.nullabilitySetter = null; // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+ super.{in_2::Super::nullabilitySetter} = null;
}
abstract member-signature method nullabilityMethod(core::int? i, {core::int? j}) → core::int?; -> in_2::Super::nullabilityMethod
abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
@@ -107,22 +117,16 @@
method test() → dynamic {
core::int i;
this.{in_::LegacyClassQ::nullabilityMethod}(null);
- i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_2::SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+ i = super.{in_2::SuperQ::nullabilityMethod}(null);
i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null);
- i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
- let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+ let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
i = this.{self::ClassQ::nullabilityGetter};
- i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityGetter; // ok
- ^" in super.{in_2::SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
- this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+ i = super.{in_2::SuperQ::nullabilityGetter};
+ this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
nullabilitySetter = null; // error
^" in null as{TypeError,ForNonNullableByDefault} core::int;
super.{in_2::SuperQ::nullabilitySetter} = null;
@@ -149,7 +153,7 @@
i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null);
i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
- let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
@@ -181,13 +185,13 @@
i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null);
i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
- let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
i = this.{self::ClassMixedInQ::nullabilityGetter};
i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
- this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+ this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
nullabilitySetter = null; // error
^" in null as{TypeError,ForNonNullableByDefault} core::int;
super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
@@ -261,8 +265,6 @@
return super.{in_2::Super::nullabilityGetter};
mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
return super.{in_2::Super::optionalArgumentsMethod}(i);
- mixin-super-stub set nullabilitySetter(core::int* value) → void
- return super.{in_2::Super::nullabilitySetter} = value;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -273,6 +275,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ mixin-super-stub set nullabilitySetter(core::int* value) → void
+ return super.{in_2::Super::nullabilitySetter} = value;
}
abstract class LegacyMixedIn extends in_::_LegacyMixedIn&Object&Super implements in_2::SuperExtra {
synthetic constructor •() → in_::LegacyMixedIn*
@@ -290,8 +294,6 @@
return super.{in_2::SuperQ::nullabilityGetter};
mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
return super.{in_2::SuperQ::optionalArgumentsMethod}(i);
- mixin-super-stub set nullabilitySetter(core::int* value) → void
- return super.{in_2::SuperQ::nullabilitySetter} = value;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -302,6 +304,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ mixin-super-stub set nullabilitySetter(core::int* value) → void
+ return super.{in_2::SuperQ::nullabilitySetter} = value;
}
abstract class LegacyMixedInQ extends in_::_LegacyMixedInQ&Object&SuperQ implements in_2::SuperExtra {
synthetic constructor •() → in_::LegacyMixedInQ*
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect
index fac4e38..68209cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.expect
@@ -2,44 +2,60 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:15:33: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-// i = super.nullabilityMethod(null); // ok
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// int optionalArgumentsMethod(int i) => i;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+// ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// int? optionalArgumentsMethod(int? i) => i;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+// ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib2.dart:13:16: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedIn with Super implements SuperExtra {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib2.dart:15:16: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+// int optionalArgumentsMethod(int i, [int? j]) => i;
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
-// super.nullabilitySetter = null; // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
// nullabilityMethod(null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityMethod(null); // ok
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.optionalArgumentsMethod(null); // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
// Try removing the extra positional arguments.
// super.optionalArgumentsMethod(null, null); // error
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
-// i = super.nullabilityGetter; // ok
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
// nullabilitySetter = null; // error
// ^
@@ -77,23 +93,17 @@
method test() → dynamic {
core::int i;
core::int? v1 = this.{self::Class::nullabilityMethod}(null);
- i = super.{in_2::Super::nullabilityMethod}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:15:33: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
- i = super.nullabilityMethod(null); // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int);
+ i = super.{in_2::Super::nullabilityMethod}(null);
i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null);
- i = super.{in_2::Super::optionalArgumentsMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:19:39: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int);
- let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_2::Super::optionalArgumentsMethod}(null);
+ let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
core::int? v2 = this.{self::Class::nullabilityGetter};
i = super.{in_2::Super::nullabilityGetter};
this.{self::Class::nullabilitySetter} = null;
- super.{in_2::Super::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:29:31: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
- super.nullabilitySetter = null; // ok
- ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+ super.{in_2::Super::nullabilitySetter} = null;
}
abstract member-signature method nullabilityMethod(core::int? i) → core::int?; -> in_2::Super::nullabilityMethod
abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
@@ -114,25 +124,19 @@
;
method test() → dynamic {
core::int i;
- this.{self::ClassQ::nullabilityMethod}(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+ this.{self::ClassQ::nullabilityMethod}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
nullabilityMethod(null); // error
^" in null as{TypeError,ForNonNullableByDefault} core::int);
- i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:40:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityMethod(null); // ok
- ^" in super.{in_2::SuperQ::nullabilityMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
+ i = super.{in_2::SuperQ::nullabilityMethod}(null);
i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null);
- i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:44:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.optionalArgumentsMethod(null); // ok
- ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null) as{TypeError,ForNonNullableByDefault} core::int;
- let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+ let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
i = this.{self::ClassQ::nullabilityGetter};
- i = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:50:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
- i = super.nullabilityGetter; // ok
- ^" in super.{in_2::SuperQ::nullabilityGetter} as{TypeError,ForNonNullableByDefault} core::int;
- this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+ i = super.{in_2::SuperQ::nullabilityGetter};
+ this.{self::ClassQ::nullabilitySetter} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
nullabilitySetter = null; // error
^" in null as{TypeError,ForNonNullableByDefault} core::int;
super.{in_2::SuperQ::nullabilitySetter} = null;
@@ -160,7 +164,7 @@
i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null);
i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
- let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
@@ -188,19 +192,19 @@
;
method test() → dynamic {
core::int i;
- this.{self::ClassMixedInQ::nullabilityMethod}(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:88:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+ this.{self::ClassMixedInQ::nullabilityMethod}(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:88:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
nullabilityMethod(null); // error
^" in null as{TypeError,ForNonNullableByDefault} core::int);
i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null);
i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
- let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+ let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
Try removing the extra positional arguments.
super.optionalArgumentsMethod(null, null); // error
^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
i = this.{self::ClassMixedInQ::nullabilityGetter};
i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
- this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+ this.{self::ClassMixedInQ::nullabilitySetter} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
nullabilitySetter = null; // error
^" in null as{TypeError,ForNonNullableByDefault} core::int;
super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
@@ -311,8 +315,6 @@
return super.{in_2::Super::nullabilityGetter};
mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
return super.{in_2::Super::optionalArgumentsMethod}(i);
- mixin-super-stub set nullabilitySetter(core::int* value) → void
- return super.{in_2::Super::nullabilitySetter} = value;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -323,6 +325,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ mixin-super-stub set nullabilitySetter(core::int* value) → void
+ return super.{in_2::Super::nullabilitySetter} = value;
}
abstract class LegacyMixedIn extends in_::_LegacyMixedIn&Object&Super implements in_2::SuperExtra {
synthetic constructor •() → in_::LegacyMixedIn*
@@ -340,8 +344,6 @@
return super.{in_2::SuperQ::nullabilityGetter};
mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
return super.{in_2::SuperQ::optionalArgumentsMethod}(i);
- mixin-super-stub set nullabilitySetter(core::int* value) → void
- return super.{in_2::SuperQ::nullabilitySetter} = value;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -352,6 +354,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ mixin-super-stub set nullabilitySetter(core::int* value) → void
+ return super.{in_2::SuperQ::nullabilitySetter} = value;
}
abstract class LegacyMixedInQ extends in_::_LegacyMixedInQ&Object&SuperQ implements in_2::SuperExtra {
synthetic constructor •() → in_::LegacyMixedInQ*
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect
index d5e1037..4124088 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.expect
@@ -3,8 +3,11 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
-// - Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod
-// - Interface2.Super.extendedMethod%Interface2.extendedMethod
+// - Interface2.extendedMethod
+// - Interface2.mixedInMethod
+// - Mixin.mixedInMethod
+// - Super with Mixin.mixedInMethod
+// - Super.extendedMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -13,12 +16,65 @@
//
// class ClassImplements implements Interface2 {}
// ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Super.extendedMethod%Interface2.extendedMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: 'Interface2.extendedMethod' is defined here.
+// int extendedMethod();
+// ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: 'Interface2.mixedInMethod' is defined here.
+// int mixedInMethod();
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Mixin.mixedInMethod' is defined here.
+// num mixedInMethod() => 0;
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Super with Mixin.mixedInMethod' is defined here.
+// num mixedInMethod() => 0;
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: 'Super.extendedMethod' is defined here.
+// num extendedMethod() => 0;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+// ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+// int mixedInMethod();
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+// ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+// num extendedMethod() => 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+// int extendedMethod();
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtendsWithNoSuchMethod extends Super
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+// int mixedInMethod();
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+// num extendedMethod() => 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+// int extendedMethod();
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassDeclaresExtends' does not conform to its interface.
// class ClassDeclaresExtends extends Super with Mixin {
@@ -64,50 +120,6 @@
// int mixedInMethod();
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
-// class ClassExtends extends Super with Mixin implements Interface1 {}
-// ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-// num extendedMethod() => 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-// int extendedMethod();
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
-// class ClassExtendsWithNoSuchMethod extends Super
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-// num extendedMethod() => 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-// int extendedMethod();
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-// ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.extendedMethod'.
-// Change to a subtype of 'int'.
-// num extendedMethod() => 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: This is the overridden method ('extendedMethod').
-// int extendedMethod();
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-// ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.mixedInMethod'.
-// Change to a subtype of 'int'.
-// abstract class Interface2 extends Super with Mixin {
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: This is the overridden method ('mixedInMethod').
-// int mixedInMethod();
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect
index 92e7e34..b0ede7c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.transformed.expect
@@ -3,8 +3,11 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
-// - Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod
-// - Interface2.Super.extendedMethod%Interface2.extendedMethod
+// - Interface2.extendedMethod
+// - Interface2.mixedInMethod
+// - Mixin.mixedInMethod
+// - Super with Mixin.mixedInMethod
+// - Super.extendedMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -13,12 +16,65 @@
//
// class ClassImplements implements Interface2 {}
// ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Mixin.mixedInMethod%Interface2.mixedInMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: 'Interface2.Super.extendedMethod%Interface2.extendedMethod' is defined here.
-// abstract class Interface2 extends Super with Mixin {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: 'Interface2.extendedMethod' is defined here.
+// int extendedMethod();
+// ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: 'Interface2.mixedInMethod' is defined here.
+// int mixedInMethod();
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Mixin.mixedInMethod' is defined here.
+// num mixedInMethod() => 0;
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Super with Mixin.mixedInMethod' is defined here.
+// num mixedInMethod() => 0;
+// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: 'Super.extendedMethod' is defined here.
+// num extendedMethod() => 0;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+// ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+// int mixedInMethod();
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+// ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+// num extendedMethod() => 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+// int extendedMethod();
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtendsWithNoSuchMethod extends Super
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+// int mixedInMethod();
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+// num extendedMethod() => 0;
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+// int extendedMethod();
+// ^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassDeclaresExtends' does not conform to its interface.
// class ClassDeclaresExtends extends Super with Mixin {
@@ -64,50 +120,6 @@
// int mixedInMethod();
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
-// class ClassExtends extends Super with Mixin implements Interface1 {}
-// ^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-// num extendedMethod() => 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-// int extendedMethod();
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
-// class ClassExtendsWithNoSuchMethod extends Super
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
-// Change to a subtype of 'int'.
-// num extendedMethod() => 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
-// int extendedMethod();
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-// ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.extendedMethod'.
-// Change to a subtype of 'int'.
-// num extendedMethod() => 0;
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: This is the overridden method ('extendedMethod').
-// int extendedMethod();
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassImplements' does not conform to its interface.
-// class ClassImplements implements Interface2 {}
-// ^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:18:16: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface2.mixedInMethod'.
-// Change to a subtype of 'int'.
-// abstract class Interface2 extends Super with Mixin {
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: This is the overridden method ('mixedInMethod').
-// int mixedInMethod();
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect
index b334412..f789cb9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.expect
@@ -3,10 +3,12 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:11:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementedMethod
-// - AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod
-// - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-// - AbstractClass.Super.extendedAbstractMethod
+// - Interface1.extendedAbstractImplementedMethod
+// - Interface1.implementedMethod
+// - Interface1.implementedMultipleMethod
+// - Interface2.implementedMultipleMethod
+// - Super.extendedAbstractImplementedMethod
+// - Super.extendedAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -15,20 +17,27 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
+// void implementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:22:8: Context: 'Interface1.implementedMultipleMethod' is defined here.
+// void implementedMultipleMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:26:8: Context: 'Interface2.implementedMultipleMethod' is defined here.
+// void implementedMultipleMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+// void extendedAbstractMethod(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:13:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedMethod
// - Interface1.implementedMethod
// - Interface1.implementedMultipleMethod
// - Interface2.implementedMultipleMethod
@@ -42,6 +51,9 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
// void implementedMethod(int i) {}
// ^^^^^^^^^^^^^^^^^
@@ -69,9 +81,7 @@
: super mem::Super::•()
;
abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
- abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
- abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -82,6 +92,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+ abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
}
@@ -95,9 +107,7 @@
: super mem::Super::•()
;
abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
- abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
- abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -108,6 +118,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+ abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect
index b334412..f789cb9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.transformed.expect
@@ -3,10 +3,12 @@
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:11:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
-// - AbstractClass.Interface1.implementedMethod
-// - AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod
-// - AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod
-// - AbstractClass.Super.extendedAbstractMethod
+// - Interface1.extendedAbstractImplementedMethod
+// - Interface1.implementedMethod
+// - Interface1.implementedMultipleMethod
+// - Interface2.implementedMultipleMethod
+// - Super.extendedAbstractImplementedMethod
+// - Super.extendedAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -15,20 +17,27 @@
//
// class ConcreteSub extends AbstractClass {}
// ^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Interface1.implementedMultipleMethod%Interface2.implementedMultipleMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractImplementedMethod%Interface1.extendedAbstractImplementedMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:9:16: Context: 'AbstractClass.Super.extendedAbstractMethod' is defined here.
-// abstract class AbstractClass extends Super implements Interface1, Interface2 {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
+// void implementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:22:8: Context: 'Interface1.implementedMultipleMethod' is defined here.
+// void implementedMultipleMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:26:8: Context: 'Interface2.implementedMultipleMethod' is defined here.
+// void implementedMultipleMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+// void extendedAbstractMethod(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:13:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+// - Interface1.extendedAbstractImplementedMethod
// - Interface1.implementedMethod
// - Interface1.implementedMultipleMethod
// - Interface2.implementedMultipleMethod
@@ -42,6 +51,9 @@
//
// class ConcreteClass extends Super implements Interface1, Interface2 {}
// ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+// void extendedAbstractImplementedMethod(int i) {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
// void implementedMethod(int i) {}
// ^^^^^^^^^^^^^^^^^
@@ -69,9 +81,7 @@
: super mem::Super::•()
;
abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
- abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
- abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -82,6 +92,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+ abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
}
@@ -95,9 +107,7 @@
: super mem::Super::•()
;
abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
- abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
- abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -108,6 +118,8 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+ abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect
index 31f91b2..185fc0d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.expect
@@ -77,6 +77,8 @@
// - Mixin.mixedInAbstractField=
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
+// - Super.extendedAbstractMixedInAbstractField
+// - Super.extendedAbstractMixedInAbstractField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -103,6 +105,12 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractField
@@ -111,6 +119,8 @@
// - Mixin.mixedInAbstractField=
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
+// - Super.extendedAbstractMixedInAbstractField
+// - Super.extendedAbstractMixedInAbstractField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -137,6 +147,12 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -177,6 +193,8 @@
return super.{self::Mixin::mixedInConcreteField};
mixin-super-stub set mixedInConcreteField(core::int value) → void
return super.{self::Mixin::mixedInConcreteField} = value;
+ abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+ abstract mixin-stub set mixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::mixedInAbstractField
mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
return super.{self::Mixin::extendedConcreteMixedInConcreteField};
mixin-super-stub set extendedConcreteMixedInConcreteField(core::int value) → void
@@ -185,6 +203,10 @@
return super.{self::Mixin::extendedAbstractMixedInConcreteField};
mixin-super-stub set extendedAbstractMixedInConcreteField(core::int value) → void
return super.{self::Mixin::extendedAbstractMixedInConcreteField} = value;
+ abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+ abstract mixin-stub set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedConcreteMixedInAbstractField
+ abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+ abstract mixin-stub set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedAbstractMixedInAbstractField
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
synthetic constructor •() → self::ClassMixin
@@ -199,6 +221,8 @@
return super.{self::Mixin::mixedInConcreteField};
mixin-super-stub set mixedInConcreteField(core::int value) → void
return super.{self::Mixin::mixedInConcreteField} = value;
+ abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+ abstract mixin-stub set mixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::mixedInAbstractField
mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
return super.{self::Mixin::extendedConcreteMixedInConcreteField};
mixin-super-stub set extendedConcreteMixedInConcreteField(core::int value) → void
@@ -207,5 +231,9 @@
return super.{self::Mixin::extendedAbstractMixedInConcreteField};
mixin-super-stub set extendedAbstractMixedInConcreteField(core::int value) → void
return super.{self::Mixin::extendedAbstractMixedInConcreteField} = value;
+ abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+ abstract mixin-stub set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedConcreteMixedInAbstractField
+ abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+ abstract mixin-stub set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedAbstractMixedInAbstractField
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect
index 54bbe20..3e41841 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.transformed.expect
@@ -77,6 +77,8 @@
// - Mixin.mixedInAbstractField=
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
+// - Super.extendedAbstractMixedInAbstractField
+// - Super.extendedAbstractMixedInAbstractField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -103,6 +105,12 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractField
@@ -111,6 +119,8 @@
// - Mixin.mixedInAbstractField=
// - Super.extendedAbstractField
// - Super.extendedAbstractField=
+// - Super.extendedAbstractMixedInAbstractField
+// - Super.extendedAbstractMixedInAbstractField=
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -137,6 +147,12 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
// abstract int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+// abstract int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -177,10 +193,10 @@
: super self::Super::•()
;
abstract get mixedInAbstractField() → core::int;
- abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
abstract get extendedConcreteMixedInAbstractField() → core::int;
- abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
abstract get extendedAbstractMixedInAbstractField() → core::int;
+ abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
+ abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
abstract set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void;
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -196,10 +212,10 @@
: super self::Super::•()
;
abstract get mixedInAbstractField() → core::int;
- abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
abstract get extendedConcreteMixedInAbstractField() → core::int;
- abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
abstract get extendedAbstractMixedInAbstractField() → core::int;
+ abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
+ abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
abstract set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect
index b40e865..aa5c0aa6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractField
// - Mixin.mixedInAbstractField
// - Super.extendedAbstractField
+// - Super.extendedAbstractMixedInAbstractField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract final int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractField
// - Mixin.mixedInAbstractField
// - Super.extendedAbstractField
+// - Super.extendedAbstractMixedInAbstractField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract final int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -125,6 +133,9 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteField};
mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+ abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+ abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+ abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
synthetic constructor •() → self::ClassMixin
@@ -141,5 +152,8 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteField};
mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+ abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+ abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+ abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect
index 4b2a25d..4a7ba31 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.transformed.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractField
// - Mixin.mixedInAbstractField
// - Super.extendedAbstractField
+// - Super.extendedAbstractMixedInAbstractField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract final int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractField
// - Mixin.mixedInAbstractField
// - Super.extendedAbstractField
+// - Super.extendedAbstractMixedInAbstractField
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
// abstract final int extendedAbstractField;
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+// abstract final int extendedAbstractMixedInAbstractField;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -122,8 +130,8 @@
synthetic constructor •() → self::_ClassMixin&Super&Mixin
: super self::Super::•()
;
- abstract get mixedInAbstractField() → core::int;
abstract get extendedConcreteMixedInAbstractField() → core::int;
+ abstract get mixedInAbstractField() → core::int;
abstract get extendedAbstractMixedInAbstractField() → core::int;
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -138,8 +146,8 @@
synthetic constructor •() → self::NamedMixin
: super self::Super::•()
;
- abstract get mixedInAbstractField() → core::int;
abstract get extendedConcreteMixedInAbstractField() → core::int;
+ abstract get mixedInAbstractField() → core::int;
abstract get extendedAbstractMixedInAbstractField() → core::int;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect
index 36afe4a..09d72f2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractGetter
// - Mixin.mixedInAbstractGetter
// - Super.extendedAbstractGetter
+// - Super.extendedAbstractMixedInAbstractGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+// int get extendedAbstractMixedInAbstractGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractGetter
// - Mixin.mixedInAbstractGetter
// - Super.extendedAbstractGetter
+// - Super.extendedAbstractMixedInAbstractGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+// int get extendedAbstractMixedInAbstractGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -131,6 +139,9 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteGetter};
mixin-super-stub get extendedAbstractMixedInConcreteGetter() → core::int
return super.{self::Mixin::extendedAbstractMixedInConcreteGetter};
+ abstract mixin-stub get extendedConcreteMixedInAbstractGetter() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractGetter
+ abstract mixin-stub get mixedInAbstractGetter() → core::int; -> self::Mixin::mixedInAbstractGetter
+ abstract mixin-stub get extendedAbstractMixedInAbstractGetter() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractGetter
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
synthetic constructor •() → self::ClassMixin
@@ -147,5 +158,8 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteGetter};
mixin-super-stub get extendedAbstractMixedInConcreteGetter() → core::int
return super.{self::Mixin::extendedAbstractMixedInConcreteGetter};
+ abstract mixin-stub get extendedConcreteMixedInAbstractGetter() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractGetter
+ abstract mixin-stub get mixedInAbstractGetter() → core::int; -> self::Mixin::mixedInAbstractGetter
+ abstract mixin-stub get extendedAbstractMixedInAbstractGetter() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractGetter
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect
index 78a254e..f307297 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.transformed.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractGetter
// - Mixin.mixedInAbstractGetter
// - Super.extendedAbstractGetter
+// - Super.extendedAbstractMixedInAbstractGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+// int get extendedAbstractMixedInAbstractGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractGetter
// - Mixin.mixedInAbstractGetter
// - Super.extendedAbstractGetter
+// - Super.extendedAbstractMixedInAbstractGetter
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
// int get extendedAbstractGetter;
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+// int get extendedAbstractMixedInAbstractGetter;
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -131,8 +139,8 @@
return 0;
get extendedAbstractMixedInConcreteGetter() → core::int
return 0;
- abstract get mixedInAbstractGetter() → core::int;
abstract get extendedConcreteMixedInAbstractGetter() → core::int;
+ abstract get mixedInAbstractGetter() → core::int;
abstract get extendedAbstractMixedInAbstractGetter() → core::int;
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -150,8 +158,8 @@
return 0;
get extendedAbstractMixedInConcreteGetter() → core::int
return 0;
- abstract get mixedInAbstractGetter() → core::int;
abstract get extendedConcreteMixedInAbstractGetter() → core::int;
+ abstract get mixedInAbstractGetter() → core::int;
abstract get extendedAbstractMixedInAbstractGetter() → core::int;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect
index 0c88f5c..2c5b765 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractMethod
// - Mixin.mixedInAbstractMethod
// - Super.extendedAbstractMethod
+// - Super.extendedAbstractMixedInAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+// void extendedAbstractMixedInAbstractMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractMethod
// - Mixin.mixedInAbstractMethod
// - Super.extendedAbstractMethod
+// - Super.extendedAbstractMixedInAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+// void extendedAbstractMixedInAbstractMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -125,6 +133,9 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
mixin-super-stub method extendedAbstractMixedInConcreteMethod() → void
return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}();
+ abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+ abstract mixin-stub method mixedInAbstractMethod() → void; -> self::Mixin::mixedInAbstractMethod
+ abstract mixin-stub method extendedAbstractMixedInAbstractMethod() → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
synthetic constructor •() → self::ClassMixin
@@ -141,5 +152,8 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
mixin-super-stub method extendedAbstractMixedInConcreteMethod() → void
return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}();
+ abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+ abstract mixin-stub method mixedInAbstractMethod() → void; -> self::Mixin::mixedInAbstractMethod
+ abstract mixin-stub method extendedAbstractMixedInAbstractMethod() → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect
index 2d2295c..ab66dec 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.transformed.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractMethod
// - Mixin.mixedInAbstractMethod
// - Super.extendedAbstractMethod
+// - Super.extendedAbstractMixedInAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+// void extendedAbstractMixedInAbstractMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractMethod
// - Mixin.mixedInAbstractMethod
// - Super.extendedAbstractMethod
+// - Super.extendedAbstractMixedInAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+// void extendedAbstractMixedInAbstractMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -122,8 +130,8 @@
method mixedInConcreteMethod() → void {}
method extendedConcreteMixedInConcreteMethod() → void {}
method extendedAbstractMixedInConcreteMethod() → void {}
- abstract method mixedInAbstractMethod() → void;
abstract method extendedConcreteMixedInAbstractMethod() → void;
+ abstract method mixedInAbstractMethod() → void;
abstract method extendedAbstractMixedInAbstractMethod() → void;
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -138,8 +146,8 @@
method mixedInConcreteMethod() → void {}
method extendedConcreteMixedInConcreteMethod() → void {}
method extendedAbstractMixedInConcreteMethod() → void {}
- abstract method mixedInAbstractMethod() → void;
abstract method extendedConcreteMixedInAbstractMethod() → void;
+ abstract method mixedInAbstractMethod() → void;
abstract method extendedAbstractMixedInAbstractMethod() → void;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect
index 57d2af3..77883ed 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.expect
@@ -50,6 +50,7 @@
// - Mixin.extendedAbstractMixedInAbstractMethod
// - Mixin.mixedInAbstractMethod
// - Super.extendedAbstractMethod
+// - Super.extendedAbstractMixedInAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -67,11 +68,15 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+// void extendedAbstractMixedInAbstractMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractMethod
// - Mixin.mixedInAbstractMethod
// - Super.extendedAbstractMethod
+// - Super.extendedAbstractMixedInAbstractMethod
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
@@ -89,6 +94,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
// void extendedAbstractMethod();
// ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+// void extendedAbstractMixedInAbstractMethod();
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedConcreteMixedInConcreteMethod'.
// class ClassMixin extends Super with Mixin {}
@@ -130,6 +138,16 @@
// void extendedAbstractMixedInAbstractMethod();
// ^
//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: The implementation of 'extendedConcreteMixedInAbstractMethod' in the non-abstract class 'ClassMixin' does not conform to its interface.
+// class ClassMixin extends Super with Mixin {}
+// ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: The method 'Super.extendedConcreteMixedInAbstractMethod' has fewer positional arguments than those of overridden method 'Super with Mixin.extendedConcreteMixedInAbstractMethod'.
+// void extendedConcreteMixedInAbstractMethod() {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
+// class ClassMixin extends Super with Mixin {}
+// ^
+//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The mixin application class 'NamedMixin' introduces an erroneous override of 'extendedConcreteMixedInConcreteMethod'.
// class NamedMixin = Super with Mixin;
// ^^^^^^^^^^
@@ -170,60 +188,6 @@
// void extendedAbstractMixedInAbstractMethod();
// ^
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Class 'Super with Mixin' inherits multiple members named 'extendedConcreteMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedConcreteMixedInConcreteMethod' to 'Super with Mixin'.
-// class ClassMixin extends Super with Mixin {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:24:8: Context: This is one of the overridden members.
-// void extendedConcreteMixedInConcreteMethod(int i) {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:10:8: Context: This is one of the overridden members.
-// void extendedConcreteMixedInConcreteMethod() {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Class 'Super with Mixin' inherits multiple members named 'extendedAbstractMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedAbstractMixedInConcreteMethod' to 'Super with Mixin'.
-// class ClassMixin extends Super with Mixin {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:26:8: Context: This is one of the overridden members.
-// void extendedAbstractMixedInConcreteMethod(int i) {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: This is one of the overridden members.
-// void extendedAbstractMixedInConcreteMethod();
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: The implementation of 'extendedConcreteMixedInAbstractMethod' in the non-abstract class 'ClassMixin' does not conform to its interface.
-// class ClassMixin extends Super with Mixin {}
-// ^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: The method 'Super.extendedConcreteMixedInAbstractMethod' has fewer positional arguments than those of overridden method 'Mixin.extendedConcreteMixedInAbstractMethod'.
-// void extendedConcreteMixedInAbstractMethod() {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:28:8: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
-// void extendedConcreteMixedInAbstractMethod(int i);
-// ^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: Class 'NamedMixin' inherits multiple members named 'extendedConcreteMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedConcreteMixedInConcreteMethod' to 'NamedMixin'.
-// class NamedMixin = Super with Mixin;
-// ^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:24:8: Context: This is one of the overridden members.
-// void extendedConcreteMixedInConcreteMethod(int i) {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:10:8: Context: This is one of the overridden members.
-// void extendedConcreteMixedInConcreteMethod() {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: Class 'NamedMixin' inherits multiple members named 'extendedAbstractMixedInConcreteMethod' with incompatible signatures.
-// Try adding a declaration of 'extendedAbstractMixedInConcreteMethod' to 'NamedMixin'.
-// class NamedMixin = Super with Mixin;
-// ^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:26:8: Context: This is one of the overridden members.
-// void extendedAbstractMixedInConcreteMethod(int i) {}
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: This is one of the overridden members.
-// void extendedAbstractMixedInConcreteMethod();
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
import self as self;
import "dart:core" as core;
@@ -255,6 +219,13 @@
;
mixin-super-stub method mixedInConcreteMethod(core::int i) → void
return super.{self::Mixin::mixedInConcreteMethod}(i);
+ mixin-super-stub method extendedConcreteMixedInConcreteMethod(core::int i) → void
+ return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}(i);
+ mixin-super-stub method extendedAbstractMixedInConcreteMethod(core::int i) → void
+ return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}(i);
+ abstract mixin-stub method extendedConcreteMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+ abstract mixin-stub method mixedInAbstractMethod(core::int i) → void; -> self::Mixin::mixedInAbstractMethod
+ abstract mixin-stub method extendedAbstractMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
synthetic constructor •() → self::ClassMixin
@@ -267,5 +238,12 @@
;
mixin-super-stub method mixedInConcreteMethod(core::int i) → void
return super.{self::Mixin::mixedInConcreteMethod}(i);
+ mixin-super-stub method extendedConcreteMixedInConcreteMethod(core::int i) → void
+ return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}(i);
+ mixin-super-stub method extendedAbstractMixedInConcreteMethod(core::int i) → void
+ return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}(i);
+ abstract mixin-stub method extendedConcreteMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+ abstract mixin-stub method mixedInAbstractMethod(core::int i) → void; -> self::Mixin::mixedInAbstractMethod
+ abstract mixin-stub method extendedAbstractMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect
index a61aba7..c9a2f79 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.expect
@@ -49,6 +49,7 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractSetter=
// - Mixin.mixedInAbstractSetter=
+// - Super.extendedAbstractMixedInAbstractSetter=
// - Super.extendedAbstractSetter=
// Try to either
// - provide an implementation,
@@ -64,6 +65,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
// void set mixedInAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+// void set extendedAbstractMixedInAbstractSetter(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
// void set extendedAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^^
@@ -71,6 +75,7 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractSetter=
// - Mixin.mixedInAbstractSetter=
+// - Super.extendedAbstractMixedInAbstractSetter=
// - Super.extendedAbstractSetter=
// Try to either
// - provide an implementation,
@@ -86,6 +91,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
// void set mixedInAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+// void set extendedAbstractMixedInAbstractSetter(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
// void set extendedAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^^
@@ -125,6 +133,9 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteSetter} = i;
mixin-super-stub set extendedAbstractMixedInConcreteSetter(core::int i) → void
return super.{self::Mixin::extendedAbstractMixedInConcreteSetter} = i;
+ abstract mixin-stub set extendedConcreteMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractSetter
+ abstract mixin-stub set mixedInAbstractSetter(core::int i) → void; -> self::Mixin::mixedInAbstractSetter
+ abstract mixin-stub set extendedAbstractMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractSetter
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
synthetic constructor •() → self::ClassMixin
@@ -141,5 +152,8 @@
return super.{self::Mixin::extendedConcreteMixedInConcreteSetter} = i;
mixin-super-stub set extendedAbstractMixedInConcreteSetter(core::int i) → void
return super.{self::Mixin::extendedAbstractMixedInConcreteSetter} = i;
+ abstract mixin-stub set extendedConcreteMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractSetter
+ abstract mixin-stub set mixedInAbstractSetter(core::int i) → void; -> self::Mixin::mixedInAbstractSetter
+ abstract mixin-stub set extendedAbstractMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractSetter
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect
index d17ef57..7bdf664 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.transformed.expect
@@ -49,6 +49,7 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractSetter=
// - Mixin.mixedInAbstractSetter=
+// - Super.extendedAbstractMixedInAbstractSetter=
// - Super.extendedAbstractSetter=
// Try to either
// - provide an implementation,
@@ -64,6 +65,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
// void set mixedInAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+// void set extendedAbstractMixedInAbstractSetter(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
// void set extendedAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^^
@@ -71,6 +75,7 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
// - Mixin.extendedAbstractMixedInAbstractSetter=
// - Mixin.mixedInAbstractSetter=
+// - Super.extendedAbstractMixedInAbstractSetter=
// - Super.extendedAbstractSetter=
// Try to either
// - provide an implementation,
@@ -86,6 +91,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
// void set mixedInAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+// void set extendedAbstractMixedInAbstractSetter(int i);
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
// void set extendedAbstractSetter(int i);
// ^^^^^^^^^^^^^^^^^^^^^^
@@ -122,8 +130,8 @@
set mixedInConcreteSetter(core::int i) → void {}
set extendedConcreteMixedInConcreteSetter(core::int i) → void {}
set extendedAbstractMixedInConcreteSetter(core::int i) → void {}
- abstract set mixedInAbstractSetter(core::int i) → void;
abstract set extendedConcreteMixedInAbstractSetter(core::int i) → void;
+ abstract set mixedInAbstractSetter(core::int i) → void;
abstract set extendedAbstractMixedInAbstractSetter(core::int i) → void;
}
class ClassMixin extends self::_ClassMixin&Super&Mixin {
@@ -138,8 +146,8 @@
set mixedInConcreteSetter(core::int i) → void {}
set extendedConcreteMixedInConcreteSetter(core::int i) → void {}
set extendedAbstractMixedInConcreteSetter(core::int i) → void {}
- abstract set mixedInAbstractSetter(core::int i) → void;
abstract set extendedConcreteMixedInAbstractSetter(core::int i) → void;
+ abstract set mixedInAbstractSetter(core::int i) → void;
abstract set extendedAbstractMixedInAbstractSetter(core::int i) → void;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect
index 197d429..0f94026 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.expect
@@ -283,23 +283,24 @@
const synthetic constructor •() → self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract
: super self::_FromMixinConcreteAbstract&Object&MixinConcrete::•()
;
+ abstract mixin-stub method noSuchMethod(core::Invocation invocation) → dynamic; -> self::MixinAbstract::noSuchMethod
}
class FromMixinConcreteAbstract extends self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract implements self::Interface {
synthetic constructor •() → self::FromMixinConcreteAbstract
: super self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::•()
;
no-such-method-forwarder get getter() → core::int
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
no-such-method-forwarder get field() → core::int
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
no-such-method-forwarder method method() → void
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
no-such-method-forwarder get finalField() → core::int
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
no-such-method-forwarder set setter(core::int value) → void
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
no-such-method-forwarder set field(core::int value) → void
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
}
class InterfaceAbstract extends core::Object {
synthetic constructor •() → self::InterfaceAbstract
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect
index e524f56..730cbf4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.transformed.expect
@@ -294,17 +294,17 @@
: super self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::•()
;
no-such-method-forwarder get getter() → core::int
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
no-such-method-forwarder get field() → core::int
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
no-such-method-forwarder method method() → void
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
no-such-method-forwarder get finalField() → core::int
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
no-such-method-forwarder set setter(core::int value) → void
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
no-such-method-forwarder set field(core::int value) → void
- return this.{self::MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
+ return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(value)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5)));
}
class InterfaceAbstract extends core::Object {
synthetic constructor •() → self::InterfaceAbstract
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect
index eda0257..773c139 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.expect
@@ -2,17 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:16:7: Error: The implementation of 'extendedMethod1' in the non-abstract class 'Class' does not conform to its interface.
-// class Class extends Super {
-// ^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:7:28: Context: The parameter 'i' of the method 'Super.extendedMethod1' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Class.extendedMethod1'.
-// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
-// void extendedMethod1(int i) {}
-// ^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:18:8: Context: This is the overridden method ('extendedMethod1').
-// void extendedMethod1(num n);
-// ^
-//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:21:28: Error: The parameter 'i' of the method 'Class.extendedMethod2' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.extendedMethod2'.
// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
// void extendedMethod2(int i);
@@ -29,6 +18,17 @@
// void overriddenMethod2(num n) {}
// ^
//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:16:7: Error: The implementation of 'extendedMethod1' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super {
+// ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:7:28: Context: The parameter 'i' of the method 'Super.extendedMethod1' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Class.extendedMethod1'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+// void extendedMethod1(int i) {}
+// ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:18:8: Context: This is the overridden method ('extendedMethod1').
+// void extendedMethod1(num n);
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect
index d73e778..91d4ae2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.expect
@@ -19,9 +19,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:70:15: Error: Can't declare a member that conflicts with an inherited one.
// static void mixedInInstanceDeclaredStaticMethod() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:56:16: Context: This is the inherited member.
-// abstract class Class extends Super with Mixin implements Interface {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:27:8: Context: This is the inherited member.
+// void mixedInInstanceDeclaredStaticMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:73:15: Error: Can't declare a member that conflicts with an inherited one.
// static void implementedInstanceDeclaredStaticMethod() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect
index e5cd1f8..4477dde 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.transformed.expect
@@ -19,9 +19,9 @@
// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:70:15: Error: Can't declare a member that conflicts with an inherited one.
// static void mixedInInstanceDeclaredStaticMethod() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:56:16: Context: This is the inherited member.
-// abstract class Class extends Super with Mixin implements Interface {
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:27:8: Context: This is the inherited member.
+// void mixedInInstanceDeclaredStaticMethod() {}
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:73:15: Error: Can't declare a member that conflicts with an inherited one.
// static void implementedInstanceDeclaredStaticMethod() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
index a1df551..a878892 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
@@ -9,20 +9,37 @@
const synthetic constructor •() → self::_C&Object&A*
: super core::Object::•()
;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> baz2::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> baz2::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> baz2::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> baz2::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> baz2::A::hashCode
mixin-super-stub method toString({core::String* s = #C1}) → core::String*
return super.{baz2::A::toString}(s: s);
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> baz2::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> baz2::A::runtimeType
}
abstract class _C&Object&A&B = self::_C&Object&A with baz2::B /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
- abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::toString
+ abstract mixin-stub get _identityHashCode() → core::int*; -> baz2::B::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> baz2::B::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> baz2::B::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> baz2::B::==
+ abstract mixin-stub get hashCode() → core::int*; -> baz2::B::hashCode
+ abstract mixin-stub method toString() → core::String*; -> baz2::B::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> baz2::B::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> baz2::B::runtimeType
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
: super self::_C&Object&A&B::•()
;
- abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::toString
}
static method main() → void {
core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
index dac9776..2ba727b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
@@ -9,6 +9,16 @@
const synthetic constructor •() → self::_C&Object&A*
: super core::Object::•()
;
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::A::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::A::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::A::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::A::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::A::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::A::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::A::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::A::runtimeType
mixin-super-stub method method({core::String* s = #C1}) → core::String*
return super.{iss::A::method}(s: s);
}
@@ -16,16 +26,25 @@
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
- abstract member-signature method method({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
+ abstract mixin-stub get _identityHashCode() → core::int*; -> iss::B::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> iss::B::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> iss::B::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> iss::B::==
+ abstract mixin-stub get hashCode() → core::int*; -> iss::B::hashCode
+ abstract mixin-stub method toString() → core::String*; -> iss::B::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> iss::B::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> iss::B::runtimeType
+ abstract mixin-stub method method() → core::String*; -> iss::B::method
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
: super self::_C&Object&A&B::•()
;
- abstract member-signature method method({core::String* s = #C1}) → core::String*; -> self::_C&Object&A::method
}
static method main() → dynamic {
- core::print(new self::C::•().{self::C::method}());
+ core::print(new self::C::•().{self::_C&Object&A&B::method}());
}
library;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect
index b8246e1..ec08b47 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.expect
@@ -61,6 +61,7 @@
synthetic constructor •() → iss::B*
: super core::Object::•()
;
+ abstract member-signature method method() → core::String*; -> iss2::Interface::method
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -71,7 +72,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method method() → core::String*; -> iss2::Interface::method
}
static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect
index ba3f39c..f7c6ef0 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.transformed.expect
@@ -26,6 +26,7 @@
const synthetic constructor •() → self::_C&Object&A&B*
: super self::_C&Object&A::•()
;
+ abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method() → core::String*; -> #lib1::Interface::method
abstract member-signature get /* from org-dartlang-testcase:///issue41210b_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -36,7 +37,6 @@
abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ toString() → core::String*; -> core::Object::toString
abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get /* from org-dartlang-testcase:///issue41210b_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method /* from org-dartlang-testcase:///issue41210b_lib1.dart */ method() → core::String*; -> #lib1::Interface::method
}
class C extends self::_C&Object&A&B {
synthetic constructor •() → self::C*
@@ -72,6 +72,7 @@
synthetic constructor •() → iss::B*
: super core::Object::•()
;
+ abstract member-signature method method() → core::String*; -> iss2::Interface::method
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -82,7 +83,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method method() → core::String*; -> iss2::Interface::method
}
static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
index 3a9fde4..cf0c156 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
@@ -2,6 +2,8 @@
import self as self;
import "foundation_binding_lib.dart" as fou;
import "scheduler_binding_lib.dart" as sch;
+import "dart:core" as core;
+import "dart:async" as asy;
import "services_binding_lib.dart" as ser;
import "org-dartlang-testcase:///foundation_lib.dart";
@@ -12,6 +14,17 @@
synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding*
: super fou::BindingBase::•()
;
+ abstract mixin-stub method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> sch::SchedulerBinding::registerSignalServiceExtension
+ abstract mixin-stub get _identityHashCode() → core::int*; -> sch::SchedulerBinding::_identityHashCode
+ abstract mixin-stub method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> sch::SchedulerBinding::_instanceOf
+ abstract mixin-stub method _simpleInstanceOf(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOf
+ abstract mixin-stub method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOfTrue
+ abstract mixin-stub method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> sch::SchedulerBinding::_simpleInstanceOfFalse
+ abstract mixin-stub operator ==(dynamic other) → core::bool*; -> sch::SchedulerBinding::==
+ abstract mixin-stub get hashCode() → core::int*; -> sch::SchedulerBinding::hashCode
+ abstract mixin-stub method toString() → core::String*; -> sch::SchedulerBinding::toString
+ abstract mixin-stub method noSuchMethod(core::Invocation* invocation) → dynamic; -> sch::SchedulerBinding::noSuchMethod
+ abstract mixin-stub get runtimeType() → core::Type*; -> sch::SchedulerBinding::runtimeType
}
abstract class _TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding = self::_TestSchedulerBinding&BindingBase&SchedulerBinding with ser::ServicesBinding /*isAnonymousMixin*/ {
synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding*
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
index 7f60cbd..4ac860d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
@@ -10,6 +10,8 @@
class E2 = Object with A, D;
+class E3 = Object with A, F;
+
abstract class C6 extends C3 implements C4 {}
abstract class C8 extends C5 implements C7 {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
index 1763bc0..212f813 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
@@ -4,6 +4,7 @@
class E1 with A, D {}
class E2 = Object with A, D;
+class E3 = Object with A, F;
abstract class C6 extends C3 implements C4 {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
index 9bd7263..ea6829e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
@@ -8,4 +8,5 @@
class E1 with A, D {}
class E2 = Object with A, D;
+class E3 = Object with A, F;
main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
index 7b96874..11f8668 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
@@ -26,13 +26,13 @@
const synthetic constructor •() → self::_E1&Object&A&D*
: super self::_E1&Object&A::•()
;
- abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+ forwarding-stub method method(covariant core::num* i) → core::String*
+ return super.{self::_E1&Object&A::method}(i);
}
class E1 extends self::_E1&Object&A&D {
synthetic constructor •() → self::E1*
: super self::_E1&Object&A&D::•()
;
- abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E1&Object&A&D::method
}
abstract class _E2&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E2&Object&A*
@@ -55,13 +55,35 @@
const synthetic constructor •() → self::E2*
: super self::_E2&Object&A::•()
;
- abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+ forwarding-stub method method(covariant core::num* i) → core::String*
+ return super.{self::_E2&Object&A::method}(i);
+}
+abstract class _E3&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_E3&Object&A*
+ : super core::Object::•()
+ ;
+ mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+ return super.{mai::A::method}(i, s: s);
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E3 = self::_E3&Object&A with mai::F /*hasConstConstructor*/ {
+ const synthetic constructor •() → self::E3*
+ : super self::_E3&Object&A::•()
+ ;
}
abstract class C6 extends mai::C3 implements mai::C4 {
synthetic constructor •() → self::C6*
: super mai::C3::•()
;
- abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,12 +94,12 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
}
abstract class C8 extends mai::C5 implements mai::C7 {
synthetic constructor •() → self::C8*
: super mai::C5::•()
;
- abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -88,6 +110,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
}
static method main() → dynamic {}
@@ -117,6 +140,11 @@
;
abstract forwarding-stub method method(covariant core::num i) → core::String;
}
+abstract class F extends core::Object implements mai::Interface {
+ synthetic constructor •() → mai::F
+ : super core::Object::•()
+ ;
+}
abstract class C1 extends core::Object {
synthetic constructor •() → mai::C1
: super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
index 26c7fd6..7b32bba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
@@ -26,13 +26,13 @@
const synthetic constructor •() → self::_E1&Object&A&D*
: super self::_E1&Object&A::•()
;
- abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+ forwarding-stub method method(covariant core::num* i) → core::String*
+ return super.{self::_E1&Object&A::method}(i);
}
class E1 extends self::_E1&Object&A&D {
synthetic constructor •() → self::E1*
: super self::_E1&Object&A&D::•()
;
- abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E1&Object&A&D::method
}
abstract class _E2&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_E2&Object&A*
@@ -55,13 +55,35 @@
const synthetic constructor •() → self::E2*
: super self::_E2&Object&A::•()
;
- abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+ forwarding-stub method method(covariant core::num* i) → core::String*
+ return super.{self::_E2&Object&A::method}(i);
+}
+abstract class _E3&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_E3&Object&A*
+ : super core::Object::•()
+ ;
+ method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+ return s;
+ abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+ abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+ abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+ abstract member-signature method toString() → core::String*; -> core::Object::toString
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E3 extends self::_E3&Object&A implements mai::F /*isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::E3*
+ : super self::_E3&Object&A::•()
+ ;
}
abstract class C6 extends mai::C3 implements mai::C4 {
synthetic constructor •() → self::C6*
: super mai::C3::•()
;
- abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,12 +94,12 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
}
abstract class C8 extends mai::C5 implements mai::C7 {
synthetic constructor •() → self::C8*
: super mai::C5::•()
;
- abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -88,6 +110,7 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+ abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
}
static method main() → dynamic {}
@@ -117,6 +140,11 @@
;
abstract forwarding-stub method method(covariant core::num i) → core::String;
}
+abstract class F extends core::Object implements mai::Interface {
+ synthetic constructor •() → mai::F
+ : super core::Object::•()
+ ;
+}
abstract class C1 extends core::Object {
synthetic constructor •() → mai::C1
: super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
index 5291414..6bcc053 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
@@ -16,6 +16,8 @@
abstract class D implements Interface, Interface2 {}
+abstract class F implements Interface {}
+
abstract class C1 {
method2();
}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect
index e001ce8..d8ff996 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.expect
@@ -45,11 +45,11 @@
synthetic constructor •() → self::_DwB0&C0&B
: super mix::C0::•()
;
- mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int) → core::int>
+ mixin-super-stub get a() → core::List<(core::int) → core::int>
return super.{mix2::B::a};
- mixin-super-stub set /*isLegacy*/ a(core::List<(core::int) → core::int> _) → void
+ mixin-super-stub set a(core::List<(core::int) → core::int> _) → void
return super.{mix2::B::a} = _;
- mixin-super-stub method /*isLegacy*/ m((core::int) → core::int x) → (core::int) → core::int
+ mixin-super-stub method m((core::int) → core::int x) → (core::int) → core::int
return super.{mix2::B::m}(x);
abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -70,11 +70,11 @@
synthetic constructor •() → self::_DwBq0&C0&Bq
: super mix::C0::•()
;
- mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int?) → core::int?>
+ mixin-super-stub get a() → core::List<(core::int?) → core::int?>
return super.{mix2::Bq::a};
- mixin-super-stub set /*isLegacy*/ a(core::List<(core::int?) → core::int?> _) → void
+ mixin-super-stub set a(core::List<(core::int?) → core::int?> _) → void
return super.{mix2::Bq::a} = _;
- mixin-super-stub method /*isLegacy*/ m((core::int?) → core::int? x) → (core::int?) → core::int?
+ mixin-super-stub method m((core::int?) → core::int? x) → (core::int?) → core::int?
return super.{mix2::Bq::m}(x);
abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -129,11 +129,11 @@
synthetic constructor •() → self::_DwB3&C3&B
: super mix::C3::•()
;
- mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int) → core::int>
+ mixin-super-stub get a() → core::List<(core::int) → core::int>
return super.{mix2::B::a};
- mixin-super-stub set /*isLegacy*/ a(core::List<(core::int) → core::int> _) → void
+ mixin-super-stub set a(core::List<(core::int) → core::int> _) → void
return super.{mix2::B::a} = _;
- mixin-super-stub method /*isLegacy*/ m((core::int) → core::int x) → (core::int) → core::int
+ mixin-super-stub method m((core::int) → core::int x) → (core::int) → core::int
return super.{mix2::B::m}(x);
abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
@@ -154,11 +154,11 @@
synthetic constructor •() → self::_DwBq3&C3&Bq
: super mix::C3::•()
;
- mixin-super-stub get /*isLegacy*/ a() → core::List<(core::int?) → core::int?>
+ mixin-super-stub get a() → core::List<(core::int?) → core::int?>
return super.{mix2::Bq::a};
- mixin-super-stub set /*isLegacy*/ a(core::List<(core::int?) → core::int?> _) → void
+ mixin-super-stub set a(core::List<(core::int?) → core::int?> _) → void
return super.{mix2::Bq::a} = _;
- mixin-super-stub method /*isLegacy*/ m((core::int?) → core::int? x) → (core::int?) → core::int?
+ mixin-super-stub method m((core::int?) → core::int? x) → (core::int?) → core::int?
return super.{mix2::Bq::m}(x);
abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
index a59d64d..ca14755 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
@@ -26,10 +26,10 @@
synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
: super self::_Class&Object&Mixin1::•()
;
- mixin-super-stub set field((dynamic) →* core::Type* value) → void
- return super.{mai::Mixin2::field} = value;
mixin-super-stub get field() → (dynamic) →* core::Type*
return super.{mai::Mixin2::field};
+ mixin-super-stub set field((dynamic) →* core::Type* value) → void
+ return super.{mai::Mixin2::field} = value;
mixin-super-stub method method1() → (dynamic) →* core::Type*
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2((dynamic) →* core::Type* t) → void
@@ -59,8 +59,10 @@
synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
: super core::Object::•()
;
- abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+ abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+ abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+ abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -71,8 +73,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
- abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
}
abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
index 0d55698..a0b7a6c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
@@ -21,8 +21,8 @@
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+ abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
}
@@ -69,8 +69,10 @@
synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
: super core::Object::•()
;
- abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+ abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+ abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+ abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -81,8 +83,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
- abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
}
abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
index a59d64d..ca14755 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
@@ -26,10 +26,10 @@
synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
: super self::_Class&Object&Mixin1::•()
;
- mixin-super-stub set field((dynamic) →* core::Type* value) → void
- return super.{mai::Mixin2::field} = value;
mixin-super-stub get field() → (dynamic) →* core::Type*
return super.{mai::Mixin2::field};
+ mixin-super-stub set field((dynamic) →* core::Type* value) → void
+ return super.{mai::Mixin2::field} = value;
mixin-super-stub method method1() → (dynamic) →* core::Type*
return super.{mai::Mixin2::method1}();
mixin-super-stub method method2((dynamic) →* core::Type* t) → void
@@ -59,8 +59,10 @@
synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
: super core::Object::•()
;
- abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+ abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+ abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+ abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -71,8 +73,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
- abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
}
abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
index 0d55698..a0b7a6c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
@@ -21,8 +21,8 @@
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+ abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
}
@@ -69,8 +69,10 @@
synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
: super core::Object::•()
;
- abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+ abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+ abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+ abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -81,8 +83,6 @@
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
- abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
- abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
}
abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
field (dynamic) →* core::Type* field = null;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect
index 25c58bb..c317528 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.expect
@@ -9,8 +9,8 @@
synthetic constructor •() → self::Class*
: super sup::SuperClass::•()
;
- abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
abstract member-signature get property() → core::Object*; -> sup::SuperClass::property
+ abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect
index 25c58bb..c317528 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.transformed.expect
@@ -9,8 +9,8 @@
synthetic constructor •() → self::Class*
: super sup::SuperClass::•()
;
- abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
abstract member-signature get property() → core::Object*; -> sup::SuperClass::property
+ abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
index 29f7048..ac147ed 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
@@ -21,6 +21,7 @@
synthetic constructor •() → self::I*
;
abstract method foo() → void;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -29,7 +30,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
index cf46444..2182bea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
@@ -24,6 +24,7 @@
: super core::Object::•()
;
abstract method foo() → void;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
index cf46444..2182bea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
@@ -24,6 +24,7 @@
: super core::Object::•()
;
abstract method foo() → void;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
index fd257f0..5a2927f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
@@ -56,6 +56,7 @@
synthetic constructor •() → self::HungryCat*
;
abstract method eatFood(core::String* food, {core::double* amount, core::double* yetAnother}) → core::bool*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -64,7 +65,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect
index 3979bfc..b32f8e5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.expect
@@ -64,6 +64,7 @@
: super core::Object::•()
;
abstract method eatFood(core::String* food, {core::double* amount = #C5, core::double* yetAnother = #C5}) → core::bool*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,7 +73,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect
index 675ecfb..d5a49ee 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.strong.transformed.expect
@@ -64,6 +64,7 @@
: super core::Object::•()
;
abstract method eatFood(core::String* food, {core::double* amount = #C5, core::double* yetAnother = #C5}) → core::bool*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -72,7 +73,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
index 513d138..6986170 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
@@ -22,6 +22,7 @@
;
method foo() → void
;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -30,7 +31,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
index 4351d37..acee4b7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
@@ -24,6 +24,7 @@
: super core::Object::•()
;
method foo() → void {}
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
index 4351d37..acee4b7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
@@ -24,6 +24,7 @@
: super core::Object::•()
;
method foo() → void {}
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,7 +33,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A implements self::I {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 6b1da0c..2d1038e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
@@ -45,6 +45,7 @@
synthetic constructor •() → pri::Fisk*
;
abstract method _hest() → void;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -53,7 +54,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
index 6a52850..735122a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
@@ -48,6 +48,7 @@
: super core::Object::•()
;
abstract method _hest() → void;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -56,7 +57,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
index 6a52850..735122a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
@@ -48,6 +48,7 @@
: super core::Object::•()
;
abstract method _hest() → void;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -56,7 +57,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index 9fc1e31..80e949b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -6,6 +6,7 @@
synthetic constructor •() → self::I<self::I::T*>*
;
abstract method foo() → self::I::T*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -14,7 +15,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M extends core::Object {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
index 8920c01..3676843 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
@@ -7,6 +7,7 @@
: super core::Object::•()
;
abstract method foo() → self::I::T*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -15,7 +16,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M extends core::Object {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
index 4e46a55..84fdbfc 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
@@ -7,6 +7,7 @@
: super core::Object::•()
;
abstract method foo() → self::I::T*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -15,7 +16,6 @@
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
- abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M extends core::Object {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
index d8dedc2..d858827 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
@@ -32,11 +32,11 @@
;
mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+ mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+ forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
@@ -34,11 +34,11 @@
;
mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+ mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+ forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
static method main() → dynamic {
self::Class c = new self::Class::•();
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
self::Superclass s = c;
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
@@ -34,11 +34,11 @@
;
mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+ mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+ forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
static method main() → dynamic {
self::Class c = new self::Class::•();
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
self::Superclass s = c;
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
@@ -34,11 +34,11 @@
;
mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+ mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+ forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
static method main() → dynamic {
self::Class c = new self::Class::•();
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
self::Superclass s = c;
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
index 31bd6b8..be28553 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
@@ -34,11 +34,11 @@
;
mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
return super.{self::Mixin::method1}(argument1, argument2);
- forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String
+ mixin-super-stub method method2(covariant core::int argument1, core::num argument2) → core::String
return super.{self::Mixin::method2}(argument1, argument2);
forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
return super.{self::Mixin::method3}(argument1, argument2);
- forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+ forwarding-stub method method4(covariant core::int argument1, covariant core::int argument2) → core::String
return super.{self::Mixin::method4}(argument1, argument2);
}
class Class extends self::_Class&Superclass&Mixin {
@@ -49,9 +49,9 @@
static method main() → dynamic {
self::Class c = new self::Class::•();
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
- self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::num, core::num) → core::String});
+ self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
self::Superclass s = c;
self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 71a0dbf..add20b0 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -19,6 +19,8 @@
general/infer_field_from_multiple: TypeCheckError
general/invalid_operator: TypeCheckError
general/invalid_operator_override: TypeCheckError
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
general/mixin_application_override: TypeCheckError
general/override_check_accessor_after_inference: TypeCheckError
general/override_check_accessor_basic: TypeCheckError
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
index ad6b170..d282494 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -2,16 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
-// class E extends D {
-// ^
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
-// foo(int x) => x;
-// ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
-// foo(int x, {int y});
-// ^
-//
// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
// class C extends A implements B {
// ^
@@ -22,6 +12,16 @@
// foo(int x, {int y}) => y;
// ^
//
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+// ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+// foo(int x) => x;
+// ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+// foo(int x, {int y});
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index 32e4786..3493cad 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -2,16 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
-// class E extends D {
-// ^
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
-// foo(int x) => x;
-// ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
-// foo(int x, {int y});
-// ^
-//
// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
// class C extends A implements B {
// ^
@@ -22,6 +12,16 @@
// foo(int x, {int y}) => y;
// ^
//
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+// ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+// foo(int x) => x;
+// ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+// foo(int x, {int y});
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
index 32e4786..3493cad 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -2,16 +2,6 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
-// class E extends D {
-// ^
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
-// foo(int x) => x;
-// ^
-// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
-// foo(int x, {int y});
-// ^
-//
// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
// class C extends A implements B {
// ^
@@ -22,6 +12,16 @@
// foo(int x, {int y}) => y;
// ^
//
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+// ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+// foo(int x) => x;
+// ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+// foo(int x, {int y});
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
index 9c97b6c..4b93548 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
@@ -1,4 +1,17 @@
library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+// ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+// int x;
+// ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
index 92c4e15..ef3d7b6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
@@ -1,4 +1,17 @@
library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+// ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+// int x;
+// ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
index 92c4e15..ef3d7b6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
@@ -1,4 +1,17 @@
library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+// ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+// int x;
+// ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index 10bc3ee..b6f1dad 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -82,7 +82,7 @@
return super.{self::M::x} = value;
mixin-super-stub get y() → core::int*
return super.{self::M::y};
- forwarding-stub set y(covariant core::Object* value) → void
+ forwarding-stub set y(covariant core::int* value) → void
return super.{self::M::y} = value;
}
static method expectTypeError(() →* void callback) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index a084cac..2f222f6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -89,7 +89,7 @@
return super.{self::M::x} = value;
mixin-super-stub get y() → core::int*
return super.{self::M::y};
- forwarding-stub set y(covariant core::Object* value) → void
+ forwarding-stub set y(covariant core::int* value) → void
return super.{self::M::y} = value;
}
static method expectTypeError(() →* void callback) → void {
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
index 48cf848..3582fa0 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
@@ -89,7 +89,7 @@
return super.{self::M::x} = value;
mixin-super-stub get y() → core::int*
return super.{self::M::y};
- forwarding-stub set y(covariant core::Object* value) → void
+ forwarding-stub set y(covariant core::int* value) → void
return super.{self::M::y} = value;
}
static method expectTypeError(() →* void callback) → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index 3f56a5f..743d696 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -98,7 +98,7 @@
return super.{self::M::x} = value;
mixin-super-stub get y() → core::int*
return super.{self::M::y};
- forwarding-stub set y(covariant core::Object* value) → void
+ forwarding-stub set y(covariant core::int* value) → void
return super.{self::M::y} = value;
}
static method expectTypeError(() →* void callback) → void {
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index eea0f81..b2c9538 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -72,6 +72,8 @@
general/issue38938: RuntimeError # no main and compile time errors.
general/issue38944: RuntimeError # no main and compile time errors.
general/issue38961: RuntimeError # no main and compile time errors.
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
general/micro: RuntimeError
general/mixin_application_override: ExpectationFileMismatch # Too many errors.
general/mixin_application_override: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index d84d3b9..a59dfcd 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -74,6 +74,8 @@
general/issue38938: RuntimeError
general/issue38944: RuntimeError
general/issue38961: RuntimeError
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
general/micro: RuntimeError
general/mixin_application_override: TypeCheckError
general/mixin_constructors_with_default_values: RuntimeError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 901929c..add6cbb 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -100,6 +100,7 @@
late_lowering/late_lowering_bitmasks: FormatterCrash
late_lowering/late_nullable_field_with_initializer: FormatterCrash
late_lowering/late_nullable_field_without_initializer: FormatterCrash
+late_lowering/late_override: FormatterCrash
late_lowering/later: FormatterCrash
late_lowering/override: FormatterCrash
late_lowering/override_getter_setter: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index a382980..56c47dc 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -78,6 +78,8 @@
nnbd_mixed/hierarchy/mix_in_override: TypeCheckError
nnbd_mixed/hierarchy/override: TypeCheckError
nnbd_mixed/inheritance_from_opt_in: TypeCheckError
+nnbd_mixed/issue40512/issue40512: TypeCheckError
+nnbd_mixed/issue41210a/issue41210: TypeCheckError
nnbd_mixed/issue41567: TypeCheckError
nnbd_mixed/messages_with_types_opt_in: TypeCheckError
nnbd_mixed/messages_with_types_opt_out: TypeCheckError
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 50bd29e..edd1e75 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -485,6 +485,7 @@
"exclude": [
"^pkg/analysis_server/lib/src/analysis_server\\.dart",
"test/analyser_ignored/",
+ "test/class_hierarchy/data/",
"test/enable_non_nullable/data/",
"test/extensions/data/",
"test/id_testing/data/",
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index c31e80b..3a386bd 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -71,3 +71,47 @@
@override
DartType visitNeverType(NeverType node) => const NullType();
}
+
+/// Returns `true` if a member declared in [declaringClass] inherited or
+/// mixed into [enclosingClass] needs legacy erasure to compute its inherited
+/// type.
+///
+/// For instance:
+///
+/// // Opt in:
+/// class Super {
+/// int extendedMethod(int i, {required int j}) => i;
+/// }
+/// class Mixin {
+/// int mixedInMethod(int i, {required int j}) => i;
+/// }
+/// // Opt out:
+/// class Legacy extends Super with Mixin {}
+/// // Opt in:
+/// class Class extends Legacy {
+/// test() {
+/// // Ok to call `Legacy.extendedMethod` since its type is
+/// // `int* Function(int*, {int* j})`.
+/// super.extendedMethod(null);
+/// // Ok to call `Legacy.mixedInMethod` since its type is
+/// // `int* Function(int*, {int* j})`.
+/// super.mixedInMethod(null);
+/// }
+/// }
+///
+bool needsLegacyErasure(Class enclosingClass, Class declaringClass) {
+ Class cls = enclosingClass;
+ while (cls != null) {
+ if (!cls.enclosingLibrary.isNonNullableByDefault) {
+ return true;
+ }
+ if (cls == declaringClass) {
+ return false;
+ }
+ if (cls.mixedInClass == declaringClass) {
+ return false;
+ }
+ cls = cls.superclass;
+ }
+ return false;
+}
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 0ca1b4a..a7faeea 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1157,17 +1157,25 @@
if (features.isNotEmpty) {
writeWord("/*${features.join(',')}*/");
}
- if (node.isMemberSignature) {
- writeFunction(node.function,
- name: getMemberName(node), terminateLine: false);
- if (node.function.body is ReturnStatement) {
- writeSymbol(';');
- }
- writeSymbol(' -> ');
- writeMemberReferenceFromReference(node.stubTargetReference);
- endLine();
- } else {
- writeFunction(node.function, name: getMemberName(node));
+ switch (node.stubKind) {
+ case ProcedureStubKind.Regular:
+ case ProcedureStubKind.AbstractForwardingStub:
+ case ProcedureStubKind.ConcreteForwardingStub:
+ case ProcedureStubKind.NoSuchMethodForwarder:
+ case ProcedureStubKind.ConcreteMixinStub:
+ writeFunction(node.function, name: getMemberName(node));
+ break;
+ case ProcedureStubKind.MemberSignature:
+ case ProcedureStubKind.AbstractMixinStub:
+ writeFunction(node.function,
+ name: getMemberName(node), terminateLine: false);
+ if (node.function.body is ReturnStatement) {
+ writeSymbol(';');
+ }
+ writeSymbol(' -> ');
+ writeMemberReferenceFromReference(node.stubTargetReference);
+ endLine();
+ break;
}
}
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index bca2e93..2dc17ea 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -190,7 +190,7 @@
///
/// Note that this is not guaranteed to be complete. It is used to make hard
/// edges on a best-effort basis.
- final _postDominatedLocals = _ScopedLocalSet();
+ var _postDominatedLocals = _ScopedLocalSet();
/// Map whose keys are expressions of the form `a?.b` on the LHS of
/// assignments, and whose values are the nullability nodes corresponding to
@@ -856,9 +856,15 @@
_dispatch(node.returnType);
if (_flowAnalysis != null) {
// This is a local function.
- _flowAnalysis.functionExpression_begin(node);
- _dispatch(node.functionExpression);
- _flowAnalysis.functionExpression_end();
+ var previousPostDominatedLocals = _postDominatedLocals;
+ try {
+ _postDominatedLocals = _ScopedLocalSet();
+ _flowAnalysis.functionExpression_begin(node);
+ _dispatch(node.functionExpression);
+ _flowAnalysis.functionExpression_end();
+ } finally {
+ _postDominatedLocals = previousPostDominatedLocals;
+ }
} else {
_createFlowAnalysis(node, node.functionExpression.parameters);
// Initialize a new postDominator scope that contains only the parameters.
@@ -904,7 +910,9 @@
_currentFunctionExpression = node;
_currentFunctionType =
_variables.decoratedElementType(node.declaredElement);
+ var previousPostDominatedLocals = _postDominatedLocals;
try {
+ _postDominatedLocals = _ScopedLocalSet();
_postDominatedLocals.doScoped(
elements: node.declaredElement.parameters,
action: () => _dispatch(node.body));
@@ -916,6 +924,7 @@
}
_currentFunctionType = previousFunctionType;
_currentFunctionExpression = previousFunction;
+ _postDominatedLocals = previousPostDominatedLocals;
}
}
@@ -941,7 +950,9 @@
@override
DecoratedType visitIfElement(IfElement node) {
+ _flowAnalysis.ifStatement_conditionBegin();
_checkExpressionNotNull(node.condition);
+ _flowAnalysis.ifStatement_thenBegin(node.condition, node);
NullabilityNode trueGuard;
NullabilityNode falseGuard;
if (identical(_conditionInfo?.condition, node.condition)) {
@@ -962,6 +973,7 @@
}
}
if (node.elseElement != null) {
+ _flowAnalysis.ifStatement_elseBegin();
if (falseGuard != null) {
_guards.add(falseGuard);
}
@@ -974,6 +986,7 @@
}
}
}
+ _flowAnalysis.ifStatement_end(node.elseElement != null);
return null;
}
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 735dc5d..e620c8e 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 '1c7430e172f23f5be5dd1029879b315c'
+// migration_dart md5 is '46cf7671204b04b89e72a70aae96a7fc'
String _migration_js_base64 = '''
KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgcz1P
YmplY3Qua2V5cyhhKQpmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIHE9c1tyXQpiW3FdPWFb
@@ -8446,2041 +8446,2041 @@
YXNlIDY1Mjc5OnJldHVybiEwCmRlZmF1bHQ6cmV0dXJuITF9fSwKbW06ZnVuY3Rpb24oYSxiKXt2YXIg
cyxyCmZvcihzPWEubGVuZ3RoO2I8czspe3I9Qy54Qi5XKGEsYikKaWYociE9PTMyJiZyIT09MTMmJiFK
LkdhKHIpKWJyZWFrOysrYn1yZXR1cm4gYn0sCmMxOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpmb3IoO2I+
-MDtiPXMpe3M9Yi0xCnI9Qy54Qi5PMihhLHMpCmlmKHIhPT0zMiYmciE9PTEzJiYhSi5HYShyKSlicmVh
-a31yZXR1cm4gYn0sClRKOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gSi5x
-SS5wcm90b3R5cGUKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihh
-PT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlw
-ZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1
-LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5r
-cyhhKX0sClU2OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90
-b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5q
-ZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIily
-ZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEK
-cmV0dXJuIEoua3MoYSl9LApZRTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBhCmlmKHR5cGVv
-ZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBl
-CnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKaWE6
-ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXtpZihNYXRoLmZsb29yKGEpPT1hKXJldHVy
-biBKLmJVLnByb3RvdHlwZQpyZXR1cm4gSi5WQS5wcm90b3R5cGV9aWYodHlwZW9mIGE9PSJzdHJpbmci
-KXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBKLndlLnByb3RvdHlwZQppZih0
-eXBlb2YgYT09ImJvb2xlYW4iKXJldHVybiBKLnlFLnByb3RvdHlwZQppZihhLmNvbnN0cnVjdG9yPT1B
-cnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2Yg
-YT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9m
-IFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApyWTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09
-InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoIShhIGlu
-c3RhbmNlb2YgUC5NaCkpcmV0dXJuIEoua2QucHJvdG90eXBlCnJldHVybiBhfSwKdmQ6ZnVuY3Rpb24o
-YSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBKLnFJLnByb3RvdHlwZQppZihhPT1udWxsKXJl
-dHVybiBhCmlmKCEoYSBpbnN0YW5jZW9mIFAuTWgpKXJldHVybiBKLmtkLnByb3RvdHlwZQpyZXR1cm4g
-YX0sCncxOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJy
-YXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9
-PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQ
-Lk1oKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKQTU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShh
-KS5lUihhLGIpfSwKRWg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLllFKGEpLm1LKGEsYixjKX0sCkVs
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuZHIoYSxiKX0sCkY3OmZ1bmN0aW9uKGEpe3JldHVy
-biBKLlU2KGEpLmdvcihhKX0sCkZMOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuZGQoYSxiKX0s
-CkdBOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuRShhLGIpfSwKSG06ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouVTYoYSkuZ0EoYSl9LApJVDpmdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5nbShhKX0sCkp5
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouaWEoYSkuZTcoYSxiKX0sCktWOmZ1bmN0aW9uKGEsYil7cmV0
-dXJuIEouclkoYSkueW4oYSxiKX0sCkx0OmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLndnKGEpfSwK
-TTE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUyKGEsYixjKX0sCk11OmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIEouWUUoYSkuc1AoYSxiKX0sClF6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSku
-VyhhLGIpfSwKUk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxsCmlmKHR5cGVv
-ZiBhIT0ib2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEouaWEoYSkuRE4oYSxiKX0s
-ClJYOmZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmJyKGEpfSwKVDA6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouclkoYSkuYlMoYSl9LApWdTpmdW5jdGlvbihhKXtyZXR1cm4gSi52ZChhKS56UShhKX0sCmE2OmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuTzIoYSxiKX0sCmJUOmZ1bmN0aW9uKGEpe3JldHVybiBK
-LllFKGEpLkQ0KGEpfSwKYmI6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJlciImJnR5cGVv
-ZiBiPT0ibnVtYmVyIilyZXR1cm4gYStiCnJldHVybiBKLlRKKGEpLmgoYSxiKX0sCmNIOmZ1bmN0aW9u
-KGEpe3JldHVybiBKLnJZKGEpLmhjKGEpfSwKZFI6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ1Ao
-YSl9LApkWjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5ZRShhKS5PbihhLGIsYyxkKX0sCmRnOmZ1
-bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLnJZKGEpLmk3KGEsYixjLGQpfSwKZGg6ZnVuY3Rpb24oYSl7
-cmV0dXJuIEouWUUoYSkuRkYoYSl9LApkcjpmdW5jdGlvbihhLGIpe3JldHVybiBKLllFKGEpLnNhNChh
-LGIpfSwKaGY6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkuZ2lPKGEpfSwKaWc6ZnVuY3Rpb24oYSl7
-cmV0dXJuIEouWUUoYSkuZ1FnKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gSi5pYShhKS53KGEpfSwK
-bDU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zaGYoYSxiKX0sCmxkOmZ1bmN0aW9uKGEsYixj
-KXtyZXR1cm4gSi5yWShhKS5OaihhLGIsYyl9LApwNDpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEp
-LlRjKGEsYil9LApxMDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuUWkoYSxiLGMpfSwKcUY6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ1ZsKGEpfSwKdEg6ZnVuY3Rpb24oYSxiLGMpe3JldHVy
-biBKLllFKGEpLnBrKGEsYixjKX0sCnU5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi53MShhKS5ZNShh
-LGIsYyl9LAp1VTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nbDAoYSl9LAp3ZjpmdW5jdGlvbihh
-LGIpe3JldHVybiBKLllFKGEpLnNSTihhLGIpfSwKeDk6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYj09
-PSJudW1iZXIiKWlmKGEuY29uc3RydWN0b3I9PUFycmF5fHx0eXBlb2YgYT09InN0cmluZyJ8fEgud1Yo
-YSxhW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdKSlpZihiPj4+MD09PWImJmI8YS5sZW5ndGgpcmV0dXJu
-IGFbYl0KcmV0dXJuIEouVTYoYSkucShhLGIpfSwKemw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5VNihh
-KS50ZyhhLGIpfSwKR3Y6ZnVuY3Rpb24gR3YoKXt9LAp5RTpmdW5jdGlvbiB5RSgpe30sCndlOmZ1bmN0
-aW9uIHdlKCl7fSwKTUY6ZnVuY3Rpb24gTUYoKXt9LAppQzpmdW5jdGlvbiBpQygpe30sCmtkOmZ1bmN0
-aW9uIGtkKCl7fSwKYzU6ZnVuY3Rpb24gYzUoKXt9LApqZDpmdW5jdGlvbiBqZChhKXt0aGlzLiR0aT1h
-fSwKUG86ZnVuY3Rpb24gUG8oYSl7dGhpcy4kdGk9YX0sCm0xOmZ1bmN0aW9uIG0xKGEsYixjKXt2YXIg
-Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz0wCl8uZD1udWxsCl8uJHRpPWN9LApxSTpmdW5jdGlvbiBxSSgp
-e30sCmJVOmZ1bmN0aW9uIGJVKCl7fSwKVkE6ZnVuY3Rpb24gVkEoKXt9LApEcjpmdW5jdGlvbiBEcigp
-e319LFA9ewpPajpmdW5jdGlvbigpe3ZhciBzLHIscT17fQppZihzZWxmLnNjaGVkdWxlSW1tZWRpYXRl
-IT1udWxsKXJldHVybiBQLkVYKCkKaWYoc2VsZi5NdXRhdGlvbk9ic2VydmVyIT1udWxsJiZzZWxmLmRv
-Y3VtZW50IT1udWxsKXtzPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKcj1zZWxmLmRv
-Y3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpxLmE9bnVsbApuZXcgc2VsZi5NdXRhdGlvbk9ic2Vy
-dmVyKEgudFIobmV3IFAudGgocSksMSkpLm9ic2VydmUocyx7Y2hpbGRMaXN0OnRydWV9KQpyZXR1cm4g
-bmV3IFAuaGEocSxzLHIpfWVsc2UgaWYoc2VsZi5zZXRJbW1lZGlhdGUhPW51bGwpcmV0dXJuIFAueXQo
-KQpyZXR1cm4gUC5xVygpfSwKWlY6ZnVuY3Rpb24oYSl7c2VsZi5zY2hlZHVsZUltbWVkaWF0ZShILnRS
-KG5ldyBQLlZzKHQuTS5hKGEpKSwwKSl9LApvQTpmdW5jdGlvbihhKXtzZWxmLnNldEltbWVkaWF0ZShI
-LnRSKG5ldyBQLkZ0KHQuTS5hKGEpKSwwKSl9LApCejpmdW5jdGlvbihhKXt0Lk0uYShhKQpQLlFOKDAs
-YSl9LApRTjpmdW5jdGlvbihhLGIpe3ZhciBzPW5ldyBQLlczKCkKcy5DWShhLGIpCnJldHVybiBzfSwK
-Rlg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmloKG5ldyBQLnZzKCQuWDMsYS5DKCJ2czwwPiIpKSxh
-LkMoImloPDA+IikpfSwKREk6ZnVuY3Rpb24oYSxiKXthLiQyKDAsbnVsbCkKYi5iPSEwCnJldHVybiBi
-LmF9LApqUTpmdW5jdGlvbihhLGIpe1AuSmUoYSxiKX0sCnlDOmZ1bmN0aW9uKGEsYil7Yi5hTSgwLGEp
-fSwKZjM6ZnVuY3Rpb24oYSxiKXtiLncwKEguUnUoYSksSC50cyhhKSl9LApKZTpmdW5jdGlvbihhLGIp
-e3ZhciBzLHIscT1uZXcgUC5XTShiKSxwPW5ldyBQLlNYKGIpCmlmKGEgaW5zdGFuY2VvZiBQLnZzKWEu
-UWQocSxwLHQueikKZWxzZXtzPXQuegppZih0LmUuYihhKSlhLlNxKHEscCxzKQplbHNle3I9bmV3IFAu
-dnMoJC5YMyx0LmMpCnIuYT00CnIuYz1hCnIuUWQocSxwLHMpfX19LApsejpmdW5jdGlvbihhKXt2YXIg
-cz1mdW5jdGlvbihiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe3doaWxlKHRydWUpdHJ5e2IoZCxlKQpi
-cmVha31jYXRjaChyKXtlPXIKZD1jfX19KGEsMSkKcmV0dXJuICQuWDMuTGoobmV3IFAuR3MocyksdC5I
-LHQuUyx0LnopfSwKSUc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkZ5KGEsMSl9LApUaDpmdW5jdGlv
-bigpe3JldHVybiBDLndRfSwKWW06ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkZ5KGEsMyl9LApsMDpm
-dW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5xNChhLGIuQygicTQ8MD4iKSl9LApBOTpmdW5jdGlvbihh
-LGIpe3ZhciBzLHIscQpmb3Iocz10LmM7cj1hLmEscj09PTI7KWE9cy5hKGEuYykKaWYocj49NCl7cT1i
-LmFoKCkKYi5hPWEuYQpiLmM9YS5jClAuSFooYixxKX1lbHNle3E9dC5GLmEoYi5jKQpiLmE9MgpiLmM9
-YQphLmpRKHEpfX0sCkhaOmZ1bmN0aW9uKGEwLGExKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgs
-ZyxmLGUsZCxjPW51bGwsYj17fSxhPWIuYT1hMApmb3Iocz10Lm4scj10LkYscT10LmU7ITA7KXtwPXt9
-Cm89YS5hPT09OAppZihhMT09bnVsbCl7aWYobyl7bj1zLmEoYS5jKQpQLkwyKGMsYyxhLmIsbi5hLG4u
-Yil9cmV0dXJufXAuYT1hMQptPWExLmEKZm9yKGE9YTE7bSE9bnVsbDthPW0sbT1sKXthLmE9bnVsbApQ
-LkhaKGIuYSxhKQpwLmE9bQpsPW0uYX1rPWIuYQpqPWsuYwpwLmI9bwpwLmM9agppPSFvCmlmKGkpe2g9
-YS5jCmg9KGgmMSkhPT0wfHwoaCYxNSk9PT04fWVsc2UgaD0hMAppZihoKXtnPWEuYi5iCmlmKG8pe2g9
-ay5iPT09ZwpoPSEoaHx8aCl9ZWxzZSBoPSExCmlmKGgpe3MuYShqKQpQLkwyKGMsYyxrLmIsai5hLGou
-YikKcmV0dXJufWY9JC5YMwppZihmIT09ZykkLlgzPWcKZWxzZSBmPWMKYT1hLmMKaWYoKGEmMTUpPT09
-OCluZXcgUC5SVChwLGIsbykuJDAoKQplbHNlIGlmKGkpe2lmKChhJjEpIT09MCluZXcgUC5ycShwLGop
-LiQwKCl9ZWxzZSBpZigoYSYyKSE9PTApbmV3IFAuUlcoYixwKS4kMCgpCmlmKGYhPW51bGwpJC5YMz1m
-CmE9cC5jCmlmKHEuYihhKSl7az1wLmEuJHRpCms9ay5DKCJiODwyPiIpLmIoYSl8fCFrLlFbMV0uYihh
-KX1lbHNlIGs9ITEKaWYoayl7cS5hKGEpCmU9cC5hLmIKaWYoYSBpbnN0YW5jZW9mIFAudnMpaWYoYS5h
-Pj00KXtkPXIuYShlLmMpCmUuYz1udWxsCmExPWUuTjgoZCkKZS5hPWEuYQplLmM9YS5jCmIuYT1hCmNv
-bnRpbnVlfWVsc2UgUC5BOShhLGUpCmVsc2UgZS5lYyhhKQpyZXR1cm59fWU9cC5hLmIKZD1yLmEoZS5j
-KQplLmM9bnVsbAphMT1lLk44KGQpCmE9cC5iCms9cC5jCmlmKCFhKXtlLiR0aS5jLmEoaykKZS5hPTQK
-ZS5jPWt9ZWxzZXtzLmEoaykKZS5hPTgKZS5jPWt9Yi5hPWUKYT1lfX0sClZIOmZ1bmN0aW9uKGEsYil7
-dmFyIHMKaWYodC5hZy5iKGEpKXJldHVybiBiLkxqKGEsdC56LHQuSyx0LmwpCnM9dC5iSQppZihzLmIo
-YSkpcmV0dXJuIHMuYShhKQp0aHJvdyBILmIoUC5MMyhhLCJvbkVycm9yIiwiRXJyb3IgaGFuZGxlciBt
-dXN0IGFjY2VwdCBvbmUgT2JqZWN0IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1
-bWVudHMsIGFuZCByZXR1cm4gYSB2YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigpe3ZhciBzLHIK
-Zm9yKHM9JC5TNjtzIT1udWxsO3M9JC5TNil7JC5tZz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxs
-KSQuazg9bnVsbApzLmEuJDAoKX19LAplTjpmdW5jdGlvbigpeyQuVUQ9ITAKdHJ5e1AucHUoKX1maW5h
-bGx5eyQubWc9bnVsbAokLlVEPSExCmlmKCQuUzYhPW51bGwpJC51dCgpLiQxKFAuVUkoKSl9fSwKZVc6
-ZnVuY3Rpb24oYSl7dmFyIHM9bmV3IFAuT00oYSkscj0kLms4CmlmKHI9PW51bGwpeyQuUzY9JC5rOD1z
-CmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJSOmZ1bmN0aW9uKGEp
-e3ZhciBzLHIscSxwPSQuUzYKaWYocD09bnVsbCl7UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9bmV3
-IFAuT00oYSkKcj0kLm1nCmlmKHI9PW51bGwpe3MuYj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIKcy5i
-PXEKJC5tZz1yLmI9cwppZihxPT1udWxsKSQuazg9c319LApyYjpmdW5jdGlvbihhKXt2YXIgcz1udWxs
-LHI9JC5YMwppZihDLk5VPT09cil7UC5UayhzLHMsQy5OVSxhKQpyZXR1cm59UC5UayhzLHMscix0Lk0u
-YShyLnQ4KGEpKSl9LApRdzpmdW5jdGlvbihhLGIpe0guY2IoYSwic3RyZWFtIix0LkspCnJldHVybiBu
-ZXcgUC54SShiLkMoInhJPDA+IikpfSwKVGw6ZnVuY3Rpb24oYSxiKXt2YXIgcz1ILmNiKGEsImVycm9y
-Iix0LkspCnJldHVybiBuZXcgUC5DdyhzLGI9PW51bGw/UC52MChhKTpiKX0sCnYwOmZ1bmN0aW9uKGEp
-e3ZhciBzCmlmKHQuci5iKGEpKXtzPWEuZ0lJKCkKaWYocyE9bnVsbClyZXR1cm4gc31yZXR1cm4gQy5w
-ZH0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7UC5yUihuZXcgUC5wSyhkLGUpKX0sClQ4OmZ1bmN0aW9u
-KGEsYixjLGQsZSl7dmFyIHMscj0kLlgzCmlmKHI9PT1jKXJldHVybiBkLiQwKCkKJC5YMz1jCnM9cgp0
-cnl7cj1kLiQwKCkKcmV0dXJuIHJ9ZmluYWxseXskLlgzPXN9fSwKeXY6ZnVuY3Rpb24oYSxiLGMsZCxl
-LGYsZyl7dmFyIHMscj0kLlgzCmlmKHI9PT1jKXJldHVybiBkLiQxKGUpCiQuWDM9YwpzPXIKdHJ5e3I9
-ZC4kMShlKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LApReDpmdW5jdGlvbihhLGIsYyxkLGUsZixn
-LGgsaSl7dmFyIHMscj0kLlgzCmlmKHI9PT1jKXJldHVybiBkLiQyKGUsZikKJC5YMz1jCnM9cgp0cnl7
-cj1kLiQyKGUsZikKcmV0dXJuIHJ9ZmluYWxseXskLlgzPXN9fSwKVGs6ZnVuY3Rpb24oYSxiLGMsZCl7
-dmFyIHMKdC5NLmEoZCkKcz1DLk5VIT09YwppZihzKWQ9ISghc3x8ITEpP2MudDgoZCk6Yy5SVChkLHQu
-SCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxi
-LGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9
-LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rp
-b24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0
-aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApGeTpmdW5jdGlv
-biBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2YXIgXz10aGlz
-Cl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEsYil7dGhpcy5h
-PWEKdGhpcy4kdGk9Yn0sClBmOmZ1bmN0aW9uIFBmKCl7fSwKWmY6ZnVuY3Rpb24gWmYoYSxiKXt0aGlz
-LmE9YQp0aGlzLiR0aT1ifSwKRmU6ZnVuY3Rpb24gRmUoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uYT1u
-dWxsCl8uYj1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2czpmdW5jdGlvbiB2cyhhLGIpe3Zh
-ciBfPXRoaXMKXy5hPTAKXy5iPWEKXy5jPW51bGwKXy4kdGk9Yn0sCmRhOmZ1bmN0aW9uIGRhKGEsYil7
-dGhpcy5hPWEKdGhpcy5iPWJ9LApvUTpmdW5jdGlvbiBvUShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
-cFY6ZnVuY3Rpb24gcFYoYSl7dGhpcy5hPWF9LApVNzpmdW5jdGlvbiBVNyhhKXt0aGlzLmE9YX0sCnZy
-OmZ1bmN0aW9uIHZyKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnJ0OmZ1bmN0aW9u
-IHJ0KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLRjpmdW5jdGlvbiBLRihhLGIpe3RoaXMuYT1hCnRo
-aXMuYj1ifSwKWkw6ZnVuY3Rpb24gWkwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwK
-UlQ6ZnVuY3Rpb24gUlQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKalo6ZnVuY3Rp
-b24galooYSl7dGhpcy5hPWF9LApycTpmdW5jdGlvbiBycShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
-Ulc6ZnVuY3Rpb24gUlcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9NOmZ1bmN0aW9uIE9NKGEpe3Ro
-aXMuYT1hCnRoaXMuYj1udWxsfSwKcWg6ZnVuY3Rpb24gcWgoKXt9LApCNTpmdW5jdGlvbiBCNShhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKdU86ZnVuY3Rpb24gdU8oYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-Ck1POmZ1bmN0aW9uIE1PKCl7fSwKa1Q6ZnVuY3Rpb24ga1QoKXt9LAp4STpmdW5jdGlvbiB4SShhKXt0
-aGlzLiR0aT1hfSwKQ3c6ZnVuY3Rpb24gQ3coYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0
-aW9uIG0wKCl7fSwKcEs6ZnVuY3Rpb24gcEsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0
-aW9uIEppKCl7fSwKaGo6ZnVuY3Rpb24gaGooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1j
-fSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEs
-YixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4g
-Yi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIp
-LktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILk41KGEu
-QygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9LApMczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAu
-YjYoYS5DKCJiNjwwPiIpKX0sClQyOmZ1bmN0aW9uKCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpz
-WyI8bm9uLWlkZW50aWZpZXIta2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0K
-cmV0dXJuIHN9LApyajpmdW5jdGlvbihhLGIsYyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4i
-KSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCmlmKFAuaEIoYSkp
-e2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXM9SC5WTShb
-XSx0LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0
-aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9UC52ZyhiLHQudS5hKHMpLCIsICIpK2MK
-cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9LApXRTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgpp
-ZihQLmhCKGEpKXJldHVybiBiKyIuLi4iK2MKcz1uZXcgUC5SbihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7
-cj1zCnIuYT1QLnZnKHIuYSxhLCIsICIpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEgu
-T0goJC54ZywtMSkKJC54Zy5wb3AoKX1zLmErPWMKcj1zLmEKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09
-MD9yOnJ9LApoQjpmdW5jdGlvbihhKXt2YXIgcyxyCmZvcihzPSQueGcubGVuZ3RoLHI9MDtyPHM7Kyty
-KWlmKGE9PT0kLnhnW3JdKXJldHVybiEwCnJldHVybiExfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
-LHEscCxvLG4sbSxsPWEuZ20oYSksaz0wLGo9MAp3aGlsZSghMCl7aWYoIShrPDgwfHxqPDMpKWJyZWFr
-CmlmKCFsLkYoKSlyZXR1cm4Kcz1ILkVqKGwuZ2woKSkKQy5ObS5pKGIscykKays9cy5sZW5ndGgrMjsr
-K2p9aWYoIWwuRigpKXtpZihqPD01KXJldHVybgppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0x
-KQpyPWIucG9wKCkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcT1iLnBvcCgpfWVsc2V7
-cD1sLmdsKCk7KytqCmlmKCFsLkYoKSl7aWYoajw9NCl7Qy5ObS5pKGIsSC5FaihwKSkKcmV0dXJufXI9
-SC5FaihwKQppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpxPWIucG9wKCkKays9ci5sZW5n
-dGgrMn1lbHNle289bC5nbCgpOysragpmb3IoO2wuRigpO3A9byxvPW4pe249bC5nbCgpOysragppZihq
-PjEwMCl7d2hpbGUoITApe2lmKCEoaz43NSYmaj4zKSlicmVhawppZigwPj1iLmxlbmd0aClyZXR1cm4g
-SC5PSChiLC0xKQprLT1iLnBvcCgpLmxlbmd0aCsyOy0tan1DLk5tLmkoYiwiLi4uIikKcmV0dXJufX1x
-PUguRWoocCkKcj1ILkVqKG8pCmsrPXIubGVuZ3RoK3EubGVuZ3RoKzR9fWlmKGo+Yi5sZW5ndGgrMil7
-ays9NQptPSIuLi4ifWVsc2UgbT1udWxsCndoaWxlKCEwKXtpZighKGs+ODAmJmIubGVuZ3RoPjMpKWJy
-ZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCmstPWIucG9wKCkubGVuZ3RoKzIKaWYo
-bT09bnVsbCl7ays9NQptPSIuLi4ifX1pZihtIT1udWxsKUMuTm0uaShiLG0pCkMuTm0uaShiLHEpCkMu
-Tm0uaShiLHIpfSwKdE06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9UC5McyhiKQpmb3Iocz1hLmxlbmd0
-aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLmkoMCxiLmEoYVty
-XSkpCnJldHVybiBxfSwKbk86ZnVuY3Rpb24oYSl7dmFyIHMscj17fQppZihQLmhCKGEpKXJldHVybiJ7
-Li4ufSIKcz1uZXcgUC5SbigiIikKdHJ5e0MuTm0uaSgkLnhnLGEpCnMuYSs9InsiCnIuYT0hMAphLkso
-MCxuZXcgUC5yYShyLHMpKQpzLmErPSJ9In1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBI
-Lk9IKCQueGcsLTEpCiQueGcucG9wKCl9cj1zLmEKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9
-LApiNjpmdW5jdGlvbiBiNihhKXt2YXIgXz10aGlzCl8uYT0wCl8uZj1fLmU9Xy5kPV8uYz1fLmI9bnVs
-bApfLnI9MApfLiR0aT1hfSwKYm46ZnVuY3Rpb24gYm4oYSl7dGhpcy5hPWEKdGhpcy5jPXRoaXMuYj1u
-dWxsfSwKbG06ZnVuY3Rpb24gbG0oYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1u
-dWxsCl8uJHRpPWN9LAptVzpmdW5jdGlvbiBtVygpe30sCnV5OmZ1bmN0aW9uIHV5KCl7fSwKbEQ6ZnVu
-Y3Rpb24gbEQoKXt9LAppbDpmdW5jdGlvbiBpbCgpe30sCnJhOmZ1bmN0aW9uIHJhKGEsYil7dGhpcy5h
-PWEKdGhpcy5iPWJ9LApZazpmdW5jdGlvbiBZaygpe30sCnlROmZ1bmN0aW9uIHlRKGEpe3RoaXMuYT1h
-fSwKS1A6ZnVuY3Rpb24gS1AoKXt9LApQbjpmdW5jdGlvbiBQbigpe30sCkdqOmZ1bmN0aW9uIEdqKGEs
-Yil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmxmOmZ1bmN0aW9uIGxmKCl7fSwKVmo6ZnVuY3Rpb24gVmoo
-KXt9LApYdjpmdW5jdGlvbiBYdigpe30sCm5ZOmZ1bmN0aW9uIG5ZKCl7fSwKV1k6ZnVuY3Rpb24gV1ko
-KXt9LApSVTpmdW5jdGlvbiBSVSgpe30sCnBSOmZ1bmN0aW9uIHBSKCl7fSwKQlM6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyLHEscAppZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgSC5iKEgudEwoYSkpCnM9bnVs
-bAp0cnl7cz1KU09OLnBhcnNlKGEpfWNhdGNoKHEpe3I9SC5SdShxKQpwPVAucnIoU3RyaW5nKHIpLG51
-bGwsbnVsbCkKdGhyb3cgSC5iKHApfXA9UC5RZShzKQpyZXR1cm4gcH0sClFlOmZ1bmN0aW9uKGEpe3Zh
-ciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlm
-KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSE9PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXco
-YSxPYmplY3QuY3JlYXRlKG51bGwpKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5RZShhW3Nd
-KQpyZXR1cm4gYX0sCmt5OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVp
-bnQ4QXJyYXkpe3M9YgpkPXMubGVuZ3RoCmlmKGQtYzwxNSlyZXR1cm4gbnVsbApyPVAuQ0coYSxzLGMs
-ZCkKaWYociE9bnVsbCYmYSlpZihyLmluZGV4T2YoIlx1ZmZmZCIpPj0wKXJldHVybiBudWxsCnJldHVy
-biByfXJldHVybiBudWxsfSwKQ0c6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHM9YT8kLkhHKCk6JC5yZigp
-CmlmKHM9PW51bGwpcmV0dXJuIG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0aClyZXR1cm4gUC5SYihz
-LGIpCnJldHVybiBQLlJiKHMsYi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVuZ3RoKSkpfSwKUmI6ZnVu
-Y3Rpb24oYSxiKXt2YXIgcyxyCnRyeXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIpe0guUnUo
-cil9cmV0dXJuIG51bGx9LAp4TTpmdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09
-MCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0
-IGJlIG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixhLGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJy
-KCJJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0
-aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hh
-cmFjdGVycyIsYSxiKSl9LApHeTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLlVkKGEsYil9LApO
-QzpmdW5jdGlvbihhKXtyZXR1cm4gYS5MdCgpfSwKVWc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAu
-dHUoYSxbXSxQLkN5KCkpfSwKdVg6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9bmV3IFAuUm4oIiIpLHE9
-UC5VZyhyLGIpCnEuaVUoYSkKcz1yLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApqNDpm
-dW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSA2NTpyZXR1cm4iTWlzc2luZyBleHRlbnNpb24gYnl0ZSIK
-Y2FzZSA2NzpyZXR1cm4iVW5leHBlY3RlZCBleHRlbnNpb24gYnl0ZSIKY2FzZSA2OTpyZXR1cm4iSW52
-YWxpZCBVVEYtOCBieXRlIgpjYXNlIDcxOnJldHVybiJPdmVybG9uZyBlbmNvZGluZyIKY2FzZSA3Mzpy
-ZXR1cm4iT3V0IG9mIHVuaWNvZGUgcmFuZ2UiCmNhc2UgNzU6cmV0dXJuIkVuY29kZWQgc3Vycm9nYXRl
-IgpjYXNlIDc3OnJldHVybiJVbmZpbmlzaGVkIFVURi04IG9jdGV0IHNlcXVlbmNlIgpkZWZhdWx0OnJl
-dHVybiIifX0sCmp5OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD1jLWIsbz1uZXcgVWludDhBcnJh
-eShwKQpmb3Iocz1KLlU2KGEpLHI9MDtyPHA7KytyKXtxPXMucShhLGIrcikKaWYodHlwZW9mIHEhPT0i
-bnVtYmVyIilyZXR1cm4gcS56TSgpCmlmKChxJjQyOTQ5NjcwNDApPj4+MCE9PTApcT0yNTUKaWYocj49
-cClyZXR1cm4gSC5PSChvLHIpCm9bcl09cX1yZXR1cm4gb30sCnV3OmZ1bmN0aW9uIHV3KGEsYil7dGhp
-cy5hPWEKdGhpcy5iPWIKdGhpcy5jPW51bGx9LAppODpmdW5jdGlvbiBpOChhKXt0aGlzLmE9YX0sCnhy
-OmZ1bmN0aW9uIHhyKCl7fSwKTno6ZnVuY3Rpb24gTnooKXt9LApDVjpmdW5jdGlvbiBDVigpe30sClU4
-OmZ1bmN0aW9uIFU4KCl7fSwKVWs6ZnVuY3Rpb24gVWsoKXt9LAp3STpmdW5jdGlvbiB3SSgpe30sClpp
-OmZ1bmN0aW9uIFppKCl7fSwKVWQ6ZnVuY3Rpb24gVWQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCks4
-OmZ1bmN0aW9uIEs4KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApieTpmdW5jdGlvbiBieSgpe30sCm9q
-OmZ1bmN0aW9uIG9qKGEpe3RoaXMuYj1hfSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LApTaDpm
-dW5jdGlvbiBTaCgpe30sCnRpOmZ1bmN0aW9uIHRpKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp0dTpm
-dW5jdGlvbiB0dShhLGIsYyl7dGhpcy5jPWEKdGhpcy5hPWIKdGhpcy5iPWN9LAp1NTpmdW5jdGlvbiB1
-NSgpe30sCkUzOmZ1bmN0aW9uIEUzKCl7fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5j
-PWF9LApHWTpmdW5jdGlvbiBHWShhKXt0aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEpe3RoaXMuYT1h
-CnRoaXMuYj0xNgp0aGlzLmM9MH0sClFBOmZ1bmN0aW9uKGEsYil7dmFyIHM9SC5IcChhLGIpCmlmKHMh
-PW51bGwpcmV0dXJuIHMKdGhyb3cgSC5iKFAucnIoYSxudWxsLG51bGwpKX0sCm9zOmZ1bmN0aW9uKGEp
-e2lmKGEgaW5zdGFuY2VvZiBILlRwKXJldHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0gu
-RWooSC5NKGEpKSsiJyJ9LApPODpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyPWM/Si5LaChhLGQpOkou
-UWkoYSxkKQppZihhIT09MCYmYiE9bnVsbClmb3Iocz0wO3M8ci5sZW5ndGg7KytzKXJbc109YgpyZXR1
-cm4gcn0sCkNIOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPUguVk0oW10sYy5DKCJqZDwwPiIpKQpmb3Io
-cz1KLklUKGEpO3MuRigpOylDLk5tLmkocixjLmEocy5nbCgpKSkKaWYoYilyZXR1cm4gcgpyZXR1cm4g
-Si5FcChyLGMpfSwKWTE6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKGIpcmV0dXJuIFAuZXYoYSxjKQpz
-PUouRXAoUC5ldihhLGMpLGMpCnJldHVybiBzfSwKZXY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKEFy
-cmF5LmlzQXJyYXkoYSkpcmV0dXJuIEguVk0oYS5zbGljZSgwKSxiLkMoImpkPDA+IikpCnM9SC5WTShb
-XSxiLkMoImpkPDA+IikpCmZvcihyPUouSVQoYSk7ci5GKCk7KUMuTm0uaShzLHIuZ2woKSkKcmV0dXJu
-IHN9LApBRjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnpDKFAuQ0goYSwhMSxiKSl9LApITTpmdW5jdGlv
-bihhLGIsYyl7aWYodC5ibS5iKGEpKXJldHVybiBILmZ3KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJl
-dHVybiBQLmJ3KGEsYixjKX0sCk9vOmZ1bmN0aW9uKGEpe3JldHVybiBILkx3KGEpfSwKYnc6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciBzLHIscSxwLG89bnVsbAppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLGEubGVu
-Z3RoLG8sbykpCnM9Yz09bnVsbAppZighcyYmYzxiKXRocm93IEguYihQLlRFKGMsYixhLmxlbmd0aCxv
-LG8pKQpyPW5ldyBILmE3KGEsYS5sZW5ndGgsSC56KGEpLkMoImE3PGxELkU+IikpCmZvcihxPTA7cTxi
-OysrcSlpZighci5GKCkpdGhyb3cgSC5iKFAuVEUoYiwwLHEsbyxvKSkKcD1bXQppZihzKWZvcig7ci5G
-KCk7KXAucHVzaChyLmQpCmVsc2UgZm9yKHE9YjtxPGM7KytxKXtpZighci5GKCkpdGhyb3cgSC5iKFAu
-VEUoYyxiLHEsbyxvKSkKcC5wdXNoKHIuZCl9cmV0dXJuIEguZVQocCl9LApudTpmdW5jdGlvbihhKXty
-ZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEsITEsITEpKX0sCnZnOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgcz1KLklUKGIpCmlmKCFzLkYoKSlyZXR1cm4gYQppZihjLmxlbmd0aD09PTApe2RvIGErPUgu
-RWoocy5nbCgpKQp3aGlsZShzLkYoKSl9ZWxzZXthKz1ILkVqKHMuZ2woKSkKZm9yKDtzLkYoKTspYT1h
-K2MrSC5FaihzLmdsKCkpfXJldHVybiBhfSwKbHI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIG5ldyBQ
-Lm1wKGEsYixjLGQpfSwKdW86ZnVuY3Rpb24oKXt2YXIgcz1ILk0wKCkKaWYocyE9bnVsbClyZXR1cm4g
-UC5oSyhzKQp0aHJvdyBILmIoUC5MNCgiJ1VyaS5iYXNlJyBpcyBub3Qgc3VwcG9ydGVkIikpfSwKZVA6
-ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG09IjAxMjM0NTY3ODlBQkNERUYiCmlmKGM9
-PT1DLnhNKXtzPSQuejQoKS5iCmlmKHR5cGVvZiBiIT0ic3RyaW5nIilILnYoSC50TChiKSkKcz1zLnRl
-c3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5DKCJVay5TIikuYShiKQpyPWMuZ1pF
-KCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysrcSl7bz1yW3FdCmlmKG88MTI4KXtu
-PW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ug
-bj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9wKyIrIjpwKyIlIittW28+Pj40JjE1
-XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwKR3E6ZnVuY3Rpb24oYSl7dmFy
-IHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIrYQppZihzPj0xMDAp
-cmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiByKyIwMDAiK3N9LApW
-eDpmdW5jdGlvbihhKXtpZihhPj0xMDApcmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIrYQpyZXR1
-cm4iMDAiK2F9LApoMDpmdW5jdGlvbihhKXtpZihhPj0xMClyZXR1cm4iIithCnJldHVybiIwIithfSwK
-cDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciJ8fEgubChhKXx8bnVsbD09YSlyZXR1cm4g
-Si5qKGEpCmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYSkKcmV0dXJu
-IFAub3MoYSl9LApoVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuQzYoYSl9LAp4WTpmdW5jdGlvbihh
-KXtyZXR1cm4gbmV3IFAudSghMSxudWxsLG51bGwsYSl9LApMMzpmdW5jdGlvbihhLGIsYyl7cmV0dXJu
-IG5ldyBQLnUoITAsYSxiLGMpfSwKTVI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhfSwKTzc6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gbmV3IFAuYkoobnVsbCxudWxsLCEwLGEsYiwiVmFsdWUgbm90IGluIHJhbmdl
-Iil9LApURTpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgUC5iSihiLGMsITAsYSxkLCJJbnZh
-bGlkIHZhbHVlIil9LAp3QTpmdW5jdGlvbihhLGIsYyxkKXtpZihhPGJ8fGE+Yyl0aHJvdyBILmIoUC5U
-RShhLGIsYyxkLG51bGwpKQpyZXR1cm4gYX0sCmpCOmZ1bmN0aW9uKGEsYixjKXtpZigwPmF8fGE+Yyl0
-aHJvdyBILmIoUC5URShhLDAsYywic3RhcnQiLG51bGwpKQppZihiIT1udWxsKXtpZihhPmJ8fGI+Yyl0
-aHJvdyBILmIoUC5URShiLGEsYywiZW5kIixudWxsKSkKcmV0dXJuIGJ9cmV0dXJuIGN9LAprMTpmdW5j
-dGlvbihhLGIpe2lmKGE8MCl0aHJvdyBILmIoUC5URShhLDAsbnVsbCxiLG51bGwpKQpyZXR1cm4gYX0s
-CkNmOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9SC51UChlPT1udWxsP0ouSG0oYik6ZSkKcmV0dXJu
-IG5ldyBQLmVZKHMsITAsYSxjLCJJbmRleCBvdXQgb2YgcmFuZ2UiKX0sCkw0OmZ1bmN0aW9uKGEpe3Jl
-dHVybiBuZXcgUC51YihhKX0sClNZOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5kcyhhKX0sClBWOmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgUC5saihhKX0sCmE0OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5V
-VihhKX0sCnJyOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAuYUUoYSxiLGMpfSwKaEs6ZnVuY3Rp
-b24oYTUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEz
-PW51bGwsYTQ9YTUubGVuZ3RoCmlmKGE0Pj01KXtzPSgoSi5ReihhNSw0KV41OCkqM3xDLnhCLlcoYTUs
-MCleMTAwfEMueEIuVyhhNSwxKV45N3xDLnhCLlcoYTUsMileMTE2fEMueEIuVyhhNSwzKV45Nyk+Pj4w
-CmlmKHM9PT0wKXJldHVybiBQLktEKGE0PGE0P0MueEIuTmooYTUsMCxhNCk6YTUsNSxhMykuZ2xSKCkK
-ZWxzZSBpZihzPT09MzIpcmV0dXJuIFAuS0QoQy54Qi5OaihhNSw1LGE0KSwwLGEzKS5nbFIoKX1yPVAu
-TzgoOCwwLCExLHQuUykKQy5ObS5ZNShyLDAsMCkKQy5ObS5ZNShyLDEsLTEpCkMuTm0uWTUociwyLC0x
-KQpDLk5tLlk1KHIsNywtMSkKQy5ObS5ZNShyLDMsMCkKQy5ObS5ZNShyLDQsMCkKQy5ObS5ZNShyLDUs
-YTQpCkMuTm0uWTUociw2LGE0KQppZihQLlVCKGE1LDAsYTQsMCxyKT49MTQpQy5ObS5ZNShyLDcsYTQp
-CnE9clsxXQppZihxPj0wKWlmKFAuVUIoYTUsMCxxLDIwLHIpPT09MjApcls3XT1xCnA9clsyXSsxCm89
-clszXQpuPXJbNF0KbT1yWzVdCmw9cls2XQppZihsPG0pbT1sCmlmKG48cCluPW0KZWxzZSBpZihuPD1x
-KW49cSsxCmlmKG88cClvPW4Kaz1yWzddPDAKaWYoaylpZihwPnErMyl7aj1hMwprPSExfWVsc2V7aT1v
-PjAKaWYoaSYmbysxPT09bil7aj1hMwprPSExfWVsc2V7aWYoIShtPGE0JiZtPT09bisyJiZKLnEwKGE1
-LCIuLiIsbikpKWg9bT5uKzImJkoucTAoYTUsIi8uLiIsbS0zKQplbHNlIGg9ITAKaWYoaCl7aj1hMwpr
-PSExfWVsc2V7aWYocT09PTQpaWYoSi5xMChhNSwiZmlsZSIsMCkpe2lmKHA8PTApe2lmKCFDLnhCLlFp
-KGE1LCIvIixuKSl7Zz0iZmlsZTovLy8iCnM9M31lbHNle2c9ImZpbGU6Ly8iCnM9Mn1hNT1nK0MueEIu
-TmooYTUsbixhNCkKcS09MAppPXMtMAptKz1pCmwrPWkKYTQ9YTUubGVuZ3RoCnA9NwpvPTcKbj03fWVs
-c2UgaWYobj09PW0peysrbApmPW0rMQphNT1DLnhCLmk3KGE1LG4sbSwiLyIpOysrYTQKbT1mfWo9ImZp
-bGUifWVsc2UgaWYoQy54Qi5RaShhNSwiaHR0cCIsMCkpe2lmKGkmJm8rMz09PW4mJkMueEIuUWkoYTUs
-IjgwIixvKzEpKXtsLT0zCmU9bi0zCm0tPTMKYTU9Qy54Qi5pNyhhNSxvLG4sIiIpCmE0LT0zCm49ZX1q
-PSJodHRwIn1lbHNlIGo9YTMKZWxzZSBpZihxPT09NSYmSi5xMChhNSwiaHR0cHMiLDApKXtpZihpJiZv
-KzQ9PT1uJiZKLnEwKGE1LCI0NDMiLG8rMSkpe2wtPTQKZT1uLTQKbS09NAphNT1KLmRnKGE1LG8sbiwi
-IikKYTQtPTMKbj1lfWo9Imh0dHBzIn1lbHNlIGo9YTMKaz0hMH19fWVsc2Ugaj1hMwppZihrKXtpPWE1
-Lmxlbmd0aAppZihhNDxpKXthNT1KLmxkKGE1LDAsYTQpCnEtPTAKcC09MApvLT0wCm4tPTAKbS09MAps
-LT0wfXJldHVybiBuZXcgUC5VZihhNSxxLHAsbyxuLG0sbCxqKX1pZihqPT1udWxsKWlmKHE+MClqPVAu
-UGkoYTUsMCxxKQplbHNle2lmKHE9PT0wKXtQLlIzKGE1LDAsIkludmFsaWQgZW1wdHkgc2NoZW1lIikK
-SC5CaSh1LmcpfWo9IiJ9aWYocD4wKXtkPXErMwpjPWQ8cD9QLnpSKGE1LGQscC0xKToiIgpiPVAuT2Uo
-YTUscCxvLCExKQppPW8rMQppZihpPG4pe2E9SC5IcChKLmxkKGE1LGksbiksYTMpCmEwPVAud0IoYT09
-bnVsbD9ILnYoUC5ycigiSW52YWxpZCBwb3J0IixhNSxpKSk6YSxqKX1lbHNlIGEwPWEzfWVsc2V7YTA9
-YTMKYj1hMApjPSIifWExPVAua2EoYTUsbixtLGEzLGosYiE9bnVsbCkKYTI9bTxsP1AubGUoYTUsbSsx
-LGwsYTMpOmEzCnJldHVybiBuZXcgUC5EbihqLGMsYixhMCxhMSxhMixsPGE0P1AudEcoYTUsbCsxLGE0
-KTphMyl9LApNdDpmdW5jdGlvbihhKXtILmgoYSkKcmV0dXJuIFAua3UoYSwwLGEubGVuZ3RoLEMueE0s
-ITEpfSwKV1g6ZnVuY3Rpb24oYSl7dmFyIHM9dC5OCnJldHVybiBDLk5tLk4wKEguVk0oYS5zcGxpdCgi
-JiIpLHQucyksUC5GbChzLHMpLG5ldyBQLm4xKEMueE0pLHQuSil9LApIaDpmdW5jdGlvbihhLGIsYyl7
-dmFyIHMscixxLHAsbyxuLG09IklQdjQgYWRkcmVzcyBzaG91bGQgY29udGFpbiBleGFjdGx5IDQgcGFy
-dHMiLGw9ImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTUiLGs9bmV3IFAuY1MoYSks
-aj1uZXcgVWludDhBcnJheSg0KQpmb3Iocz1iLHI9cyxxPTA7czxjOysrcyl7cD1DLnhCLk8yKGEscykK
-aWYocCE9PTQ2KXtpZigocF40OCk+OSlrLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscyl9ZWxzZXtpZihx
-PT09MylrLiQyKG0scykKbz1QLlFBKEMueEIuTmooYSxyLHMpLG51bGwpCmlmKG8+MjU1KWsuJDIobCxy
-KQpuPXErMQppZihxPj00KXJldHVybiBILk9IKGoscSkKaltxXT1vCnI9cysxCnE9bn19aWYocSE9PTMp
-ay4kMihtLGMpCm89UC5RQShDLnhCLk5qKGEscixjKSxudWxsKQppZihvPjI1NSlrLiQyKGwscikKaWYo
-cT49NClyZXR1cm4gSC5PSChqLHEpCmpbcV09bwpyZXR1cm4gan0sCmVnOmZ1bmN0aW9uKGEsYixhMCl7
-dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQ9bmV3IFAuVkMoYSksYz1uZXcgUC5KVChk
-LGEpCmlmKGEubGVuZ3RoPDIpZC4kMSgiYWRkcmVzcyBpcyB0b28gc2hvcnQiKQpzPUguVk0oW10sdC5h
-KQpmb3Iocj1iLHE9cixwPSExLG89ITE7cjxhMDsrK3Ipe249Qy54Qi5PMihhLHIpCmlmKG49PT01OCl7
-aWYocj09PWIpeysrcgppZihDLnhCLk8yKGEscikhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNvbG9u
-LiIscikKcT1yfWlmKHI9PT1xKXtpZihwKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxs
-b3dlZCIscikKQy5ObS5pKHMsLTEpCnA9ITB9ZWxzZSBDLk5tLmkocyxjLiQyKHEscikpCnE9cisxfWVs
-c2UgaWYobj09PTQ2KW89ITB9aWYocy5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQptPXE9
-PT1hMApsPUMuTm0uZ3JaKHMpCmlmKG0mJmwhPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIg
-bGFzdCBgOmAiLGEwKQppZighbSlpZighbylDLk5tLmkocyxjLiQyKHEsYTApKQplbHNle2s9UC5IaChh
-LHEsYTApCkMuTm0uaShzLChrWzBdPDw4fGtbMV0pPj4+MCkKQy5ObS5pKHMsKGtbMl08PDh8a1szXSk+
-Pj4wKX1pZihwKXtpZihzLmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11
-c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYocy5sZW5ndGghPT04KWQuJDEoImFuIGFk
-ZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQpqPW5l
-dyBVaW50OEFycmF5KDE2KQpmb3IobD1zLmxlbmd0aCxpPTktbCxyPTAsaD0wO3I8bDsrK3Ipe2c9c1ty
-XQppZihnPT09LTEpZm9yKGY9MDtmPGk7KytmKXtpZihoPDB8fGg+PTE2KXJldHVybiBILk9IKGosaCkK
-altoXT0wCmU9aCsxCmlmKGU+PTE2KXJldHVybiBILk9IKGosZSkKaltlXT0wCmgrPTJ9ZWxzZXtlPUMu
-am4ud0coZyw4KQppZihoPDB8fGg+PTE2KXJldHVybiBILk9IKGosaCkKaltoXT1lCmU9aCsxCmlmKGU+
-PTE2KXJldHVybiBILk9IKGosZSkKaltlXT1nJjI1NQpoKz0yfX1yZXR1cm4gan0sCktMOmZ1bmN0aW9u
-KGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxwLG8sbgpmPWY9PW51bGw/IiI6UC5QaShmLDAsZi5sZW5n
-dGgpCmc9UC56UihnLDAsZz09bnVsbD8wOmcubGVuZ3RoKQphPVAuT2UoYSwwLGE9PW51bGw/MDphLmxl
-bmd0aCwhMSkKcz1QLmxlKG51bGwsMCwwLGUpCnI9UC50RyhudWxsLDAsMCkKZD1QLndCKGQsZikKcT1m
-PT09ImZpbGUiCmlmKGE9PW51bGwpcD1nLmxlbmd0aCE9PTB8fGQhPW51bGx8fHEKZWxzZSBwPSExCmlm
-KHApYT0iIgpwPWE9PW51bGwKbz0hcApiPVAua2EoYiwwLGI9PW51bGw/MDpiLmxlbmd0aCxjLGYsbykK
-bj1mLmxlbmd0aD09PTAKaWYobiYmcCYmIUMueEIubkMoYiwiLyIpKWI9UC53RihiLCFufHxvKQplbHNl
-IGI9UC54ZShiKQpyZXR1cm4gbmV3IFAuRG4oZixnLHAmJkMueEIubkMoYiwiLy8iKT8iIjphLGQsYixz
-LHIpfSwKd0s6ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRwcyIp
-cmV0dXJuIDQ0MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihjLGEs
-YikpfSwKWGQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoPW51bGws
-Zz1iLmxlbmd0aAppZihnIT09MCl7cT0wCndoaWxlKCEwKXtpZighKHE8Zykpe3M9IiIKcj0wCmJyZWFr
-fWlmKEMueEIuVyhiLHEpPT09NjQpe3M9Qy54Qi5OaihiLDAscSkKcj1xKzEKYnJlYWt9KytxfWlmKHI8
-ZyYmQy54Qi5XKGIscik9PT05MSl7Zm9yKHA9cixvPS0xO3A8ZzsrK3Ape249Qy54Qi5XKGIscCkKaWYo
-bj09PTM3JiZvPDApe209Qy54Qi5RaShiLCIyNSIscCsxKT9wKzI6cApvPXAKcD1tfWVsc2UgaWYobj09
-PTkzKWJyZWFrfWlmKHA9PT1nKXRocm93IEguYihQLnJyKCJJbnZhbGlkIElQdjYgaG9zdCBlbnRyeS4i
-LGIscikpCmw9bzwwP3A6bwpQLmVnKGIscisxLGwpOysrcAppZihwIT09ZyYmQy54Qi5XKGIscCkhPT01
-OCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBlbmQgb2YgYXV0aG9yaXR5IixiLHApKX1lbHNlIHA9cgp3
-aGlsZSghMCl7aWYoIShwPGcpKXtrPWgKYnJlYWt9aWYoQy54Qi5XKGIscCk9PT01OCl7aj1DLnhCLnlu
-KGIscCsxKQprPWoubGVuZ3RoIT09MD9QLlFBKGosaCk6aApicmVha30rK3B9aT1DLnhCLk5qKGIscixw
-KX1lbHNle2s9aAppPWsKcz0iIn1yZXR1cm4gUC5LTChpLGgsSC5WTShjLnNwbGl0KCIvIiksdC5zKSxr
-LGQsYSxzKX0sCmtFOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbwpmb3Iocz1hLmxlbmd0aCxyPTA7
-cjxzOysrcil7cT1hW3JdCnEudG9TdHJpbmcKcD1KLlU2KHEpCm89cC5nQShxKQppZigwPm8pSC52KFAu
-VEUoMCwwLHAuZ0EocSksbnVsbCxudWxsKSkKaWYoSC5TUShxLCIvIiwwKSl7cz1QLkw0KCJJbGxlZ2Fs
-IHBhdGggY2hhcmFjdGVyICIrSC5FaihxKSkKdGhyb3cgSC5iKHMpfX19LApITjpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHMscixxCmZvcihzPUgucUMoYSxjLG51bGwsSC50NihhKS5jKSxzPW5ldyBILmE3KHMscy5n
-QShzKSxzLiR0aS5DKCJhNzxhTC5FPiIpKTtzLkYoKTspe3I9cy5kCnE9UC5udSgnWyIqLzo8Pj9cXFxc
-fF0nKQpyLnRvU3RyaW5nCmlmKEguU1EocixxLDApKXtzPVAuTDQoIklsbGVnYWwgY2hhcmFjdGVyIGlu
-IHBhdGg6ICIrcikKdGhyb3cgSC5iKHMpfX19LApyZzpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKCEoNjU8
-PWEmJmE8PTkwKSlzPTk3PD1hJiZhPD0xMjIKZWxzZSBzPSEwCmlmKHMpcmV0dXJuCnM9UC5MNCgiSWxs
-ZWdhbCBkcml2ZSBsZXR0ZXIgIitQLk9vKGEpKQp0aHJvdyBILmIocyl9LAp3QjpmdW5jdGlvbihhLGIp
-e2lmKGEhPW51bGwmJmE9PT1QLndLKGIpKXJldHVybiBudWxsCnJldHVybiBhfSwKT2U6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHMscixxLHAsbyxuCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYj09PWMpcmV0
-dXJuIiIKaWYoQy54Qi5PMihhLGIpPT09OTEpe3M9Yy0xCmlmKEMueEIuTzIoYSxzKSE9PTkzKXtQLlIz
-KGEsYiwiTWlzc2luZyBlbmQgYF1gIHRvIG1hdGNoIGBbYCBpbiBob3N0IikKSC5CaSh1LmcpfXI9Yisx
-CnE9UC50byhhLHIscykKaWYocTxzKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6
-cCxzLCIlMjUiKX1lbHNlIG89IiIKUC5lZyhhLHIscSkKcmV0dXJuIEMueEIuTmooYSxiLHEpLnRvTG93
-ZXJDYXNlKCkrbysiXSJ9Zm9yKG49YjtuPGM7KytuKWlmKEMueEIuTzIoYSxuKT09PTU4KXtxPUMueEIu
-WFUoYSwiJSIsYikKcT1xPj1iJiZxPGM/cTpjCmlmKHE8Yyl7cD1xKzEKbz1QLk9BKGEsQy54Qi5RaShh
-LCIyNSIscCk/cSszOnAsYywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxiLHEpCnJldHVybiJbIitDLnhC
-Lk5qKGEsYixxKStvKyJdIn1yZXR1cm4gUC5PTChhLGIsYyl9LAp0bzpmdW5jdGlvbihhLGIsYyl7dmFy
-IHM9Qy54Qi5YVShhLCIlIixiKQpyZXR1cm4gcz49YiYmczxjP3M6Y30sCk9BOmZ1bmN0aW9uKGEsYixj
-LGQpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGk9ZCE9PSIiP25ldyBQLlJuKGQpOm51bGwKZm9yKHM9
-YixyPXMscT0hMDtzPGM7KXtwPUMueEIuTzIoYSxzKQppZihwPT09Mzcpe289UC5ydihhLHMsITApCm49
-bz09bnVsbAppZihuJiZxKXtzKz0zCmNvbnRpbnVlfWlmKGk9PW51bGwpaT1uZXcgUC5SbigiIikKbT1p
-LmErPUMueEIuTmooYSxyLHMpCmlmKG4pbz1DLnhCLk5qKGEscyxzKzMpCmVsc2UgaWYobz09PSIlIil7
-UC5SMyhhLHMsIlpvbmVJRCBzaG91bGQgbm90IGNvbnRhaW4gJSBhbnltb3JlIikKSC5CaSh1LmcpfWku
-YT1tK28Kcys9MwpyPXMKcT0hMH1lbHNle2lmKHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEgu
-T0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXtpZihxJiY2
-NTw9cCYmOTA+PXApe2lmKGk9PW51bGwpaT1uZXcgUC5SbigiIikKaWYocjxzKXtpLmErPUMueEIuTmoo
-YSxyLHMpCnI9c31xPSExfSsrc31lbHNle2lmKChwJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7bD1DLnhC
-Lk8yKGEscysxKQppZigobCY2NDUxMik9PT01NjMyMCl7cD0ocCYxMDIzKTw8MTB8bCYxMDIzfDY1NTM2
-Cms9Mn1lbHNlIGs9MX1lbHNlIGs9MQpqPUMueEIuTmooYSxyLHMpCmlmKGk9PW51bGwpe2k9bmV3IFAu
-Um4oIiIpCm49aX1lbHNlIG49aQpuLmErPWoKbi5hKz1QLnpYKHApCnMrPWsKcj1zfX19aWYoaT09bnVs
-bClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYocjxjKWkuYSs9Qy54Qi5OaihhLHIsYykKbj1pLmEKcmV0
-dXJuIG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApPTDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAs
-byxuLG0sbCxrLGosaQpmb3Iocz1iLHI9cyxxPW51bGwscD0hMDtzPGM7KXtvPUMueEIuTzIoYSxzKQpp
-ZihvPT09Mzcpe249UC5ydihhLHMsITApCm09bj09bnVsbAppZihtJiZwKXtzKz0zCmNvbnRpbnVlfWlm
-KHE9PW51bGwpcT1uZXcgUC5SbigiIikKbD1DLnhCLk5qKGEscixzKQprPXEuYSs9IXA/bC50b0xvd2Vy
-Q2FzZSgpOmwKaWYobSl7bj1DLnhCLk5qKGEscyxzKzMpCmo9M31lbHNlIGlmKG49PT0iJSIpe249IiUy
-NSIKaj0xfWVsc2Ugaj0zCnEuYT1rK24Kcys9agpyPXMKcD0hMH1lbHNle2lmKG88MTI3KXttPW8+Pj40
-CmlmKG0+PTgpcmV0dXJuIEguT0goQy5lYSxtKQptPShDLmVhW21dJjE8PChvJjE1KSkhPT0wfWVsc2Ug
-bT0hMQppZihtKXtpZihwJiY2NTw9byYmOTA+PW8pe2lmKHE9PW51bGwpcT1uZXcgUC5SbigiIikKaWYo
-cjxzKXtxLmErPUMueEIuTmooYSxyLHMpCnI9c31wPSExfSsrc31lbHNle2lmKG88PTkzKXttPW8+Pj40
-CmlmKG0+PTgpcmV0dXJuIEguT0goQy5hayxtKQptPShDLmFrW21dJjE8PChvJjE1KSkhPT0wfWVsc2Ug
-bT0hMQppZihtKXtQLlIzKGEscywiSW52YWxpZCBjaGFyYWN0ZXIiKQpILkJpKHUuZyl9ZWxzZXtpZigo
-byY2NDUxMik9PT01NTI5NiYmcysxPGMpe2k9Qy54Qi5PMihhLHMrMSkKaWYoKGkmNjQ1MTIpPT09NTYz
-MjApe289KG8mMTAyMyk8PDEwfGkmMTAyM3w2NTUzNgpqPTJ9ZWxzZSBqPTF9ZWxzZSBqPTEKbD1DLnhC
-Lk5qKGEscixzKQppZighcClsPWwudG9Mb3dlckNhc2UoKQppZihxPT1udWxsKXtxPW5ldyBQLlJuKCIi
-KQptPXF9ZWxzZSBtPXEKbS5hKz1sCm0uYSs9UC56WChvKQpzKz1qCnI9c319fX1pZihxPT1udWxsKXJl
-dHVybiBDLnhCLk5qKGEsYixjKQppZihyPGMpe2w9Qy54Qi5OaihhLHIsYykKcS5hKz0hcD9sLnRvTG93
-ZXJDYXNlKCk6bH1tPXEuYQpyZXR1cm4gbS5jaGFyQ29kZUF0KDApPT0wP206bX0sClBpOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcyxyLHEscCxvPXUuZwppZihiPT09YylyZXR1cm4iIgppZighUC5FdChKLnJZKGEp
-LlcoYSxiKSkpe1AuUjMoYSxiLCJTY2hlbWUgbm90IHN0YXJ0aW5nIHdpdGggYWxwaGFiZXRpYyBjaGFy
-YWN0ZXIiKQpILkJpKG8pfWZvcihzPWIscj0hMTtzPGM7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE8MTI4
-KXtwPXE+Pj40CmlmKHA+PTgpcmV0dXJuIEguT0goQy5tSyxwKQpwPShDLm1LW3BdJjE8PChxJjE1KSkh
-PT0wfWVsc2UgcD0hMQppZighcCl7UC5SMyhhLHMsIklsbGVnYWwgc2NoZW1lIGNoYXJhY3RlciIpCkgu
-Qmkobyl9aWYoNjU8PXEmJnE8PTkwKXI9ITB9YT1DLnhCLk5qKGEsYixjKQpyZXR1cm4gUC5ZYShyP2Eu
-dG9Mb3dlckNhc2UoKTphKX0sCllhOmZ1bmN0aW9uKGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuImh0dHAi
-CmlmKGE9PT0iZmlsZSIpcmV0dXJuImZpbGUiCmlmKGE9PT0iaHR0cHMiKXJldHVybiJodHRwcyIKaWYo
-YT09PSJwYWNrYWdlIilyZXR1cm4icGFja2FnZSIKcmV0dXJuIGF9LAp6UjpmdW5jdGlvbihhLGIsYyl7
-aWYoYT09bnVsbClyZXR1cm4iIgpyZXR1cm4gUC5QSShhLGIsYyxDLnRvLCExKX0sCmthOmZ1bmN0aW9u
-KGEsYixjLGQsZSxmKXt2YXIgcyxyLHE9ZT09PSJmaWxlIixwPXF8fGYKaWYoYT09bnVsbCl7aWYoZD09
-bnVsbClyZXR1cm4gcT8iLyI6IiIKcz1ILnQ2KGQpCnI9bmV3IEgubEooZCxzLkMoInFVKDEpIikuYShu
-ZXcgUC5SWigpKSxzLkMoImxKPDEscVU+IikpLmsoMCwiLyIpfWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBI
-LmIoUC54WSgiQm90aCBwYXRoIGFuZCBwYXRoU2VnbWVudHMgc3BlY2lmaWVkIikpCmVsc2Ugcj1QLlBJ
-KGEsYixjLEMuV2QsITApCmlmKHIubGVuZ3RoPT09MCl7aWYocSlyZXR1cm4iLyJ9ZWxzZSBpZihwJiYh
-Qy54Qi5uQyhyLCIvIikpcj0iLyIrcgpyZXR1cm4gUC5KcihyLGUsZil9LApKcjpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHM9Yi5sZW5ndGg9PT0wCmlmKHMmJiFjJiYhQy54Qi5uQyhhLCIvIikpcmV0dXJuIFAud0Yo
-YSwhc3x8YykKcmV0dXJuIFAueGUoYSl9LApsZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyPXt9Cmlm
-KGEhPW51bGwpe2lmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoIkJvdGggcXVlcnkgYW5kIHF1ZXJ5UGFy
-YW1ldGVycyBzcGVjaWZpZWQiKSkKcmV0dXJuIFAuUEkoYSxiLGMsQy5WQywhMCl9aWYoZD09bnVsbCly
-ZXR1cm4gbnVsbApzPW5ldyBQLlJuKCIiKQpyLmE9IiIKZC5LKDAsbmV3IFAueTUobmV3IFAuTUUocixz
-KSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKdEc6ZnVuY3Rpb24oYSxiLGMp
-e2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxiLGMsQy5WQywhMCl9LApydjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1hLmxlbmd0aClyZXR1cm4iJSIKcz1D
-LnhCLk8yKGEsYisxKQpyPUMueEIuTzIoYSxuKQpxPUgub28ocykKcD1ILm9vKHIpCmlmKHE8MHx8cDww
-KXJldHVybiIlIgpvPXEqMTYrcAppZihvPDEyNyl7bj1DLmpuLndHKG8sNCkKaWYobj49OClyZXR1cm4g
-SC5PSChDLkYzLG4pCm49KEMuRjNbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBuPSExCmlmKG4pcmV0dXJu
-IEguTHcoYyYmNjU8PW8mJjkwPj1vPyhvfDMyKT4+PjA6bykKaWYocz49OTd8fHI+PTk3KXJldHVybiBD
-LnhCLk5qKGEsYixiKzMpLnRvVXBwZXJDYXNlKCkKcmV0dXJuIG51bGx9LAp6WDpmdW5jdGlvbihhKXt2
-YXIgcyxyLHEscCxvLG4sbSxsLGs9IjAxMjM0NTY3ODlBQkNERUYiCmlmKGE8MTI4KXtzPW5ldyBVaW50
-OEFycmF5KDMpCnNbMF09MzcKc1sxXT1DLnhCLlcoayxhPj4+NCkKc1syXT1DLnhCLlcoayxhJjE1KX1l
-bHNle2lmKGE+MjA0NylpZihhPjY1NTM1KXtyPTI0MApxPTR9ZWxzZXtyPTIyNApxPTN9ZWxzZXtyPTE5
-MgpxPTJ9cD0zKnEKcz1uZXcgVWludDhBcnJheShwKQpmb3Iobz0wOy0tcSxxPj0wO3I9MTI4KXtuPUMu
-am4uYmYoYSw2KnEpJjYzfHIKaWYobz49cClyZXR1cm4gSC5PSChzLG8pCnNbb109MzcKbT1vKzEKbD1D
-LnhCLlcoayxuPj4+NCkKaWYobT49cClyZXR1cm4gSC5PSChzLG0pCnNbbV09bApsPW8rMgptPUMueEIu
-VyhrLG4mMTUpCmlmKGw+PXApcmV0dXJuIEguT0gocyxsKQpzW2xdPW0Kbys9M319cmV0dXJuIFAuSE0o
-cywwLG51bGwpfSwKUEk6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1QLlVsKGEsYixjLGQsZSkKcmV0
-dXJuIHM9PW51bGw/Qy54Qi5OaihhLGIsYyk6c30sClVsOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMs
-cixxLHAsbyxuLG0sbCxrLGo9bnVsbApmb3Iocz0hZSxyPWIscT1yLHA9ajtyPGM7KXtvPUMueEIuTzIo
-YSxyKQppZihvPDEyNyl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9IKGQsbikKbj0oZFtuXSYxPDwo
-byYxNSkpIT09MH1lbHNlIG49ITEKaWYobikrK3IKZWxzZXtpZihvPT09Mzcpe209UC5ydihhLHIsITEp
-CmlmKG09PW51bGwpe3IrPTMKY29udGludWV9aWYoIiUiPT09bSl7bT0iJTI1IgpsPTF9ZWxzZSBsPTN9
-ZWxzZXtpZihzKWlmKG88PTkzKXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShD
-LmFrW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQplbHNlIG49ITEKaWYobil7UC5SMyhhLHIsIklu
-dmFsaWQgY2hhcmFjdGVyIikKSC5CaSh1LmcpCmw9agptPWx9ZWxzZXtpZigobyY2NDUxMik9PT01NTI5
-Nil7bj1yKzEKaWYobjxjKXtrPUMueEIuTzIoYSxuKQppZigoayY2NDUxMik9PT01NjMyMCl7bz0obyYx
-MDIzKTw8MTB8ayYxMDIzfDY1NTM2Cmw9Mn1lbHNlIGw9MX1lbHNlIGw9MX1lbHNlIGw9MQptPVAuelgo
-byl9fWlmKHA9PW51bGwpe3A9bmV3IFAuUm4oIiIpCm49cH1lbHNlIG49cApuLmErPUMueEIuTmooYSxx
-LHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBILnBZKGwpCnIrPWwK
-cT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8YylwLmErPUMueEIuTmooYSxxLGMpCnM9cC5hCnJl
-dHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUI6ZnVuY3Rpb24oYSl7aWYoQy54Qi5uQyhhLCIu
-IikpcmV0dXJuITAKcmV0dXJuIEMueEIuT1koYSwiLy4iKSE9PS0xfSwKeGU6ZnVuY3Rpb24oYSl7dmFy
-IHMscixxLHAsbyxuLG0KaWYoIVAueUIoYSkpcmV0dXJuIGEKcz1ILlZNKFtdLHQucykKZm9yKHI9YS5z
-cGxpdCgiLyIpLHE9ci5sZW5ndGgscD0hMSxvPTA7bzxxOysrbyl7bj1yW29dCmlmKEouUk0obiwiLi4i
-KSl7bT1zLmxlbmd0aAppZihtIT09MCl7aWYoMD49bSlyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlm
-KHMubGVuZ3RoPT09MClDLk5tLmkocywiIil9cD0hMH1lbHNlIGlmKCIuIj09PW4pcD0hMAplbHNle0Mu
-Tm0uaShzLG4pCnA9ITF9fWlmKHApQy5ObS5pKHMsIiIpCnJldHVybiBDLk5tLmsocywiLyIpfSwKd0Y6
-ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4KaWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTph
-CnM9SC5WTShbXSx0LnMpCmZvcihyPWEuc3BsaXQoIi8iKSxxPXIubGVuZ3RoLHA9ITEsbz0wO288cTsr
-K28pe249cltvXQppZigiLi4iPT09bilpZihzLmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHMpIT09Ii4uIil7
-aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpwPSEwfWVsc2V7Qy5ObS5pKHMs
-Ii4uIikKcD0hMX1lbHNlIGlmKCIuIj09PW4pcD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fXI9cy5s
-ZW5ndGgKaWYociE9PTApaWYocj09PTEpe2lmKDA+PXIpcmV0dXJuIEguT0gocywwKQpyPXNbMF0ubGVu
-Z3RoPT09MH1lbHNlIHI9ITEKZWxzZSByPSEwCmlmKHIpcmV0dXJuIi4vIgppZihwfHxDLk5tLmdyWihz
-KT09PSIuLiIpQy5ObS5pKHMsIiIpCmlmKCFiKXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDAp
-CkMuTm0uWTUocywwLFAuQzEoc1swXSkpfXJldHVybiBDLk5tLmsocywiLyIpfSwKQzE6ZnVuY3Rpb24o
-YSl7dmFyIHMscixxLHA9YS5sZW5ndGgKaWYocD49MiYmUC5FdChKLlF6KGEsMCkpKWZvcihzPTE7czxw
-Oysrcyl7cj1DLnhCLlcoYSxzKQppZihyPT09NTgpcmV0dXJuIEMueEIuTmooYSwwLHMpKyIlM0EiK0Mu
-eEIueW4oYSxzKzEpCmlmKHI8PTEyNyl7cT1yPj4+NAppZihxPj04KXJldHVybiBILk9IKEMubUsscSkK
-cT0oQy5tS1txXSYxPDwociYxNSkpPT09MH1lbHNlIHE9ITAKaWYocSlicmVha31yZXR1cm4gYX0sCm1u
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEuZ0ZqKCksbz1wLmxlbmd0aAppZihvPjAmJkouSG0ocFsw
-XSk9PT0yJiZKLmE2KHBbMF0sMSk9PT01OCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApClAucmcoSi5h
-NihwWzBdLDApLCExKQpQLkhOKHAsITEsMSkKcz0hMH1lbHNle1AuSE4ocCwhMSwwKQpzPSExfXI9YS5n
-dFQoKSYmIXM/IlxcIjoiIgppZihhLmdjaigpKXtxPWEuZ0pmKGEpCmlmKHEubGVuZ3RoIT09MClyPXIr
-IlxcIitxKyJcXCJ9cj1QLnZnKHIscCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpyCnJldHVybiBvLmNo
-YXJDb2RlQXQoMCk9PTA/bzpvfSwKSWg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKZm9yKHM9MCxyPTA7
-cjwyOysrcil7cT1DLnhCLlcoYSxiK3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYrcS00OAplbHNle3F8
-PTMyCmlmKDk3PD1xJiZxPD0xMDIpcz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIoUC54WSgiSW52YWxp
-ZCBVUkwgZW5jb2RpbmciKSl9fXJldHVybiBzfSwKa3U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxy
-LHEscCxvPUouclkoYSksbj1iCndoaWxlKCEwKXtpZighKG48Yykpe3M9ITAKYnJlYWt9cj1vLlcoYSxu
-KQppZihyPD0xMjcpaWYociE9PTM3KXE9ZSYmcj09PTQzCmVsc2UgcT0hMAplbHNlIHE9ITAKaWYocSl7
-cz0hMQpicmVha30rK259aWYocyl7aWYoQy54TSE9PWQpcT0hMQplbHNlIHE9ITAKaWYocSlyZXR1cm4g
-by5OaihhLGIsYykKZWxzZSBwPW5ldyBILnFqKG8uTmooYSxiLGMpKX1lbHNle3A9SC5WTShbXSx0LmEp
-CmZvcihuPWI7bjxjOysrbil7cj1vLlcoYSxuKQppZihyPjEyNyl0aHJvdyBILmIoUC54WSgiSWxsZWdh
-bCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIpKQppZihyPT09Mzcpe2lmKG4rMz5hLmxlbmd0aCl0aHJv
-dyBILmIoUC54WSgiVHJ1bmNhdGVkIFVSSSIpKQpDLk5tLmkocCxQLkloKGEsbisxKSkKbis9Mn1lbHNl
-IGlmKGUmJnI9PT00MylDLk5tLmkocCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5MLmEocCkKcmV0dXJu
-IEMub0UuV0oocCl9LApFdDpmdW5jdGlvbihhKXt2YXIgcz1hfDMyCnJldHVybiA5Nzw9cyYmczw9MTIy
-fSwKS0Q6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52YWxpZCBNSU1FIHR5
-cGUiLGo9SC5WTShbYi0xXSx0LmEpCmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9bnVsbDtyPHM7Kyty
-KXtwPUMueEIuVyhhLHIpCmlmKHA9PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00Nyl7aWYocTwwKXtx
-PXIKY29udGludWV9dGhyb3cgSC5iKFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIpdGhyb3cgSC5iKFAu
-cnIoayxhLHIpKQpmb3IoO3AhPT00NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0tMTtyPHM7KytyKXtw
-PUMueEIuVyhhLHIpCmlmKHA9PT02MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01OXx8cD09PTQ0KWJy
-ZWFrfWlmKG8+PTApQy5ObS5pKGosbykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAhPT00NHx8ciE9PW4r
-N3x8IUMueEIuUWkoYSwiYmFzZTY0IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixh
-LHIpKQpicmVha319Qy5ObS5pKGoscikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIo
-YSxtLHMpCmVsc2V7bD1QLlVsKGEsbSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1DLnhCLmk3KGEsbSxz
-LGwpfXJldHVybiBuZXcgUC5QRShhLGosYyl9LApLTjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixt
-PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2
-d3h5ei0uX34hJCYnKCkqKyw7PSIsbD0iLiIsaz0iOiIsaj0iLyIsaT0iPyIsaD0iIyIsZz1ILlZNKG5l
-dyBBcnJheSgyMiksdC5nTikKZm9yKHM9MDtzPDIyOysrcylnW3NdPW5ldyBVaW50OEFycmF5KDk2KQpy
-PW5ldyBQLnlJKGcpCnE9bmV3IFAuYzYoKQpwPW5ldyBQLnFkKCkKbz10LmdjCm49by5hKHIuJDIoMCwy
-MjUpKQpxLiQzKG4sbSwxKQpxLiQzKG4sbCwxNCkKcS4kMyhuLGssMzQpCnEuJDMobixqLDMpCnEuJDMo
-bixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDE0LDIyNSkpCnEuJDMobixtLDEpCnEuJDMo
-bixsLDE1KQpxLiQzKG4saywzNCkKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIw
-NSkKbj1vLmEoci4kMigxNSwyMjUpKQpxLiQzKG4sbSwxKQpxLiQzKG4sIiUiLDIyNSkKcS4kMyhuLGss
-MzQpCnEuJDMobixqLDkpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEsMjI1
-KSkKcS4kMyhuLG0sMSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDEwKQpxLiQzKG4saSwxNzIpCnEuJDMo
-bixoLDIwNSkKbj1vLmEoci4kMigyLDIzNSkpCnEuJDMobixtLDEzOSkKcS4kMyhuLGosMTMxKQpxLiQz
-KG4sbCwxNDYpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDMsMjM1KSkKcS4k
-MyhuLG0sMTEpCnEuJDMobixqLDY4KQpxLiQzKG4sbCwxOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwy
-MDUpCm49by5hKHIuJDIoNCwyMjkpKQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixr
-LDEwMikKcS4kMyhuLCJAIiw2OCkKcS4kMyhuLCJbIiwyMzIpCnEuJDMobixqLDEzOCkKcS4kMyhuLGks
-MTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNSwyMjkpKQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFa
-IiwyMjkpCnEuJDMobixrLDEwMikKcS4kMyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4KQpxLiQzKG4saSwx
-NzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMig2LDIzMSkpCnAuJDMobiwiMTkiLDcpCnEuJDMobiwi
-QCIsNjgpCnEuJDMobixqLDEzOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIo
-NywyMzEpKQpwLiQzKG4sIjA5Iiw3KQpxLiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixp
-LDE3MikKcS4kMyhuLGgsMjA1KQpxLiQzKG8uYShyLiQyKDgsOCkpLCJdIiw1KQpuPW8uYShyLiQyKDks
-MjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixsLDE2KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikK
-cS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDE2LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNykK
-cS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNywyMzUp
-KQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosOSkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5h
-KHIuJDIoMTAsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixsLDE4KQpxLiQzKG4saiwyMzQpCnEuJDMo
-bixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDE4LDIzNSkpCnEuJDMobixtLDExKQpxLiQz
-KG4sbCwxOSkKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4k
-MigxOSwyMzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixo
-LDIwNSkKbj1vLmEoci4kMigxMSwyMzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosMTApCnEuJDMobixp
-LDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEyLDIzNikpCnEuJDMobixtLDEyKQpxLiQzKG4s
-aSwxMikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEzLDIzNykpCnEuJDMobixtLDEzKQpxLiQzKG4s
-aSwxMykKcC4kMyhvLmEoci4kMigyMCwyNDUpKSwiYXoiLDIxKQpyPW8uYShyLiQyKDIxLDI0NSkpCnAu
-JDMociwiYXoiLDIxKQpwLiQzKHIsIjA5IiwyMSkKcS4kMyhyLCIrLS4iLDIxKQpyZXR1cm4gZ30sClVC
-OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxLHAsbyxuPSQudlooKQpmb3Iocz1KLnJZKGEpLHI9
-YjtyPGM7KytyKXtpZihkPDB8fGQ+PW4ubGVuZ3RoKXJldHVybiBILk9IKG4sZCkKcT1uW2RdCnA9cy5X
-KGEscileOTYKbz1xW3A+OTU/MzE6cF0KZD1vJjMxCkMuTm0uWTUoZSxvPj4+NSxyKX1yZXR1cm4gZH0s
-CldGOmZ1bmN0aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAppUDpmdW5jdGlvbiBpUChhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihhKXt0
-aGlzLmE9YX0sCkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBGKCl7fSwKdTpmdW5jdGlvbiB1
-KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBi
-SihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9
-Zn0sCmVZOmZ1bmN0aW9uIGVZKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9Ywpf
-LmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
-Xy5jPWMKXy5kPWR9LAp1YjpmdW5jdGlvbiB1YihhKXt0aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEp
-e3RoaXMuYT1hfSwKbGo6ZnVuY3Rpb24gbGooYSl7dGhpcy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0
-aGlzLmE9YX0sCms1OmZ1bmN0aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24gS1koKXt9LApjOmZ1bmN0aW9u
-IGMoYSl7dGhpcy5hPWF9LApDRDpmdW5jdGlvbiBDRChhKXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFF
-KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmNYOmZ1bmN0aW9uIGNYKCl7fSwKQW46
-ZnVuY3Rpb24gQW4oKXt9LApOMzpmdW5jdGlvbiBOMyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
-cy4kdGk9Y30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKTWg6ZnVuY3Rpb24gTWgoKXt9LApaZDpmdW5jdGlv
-biBaZCgpe30sClJuOmZ1bmN0aW9uIFJuKGEpe3RoaXMuYT1hfSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhp
-cy5hPWF9LApjUzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMu
-YT1hfSwKSlQ6ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERu
-KGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5m
-PWYKXy5yPWcKXy54PW51bGwKXy55PSExCl8uej1udWxsCl8uUT0hMQpfLmNoPW51bGwKXy5jeD0hMQpf
-LmN5PW51bGwKXy5kYj0hMX0sClJaOmZ1bmN0aW9uIFJaKCl7fSwKTUU6ZnVuY3Rpb24gTUUoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCnk1OmZ1bmN0aW9uIHk1KGEpe3RoaXMuYT1hfSwKUEU6ZnVuY3Rpb24g
-UEUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUk6ZnVuY3Rpb24geUkoYSl7dGhp
-cy5hPWF9LApjNjpmdW5jdGlvbiBjNigpe30sCnFkOmZ1bmN0aW9uIHFkKCl7fSwKVWY6ZnVuY3Rpb24g
-VWYoYSxiLGMsZCxlLGYsZyxoKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1l
-Cl8uZj1mCl8ucj1nCl8ueD1oCl8ueT1udWxsfSwKcWU6ZnVuY3Rpb24gcWUoYSxiLGMsZCxlLGYsZyl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLng9bnVs
-bApfLnk9ITEKXy56PW51bGwKXy5RPSExCl8uY2g9bnVsbApfLmN4PSExCl8uY3k9bnVsbApfLmRiPSEx
-fSwKaUo6ZnVuY3Rpb24gaUooKXt9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKVGE6ZnVuY3Rpb24gVGEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkJmOmZ1bmN0aW9uIEJmKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBczpmdW5jdGlvbiBBcygpe30sCkdFOmZ1bmN0aW9uIEdFKGEp
-e3RoaXMuYT1hfSwKTjc6ZnVuY3Rpb24gTjcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVROmZ1bmN0
-aW9uIHVRKCl7fSwKaEY6ZnVuY3Rpb24gaEYoKXt9LApSNDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxy
-LHEKSC55OChiKQp0LmouYShkKQppZihILm9UKGIpKXtzPVtjXQpDLk5tLkZWKHMsZCkKZD1zfXI9dC56
-CnE9UC5DSChKLk0xKGQsUC53MCgpLHIpLCEwLHIpCnQuWS5hKGEpCnJldHVybiBQLndZKEguRWsoYSxx
-LG51bGwpKX0sCkRtOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwp0cnl7aWYoT2JqZWN0LmlzRXh0ZW5zaWJs
-ZShhKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXtPYmplY3QuZGVm
-aW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKcmV0dXJuITB9fWNhdGNoKHMpe0guUnUocyl9cmV0dXJu
-ITF9LApPbTpmdW5jdGlvbihhLGIpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2Fs
-bChhLGIpKXJldHVybiBhW2JdCnJldHVybiBudWxsfSwKd1k6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8
-dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEgubChhKSlyZXR1cm4gYQppZihh
-IGluc3RhbmNlb2YgUC5FNClyZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5iKGEp
-KXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEpKXJl
-dHVybiBQLmhFKGEsIiRkYXJ0X2pzRnVuY3Rpb24iLG5ldyBQLlBDKCkpCnJldHVybiBQLmhFKGEsIl8k
-ZGFydF9qc09iamVjdCIsbmV3IFAubXQoJC5rSSgpKSl9LApoRTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9
-UC5PbShhLGIpCmlmKHM9PW51bGwpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCmRVOmZ1
-bmN0aW9uKGEpe3ZhciBzLHIKaWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09
-Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2Yg
-T2JqZWN0JiZILlI5KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYmdC5hay5i
-KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIERhdGUpe3M9SC51UChhLmdldFRpbWUoKSkK
-aWYoTWF0aC5hYnMocyk8PTg2NGUxMylyPSExCmVsc2Ugcj0hMAppZihyKUgudihQLnhZKCJEYXRlVGlt
-ZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAiK3MpKQpILmNiKCExLCJpc1V0YyIsdC55KQpyZXR1cm4g
-bmV3IFAuaVAocywhMSl9ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09JC5rSSgpKXJldHVybiBhLm8KZWxz
-ZSByZXR1cm4gUC5ORChhKX0sCk5EOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJl
-dHVybiBQLmlRKGEsJC53KCksbmV3IFAuUVMoKSkKaWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBQ
-LmlRKGEsJC5SOCgpLG5ldyBQLm5wKCkpCnJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLlV0KCkpfSwK
-aVE6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPVAuT20oYSxiKQppZihzPT1udWxsfHwhKGEgaW5zdGFuY2Vv
-ZiBPYmplY3QpKXtzPWMuJDEoYSkKUC5EbShhLGIscyl9cmV0dXJuIHN9LApQQzpmdW5jdGlvbiBQQygp
-e30sCm10OmZ1bmN0aW9uIG10KGEpe3RoaXMuYT1hfSwKUVM6ZnVuY3Rpb24gUVMoKXt9LApucDpmdW5j
-dGlvbiBucCgpe30sClV0OmZ1bmN0aW9uIFV0KCl7fSwKRTQ6ZnVuY3Rpb24gRTQoYSl7dGhpcy5hPWF9
-LApyNzpmdW5jdGlvbiByNyhhKXt0aGlzLmE9YX0sClR6OmZ1bmN0aW9uIFR6KGEsYil7dGhpcy5hPWEK
-dGhpcy4kdGk9Yn0sCmNvOmZ1bmN0aW9uIGNvKCl7fSwKbmQ6ZnVuY3Rpb24gbmQoKXt9LApLZTpmdW5j
-dGlvbiBLZShhKXt0aGlzLmE9YX0sCmhpOmZ1bmN0aW9uIGhpKCl7fX0sVz17CngzOmZ1bmN0aW9uKCl7
-cmV0dXJuIHdpbmRvd30sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50fSwKSjY6ZnVuY3Rpb24o
-YSl7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCmlmKGEhPW51bGwpQy54bi5zTFUocyxh
-KQpyZXR1cm4gc30sClU5OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWRvY3VtZW50LmJvZHkKci50b1N0
-cmluZwpzPUMuUlkucjYocixhLGIsYykKcy50b1N0cmluZwpyPXQuYWMKcj1uZXcgSC5VNShuZXcgVy5l
-NyhzKSxyLkMoImEyKGxELkUpIikuYShuZXcgVy5DdigpKSxyLkMoIlU1PGxELkU+IikpCnJldHVybiB0
-LmguYShyLmdyOChyKSl9LApyUzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9ImVsZW1lbnQgdGFnIHVuYXZh
-aWxhYmxlIgp0cnl7cz1KLllFKGEpCmlmKHR5cGVvZiBzLmducyhhKT09InN0cmluZyIpcT1zLmducyhh
-KX1jYXRjaChyKXtILlJ1KHIpfXJldHVybiBxfSwKQzA6ZnVuY3Rpb24oYSxiKXthPWErYiY1MzY4NzA5
-MTEKYT1hKygoYSY1MjQyODcpPDwxMCkmNTM2ODcwOTExCnJldHVybiBhXmE+Pj42fSwKckU6ZnVuY3Rp
-b24oYSxiLGMsZCl7dmFyIHM9Vy5DMChXLkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHI9cysoKHMm
-NjcxMDg4NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+PjExCnJldHVybiByKygociYxNjM4Myk8PDE1KSY1
-MzY4NzA5MTF9LApUTjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1hLmNsYXNzTGlzdApmb3Iocz1iLmxl
-bmd0aCxyPTA7cjxiLmxlbmd0aDtiLmxlbmd0aD09PXN8fCgwLEgubGspKGIpLCsrcilxLmFkZChiW3Jd
-KX0sCkpFOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9Vy5hRihuZXcgVy52TihjKSx0LkIpCmlmKHMh
-PW51bGwmJiEwKUouZFooYSxiLHMsITEpCnJldHVybiBuZXcgVy54QyhhLGIscywhMSxlLkMoInhDPDA+
-IikpfSwKVHc6ZnVuY3Rpb24oYSl7dmFyIHM9Vy5KNihudWxsKSxyPXdpbmRvdy5sb2NhdGlvbgpzPW5l
-dyBXLkpRKG5ldyBXLm1rKHMscikpCnMuQ1koYSkKcmV0dXJuIHN9LApxRDpmdW5jdGlvbihhLGIsYyxk
-KXt0LmguYShhKQpILmgoYikKSC5oKGMpCnQuY3IuYShkKQpyZXR1cm4hMH0sClFXOmZ1bmN0aW9uKGEs
-YixjLGQpe3ZhciBzLHIscQp0LmguYShhKQpILmgoYikKSC5oKGMpCnM9dC5jci5hKGQpLmEKcj1zLmEK
-Qy54bi5zTFUocixjKQpxPXIuaG9zdG5hbWUKcz1zLmIKaWYoIShxPT1zLmhvc3RuYW1lJiZyLnBvcnQ9
-PXMucG9ydCYmci5wcm90b2NvbD09cy5wcm90b2NvbCkpaWYocT09PSIiKWlmKHIucG9ydD09PSIiKXtz
-PXIucHJvdG9jb2wKcz1zPT09IjoifHxzPT09IiJ9ZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITAK
-cmV0dXJuIHN9LApCbDpmdW5jdGlvbigpe3ZhciBzPXQuTixyPVAudE0oQy5ReCxzKSxxPXQuZDAuYShu
-ZXcgVy5JQSgpKSxwPUguVk0oWyJURU1QTEFURSJdLHQucykKcz1uZXcgVy5jdChyLFAuTHMocyksUC5M
-cyhzKSxQLkxzKHMpLG51bGwpCnMuQ1kobnVsbCxuZXcgSC5sSihDLlF4LHEsdC5maikscCxudWxsKQpy
-ZXR1cm4gc30sCnFjOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoInBv
-c3RNZXNzYWdlIiBpbiBhKXtzPVcuUDEoYSkKaWYodC5hUy5iKHMpKXJldHVybiBzCnJldHVybiBudWxs
-fWVsc2UgcmV0dXJuIHQuY2guYShhKX0sClAxOmZ1bmN0aW9uKGEpe2lmKGE9PT13aW5kb3cpcmV0dXJu
-IHQuY2kuYShhKQplbHNlIHJldHVybiBuZXcgVy5kVygpfSwKYUY6ZnVuY3Rpb24oYSxiKXt2YXIgcz0k
-LlgzCmlmKHM9PT1DLk5VKXJldHVybiBhCnJldHVybiBzLlB5KGEsYil9LApxRTpmdW5jdGlvbiBxRSgp
-e30sCkdoOmZ1bmN0aW9uIEdoKCl7fSwKZlk6ZnVuY3Rpb24gZlkoKXt9LApuQjpmdW5jdGlvbiBuQigp
-e30sCkF6OmZ1bmN0aW9uIEF6KCl7fSwKUVA6ZnVuY3Rpb24gUVAoKXt9LApueDpmdW5jdGlvbiBueCgp
-e30sCm9KOmZ1bmN0aW9uIG9KKCl7fSwKaWQ6ZnVuY3Rpb24gaWQoKXt9LApRRjpmdW5jdGlvbiBRRigp
-e30sCk5oOmZ1bmN0aW9uIE5oKCl7fSwKYWU6ZnVuY3Rpb24gYWUoKXt9LApJQjpmdW5jdGlvbiBJQigp
-e30sCm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0
-aT1ifSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigpe30sCmVhOmZ1bmN0aW9uIGVh
-KCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApoSDpmdW5jdGlvbiBoSCgpe30sCmg0OmZ1bmN0aW9uIGg0
-KCl7fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigpe30sCmZKOmZ1bmN0aW9uIGZK
-KCl7fSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5jdGlvbiBTZygpe30sCnc3OmZ1bmN0aW9uIHc3
-KCl7fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5jdGlvbiBlNyhhKXt0aGlzLmE9YX0sCnVIOmZ1
-bmN0aW9uIHVIKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1
-bmN0aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1
-bmN0aW9uIEl2KCl7fSwKV1A6ZnVuY3Rpb24gV1AoKXt9LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1
-bmN0aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1
-bmN0aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1
-bmN0aW9uIGNmKCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShh
-KXt0aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5j
-dGlvbiBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSTQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9
-LApGazpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhh
-LGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LApldTpmdW5jdGlvbiBl
-dShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlv
-biB4QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEKXy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0s
-CnZOOmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApH
-bTpmdW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZEKGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24g
-VXYoYSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
-cy5jPWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24g
-V2soKXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5i
-PWMKXy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgpe30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6
-ZnVuY3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8u
-JHRpPWN9LApkVzpmdW5jdGlvbiBkVygpe30sCm1rOmZ1bmN0aW9uIG1rKGEsYil7dGhpcy5hPWEKdGhp
-cy5iPWJ9LApLbzpmdW5jdGlvbiBLbyhhKXt0aGlzLmE9YQp0aGlzLmI9ITF9LApmbTpmdW5jdGlvbiBm
-bShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpm
-dW5jdGlvbiByQigpe30sClhXOmZ1bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxNPXsK
-T1g6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgQy5BZDpyZXR1cm4iQWRkIC8qPyovIGhpbnQiCmNh
-c2UgQy5uZTpyZXR1cm4iQWRkIC8qISovIGhpbnQiCmNhc2UgQy53VjpyZXR1cm4iUmVtb3ZlIC8qPyov
-IGhpbnQiCmNhc2UgQy5mUjpyZXR1cm4iUmVtb3ZlIC8qISovIGhpbnQiCmNhc2UgQy5teTpyZXR1cm4i
-Q2hhbmdlIHRvIC8qPyovIGhpbnQiCmNhc2UgQy5yeDpyZXR1cm4iQ2hhbmdlIHRvIC8qISovIGhpbnQi
-fXJldHVybiBudWxsfSwKSDc6ZnVuY3Rpb24gSDcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCllGOmZ1
-bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbApmb3Iocz1iLmxlbmd0aCxyPTE7cjxzOysrcil7
-aWYoYltyXT09bnVsbHx8YltyLTFdIT1udWxsKWNvbnRpbnVlCmZvcig7cz49MTtzPXEpe3E9cy0xCmlm
-KGJbcV0hPW51bGwpYnJlYWt9cD1uZXcgUC5SbigiIikKbz1hKyIoIgpwLmE9bwpuPUgudDYoYikKbT1u
-LkMoIm5IPDE+IikKbD1uZXcgSC5uSChiLDAscyxtKQpsLkhkKGIsMCxzLG4uYykKbT1vK25ldyBILmxK
-KGwsbS5DKCJxVShhTC5FKSIpLmEobmV3IE0uTm8oKSksbS5DKCJsSjxhTC5FLHFVPiIpKS5rKDAsIiwg
-IikKcC5hPW0KcC5hPW0rKCIpOiBwYXJ0ICIrKHItMSkrIiB3YXMgbnVsbCwgYnV0IHBhcnQgIityKyIg
-d2FzIG5vdC4iKQp0aHJvdyBILmIoUC54WShwLncoMCkpKX19LApsSTpmdW5jdGlvbiBsSShhKXt0aGlz
-LmE9YX0sCnE3OmZ1bmN0aW9uIHE3KCl7fSwKTm86ZnVuY3Rpb24gTm8oKXt9fSxVPXsKbno6ZnVuY3Rp
-b24oYSl7dmFyIHM9SC51UChhLnEoMCwibm9kZUlkIikpCnJldHVybiBuZXcgVS5MTChDLk5tLkh0KEMu
-cmssbmV3IFUuTUQoYSkpLHMpfSwKTEw6ZnVuY3Rpb24gTEwoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-Ck1EOmZ1bmN0aW9uIE1EKGEpe3RoaXMuYT1hfSwKamY6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKaWYo
-YT09bnVsbClzPW51bGwKZWxzZXtzPUguVk0oW10sdC5kNykKZm9yKHI9Si5JVCh0LlUuYShhKSk7ci5G
-KCk7KXtxPXIuZ2woKQpwPUouVTYocSkKcy5wdXNoKG5ldyBVLlNlKEguaChwLnEocSwiZGVzY3JpcHRp
-b24iKSksSC5oKHAucShxLCJocmVmIikpKSl9fXJldHVybiBzfSwKTmQ6ZnVuY3Rpb24oYSl7dmFyIHMs
-cgppZihhPT1udWxsKXM9bnVsbAplbHNle3M9SC5WTShbXSx0LmFBKQpmb3Iocj1KLklUKHQuVS5hKGEp
-KTtyLkYoKTspcy5wdXNoKFUuTmYoci5nbCgpKSl9cmV0dXJuIHN9LApOZjpmdW5jdGlvbihhKXt2YXIg
-cz1KLlU2KGEpLHI9SC5oKHMucShhLCJkZXNjcmlwdGlvbiIpKSxxPUguVk0oW10sdC5hSikKZm9yKHM9
-Si5JVCh0LlUuYShzLnEoYSwiZW50cmllcyIpKSk7cy5GKCk7KXEucHVzaChVLlJqKHMuZ2woKSkpCnJl
-dHVybiBuZXcgVS55RChyLHEpfSwKUmo6ZnVuY3Rpb24oYSl7dmFyIHMscj1KLlU2KGEpLHE9SC5oKHIu
-cShhLCJkZXNjcmlwdGlvbiIpKSxwPUguaChyLnEoYSwiZnVuY3Rpb24iKSksbz1yLnEoYSwibGluayIp
-CmlmKG89PW51bGwpbz1udWxsCmVsc2V7cz1KLlU2KG8pCm89bmV3IFUuTWwoSC5oKHMucShvLCJocmVm
-IikpLEgudVAocy5xKG8sImxpbmUiKSksSC5oKHMucShvLCJwYXRoIikpKX1yPXQuZksuYShyLnEoYSwi
-aGludEFjdGlvbnMiKSkKcj1yPT1udWxsP251bGw6Si5NMShyLG5ldyBVLmFOKCksdC5hWCkKcj1yPT1u
-dWxsP251bGw6ci5icigwKQpyZXR1cm4gbmV3IFUud2IocSxwLG8scj09bnVsbD9DLmRuOnIpfSwKZDI6
-ZnVuY3Rpb24gZDIoYSxiLGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQK
-Xy5lPWUKXy5mPWZ9LApTZTpmdW5jdGlvbiBTZShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6ZnVu
-Y3Rpb24gTWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24geUQo
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjLGQpe3ZhciBfPXRoaXMK
-Xy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAphTjpmdW5jdGlvbiBhTigpe30sCmIwOmZ1bmN0aW9uIGIw
-KCl7fX0sQj17CndSOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBCLnFwKCIiLCIiLCIiLEMuRHgpfSwKWWY6
-ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrPUguaChhLnEoMCwicmVnaW9ucyIpKSxqPUgu
-aChhLnEoMCwibmF2aWdhdGlvbkNvbnRlbnQiKSksaT1ILmgoYS5xKDAsInNvdXJjZUNvZGUiKSksaD1Q
-LkZsKHQuWCx0LmRfKQpmb3Iocz10LnQuYShhLnEoMCwiZWRpdHMiKSkscz1zLmdQdShzKSxzPXMuZ20o
-cykscj10LlUscT10Lmg0O3MuRigpOyl7cD1zLmdsKCkKbz1wLmEKbj1ILlZNKFtdLHEpCmZvcihwPUou
-SVQoci5hKHAuYikpO3AuRigpOyl7bT1wLmdsKCkKbD1KLlU2KG0pCm4ucHVzaChuZXcgQi5qOChILnVQ
-KGwucShtLCJsaW5lIikpLEguaChsLnEobSwiZXhwbGFuYXRpb24iKSksSC51UChsLnEobSwib2Zmc2V0
-IikpKSl9aC5ZNSgwLG8sbil9cmV0dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6ZnVuY3Rpb24gajgo
-YSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmZ2OmZ1bmN0aW9uIGZ2KCl7fSwKT1M6
-ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIShhPj02NSYmYTw9OTApKXM9YT49OTcmJmE8PTEyMgplbHNlIHM9
-ITAKcmV0dXJuIHN9LApZdTpmdW5jdGlvbihhLGIpe3ZhciBzPWEubGVuZ3RoLHI9YisyCmlmKHM8cily
-ZXR1cm4hMQppZighQi5PUyhDLnhCLk8yKGEsYikpKXJldHVybiExCmlmKEMueEIuTzIoYSxiKzEpIT09
-NTgpcmV0dXJuITEKaWYocz09PXIpcmV0dXJuITAKcmV0dXJuIEMueEIuTzIoYSxyKT09PTQ3fX0sVD17
-bVE6ZnVuY3Rpb24gbVEoKXt9fSxMPXsKSXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNv
-bnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkKQy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9
-LAprejpmdW5jdGlvbihhKXt2YXIgcyxyPXQuZy5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3Rvcigi
-OnNjb3BlID4gdWwiKSxxPXIuc3R5bGUscD0iIitDLkNELnpRKHIub2Zmc2V0SGVpZ2h0KSoyKyJweCIK
-cS5tYXhIZWlnaHQ9cApxPUoucUYoYSkKcD1xLiR0aQpzPXAuQygifigxKT8iKS5hKG5ldyBMLld4KHIs
-YSkpCnQuWi5hKG51bGwpClcuSkUocS5hLHEuYixzLCExLHAuYyl9LAp5WDpmdW5jdGlvbihhLGIpe3Zh
-ciBzLHIscSxwLG8sbixtPSJxdWVyeVNlbGVjdG9yQWxsIixsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Io
-YSksaz10LmcKbC50b1N0cmluZwpzPXQuaApILkRoKGsscywiVCIsbSkKcj10LlIKcT1uZXcgVy53eihs
-LnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtbGluayIpLHIpCnEuSyhxLG5ldyBMLkFPKGIpKQpILkRoKGss
-cywiVCIsbSkKcD1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24iKSxyKQppZighcC5n
-bDAocCkpe289bC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKby50b1N0cmluZwpwLkso
-cCxuZXcgTC5IbyhvLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG8pKS5PVSgi
-cGF0aCIpKSkpfUguRGgoayxzLCJUIixtKQpuPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLmFk
-ZC1oaW50LWxpbmsiKSxyKQpuLksobixuZXcgTC5JQygpKX0sClE2OmZ1bmN0aW9uKGEsYixjKXt2YXIg
-cz1uZXcgWE1MSHR0cFJlcXVlc3QoKQpDLkR0LmVvKHMsIkdFVCIsTC5RNChhLGIpLCEwKQpzLnNldFJl
-cXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgi
-KQpyZXR1cm4gTC5MVShzLG51bGwsYy5DKCIwKiIpKX0sCnR5OmZ1bmN0aW9uKGEsYil7dmFyIHM9bmV3
-IFhNTEh0dHBSZXF1ZXN0KCkscj10LlgKQy5EdC5lbyhzLCJQT1NUIixMLlE0KGEsUC5GbChyLHIpKSwh
-MCkKcy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29uOyBjaGFy
-c2V0PVVURi04IikKcmV0dXJuIEwuTFUocyxiLHQudCl9LApMVTpmdW5jdGlvbihhLGIsYyl7cmV0dXJu
-IEwuVGcoYSxiLGMsYy5DKCIwKiIpKX0sClRnOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPTAscj1QLkZY
-KGQpLHEscD0yLG8sbj1bXSxtLGwsayxqLGksaCxnLGYKdmFyICRhc3luYyRMVT1QLmx6KGZ1bmN0aW9u
-KGUsYTApe2lmKGU9PT0xKXtvPWEwCnM9cH13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aT1uZXcg
-UC5aZihuZXcgUC52cygkLlgzLHQuZ1YpLHQuYkMpCmg9dC5lYgpnPWguYShuZXcgTC5mQyhpLGEpKQp0
-LlouYShudWxsKQpsPXQuZVEKVy5KRShhLCJsb2FkIixnLCExLGwpClcuSkUoYSwiZXJyb3IiLGguYShp
-LmdZSigpKSwhMSxsKQphLnNlbmQoYj09bnVsbD9udWxsOkMuQ3QuT0IoYixudWxsKSkKcD00CnM9Nwpy
-ZXR1cm4gUC5qUShpLmEsJGFzeW5jJExVKQpjYXNlIDc6cD0yCnM9NgpicmVhawpjYXNlIDQ6cD0zCmY9
-bwpILlJ1KGYpCm09SC50cyhmKQpoPVAuVGwoIkVycm9yIHJlYWNoaW5nIG1pZ3JhdGlvbiBwcmV2aWV3
-IHNlcnZlci4iLG0pCnRocm93IEguYihoKQpzPTYKYnJlYWsKY2FzZSAzOnM9MgpicmVhawpjYXNlIDY6
-aj1DLkN0LnBXKDAsYS5yZXNwb25zZVRleHQsbnVsbCkKaWYoYS5zdGF0dXM9PT0yMDApe3E9Yy5DKCIw
-KiIpLmEoaikKcz0xCmJyZWFrfWVsc2UgdGhyb3cgSC5iKGopCmNhc2UgMTpyZXR1cm4gUC55QyhxLHIp
-CmNhc2UgMjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRMVSxyKX0sCmFLOmZ1
-bmN0aW9uKGEpe3ZhciBzPVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0dXJuIHM9PW51bGw/bnVs
-bDpILkhwKHMsbnVsbCl9LApHNjpmdW5jdGlvbihhKXt2YXIgcz1QLmhLKGEpLmdoWSgpLnEoMCwib2Zm
-c2V0IikKcmV0dXJuIHM9PW51bGw/bnVsbDpILkhwKHMsbnVsbCl9LAppNjpmdW5jdGlvbihhKXtyZXR1
-cm4gTC5uVyh0Lk8uYShhKSl9LApuVzpmdW5jdGlvbihhKXt2YXIgcz0wLHI9UC5GWCh0LnopLHE9MSxw
-LG89W10sbixtLGwsayxqLGksaAp2YXIgJGFzeW5jJGk2PVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09
-MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aT10LmcuYShXLnFjKGEuY3VycmVu
-dFRhcmdldCkpLmdldEF0dHJpYnV0ZSgiaHJlZiIpCmEucHJldmVudERlZmF1bHQoKQpxPTMKaz1kb2N1
-bWVudApuPUMuQ0QuelEoay5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpLnNjcm9sbFRvcCkKcz02CnJl
-dHVybiBQLmpRKEwudHkoaSxudWxsKSwkYXN5bmMkaTYpCmNhc2UgNjpzPTcKcmV0dXJuIFAualEoTC5H
-Nyh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsbnVsbCxudWxsLCExLG51bGwpLCRhc3luYyRpNikKY2Fz
-ZSA3Oms9ay5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpCmsudG9TdHJpbmcKay5zY3JvbGxUb3A9Si5W
-dShuKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKaD1wCm09SC5SdShoKQpsPUgudHMoaCkKTC5DMigi
-Q291bGQgbm90IGFkZC9yZW1vdmUgaGludCIsbSxsKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpj
-YXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4g
-UC5ESSgkYXN5bmMkaTYscil9LApDMjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9ImV4Y2VwdGlv
-biIsbz0ic3RhY2tUcmFjZSIsbj10LnQuYihiKSYmSi5STShiLnEoMCwic3VjY2VzcyIpLCExKSYmYi54
-NChwKSYmYi54NChvKSxtPUouaWEoYikKaWYobil7cz1ILmgobS5xKGIscCkpCmM9bS5xKGIsbyl9ZWxz
-ZSBzPW0udyhiKQpuPWRvY3VtZW50CnI9bi5xdWVyeVNlbGVjdG9yKCIucG9wdXAtcGFuZSIpCnIucXVl
-cnlTZWxlY3RvcigiaDIiKS5pbm5lclRleHQ9YQpyLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9
-cwpyLnF1ZXJ5U2VsZWN0b3IoInByZSIpLmlubmVyVGV4dD1KLmooYykKcT10LmRkLmEoci5xdWVyeVNl
-bGVjdG9yKCJhLmJvdHRvbSIpKTsocSYmQy54bikuc0xVKHEsUC5YZCgiaHR0cHMiLCJnaXRodWIuY29t
-IiwiZGFydC1sYW5nL3Nkay9pc3N1ZXMvbmV3IixQLkVGKFsidGl0bGUiLCJDdXN0b21lci1yZXBvcnRl
-ZCBpc3N1ZSB3aXRoIE5OQkQgbWlncmF0aW9uIHRvb2w6ICIrYSwibGFiZWxzIix1LmQsImJvZHkiLGEr
-IlxuXG5FcnJvcjogIitILkVqKHMpKyJcblxuUGxlYXNlIGZpbGwgaW4gdGhlIGZvbGxvd2luZzpcblxu
-KipOYW1lIG9mIHBhY2thZ2UgYmVpbmcgbWlncmF0ZWQgKGlmIHB1YmxpYykqKjpcbioqV2hhdCBJIHdh
-cyBkb2luZyB3aGVuIHRoaXMgaXNzdWUgb2NjdXJyZWQqKjpcbioqSXMgaXQgcG9zc2libGUgdG8gd29y
-ayBhcm91bmQgdGhpcyBpc3N1ZSoqOlxuKipIYXMgdGhpcyBpc3N1ZSBoYXBwZW5lZCBiZWZvcmUsIGFu
-ZCBpZiBzbywgaG93IG9mdGVuKio6XG4qKkRhcnQgU0RLIHZlcnNpb24qKjogIitILkVqKG4uZ2V0RWxl
-bWVudEJ5SWQoInNkay12ZXJzaW9uIikudGV4dENvbnRlbnQpKyJcbioqQWRkaXRpb25hbCBkZXRhaWxz
-Kio6XG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuXG5TdGFja3RyYWNlOiBfYXV0byBwb3B1bGF0ZWQgYnkg
-bWlncmF0aW9uIHByZXZpZXcgdG9vbC5fXG5cbmBgYFxuIitILkVqKGMpKyJcbmBgYFxuIl0sdC5YLHQu
-eikpLmduRCgpKQpuPXEuc3R5bGUKbi5kaXNwbGF5PSJpbml0aWFsIgpuPXIuc3R5bGUKbi5kaXNwbGF5
-PSJpbml0aWFsIgpuPWErIjogIitILkVqKGIpCndpbmRvdwppZih0eXBlb2YgY29uc29sZSE9InVuZGVm
-aW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IobikKd2luZG93Cm49SC5FaihjKQppZih0eXBlb2YgY29u
-c29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3Iobil9LAp0MjpmdW5jdGlvbihhLGIp
-e3ZhciBzLHIscSxwLG89dC5nLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKQphLnByZXZlbnREZWZhdWx0
-KCkKcz1vLmdldEF0dHJpYnV0ZSgiaHJlZiIpCnI9TC5VcyhzKQpxPUwuRzYocykKcD1MLmFLKHMpCmlm
-KHEhPW51bGwpTC5hZihyLHEscCxiLG5ldyBMLm5UKHIscSxwKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxs
-LGIsbmV3IEwuTlkocikpfSwKSzA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9ZG9jdW1lbnQucXVlcnlT
-ZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpwLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PSJGYWls
-ZWQgdG8gcmVydW4gZnJvbSBzb3VyY2VzIgpwLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9IlNv
-dXJjZXMgY29udGFpbiBzdGF0aWMgYW5hbHlzaXMgZXJyb3JzOiIKcz1wLnF1ZXJ5U2VsZWN0b3IoInBy
-ZSIpCnI9Si5FbChhLHQuYXcpCnE9SC5MaChyKQpzLmlubmVyVGV4dD1uZXcgSC5sSihyLHEuQygicVUq
-KGxELkUpIikuYShuZXcgTC51ZSgpKSxxLkMoImxKPGxELkUscVUqPiIpKS5rKDAsIlxuIikKcT1wLnF1
-ZXJ5U2VsZWN0b3IoImEuYm90dG9tIikuc3R5bGUKcS5kaXNwbGF5PSJub25lIgpzPXAuc3R5bGUKcy5k
-aXNwbGF5PSJpbml0aWFsIn0sCnZVOmZ1bmN0aW9uKCl7dmFyIHM9ZG9jdW1lbnQKSC5EaCh0LmcsdC5o
-LCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnM9bmV3IFcud3oocy5xdWVyeVNlbGVjdG9yQWxsKCIuY29k
-ZSIpLHQuUikKcy5LKHMsbmV3IEwuZVgoKSl9LApoWDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuWXco
-YSxiLGMpfSwKWXc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxu
-LG0sbCxrLGosaSxoLGcKdmFyICRhc3luYyRoWD1QLmx6KGZ1bmN0aW9uKGQsZSl7aWYoZD09PTEpe3A9
-ZQpzPXF9d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9MwpqPXQuWApzPTYKcmV0dXJuIFAualEo
-TC5RNihhLFAuRUYoWyJyZWdpb24iLCJyZWdpb24iLCJvZmZzZXQiLEguRWooYildLGosaiksdC50KSwk
-YXN5bmMkaFgpCmNhc2UgNjpuPWUKaj1uCmk9Si5VNihqKQptPW5ldyBVLmQyKFUuamYoaS5xKGosImVk
-aXRzIikpLEguaChpLnEoaiwiZXhwbGFuYXRpb24iKSksSC51UChpLnEoaiwibGluZSIpKSxILmgoaS5x
-KGosImRpc3BsYXlQYXRoIikpLEguaChpLnEoaiwidXJpUGF0aCIpKSxVLk5kKGkucShqLCJ0cmFjZXMi
-KSkpCkwuVDEobSkKTC5GcihhLGIsYykKTC55WCgiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiLCEx
-KQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiQ291
-bGQgbm90IGxvYWQgZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNh
-c2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQ
-LkRJKCRhc3luYyRoWCxyKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxiLGMs
-ZCxlKX0sCkw1OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49
-W10sbSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEp
-e289YTAKcz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighSi5wNChhLCIuZGFydCIpKXtM
-LkJFKGEsQi53UigpLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00
-Cmk9dC5YCnM9NwpyZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQu
-dCksJGFzeW5jJEc3KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVz
-KGEpCkwuQlgobCxiKQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1v
-Cms9SC5SdShnKQpqPUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQgZGFydCBmaWxlICIrYSxrLGop
-CnM9NgpicmVhawpjYXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpjYXNlIDE6cmV0dXJuIFAueUMocSxyKQpj
-YXNlIDI6cmV0dXJuIFAuZjMobyxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkRzcscil9LApHZTpmdW5j
-dGlvbigpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoLGcKdmFyICRh
-c3luYyRHZT1QLmx6KGZ1bmN0aW9uKGEsYil7aWYoYT09PTEpe3A9YgpzPXF9d2hpbGUodHJ1ZSlzd2l0
-Y2gocyl7Y2FzZSAwOmg9Ii9fcHJldmlldy9uYXZpZ2F0aW9uVHJlZS5qc29uIgpxPTMKcz02CnJldHVy
-biBQLmpRKEwuUTYoaCxDLkNNLHQuZUUpLCRhc3luYyRHZSkKY2FzZSA2Om49YgptPWRvY3VtZW50LnF1
-ZXJ5U2VsZWN0b3IoIi5uYXYtdHJlZSIpCkoubDUobSwiIikKaj1MLm1LKG4pCiQuSVI9agpMLnRYKG0s
-aiwhMCkKcT0xCnM9NQpicmVhawpjYXNlIDM6cT0yCmc9cApsPUguUnUoZykKaz1ILnRzKGcpCkwuQzIo
-IkNvdWxkIG5vdCBsb2FkIG5hdmlnYXRpb24gdHJlZSIsbCxrKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpi
-cmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpy
-ZXR1cm4gUC5ESSgkYXN5bmMkR2Uscil9LApxTzpmdW5jdGlvbihhKXt2YXIgcyxyPWEuZ2V0Qm91bmRp
-bmdDbGllbnRSZWN0KCkscT1DLkNELnpRKCQuZmkoKS5vZmZzZXRIZWlnaHQpLHA9d2luZG93LmlubmVy
-SGVpZ2h0LG89Qy5DRC56USgkLkRXKCkub2Zmc2V0SGVpZ2h0KQppZih0eXBlb2YgcCE9PSJudW1iZXIi
-KXJldHVybiBwLkhOKCkKcz1yLmJvdHRvbQpzLnRvU3RyaW5nCmlmKHM+cC0obysxNCkpSi5kaChhKQpl
-bHNle3A9ci50b3AKcC50b1N0cmluZwppZihwPHErMTQpSi5kaChhKX19LApmRzpmdW5jdGlvbihhLGIp
-e3ZhciBzLHIscSxwLG8KaWYoYSE9bnVsbCl7cz1kb2N1bWVudApyPXMuZ2V0RWxlbWVudEJ5SWQoIm8i
-K0guRWooYSkpCnE9cy5xdWVyeVNlbGVjdG9yKCIubGluZS0iK0guRWooYikpCmlmKHIhPW51bGwpe0wu
-cU8ocikKSi5kUihyKS5pKDAsInRhcmdldCIpfWVsc2UgaWYocSE9bnVsbClMLnFPKHEucGFyZW50RWxl
-bWVudCkKaWYocSE9bnVsbClKLmRSKHQuZy5hKHEucGFyZW50Tm9kZSkpLmkoMCwiaGlnaGxpZ2h0Iil9
-ZWxzZXtzPWRvY3VtZW50CnA9dC5nCkguRGgocCx0LmgsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKcz1z
-LnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5vIikKbz1uZXcgVy53eihzLHQuUikKaWYoby5nQShvKT09
-PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RIKHMpKSl9fSwKYWY6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2
-YXIgcyxyLHE9TC5HNih3aW5kb3cubG9jYXRpb24uaHJlZikscD1MLmFLKHdpbmRvdy5sb2NhdGlvbi5o
-cmVmKQppZihxIT1udWxsKXtzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKHEpKQppZihz
-IT1udWxsKUouZFIocykubigwLCJ0YXJnZXQiKX1pZihwIT1udWxsKXtyPWRvY3VtZW50LnF1ZXJ5U2Vs
-ZWN0b3IoIi5saW5lLSIrSC5FaihwKSkKaWYociE9bnVsbClKLmRSKHIucGFyZW50RWxlbWVudCkubigw
-LCJoaWdobGlnaHQiKX1pZihhPT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpe0wuZkcoYixjKQplLiQw
-KCl9ZWxzZSBMLkc3KGEsYixjLGQsZSl9LApRNDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1QLmhLKGEp
-LHA9dC5YCnA9UC5GbChwLHApCmZvcihzPXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7cy5GKCk7
-KXtyPXMuZ2woKQpwLlk1KDAsci5hLHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7
-cj1zLmdsKCkKcC5ZNSgwLHIuYSxyLmIpfXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJldHVybiBx
-Lm5tKDAscCkuZ25EKCl9LApUMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaj0kLmhM
-KCkKSi5sNShqLCIiKQppZihhPT1udWxsKXtzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKQpDLkx0
-LnNhNChzLCJTZWUgZGV0YWlscyBhYm91dCBhIHByb3Bvc2VkIGVkaXQuIikKQy5MdC5zUChzLEguVk0o
-WyJwbGFjZWhvbGRlciJdLHQuaSkpCmouYXBwZW5kQ2hpbGQocykKQy5MdC5GRihzKQpyZXR1cm59cj1h
-LmQKcT0kLm5VKCkKcD1xLnpmKHIpCm89YS5iCm49ZG9jdW1lbnQKbT1xLkhQKHIsSi5UMChuLnF1ZXJ5
-U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKQpsPWEuYwprPW4uY3JlYXRlRWxlbWVudCgicCIp
-CmouYXBwZW5kQ2hpbGQoaykKay5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobykrIiBh
-dCAiKSkKcT10LlgKcT1XLko2KEwuUTQoYS5lLFAuRUYoWyJsaW5lIixKLmoobCldLHEscSkpKQpxLmFw
-cGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoSC5FaihtKSsiOiIrSC5FaihsKSsiLiIpKQprLmFwcGVu
-ZENoaWxkKHEpCkouZGgoaykKTC5DQyhhLGoscCkKTC5GeihhLGopfSwKTEg6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT0kLnlQKCkKSi5sNShlLCIiKQppZihiLmdB
-KGIpPT09MCl7cz1kb2N1bWVudApyPXMuY3JlYXRlRWxlbWVudCgicCIpCmUuYXBwZW5kQ2hpbGQocikK
-ci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJObyBwcm9wb3NlZCBlZGl0cyIpKX1lbHNlIGZv
-cihlPWIuZ1B1KGIpLGU9ZS5nbShlKSxzPXQuWCxxPXQuayxwPXEuQygifigxKT8iKSxvPXQuWixxPXEu
-YztlLkYoKTspe249ZS5nbCgpCm09ZG9jdW1lbnQKcj1tLmNyZWF0ZUVsZW1lbnQoInAiKQpsPSQueVAo
-KQpsLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZShILkVqKG4uYSkr
-IjoiKSkKaz1tLmNyZWF0ZUVsZW1lbnQoInVsIikKbC5hcHBlbmRDaGlsZChrKQpmb3Iobj1KLklUKG4u
-Yik7bi5GKCk7KXtsPW4uZ2woKQpqPW0uY3JlYXRlRWxlbWVudCgibGkiKQprLmFwcGVuZENoaWxkKGop
-CkouZFIoaikuaSgwLCJlZGl0IikKaT1tLmNyZWF0ZUVsZW1lbnQoImEiKQpqLmFwcGVuZENoaWxkKGkp
-CmkuY2xhc3NMaXN0LmFkZCgiZWRpdC1saW5rIikKaD1sLmMKZz1ILkVqKGgpCmkuc2V0QXR0cmlidXRl
-KCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoaSkpLk9VKCJvZmZzZXQiKSxnKQpmPWwuYQpnPUguRWoo
-ZikKaS5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhpKSkuT1UoImxpbmUiKSxn
-KQppLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoImxpbmUgIitILkVqKGYpKSkKaS5zZXRBdHRy
-aWJ1dGUoImhyZWYiLEwuUTQod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFAuRUYoWyJsaW5lIixILkVq
-KGYpLCJvZmZzZXQiLEguRWooaCldLHMscykpKQpnPXAuYShuZXcgTC5FRShoLGYsYSkpCm8uYShudWxs
-KQpXLkpFKGksImNsaWNrIixnLCExLHEpCmouYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiOiAi
-K0guRWoobC5iKSkpfX1pZihjKUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
-PXdpbmRvdy5sb2NhdGlvbixwPVAuaEsoKHEmJkMuRXgpLmdEcihxKStILkVqKGEpKQpxPXQuWApxPVAu
-RmwocSxxKQppZihiIT1udWxsKXEuWTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxsKXEuWTUo
-MCwibGluZSIsSC5FaihjKSkKcS5ZNSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcD1wLm5tKDAscSkKcT13
-aW5kb3cuaGlzdG9yeQpzPXQuegpyPXAuZ25EKCkKcS50b1N0cmluZwpxLnB1c2hTdGF0ZShuZXcgUC5C
-ZihbXSxbXSkuUHYoUC5GbChzLHMpKSwiIixyKX0sCkVuOmZ1bmN0aW9uKGEpe3ZhciBzPUouYmIoZG9j
-dW1lbnQucXVlcnlTZWxlY3RvcigiLnJvb3QiKS50ZXh0Q29udGVudCwiLyIpCmlmKEMueEIubkMoYSxz
-KSlyZXR1cm4gQy54Qi55bihhLHMubGVuZ3RoKQplbHNlIHJldHVybiBhfSwKT3Q6ZnVuY3Rpb24oYSl7
-c3dpdGNoKGEucil7Y2FzZSBDLmN3OmJyZWFrCmNhc2UgQy5XRDphLnI9Qy5YagpicmVhawpjYXNlIEMu
-WGo6YS5yPUMuV0QKYnJlYWsKY2FzZSBDLmRjOnRocm93IEguYihQLlBWKCJGaWxlICIrSC5FaihhLmMp
-KyIgc2hvdWxkIG5vdCBoYXZlIGluZGV0ZXJtaW5hdGUgbWlncmF0aW9uIHN0YXR1cyIpKX19LAp4bjpm
-dW5jdGlvbihhLGIpe3ZhciBzLHIscT0iZGlzYWJsZWQiLHA9Yi5nTCgpCkwudGEoYSxwKQppZihiLmM9
-PSQuRDkoKS5pbm5lclRleHQpe3M9YiBpbnN0YW5jZW9mIEwuY0QmJiFILm9UKGIueCkKcj1KLllFKGEp
-CmlmKHMpci5nUChhKS5pKDAscSkKZWxzZSByLmdQKGEpLm4oMCxxKQpMLnRhKCQuYzAoKSxwKX19LAp0
-YTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9ImNoZWNrX2JveCIscT0idGl0bGUiLHA9Im9wdGVkLW91dCIs
-bz0ibWlncmF0aW5nIgpzd2l0Y2goYil7Y2FzZSBDLmN3OmEuaW5uZXJUZXh0PXIKcz1KLllFKGEpCnMu
-Z1AoYSkuaSgwLCJhbHJlYWR5LW1pZ3JhdGVkIikKcy5nUChhKS5pKDAsImRpc2FibGVkIikKYS5zZXRB
-dHRyaWJ1dGUocSwiQWxyZWFkeSBtaWdyYXRlZCIpCmJyZWFrCmNhc2UgQy5XRDphLmlubmVyVGV4dD1y
-CnM9Si5ZRShhKQpzLmdQKGEpLm4oMCxwKQpzLmdQKGEpLmkoMCxvKQphLnNldEF0dHJpYnV0ZShxLCJN
-aWdyYXRpbmcgdG8gbnVsbCBzYWZldHkiKQpicmVhawpjYXNlIEMuWGo6YS5pbm5lclRleHQ9ImNoZWNr
-X2JveF9vdXRsaW5lX2JsYW5rIgpzPUouWUUoYSkKcy5nUChhKS5uKDAsbykKcy5nUChhKS5pKDAscCkK
-YS5zZXRBdHRyaWJ1dGUocSwiT3B0aW5nIG91dCBvZiBudWxsIHNhZmV0eSIpCmJyZWFrCmRlZmF1bHQ6
-YS5pbm5lclRleHQ9ImluZGV0ZXJtaW5hdGVfY2hlY2tfYm94IgpzPUouWUUoYSkKcy5nUChhKS5uKDAs
-bykKcy5nUChhKS5pKDAscCkKYS5zZXRBdHRyaWJ1dGUocSwiTWl4ZWQgc3RhdHVzZXMgb2YgJ21pZ3Jh
-dGluZycgYW5kICdvcHRpbmcgb3V0JyIpCmJyZWFrfX0sCkJYOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
-PXt9CnEuYT1hCmE9TC5FbihhKQpxLmE9YQpKLmRyKCQuRDkoKSxhKQpzPWRvY3VtZW50CkguRGgodC5n
-LHQuaCwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgi
-Lm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlIpCnMuSyhzLG5ldyBMLlZTKHEpKQpKLmRSKCQuYk4oKSku
-aSgwLCJ2aXNpYmxlIikKcj1MLm1IKCQuSVIscS5hKQpMLnRhKCQuYzAoKSxyLmdMKCkpfSwKQVI6ZnVu
-Y3Rpb24oYSxiKXt2YXIgcyxyLHE9Yi5iCmlmKHEhPW51bGwpe3M9dC5nCnI9cy5hKHMuYShhLnBhcmVu
-dE5vZGUpLnBhcmVudE5vZGUpCkwueG4oci5xdWVyeVNlbGVjdG9yKCI6c2NvcGUgPiAuc3RhdHVzLWlj
-b24iKSxxKQpMLkFSKHIscSl9fSwKaGw6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbT0iOnNj
-b3BlID4gLnN0YXR1cy1pY29uIgpmb3Iocz1iLmQscj1zLmxlbmd0aCxxPXQuZyxwPTA7cDxzLmxlbmd0
-aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3BdCm49YS5xdWVyeVNlbGVjdG9yKCdb
-ZGF0YS1uYW1lKj0iJytILkVqKG8uYykrJyJdJykKaWYobyBpbnN0YW5jZW9mIEwudnQpe0wuaGwobixv
-KQpMLnhuKG4ucXVlcnlTZWxlY3RvcihtKSxiKX1lbHNlIEwueG4ocS5hKG4ucGFyZW50Tm9kZSkucXVl
-cnlTZWxlY3RvcihtKSxvKX19LApCRTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Ii5yZWdpb25zIixyPWRv
-Y3VtZW50LHE9ci5xdWVyeVNlbGVjdG9yKHMpLHA9ci5xdWVyeVNlbGVjdG9yKCIuY29kZSIpCkoudEgo
-cSxiLmEsJC5LRygpKQpKLnRIKHAsYi5iLCQuS0coKSkKTC5MSChhLGIuZCxjKQppZihiLmMubGVuZ3Ro
-PDJlNSlMLnZVKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwKdFg6ZnVuY3Rpb24oYTEsYTIs
-YTMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGM9Im1hdGVyaWFsLWljb25zIixi
-PSJzdGF0dXMtaWNvbiIsYT1kb2N1bWVudCxhMD1hLmNyZWF0ZUVsZW1lbnQoInVsIikKYTEuYXBwZW5k
-Q2hpbGQoYTApCmZvcihzPWEyLmxlbmd0aCxyPXQuWCxxPXQuWixwPTA7cDxhMi5sZW5ndGg7YTIubGVu
-Z3RoPT09c3x8KDAsSC5saykoYTIpLCsrcCl7bz1hMltwXQpuPWEuY3JlYXRlRWxlbWVudCgibGkiKQph
-MC5hcHBlbmRDaGlsZChuKQppZihvIGluc3RhbmNlb2YgTC52dCl7bT1KLllFKG4pCm0uZ1AobikuaSgw
-LCJkaXIiKQpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PVSgibmFt
-ZSIpLG8uYykKbD1hLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLmFwcGVuZENoaWxkKGwpCms9Si5ZRShs
-KQprLmdQKGwpLmkoMCwiYXJyb3ciKQprLnNoZihsLCImI3gyNUJDOyIpCmo9YS5jcmVhdGVFbGVtZW50
-KCJzcGFuIikKSi5kUihqKS5pKDAsYykKai5pbm5lclRleHQ9ImZvbGRlcl9vcGVuIgpuLmFwcGVuZENo
-aWxkKGopCm4uYXBwZW5kQ2hpbGQoYS5jcmVhdGVUZXh0Tm9kZShvLmEpKQpMLnRYKG4sby5kLCEwKQpp
-PWEuY3JlYXRlRWxlbWVudCgic3BhbiIpCms9Si5ZRShpKQprLmdQKGkpLmkoMCxjKQppLmlubmVyVGV4
-dD0iaW5kZXRlcm1pbmF0ZV9jaGVja19ib3giCmsuZ1AoaSkuaSgwLGIpCkwueG4oaSxvKQprPWsuZ1Zs
-KGkpCmg9ay4kdGkKZz1oLkMoIn4oMSk/IikuYShuZXcgTC5URChvLG4saSkpCnEuYShudWxsKQpXLkpF
-KGsuYSxrLmIsZywhMSxoLmMpCm0ubUsobixpLGopCkwua3oobCl9ZWxzZSBpZihvIGluc3RhbmNlb2Yg
-TC5jRCl7aT1hLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQptPUouWUUoaSkKbS5nUChpKS5pKDAsYykKaS5p
-bm5lclRleHQ9IiIKbS5nUChpKS5pKDAsYikKaz1ILm9UKG8ueCkKaWYoIWspbS5nUChpKS5pKDAsImRp
-c2FibGVkIikKTC54bihpLG8pCmlmKGspe209bS5nVmwoaSkKaz1tLiR0aQpoPWsuQygifigxKT8iKS5h
-KG5ldyBMLklmKG8saSxuKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCExLGsuYyl9bi5hcHBlbmRD
-aGlsZChpKQptPWEuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIobSkuaSgwLGMpCm0uaW5uZXJUZXh0
-PSJpbnNlcnRfZHJpdmVfZmlsZSIKbi5hcHBlbmRDaGlsZChtKQpmPWEuY3JlYXRlRWxlbWVudCgiYSIp
-Cm4uYXBwZW5kQ2hpbGQoZikKbT1KLllFKGYpCm0uZ1AoZikuaSgwLCJuYXYtbGluayIpCmYuc2V0QXR0
-cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoZikpLk9VKCJuYW1lIiksby5jKQpmLnNldEF0
-dHJpYnV0ZSgiaHJlZiIsTC5RNChvLmQsUC5GbChyLHIpKSkKZi5hcHBlbmRDaGlsZChhLmNyZWF0ZVRl
-eHROb2RlKG8uYSkpCm09bS5nVmwoZikKaz1tLiR0aQpoPWsuQygifigxKT8iKS5hKG5ldyBMLnRCKCkp
-CnEuYShudWxsKQpXLkpFKG0uYSxtLmIsaCwhMSxrLmMpCmU9by5lCmlmKHR5cGVvZiBlIT09Im51bWJl
-ciIpcmV0dXJuIGUub3MoKQppZihlPjApe2Q9YS5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBlbmRD
-aGlsZChkKQpKLmRSKGQpLmkoMCwiZWRpdC1jb3VudCIpCm09IiIrZSsiICIKaWYoZT09PTEpaz0icHJv
-cG9zZWQgZWRpdCIKZWxzZSBrPSJwcm9wb3NlZCBlZGl0cyIKZC5zZXRBdHRyaWJ1dGUoInRpdGxlIixt
-K2spCmQuYXBwZW5kQ2hpbGQoYS5jcmVhdGVUZXh0Tm9kZShDLmpuLncoZSkpKX19fX0sCnV6OmZ1bmN0
-aW9uKGEsYixjKXt2YXIgcz1kb2N1bWVudCxyPXMuY3JlYXRlRWxlbWVudCgiYnV0dG9uIikscT10Lmss
-cD1xLkMoIn4oMSk/IikuYShuZXcgTC5tMihhLGMpKQp0LlouYShudWxsKQpXLkpFKHIsImNsaWNrIixw
-LCExLHEuYykKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKE0uT1goYS5hKSkpCmIuYXBwZW5k
-Q2hpbGQocil9LApGejpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaD1hLmEK
-aWYoaD09bnVsbClyZXR1cm4Kcz1kb2N1bWVudApyPXMuY3JlYXRlRWxlbWVudCgicCIpCnE9Yi5hcHBl
-bmRDaGlsZChyKQpyPXMuY3JlYXRlRWxlbWVudCgic3BhbiIpCnA9dC5pCkouTXUocixILlZNKFsidHlw
-ZS1kZXNjcmlwdGlvbiJdLHApKQpyLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIkFjdGlvbnMi
-KSkKcS5hcHBlbmRDaGlsZChyKQpxLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIjoiKSkKbz1z
-LmNyZWF0ZUVsZW1lbnQoInAiKQpiLmFwcGVuZENoaWxkKG8pCmZvcihyPWgubGVuZ3RoLG49dC5RLG09
-MDttPGgubGVuZ3RoO2gubGVuZ3RoPT09cnx8KDAsSC5saykoaCksKyttKXtsPWhbbV0Kaz1zLmNyZWF0
-ZUVsZW1lbnQoImEiKQpvLmFwcGVuZENoaWxkKGspCmsuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9k
-ZShsLmEpKQprLnNldEF0dHJpYnV0ZSgiaHJlZiIsbC5iKQpqPW4uYShILlZNKFsiYWRkLWhpbnQtbGlu
-ayIsImJlZm9yZS1hcHBseSIsImJ1dHRvbiJdLHApKQppPUouZFIoaykKaS5WMSgwKQppLkZWKDAsail9
-fSwKQ0M6ZnVuY3Rpb24oYTQsYTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxk
-LGMsYixhLGEwLGExLGEyLGEzCmZvcihzPWE0LmYscj1zLmxlbmd0aCxxPXQuaSxwPXQuUSxvPTA7bzxz
-Lmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrbyl7bj1zW29dCm09ZG9jdW1lbnQKbD1t
-LmNyZWF0ZUVsZW1lbnQoInAiKQprPXAuYShILlZNKFsidHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEo
-MCkKai5GVigwLGspCmk9YTUuYXBwZW5kQ2hpbGQobCkKbD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpr
-PXAuYShILlZNKFsidHlwZS1kZXNjcmlwdGlvbiJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAs
-aykKbC5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKG4uYSkpCmkuYXBwZW5kQ2hpbGQobCkKaS5h
-cHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCI6IikpCmw9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCms9
-cC5hKEguVk0oWyJ0cmFjZSJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaD1pLmFwcGVu
-ZENoaWxkKGwpCmZvcihsPW4uYixrPWwubGVuZ3RoLGc9MDtnPGwubGVuZ3RoO2wubGVuZ3RoPT09a3x8
-KDAsSC5saykobCksKytnKXtmPWxbZ10KZT1tLmNyZWF0ZUVsZW1lbnQoImxpIikKaC5hcHBlbmRDaGls
-ZChlKQpkPW0uY3JlYXRlRWxlbWVudCgic3BhbiIpCmM9cC5hKEguVk0oWyJmdW5jdGlvbiJdLHEpKQpq
-PUouZFIoZCkKai5WMSgwKQpqLkZWKDAsYykKYz1mLmIKTC5rRChkLGM9PW51bGw/InVua25vd24iOmMp
-CmUuYXBwZW5kQ2hpbGQoZCkKYj1mLmMKaWYoYiE9bnVsbCl7ZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRl
-eHROb2RlKCIgKCIpKQphPWIuYgphMD1tLmNyZWF0ZUVsZW1lbnQoImEiKQphMC5hcHBlbmRDaGlsZCht
-LmNyZWF0ZVRleHROb2RlKEguRWooYi5jKSsiOiIrSC5FaihhKSkpCmEwLnNldEF0dHJpYnV0ZSgiaHJl
-ZiIsYi5hKQphMC5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIpCmUuYXBwZW5kQ2hpbGQoYTApCmUuYXBw
-ZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiKSIpKX1lLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5v
-ZGUoIjogIikpCmQ9Zi5hCkwua0QoZSxkPT1udWxsPyJ1bmtub3duIjpkKQpkPWYuZAppZihkLmxlbmd0
-aCE9PTApe2M9bS5jcmVhdGVFbGVtZW50KCJwIikKYTE9cC5hKEguVk0oWyJkcmF3ZXIiLCJiZWZvcmUt
-YXBwbHkiXSxxKSkKaj1KLmRSKGMpCmouVjEoMCkKai5GVigwLGExKQphMj1lLmFwcGVuZENoaWxkKGMp
-CmZvcihjPWQubGVuZ3RoLGEzPTA7YTM8ZC5sZW5ndGg7ZC5sZW5ndGg9PT1jfHwoMCxILmxrKShkKSwr
-K2EzKUwudXooZFthM10sYTIsYil9fX19LApVczpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS50Zyhh
-LCI/Iik/Qy54Qi5OaihhLDAsQy54Qi5PWShhLCI/IikpOmF9LAprRDpmdW5jdGlvbihhLGIpe3ZhciBz
-LHIscT1ILlZNKGIuc3BsaXQoIi4iKSx0LnMpLHA9Qy5ObS5ndEgocSksbz1kb2N1bWVudAphLmFwcGVu
-ZENoaWxkKG8uY3JlYXRlVGV4dE5vZGUocCkpCmZvcihwPUgucUMocSwxLG51bGwsdC5OKSxwPW5ldyBI
-LmE3KHAscC5nQShwKSxwLiR0aS5DKCJhNzxhTC5FPiIpKSxzPUouWUUoYSk7cC5GKCk7KXtyPXAuZApz
-Lm56KGEsImJlZm9yZWVuZCIsIiYjODIwMzsuIixudWxsLG51bGwpCmEuYXBwZW5kQ2hpbGQoby5jcmVh
-dGVUZXh0Tm9kZShyKSl9fSwKbUg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscApmb3Iocz1hLmxlbmd0
-aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcil7cT1hW3JdCmlmKHEg
-aW5zdGFuY2VvZiBMLnZ0KXtwPUwubUgocS5kLGIpCmlmKHAhPW51bGwpcmV0dXJuIHB9ZWxzZSBpZihx
-LmM9PWIpcmV0dXJuIHF9cmV0dXJuIG51bGx9LAplOmZ1bmN0aW9uIGUoKXt9LApWVzpmdW5jdGlvbiBW
-VyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApvWjpmdW5jdGlvbiBvWigpe30sCmpy
-OmZ1bmN0aW9uIGpyKCl7fSwKcWw6ZnVuY3Rpb24gcWwoKXt9LApIaTpmdW5jdGlvbiBIaSgpe30sCkJU
-OmZ1bmN0aW9uIEJUKCl7fSwKUFk6ZnVuY3Rpb24gUFkoKXt9LAp1ODpmdW5jdGlvbiB1OCgpe30sCkw6
-ZnVuY3Rpb24gTCgpe30sCld4OmZ1bmN0aW9uIFd4KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBTzpm
-dW5jdGlvbiBBTyhhKXt0aGlzLmE9YX0sCmROOmZ1bmN0aW9uIGROKGEpe3RoaXMuYT1hfSwKSG86ZnVu
-Y3Rpb24gSG8oYSl7dGhpcy5hPWF9LAp4ejpmdW5jdGlvbiB4eihhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKSUM6ZnVuY3Rpb24gSUMoKXt9LApmQzpmdW5jdGlvbiBmQyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKblQ6ZnVuY3Rpb24gblQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKTlk6ZnVu
-Y3Rpb24gTlkoYSl7dGhpcy5hPWF9LAp1ZTpmdW5jdGlvbiB1ZSgpe30sCmVYOmZ1bmN0aW9uIGVYKCl7
-fSwKRUU6ZnVuY3Rpb24gRUUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKUUw6ZnVu
-Y3Rpb24gUUwoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClZTOmZ1bmN0aW9uIFZTKGEpe3RoaXMuYT1h
-fSwKVEQ6ZnVuY3Rpb24gVEQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKSWY6ZnVu
-Y3Rpb24gSWYoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKdEI6ZnVuY3Rpb24gdEIo
-KXt9LAptMjpmdW5jdGlvbiBtMihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWEE6ZnVuY3Rpb24gWEEo
-KXt9LApaczpmdW5jdGlvbihhKXt2YXIgcyxyLHE9Si5VNihhKQppZihMLnAyKEguaChxLnEoYSwidHlw
-ZSIpKSk9PT1DLlkyKXtzPUguaChxLnEoYSwibmFtZSIpKQpyPUguaChxLnEoYSwicGF0aCIpKQpxPXEu
-cShhLCJzdWJ0cmVlIikKcT1uZXcgTC52dChxPT1udWxsP251bGw6TC5tSyhxKSxzLHIpCnEuTFYoKQpy
-ZXR1cm4gcX1lbHNle3M9SC5oKHEucShhLCJuYW1lIikpCnI9SC5oKHEucShhLCJwYXRoIikpCnJldHVy
-biBuZXcgTC5jRChILmgocS5xKGEsImhyZWYiKSksSC51UChxLnEoYSwiZWRpdENvdW50IikpLEgueTgo
-cS5xKGEsIndhc0V4cGxpY2l0bHlPcHRlZE91dCIpKSxMLnZCKEgudVAocS5xKGEsIm1pZ3JhdGlvblN0
-YXR1cyIpKSksSC55OChxLnEoYSwibWlncmF0aW9uU3RhdHVzQ2FuQmVDaGFuZ2VkIikpLHMscil9fSwK
-bUs6ZnVuY3Rpb24oYSl7dmFyIHMscj1ILlZNKFtdLHQuY1EpCmZvcihzPUouSVQodC5VLmEoYSkpO3Mu
-RigpOylyLnB1c2goTC5acyhzLmdsKCkpKQpyZXR1cm4gcn0sClZEOmZ1bmN0aW9uKGEpe3ZhciBzLHIs
-cT1ILlZNKFtdLHQuRykKZm9yKHM9YS5sZW5ndGgscj0wO3I8YS5sZW5ndGg7YS5sZW5ndGg9PT1zfHwo
-MCxILmxrKShhKSwrK3IpcS5wdXNoKGFbcl0uTHQoKSkKcmV0dXJuIHF9LAp2QjpmdW5jdGlvbihhKXtp
-ZihhPT1udWxsKXJldHVybiBudWxsCmlmKGE+Pj4wIT09YXx8YT49NClyZXR1cm4gSC5PSChDLmwwLGEp
-CnJldHVybiBDLmwwW2FdfSwKcDI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5Ijpy
-ZXR1cm4gQy5ZMgpjYXNlImZpbGUiOnJldHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVu
-cmVjb2duaXplZCBuYXZpZ2F0aW9uIHRyZWUgbm9kZSB0eXBlOiAiK0guRWooYSkpKX19LAp2dDpmdW5j
-dGlvbiB2dChhLGIsYyl7dmFyIF89dGhpcwpfLmQ9YQpfLmE9YgpfLmI9bnVsbApfLmM9Y30sCmNEOmZ1
-bmN0aW9uIGNEKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWQK
-Xy54PWUKXy5hPWYKXy5iPW51bGwKXy5jPWd9LApEODpmdW5jdGlvbiBEOCgpe30sCk85OmZ1bmN0aW9u
-IE85KGEpe3RoaXMuYj1hfSwKR2I6ZnVuY3Rpb24gR2IoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCklW
-OmZ1bmN0aW9uIElWKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxY
-PXsKQ0w6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG49Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51
-bGwpYT1KLktWKGEsbi5sZW5ndGgpCnM9dC5zCnI9SC5WTShbXSxzKQpxPUguVk0oW10scykKcz1hLmxl
-bmd0aAppZihzIT09MCYmYi5yNChDLnhCLlcoYSwwKSkpe2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpD
-Lk5tLmkocSxhWzBdKQpwPTF9ZWxzZXtDLk5tLmkocSwiIikKcD0wfWZvcihvPXA7bzxzOysrbylpZihi
-LnI0KEMueEIuVyhhLG8pKSl7Qy5ObS5pKHIsQy54Qi5OaihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9
-bysxfWlmKHA8cyl7Qy5ObS5pKHIsQy54Qi55bihhLHApKQpDLk5tLmkocSwiIil9cmV0dXJuIG5ldyBY
-LldEKGIsbixyLHEpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
-YgpfLmQ9YwpfLmU9ZH0sCkk3OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWC5kdihhKX0sCmR2OmZ1bmN0
-aW9uIGR2KGEpe3RoaXMuYT1hfX0sTz17ClJoOmZ1bmN0aW9uKCl7dmFyIHMscj1udWxsCmlmKFAudW8o
-KS5nRmkoKSE9PSJmaWxlIilyZXR1cm4gJC5FYigpCnM9UC51bygpCmlmKCFDLnhCLlRjKHMuZ0lpKHMp
-LCIvIikpcmV0dXJuICQuRWIoKQppZihQLktMKHIsImEvYiIscixyLHIscixyKS50NCgpPT09ImFcXGIi
-KXJldHVybiAkLktrKCkKcmV0dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpMKCl7fX0sRT17T0Y6ZnVu
-Y3Rpb24gT0YoYSxiLGMpe3RoaXMuZD1hCnRoaXMuZT1iCnRoaXMuZj1jfX0sRj17cnU6ZnVuY3Rpb24g
-cnUoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19LEQ9ewphYjpmdW5j
-dGlvbigpe3ZhciBzLHIscSxwLG89bnVsbAp0cnl7bz1QLnVvKCl9Y2F0Y2gocyl7aWYodC5nOC5iKEgu
-UnUocykpKXtyPSQuRmYKaWYociE9bnVsbClyZXR1cm4gcgp0aHJvdyBzfWVsc2UgdGhyb3cgc31pZihK
-LlJNKG8sJC5JNikpe3I9JC5GZgpyLnRvU3RyaW5nCnJldHVybiByfSQuSTY9bwppZigkLkhrKCk9PSQu
-RWIoKSlyPSQuRmY9by5aSSgiLiIpLncoMCkKZWxzZXtxPW8udDQoKQpwPXEubGVuZ3RoLTEKcj0kLkZm
-PXA9PT0wP3E6Qy54Qi5OaihxLDAscCl9ci50b1N0cmluZwpyZXR1cm4gcn19CnZhciB3PVtDLEgsSixQ
-LFcsTSxVLEIsVCxMLFgsTyxFLEYsRF0KaHVua0hlbHBlcnMuc2V0RnVuY3Rpb25OYW1lc0lmTmVjZXNz
-YXJ5KHcpCnZhciAkPXt9CkguRksucHJvdG90eXBlPXt9CkouR3YucHJvdG90eXBlPXsKRE46ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gYT09PWJ9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEoYSl9LAp3OmZ1
-bmN0aW9uKGEpe3JldHVybiJJbnN0YW5jZSBvZiAnIitILkVqKEguTShhKSkrIicifSwKZTc6ZnVuY3Rp
-b24oYSxiKXt0Lm8uYShiKQp0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9
-fQpKLnlFLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdpTzpmdW5j
-dGlvbihhKXtyZXR1cm4gYT81MTkwMTg6MjE4MTU5fSwKJGlhMjoxfQpKLndlLnByb3RvdHlwZT17CkRO
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWJ9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0s
-CmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU2oo
-YSx0Lm8uYShiKSl9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVy
-biAwfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlw
-ZT17fQpKLmtkLnByb3RvdHlwZT17fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9
-YVskLncoKV0KaWYocz09bnVsbClyZXR1cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0
-aW9uIGZvciAiK0guRWooSi5qKHMpKX0sCiRpRUg6MX0KSi5qZC5wcm90b3R5cGU9ewpkcjpmdW5jdGlv
-bihhLGIpe3JldHVybiBuZXcgSC5qVihhLEgudDYoYSkuQygiQDwxPiIpLktxKGIpLkMoImpWPDEsMj4i
-KSl9LAppOmZ1bmN0aW9uKGEsYil7SC50NihhKS5jLmEoYikKaWYoISFhLmZpeGVkJGxlbmd0aClILnYo
-UC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0OmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoISFhLmZpeGVk
-JGxlbmd0aClILnYoUC5MNCgicmVtb3ZlQXQiKSkKcz1hLmxlbmd0aAppZihiPj1zKXRocm93IEguYihQ
-Lk83KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKVUc6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciBzLHIKSC50NihhKS5DKCJjWDwxPiIpLmEoYykKaWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgi
-aW5zZXJ0QWxsIikpClAud0EoYiwwLGEubGVuZ3RoLCJpbmRleCIpCmlmKCF0LmQuYihjKSljPUouUlgo
-YykKcz1KLkhtKGMpCmEubGVuZ3RoPWEubGVuZ3RoK3MKcj1iK3MKdGhpcy5ZVyhhLHIsYS5sZW5ndGgs
-YSxiKQp0aGlzLnZnKGEsYixyLGMpfSwKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgcwpILnQ2KGEpLkMoImNY
-PDE+IikuYShiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGRBbGwiKSkKaWYoQXJyYXku
-aXNBcnJheShiKSl7dGhpcy5LaChhLGIpCnJldHVybn1mb3Iocz1KLklUKGIpO3MuRigpOylhLnB1c2go
-cy5nbCgpKX0sCktoOmZ1bmN0aW9uKGEsYil7dmFyIHMscgp0LmIuYShiKQpzPWIubGVuZ3RoCmlmKHM9
-PT0wKXJldHVybgppZihhPT09Yil0aHJvdyBILmIoUC5hNChhKSkKZm9yKHI9MDtyPHM7KytyKWEucHVz
-aChiW3JdKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILnQ2KGEpCnJldHVybiBuZXcgSC5sSihh
-LHMuS3EoYykuQygiMSgyKSIpLmEoYikscy5DKCJAPDE+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCms6
-ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPVAuTzgoYS5sZW5ndGgsIiIsITEsdC5OKQpmb3Iocz0wO3M8YS5s
-ZW5ndGg7KytzKXRoaXMuWTUocixzLEguRWooYVtzXSkpCnJldHVybiByLmpvaW4oYil9LAplUjpmdW5j
-dGlvbihhLGIpe3JldHVybiBILnFDKGEsYixudWxsLEgudDYoYSkuYyl9LApOMDpmdW5jdGlvbihhLGIs
-YyxkKXt2YXIgcyxyLHEKZC5hKGIpCkgudDYoYSkuS3EoZCkuQygiMSgxLDIpIikuYShjKQpzPWEubGVu
-Z3RoCmZvcihyPWIscT0wO3E8czsrK3Epe3I9Yy4kMihyLGFbcV0pCmlmKGEubGVuZ3RoIT09cyl0aHJv
-dyBILmIoUC5hNChhKSl9cmV0dXJuIHJ9LApIdDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8KSC50
-NihhKS5DKCJhMigxKSIpLmEoYikKcz1hLmxlbmd0aApmb3Iocj1udWxsLHE9ITEscD0wO3A8czsrK3Ap
-e289YVtwXQppZihILm9UKGIuJDEobykpKXtpZihxKXRocm93IEguYihILkFtKCkpCnI9bwpxPSEwfWlm
-KHMhPT1hLmxlbmd0aCl0aHJvdyBILmIoUC5hNChhKSl9aWYocSlyZXR1cm4gcgp0aHJvdyBILmIoSC5X
-cCgpKX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikK
-cmV0dXJuIGFbYl19LApndEg6ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQp0aHJv
-dyBILmIoSC5XcCgpKX0sCmdyWjpmdW5jdGlvbihhKXt2YXIgcz1hLmxlbmd0aAppZihzPjApcmV0dXJu
-IGFbcy0xXQp0aHJvdyBILmIoSC5XcCgpKX0sCllXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixx
-LHAsbwpILnQ2KGEpLkMoImNYPDE+IikuYShkKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC52KFAuTDQo
-InNldFJhbmdlIikpClAuakIoYixjLGEubGVuZ3RoKQpzPWMtYgppZihzPT09MClyZXR1cm4KUC5rMShl
-LCJza2lwQ291bnQiKQppZih0LmouYihkKSl7cj1kCnE9ZX1lbHNle3I9Si5BNShkLGUpLnR0KDAsITEp
-CnE9MH1wPUouVTYocikKaWYocStzPnAuZ0EocikpdGhyb3cgSC5iKEguYXIoKSkKaWYocTxiKWZvcihv
-PXMtMTtvPj0wOy0tbylhW2Irb109cC5xKHIscStvKQplbHNlIGZvcihvPTA7bzxzOysrbylhW2Irb109
-cC5xKHIscStvKX0sCnZnOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQsMCl9
-LApWcjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC50NihhKS5DKCJhMigxKSIpLmEoYikKcz1hLmxlbmd0
-aApmb3Iocj0wO3I8czsrK3Ipe2lmKEgub1QoYi4kMShhW3JdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGgh
-PT1zKXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4hMX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHMKZm9y
-KHM9MDtzPGEubGVuZ3RoOysrcylpZihKLlJNKGFbc10sYikpcmV0dXJuITAKcmV0dXJuITF9LApnbDA6
-ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoPT09MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5s
-ZW5ndGghPT0wfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfSwKdHQ6ZnVuY3Rp
-b24oYSxiKXt2YXIgcz1ILlZNKGEuc2xpY2UoMCksSC50NihhKSkKcmV0dXJuIHN9LApicjpmdW5jdGlv
-bihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX0sCmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSi5tMShh
-LGEubGVuZ3RoLEgudDYoYSkuQygibTE8MT4iKSl9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEo
-YSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApzQTpmdW5jdGlvbihhLGIpe2lmKCEh
-YS5maXhlZCRsZW5ndGgpSC52KFAuTDQoInNldCBsZW5ndGgiKSkKaWYoYjwwKXRocm93IEguYihQLlRF
-KGIsMCxudWxsLCJuZXdMZW5ndGgiLG51bGwpKQphLmxlbmd0aD1ifSwKcTpmdW5jdGlvbihhLGIpe0gu
-dVAoYikKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4gYVtiXX0s
-Clk1OmZ1bmN0aW9uKGEsYixjKXtILnQ2KGEpLmMuYShjKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC52
-KFAuTDQoImluZGV4ZWQgc2V0IikpCmlmKGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEguSFkoYSxi
-KSkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSi5Qby5wcm90b3R5cGU9e30KSi5tMS5w
-cm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHMs
-cj10aGlzLHE9ci5hLHA9cS5sZW5ndGgKaWYoci5iIT09cCl0aHJvdyBILmIoSC5sayhxKSkKcz1yLmMK
-aWYocz49cCl7ci5zTShudWxsKQpyZXR1cm4hMX1yLnNNKHFbc10pOysrci5jCnJldHVybiEwfSwKc006
-ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRpQW46MX0KSi5xSS5wcm90
-b3R5cGU9ewp6UTpmdW5jdGlvbihhKXtpZihhPjApe2lmKGEhPT0xLzApcmV0dXJuIE1hdGgucm91bmQo
-YSl9ZWxzZSBpZihhPi0xLzApcmV0dXJuIDAtTWF0aC5yb3VuZCgwLWEpCnRocm93IEguYihQLkw0KCIi
-K2ErIi5yb3VuZCgpIikpfSwKdzpmdW5jdGlvbihhKXtpZihhPT09MCYmMS9hPDApcmV0dXJuIi0wLjAi
-CmVsc2UgcmV0dXJuIiIrYX0sCmdpTzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvPWF8MAppZihhPT09
-bylyZXR1cm4gbyY1MzY4NzA5MTEKcz1NYXRoLmFicyhhKQpyPU1hdGgubG9nKHMpLzAuNjkzMTQ3MTgw
-NTU5OTQ1M3wwCnE9TWF0aC5wb3coMixyKQpwPXM8MT9zL3E6cS9zCnJldHVybigocCo5MDA3MTk5MjU0
-NzQwOTkyfDApKyhwKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytyKjEyNTkmNTM2ODcwOTExfSwK
-elk6ZnVuY3Rpb24oYSxiKXt2YXIgcz1hJWIKaWYocz09PTApcmV0dXJuIDAKaWYocz4wKXJldHVybiBz
-CmlmKGI8MClyZXR1cm4gcy1iCmVsc2UgcmV0dXJuIHMrYn0sCkJVOmZ1bmN0aW9uKGEsYil7cmV0dXJu
-KGF8MCk9PT1hP2EvYnwwOnRoaXMuREooYSxiKX0sCkRKOmZ1bmN0aW9uKGEsYil7dmFyIHM9YS9iCmlm
-KHM+PS0yMTQ3NDgzNjQ4JiZzPD0yMTQ3NDgzNjQ3KXJldHVybiBzfDAKaWYocz4wKXtpZihzIT09MS8w
-KXJldHVybiBNYXRoLmZsb29yKHMpfWVsc2UgaWYocz4tMS8wKXJldHVybiBNYXRoLmNlaWwocykKdGhy
-b3cgSC5iKFAuTDQoIlJlc3VsdCBvZiB0cnVuY2F0aW5nIGRpdmlzaW9uIGlzICIrSC5FaihzKSsiOiAi
-K0guRWooYSkrIiB+LyAiK2IpKX0sCndHOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT4wKXM9dGhpcy5w
-MyhhLGIpCmVsc2V7cz1iPjMxPzMxOmIKcz1hPj5zPj4+MH1yZXR1cm4gc30sCmJmOmZ1bmN0aW9uKGEs
-Yil7aWYoYjwwKXRocm93IEguYihILnRMKGIpKQpyZXR1cm4gdGhpcy5wMyhhLGIpfSwKcDM6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gYj4zMT8wOmE+Pj5ifSwKJGlDUDoxLAokaVpaOjF9CkouYlUucHJvdG90eXBl
-PXskaUIyOjF9CkouVkEucHJvdG90eXBlPXt9CkouRHIucHJvdG90eXBlPXsKTzI6ZnVuY3Rpb24oYSxi
-KXtpZihiPDApdGhyb3cgSC5iKEguSFkoYSxiKSkKaWYoYj49YS5sZW5ndGgpSC52KEguSFkoYSxiKSkK
-cmV0dXJuIGEuY2hhckNvZGVBdChiKX0sClc6ZnVuY3Rpb24oYSxiKXtpZihiPj1hLmxlbmd0aCl0aHJv
-dyBILmIoSC5IWShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKZGQ6ZnVuY3Rpb24oYSxiKXty
-ZXR1cm4gbmV3IEgudW4oYixhLDApfSwKaDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5n
-Iil0aHJvdyBILmIoUC5MMyhiLG51bGwsbnVsbCkpCnJldHVybiBhK2J9LApUYzpmdW5jdGlvbihhLGIp
-e3ZhciBzPWIubGVuZ3RoLHI9YS5sZW5ndGgKaWYocz5yKXJldHVybiExCnJldHVybiBiPT09dGhpcy55
-bihhLHItcyl9LAppNzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1QLmpCKGIsYyxhLmxlbmd0aCkscj1h
-LnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmcocykKcmV0dXJuIHIrZCtxfSwKUWk6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgs
-bnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1h
-LnN1YnN0cmluZyhjLHMpfSwKbkM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RaShhLGIsMCl9LApO
-ajpmdW5jdGlvbihhLGIsYyl7aWYoYz09bnVsbCljPWEubGVuZ3RoCmlmKGI8MCl0aHJvdyBILmIoUC5P
-NyhiLG51bGwpKQppZihiPmMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkKaWYoYz5hLmxlbmd0aCl0aHJv
-dyBILmIoUC5PNyhjLG51bGwpKQpyZXR1cm4gYS5zdWJzdHJpbmcoYixjKX0sCnluOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIHRoaXMuTmooYSxiLG51bGwpfSwKaGM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9Mb3dl
-ckNhc2UoKX0sCmJTOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEudHJpbSgpLG89cC5sZW5ndGgKaWYo
-bz09PTApcmV0dXJuIHAKaWYodGhpcy5XKHAsMCk9PT0xMzMpe3M9Si5tbShwLDEpCmlmKHM9PT1vKXJl
-dHVybiIifWVsc2Ugcz0wCnI9by0xCnE9dGhpcy5PMihwLHIpPT09MTMzP0ouYzEocCxyKTpvCmlmKHM9
-PT0wJiZxPT09bylyZXR1cm4gcApyZXR1cm4gcC5zdWJzdHJpbmcocyxxKX0sClQ6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyCmlmKDA+PWIpcmV0dXJuIiIKaWYoYj09PTF8fGEubGVuZ3RoPT09MClyZXR1cm4gYQpp
-ZihiIT09Yj4+PjApdGhyb3cgSC5iKEMuRXEpCmZvcihzPWEscj0iIjshMDspe2lmKChiJjEpPT09MSly
-PXMrcgpiPWI+Pj4xCmlmKGI9PT0wKWJyZWFrCnMrPXN9cmV0dXJuIHJ9LApYVTpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHMKaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCxudWxs
-LG51bGwpKQpzPWEuaW5kZXhPZihiLGMpCnJldHVybiBzfSwKT1k6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-dGhpcy5YVShhLGIsMCl9LApQazpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgppZihjPT1udWxsKWM9YS5s
-ZW5ndGgKZWxzZSBpZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51
-bGwsbnVsbCkpCnM9Yi5sZW5ndGgKcj1hLmxlbmd0aAppZihjK3M+ciljPXItcwpyZXR1cm4gYS5sYXN0
-SW5kZXhPZihiLGMpfSwKY246ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5QayhhLGIsbnVsbCl9LApJ
-czpmdW5jdGlvbihhLGIsYyl7dmFyIHM9YS5sZW5ndGgKaWYoYz5zKXRocm93IEguYihQLlRFKGMsMCxz
-LG51bGwsbnVsbCkpCnJldHVybiBILlNRKGEsYixjKX0sCnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXMuSXMoYSxiLDApfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCmdpTzpmdW5jdGlvbihhKXt2YXIg
-cyxyLHEKZm9yKHM9YS5sZW5ndGgscj0wLHE9MDtxPHM7KytxKXtyPXIrYS5jaGFyQ29kZUF0KHEpJjUz
-Njg3MDkxMQpyPXIrKChyJjUyNDI4Nyk8PDEwKSY1MzY4NzA5MTEKcl49cj4+Nn1yPXIrKChyJjY3MTA4
-ODYzKTw8MykmNTM2ODcwOTExCnJePXI+PjExCnJldHVybiByKygociYxNjM4Myk8PDE1KSY1MzY4NzA5
-MTF9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC51UChi
-KQppZihiPj1hLmxlbmd0aHx8ITEpdGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGFbYl19LAokaXZY
-OjEsCiRpcVU6MX0KSC5CUi5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIgcz1ILkxoKHRoaXMp
-CnJldHVybiBuZXcgSC5FNyhKLklUKHRoaXMuZ09OKCkpLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygi
-RTc8MSwyPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuZ09OKCkpfSwKZ2wwOmZ1
-bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuZ09OKCkpfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiBK
-LkY3KHRoaXMuZ09OKCkpfSwKZVI6ZnVuY3Rpb24oYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBI
-LkdKKEouQTUodGhpcy5nT04oKSxiKSxzLmMscy5RWzFdKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-SC5MaCh0aGlzKS5RWzFdLmEoSi5HQSh0aGlzLmdPTigpLGIpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouaih0aGlzLmdPTigpKX19CkguRTcucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3JldHVybiB0aGlz
-LmEuRigpfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGkuUVsxXS5hKHRoaXMuYS5nbCgpKX0s
-CiRpQW46MX0KSC5aeS5wcm90b3R5cGU9ewpnT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfX0KSC5v
-bC5wcm90b3R5cGU9eyRpYlE6MX0KSC5VcS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IHRoaXMuJHRpLlFbMV0uYShKLng5KHRoaXMuYSxILnVQKGIpKSl9LApZNTpmdW5jdGlvbihhLGIsYyl7
-dmFyIHM9dGhpcy4kdGkKSi51OSh0aGlzLmEsYixzLmMuYShzLlFbMV0uYShjKSkpfSwKJGliUToxLAok
-aXpNOjF9CkgualYucHJvdG90eXBlPXsKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgualYodGhp
-cy5hLHRoaXMuJHRpLkMoIkA8MT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZ09OOmZ1bmN0aW9uKCl7
-cmV0dXJuIHRoaXMuYX19Ckgubi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpy
-ZXR1cm4gcyE9bnVsbD8iTGF0ZUluaXRpYWxpemF0aW9uRXJyb3I6ICIrczoiTGF0ZUluaXRpYWxpemF0
-aW9uRXJyb3IifX0KSC5yMy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPSJSZWFjaGFiaWxp
-dHlFcnJvcjogIit0aGlzLmEKcmV0dXJuIHN9fQpILnFqLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEp
-e3JldHVybiB0aGlzLmEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBDLnhCLk8yKHRoaXMu
-YSxILnVQKGIpKX19CkguR00ucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iTnVsbCBpcyBu
-b3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciAnIit0aGlzLmErIicgb2YgdHlwZSAnIitI
-Lkt4KHRoaXMuJHRpLmMpLncoMCkrIicifX0KSC5iUS5wcm90b3R5cGU9e30KSC5hTC5wcm90b3R5cGU9
-ewpnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzCnJldHVybiBuZXcgSC5hNyhzLHMuZ0EocyksSC5MaChz
-KS5DKCJhNzxhTC5FPiIpKX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9
-LAprOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHA9dGhpcyxvPXAuZ0EocCkKaWYoYi5sZW5ndGghPT0w
-KXtpZihvPT09MClyZXR1cm4iIgpzPUguRWoocC5FKDAsMCkpCmlmKG8hPT1wLmdBKHApKXRocm93IEgu
-YihQLmE0KHApKQpmb3Iocj1zLHE9MTtxPG87KytxKXtyPXIrYitILkVqKHAuRSgwLHEpKQppZihvIT09
-cC5nQShwKSl0aHJvdyBILmIoUC5hNChwKSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9ZWxz
-ZXtmb3IocT0wLHI9IiI7cTxvOysrcSl7cis9SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhy
-b3cgSC5iKFAuYTQocCkpfXJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0sCmV2OmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIHRoaXMuR0coMCxILkxoKHRoaXMpLkMoImEyKGFMLkUpIikuYShiKSl9LApFMjpm
-dW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEgubEoodGhpcyxzLktxKGMp
-LkMoIjEoYUwuRSkiKS5hKGIpLHMuQygiQDxhTC5FPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpm
-dW5jdGlvbihhLGIpe3JldHVybiBILnFDKHRoaXMsYixudWxsLEguTGgodGhpcykuQygiYUwuRSIpKX0s
-CnR0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuWTEodGhpcywhMCxILkxoKHRoaXMpLkMoImFMLkUiKSl9
-LApicjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX19CkgubkgucHJvdG90eXBlPXsKSGQ6
-ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj10aGlzLmIKUC5rMShyLCJzdGFydCIpCnM9dGhpcy5jCmlm
-KHMhPW51bGwpe1AuazEocywiZW5kIikKaWYocj5zKXRocm93IEguYihQLlRFKHIsMCxzLCJzdGFydCIs
-bnVsbCkpfX0sCmdVRDpmdW5jdGlvbigpe3ZhciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYwppZihyPT1u
-dWxsfHxyPnMpcmV0dXJuIHMKcmV0dXJuIHJ9LApnQXM6ZnVuY3Rpb24oKXt2YXIgcz1KLkhtKHRoaXMu
-YSkscj10aGlzLmIKaWYocj5zKXJldHVybiBzCnJldHVybiByfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHMs
-cj1KLkhtKHRoaXMuYSkscT10aGlzLmIKaWYocT49cilyZXR1cm4gMApzPXRoaXMuYwppZihzPT1udWxs
-fHxzPj1yKXJldHVybiByLXEKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCnJldHVy
-biBzLXF9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcyxyPXMuZ0FzKCkrYgppZihiPDB8fHI+PXMu
-Z1VEKCkpdGhyb3cgSC5iKFAuQ2YoYixzLCJpbmRleCIsbnVsbCxudWxsKSkKcmV0dXJuIEouR0Eocy5h
-LHIpfSwKZVI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwpQLmsxKGIsImNvdW50IikKcz1xLmIr
-YgpyPXEuYwppZihyIT1udWxsJiZzPj1yKXJldHVybiBuZXcgSC5NQihxLiR0aS5DKCJNQjwxPiIpKQpy
-ZXR1cm4gSC5xQyhxLmEscyxyLHEuJHRpLmMpfSwKdHQ6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD10
-aGlzLG89cC5iLG49cC5hLG09Si5VNihuKSxsPW0uZ0Eobiksaz1wLmMKaWYoayE9bnVsbCYmazxsKWw9
-awppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLkhOKCkKcz1sLW8KaWYoczw9MCl7bj1KLlFp
-KDAscC4kdGkuYykKcmV0dXJuIG59cj1QLk84KHMsbS5FKG4sbyksITEscC4kdGkuYykKZm9yKHE9MTtx
-PHM7KytxKXtDLk5tLlk1KHIscSxtLkUobixvK3EpKQppZihtLmdBKG4pPGwpdGhyb3cgSC5iKFAuYTQo
-cCkpfXJldHVybiByfX0KSC5hNy5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9
-LApGOmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzLHE9ci5hLHA9Si5VNihxKSxvPXAuZ0EocSkKaWYoci5i
-IT09byl0aHJvdyBILmIoUC5hNChxKSkKcz1yLmMKaWYocz49byl7ci5zSShudWxsKQpyZXR1cm4hMX1y
-LnNJKHAuRShxLHMpKTsrK3IuYwpyZXR1cm4hMH0sCnNJOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0
-aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9CkguaTEucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFy
-IHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguTUgoSi5JVCh0aGlzLmEpLHRoaXMuYixzLkMoIkA8MT4i
-KS5LcShzLlFbMV0pLkMoIk1IPDEsMj4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlz
-LmEpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILnh5LnByb3RvdHlwZT17JGliUToxfQpI
-Lk1ILnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5iCmlmKHIuRigpKXtzLnNJ
-KHMuYy4kMShyLmdsKCkpKQpyZXR1cm4hMH1zLnNJKG51bGwpCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24o
-KXtyZXR1cm4gdGhpcy5hfSwKc0k6ZnVuY3Rpb24oYSl7dGhpcy5hPXRoaXMuJHRpLkMoIjI/IikuYShh
-KX19CkgubEoucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5hKX0sCkU6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkguVTUucHJvdG90
-eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlNPKEouSVQodGhpcy5hKSx0aGlzLmIsdGhp
-cy4kdGkuQygiU088MT4iKSl9fQpILlNPLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcyxyCmZv
-cihzPXRoaXMuYSxyPXRoaXMuYjtzLkYoKTspaWYoSC5vVChyLiQxKHMuZ2woKSkpKXJldHVybiEwCnJl
-dHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmdsKCl9fQpILkFNLnByb3RvdHlwZT17
-CmVSOmZ1bmN0aW9uKGEsYil7UC5NUihiLCJjb3VudCIsdC5TKQpQLmsxKGIsImNvdW50IikKcmV0dXJu
-IG5ldyBILkFNKHRoaXMuYSx0aGlzLmIrYixILkxoKHRoaXMpLkMoIkFNPDE+IikpfSwKZ206ZnVuY3Rp
-b24oYSl7cmV0dXJuIG5ldyBILlUxKEouSVQodGhpcy5hKSx0aGlzLmIsSC5MaCh0aGlzKS5DKCJVMTwx
-PiIpKX19CkguZDUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7dmFyIHM9Si5IbSh0aGlzLmEpLXRo
-aXMuYgppZihzPj0wKXJldHVybiBzCnJldHVybiAwfSwKZVI6ZnVuY3Rpb24oYSxiKXtQLk1SKGIsImNv
-dW50Iix0LlMpClAuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguZDUodGhpcy5hLHRoaXMuYitiLHRo
-aXMuJHRpKX0sCiRpYlE6MX0KSC5VMS5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHMscgpmb3Io
-cz10aGlzLmEscj0wO3I8dGhpcy5iOysrcilzLkYoKQp0aGlzLmI9MApyZXR1cm4gcy5GKCl9LApnbDpm
-dW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguTUIucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24o
-YSl7cmV0dXJuIEMuR3d9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LApnQTpmdW5jdGlvbihhKXty
-ZXR1cm4gMH0sCkU6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5URShiLDAsMCwiaW5kZXgiLG51bGwp
-KX0sCmVSOmZ1bmN0aW9uKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiB0aGlzfX0KSC5GdS5wcm90
-b3R5cGU9ewpGOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3Rocm93IEguYihILldw
-KCkpfSwKJGlBbjoxfQpILnU2LnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5K
-QihKLklUKHRoaXMuYSksdGhpcy4kdGkuQygiSkI8MT4iKSl9fQpILkpCLnByb3RvdHlwZT17CkY6ZnVu
-Y3Rpb24oKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMuJHRpLmM7cy5GKCk7KWlmKHIuYihzLmds
-KCkpKXJldHVybiEwCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGkuYy5hKHRo
-aXMuYS5nbCgpKX0sCiRpQW46MX0KSC5TVS5wcm90b3R5cGU9e30KSC5SZS5wcm90b3R5cGU9ewpZNTpm
-dW5jdGlvbihhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIikuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fu
-bm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19CkgudzIucHJvdG90eXBlPXt9Ckgud3Yu
-cHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuX2hhc2hDb2RlCmlmKHMhPW51bGwp
-cmV0dXJuIHMKcz02NjQ1OTcqSi5oZih0aGlzLmEpJjUzNjg3MDkxMQp0aGlzLl9oYXNoQ29kZT1zCnJl
-dHVybiBzfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4nU3ltYm9sKCInK0guRWoodGhpcy5hKSsnIiknfSwK
-RE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgSC53
-diYmdGhpcy5hPT1iLmF9LAokaUdEOjF9CkguUUMucHJvdG90eXBlPXt9CkguUEQucHJvdG90eXBlPXt9
-CkguV1UucHJvdG90eXBlPXsKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpPT09MH0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LApZNTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9
-SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCkKSC5CaSh1LmcpfSwKZ1B1OmZ1bmN0
-aW9uKGEpe3JldHVybiB0aGlzLnE0KGEsSC5MaCh0aGlzKS5DKCJOMzwxLDI+IikpfSwKcTQ6ZnVuY3Rp
-b24oYSxiKXt2YXIgcz10aGlzCnJldHVybiBQLmwwKGZ1bmN0aW9uKCl7dmFyIHI9YQp2YXIgcT0wLHA9
-MSxvLG4sbSxsLGsKcmV0dXJuIGZ1bmN0aW9uICRhc3luYyRnUHUoYyxkKXtpZihjPT09MSl7bz1kCnE9
-cH13aGlsZSh0cnVlKXN3aXRjaChxKXtjYXNlIDA6bj1zLmd2YygpLG49bi5nbShuKSxtPUguTGgocyks
-bT1tLkMoIkA8MT4iKS5LcShtLlFbMV0pLkMoIk4zPDEsMj4iKQpjYXNlIDI6aWYoIW4uRigpKXtxPTMK
-YnJlYWt9bD1uLmdsKCkKaz1zLnEoMCxsKQprLnRvU3RyaW5nCnE9NApyZXR1cm4gbmV3IFAuTjMobCxr
-LG0pCmNhc2UgNDpxPTIKYnJlYWsKY2FzZSAzOnJldHVybiBQLlRoKCkKY2FzZSAxOnJldHVybiBQLllt
-KG8pfX19LGIpfSwKJGlaMDoxfQpILkxQLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmF9LAp4NDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuITEKaWYoIl9f
-cHJvdG9fXyI9PT1hKXJldHVybiExCnJldHVybiB0aGlzLmIuaGFzT3duUHJvcGVydHkoYSl9LApxOmZ1
-bmN0aW9uKGEsYil7aWYoIXRoaXMueDQoYikpcmV0dXJuIG51bGwKcmV0dXJuIHRoaXMucVAoYil9LApx
-UDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iW0guaChhKV19LApLOmZ1bmN0aW9uKGEsYil7dmFyIHMs
-cixxLHAsbz1ILkxoKHRoaXMpCm8uQygifigxLDIpIikuYShiKQpzPXRoaXMuYwpmb3Iocj1zLmxlbmd0
-aCxvPW8uUVsxXSxxPTA7cTxyOysrcSl7cD1zW3FdCmIuJDIocCxvLmEodGhpcy5xUChwKSkpfX0sCmd2
-YzpmdW5jdGlvbigpe3JldHVybiBuZXcgSC5YUih0aGlzLEguTGgodGhpcykuQygiWFI8MT4iKSl9fQpI
-LlhSLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYS5jCnJldHVybiBuZXcgSi5t
-MShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5hLmMubGVuZ3RofX0KSC5MSS5wcm90b3R5cGU9ewpnV2E6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmEK
-cmV0dXJuIHN9LApnbmQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby5jPT09MSlyZXR1
-cm4gQy5oVQpzPW8uZApyPXMubGVuZ3RoLW8uZS5sZW5ndGgtby5mCmlmKHI9PT0wKXJldHVybiBDLmhV
-CnE9W10KZm9yKHA9MDtwPHI7KytwKXtpZihwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHApCnEucHVz
-aChzW3BdKX1yZXR1cm4gSi56QyhxKX0sCmdWbTpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtLGws
-az10aGlzCmlmKGsuYyE9PTApcmV0dXJuIEMuV08Kcz1rLmUKcj1zLmxlbmd0aApxPWsuZApwPXEubGVu
-Z3RoLXItay5mCmlmKHI9PT0wKXJldHVybiBDLldPCm89bmV3IEguTjUodC5lbykKZm9yKG49MDtuPHI7
-KytuKXtpZihuPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLG4pCm09c1tuXQpsPXArbgppZihsPDB8fGw+
-PXEubGVuZ3RoKXJldHVybiBILk9IKHEsbCkKby5ZNSgwLG5ldyBILnd2KG0pLHFbbF0pfXJldHVybiBu
-ZXcgSC5QRChvLHQuZ0YpfSwKJGl2UToxfQpILkNqLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
-dmFyIHMKSC5oKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK0guRWooYSkKQy5ObS5pKHRoaXMuYixhKQpD
-Lk5tLmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTN9CkguZjkucHJvdG90eXBlPXsKcVM6ZnVuY3Rpb24o
-YSl7dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSkuZXhlYyhhKQppZihwPT1udWxsKXJldHVy
-biBudWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgppZihyIT09LTEpcy5hcmd1bWVudHM9cFty
-KzFdCnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9cFtyKzFdCnI9cS5kCmlmKHIhPT0tMSlz
-LmV4cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhvZD1wW3IrMV0Kcj1xLmYKaWYociE9PS0x
-KXMucmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
-e3ZhciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILkVqKHRo
-aXMuYSkKcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitzKyInIG9u
-IG51bGwifX0KSC5hei5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1
-Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIscD1yLmIKaWYocD09bnVsbClyZXR1cm4i
-Tm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5FaihyLmEpCnM9ci5jCmlmKHM9PW51bGwpcmV0dXJuIHErcCsi
-JyAoIitILkVqKHIuYSkrIikiCnJldHVybiBxK3ArIicgb24gJyIrcysiJyAoIitILkVqKHIuYSkrIiki
-fX0KSC52Vi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5sZW5n
-dGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
-cmV0dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1udWxsPyJudWxsIjoidW5kZWZpbmVkIikr
-IicgZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEucHJvdG90eXBlPXt9CkguWE8ucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuYgppZihyIT1udWxsKXJldHVybiByCnI9dGhp
-cy5hCnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/ci5zdGFjazpudWxsCnJldHVybiB0aGlz
-LmI9cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFy
-IHM9dGhpcy5jb25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpzLm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIr
-SC5OUShyPT1udWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVIOjEsCmdLdTpmdW5jdGlvbigpe3JldHVy
-biB0aGlzfSwKJEM6IiQxIiwKJFI6MSwKJEQ6bnVsbH0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90
-b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuJHN0YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0
-dXJuIkNsb3N1cmUgb2YgdW5rbm93biBzdGF0aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5R
-KHMpKyInIn19CkguclQucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlmKGI9
-PW51bGwpcmV0dXJuITEKaWYocz09PWIpcmV0dXJuITAKaWYoIShiIGluc3RhbmNlb2YgSC5yVCkpcmV0
-dXJuITEKcmV0dXJuIHMuYT09PWIuYSYmcy5iPT09Yi5iJiZzLmM9PT1iLmN9LApnaU86ZnVuY3Rpb24o
-YSl7dmFyIHMscj10aGlzLmMKaWYocj09bnVsbClzPUguZVEodGhpcy5hKQplbHNlIHM9dHlwZW9mIHIh
-PT0ib2JqZWN0Ij9KLmhmKHIpOkguZVEocikKcj1ILmVRKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVt
-YmVyIilyZXR1cm4gcy5ZKCkKcmV0dXJuKHNecik+Pj4wfSwKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlz
-LmMKaWYocz09bnVsbClzPXRoaXMuYQpyZXR1cm4iQ2xvc3VyZSAnIitILkVqKHRoaXMuZCkrIicgb2Yg
-IisoIkluc3RhbmNlIG9mICciK0guRWooSC5NKHMpKSsiJyIpfX0KSC5FcS5wcm90b3R5cGU9ewp3OmZ1
-bmN0aW9uKGEpe3JldHVybiJSdW50aW1lRXJyb3I6ICIrdGhpcy5hfX0KSC5rWS5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AucCh0aGlzLmEpfX0KSC5rci5w
-cm90b3R5cGU9e30KSC5ONS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwK
-Z2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmE9PT0wfSwKZ3ZjOmZ1bmN0aW9uKCl7cmV0dXJuIG5l
-dyBILmk1KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwxPiIpKX0sCng0OmZ1bmN0aW9uKGEpe3ZhciBzLHIK
-aWYodHlwZW9mIGE9PSJzdHJpbmciKXtzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0
-aGlzLlh1KHMsYSl9ZWxzZXtyPXRoaXMuQ1goYSkKcmV0dXJuIHJ9fSwKQ1g6ZnVuY3Rpb24oYSl7dmFy
-IHM9dGhpcy5kCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuRmgodGhpcy5CdChzLEouaGYo
-YSkmMHgzZmZmZmZmKSxhKT49MH0sCnE6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvPXRoaXMsbj1u
-dWxsCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7cz1vLmIKaWYocz09bnVsbClyZXR1cm4gbgpyPW8uajIo
-cyxiKQpxPXI9PW51bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihi
-JjB4M2ZmZmZmZik9PT1iKXtwPW8uYwppZihwPT1udWxsKXJldHVybiBuCnI9by5qMihwLGIpCnE9cj09
-bnVsbD9uOnIuYgpyZXR1cm4gcX1lbHNlIHJldHVybiBvLmFhKGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFy
-IHMscixxPXRoaXMuZAppZihxPT1udWxsKXJldHVybiBudWxsCnM9dGhpcy5CdChxLEouaGYoYSkmMHgz
-ZmZmZmZmKQpyPXRoaXMuRmgocyxhKQppZihyPDApcmV0dXJuIG51bGwKcmV0dXJuIHNbcl0uYn0sClk1
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5MaChtKQpsLmMuYShiKQps
-LlFbMV0uYShjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9bS5iCm0uRUgocz09bnVsbD9tLmI9bS56
-SygpOnMsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3I9
-bS5jCm0uRUgocj09bnVsbD9tLmM9bS56SygpOnIsYixjKX1lbHNle3E9bS5kCmlmKHE9PW51bGwpcT1t
-LmQ9bS56SygpCnA9Si5oZihiKSYweDNmZmZmZmYKbz1tLkJ0KHEscCkKaWYobz09bnVsbCltLkVJKHEs
-cCxbbS5IbihiLGMpXSkKZWxzZXtuPW0uRmgobyxiKQppZihuPj0wKW9bbl0uYj1jCmVsc2Ugby5wdXNo
-KG0uSG4oYixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLkMoIn4o
-MSwyKSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxsOyl7Yi4kMihzLmEscy5iKQppZihyIT09
-cS5yKXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj10
-aGlzLHE9SC5MaChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpzPXIuajIoYSxiKQppZihzPT1udWxsKXIu
-RUkoYSxiLHIuSG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzOmZ1bmN0aW9uKCl7dGhpcy5yPXRoaXMucisx
-JjY3MTA4ODYzfSwKSG46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLHI9SC5MaChzKSxxPW5ldyBILnZo
-KHIuYy5hKGEpLHIuUVsxXS5hKGIpKQppZihzLmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7cj1zLmYKci50
-b1N0cmluZwpxLmQ9cgpzLmY9ci5jPXF9KytzLmEKcy5rcygpCnJldHVybiBxfSwKRmg6ZnVuY3Rpb24o
-YSxiKXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3Ip
-aWYoSi5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQ
-Lm5PKHRoaXMpfSwKajI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX0sCkJ0OmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIGFbYl19LApFSTpmdW5jdGlvbihhLGIsYyl7YVtiXT1jfSwKcm46ZnVuY3Rpb24oYSxiKXtk
-ZWxldGUgYVtiXX0sClh1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuajIoYSxiKSE9bnVsbH0sCnpL
-OmZ1bmN0aW9uKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1rZXk+IixyPU9iamVjdC5jcmVhdGUobnVs
-bCkKdGhpcy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVybiByfSwKJGlGbzoxfQpILnZoLnByb3Rv
-dHlwZT17fQpILmk1LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuYX0sCmds
-MDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmE9PT0wfSwKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
-cy5hLHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygiTjY8MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0s
-CnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19CkguTjYucHJvdG90eXBlPXsKZ2w6
-ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYQpp
-ZihyLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM9PW51bGwpe3Iuc3FZKG51bGwp
-CnJldHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJldHVybiEwfX0sCnNxWTpmdW5jdGlvbihh
-KXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6NDZ9CkguVlgucHJvdG90eXBlPXsKJDE6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILmgoYSkpfSwKJFM6NDF9CkguVlIucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6
-ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51bGwpcmV0dXJuIHIKcj1zLmIKcmV0dXJu
-IHMuYz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVDYXNlLHIudW5pY29kZSxyLmRvdEFsbCwh
-MCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWjpmdW5jdGlv
-bihhLGIpe3ZhciBzLHI9dGhpcy5nSGMoKQpyLmxhc3RJbmRleD1iCnM9ci5leGVjKGEpCmlmKHM9PW51
-bGwpcmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwKJGl2WDoxLAokaXdMOjF9CkguRUsucHJv
-dG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgudVAoYikKcz10aGlzLmIKaWYoYj49cy5sZW5n
-dGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRpT2Q6MSwKJGlpYjoxfQpILktXLnByb3Rv
-dHlwZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5QYih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9
-fQpILlBiLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24o
-KXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlmKGw9PW51bGwpcmV0dXJuITEKcz1tLmMKcj1s
-Lmxlbmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxzKQppZihwIT1udWxsKXttLmQ9cApzPXAuYgpv
-PXMuaW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1uKXtpZihxLmIudW5pY29kZSl7cz1tLmMKcT1z
-KzEKaWYocTxyKXtzPUMueEIuTzIobCxzKQppZihzPj01NTI5NiYmczw9NTYzMTkpe3M9Qy54Qi5PMihs
-LHEpCnM9cz49NTYzMjAmJnM8PTU3MzQzfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCm49KHM/
-bisxOm4pKzF9bS5jPW4KcmV0dXJuITB9fW0uYj1tLmQ9bnVsbApyZXR1cm4hMX0sCiRpQW46MX0KSC50
-US5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiIT09MClILnYoUC5PNyhiLG51
-bGwpKQpyZXR1cm4gdGhpcy5jfSwKJGlPZDoxfQpILnVuLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEp
-e3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkY6
-ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEuYixuPW8ubGVuZ3RoLG09cS5hLGw9bS5s
-ZW5ndGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9bS5pbmRleE9mKG8scCkKaWYoczwwKXtx
-LmM9bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1uZXcgSC50UShzLG8pCnEuYz1yPT09cS5j
-P3IrMTpyCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmQKcy50b1N0cmluZwpyZXR1
-cm4gc30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6MSwkaUFTOjF9CkguTFoucHJvdG90eXBl
-PXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17
-CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk1
-OmZ1bmN0aW9uKGEsYixjKXtILkdIKGMpCkgub2QoYixhLGEubGVuZ3RoKQphW2JdPWN9LAokaWJROjEs
-CiRpY1g6MSwKJGl6TToxfQpILlBnLnByb3RvdHlwZT17Clk1OmZ1bmN0aW9uKGEsYixjKXtILnVQKGMp
-Ckgub2QoYixhLGEubGVuZ3RoKQphW2JdPWN9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpILnhqLnBy
-b3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4g
-YVtiXX19CkguZEUucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5s
-ZW5ndGgpCnJldHVybiBhW2JdfX0KSC5aQS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChi
-KQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmRULnByb3RvdHlwZT17CnE6ZnVuY3Rp
-b24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguUHEucHJvdG90
+MDtiPXMpe3M9Yi0xCnI9Qy54Qi5PKGEscykKaWYociE9PTMyJiZyIT09MTMmJiFKLkdhKHIpKWJyZWFr
+fXJldHVybiBifSwKVEo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBKLnFJ
+LnByb3RvdHlwZQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9
+PW51bGwpcmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBl
+CmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUu
+cHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiBhCnJldHVybiBKLmtz
+KGEpfSwKVTY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3Rv
+dHlwZQppZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpk
+LnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJl
+dHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpy
+ZXR1cm4gSi5rcyhhKX0sCllFOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYodHlwZW9m
+IGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUK
+cmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LAppYTpm
+dW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpe2lmKE1hdGguZmxvb3IoYSk9PWEpcmV0dXJu
+IEouYlUucHJvdG90eXBlCnJldHVybiBKLlZBLnByb3RvdHlwZX1pZih0eXBlb2YgYT09InN0cmluZyIp
+cmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJuIEoud2UucHJvdG90eXBlCmlmKHR5
+cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIEoueUUucHJvdG90eXBlCmlmKGEuY29uc3RydWN0b3I9PUFy
+cmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBh
+PT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2Yg
+UC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCnJZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0i
+c3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZighKGEgaW5z
+dGFuY2VvZiBQLk1oKSlyZXR1cm4gSi5rZC5wcm90b3R5cGUKcmV0dXJuIGF9LAp2ZDpmdW5jdGlvbihh
+KXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIEoucUkucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0
+dXJuIGEKaWYoIShhIGluc3RhbmNlb2YgUC5NaCkpcmV0dXJuIEoua2QucHJvdG90eXBlCnJldHVybiBh
+fSwKdzE6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gYQppZihhLmNvbnN0cnVjdG9yPT1BcnJh
+eSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09
+ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAu
+TWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApBNTpmdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEp
+LmVSKGEsYil9LApFaDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouWUUoYSkubUsoYSxiLGMpfSwKRWw6
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5kcihhLGIpfSwKRjc6ZnVuY3Rpb24oYSl7cmV0dXJu
+IEouVTYoYSkuZ29yKGEpfSwKRkw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5kZChhLGIpfSwK
+R0E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5FKGEsYil9LApIbTpmdW5jdGlvbihhKXtyZXR1
+cm4gSi5VNihhKS5nQShhKX0sCklUOmZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmdtKGEpfSwKSnk6
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5pYShhKS5lNyhhLGIpfSwKS1Y6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gSi5yWShhKS55bihhLGIpfSwKTHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkud2coYSl9LApN
+MTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEoudzEoYSkuRTIoYSxiLGMpfSwKTXU6ZnVuY3Rpb24oYSxi
+KXtyZXR1cm4gSi5ZRShhKS5zUChhLGIpfSwKUXo6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5X
+KGEsYil9LApSTTpmdW5jdGlvbihhLGIpe2lmKGE9PW51bGwpcmV0dXJuIGI9PW51bGwKaWYodHlwZW9m
+IGEhPSJvYmplY3QiKXJldHVybiBiIT1udWxsJiZhPT09YgpyZXR1cm4gSi5pYShhKS5ETihhLGIpfSwK
+Ulg6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEoYSkuYnIoYSl9LApUMDpmdW5jdGlvbihhKXtyZXR1cm4g
+Si5yWShhKS5iUyhhKX0sClZ1OmZ1bmN0aW9uKGEpe3JldHVybiBKLnZkKGEpLnpRKGEpfSwKYTY6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5PKGEsYil9LApiVDpmdW5jdGlvbihhKXtyZXR1cm4gSi5Z
+RShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2Yg
+Yj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5USihhKS5oKGEsYil9LApjSDpmdW5jdGlvbihh
+KXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdQKGEp
+fSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouWUUoYSkuT24oYSxiLGMsZCl9LApkZzpmdW5j
+dGlvbihhLGIsYyxkKXtyZXR1cm4gSi5yWShhKS5pNyhhLGIsYyxkKX0sCmRoOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBKLllFKGEpLkZGKGEpfSwKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zYTQoYSxi
+KX0sCmhmOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEpLmdpTyhhKX0sCmlnOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBKLllFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkudyhhKX0sCmw1
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouWUUoYSkuc2hmKGEsYil9LApsZDpmdW5jdGlvbihhLGIsYyl7
+cmV0dXJuIEouclkoYSkuTmooYSxiLGMpfSwKcDQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5U
+YyhhLGIpfSwKcTA6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnJZKGEpLlFpKGEsYixjKX0sCnFGOmZ1
+bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdWbChhKX0sCnRIOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4g
+Si5ZRShhKS5wayhhLGIsYyl9LAp1OTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEoudzEoYSkuWTUoYSxi
+LGMpfSwKdVU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ2wwKGEpfSwKd2Y6ZnVuY3Rpb24oYSxi
+KXtyZXR1cm4gSi5ZRShhKS5zUk4oYSxiKX0sCng5OmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PT0i
+bnVtYmVyIilpZihhLmNvbnN0cnVjdG9yPT1BcnJheXx8dHlwZW9mIGE9PSJzdHJpbmcifHxILndWKGEs
+YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXSkpaWYoYj4+PjA9PT1iJiZiPGEubGVuZ3RoKXJldHVybiBh
+W2JdCnJldHVybiBKLlU2KGEpLnEoYSxiKX0sCnpsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSku
+dGcoYSxiKX0sCkd2OmZ1bmN0aW9uIEd2KCl7fSwKeUU6ZnVuY3Rpb24geUUoKXt9LAp3ZTpmdW5jdGlv
+biB3ZSgpe30sCk1GOmZ1bmN0aW9uIE1GKCl7fSwKaUM6ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlv
+biBrZCgpe30sCmM1OmZ1bmN0aW9uIGM1KCl7fSwKamQ6ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0s
+ClBvOmZ1bmN0aW9uIFBvKGEpe3RoaXMuJHRpPWF9LAptMTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89
+dGhpcwpfLmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9
+LApiVTpmdW5jdGlvbiBiVSgpe30sClZBOmZ1bmN0aW9uIFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9
+fSxQPXsKT2o6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9e30KaWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9
+bnVsbClyZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRpb25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1
+bWVudCE9bnVsbCl7cz1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCnI9c2VsZi5kb2N1
+bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikKcS5hPW51bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZl
+cihILnRSKG5ldyBQLnRoKHEpLDEpKS5vYnNlcnZlKHMse2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5l
+dyBQLmhhKHEscyxyKX1lbHNlIGlmKHNlbGYuc2V0SW1tZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkK
+cmV0dXJuIFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3NlbGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50Uihu
+ZXcgUC5Wcyh0Lk0uYShhKSksMCkpfSwKb0E6ZnVuY3Rpb24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50
+UihuZXcgUC5GdCh0Lk0uYShhKSksMCkpfSwKQno6ZnVuY3Rpb24oYSl7dC5NLmEoYSkKUC5RTigwLGEp
+fSwKUU46ZnVuY3Rpb24oYSxiKXt2YXIgcz1uZXcgUC5XMygpCnMuQ1koYSxiKQpyZXR1cm4gc30sCkZY
+OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcgUC52cygkLlgzLGEuQygidnM8MD4iKSksYS5D
+KCJpaDwwPiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4kMigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5h
+fSwKalE6ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0s
+CmYzOmZ1bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgudHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2
+YXIgcyxyLHE9bmV3IFAuV00oYikscD1uZXcgUC5TWChiKQppZihhIGluc3RhbmNlb2YgUC52cylhLlFk
+KHEscCx0LnopCmVsc2V7cz10LnoKaWYodC5lLmIoYSkpYS5TcShxLHAscykKZWxzZXtyPW5ldyBQLnZz
+KCQuWDMsdC5jKQpyLmE9NApyLmM9YQpyLlFkKHEscCxzKX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHM9
+ZnVuY3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJl
+YWt9Y2F0Y2gocil7ZT1yCmQ9Y319fShhLDEpCnJldHVybiAkLlgzLkxqKG5ldyBQLkdzKHMpLHQuSCx0
+LlMsdC56KX0sCklHOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5GeShhLDEpfSwKVGg6ZnVuY3Rpb24o
+KXtyZXR1cm4gQy53UX0sClltOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5GeShhLDMpfSwKbDA6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAucTQoYSxiLkMoInE0PDA+IikpfSwKVGw6ZnVuY3Rpb24oYSxi
+KXt2YXIgcz1ILmNiKGEsImVycm9yIix0LkspCnJldHVybiBuZXcgUC5DdyhzLGI9PW51bGw/UC52MChh
+KTpiKX0sCnYwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQuci5iKGEpKXtzPWEuZ0lJKCkKaWYocyE9bnVs
+bClyZXR1cm4gc31yZXR1cm4gQy5wZH0sCkE5OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmZvcihzPXQu
+YztyPWEuYSxyPT09MjspYT1zLmEoYS5jKQppZihyPj00KXtxPWIuYWgoKQpiLmE9YS5hCmIuYz1hLmMK
+UC5IWihiLHEpfWVsc2V7cT10LkYuYShiLmMpCmIuYT0yCmIuYz1hCmEualEocSl9fSwKSFo6ZnVuY3Rp
+b24oYTAsYTEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGM9bnVsbCxiPXt9LGE9
+Yi5hPWEwCmZvcihzPXQubixyPXQuRixxPXQuZTshMDspe3A9e30Kbz1hLmE9PT04CmlmKGExPT1udWxs
+KXtpZihvKXtuPXMuYShhLmMpClAuTDIoYyxjLGEuYixuLmEsbi5iKX1yZXR1cm59cC5hPWExCm09YTEu
+YQpmb3IoYT1hMTttIT1udWxsO2E9bSxtPWwpe2EuYT1udWxsClAuSFooYi5hLGEpCnAuYT1tCmw9bS5h
+fWs9Yi5hCmo9ay5jCnAuYj1vCnAuYz1qCmk9IW8KaWYoaSl7aD1hLmMKaD0oaCYxKSE9PTB8fChoJjE1
+KT09PTh9ZWxzZSBoPSEwCmlmKGgpe2c9YS5iLmIKaWYobyl7aD1rLmI9PT1nCmg9IShofHxoKX1lbHNl
+IGg9ITEKaWYoaCl7cy5hKGopClAuTDIoYyxjLGsuYixqLmEsai5iKQpyZXR1cm59Zj0kLlgzCmlmKGYh
+PT1nKSQuWDM9ZwplbHNlIGY9YwphPWEuYwppZigoYSYxNSk9PT04KW5ldyBQLlJUKHAsYixvKS4kMCgp
+CmVsc2UgaWYoaSl7aWYoKGEmMSkhPT0wKW5ldyBQLnJxKHAsaikuJDAoKX1lbHNlIGlmKChhJjIpIT09
+MCluZXcgUC5SVyhiLHApLiQwKCkKaWYoZiE9bnVsbCkkLlgzPWYKYT1wLmMKaWYocS5iKGEpKXtrPXAu
+YS4kdGkKaz1rLkMoImI4PDI+IikuYihhKXx8IWsuUVsxXS5iKGEpfWVsc2Ugaz0hMQppZihrKXtxLmEo
+YSkKZT1wLmEuYgppZihhIGluc3RhbmNlb2YgUC52cylpZihhLmE+PTQpe2Q9ci5hKGUuYykKZS5jPW51
+bGwKYTE9ZS5OOChkKQplLmE9YS5hCmUuYz1hLmMKYi5hPWEKY29udGludWV9ZWxzZSBQLkE5KGEsZSkK
+ZWxzZSBlLmVjKGEpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUuYz1udWxsCmExPWUuTjgoZCkK
+YT1wLmIKaz1wLmMKaWYoIWEpe2UuJHRpLmMuYShrKQplLmE9NAplLmM9a31lbHNle3MuYShrKQplLmE9
+OAplLmM9a31iLmE9ZQphPWV9fSwKVkg6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZih0LmFnLmIoYSkpcmV0
+dXJuIGIuTGooYSx0LnosdC5LLHQubCkKcz10LmJJCmlmKHMuYihhKSlyZXR1cm4gcy5hKGEpCnRocm93
+IEguYihQLkwzKGEsIm9uRXJyb3IiLCJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qg
+b3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIHZh
+bGlkIHJlc3VsdCIpKX0sCnB1OmZ1bmN0aW9uKCl7dmFyIHMscgpmb3Iocz0kLlM2O3MhPW51bGw7cz0k
+LlM2KXskLm1nPW51bGwKcj1zLmIKJC5TNj1yCmlmKHI9PW51bGwpJC5rOD1udWxsCnMuYS4kMCgpfX0s
+CmVOOmZ1bmN0aW9uKCl7JC5VRD0hMAp0cnl7UC5wdSgpfWZpbmFsbHl7JC5tZz1udWxsCiQuVUQ9ITEK
+aWYoJC5TNiE9bnVsbCkkLnV0KCkuJDEoUC5VSSgpKX19LAplVzpmdW5jdGlvbihhKXt2YXIgcz1uZXcg
+UC5PTShhKSxyPSQuazgKaWYocj09bnVsbCl7JC5TNj0kLms4PXMKaWYoISQuVUQpJC51dCgpLiQxKFAu
+VUkoKSl9ZWxzZSAkLms4PXIuYj1zfSwKclI6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9JC5TNgppZihw
+PT1udWxsKXtQLmVXKGEpCiQubWc9JC5rOApyZXR1cm59cz1uZXcgUC5PTShhKQpyPSQubWcKaWYocj09
+bnVsbCl7cy5iPXAKJC5TNj0kLm1nPXN9ZWxzZXtxPXIuYgpzLmI9cQokLm1nPXIuYj1zCmlmKHE9PW51
+bGwpJC5rOD1zfX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciBzPW51bGwscj0kLlgzCmlmKEMuTlU9PT1yKXtQ
+LlRrKHMscyxDLk5VLGEpCnJldHVybn1QLlRrKHMscyxyLHQuTS5hKHIuR1koYSkpKX0sClF3OmZ1bmN0
+aW9uKGEsYil7SC5jYihhLCJzdHJlYW0iLHQuSykKcmV0dXJuIG5ldyBQLnhJKGIuQygieEk8MD4iKSl9
+LApMMjpmdW5jdGlvbihhLGIsYyxkLGUpe1AuclIobmV3IFAucEsoZCxlKSl9LApUODpmdW5jdGlvbihh
+LGIsYyxkLGUpe3ZhciBzLHI9JC5YMwppZihyPT09YylyZXR1cm4gZC4kMCgpCiQuWDM9YwpzPXIKdHJ5
+e3I9ZC4kMCgpCnJldHVybiByfWZpbmFsbHl7JC5YMz1zfX0sCnl2OmZ1bmN0aW9uKGEsYixjLGQsZSxm
+LGcpe3ZhciBzLHI9JC5YMwppZihyPT09YylyZXR1cm4gZC4kMShlKQokLlgzPWMKcz1yCnRyeXtyPWQu
+JDEoZSkKcmV0dXJuIHJ9ZmluYWxseXskLlgzPXN9fSwKUXg6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxo
+LGkpe3ZhciBzLHI9JC5YMwppZihyPT09YylyZXR1cm4gZC4kMihlLGYpCiQuWDM9YwpzPXIKdHJ5e3I9
+ZC4kMihlLGYpCnJldHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClRrOmZ1bmN0aW9uKGEsYixjLGQpe3Zh
+ciBzCnQuTS5hKGQpCnM9Qy5OVSE9PWMKaWYocylkPSEoIXN8fCExKT9jLkdZKGQpOmMuUlQoZCx0Lkgp
+ClAuZVcoZCl9LAp0aDpmdW5jdGlvbiB0aChhKXt0aGlzLmE9YX0sCmhhOmZ1bmN0aW9uIGhhKGEsYixj
+KXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClZzOmZ1bmN0aW9uIFZzKGEpe3RoaXMuYT1hfSwK
+RnQ6ZnVuY3Rpb24gRnQoYSl7dGhpcy5hPWF9LApXMzpmdW5jdGlvbiBXMygpe30sCnlIOmZ1bmN0aW9u
+IHlIKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAppaDpmdW5jdGlvbiBpaChhLGIpe3RoaXMuYT1hCnRo
+aXMuYj0hMQp0aGlzLiR0aT1ifSwKV006ZnVuY3Rpb24gV00oYSl7dGhpcy5hPWF9LApTWDpmdW5jdGlv
+biBTWChhKXt0aGlzLmE9YX0sCkdzOmZ1bmN0aW9uIEdzKGEpe3RoaXMuYT1hfSwKRnk6ZnVuY3Rpb24g
+RnkoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkdWOmZ1bmN0aW9uIEdWKGEsYil7dmFyIF89dGhpcwpf
+LmE9YQpfLmQ9Xy5jPV8uYj1udWxsCl8uJHRpPWJ9LApxNDpmdW5jdGlvbiBxNChhLGIpe3RoaXMuYT1h
+CnRoaXMuJHRpPWJ9LApDdzpmdW5jdGlvbiBDdyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKUGY6ZnVu
+Y3Rpb24gUGYoKXt9LApaZjpmdW5jdGlvbiBaZihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApGZTpm
+dW5jdGlvbiBGZShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPW51bGwKXy5iPWEKXy5jPWIKXy5kPWMK
+Xy5lPWQKXy4kdGk9ZX0sCnZzOmZ1bmN0aW9uIHZzKGEsYil7dmFyIF89dGhpcwpfLmE9MApfLmI9YQpf
+LmM9bnVsbApfLiR0aT1ifSwKZGE6ZnVuY3Rpb24gZGEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm9R
+OmZ1bmN0aW9uIG9RKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApwVjpmdW5jdGlvbiBwVihhKXt0aGlz
+LmE9YX0sClU3OmZ1bmN0aW9uIFU3KGEpe3RoaXMuYT1hfSwKdnI6ZnVuY3Rpb24gdnIoYSxiLGMpe3Ro
+aXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcnQ6ZnVuY3Rpb24gcnQoYSxiKXt0aGlzLmE9YQp0aGlz
+LmI9Yn0sCktGOmZ1bmN0aW9uIEtGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApaTDpmdW5jdGlvbiBa
+TChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApSVDpmdW5jdGlvbiBSVChhLGIsYyl7
+dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApqWjpmdW5jdGlvbiBqWihhKXt0aGlzLmE9YX0sCnJx
+OmZ1bmN0aW9uIHJxKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApSVzpmdW5jdGlvbiBSVyhhLGIpe3Ro
+aXMuYT1hCnRoaXMuYj1ifSwKT006ZnVuY3Rpb24gT00oYSl7dGhpcy5hPWEKdGhpcy5iPW51bGx9LApx
+aDpmdW5jdGlvbiBxaCgpe30sCkI1OmZ1bmN0aW9uIEI1KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp1
+TzpmdW5jdGlvbiB1TyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTU86ZnVuY3Rpb24gTU8oKXt9LApr
+VDpmdW5jdGlvbiBrVCgpe30sCnhJOmZ1bmN0aW9uIHhJKGEpe3RoaXMuJHRpPWF9LAptMDpmdW5jdGlv
+biBtMCgpe30sCnBLOmZ1bmN0aW9uIHBLKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApKaTpmdW5jdGlv
+biBKaSgpe30sCmhqOmZ1bmN0aW9uIGhqKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30s
+ClZwOmZ1bmN0aW9uIFZwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPUjpmdW5jdGlvbiBPUihhLGIs
+Yyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApFRjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIu
+QygiQDwwPiIpLktxKGMpLkMoIkZvPDEsMj4iKS5hKEguQjcoYSxuZXcgSC5ONShiLkMoIkA8MD4iKS5L
+cShjKS5DKCJONTwxLDI+IikpKSl9LApGbDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5ONShhLkMo
+IkA8MD4iKS5LcShiKS5DKCJONTwxLDI+IikpfSwKTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmI2
+KGEuQygiYjY8MD4iKSl9LApUMjpmdW5jdGlvbigpe3ZhciBzPU9iamVjdC5jcmVhdGUobnVsbCkKc1si
+PG5vbi1pZGVudGlmaWVyLWtleT4iXT1zCmRlbGV0ZSBzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJdCnJl
+dHVybiBzfSwKcmo6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPW5ldyBQLmxtKGEsYixjLkMoImxtPDA+Iikp
+CnMuYz1hLmUKcmV0dXJuIHN9LApFUDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgppZihQLmhCKGEpKXtp
+ZihiPT09IigiJiZjPT09IikiKXJldHVybiIoLi4uKSIKcmV0dXJuIGIrIi4uLiIrY31zPUguVk0oW10s
+dC5zKQpDLk5tLmkoJC54ZyxhKQp0cnl7UC5WcihhLHMpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgp
+cmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX1yPVAudmcoYix0LnUuYShzKSwiLCAiKStjCnJl
+dHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKV0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKaWYo
+UC5oQihhKSlyZXR1cm4gYisiLi4uIitjCnM9bmV3IFAuUm4oYikKQy5ObS5pKCQueGcsYSkKdHJ5e3I9
+cwpyLmE9UC52ZyhyLmEsYSwiLCAiKX1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILk9I
+KCQueGcsLTEpCiQueGcucG9wKCl9cy5hKz1jCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/
+cjpyfSwKaEI6ZnVuY3Rpb24oYSl7dmFyIHMscgpmb3Iocz0kLnhnLmxlbmd0aCxyPTA7cjxzOysrcilp
+ZihhPT09JC54Z1tyXSlyZXR1cm4hMApyZXR1cm4hMX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
+LHAsbyxuLG0sbD1hLmdtKGEpLGs9MCxqPTAKd2hpbGUoITApe2lmKCEoazw4MHx8ajwzKSlicmVhawpp
+ZighbC5GKCkpcmV0dXJuCnM9SC5FaihsLmdsKCkpCkMuTm0uaShiLHMpCmsrPXMubGVuZ3RoKzI7Kytq
+fWlmKCFsLkYoKSl7aWYoajw9NSlyZXR1cm4KaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkK
+cj1iLnBvcCgpCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKX1lbHNle3A9
+bC5nbCgpOysragppZighbC5GKCkpe2lmKGo8PTQpe0MuTm0uaShiLEguRWoocCkpCnJldHVybn1yPUgu
+RWoocCkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcT1iLnBvcCgpCmsrPXIubGVuZ3Ro
+KzJ9ZWxzZXtvPWwuZ2woKTsrK2oKZm9yKDtsLkYoKTtwPW8sbz1uKXtuPWwuZ2woKTsrK2oKaWYoaj4x
+MDApe3doaWxlKCEwKXtpZighKGs+NzUmJmo+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEgu
+T0goYiwtMSkKay09Yi5wb3AoKS5sZW5ndGgrMjstLWp9Qy5ObS5pKGIsIi4uLiIpCnJldHVybn19cT1I
+LkVqKHApCnI9SC5FaihvKQprKz1yLmxlbmd0aCtxLmxlbmd0aCs0fX1pZihqPmIubGVuZ3RoKzIpe2sr
+PTUKbT0iLi4uIn1lbHNlIG09bnVsbAp3aGlsZSghMCl7aWYoIShrPjgwJiZiLmxlbmd0aD4zKSlicmVh
+awppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQprLT1iLnBvcCgpLmxlbmd0aCsyCmlmKG09
+PW51bGwpe2srPTUKbT0iLi4uIn19aWYobSE9bnVsbClDLk5tLmkoYixtKQpDLk5tLmkoYixxKQpDLk5t
+LmkoYixyKX0sCnRNOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPVAuTHMoYikKZm9yKHM9YS5sZW5ndGgs
+cj0wO3I8YS5sZW5ndGg7YS5sZW5ndGg9PT1zfHwoMCxILmxrKShhKSwrK3IpcS5pKDAsYi5hKGFbcl0p
+KQpyZXR1cm4gcX0sCm5POmZ1bmN0aW9uKGEpe3ZhciBzLHI9e30KaWYoUC5oQihhKSlyZXR1cm4iey4u
+Ln0iCnM9bmV3IFAuUm4oIiIpCnRyeXtDLk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAs
+bmV3IFAucmEocixzKSkKcy5hKz0ifSJ9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5P
+SCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwK
+YjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwK
+Xy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVs
+bH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVs
+bApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24gbVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0
+aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24gaWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24gWWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0s
+CktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIp
+e3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApsZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7
+fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApuWTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7
+fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApwUjpmdW5jdGlvbiBwUigpe30sCkJTOmZ1bmN0aW9uKGEsYil7
+dmFyIHMscixxLHAKaWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQpzPW51bGwK
+dHJ5e3M9SlNPTi5wYXJzZShhKX1jYXRjaChxKXtyPUguUnUocSkKcD1QLnJyKFN0cmluZyhyKSxudWxs
+LG51bGwpCnRocm93IEguYihwKX1wPVAuUWUocykKcmV0dXJuIHB9LApRZTpmdW5jdGlvbihhKXt2YXIg
+cwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQppZihP
+YmplY3QuZ2V0UHJvdG90eXBlT2YoYSkhPT1BcnJheS5wcm90b3R5cGUpcmV0dXJuIG5ldyBQLnV3KGEs
+T2JqZWN0LmNyZWF0ZShudWxsKSkKZm9yKHM9MDtzPGEubGVuZ3RoOysrcylhW3NdPVAuUWUoYVtzXSkK
+cmV0dXJuIGF9LApreTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlmKGIgaW5zdGFuY2VvZiBVaW50
+OEFycmF5KXtzPWIKZD1zLmxlbmd0aAppZihkLWM8MTUpcmV0dXJuIG51bGwKcj1QLkNHKGEscyxjLGQp
+CmlmKHIhPW51bGwmJmEpaWYoci5pbmRleE9mKCJcdWZmZmQiKT49MClyZXR1cm4gbnVsbApyZXR1cm4g
+cn1yZXR1cm4gbnVsbH0sCkNHOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPWE/JC5IRygpOiQucmYoKQpp
+ZihzPT1udWxsKXJldHVybiBudWxsCmlmKDA9PT1jJiZkPT09Yi5sZW5ndGgpcmV0dXJuIFAuUmIocyxi
+KQpyZXR1cm4gUC5SYihzLGIuc3ViYXJyYXkoYyxQLmpCKGMsZCxiLmxlbmd0aCkpKX0sClJiOmZ1bmN0
+aW9uKGEsYil7dmFyIHMscgp0cnl7cz1hLmRlY29kZShiKQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIp
+fXJldHVybiBudWxsfSwKeE06ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTAp
+dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBi
+ZSBtdWx0aXBsZSBvZiBmb3VyLCBpcyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigi
+SW52YWxpZCBiYXNlNjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhy
+b3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJh
+Y3RlcnMiLGEsYikpfSwKR3k6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5VZChhLGIpfSwKTkM6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGEuTHQoKX0sClVnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLnR1
+KGEsW10sUC5DeSgpKX0sCnVYOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPW5ldyBQLlJuKCIiKSxxPVAu
+VWcocixiKQpxLmlVKGEpCnM9ci5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKajQ6ZnVu
+Y3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgNjU6cmV0dXJuIk1pc3NpbmcgZXh0ZW5zaW9uIGJ5dGUiCmNh
+c2UgNjc6cmV0dXJuIlVuZXhwZWN0ZWQgZXh0ZW5zaW9uIGJ5dGUiCmNhc2UgNjk6cmV0dXJuIkludmFs
+aWQgVVRGLTggYnl0ZSIKY2FzZSA3MTpyZXR1cm4iT3ZlcmxvbmcgZW5jb2RpbmciCmNhc2UgNzM6cmV0
+dXJuIk91dCBvZiB1bmljb2RlIHJhbmdlIgpjYXNlIDc1OnJldHVybiJFbmNvZGVkIHN1cnJvZ2F0ZSIK
+Y2FzZSA3NzpyZXR1cm4iVW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZSIKZGVmYXVsdDpyZXR1
+cm4iIn19LApqeTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9Yy1iLG89bmV3IFVpbnQ4QXJyYXko
+cCkKZm9yKHM9Si5VNihhKSxyPTA7cjxwOysrcil7cT1zLnEoYSxiK3IpCmlmKHR5cGVvZiBxIT09Im51
+bWJlciIpcmV0dXJuIHEuek0oKQppZigocSY0Mjk0OTY3MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXAp
+cmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhpcy5hPWF9LAp4cjpm
+dW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpm
+dW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpm
+dW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpm
+dW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpm
+dW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVu
+Y3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVu
+Y3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1iCnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUo
+KXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1h
+fSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApiejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0
+aGlzLmI9MTYKdGhpcy5jPTB9LApRQTpmdW5jdGlvbihhLGIpe3ZhciBzPUguSHAoYSxiKQppZihzIT1u
+dWxsKXJldHVybiBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApvczpmdW5jdGlvbihhKXtp
+ZihhIGluc3RhbmNlb2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBvZiAnIitILkVq
+KEguTShhKSkrIicifSwKTzg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj1jP0ouS2goYSxkKTpKLlFp
+KGEsZCkKaWYoYSE9PTAmJmIhPW51bGwpZm9yKHM9MDtzPHIubGVuZ3RoOysrcylyW3NdPWIKcmV0dXJu
+IHJ9LApDSDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj1ILlZNKFtdLGMuQygiamQ8MD4iKSkKZm9yKHM9
+Si5JVChhKTtzLkYoKTspQy5ObS5pKHIsYy5hKHMuZ2woKSkpCmlmKGIpcmV0dXJuIHIKcmV0dXJuIEou
+RXAocixjKX0sClkxOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwppZihiKXJldHVybiBQLmV2KGEsYykKcz1K
+LkVwKFAuZXYoYSxjKSxjKQpyZXR1cm4gc30sCmV2OmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZihBcnJh
+eS5pc0FycmF5KGEpKXJldHVybiBILlZNKGEuc2xpY2UoMCksYi5DKCJqZDwwPiIpKQpzPUguVk0oW10s
+Yi5DKCJqZDwwPiIpKQpmb3Iocj1KLklUKGEpO3IuRigpOylDLk5tLmkocyxyLmdsKCkpCnJldHVybiBz
+fSwKQUY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi56QyhQLkNIKGEsITEsYikpfSwKSE06ZnVuY3Rpb24o
+YSxiLGMpe2lmKHQuYm0uYihhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5ndGgpKQpyZXR1
+cm4gUC5idyhhLGIsYyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3OmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcyxyLHEscCxvPW51bGwKaWYoYjwwKXRocm93IEguYihQLlRFKGIsMCxhLmxlbmd0
+aCxvLG8pKQpzPWM9PW51bGwKaWYoIXMmJmM8Yil0aHJvdyBILmIoUC5URShjLGIsYS5sZW5ndGgsbyxv
+KSkKcj1uZXcgSC5hNyhhLGEubGVuZ3RoLEgueihhKS5DKCJhNzxsRC5FPiIpKQpmb3IocT0wO3E8Yjsr
+K3EpaWYoIXIuRigpKXRocm93IEguYihQLlRFKGIsMCxxLG8sbykpCnA9W10KaWYocylmb3IoO3IuRigp
+OylwLnB1c2goci5kKQplbHNlIGZvcihxPWI7cTxjOysrcSl7aWYoIXIuRigpKXRocm93IEguYihQLlRF
+KGMsYixxLG8sbykpCnAucHVzaChyLmQpfXJldHVybiBILmVUKHApfSwKbnU6ZnVuY3Rpb24oYSl7cmV0
+dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCExLCExLCExKSl9LAp2ZzpmdW5jdGlvbihhLGIsYyl7
+dmFyIHM9Si5JVChiKQppZighcy5GKCkpcmV0dXJuIGEKaWYoYy5sZW5ndGg9PT0wKXtkbyBhKz1ILkVq
+KHMuZ2woKSkKd2hpbGUocy5GKCkpfWVsc2V7YSs9SC5FaihzLmdsKCkpCmZvcig7cy5GKCk7KWE9YStj
+K0guRWoocy5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBuZXcgUC5t
+cChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFyIHM9SC5NMCgpCmlmKHMhPW51bGwpcmV0dXJuIFAu
+aEsocykKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFzZScgaXMgbm90IHN1cHBvcnRlZCIpKX0sCmVQOmZ1
+bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbixtPSIwMTIzNDU2Nzg5QUJDREVGIgppZihjPT09
+Qy54TSl7cz0kLno0KCkuYgppZih0eXBlb2YgYiE9InN0cmluZyIpSC52KEgudEwoYikpCnM9cy50ZXN0
+KGIpfWVsc2Ugcz0hMQppZihzKXJldHVybiBiCkguTGgoYykuQygiVWsuUyIpLmEoYikKcj1jLmdaRSgp
+LldKKGIpCmZvcihzPXIubGVuZ3RoLHE9MCxwPSIiO3E8czsrK3Epe289cltxXQppZihvPDEyOCl7bj1v
+Pj4+NAppZihuPj04KXJldHVybiBILk9IKGEsbikKbj0oYVtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49
+ITEKaWYobilwKz1ILkx3KG8pCmVsc2UgcD1kJiZvPT09MzI/cCsiKyI6cCsiJSIrbVtvPj4+NCYxNV0r
+bVtvJjE1XX1yZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCkdxOmZ1bmN0aW9uKGEpe3ZhciBz
+PU1hdGguYWJzKGEpLHI9YTwwPyItIjoiIgppZihzPj0xMDAwKXJldHVybiIiK2EKaWYocz49MTAwKXJl
+dHVybiByKyIwIitzCmlmKHM+PTEwKXJldHVybiByKyIwMCIrcwpyZXR1cm4gcisiMDAwIitzfSwKVng6
+ZnVuY3Rpb24oYSl7aWYoYT49MTAwKXJldHVybiIiK2EKaWYoYT49MTApcmV0dXJuIjAiK2EKcmV0dXJu
+IjAwIithfSwKaDA6ZnVuY3Rpb24oYSl7aWYoYT49MTApcmV0dXJuIiIrYQpyZXR1cm4iMCIrYX0sCnA6
+ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIifHxILmwoYSl8fG51bGw9PWEpcmV0dXJuIEou
+aihhKQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpCnJldHVybiBQ
+Lm9zKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkM2KGEpfSwKeFk6ZnVuY3Rpb24oYSl7
+cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwKTDM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBu
+ZXcgUC51KCEwLGEsYixjKX0sCk1SOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYX0sCk83OmZ1bmN0aW9u
+KGEsYil7cmV0dXJuIG5ldyBQLmJKKG51bGwsbnVsbCwhMCxhLGIsIlZhbHVlIG5vdCBpbiByYW5nZSIp
+fSwKVEU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gbmV3IFAuYkooYixjLCEwLGEsZCwiSW52YWxp
+ZCB2YWx1ZSIpfSwKd0E6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYTxifHxhPmMpdGhyb3cgSC5iKFAuVEUo
+YSxiLGMsZCxudWxsKSkKcmV0dXJuIGF9LApqQjpmdW5jdGlvbihhLGIsYyl7aWYoMD5hfHxhPmMpdGhy
+b3cgSC5iKFAuVEUoYSwwLGMsInN0YXJ0IixudWxsKSkKaWYoYiE9bnVsbCl7aWYoYT5ifHxiPmMpdGhy
+b3cgSC5iKFAuVEUoYixhLGMsImVuZCIsbnVsbCkpCnJldHVybiBifXJldHVybiBjfSwKazE6ZnVuY3Rp
+b24oYSxiKXtpZihhPDApdGhyb3cgSC5iKFAuVEUoYSwwLG51bGwsYixudWxsKSkKcmV0dXJuIGF9LApD
+ZjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzPUgudVAoZT09bnVsbD9KLkhtKGIpOmUpCnJldHVybiBu
+ZXcgUC5lWShzLCEwLGEsYywiSW5kZXggb3V0IG9mIHJhbmdlIil9LApMNDpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFAudWIoYSl9LApTWTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuZHMoYSl9LApQVjpmdW5j
+dGlvbihhKXtyZXR1cm4gbmV3IFAubGooYSl9LAphNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVVYo
+YSl9LApycjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLmFFKGEsYixjKX0sCmhLOmZ1bmN0aW9u
+KGE1KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYSxhMCxhMSxhMixhMz1u
+dWxsLGE0PWE1Lmxlbmd0aAppZihhND49NSl7cz0oKEouUXooYTUsNCleNTgpKjN8Qy54Qi5XKGE1LDAp
+XjEwMHxDLnhCLlcoYTUsMSleOTd8Qy54Qi5XKGE1LDIpXjExNnxDLnhCLlcoYTUsMyleOTcpPj4+MApp
+ZihzPT09MClyZXR1cm4gUC5LRChhNDxhND9DLnhCLk5qKGE1LDAsYTQpOmE1LDUsYTMpLmdsUigpCmVs
+c2UgaWYocz09PTMyKXJldHVybiBQLktEKEMueEIuTmooYTUsNSxhNCksMCxhMykuZ2xSKCl9cj1QLk84
+KDgsMCwhMSx0LlMpCkMuTm0uWTUociwwLDApCkMuTm0uWTUociwxLC0xKQpDLk5tLlk1KHIsMiwtMSkK
+Qy5ObS5ZNShyLDcsLTEpCkMuTm0uWTUociwzLDApCkMuTm0uWTUociw0LDApCkMuTm0uWTUociw1LGE0
+KQpDLk5tLlk1KHIsNixhNCkKaWYoUC5VQihhNSwwLGE0LDAscik+PTE0KUMuTm0uWTUociw3LGE0KQpx
+PXJbMV0KaWYocT49MClpZihQLlVCKGE1LDAscSwyMCxyKT09PTIwKXJbN109cQpwPXJbMl0rMQpvPXJb
+M10Kbj1yWzRdCm09cls1XQpsPXJbNl0KaWYobDxtKW09bAppZihuPHApbj1tCmVsc2UgaWYobjw9cSlu
+PXErMQppZihvPHApbz1uCms9cls3XTwwCmlmKGspaWYocD5xKzMpe2o9YTMKaz0hMX1lbHNle2k9bz4w
+CmlmKGkmJm8rMT09PW4pe2o9YTMKaz0hMX1lbHNle2lmKCEobTxhNCYmbT09PW4rMiYmSi5xMChhNSwi
+Li4iLG4pKSloPW0+bisyJiZKLnEwKGE1LCIvLi4iLG0tMykKZWxzZSBoPSEwCmlmKGgpe2o9YTMKaz0h
+MX1lbHNle2lmKHE9PT00KWlmKEoucTAoYTUsImZpbGUiLDApKXtpZihwPD0wKXtpZighQy54Qi5RaShh
+NSwiLyIsbikpe2c9ImZpbGU6Ly8vIgpzPTN9ZWxzZXtnPSJmaWxlOi8vIgpzPTJ9YTU9ZytDLnhCLk5q
+KGE1LG4sYTQpCnEtPTAKaT1zLTAKbSs9aQpsKz1pCmE0PWE1Lmxlbmd0aApwPTcKbz03Cm49N31lbHNl
+IGlmKG49PT1tKXsrK2wKZj1tKzEKYTU9Qy54Qi5pNyhhNSxuLG0sIi8iKTsrK2E0Cm09Zn1qPSJmaWxl
+In1lbHNlIGlmKEMueEIuUWkoYTUsImh0dHAiLDApKXtpZihpJiZvKzM9PT1uJiZDLnhCLlFpKGE1LCI4
+MCIsbysxKSl7bC09MwplPW4tMwptLT0zCmE1PUMueEIuaTcoYTUsbyxuLCIiKQphNC09MwpuPWV9aj0i
+aHR0cCJ9ZWxzZSBqPWEzCmVsc2UgaWYocT09PTUmJkoucTAoYTUsImh0dHBzIiwwKSl7aWYoaSYmbys0
+PT09biYmSi5xMChhNSwiNDQzIixvKzEpKXtsLT00CmU9bi00Cm0tPTQKYTU9Si5kZyhhNSxvLG4sIiIp
+CmE0LT0zCm49ZX1qPSJodHRwcyJ9ZWxzZSBqPWEzCms9ITB9fX1lbHNlIGo9YTMKaWYoayl7aT1hNS5s
+ZW5ndGgKaWYoYTQ8aSl7YTU9Si5sZChhNSwwLGE0KQpxLT0wCnAtPTAKby09MApuLT0wCm0tPTAKbC09
+MH1yZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9aWYoaj09bnVsbClpZihxPjApaj1QLlBp
+KGE1LDAscSkKZWxzZXtpZihxPT09MCl7UC5SMyhhNSwwLCJJbnZhbGlkIGVtcHR5IHNjaGVtZSIpCkgu
+QmkodS5nKX1qPSIifWlmKHA+MCl7ZD1xKzMKYz1kPHA/UC56UihhNSxkLHAtMSk6IiIKYj1QLk9lKGE1
+LHAsbywhMSkKaT1vKzEKaWYoaTxuKXthPUguSHAoSi5sZChhNSxpLG4pLGEzKQphMD1QLndCKGE9PW51
+bGw/SC52KFAucnIoIkludmFsaWQgcG9ydCIsYTUsaSkpOmEsail9ZWxzZSBhMD1hM31lbHNle2EwPWEz
+CmI9YTAKYz0iIn1hMT1QLmthKGE1LG4sbSxhMyxqLGIhPW51bGwpCmEyPW08bD9QLmxlKGE1LG0rMSxs
+LGEzKTphMwpyZXR1cm4gbmV3IFAuRG4oaixjLGIsYTAsYTEsYTIsbDxhND9QLnRHKGE1LGwrMSxhNCk6
+YTMpfSwKTXQ6ZnVuY3Rpb24oYSl7SC5oKGEpCnJldHVybiBQLmt1KGEsMCxhLmxlbmd0aCxDLnhNLCEx
+KX0sCldYOmZ1bmN0aW9uKGEpe3ZhciBzPXQuTgpyZXR1cm4gQy5ObS5OMChILlZNKGEuc3BsaXQoIiYi
+KSx0LnMpLFAuRmwocyxzKSxuZXcgUC5uMShDLnhNKSx0LkopfSwKSGg6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzLHIscSxwLG8sbixtPSJJUHY0IGFkZHJlc3Mgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSA0IHBhcnRz
+IixsPSJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IixrPW5ldyBQLmNTKGEpLGo9
+bmV3IFVpbnQ4QXJyYXkoNCkKZm9yKHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54Qi5PKGEscykKaWYo
+cCE9PTQ2KXtpZigocF40OCk+OSlrLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscyl9ZWxzZXtpZihxPT09
+MylrLiQyKG0scykKbz1QLlFBKEMueEIuTmooYSxyLHMpLG51bGwpCmlmKG8+MjU1KWsuJDIobCxyKQpu
+PXErMQppZihxPj00KXJldHVybiBILk9IKGoscSkKaltxXT1vCnI9cysxCnE9bn19aWYocSE9PTMpay4k
+MihtLGMpCm89UC5RQShDLnhCLk5qKGEscixjKSxudWxsKQppZihvPjI1NSlrLiQyKGwscikKaWYocT49
+NClyZXR1cm4gSC5PSChqLHEpCmpbcV09bwpyZXR1cm4gan0sCmVnOmZ1bmN0aW9uKGEsYixhMCl7dmFy
+IHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQ9bmV3IFAuVkMoYSksYz1uZXcgUC5KVChkLGEp
+CmlmKGEubGVuZ3RoPDIpZC4kMSgiYWRkcmVzcyBpcyB0b28gc2hvcnQiKQpzPUguVk0oW10sdC5hKQpm
+b3Iocj1iLHE9cixwPSExLG89ITE7cjxhMDsrK3Ipe249Qy54Qi5PKGEscikKaWYobj09PTU4KXtpZihy
+PT09Yil7KytyCmlmKEMueEIuTyhhLHIpIT09NTgpZC4kMigiaW52YWxpZCBzdGFydCBjb2xvbi4iLHIp
+CnE9cn1pZihyPT09cSl7aWYocClkLiQyKCJvbmx5IG9uZSB3aWxkY2FyZCBgOjpgIGlzIGFsbG93ZWQi
+LHIpCkMuTm0uaShzLC0xKQpwPSEwfWVsc2UgQy5ObS5pKHMsYy4kMihxLHIpKQpxPXIrMX1lbHNlIGlm
+KG49PT00NilvPSEwfWlmKHMubGVuZ3RoPT09MClkLiQxKCJ0b28gZmV3IHBhcnRzIikKbT1xPT09YTAK
+bD1DLk5tLmdyWihzKQppZihtJiZsIT09LTEpZC4kMigiZXhwZWN0ZWQgYSBwYXJ0IGFmdGVyIGxhc3Qg
+YDpgIixhMCkKaWYoIW0paWYoIW8pQy5ObS5pKHMsYy4kMihxLGEwKSkKZWxzZXtrPVAuSGgoYSxxLGEw
+KQpDLk5tLmkocywoa1swXTw8OHxrWzFdKT4+PjApCkMuTm0uaShzLChrWzJdPDw4fGtbM10pPj4+MCl9
+aWYocCl7aWYocy5sZW5ndGg+NylkLiQxKCJhbiBhZGRyZXNzIHdpdGggYSB3aWxkY2FyZCBtdXN0IGhh
+dmUgbGVzcyB0aGFuIDcgcGFydHMiKX1lbHNlIGlmKHMubGVuZ3RoIT09OClkLiQxKCJhbiBhZGRyZXNz
+IHdpdGhvdXQgYSB3aWxkY2FyZCBtdXN0IGNvbnRhaW4gZXhhY3RseSA4IHBhcnRzIikKaj1uZXcgVWlu
+dDhBcnJheSgxNikKZm9yKGw9cy5sZW5ndGgsaT05LWwscj0wLGg9MDtyPGw7KytyKXtnPXNbcl0KaWYo
+Zz09PS0xKWZvcihmPTA7ZjxpOysrZil7aWYoaDwwfHxoPj0xNilyZXR1cm4gSC5PSChqLGgpCmpbaF09
+MAplPWgrMQppZihlPj0xNilyZXR1cm4gSC5PSChqLGUpCmpbZV09MApoKz0yfWVsc2V7ZT1DLmpuLndH
+KGcsOCkKaWYoaDwwfHxoPj0xNilyZXR1cm4gSC5PSChqLGgpCmpbaF09ZQplPWgrMQppZihlPj0xNily
+ZXR1cm4gSC5PSChqLGUpCmpbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGp9LApLTDpmdW5jdGlvbihhLGIs
+YyxkLGUsZixnKXt2YXIgcyxyLHEscCxvLG4KZj1mPT1udWxsPyIiOlAuUGkoZiwwLGYubGVuZ3RoKQpn
+PVAuelIoZywwLGc9PW51bGw/MDpnLmxlbmd0aCkKYT1QLk9lKGEsMCxhPT1udWxsPzA6YS5sZW5ndGgs
+ITEpCnM9UC5sZShudWxsLDAsMCxlKQpyPVAudEcobnVsbCwwLDApCmQ9UC53QihkLGYpCnE9Zj09PSJm
+aWxlIgppZihhPT1udWxsKXA9Zy5sZW5ndGghPT0wfHxkIT1udWxsfHxxCmVsc2UgcD0hMQppZihwKWE9
+IiIKcD1hPT1udWxsCm89IXAKYj1QLmthKGIsMCxiPT1udWxsPzA6Yi5sZW5ndGgsYyxmLG8pCm49Zi5s
+ZW5ndGg9PT0wCmlmKG4mJnAmJiFDLnhCLm4oYiwiLyIpKWI9UC53RihiLCFufHxvKQplbHNlIGI9UC54
+ZShiKQpyZXR1cm4gbmV3IFAuRG4oZixnLHAmJkMueEIubihiLCIvLyIpPyIiOmEsZCxiLHMscil9LAp3
+SzpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAiKXJldHVybiA4MAppZihhPT09Imh0dHBzIilyZXR1cm4g
+NDQzCnJldHVybiAwfSwKUjM6ZnVuY3Rpb24oYSxiLGMpe3Rocm93IEguYihQLnJyKGMsYSxiKSl9LApY
+ZDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGg9bnVsbCxnPWIubGVu
+Z3RoCmlmKGchPT0wKXtxPTAKd2hpbGUoITApe2lmKCEocTxnKSl7cz0iIgpyPTAKYnJlYWt9aWYoQy54
+Qi5XKGIscSk9PT02NCl7cz1DLnhCLk5qKGIsMCxxKQpyPXErMQpicmVha30rK3F9aWYocjxnJiZDLnhC
+LlcoYixyKT09PTkxKXtmb3IocD1yLG89LTE7cDxnOysrcCl7bj1DLnhCLlcoYixwKQppZihuPT09Mzcm
+Jm88MCl7bT1DLnhCLlFpKGIsIjI1IixwKzEpP3ArMjpwCm89cApwPW19ZWxzZSBpZihuPT09OTMpYnJl
+YWt9aWYocD09PWcpdGhyb3cgSC5iKFAucnIoIkludmFsaWQgSVB2NiBob3N0IGVudHJ5LiIsYixyKSkK
+bD1vPDA/cDpvClAuZWcoYixyKzEsbCk7KytwCmlmKHAhPT1nJiZDLnhCLlcoYixwKSE9PTU4KXRocm93
+IEguYihQLnJyKCJJbnZhbGlkIGVuZCBvZiBhdXRob3JpdHkiLGIscCkpfWVsc2UgcD1yCndoaWxlKCEw
+KXtpZighKHA8Zykpe2s9aApicmVha31pZihDLnhCLlcoYixwKT09PTU4KXtqPUMueEIueW4oYixwKzEp
+Cms9ai5sZW5ndGghPT0wP1AuUUEoaixoKTpoCmJyZWFrfSsrcH1pPUMueEIuTmooYixyLHApfWVsc2V7
+az1oCmk9awpzPSIifXJldHVybiBQLktMKGksaCxILlZNKGMuc3BsaXQoIi8iKSx0LnMpLGssZCxhLHMp
+fSwKa0U6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9MDtyPHM7Kyty
+KXtxPWFbcl0KcS50b1N0cmluZwpwPUouVTYocSkKbz1wLmdBKHEpCmlmKDA+bylILnYoUC5URSgwLDAs
+cC5nQShxKSxudWxsLG51bGwpKQppZihILlNRKHEsIi8iLDApKXtzPVAuTDQoIklsbGVnYWwgcGF0aCBj
+aGFyYWN0ZXIgIitILkVqKHEpKQp0aHJvdyBILmIocyl9fX0sCkhOOmZ1bmN0aW9uKGEsYixjKXt2YXIg
+cyxyLHEKZm9yKHM9SC5xQyhhLGMsbnVsbCxILnQ2KGEpLmMpLHM9bmV3IEguYTcocyxzLmdBKHMpLHMu
+JHRpLkMoImE3PGFMLkU+IikpO3MuRigpOyl7cj1zLmQKcT1QLm51KCdbIiovOjw+P1xcXFx8XScpCnIu
+dG9TdHJpbmcKaWYoSC5TUShyLHEsMCkpe3M9UC5MNCgiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDog
+IityKQp0aHJvdyBILmIocyl9fX0sCnJnOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoISg2NTw9YSYmYTw9
+OTApKXM9OTc8PWEmJmE8PTEyMgplbHNlIHM9ITAKaWYocylyZXR1cm4Kcz1QLkw0KCJJbGxlZ2FsIGRy
+aXZlIGxldHRlciAiK1AuT28oYSkpCnRocm93IEguYihzKX0sCndCOmZ1bmN0aW9uKGEsYil7aWYoYSE9
+bnVsbCYmYT09PVAud0soYikpcmV0dXJuIG51bGwKcmV0dXJuIGF9LApPZTpmdW5jdGlvbihhLGIsYyxk
+KXt2YXIgcyxyLHEscCxvLG4KaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZihiPT09YylyZXR1cm4iIgpp
+ZihDLnhCLk8oYSxiKT09PTkxKXtzPWMtMQppZihDLnhCLk8oYSxzKSE9PTkzKXtQLlIzKGEsYiwiTWlz
+c2luZyBlbmQgYF1gIHRvIG1hdGNoIGBbYCBpbiBob3N0IikKSC5CaSh1LmcpfXI9YisxCnE9UC50byhh
+LHIscykKaWYocTxzKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxzLCIlMjUi
+KX1lbHNlIG89IiIKUC5lZyhhLHIscSkKcmV0dXJuIEMueEIuTmooYSxiLHEpLnRvTG93ZXJDYXNlKCkr
+bysiXSJ9Zm9yKG49YjtuPGM7KytuKWlmKEMueEIuTyhhLG4pPT09NTgpe3E9Qy54Qi5YVShhLCIlIixi
+KQpxPXE+PWImJnE8Yz9xOmMKaWYocTxjKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9x
+KzM6cCxjLCIlMjUiKX1lbHNlIG89IiIKUC5lZyhhLGIscSkKcmV0dXJuIlsiK0MueEIuTmooYSxiLHEp
+K28rIl0ifXJldHVybiBQLk9MKGEsYixjKX0sCnRvOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1DLnhCLlhV
+KGEsIiUiLGIpCnJldHVybiBzPj1iJiZzPGM/czpjfSwKT0E6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMs
+cixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/bmV3IFAuUm4oZCk6bnVsbApmb3Iocz1iLHI9cyxxPSEw
+O3M8Yzspe3A9Qy54Qi5PKGEscykKaWYocD09PTM3KXtvPVAucnYoYSxzLCEwKQpuPW89PW51bGwKaWYo
+biYmcSl7cys9Mwpjb250aW51ZX1pZihpPT1udWxsKWk9bmV3IFAuUm4oIiIpCm09aS5hKz1DLnhCLk5q
+KGEscixzKQppZihuKW89Qy54Qi5OaihhLHMscyszKQplbHNlIGlmKG89PT0iJSIpe1AuUjMoYSxzLCJa
+b25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55bW9yZSIpCkguQmkodS5nKX1pLmE9bStvCnMrPTMK
+cj1zCnE9ITB9ZWxzZXtpZihwPDEyNyl7bj1wPj4+NAppZihuPj04KXJldHVybiBILk9IKEMuRjMsbikK
+bj0oQy5GM1tuXSYxPDwocCYxNSkpIT09MH1lbHNlIG49ITEKaWYobil7aWYocSYmNjU8PXAmJjkwPj1w
+KXtpZihpPT1udWxsKWk9bmV3IFAuUm4oIiIpCmlmKHI8cyl7aS5hKz1DLnhCLk5qKGEscixzKQpyPXN9
+cT0hMX0rK3N9ZWxzZXtpZigocCY2NDUxMik9PT01NTI5NiYmcysxPGMpe2w9Qy54Qi5PKGEscysxKQpp
+ZigobCY2NDUxMik9PT01NjMyMCl7cD0ocCYxMDIzKTw8MTB8bCYxMDIzfDY1NTM2Cms9Mn1lbHNlIGs9
+MX1lbHNlIGs9MQpqPUMueEIuTmooYSxyLHMpCmlmKGk9PW51bGwpe2k9bmV3IFAuUm4oIiIpCm49aX1l
+bHNlIG49aQpuLmErPWoKbi5hKz1QLnpYKHApCnMrPWsKcj1zfX19aWYoaT09bnVsbClyZXR1cm4gQy54
+Qi5OaihhLGIsYykKaWYocjxjKWkuYSs9Qy54Qi5OaihhLHIsYykKbj1pLmEKcmV0dXJuIG4uY2hhckNv
+ZGVBdCgwKT09MD9uOm59LApPTDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGos
+aQpmb3Iocz1iLHI9cyxxPW51bGwscD0hMDtzPGM7KXtvPUMueEIuTyhhLHMpCmlmKG89PT0zNyl7bj1Q
+LnJ2KGEscywhMCkKbT1uPT1udWxsCmlmKG0mJnApe3MrPTMKY29udGludWV9aWYocT09bnVsbClxPW5l
+dyBQLlJuKCIiKQpsPUMueEIuTmooYSxyLHMpCms9cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bAppZiht
+KXtuPUMueEIuTmooYSxzLHMrMykKaj0zfWVsc2UgaWYobj09PSIlIil7bj0iJTI1IgpqPTF9ZWxzZSBq
+PTMKcS5hPWsrbgpzKz1qCnI9cwpwPSEwfWVsc2V7aWYobzwxMjcpe209bz4+PjQKaWYobT49OClyZXR1
+cm4gSC5PSChDLmVhLG0pCm09KEMuZWFbbV0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe2lm
+KHAmJjY1PD1vJiY5MD49byl7aWYocT09bnVsbClxPW5ldyBQLlJuKCIiKQppZihyPHMpe3EuYSs9Qy54
+Qi5OaihhLHIscykKcj1zfXA9ITF9KytzfWVsc2V7aWYobzw9OTMpe209bz4+PjQKaWYobT49OClyZXR1
+cm4gSC5PSChDLmFrLG0pCm09KEMuYWtbbV0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe1Au
+UjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCkguQmkodS5nKX1lbHNle2lmKChvJjY0NTEyKT09PTU1
+Mjk2JiZzKzE8Yyl7aT1DLnhCLk8oYSxzKzEpCmlmKChpJjY0NTEyKT09PTU2MzIwKXtvPShvJjEwMjMp
+PDwxMHxpJjEwMjN8NjU1MzYKaj0yfWVsc2Ugaj0xfWVsc2Ugaj0xCmw9Qy54Qi5OaihhLHIscykKaWYo
+IXApbD1sLnRvTG93ZXJDYXNlKCkKaWYocT09bnVsbCl7cT1uZXcgUC5SbigiIikKbT1xfWVsc2UgbT1x
+Cm0uYSs9bAptLmErPVAuelgobykKcys9agpyPXN9fX19aWYocT09bnVsbClyZXR1cm4gQy54Qi5Oaihh
+LGIsYykKaWYocjxjKXtsPUMueEIuTmooYSxyLGMpCnEuYSs9IXA/bC50b0xvd2VyQ2FzZSgpOmx9bT1x
+LmEKcmV0dXJuIG0uY2hhckNvZGVBdCgwKT09MD9tOm19LApQaTpmdW5jdGlvbihhLGIsYyl7dmFyIHMs
+cixxLHAsbz11LmcKaWYoYj09PWMpcmV0dXJuIiIKaWYoIVAuRXQoSi5yWShhKS5XKGEsYikpKXtQLlIz
+KGEsYiwiU2NoZW1lIG5vdCBzdGFydGluZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIikKSC5CaShv
+KX1mb3Iocz1iLHI9ITE7czxjOysrcyl7cT1DLnhCLlcoYSxzKQppZihxPDEyOCl7cD1xPj4+NAppZihw
+Pj04KXJldHVybiBILk9IKEMubUsscCkKcD0oQy5tS1twXSYxPDwocSYxNSkpIT09MH1lbHNlIHA9ITEK
+aWYoIXApe1AuUjMoYSxzLCJJbGxlZ2FsIHNjaGVtZSBjaGFyYWN0ZXIiKQpILkJpKG8pfWlmKDY1PD1x
+JiZxPD05MClyPSEwfWE9Qy54Qi5OaihhLGIsYykKcmV0dXJuIFAuWWEocj9hLnRvTG93ZXJDYXNlKCk6
+YSl9LApZYTpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAiKXJldHVybiJodHRwIgppZihhPT09ImZpbGUi
+KXJldHVybiJmaWxlIgppZihhPT09Imh0dHBzIilyZXR1cm4iaHR0cHMiCmlmKGE9PT0icGFja2FnZSIp
+cmV0dXJuInBhY2thZ2UiCnJldHVybiBhfSwKelI6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGwpcmV0
+dXJuIiIKcmV0dXJuIFAuUEkoYSxiLGMsQy50bywhMSl9LAprYTpmdW5jdGlvbihhLGIsYyxkLGUsZil7
+dmFyIHMscixxPWU9PT0iZmlsZSIscD1xfHxmCmlmKGE9PW51bGwpe2lmKGQ9PW51bGwpcmV0dXJuIHE/
+Ii8iOiIiCnM9SC50NihkKQpyPW5ldyBILmxKKGQscy5DKCJxVSgxKSIpLmEobmV3IFAuUlooKSkscy5D
+KCJsSjwxLHFVPiIpKS5rKDAsIi8iKX1lbHNlIGlmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoIkJvdGgg
+cGF0aCBhbmQgcGF0aFNlZ21lbnRzIHNwZWNpZmllZCIpKQplbHNlIHI9UC5QSShhLGIsYyxDLldkLCEw
+KQppZihyLmxlbmd0aD09PTApe2lmKHEpcmV0dXJuIi8ifWVsc2UgaWYocCYmIUMueEIubihyLCIvIikp
+cj0iLyIrcgpyZXR1cm4gUC5KcihyLGUsZil9LApKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Yi5sZW5n
+dGg9PT0wCmlmKHMmJiFjJiYhQy54Qi5uKGEsIi8iKSlyZXR1cm4gUC53RihhLCFzfHxjKQpyZXR1cm4g
+UC54ZShhKX0sCmxlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHI9e30KaWYoYSE9bnVsbCl7aWYoZCE9
+bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmll
+ZCIpKQpyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX1pZihkPT1udWxsKXJldHVybiBudWxsCnM9bmV3
+IFAuUm4oIiIpCnIuYT0iIgpkLksoMCxuZXcgUC55NShuZXcgUC5NRShyLHMpKSkKcj1zLmEKcmV0dXJu
+IHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9LAp0RzpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbClyZXR1
+cm4gbnVsbApyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX0sCnJ2OmZ1bmN0aW9uKGEsYixjKXt2YXIg
+cyxyLHEscCxvLG49YisyCmlmKG4+PWEubGVuZ3RoKXJldHVybiIlIgpzPUMueEIuTyhhLGIrMSkKcj1D
+LnhCLk8oYSxuKQpxPUgub28ocykKcD1ILm9vKHIpCmlmKHE8MHx8cDwwKXJldHVybiIlIgpvPXEqMTYr
+cAppZihvPDEyNyl7bj1DLmpuLndHKG8sNCkKaWYobj49OClyZXR1cm4gSC5PSChDLkYzLG4pCm49KEMu
+RjNbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBuPSExCmlmKG4pcmV0dXJuIEguTHcoYyYmNjU8PW8mJjkw
+Pj1vPyhvfDMyKT4+PjA6bykKaWYocz49OTd8fHI+PTk3KXJldHVybiBDLnhCLk5qKGEsYixiKzMpLnRv
+VXBwZXJDYXNlKCkKcmV0dXJuIG51bGx9LAp6WDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxs
+LGs9IjAxMjM0NTY3ODlBQkNERUYiCmlmKGE8MTI4KXtzPW5ldyBVaW50OEFycmF5KDMpCnNbMF09MzcK
+c1sxXT1DLnhCLlcoayxhPj4+NCkKc1syXT1DLnhCLlcoayxhJjE1KX1lbHNle2lmKGE+MjA0NylpZihh
+PjY1NTM1KXtyPTI0MApxPTR9ZWxzZXtyPTIyNApxPTN9ZWxzZXtyPTE5MgpxPTJ9cD0zKnEKcz1uZXcg
+VWludDhBcnJheShwKQpmb3Iobz0wOy0tcSxxPj0wO3I9MTI4KXtuPUMuam4uYmYoYSw2KnEpJjYzfHIK
+aWYobz49cClyZXR1cm4gSC5PSChzLG8pCnNbb109MzcKbT1vKzEKbD1DLnhCLlcoayxuPj4+NCkKaWYo
+bT49cClyZXR1cm4gSC5PSChzLG0pCnNbbV09bApsPW8rMgptPUMueEIuVyhrLG4mMTUpCmlmKGw+PXAp
+cmV0dXJuIEguT0gocyxsKQpzW2xdPW0Kbys9M319cmV0dXJuIFAuSE0ocywwLG51bGwpfSwKUEk6ZnVu
+Y3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1QLlVsKGEsYixjLGQsZSkKcmV0dXJuIHM9PW51bGw/Qy54Qi5O
+aihhLGIsYyk6c30sClVsOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9
+bnVsbApmb3Iocz0hZSxyPWIscT1yLHA9ajtyPGM7KXtvPUMueEIuTyhhLHIpCmlmKG88MTI3KXtuPW8+
+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goZCxuKQpuPShkW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0h
+MQppZihuKSsrcgplbHNle2lmKG89PT0zNyl7bT1QLnJ2KGEsciwhMSkKaWYobT09bnVsbCl7cis9Mwpj
+b250aW51ZX1pZigiJSI9PT1tKXttPSIlMjUiCmw9MX1lbHNlIGw9M31lbHNle2lmKHMpaWYobzw9OTMp
+e249bz4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLmFrLG4pCm49KEMuYWtbbl0mMTw8KG8mMTUpKSE9
+PTB9ZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKXtQLlIzKGEsciwiSW52YWxpZCBjaGFyYWN0ZXIiKQpI
+LkJpKHUuZykKbD1qCm09bH1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9
+Qy54Qi5PKGEsbikKaWYoKGsmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEwfGsmMTAyM3w2NTUz
+NgpsPTJ9ZWxzZSBsPTF9ZWxzZSBsPTF9ZWxzZSBsPTEKbT1QLnpYKG8pfX1pZihwPT1udWxsKXtwPW5l
+dyBQLlJuKCIiKQpuPXB9ZWxzZSBuPXAKbi5hKz1DLnhCLk5qKGEscSxyKQpuLmErPUguRWoobSkKaWYo
+dHlwZW9mIGwhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShsKQpyKz1sCnE9cn19aWYocD09bnVsbClyZXR1
+cm4gagppZihxPGMpcC5hKz1DLnhCLk5qKGEscSxjKQpzPXAuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDAp
+PT0wP3M6c30sCnlCOmZ1bmN0aW9uKGEpe2lmKEMueEIubihhLCIuIikpcmV0dXJuITAKcmV0dXJuIEMu
+eEIuT1koYSwiLy4iKSE9PS0xfSwKeGU6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0KaWYoIVAu
+eUIoYSkpcmV0dXJuIGEKcz1ILlZNKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgs
+cD0hMSxvPTA7bzxxOysrbyl7bj1yW29dCmlmKEouUk0obiwiLi4iKSl7bT1zLmxlbmd0aAppZihtIT09
+MCl7aWYoMD49bSlyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKHMubGVuZ3RoPT09MClDLk5tLmko
+cywiIil9cD0hMH1lbHNlIGlmKCIuIj09PW4pcD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fWlmKHAp
+Qy5ObS5pKHMsIiIpCnJldHVybiBDLk5tLmsocywiLyIpfSwKd0Y6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
+LHEscCxvLG4KaWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTphCnM9SC5WTShbXSx0LnMpCmZvcihy
+PWEuc3BsaXQoIi8iKSxxPXIubGVuZ3RoLHA9ITEsbz0wO288cTsrK28pe249cltvXQppZigiLi4iPT09
+bilpZihzLmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHMpIT09Ii4uIil7aWYoMD49cy5sZW5ndGgpcmV0dXJu
+IEguT0gocywtMSkKcy5wb3AoKQpwPSEwfWVsc2V7Qy5ObS5pKHMsIi4uIikKcD0hMX1lbHNlIGlmKCIu
+Ij09PW4pcD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fXI9cy5sZW5ndGgKaWYociE9PTApaWYocj09
+PTEpe2lmKDA+PXIpcmV0dXJuIEguT0gocywwKQpyPXNbMF0ubGVuZ3RoPT09MH1lbHNlIHI9ITEKZWxz
+ZSByPSEwCmlmKHIpcmV0dXJuIi4vIgppZihwfHxDLk5tLmdyWihzKT09PSIuLiIpQy5ObS5pKHMsIiIp
+CmlmKCFiKXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCkMuTm0uWTUocywwLFAuQzEoc1sw
+XSkpfXJldHVybiBDLk5tLmsocywiLyIpfSwKQzE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9YS5sZW5n
+dGgKaWYocD49MiYmUC5FdChKLlF6KGEsMCkpKWZvcihzPTE7czxwOysrcyl7cj1DLnhCLlcoYSxzKQpp
+ZihyPT09NTgpcmV0dXJuIEMueEIuTmooYSwwLHMpKyIlM0EiK0MueEIueW4oYSxzKzEpCmlmKHI8PTEy
+Nyl7cT1yPj4+NAppZihxPj04KXJldHVybiBILk9IKEMubUsscSkKcT0oQy5tS1txXSYxPDwociYxNSkp
+PT09MH1lbHNlIHE9ITAKaWYocSlicmVha31yZXR1cm4gYX0sCm1uOmZ1bmN0aW9uKGEpe3ZhciBzLHIs
+cSxwPWEuZ0ZqKCksbz1wLmxlbmd0aAppZihvPjAmJkouSG0ocFswXSk9PT0yJiZKLmE2KHBbMF0sMSk9
+PT01OCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApClAucmcoSi5hNihwWzBdLDApLCExKQpQLkhOKHAs
+ITEsMSkKcz0hMH1lbHNle1AuSE4ocCwhMSwwKQpzPSExfXI9YS5ndFQoKSYmIXM/IlxcIjoiIgppZihh
+LmdjaigpKXtxPWEuZ0pmKGEpCmlmKHEubGVuZ3RoIT09MClyPXIrIlxcIitxKyJcXCJ9cj1QLnZnKHIs
+cCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpyCnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/bzpvfSwK
+SWg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKZm9yKHM9MCxyPTA7cjwyOysrcil7cT1DLnhCLlcoYSxi
+K3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYrcS00OAplbHNle3F8PTMyCmlmKDk3PD1xJiZxPD0xMDIp
+cz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIoUC54WSgiSW52YWxpZCBVUkwgZW5jb2RpbmciKSl9fXJl
+dHVybiBzfSwKa3U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvPUouclkoYSksbj1iCndo
+aWxlKCEwKXtpZighKG48Yykpe3M9ITAKYnJlYWt9cj1vLlcoYSxuKQppZihyPD0xMjcpaWYociE9PTM3
+KXE9ZSYmcj09PTQzCmVsc2UgcT0hMAplbHNlIHE9ITAKaWYocSl7cz0hMQpicmVha30rK259aWYocyl7
+aWYoQy54TSE9PWQpcT0hMQplbHNlIHE9ITAKaWYocSlyZXR1cm4gby5OaihhLGIsYykKZWxzZSBwPW5l
+dyBILnFqKG8uTmooYSxiLGMpKX1lbHNle3A9SC5WTShbXSx0LmEpCmZvcihuPWI7bjxjOysrbil7cj1v
+LlcoYSxuKQppZihyPjEyNyl0aHJvdyBILmIoUC54WSgiSWxsZWdhbCBwZXJjZW50IGVuY29kaW5nIGlu
+IFVSSSIpKQppZihyPT09Mzcpe2lmKG4rMz5hLmxlbmd0aCl0aHJvdyBILmIoUC54WSgiVHJ1bmNhdGVk
+IFVSSSIpKQpDLk5tLmkocCxQLkloKGEsbisxKSkKbis9Mn1lbHNlIGlmKGUmJnI9PT00MylDLk5tLmko
+cCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5MLmEocCkKcmV0dXJuIEMub0UuV0oocCl9LApFdDpmdW5j
+dGlvbihhKXt2YXIgcz1hfDMyCnJldHVybiA5Nzw9cyYmczw9MTIyfSwKS0Q6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52YWxpZCBNSU1FIHR5cGUiLGo9SC5WTShbYi0xXSx0LmEp
+CmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9
+PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhyb3cgSC5i
+KFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIpdGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3IoO3AhPT00
+NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0tMTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9PT02
+MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5ObS5pKGos
+bykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAhPT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwiYmFzZTY0
+IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5ObS5pKGos
+cikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1QLlVsKGEs
+bSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1DLnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcgUC5QRShh
+LGosYyl9LApLTjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtPSIwMTIzNDU2Nzg5QUJDREVGR0hJ
+SktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIs
+bD0iLiIsaz0iOiIsaj0iLyIsaT0iPyIsaD0iIyIsZz1ILlZNKG5ldyBBcnJheSgyMiksdC5nTikKZm9y
+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
+dmFyIHMscixxLHAsbyxuPSQudlooKQpmb3Iocz1KLnJZKGEpLHI9YjtyPGM7KytyKXtpZihkPDB8fGQ+
+PW4ubGVuZ3RoKXJldHVybiBILk9IKG4sZCkKcT1uW2RdCnA9cy5XKGEscileOTYKbz1xW3A+OTU/MzE6
+cF0KZD1vJjMxCkMuTm0uWTUoZSxvPj4+NSxyKX1yZXR1cm4gZH0sCldGOmZ1bmN0aW9uIFdGKGEsYil7
+dGhpcy5hPWEKdGhpcy5iPWJ9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
+WFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCkV6OmZ1bmN0aW9u
+IEV6KCl7fSwKRjpmdW5jdGlvbiBGKCl7fSwKdTpmdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBfPXRoaXMK
+Xy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFyIF89
+dGhpcwpfLmU9YQpfLmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZKGEs
+YixjLGQsZSl7dmFyIF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0
+aW9uIG1wKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1YjpmdW5j
+dGlvbiB1YihhKXt0aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVuY3Rp
+b24gbGooYSl7dGhpcy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0aW9u
+IGs1KCl7fSwKS1k6ZnVuY3Rpb24gS1koKXt9LApjOmZ1bmN0aW9uIGMoYSl7dGhpcy5hPWF9LApDRDpm
+dW5jdGlvbiBDRChhKXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0aGlz
+LmI9Ygp0aGlzLmM9Y30sCmNYOmZ1bmN0aW9uIGNYKCl7fSwKQW46ZnVuY3Rpb24gQW4oKXt9LApOMzpm
+dW5jdGlvbiBOMyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmM4OmZ1bmN0aW9u
+IGM4KCl7fSwKTWg6ZnVuY3Rpb24gTWgoKXt9LApaZDpmdW5jdGlvbiBaZCgpe30sClJuOmZ1bmN0aW9u
+IFJuKGEpe3RoaXMuYT1hfSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApjUzpmdW5jdGlvbiBj
+UyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rpb24gSlQo
+YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQsZSxmLGcpe3ZhciBf
+PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PW51bGwKXy55
+PSExCl8uej1udWxsCl8uUT0hMQpfLmNoPW51bGwKXy5jeD0hMQpfLmN5PW51bGwKXy5kYj0hMX0sClJa
+OmZ1bmN0aW9uIFJaKCl7fSwKTUU6ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnk1
+OmZ1bmN0aW9uIHk1KGEpe3RoaXMuYT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMpe3RoaXMuYT1hCnRo
+aXMuYj1iCnRoaXMuYz1jfSwKeUk6ZnVuY3Rpb24geUkoYSl7dGhpcy5hPWF9LApjNjpmdW5jdGlvbiBj
+Nigpe30sCnFkOmZ1bmN0aW9uIHFkKCl7fSwKVWY6ZnVuY3Rpb24gVWYoYSxiLGMsZCxlLGYsZyxoKXt2
+YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8ueD1oCl8u
+eT1udWxsfSwKcWU6ZnVuY3Rpb24gcWUoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
+YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLng9bnVsbApfLnk9ITEKXy56PW51bGwKXy5R
+PSExCl8uY2g9bnVsbApfLmN4PSExCl8uY3k9bnVsbApfLmRiPSExfSwKaUo6ZnVuY3Rpb24gaUooKXt9
+LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVGE6ZnVuY3Rpb24gVGEoYSxi
+KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkJmOmZ1bmN0aW9uIEJmKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
+LApBczpmdW5jdGlvbiBBcygpe30sCkdFOmZ1bmN0aW9uIEdFKGEpe3RoaXMuYT1hfSwKTjc6ZnVuY3Rp
+b24gTjcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVROmZ1bmN0aW9uIHVRKCl7fSwKaEY6ZnVuY3Rp
+b24gaEYoKXt9LApSNDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEKSC55OChiKQp0LmouYShkKQpp
+ZihILm9UKGIpKXtzPVtjXQpDLk5tLkZWKHMsZCkKZD1zfXI9dC56CnE9UC5DSChKLk0xKGQsUC53MCgp
+LHIpLCEwLHIpCnQuWS5hKGEpCnJldHVybiBQLndZKEguRWsoYSxxLG51bGwpKX0sCkRtOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcwp0cnl7aWYoT2JqZWN0LmlzRXh0ZW5zaWJsZShhKSYmIU9iamVjdC5wcm90b3R5
+cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1
+ZTpjfSkKcmV0dXJuITB9fWNhdGNoKHMpe0guUnUocyl9cmV0dXJuITF9LApPbTpmdW5jdGlvbihhLGIp
+e2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXJldHVybiBhW2JdCnJl
+dHVybiBudWxsfSwKd1k6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0
+eXBlb2YgYT09Im51bWJlciJ8fEgubChhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNClyZXR1
+cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5iKGEpKXJldHVybiBhCmlmKGEgaW5zdGFu
+Y2VvZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEpKXJldHVybiBQLmhFKGEsIiRkYXJ0X2pz
+RnVuY3Rpb24iLG5ldyBQLlBDKCkpCnJldHVybiBQLmhFKGEsIl8kZGFydF9qc09iamVjdCIsbmV3IFAu
+bXQoJC5rSSgpKSl9LApoRTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGwp
+e3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCmRVOmZ1bmN0aW9uKGEpe3ZhciBzLHIKaWYo
+YT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0i
+Ym9vbGVhbiIpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZILlI5KGEpKXJldHVy
+biBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYmdC5hay5iKGEpKXJldHVybiBhCmVsc2UgaWYo
+YSBpbnN0YW5jZW9mIERhdGUpe3M9SC51UChhLmdldFRpbWUoKSkKaWYoTWF0aC5hYnMocyk8PTg2NGUx
+MylyPSExCmVsc2Ugcj0hMAppZihyKUgudihQLnhZKCJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJh
+bmdlOiAiK3MpKQpILmNiKCExLCJpc1V0YyIsdC55KQpyZXR1cm4gbmV3IFAuaVAocywhMSl9ZWxzZSBp
+ZihhLmNvbnN0cnVjdG9yPT09JC5rSSgpKXJldHVybiBhLm8KZWxzZSByZXR1cm4gUC5ORChhKX0sCk5E
+OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBQLmlRKGEsJC53KCksbmV3
+IFAuUVMoKSkKaWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLm5w
+KCkpCnJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLlV0KCkpfSwKaVE6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzPVAuT20oYSxiKQppZihzPT1udWxsfHwhKGEgaW5zdGFuY2VvZiBPYmplY3QpKXtzPWMuJDEoYSkK
+UC5EbShhLGIscyl9cmV0dXJuIHN9LApQQzpmdW5jdGlvbiBQQygpe30sCm10OmZ1bmN0aW9uIG10KGEp
+e3RoaXMuYT1hfSwKUVM6ZnVuY3Rpb24gUVMoKXt9LApucDpmdW5jdGlvbiBucCgpe30sClV0OmZ1bmN0
+aW9uIFV0KCl7fSwKRTQ6ZnVuY3Rpb24gRTQoYSl7dGhpcy5hPWF9LApyNzpmdW5jdGlvbiByNyhhKXt0
+aGlzLmE9YX0sClR6OmZ1bmN0aW9uIFR6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmNvOmZ1bmN0
+aW9uIGNvKCl7fSwKbmQ6ZnVuY3Rpb24gbmQoKXt9LApLZTpmdW5jdGlvbiBLZShhKXt0aGlzLmE9YX0s
+CmhpOmZ1bmN0aW9uIGhpKCl7fX0sVz17CngzOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd30sClpyOmZ1
+bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50fSwKSjY6ZnVuY3Rpb24oYSl7dmFyIHM9ZG9jdW1lbnQuY3Jl
+YXRlRWxlbWVudCgiYSIpCmlmKGEhPW51bGwpQy54bi5zTFUocyxhKQpyZXR1cm4gc30sClU5OmZ1bmN0
+aW9uKGEsYixjKXt2YXIgcyxyPWRvY3VtZW50LmJvZHkKci50b1N0cmluZwpzPUMuUlkucjYocixhLGIs
+YykKcy50b1N0cmluZwpyPXQuYWMKcj1uZXcgSC5VNShuZXcgVy5lNyhzKSxyLkMoImEyKGxELkUpIiku
+YShuZXcgVy5DdigpKSxyLkMoIlU1PGxELkU+IikpCnJldHVybiB0LmguYShyLmdyOChyKSl9LApyUzpm
+dW5jdGlvbihhKXt2YXIgcyxyLHE9ImVsZW1lbnQgdGFnIHVuYXZhaWxhYmxlIgp0cnl7cz1KLllFKGEp
+CmlmKHR5cGVvZiBzLmducyhhKT09InN0cmluZyIpcT1zLmducyhhKX1jYXRjaChyKXtILlJ1KHIpfXJl
+dHVybiBxfSwKQzA6ZnVuY3Rpb24oYSxiKXthPWErYiY1MzY4NzA5MTEKYT1hKygoYSY1MjQyODcpPDwx
+MCkmNTM2ODcwOTExCnJldHVybiBhXmE+Pj42fSwKckU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHM9Vy5D
+MChXLkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHI9cysoKHMmNjcxMDg4NjMpPDwzKSY1MzY4NzA5
+MTEKcl49cj4+PjExCnJldHVybiByKygociYxNjM4Myk8PDE1KSY1MzY4NzA5MTF9LApUTjpmdW5jdGlv
+bihhLGIpe3ZhciBzLHIscT1hLmNsYXNzTGlzdApmb3Iocz1iLmxlbmd0aCxyPTA7cjxiLmxlbmd0aDti
+Lmxlbmd0aD09PXN8fCgwLEgubGspKGIpLCsrcilxLmFkZChiW3JdKX0sCkpFOmZ1bmN0aW9uKGEsYixj
+LGQsZSl7dmFyIHM9Vy5hRihuZXcgVy52TihjKSx0LkIpCmlmKHMhPW51bGwmJiEwKUouZFooYSxiLHMs
+ITEpCnJldHVybiBuZXcgVy54QyhhLGIscywhMSxlLkMoInhDPDA+IikpfSwKVHc6ZnVuY3Rpb24oYSl7
+dmFyIHM9Vy5KNihudWxsKSxyPXdpbmRvdy5sb2NhdGlvbgpzPW5ldyBXLkpRKG5ldyBXLm1rKHMscikp
+CnMuQ1koYSkKcmV0dXJuIHN9LApxRDpmdW5jdGlvbihhLGIsYyxkKXt0LmguYShhKQpILmgoYikKSC5o
+KGMpCnQuY3IuYShkKQpyZXR1cm4hMH0sClFXOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQp0Lmgu
+YShhKQpILmgoYikKSC5oKGMpCnM9dC5jci5hKGQpLmEKcj1zLmEKQy54bi5zTFUocixjKQpxPXIuaG9z
+dG5hbWUKcz1zLmIKaWYoIShxPT1zLmhvc3RuYW1lJiZyLnBvcnQ9PXMucG9ydCYmci5wcm90b2NvbD09
+cy5wcm90b2NvbCkpaWYocT09PSIiKWlmKHIucG9ydD09PSIiKXtzPXIucHJvdG9jb2wKcz1zPT09Ijoi
+fHxzPT09IiJ9ZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITAKcmV0dXJuIHN9LApCbDpmdW5jdGlv
+bigpe3ZhciBzPXQuTixyPVAudE0oQy5ReCxzKSxxPXQuZDAuYShuZXcgVy5JQSgpKSxwPUguVk0oWyJU
+RU1QTEFURSJdLHQucykKcz1uZXcgVy5jdChyLFAuTHMocyksUC5McyhzKSxQLkxzKHMpLG51bGwpCnMu
+Q1kobnVsbCxuZXcgSC5sSihDLlF4LHEsdC5maikscCxudWxsKQpyZXR1cm4gc30sCnFjOmZ1bmN0aW9u
+KGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoInBvc3RNZXNzYWdlIiBpbiBhKXtzPVcu
+UDEoYSkKaWYodC5hUy5iKHMpKXJldHVybiBzCnJldHVybiBudWxsfWVsc2UgcmV0dXJuIHQuY2guYShh
+KX0sClAxOmZ1bmN0aW9uKGEpe2lmKGE9PT13aW5kb3cpcmV0dXJuIHQuY2kuYShhKQplbHNlIHJldHVy
+biBuZXcgVy5kVygpfSwKYUY6ZnVuY3Rpb24oYSxiKXt2YXIgcz0kLlgzCmlmKHM9PT1DLk5VKXJldHVy
+biBhCnJldHVybiBzLlB5KGEsYil9LApxRTpmdW5jdGlvbiBxRSgpe30sCkdoOmZ1bmN0aW9uIEdoKCl7
+fSwKZlk6ZnVuY3Rpb24gZlkoKXt9LApuQjpmdW5jdGlvbiBuQigpe30sCkF6OmZ1bmN0aW9uIEF6KCl7
+fSwKUVA6ZnVuY3Rpb24gUVAoKXt9LApueDpmdW5jdGlvbiBueCgpe30sCm9KOmZ1bmN0aW9uIG9KKCl7
+fSwKaWQ6ZnVuY3Rpb24gaWQoKXt9LApRRjpmdW5jdGlvbiBRRigpe30sCk5oOmZ1bmN0aW9uIE5oKCl7
+fSwKYWU6ZnVuY3Rpb24gYWUoKXt9LApJQjpmdW5jdGlvbiBJQigpe30sCm43OmZ1bmN0aW9uIG43KCl7
+fSwKd3o6ZnVuY3Rpb24gd3ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY3Y6ZnVuY3Rpb24gY3Yo
+KXt9LApDdjpmdW5jdGlvbiBDdigpe30sCmVhOmZ1bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAo
+KXt9LApoSDpmdW5jdGlvbiBoSCgpe30sCmg0OmZ1bmN0aW9uIGg0KCl7fSwKYnI6ZnVuY3Rpb24gYnIo
+KXt9LApWYjpmdW5jdGlvbiBWYigpe30sCmZKOmZ1bmN0aW9uIGZKKCl7fSwKd2E6ZnVuY3Rpb24gd2Eo
+KXt9LApTZzpmdW5jdGlvbiBTZygpe30sCnc3OmZ1bmN0aW9uIHc3KCl7fSwKQWo6ZnVuY3Rpb24gQWoo
+KXt9LAplNzpmdW5jdGlvbiBlNyhhKXt0aGlzLmE9YX0sCnVIOmZ1bmN0aW9uIHVIKCl7fSwKQkg6ZnVu
+Y3Rpb24gQkgoKXt9LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1bmN0aW9uIGV3KCl7fSwKbHA6ZnVu
+Y3Rpb24gbHAoKXt9LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1bmN0aW9uIEl2KCl7fSwKV1A6ZnVu
+Y3Rpb24gV1AoKXt9LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1bmN0aW9uIHc2KCl7fSwKSzU6ZnVu
+Y3Rpb24gSzUoKXt9LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1bmN0aW9uIENRKCl7fSwKdzQ6ZnVu
+Y3Rpb24gdzQoKXt9LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1bmN0aW9uIGNmKCl7fSwKaTc6ZnVu
+Y3Rpb24gaTcoYSl7dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShhKXt0aGlzLmE9YX0sCktTOmZ1bmN0
+aW9uIEtTKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5jdGlvbiBBMyhhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKSTQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9LApGazpmdW5jdGlvbiBGayhhLGIp
+e3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhhLGIsYyxkKXt2YXIgXz10aGlzCl8u
+YT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LApldTpmdW5jdGlvbiBldShhLGIsYyxkKXt2YXIgXz10aGlz
+Cl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlvbiB4QyhhLGIsYyxkLGUpe3ZhciBf
+PXRoaXMKXy5iPWEKXy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0sCnZOOmZ1bmN0aW9uIHZOKGEpe3Ro
+aXMuYT1hfSwKSlE6ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApHbTpmdW5jdGlvbiBHbSgpe30sCnZE
+OmZ1bmN0aW9uIHZEKGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24gVXYoYSl7dGhpcy5hPWF9LApFZzpm
+dW5jdGlvbiBFZyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAptNjpmdW5jdGlvbiBt
+Nigpe30sCkVvOmZ1bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24gV2soKXt9LApjdDpmdW5jdGlvbiBj
+dChhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LApJQTpm
+dW5jdGlvbiBJQSgpe30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6ZnVuY3Rpb24gVzkoYSxiLGMpe3Zh
+ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8uJHRpPWN9LApkVzpmdW5jdGlvbiBk
+Vygpe30sCm1rOmZ1bmN0aW9uIG1rKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLbzpmdW5jdGlvbiBL
+byhhKXt0aGlzLmE9YQp0aGlzLmI9ITF9LApmbTpmdW5jdGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1
+bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1
+bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxNPXsKT1g6ZnVuY3Rpb24oYSl7c3dpdGNo
+KGEpe2Nhc2UgQy5BZDpyZXR1cm4iQWRkIC8qPyovIGhpbnQiCmNhc2UgQy5uZTpyZXR1cm4iQWRkIC8q
+ISovIGhpbnQiCmNhc2UgQy53VjpyZXR1cm4iUmVtb3ZlIC8qPyovIGhpbnQiCmNhc2UgQy5mUjpyZXR1
+cm4iUmVtb3ZlIC8qISovIGhpbnQiCmNhc2UgQy5teTpyZXR1cm4iQ2hhbmdlIHRvIC8qPyovIGhpbnQi
+CmNhc2UgQy5yeDpyZXR1cm4iQ2hhbmdlIHRvIC8qISovIGhpbnQifXJldHVybiBudWxsfSwKSDc6ZnVu
+Y3Rpb24gSDcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCllGOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
+LHAsbyxuLG0sbApmb3Iocz1iLmxlbmd0aCxyPTE7cjxzOysrcil7aWYoYltyXT09bnVsbHx8YltyLTFd
+IT1udWxsKWNvbnRpbnVlCmZvcig7cz49MTtzPXEpe3E9cy0xCmlmKGJbcV0hPW51bGwpYnJlYWt9cD1u
+ZXcgUC5SbigiIikKbz1hKyIoIgpwLmE9bwpuPUgudDYoYikKbT1uLkMoIm5IPDE+IikKbD1uZXcgSC5u
+SChiLDAscyxtKQpsLkhkKGIsMCxzLG4uYykKbT1vK25ldyBILmxKKGwsbS5DKCJxVShhTC5FKSIpLmEo
+bmV3IE0uTm8oKSksbS5DKCJsSjxhTC5FLHFVPiIpKS5rKDAsIiwgIikKcC5hPW0KcC5hPW0rKCIpOiBw
+YXJ0ICIrKHItMSkrIiB3YXMgbnVsbCwgYnV0IHBhcnQgIityKyIgd2FzIG5vdC4iKQp0aHJvdyBILmIo
+UC54WShwLncoMCkpKX19LApsSTpmdW5jdGlvbiBsSShhKXt0aGlzLmE9YX0sCnE3OmZ1bmN0aW9uIHE3
+KCl7fSwKTm86ZnVuY3Rpb24gTm8oKXt9fSxVPXsKbno6ZnVuY3Rpb24oYSl7dmFyIHM9SC51UChhLnEo
+MCwibm9kZUlkIikpCnJldHVybiBuZXcgVS5MTChDLk5tLkh0KEMucmssbmV3IFUuTUQoYSkpLHMpfSwK
+TEw6ZnVuY3Rpb24gTEwoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1EOmZ1bmN0aW9uIE1EKGEpe3Ro
+aXMuYT1hfSwKamY6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKaWYoYT09bnVsbClzPW51bGwKZWxzZXtz
+PUguVk0oW10sdC5kNykKZm9yKHI9Si5JVCh0LlUuYShhKSk7ci5GKCk7KXtxPXIuZ2woKQpwPUouVTYo
+cSkKcy5wdXNoKG5ldyBVLlNlKEguaChwLnEocSwiZGVzY3JpcHRpb24iKSksSC5oKHAucShxLCJocmVm
+IikpKSl9fXJldHVybiBzfSwKTmQ6ZnVuY3Rpb24oYSl7dmFyIHMscgppZihhPT1udWxsKXM9bnVsbApl
+bHNle3M9SC5WTShbXSx0LmFBKQpmb3Iocj1KLklUKHQuVS5hKGEpKTtyLkYoKTspcy5wdXNoKFUuTmYo
+ci5nbCgpKSl9cmV0dXJuIHN9LApOZjpmdW5jdGlvbihhKXt2YXIgcz1KLlU2KGEpLHI9SC5oKHMucShh
+LCJkZXNjcmlwdGlvbiIpKSxxPUguVk0oW10sdC5hSikKZm9yKHM9Si5JVCh0LlUuYShzLnEoYSwiZW50
+cmllcyIpKSk7cy5GKCk7KXEucHVzaChVLlJqKHMuZ2woKSkpCnJldHVybiBuZXcgVS55RChyLHEpfSwK
+Umo6ZnVuY3Rpb24oYSl7dmFyIHMscj1KLlU2KGEpLHE9SC5oKHIucShhLCJkZXNjcmlwdGlvbiIpKSxw
+PUguaChyLnEoYSwiZnVuY3Rpb24iKSksbz1yLnEoYSwibGluayIpCmlmKG89PW51bGwpbz1udWxsCmVs
+c2V7cz1KLlU2KG8pCm89bmV3IFUuTWwoSC5oKHMucShvLCJocmVmIikpLEgudVAocy5xKG8sImxpbmUi
+KSksSC5oKHMucShvLCJwYXRoIikpKX1yPXQuZksuYShyLnEoYSwiaGludEFjdGlvbnMiKSkKcj1yPT1u
+dWxsP251bGw6Si5NMShyLG5ldyBVLmFOKCksdC5hWCkKcj1yPT1udWxsP251bGw6ci5icigwKQpyZXR1
+cm4gbmV3IFUud2IocSxwLG8scj09bnVsbD9DLmRuOnIpfSwKZDI6ZnVuY3Rpb24gZDIoYSxiLGMsZCxl
+LGYpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWZ9LApTZTpmdW5j
+dGlvbiBTZShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6ZnVuY3Rpb24gTWwoYSxiLGMpe3RoaXMu
+YT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24geUQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
+Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5k
+PWR9LAphTjpmdW5jdGlvbiBhTigpe30sCmIwOmZ1bmN0aW9uIGIwKCl7fX0sQj17CndSOmZ1bmN0aW9u
+KCl7cmV0dXJuIG5ldyBCLnFwKCIiLCIiLCIiLEMuRHgpfSwKWWY6ZnVuY3Rpb24oYSl7dmFyIHMscixx
+LHAsbyxuLG0sbCxrPUguaChhLnEoMCwicmVnaW9ucyIpKSxqPUguaChhLnEoMCwibmF2aWdhdGlvbkNv
+bnRlbnQiKSksaT1ILmgoYS5xKDAsInNvdXJjZUNvZGUiKSksaD1QLkZsKHQuWCx0LmRfKQpmb3Iocz10
+LnQuYShhLnEoMCwiZWRpdHMiKSkscz1zLmdQdShzKSxzPXMuZ20ocykscj10LlUscT10Lmg0O3MuRigp
+Oyl7cD1zLmdsKCkKbz1wLmEKbj1ILlZNKFtdLHEpCmZvcihwPUouSVQoci5hKHAuYikpO3AuRigpOyl7
+bT1wLmdsKCkKbD1KLlU2KG0pCm4ucHVzaChuZXcgQi5qOChILnVQKGwucShtLCJsaW5lIikpLEguaChs
+LnEobSwiZXhwbGFuYXRpb24iKSksSC51UChsLnEobSwib2Zmc2V0IikpKSl9aC5ZNSgwLG8sbil9cmV0
+dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
+YgpfLmM9YwpfLmQ9ZH0sCmZ2OmZ1bmN0aW9uIGZ2KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHMKaWYo
+IShhPj02NSYmYTw9OTApKXM9YT49OTcmJmE8PTEyMgplbHNlIHM9ITAKcmV0dXJuIHN9LApZdTpmdW5j
+dGlvbihhLGIpe3ZhciBzPWEubGVuZ3RoLHI9YisyCmlmKHM8cilyZXR1cm4hMQppZighQi5PUyhDLnhC
+Lk8oYSxiKSkpcmV0dXJuITEKaWYoQy54Qi5PKGEsYisxKSE9PTU4KXJldHVybiExCmlmKHM9PT1yKXJl
+dHVybiEwCnJldHVybiBDLnhCLk8oYSxyKT09PTQ3fX0sVD17bVE6ZnVuY3Rpb24gbVEoKXt9fSxMPXsK
+SXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkK
+Qy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgcyxy
+PXQuZy5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxxPXIuc3R5bGUs
+cD0iIitDLkNELnpRKHIub2Zmc2V0SGVpZ2h0KSoyKyJweCIKcS5tYXhIZWlnaHQ9cApxPUoucUYoYSkK
+cD1xLiR0aQpzPXAuQygifigxKT8iKS5hKG5ldyBMLld4KHIsYSkpCnQuWi5hKG51bGwpClcuSkUocS5h
+LHEuYixzLCExLHAuYyl9LAp5WDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPSJxdWVyeVNl
+bGVjdG9yQWxsIixsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSksaz10LmcKbC50b1N0cmluZwpzPXQu
+aApILkRoKGsscywiVCIsbSkKcj10LlIKcT1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYt
+bGluayIpLHIpCnEuSyhxLG5ldyBMLkFPKGIpKQpILkRoKGsscywiVCIsbSkKcD1uZXcgVy53eihsLnF1
+ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24iKSxyKQppZighcC5nbDAocCkpe289bC5xdWVyeVNlbGVjdG9y
+KCJ0YWJsZVtkYXRhLXBhdGhdIikKby50b1N0cmluZwpwLksocCxuZXcgTC5IbyhvLmdldEF0dHJpYnV0
+ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG8pKS5PVSgicGF0aCIpKSkpfUguRGgoayxzLCJUIixt
+KQpuPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLmFkZC1oaW50LWxpbmsiKSxyKQpuLksobixu
+ZXcgTC5JQygpKX0sClE2OmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3QoKQpD
+LkR0LmVvKHMsIkdFVCIsTC5RNChhLGIpLCEwKQpzLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlw
+ZSIsImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKQpyZXR1cm4gTC5MVShzLG51bGwsYy5D
+KCIwKiIpKX0sCnR5OmZ1bmN0aW9uKGEsYil7dmFyIHM9bmV3IFhNTEh0dHBSZXF1ZXN0KCkscj10LlgK
+Qy5EdC5lbyhzLCJQT1NUIixMLlE0KGEsUC5GbChyLHIpKSwhMCkKcy5zZXRSZXF1ZXN0SGVhZGVyKCJD
+b250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04IikKcmV0dXJuIEwuTFUo
+cyxiLHQudCl9LApMVTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuVGcoYSxiLGMsYy5DKCIwKiIpKX0s
+ClRnOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPTAscj1QLkZYKGQpLHEscD0yLG8sbj1bXSxtLGwsayxq
+LGksaCxnLGYKdmFyICRhc3luYyRMVT1QLmx6KGZ1bmN0aW9uKGUsYTApe2lmKGU9PT0xKXtvPWEwCnM9
+cH13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aT1uZXcgUC5aZihuZXcgUC52cygkLlgzLHQuZ1Yp
+LHQuYkMpCmg9dC5lYgpnPWguYShuZXcgTC5mQyhpLGEpKQp0LlouYShudWxsKQpsPXQuZVEKVy5KRShh
+LCJsb2FkIixnLCExLGwpClcuSkUoYSwiZXJyb3IiLGguYShpLmdZSigpKSwhMSxsKQphLnNlbmQoYj09
+bnVsbD9udWxsOkMuQ3QuT0IoYixudWxsKSkKcD00CnM9NwpyZXR1cm4gUC5qUShpLmEsJGFzeW5jJExV
+KQpjYXNlIDc6cD0yCnM9NgpicmVhawpjYXNlIDQ6cD0zCmY9bwpILlJ1KGYpCm09SC50cyhmKQpoPVAu
+VGwoIkVycm9yIHJlYWNoaW5nIG1pZ3JhdGlvbiBwcmV2aWV3IHNlcnZlci4iLG0pCnRocm93IEguYiho
+KQpzPTYKYnJlYWsKY2FzZSAzOnM9MgpicmVhawpjYXNlIDY6aj1DLkN0LnBXKDAsYS5yZXNwb25zZVRl
+eHQsbnVsbCkKaWYoYS5zdGF0dXM9PT0yMDApe3E9Yy5DKCIwKiIpLmEoaikKcz0xCmJyZWFrfWVsc2Ug
+dGhyb3cgSC5iKGopCmNhc2UgMTpyZXR1cm4gUC55QyhxLHIpCmNhc2UgMjpyZXR1cm4gUC5mMyhvLHIp
+fX0pCnJldHVybiBQLkRJKCRhc3luYyRMVSxyKX0sCmFLOmZ1bmN0aW9uKGEpe3ZhciBzPVAuaEsoYSku
+Z2hZKCkucSgwLCJsaW5lIikKcmV0dXJuIHM9PW51bGw/bnVsbDpILkhwKHMsbnVsbCl9LApHNjpmdW5j
+dGlvbihhKXt2YXIgcz1QLmhLKGEpLmdoWSgpLnEoMCwib2Zmc2V0IikKcmV0dXJuIHM9PW51bGw/bnVs
+bDpILkhwKHMsbnVsbCl9LAppNjpmdW5jdGlvbihhKXtyZXR1cm4gTC5uVyh0Lk8uYShhKSl9LApuVzpm
+dW5jdGlvbihhKXt2YXIgcz0wLHI9UC5GWCh0LnopLHE9MSxwLG89W10sbixtLGwsayxqLGksaAp2YXIg
+JGFzeW5jJGk2PVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3
+aXRjaChzKXtjYXNlIDA6aT10LmcuYShXLnFjKGEuY3VycmVudFRhcmdldCkpLmdldEF0dHJpYnV0ZSgi
+aHJlZiIpCmEucHJldmVudERlZmF1bHQoKQpxPTMKaz1kb2N1bWVudApuPUMuQ0QuelEoay5xdWVyeVNl
+bGVjdG9yKCIuY29udGVudCIpLnNjcm9sbFRvcCkKcz02CnJldHVybiBQLmpRKEwudHkoaSxudWxsKSwk
+YXN5bmMkaTYpCmNhc2UgNjpzPTcKcmV0dXJuIFAualEoTC5HNyh3aW5kb3cubG9jYXRpb24ucGF0aG5h
+bWUsbnVsbCxudWxsLCExLG51bGwpLCRhc3luYyRpNikKY2FzZSA3Oms9ay5xdWVyeVNlbGVjdG9yKCIu
+Y29udGVudCIpCmsudG9TdHJpbmcKay5zY3JvbGxUb3A9Si5WdShuKQpxPTEKcz01CmJyZWFrCmNhc2Ug
+MzpxPTIKaD1wCm09SC5SdShoKQpsPUgudHMoaCkKTC5DMigiQ291bGQgbm90IGFkZC9yZW1vdmUgaGlu
+dCIsbSxsKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxy
+KQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkaTYscil9LApDMjpm
+dW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9ImV4Y2VwdGlvbiIsbz0ic3RhY2tUcmFjZSIsbj10LnQu
+YihiKSYmSi5STShiLnEoMCwic3VjY2VzcyIpLCExKSYmYi54NChwKSYmYi54NChvKSxtPUouaWEoYikK
+aWYobil7cz1ILmgobS5xKGIscCkpCmM9bS5xKGIsbyl9ZWxzZSBzPW0udyhiKQpuPWRvY3VtZW50CnI9
+bi5xdWVyeVNlbGVjdG9yKCIucG9wdXAtcGFuZSIpCnIucXVlcnlTZWxlY3RvcigiaDIiKS5pbm5lclRl
+eHQ9YQpyLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9cwpyLnF1ZXJ5U2VsZWN0b3IoInByZSIp
+LmlubmVyVGV4dD1KLmooYykKcT10LmRkLmEoci5xdWVyeVNlbGVjdG9yKCJhLmJvdHRvbSIpKTsocSYm
+Qy54bikuc0xVKHEsUC5YZCgiaHR0cHMiLCJnaXRodWIuY29tIiwiZGFydC1sYW5nL3Nkay9pc3N1ZXMv
+bmV3IixQLkVGKFsidGl0bGUiLCJDdXN0b21lci1yZXBvcnRlZCBpc3N1ZSB3aXRoIE5OQkQgbWlncmF0
+aW9uIHRvb2w6ICIrYSwibGFiZWxzIix1LmQsImJvZHkiLGErIlxuXG5FcnJvcjogIitILkVqKHMpKyJc
+blxuUGxlYXNlIGZpbGwgaW4gdGhlIGZvbGxvd2luZzpcblxuKipOYW1lIG9mIHBhY2thZ2UgYmVpbmcg
+bWlncmF0ZWQgKGlmIHB1YmxpYykqKjpcbioqV2hhdCBJIHdhcyBkb2luZyB3aGVuIHRoaXMgaXNzdWUg
+b2NjdXJyZWQqKjpcbioqSXMgaXQgcG9zc2libGUgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSoqOlxu
+KipIYXMgdGhpcyBpc3N1ZSBoYXBwZW5lZCBiZWZvcmUsIGFuZCBpZiBzbywgaG93IG9mdGVuKio6XG4q
+KkRhcnQgU0RLIHZlcnNpb24qKjogIitILkVqKG4uZ2V0RWxlbWVudEJ5SWQoInNkay12ZXJzaW9uIiku
+dGV4dENvbnRlbnQpKyJcbioqQWRkaXRpb25hbCBkZXRhaWxzKio6XG5cblRoYW5rcyBmb3IgZmlsaW5n
+IVxuXG5TdGFja3RyYWNlOiBfYXV0byBwb3B1bGF0ZWQgYnkgbWlncmF0aW9uIHByZXZpZXcgdG9vbC5f
+XG5cbmBgYFxuIitILkVqKGMpKyJcbmBgYFxuIl0sdC5YLHQueikpLmduRCgpKQpuPXEuc3R5bGUKbi5k
+aXNwbGF5PSJpbml0aWFsIgpuPXIuc3R5bGUKbi5kaXNwbGF5PSJpbml0aWFsIgpuPWErIjogIitILkVq
+KGIpCndpbmRvdwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJy
+b3IobikKd2luZG93Cm49SC5FaihjKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93
+LmNvbnNvbGUuZXJyb3Iobil9LAp0MjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG89dC5nLmEoVy5x
+YyhhLmN1cnJlbnRUYXJnZXQpKQphLnByZXZlbnREZWZhdWx0KCkKcz1vLmdldEF0dHJpYnV0ZSgiaHJl
+ZiIpCnI9TC5VcyhzKQpxPUwuRzYocykKcD1MLmFLKHMpCmlmKHEhPW51bGwpTC5hZihyLHEscCxiLG5l
+dyBMLm5UKHIscSxwKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxsLGIsbmV3IEwuTlkocikpfSwKSzA6ZnVu
+Y3Rpb24oYSl7dmFyIHMscixxLHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUiKQpw
+LnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PSJGYWlsZWQgdG8gcmVydW4gZnJvbSBzb3VyY2Vz
+IgpwLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9IlNvdXJjZXMgY29udGFpbiBzdGF0aWMgYW5h
+bHlzaXMgZXJyb3JzOiIKcz1wLnF1ZXJ5U2VsZWN0b3IoInByZSIpCnI9Si5FbChhLHQuYXcpCnE9SC5M
+aChyKQpzLmlubmVyVGV4dD1uZXcgSC5sSihyLHEuQygicVUqKGxELkUpIikuYShuZXcgTC51ZSgpKSxx
+LkMoImxKPGxELkUscVUqPiIpKS5rKDAsIlxuIikKcT1wLnF1ZXJ5U2VsZWN0b3IoImEuYm90dG9tIiku
+c3R5bGUKcS5kaXNwbGF5PSJub25lIgpzPXAuc3R5bGUKcy5kaXNwbGF5PSJpbml0aWFsIn0sCnZVOmZ1
+bmN0aW9uKCl7dmFyIHM9ZG9jdW1lbnQKSC5EaCh0LmcsdC5oLCJUIiwicXVlcnlTZWxlY3RvckFsbCIp
+CnM9bmV3IFcud3oocy5xdWVyeVNlbGVjdG9yQWxsKCIuY29kZSIpLHQuUikKcy5LKHMsbmV3IEwuZVgo
+KSl9LApoWDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuWXcoYSxiLGMpfSwKWXc6ZnVuY3Rpb24oYSxi
+LGMpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoLGcKdmFyICRhc3lu
+YyRoWD1QLmx6KGZ1bmN0aW9uKGQsZSl7aWYoZD09PTEpe3A9ZQpzPXF9d2hpbGUodHJ1ZSlzd2l0Y2go
+cyl7Y2FzZSAwOnE9MwpqPXQuWApzPTYKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJyZWdpb24iLCJy
+ZWdpb24iLCJvZmZzZXQiLEguRWooYildLGosaiksdC50KSwkYXN5bmMkaFgpCmNhc2UgNjpuPWUKaj1u
+Cmk9Si5VNihqKQptPW5ldyBVLmQyKFUuamYoaS5xKGosImVkaXRzIikpLEguaChpLnEoaiwiZXhwbGFu
+YXRpb24iKSksSC51UChpLnEoaiwibGluZSIpKSxILmgoaS5xKGosImRpc3BsYXlQYXRoIikpLEguaChp
+LnEoaiwidXJpUGF0aCIpKSxVLk5kKGkucShqLCJ0cmFjZXMiKSkpCkwuVDEobSkKTC5GcihhLGIsYykK
+TC55WCgiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiLCExKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpx
+PTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQgZWRpdCBkZXRhaWxz
+IixsLGspCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIp
+CmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRoWCxyKX0sCkc3OmZ1
+bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxiLGMsZCxlKX0sCkw1OmZ1bmN0aW9uKGEsYixj
+LGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49W10sbSxsLGssaixpLGgsZwp2YXIgJGFz
+eW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEpe289YTAKcz1wfXdoaWxlKHRydWUpc3dp
+dGNoKHMpe2Nhc2UgMDppZighSi5wNChhLCIuZGFydCIpKXtMLkJFKGEsQi53UigpLGQpCkwuQlgoYSxu
+dWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9dC5YCnM9NwpyZXR1cm4gUC5qUShM
+LlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQudCksJGFzeW5jJEc3KQpjYXNlIDc6bT1h
+MApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVzKGEpCkwuQlgobCxiKQppZihlIT1udWxs
+KWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9SC5SdShnKQpqPUgudHMoZykKTC5D
+MigiQ291bGQgbm90IGxvYWQgZGFydCBmaWxlICIrYSxrLGopCnM9NgpicmVhawpjYXNlIDM6cz0yCmJy
+ZWFrCmNhc2UgNjpjYXNlIDE6cmV0dXJuIFAueUMocSxyKQpjYXNlIDI6cmV0dXJuIFAuZjMobyxyKX19
+KQpyZXR1cm4gUC5ESSgkYXN5bmMkRzcscil9LApHZTpmdW5jdGlvbigpe3ZhciBzPTAscj1QLkZYKHQu
+eikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoLGcKdmFyICRhc3luYyRHZT1QLmx6KGZ1bmN0aW9uKGEs
+Yil7aWYoYT09PTEpe3A9YgpzPXF9d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOmg9Ii9fcHJldmll
+dy9uYXZpZ2F0aW9uVHJlZS5qc29uIgpxPTMKcz02CnJldHVybiBQLmpRKEwuUTYoaCxDLkNNLHQuZUUp
+LCRhc3luYyRHZSkKY2FzZSA2Om49YgptPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXYtdHJlZSIp
+CkoubDUobSwiIikKaj1MLm1LKG4pCiQuSVI9agpMLnRYKG0saiwhMCkKcT0xCnM9NQpicmVhawpjYXNl
+IDM6cT0yCmc9cApsPUguUnUoZykKaz1ILnRzKGcpCkwuQzIoIkNvdWxkIG5vdCBsb2FkIG5hdmlnYXRp
+b24gdHJlZSIsbCxrKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMo
+bnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkR2Uscil9
+LApxTzpmdW5jdGlvbihhKXt2YXIgcyxyPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscT1DLkNELnpR
+KCQuZmkoKS5vZmZzZXRIZWlnaHQpLHA9d2luZG93LmlubmVySGVpZ2h0LG89Qy5DRC56USgkLkRXKCku
+b2Zmc2V0SGVpZ2h0KQppZih0eXBlb2YgcCE9PSJudW1iZXIiKXJldHVybiBwLkhOKCkKcz1yLmJvdHRv
+bQpzLnRvU3RyaW5nCmlmKHM+cC0obysxNCkpSi5kaChhKQplbHNle3A9ci50b3AKcC50b1N0cmluZwpp
+ZihwPHErMTQpSi5kaChhKX19LApmRzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8KaWYoYSE9bnVs
+bCl7cz1kb2N1bWVudApyPXMuZ2V0RWxlbWVudEJ5SWQoIm8iK0guRWooYSkpCnE9cy5xdWVyeVNlbGVj
+dG9yKCIubGluZS0iK0guRWooYikpCmlmKHIhPW51bGwpe0wucU8ocikKSi5kUihyKS5pKDAsInRhcmdl
+dCIpfWVsc2UgaWYocSE9bnVsbClMLnFPKHEucGFyZW50RWxlbWVudCkKaWYocSE9bnVsbClKLmRSKHQu
+Zy5hKHEucGFyZW50Tm9kZSkpLmkoMCwiaGlnaGxpZ2h0Iil9ZWxzZXtzPWRvY3VtZW50CnA9dC5nCkgu
+RGgocCx0LmgsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5l
+LW5vIikKbz1uZXcgVy53eihzLHQuUikKaWYoby5nQShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUu
+Z3RIKHMpKSl9fSwKYWY6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHE9TC5HNih3aW5kb3cubG9j
+YXRpb24uaHJlZikscD1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihxIT1udWxsKXtzPWRvY3Vt
+ZW50LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKHEpKQppZihzIT1udWxsKUouZFIocykuUigwLCJ0YXJn
+ZXQiKX1pZihwIT1udWxsKXtyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5FaihwKSkK
+aWYociE9bnVsbClKLmRSKHIucGFyZW50RWxlbWVudCkuUigwLCJoaWdobGlnaHQiKX1pZihhPT13aW5k
+b3cubG9jYXRpb24ucGF0aG5hbWUpe0wuZkcoYixjKQplLiQwKCl9ZWxzZSBMLkc3KGEsYixjLGQsZSl9
+LApRNDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1QLmhLKGEpLHA9dC5YCnA9UC5GbChwLHApCmZvcihz
+PXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5hLHIu
+Yil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxyLmIp
+fXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJldHVybiBxLm5tKDAscCkuZ25EKCl9LApUMTpmdW5j
+dGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaj0kLmhMKCkKSi5sNShqLCIiKQppZihhPT1udWxs
+KXtzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKQpDLkx0LnNhNChzLCJTZWUgZGV0YWlscyBhYm91
+dCBhIHByb3Bvc2VkIGVkaXQuIikKQy5MdC5zUChzLEguVk0oWyJwbGFjZWhvbGRlciJdLHQuaSkpCmou
+YXBwZW5kQ2hpbGQocykKQy5MdC5GRihzKQpyZXR1cm59cj1hLmQKcT0kLm5VKCkKcD1xLnpmKHIpCm89
+YS5iCm49ZG9jdW1lbnQKbT1xLkhQKHIsSi5UMChuLnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENv
+bnRlbnQpKQpsPWEuYwprPW4uY3JlYXRlRWxlbWVudCgicCIpCmouYXBwZW5kQ2hpbGQoaykKay5hcHBl
+bmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobykrIiBhdCAiKSkKcT10LlgKcT1XLko2KEwuUTQo
+YS5lLFAuRUYoWyJsaW5lIixKLmoobCldLHEscSkpKQpxLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5v
+ZGUoSC5FaihtKSsiOiIrSC5FaihsKSsiLiIpKQprLmFwcGVuZENoaWxkKHEpCkouZGgoaykKTC5DQyhh
+LGoscCkKTC5GeihhLGopfSwKTEg6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
+LGksaCxnLGYsZT0kLnlQKCkKSi5sNShlLCIiKQppZihiLmdBKGIpPT09MCl7cz1kb2N1bWVudApyPXMu
+Y3JlYXRlRWxlbWVudCgicCIpCmUuYXBwZW5kQ2hpbGQocikKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRl
+eHROb2RlKCJObyBwcm9wb3NlZCBlZGl0cyIpKX1lbHNlIGZvcihlPWIuZ1B1KGIpLGU9ZS5nbShlKSxz
+PXQuWCxxPXQuayxwPXEuQygifigxKT8iKSxvPXQuWixxPXEuYztlLkYoKTspe249ZS5nbCgpCm09ZG9j
+dW1lbnQKcj1tLmNyZWF0ZUVsZW1lbnQoInAiKQpsPSQueVAoKQpsLmFwcGVuZENoaWxkKHIpCnIuYXBw
+ZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZShILkVqKG4uYSkrIjoiKSkKaz1tLmNyZWF0ZUVsZW1lbnQo
+InVsIikKbC5hcHBlbmRDaGlsZChrKQpmb3Iobj1KLklUKG4uYik7bi5GKCk7KXtsPW4uZ2woKQpqPW0u
+Y3JlYXRlRWxlbWVudCgibGkiKQprLmFwcGVuZENoaWxkKGopCkouZFIoaikuaSgwLCJlZGl0IikKaT1t
+LmNyZWF0ZUVsZW1lbnQoImEiKQpqLmFwcGVuZENoaWxkKGkpCmkuY2xhc3NMaXN0LmFkZCgiZWRpdC1s
+aW5rIikKaD1sLmMKZz1ILkVqKGgpCmkuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcu
+aTcoaSkpLk9VKCJvZmZzZXQiKSxnKQpmPWwuYQpnPUguRWooZikKaS5zZXRBdHRyaWJ1dGUoImRhdGEt
+IituZXcgVy5TeShuZXcgVy5pNyhpKSkuT1UoImxpbmUiKSxnKQppLmFwcGVuZENoaWxkKG0uY3JlYXRl
+VGV4dE5vZGUoImxpbmUgIitILkVqKGYpKSkKaS5zZXRBdHRyaWJ1dGUoImhyZWYiLEwuUTQod2luZG93
+LmxvY2F0aW9uLnBhdGhuYW1lLFAuRUYoWyJsaW5lIixILkVqKGYpLCJvZmZzZXQiLEguRWooaCldLHMs
+cykpKQpnPXAuYShuZXcgTC5FRShoLGYsYSkpCm8uYShudWxsKQpXLkpFKGksImNsaWNrIixnLCExLHEp
+CmouYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiOiAiK0guRWoobC5iKSkpfX1pZihjKUwuVDEo
+bnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxPXdpbmRvdy5sb2NhdGlvbixwPVAuaEso
+KHEmJkMuRXgpLmdEcihxKStILkVqKGEpKQpxPXQuWApxPVAuRmwocSxxKQppZihiIT1udWxsKXEuWTUo
+MCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxsKXEuWTUoMCwibGluZSIsSC5FaihjKSkKcS5ZNSgw
+LCJhdXRoVG9rZW4iLCQuVUUoKSkKcD1wLm5tKDAscSkKcT13aW5kb3cuaGlzdG9yeQpzPXQuegpyPXAu
+Z25EKCkKcS50b1N0cmluZwpxLnB1c2hTdGF0ZShuZXcgUC5CZihbXSxbXSkuUHYoUC5GbChzLHMpKSwi
+IixyKX0sCkVuOmZ1bmN0aW9uKGEpe3ZhciBzPUouYmIoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnJv
+b3QiKS50ZXh0Q29udGVudCwiLyIpCmlmKEMueEIubihhLHMpKXJldHVybiBDLnhCLnluKGEscy5sZW5n
+dGgpCmVsc2UgcmV0dXJuIGF9LApPdDpmdW5jdGlvbihhKXtzd2l0Y2goYS5yKXtjYXNlIEMuY3c6YnJl
+YWsKY2FzZSBDLldEOmEucj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApicmVhawpjYXNlIEMu
+ZGM6dGhyb3cgSC5iKFAuUFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90IGhhdmUgaW5kZXRl
+cm1pbmF0ZSBtaWdyYXRpb24gc3RhdHVzIikpfX0sCnhuOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPSJk
+aXNhYmxlZCIscD1iLmdMKCkKTC50YShhLHApCmlmKGIuYz09JC5EOSgpLmlubmVyVGV4dCl7cz1iIGlu
+c3RhbmNlb2YgTC5jRCYmIUgub1QoYi54KQpyPUouWUUoYSkKaWYocylyLmdQKGEpLmkoMCxxKQplbHNl
+IHIuZ1AoYSkuUigwLHEpCkwudGEoJC5jMCgpLHApfX0sCnRhOmZ1bmN0aW9uKGEsYil7dmFyIHMscj0i
+Y2hlY2tfYm94IixxPSJ0aXRsZSIscD0ib3B0ZWQtb3V0IixvPSJtaWdyYXRpbmciCnN3aXRjaChiKXtj
+YXNlIEMuY3c6YS5pbm5lclRleHQ9cgpzPUouWUUoYSkKcy5nUChhKS5pKDAsImFscmVhZHktbWlncmF0
+ZWQiKQpzLmdQKGEpLmkoMCwiZGlzYWJsZWQiKQphLnNldEF0dHJpYnV0ZShxLCJBbHJlYWR5IG1pZ3Jh
+dGVkIikKYnJlYWsKY2FzZSBDLldEOmEuaW5uZXJUZXh0PXIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLHAp
+CnMuZ1AoYSkuaSgwLG8pCmEuc2V0QXR0cmlidXRlKHEsIk1pZ3JhdGluZyB0byBudWxsIHNhZmV0eSIp
+CmJyZWFrCmNhc2UgQy5YajphLmlubmVyVGV4dD0iY2hlY2tfYm94X291dGxpbmVfYmxhbmsiCnM9Si5Z
+RShhKQpzLmdQKGEpLlIoMCxvKQpzLmdQKGEpLmkoMCxwKQphLnNldEF0dHJpYnV0ZShxLCJPcHRpbmcg
+b3V0IG9mIG51bGwgc2FmZXR5IikKYnJlYWsKZGVmYXVsdDphLmlubmVyVGV4dD0iaW5kZXRlcm1pbmF0
+ZV9jaGVja19ib3giCnM9Si5ZRShhKQpzLmdQKGEpLlIoMCxvKQpzLmdQKGEpLmkoMCxwKQphLnNldEF0
+dHJpYnV0ZShxLCJNaXhlZCBzdGF0dXNlcyBvZiAnbWlncmF0aW5nJyBhbmQgJ29wdGluZyBvdXQnIikK
+YnJlYWt9fSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9e30KcS5hPWEKYT1MLkVuKGEpCnEuYT1h
+CkouZHIoJC5EOSgpLGEpCnM9ZG9jdW1lbnQKSC5EaCh0LmcsdC5oLCJUIiwicXVlcnlTZWxlY3RvckFs
+bCIpCnM9bmV3IFcud3oocy5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LXBhbmVsIC5uYXYtbGluayIpLHQu
+UikKcy5LKHMsbmV3IEwuVlMocSkpCnI9TC5tSCgkLklSLHEuYSkKaWYocj09bnVsbClKLmRSKCQuYk4o
+KSkuUigwLCJ2aXNpYmxlIikKZWxzZXtKLmRSKCQuYk4oKSkuaSgwLCJ2aXNpYmxlIikKTC50YSgkLmMw
+KCksci5nTCgpKX19LApBUjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1iLmIKaWYocSE9bnVsbCl7cz10
+LmcKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50Tm9kZSkKTC54bihyLnF1ZXJ5U2VsZWN0b3Io
+IjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIocixxKX19LApobDpmdW5jdGlvbihhLGIpe3Zh
+ciBzLHIscSxwLG8sbixtPSI6c2NvcGUgPiAuc3RhdHVzLWljb24iCmZvcihzPWIuZCxyPXMubGVuZ3Ro
+LHE9dC5nLHA9MDtwPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyksKytwKXtvPXNbcF0K
+bj1hLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5hbWUqPSInK0guRWooby5jKSsnIl0nKQppZihvIGluc3Rh
+bmNlb2YgTC52dCl7TC5obChuLG8pCkwueG4obi5xdWVyeVNlbGVjdG9yKG0pLGIpfWVsc2UgTC54bihx
+LmEobi5wYXJlbnROb2RlKS5xdWVyeVNlbGVjdG9yKG0pLG8pfX0sCkJFOmZ1bmN0aW9uKGEsYixjKXt2
+YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1lbnQscT1yLnF1ZXJ5U2VsZWN0b3IocykscD1yLnF1ZXJ5U2Vs
+ZWN0b3IoIi5jb2RlIikKSi50SChxLGIuYSwkLktHKCkpCkoudEgocCxiLmIsJC5LRygpKQpMLkxIKGEs
+Yi5kLGMpCmlmKGIuYy5sZW5ndGg8MmU1KUwudlUoKQpMLnlYKCIuY29kZSIsITApCkwueVgocywhMCl9
+LAp0WDpmdW5jdGlvbihhMSxhMixhMyl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQs
+Yz0ibWF0ZXJpYWwtaWNvbnMiLGI9InN0YXR1cy1pY29uIixhPWRvY3VtZW50LGEwPWEuY3JlYXRlRWxl
+bWVudCgidWwiKQphMS5hcHBlbmRDaGlsZChhMCkKZm9yKHM9YTIubGVuZ3RoLHI9dC5YLHE9dC5aLHA9
+MDtwPGEyLmxlbmd0aDthMi5sZW5ndGg9PT1zfHwoMCxILmxrKShhMiksKytwKXtvPWEyW3BdCm49YS5j
+cmVhdGVFbGVtZW50KCJsaSIpCmEwLmFwcGVuZENoaWxkKG4pCmlmKG8gaW5zdGFuY2VvZiBMLnZ0KXtt
+PUouWUUobikKbS5nUChuKS5pKDAsImRpciIpCm4uc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
+bmV3IFcuaTcobikpLk9VKCJuYW1lIiksby5jKQpsPWEuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uYXBw
+ZW5kQ2hpbGQobCkKaz1KLllFKGwpCmsuZ1AobCkuaSgwLCJhcnJvdyIpCmsuc2hmKGwsIiYjeDI1QkM7
+IikKaj1hLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpKLmRSKGopLmkoMCxjKQpqLmlubmVyVGV4dD0iZm9s
+ZGVyX29wZW4iCm4uYXBwZW5kQ2hpbGQoaikKbi5hcHBlbmRDaGlsZChhLmNyZWF0ZVRleHROb2RlKG8u
+YSkpCkwudFgobixvLmQsITApCmk9YS5jcmVhdGVFbGVtZW50KCJzcGFuIikKaz1KLllFKGkpCmsuZ1Ao
+aSkuaSgwLGMpCmkuaW5uZXJUZXh0PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIKay5nUChpKS5pKDAs
+YikKTC54bihpLG8pCms9ay5nVmwoaSkKaD1rLiR0aQpnPWguQygifigxKT8iKS5hKG5ldyBMLlREKG8s
+bixpKSkKcS5hKG51bGwpClcuSkUoay5hLGsuYixnLCExLGguYykKbS5tSyhuLGksaikKTC5reihsKX1l
+bHNlIGlmKG8gaW5zdGFuY2VvZiBMLmNEKXtpPWEuY3JlYXRlRWxlbWVudCgic3BhbiIpCm09Si5ZRShp
+KQptLmdQKGkpLmkoMCxjKQppLmlubmVyVGV4dD0iIgptLmdQKGkpLmkoMCxiKQprPUgub1Qoby54KQpp
+ZighayltLmdQKGkpLmkoMCwiZGlzYWJsZWQiKQpMLnhuKGksbykKaWYoayl7bT1tLmdWbChpKQprPW0u
+JHRpCmg9ay5DKCJ+KDEpPyIpLmEobmV3IEwuSWYobyxpLG4pKQpxLmEobnVsbCkKVy5KRShtLmEsbS5i
+LGgsITEsay5jKX1uLmFwcGVuZENoaWxkKGkpCm09YS5jcmVhdGVFbGVtZW50KCJzcGFuIikKSi5kUiht
+KS5pKDAsYykKbS5pbm5lclRleHQ9Imluc2VydF9kcml2ZV9maWxlIgpuLmFwcGVuZENoaWxkKG0pCmY9
+YS5jcmVhdGVFbGVtZW50KCJhIikKbi5hcHBlbmRDaGlsZChmKQptPUouWUUoZikKbS5nUChmKS5pKDAs
+Im5hdi1saW5rIikKZi5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhmKSkuT1Uo
+Im5hbWUiKSxvLmMpCmYuc2V0QXR0cmlidXRlKCJocmVmIixMLlE0KG8uZCxQLkZsKHIscikpKQpmLmFw
+cGVuZENoaWxkKGEuY3JlYXRlVGV4dE5vZGUoby5hKSkKbT1tLmdWbChmKQprPW0uJHRpCmg9ay5DKCJ+
+KDEpPyIpLmEobmV3IEwudEIoKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCExLGsuYykKZT1vLmUK
+aWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5vcygpCmlmKGU+MCl7ZD1hLmNyZWF0ZUVsZW1l
+bnQoInNwYW4iKQpuLmFwcGVuZENoaWxkKGQpCkouZFIoZCkuaSgwLCJlZGl0LWNvdW50IikKbT0iIitl
+KyIgIgppZihlPT09MSlrPSJwcm9wb3NlZCBlZGl0IgplbHNlIGs9InByb3Bvc2VkIGVkaXRzIgpkLnNl
+dEF0dHJpYnV0ZSgidGl0bGUiLG0raykKZC5hcHBlbmRDaGlsZChhLmNyZWF0ZVRleHROb2RlKEMuam4u
+dyhlKSkpfX19fSwKdXo6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWRvY3VtZW50LHI9cy5jcmVhdGVFbGVt
+ZW50KCJidXR0b24iKSxxPXQuayxwPXEuQygifigxKT8iKS5hKG5ldyBMLm0yKGEsYykpCnQuWi5hKG51
+bGwpClcuSkUociwiY2xpY2siLHAsITEscS5jKQpyLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUo
+TS5PWChhLmEpKSkKYi5hcHBlbmRDaGlsZChyKX0sCkZ6OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAs
+byxuLG0sbCxrLGosaSxoPWEuYQppZihoPT1udWxsKXJldHVybgpzPWRvY3VtZW50CnI9cy5jcmVhdGVF
+bGVtZW50KCJwIikKcT1iLmFwcGVuZENoaWxkKHIpCnI9cy5jcmVhdGVFbGVtZW50KCJzcGFuIikKcD10
+LmkKSi5NdShyLEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scCkpCnIuYXBwZW5kQ2hpbGQocy5jcmVh
+dGVUZXh0Tm9kZSgiQWN0aW9ucyIpKQpxLmFwcGVuZENoaWxkKHIpCnEuYXBwZW5kQ2hpbGQocy5jcmVh
+dGVUZXh0Tm9kZSgiOiIpKQpvPXMuY3JlYXRlRWxlbWVudCgicCIpCmIuYXBwZW5kQ2hpbGQobykKZm9y
+KHI9aC5sZW5ndGgsbj10LlEsbT0wO208aC5sZW5ndGg7aC5sZW5ndGg9PT1yfHwoMCxILmxrKShoKSwr
+K20pe2w9aFttXQprPXMuY3JlYXRlRWxlbWVudCgiYSIpCm8uYXBwZW5kQ2hpbGQoaykKay5hcHBlbmRD
+aGlsZChzLmNyZWF0ZVRleHROb2RlKGwuYSkpCmsuc2V0QXR0cmlidXRlKCJocmVmIixsLmIpCmo9bi5h
+KEguVk0oWyJhZGQtaGludC1saW5rIiwiYmVmb3JlLWFwcGx5IiwiYnV0dG9uIl0scCkpCmk9Si5kUihr
+KQppLlYxKDApCmkuRlYoMCxqKX19LApDQzpmdW5jdGlvbihhNCxhNSxhNil7dmFyIHMscixxLHAsbyxu
+LG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTMKZm9yKHM9YTQuZixyPXMubGVuZ3Ro
+LHE9dC5pLHA9dC5RLG89MDtvPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyksKytvKXtu
+PXNbb10KbT1kb2N1bWVudApsPW0uY3JlYXRlRWxlbWVudCgicCIpCms9cC5hKEguVk0oWyJ0cmFjZSJd
+LHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaT1hNS5hcHBlbmRDaGlsZChsKQpsPW0uY3Jl
+YXRlRWxlbWVudCgic3BhbiIpCms9cC5hKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scSkpCmo9Si5k
+UihsKQpqLlYxKDApCmouRlYoMCxrKQpsLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUobi5hKSkK
+aS5hcHBlbmRDaGlsZChsKQppLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjoiKSkKbD1tLmNy
+ZWF0ZUVsZW1lbnQoInVsIikKaz1wLmEoSC5WTShbInRyYWNlIl0scSkpCmo9Si5kUihsKQpqLlYxKDAp
+CmouRlYoMCxrKQpoPWkuYXBwZW5kQ2hpbGQobCkKZm9yKGw9bi5iLGs9bC5sZW5ndGgsZz0wO2c8bC5s
+ZW5ndGg7bC5sZW5ndGg9PT1rfHwoMCxILmxrKShsKSwrK2cpe2Y9bFtnXQplPW0uY3JlYXRlRWxlbWVu
+dCgibGkiKQpoLmFwcGVuZENoaWxkKGUpCmQ9bS5jcmVhdGVFbGVtZW50KCJzcGFuIikKYz1wLmEoSC5W
+TShbImZ1bmN0aW9uIl0scSkpCmo9Si5kUihkKQpqLlYxKDApCmouRlYoMCxjKQpjPWYuYgpMLmtEKGQs
+Yz09bnVsbD8idW5rbm93biI6YykKZS5hcHBlbmRDaGlsZChkKQpiPWYuYwppZihiIT1udWxsKXtlLmFw
+cGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIiAoIikpCmE9Yi5iCmEwPW0uY3JlYXRlRWxlbWVudCgi
+YSIpCmEwLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoSC5FaihiLmMpKyI6IitILkVqKGEpKSkK
+YTAuc2V0QXR0cmlidXRlKCJocmVmIixiLmEpCmEwLmNsYXNzTGlzdC5hZGQoIm5hdi1saW5rIikKZS5h
+cHBlbmRDaGlsZChhMCkKZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCIpIikpfWUuYXBwZW5k
+Q2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiOiAiKSkKZD1mLmEKTC5rRChlLGQ9PW51bGw/InVua25vd24i
+OmQpCmQ9Zi5kCmlmKGQubGVuZ3RoIT09MCl7Yz1tLmNyZWF0ZUVsZW1lbnQoInAiKQphMT1wLmEoSC5W
+TShbImRyYXdlciIsImJlZm9yZS1hcHBseSJdLHEpKQpqPUouZFIoYykKai5WMSgwKQpqLkZWKDAsYTEp
+CmEyPWUuYXBwZW5kQ2hpbGQoYykKZm9yKGM9ZC5sZW5ndGgsYTM9MDthMzxkLmxlbmd0aDtkLmxlbmd0
+aD09PWN8fCgwLEgubGspKGQpLCsrYTMpTC51eihkW2EzXSxhMixiKX19fX0sClVzOmZ1bmN0aW9uKGEp
+e3JldHVybiBKLlU2KGEpLnRnKGEsIj8iKT9DLnhCLk5qKGEsMCxDLnhCLk9ZKGEsIj8iKSk6YX0sCmtE
+OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPUguVk0oYi5zcGxpdCgiLiIpLHQucykscD1DLk5tLmd0SChx
+KSxvPWRvY3VtZW50CmEuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZShwKSkKZm9yKHA9SC5xQyhx
+LDEsbnVsbCx0Lk4pLHA9bmV3IEguYTcocCxwLmdBKHApLHAuJHRpLkMoImE3PGFMLkU+IikpLHM9Si5Z
+RShhKTtwLkYoKTspe3I9cC5kCnMubnooYSwiYmVmb3JlZW5kIiwiJiM4MjAzOy4iLG51bGwsbnVsbCkK
+YS5hcHBlbmRDaGlsZChvLmNyZWF0ZVRleHROb2RlKHIpKX19LAptSDpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIscSxwCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5sayko
+YSksKytyKXtxPWFbcl0KaWYocSBpbnN0YW5jZW9mIEwudnQpe3A9TC5tSChxLmQsYikKaWYocCE9bnVs
+bClyZXR1cm4gcH1lbHNlIGlmKHEuYz09YilyZXR1cm4gcX1yZXR1cm4gbnVsbH0sCmU6ZnVuY3Rpb24g
+ZSgpe30sClZXOmZ1bmN0aW9uIFZXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9a
+OmZ1bmN0aW9uIG9aKCl7fSwKanI6ZnVuY3Rpb24ganIoKXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCkhp
+OmZ1bmN0aW9uIEhpKCl7fSwKQlQ6ZnVuY3Rpb24gQlQoKXt9LApQWTpmdW5jdGlvbiBQWSgpe30sCnU4
+OmZ1bmN0aW9uIHU4KCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCkFPOmZ1bmN0aW9uIEFPKGEpe3RoaXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4o
+YSl7dGhpcy5hPWF9LApIbzpmdW5jdGlvbiBIbyhhKXt0aGlzLmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJQzpmdW5jdGlvbiBJQygpe30sCmZDOmZ1bmN0aW9uIGZDKGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApuVDpmdW5jdGlvbiBuVChhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
+PWIKdGhpcy5jPWN9LApOWTpmdW5jdGlvbiBOWShhKXt0aGlzLmE9YX0sCnVlOmZ1bmN0aW9uIHVlKCl7
+fSwKZVg6ZnVuY3Rpb24gZVgoKXt9LApFRTpmdW5jdGlvbiBFRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
+PWIKdGhpcy5jPWN9LApRTDpmdW5jdGlvbiBRTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVlM6ZnVu
+Y3Rpb24gVlMoYSl7dGhpcy5hPWF9LApURDpmdW5jdGlvbiBURChhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
+PWIKdGhpcy5jPWN9LApJZjpmdW5jdGlvbiBJZihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5j
+PWN9LAp0QjpmdW5jdGlvbiB0Qigpe30sCm0yOmZ1bmN0aW9uIG0yKGEsYil7dGhpcy5hPWEKdGhpcy5i
+PWJ9LApYQTpmdW5jdGlvbiBYQSgpe30sClpzOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1KLlU2KGEpCmlm
+KEwucDIoSC5oKHEucShhLCJ0eXBlIikpKT09PUMuWTIpe3M9SC5oKHEucShhLCJuYW1lIikpCnI9SC5o
+KHEucShhLCJwYXRoIikpCnE9cS5xKGEsInN1YnRyZWUiKQpxPW5ldyBMLnZ0KHE9PW51bGw/bnVsbDpM
+Lm1LKHEpLHMscikKcS5MVigpCnJldHVybiBxfWVsc2V7cz1ILmgocS5xKGEsIm5hbWUiKSkKcj1ILmgo
+cS5xKGEsInBhdGgiKSkKcmV0dXJuIG5ldyBMLmNEKEguaChxLnEoYSwiaHJlZiIpKSxILnVQKHEucShh
+LCJlZGl0Q291bnQiKSksSC55OChxLnEoYSwid2FzRXhwbGljaXRseU9wdGVkT3V0IikpLEwudkIoSC51
+UChxLnEoYSwibWlncmF0aW9uU3RhdHVzIikpKSxILnk4KHEucShhLCJtaWdyYXRpb25TdGF0dXNDYW5C
+ZUNoYW5nZWQiKSkscyxyKX19LAptSzpmdW5jdGlvbihhKXt2YXIgcyxyPUguVk0oW10sdC5jUSkKZm9y
+KHM9Si5JVCh0LlUuYShhKSk7cy5GKCk7KXIucHVzaChMLlpzKHMuZ2woKSkpCnJldHVybiByfSwKVkQ6
+ZnVuY3Rpb24oYSl7dmFyIHMscixxPUguVk0oW10sdC5HKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxl
+bmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLnB1c2goYVtyXS5MdCgpKQpyZXR1cm4g
+cX0sCnZCOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYT4+PjAhPT1hfHxhPj00
+KXJldHVybiBILk9IKEMubDAsYSkKcmV0dXJuIEMubDBbYV19LApwMjpmdW5jdGlvbihhKXtzd2l0Y2go
+YSl7Y2FzZSJkaXJlY3RvcnkiOnJldHVybiBDLlkyCmNhc2UiZmlsZSI6cmV0dXJuIEMucmYKZGVmYXVs
+dDp0aHJvdyBILmIoUC5QVigiVW5yZWNvZ25pemVkIG5hdmlnYXRpb24gdHJlZSBub2RlIHR5cGU6ICIr
+SC5FaihhKSkpfX0sCnZ0OmZ1bmN0aW9uIHZ0KGEsYixjKXt2YXIgXz10aGlzCl8uZD1hCl8uYT1iCl8u
+Yj1udWxsCl8uYz1jfSwKY0Q6ZnVuY3Rpb24gY0QoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmQ9
+YQpfLmU9YgpfLmY9YwpfLnI9ZApfLng9ZQpfLmE9ZgpfLmI9bnVsbApfLmM9Z30sCkQ4OmZ1bmN0aW9u
+IEQ4KCl7fSwKTzk6ZnVuY3Rpb24gTzkoYSl7dGhpcy5iPWF9LApHYjpmdW5jdGlvbiBHYihhLGIpe3Ro
+aXMuYT1hCnRoaXMuYj1ifSwKSVY6ZnVuY3Rpb24gSVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpf
+LmU9YgpfLmY9YwpfLnI9ZH19LFg9ewpDTDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbj1iLnha
+KGEpCmIuaEsoYSkKaWYobiE9bnVsbClhPUouS1YoYSxuLmxlbmd0aCkKcz10LnMKcj1ILlZNKFtdLHMp
+CnE9SC5WTShbXSxzKQpzPWEubGVuZ3RoCmlmKHMhPT0wJiZiLnI0KEMueEIuVyhhLDApKSl7aWYoMD49
+cylyZXR1cm4gSC5PSChhLDApCkMuTm0uaShxLGFbMF0pCnA9MX1lbHNle0MuTm0uaShxLCIiKQpwPTB9
+Zm9yKG89cDtvPHM7KytvKWlmKGIucjQoQy54Qi5XKGEsbykpKXtDLk5tLmkocixDLnhCLk5qKGEscCxv
+KSkKQy5ObS5pKHEsYVtvXSkKcD1vKzF9aWYocDxzKXtDLk5tLmkocixDLnhCLnluKGEscCkpCkMuTm0u
+aShxLCIiKX1yZXR1cm4gbmV3IFguV0QoYixuLHIscSl9LApXRDpmdW5jdGlvbiBXRChhLGIsYyxkKXt2
+YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1kfSwKSTc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsKUmg6ZnVuY3Rpb24oKXt2
+YXIgcyxyPW51bGwKaWYoUC51bygpLmdGaSgpIT09ImZpbGUiKXJldHVybiAkLkViKCkKcz1QLnVvKCkK
+aWYoIUMueEIuVGMocy5nSWkocyksIi8iKSlyZXR1cm4gJC5FYigpCmlmKFAuS0wociwiYS9iIixyLHIs
+cixyLHIpLnQ0KCk9PT0iYVxcYiIpcmV0dXJuICQuS2soKQpyZXR1cm4gJC5iRCgpfSwKekw6ZnVuY3Rp
+b24gekwoKXt9fSxFPXtPRjpmdW5jdGlvbiBPRihhLGIsYyl7dGhpcy5kPWEKdGhpcy5lPWIKdGhpcy5m
+PWN9fSxGPXtydTpmdW5jdGlvbiBydShhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1j
+Cl8ucj1kfX0sRD17CmFiOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz1udWxsCnRyeXtvPVAudW8oKX1j
+YXRjaChzKXtpZih0Lmc4LmIoSC5SdShzKSkpe3I9JC5GZgppZihyIT1udWxsKXJldHVybiByCnRocm93
+IHN9ZWxzZSB0aHJvdyBzfWlmKEouUk0obywkLkk2KSl7cj0kLkZmCnIudG9TdHJpbmcKcmV0dXJuIHJ9
+JC5JNj1vCmlmKCQuSGsoKT09JC5FYigpKXI9JC5GZj1vLlpJKCIuIikudygwKQplbHNle3E9by50NCgp
+CnA9cS5sZW5ndGgtMQpyPSQuRmY9cD09PTA/cTpDLnhCLk5qKHEsMCxwKX1yLnRvU3RyaW5nCnJldHVy
+biByfX0KdmFyIHc9W0MsSCxKLFAsVyxNLFUsQixULEwsWCxPLEUsRixEXQpodW5rSGVscGVycy5zZXRG
+dW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkodykKdmFyICQ9e30KSC5GSy5wcm90b3R5cGU9e30KSi5Hdi5w
+cm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yn0sCmdpTzpmdW5jdGlvbihhKXty
+ZXR1cm4gSC5lUShhKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5N
+KGEpKSsiJyJ9LAplNzpmdW5jdGlvbihhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKGEsYi5nV2Eo
+KSxiLmduZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4g
+U3RyaW5nKGEpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9
+Ckoud2UucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09Yn0sCnc6ZnVuY3Rp
+b24oYSl7cmV0dXJuIm51bGwifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKZTc6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gdGhpcy5TaihhLHQuby5hKGIpKX0sCiRpYzg6MX0KSi5NRi5wcm90b3R5cGU9ewpn
+aU86ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAok
+aXZtOjF9CkouaUMucHJvdG90eXBlPXt9Ckoua2QucHJvdG90eXBlPXt9CkouYzUucHJvdG90eXBlPXsK
+dzpmdW5jdGlvbihhKXt2YXIgcz1hWyQudygpXQppZihzPT1udWxsKXJldHVybiB0aGlzLnQoYSkKcmV0
+dXJuIkphdmFTY3JpcHQgZnVuY3Rpb24gZm9yICIrSC5FaihKLmoocykpfSwKJGlFSDoxfQpKLmpkLnBy
+b3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKGEsSC50NihhKS5DKCJAPDE+
+IikuS3EoYikuQygialY8MSwyPiIpKX0sCmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmMuYShiKQppZigh
+IWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGQiKSkKYS5wdXNoKGIpfSwKVzQ6ZnVuY3Rpb24oYSxi
+KXt2YXIgcwppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJyZW1vdmVBdCIpKQpzPWEubGVuZ3Ro
+CmlmKGI+PXMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkKcmV0dXJuIGEuc3BsaWNlKGIsMSlbMF19LApV
+RzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgpILnQ2KGEpLkMoImNYPDE+IikuYShjKQppZighIWEuZml4
+ZWQkbGVuZ3RoKUgudihQLkw0KCJpbnNlcnRBbGwiKSkKUC53QShiLDAsYS5sZW5ndGgsImluZGV4IikK
+aWYoIXQuZC5iKGMpKWM9Si5SWChjKQpzPUouSG0oYykKYS5sZW5ndGg9YS5sZW5ndGgrcwpyPWIrcwp0
+aGlzLllXKGEscixhLmxlbmd0aCxhLGIpCnRoaXMudmcoYSxiLHIsYyl9LApGVjpmdW5jdGlvbihhLGIp
+e3ZhciBzCkgudDYoYSkuQygiY1g8MT4iKS5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQo
+ImFkZEFsbCIpKQppZihBcnJheS5pc0FycmF5KGIpKXt0aGlzLktoKGEsYikKcmV0dXJufWZvcihzPUou
+SVQoYik7cy5GKCk7KWEucHVzaChzLmdsKCkpfSwKS2g6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCnQuYi5h
+KGIpCnM9Yi5sZW5ndGgKaWYocz09PTApcmV0dXJuCmlmKGE9PT1iKXRocm93IEguYihQLmE0KGEpKQpm
+b3Iocj0wO3I8czsrK3IpYS5wdXNoKGJbcl0pfSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUgudDYo
+YSkKcmV0dXJuIG5ldyBILmxKKGEscy5LcShjKS5DKCIxKDIpIikuYShiKSxzLkMoIkA8MT4iKS5LcShj
+KS5DKCJsSjwxLDI+IikpfSwKazpmdW5jdGlvbihhLGIpe3ZhciBzLHI9UC5POChhLmxlbmd0aCwiIiwh
+MSx0Lk4pCmZvcihzPTA7czxhLmxlbmd0aDsrK3MpdGhpcy5ZNShyLHMsSC5FaihhW3NdKSkKcmV0dXJu
+IHIuam9pbihiKX0sCmVSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgucUMoYSxiLG51bGwsSC50NihhKS5j
+KX0sCk4wOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQpkLmEoYikKSC50NihhKS5LcShkKS5DKCIx
+KDEsMikiKS5hKGMpCnM9YS5sZW5ndGgKZm9yKHI9YixxPTA7cTxzOysrcSl7cj1jLiQyKHIsYVtxXSkK
+aWYoYS5sZW5ndGghPT1zKXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4gcn0sCkh0OmZ1bmN0aW9uKGEs
+Yil7dmFyIHMscixxLHAsbwpILnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEubGVuZ3RoCmZvcihyPW51
+bGwscT0hMSxwPTA7cDxzOysrcCl7bz1hW3BdCmlmKEgub1QoYi4kMShvKSkpe2lmKHEpdGhyb3cgSC5i
+KEguQW0oKSkKcj1vCnE9ITB9aWYocyE9PWEubGVuZ3RoKXRocm93IEguYihQLmE0KGEpKX1pZihxKXJl
+dHVybiByCnRocm93IEguYihILldwKCkpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5n
+dGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCmd0SDpmdW5jdGlvbihhKXtpZihhLmxlbmd0
+aD4wKXJldHVybiBhWzBdCnRocm93IEguYihILldwKCkpfSwKZ3JaOmZ1bmN0aW9uKGEpe3ZhciBzPWEu
+bGVuZ3RoCmlmKHM+MClyZXR1cm4gYVtzLTFdCnRocm93IEguYihILldwKCkpfSwKWVc6ZnVuY3Rpb24o
+YSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvCkgudDYoYSkuQygiY1g8MT4iKS5hKGQpCmlmKCEhYS5pbW11
+dGFibGUkbGlzdClILnYoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5ndGgpCnM9Yy1iCmlm
+KHM9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCmlmKHQuai5iKGQpKXtyPWQKcT1lfWVsc2V7
+cj1KLkE1KGQsZSkudHQoMCwhMSkKcT0wfXA9Si5VNihyKQppZihxK3M+cC5nQShyKSl0aHJvdyBILmIo
+SC5hcigpKQppZihxPGIpZm9yKG89cy0xO28+PTA7LS1vKWFbYitvXT1wLnEocixxK28pCmVsc2UgZm9y
+KG89MDtvPHM7KytvKWFbYitvXT1wLnEocixxK28pfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJu
+IHRoaXMuWVcoYSxiLGMsZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILnQ2KGEpLkMoImEy
+KDEpIikuYShiKQpzPWEubGVuZ3RoCmZvcihyPTA7cjxzOysrcil7aWYoSC5vVChiLiQxKGFbcl0pKSly
+ZXR1cm4hMAppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVu
+Y3Rpb24oYSxiKXt2YXIgcwpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWlmKEouUk0oYVtzXSxiKSlyZXR1
+cm4hMApyZXR1cm4hMX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGg9PT0wfSwKZ29yOmZ1
+bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKGEs
+IlsiLCJdIil9LAp0dDpmdW5jdGlvbihhLGIpe3ZhciBzPUguVk0oYS5zbGljZSgwKSxILnQ2KGEpKQpy
+ZXR1cm4gc30sCmJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ206ZnVuY3Rpb24o
+YSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTzpmdW5j
+dGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnNB
+OmZ1bmN0aW9uKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0IGxlbmd0aCIpKQpp
+ZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9
+LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZ
+KGEsYikpCnJldHVybiBhW2JdfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe0gudDYoYSkuYy5hKGMpCmlmKCEh
+YS5pbW11dGFibGUkbGlzdClILnYoUC5MNCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8
+MCl0aHJvdyBILmIoSC5IWShhLGIpKQphW2JdPWN9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpKLlBv
+LnByb3RvdHlwZT17fQpKLm0xLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0s
+CkY6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMscT1yLmEscD1xLmxlbmd0aAppZihyLmIhPT1wKXRocm93
+IEguYihILmxrKHEpKQpzPXIuYwppZihzPj1wKXtyLnNNKG51bGwpCnJldHVybiExfXIuc00ocVtzXSk7
+KytyLmMKcmV0dXJuITB9LApzTTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEp
+fSwKJGlBbjoxfQpKLnFJLnByb3RvdHlwZT17CnpROmZ1bmN0aW9uKGEpe2lmKGE+MCl7aWYoYSE9PTEv
+MClyZXR1cm4gTWF0aC5yb3VuZChhKX1lbHNlIGlmKGE+LTEvMClyZXR1cm4gMC1NYXRoLnJvdW5kKDAt
+YSkKdGhyb3cgSC5iKFAuTDQoIiIrYSsiLnJvdW5kKCkiKSl9LAp3OmZ1bmN0aW9uKGEpe2lmKGE9PT0w
+JiYxL2E8MClyZXR1cm4iLTAuMCIKZWxzZSByZXR1cm4iIithfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBz
+LHIscSxwLG89YXwwCmlmKGE9PT1vKXJldHVybiBvJjUzNjg3MDkxMQpzPU1hdGguYWJzKGEpCnI9TWF0
+aC5sb2cocykvMC42OTMxNDcxODA1NTk5NDUzfDAKcT1NYXRoLnBvdygyLHIpCnA9czwxP3MvcTpxL3MK
+cmV0dXJuKChwKjkwMDcxOTkyNTQ3NDA5OTJ8MCkrKHAqMzU0MjI0MzE4MTE3NjUyMXwwKSkqNTk5MTk3
+K3IqMTI1OSY1MzY4NzA5MTF9LAp6WTpmdW5jdGlvbihhLGIpe3ZhciBzPWElYgppZihzPT09MClyZXR1
+cm4gMAppZihzPjApcmV0dXJuIHMKaWYoYjwwKXJldHVybiBzLWIKZWxzZSByZXR1cm4gcytifSwKQlU6
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYXwwKT09PWE/YS9ifDA6dGhpcy5ESihhLGIpfSwKREo6ZnVuY3Rp
+b24oYSxiKXt2YXIgcz1hL2IKaWYocz49LTIxNDc0ODM2NDgmJnM8PTIxNDc0ODM2NDcpcmV0dXJuIHN8
+MAppZihzPjApe2lmKHMhPT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyl9ZWxzZSBpZihzPi0xLzApcmV0
+dXJuIE1hdGguY2VpbChzKQp0aHJvdyBILmIoUC5MNCgiUmVzdWx0IG9mIHRydW5jYXRpbmcgZGl2aXNp
+b24gaXMgIitILkVqKHMpKyI6ICIrSC5FaihhKSsiIH4vICIrYikpfSwKd0c6ZnVuY3Rpb24oYSxiKXt2
+YXIgcwppZihhPjApcz10aGlzLnAzKGEsYikKZWxzZXtzPWI+MzE/MzE6YgpzPWE+PnM+Pj4wfXJldHVy
+biBzfSwKYmY6ZnVuY3Rpb24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlz
+LnAzKGEsYil9LApwMzpmdW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRp
+Wlo6MX0KSi5iVS5wcm90b3R5cGU9eyRpQjI6MX0KSi5WQS5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5
+cGU9ewpPOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVu
+Z3RoKUgudihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApXOmZ1bmN0aW9uKGEsYil7
+aWYoYj49YS5sZW5ndGgpdGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0s
+CmRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmg6ZnVuY3Rpb24oYSxiKXtp
+Zih0eXBlb2YgYiE9InN0cmluZyIpdGhyb3cgSC5iKFAuTDMoYixudWxsLG51bGwpKQpyZXR1cm4gYSti
+fSwKVGM6ZnVuY3Rpb24oYSxiKXt2YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4h
+MQpyZXR1cm4gYj09PXRoaXMueW4oYSxyLXMpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHM9UC5q
+QihiLGMsYS5sZW5ndGgpLHI9YS5zdWJzdHJpbmcoMCxiKSxxPWEuc3Vic3RyaW5nKHMpCnJldHVybiBy
+K2QrcX0sClFpOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5i
+KFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9YytiLmxlbmd0aAppZihzPmEubGVuZ3RoKXJl
+dHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyxzKX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+dGhpcy5RaShhLGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYoYz09bnVsbCljPWEubGVuZ3RoCmlm
+KGI8MCl0aHJvdyBILmIoUC5PNyhiLG51bGwpKQppZihiPmMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkK
+aWYoYz5hLmxlbmd0aCl0aHJvdyBILmIoUC5PNyhjLG51bGwpKQpyZXR1cm4gYS5zdWJzdHJpbmcoYixj
+KX0sCnluOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuTmooYSxiLG51bGwpfSwKaGM6ZnVuY3Rpb24o
+YSl7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX0sCmJTOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEudHJp
+bSgpLG89cC5sZW5ndGgKaWYobz09PTApcmV0dXJuIHAKaWYodGhpcy5XKHAsMCk9PT0xMzMpe3M9Si5t
+bShwLDEpCmlmKHM9PT1vKXJldHVybiIifWVsc2Ugcz0wCnI9by0xCnE9dGhpcy5PKHAscik9PT0xMzM/
+Si5jMShwLHIpOm8KaWYocz09PTAmJnE9PT1vKXJldHVybiBwCnJldHVybiBwLnN1YnN0cmluZyhzLHEp
+fSwKVDpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5n
+dGg9PT0wKXJldHVybiBhCmlmKGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHM9YSxyPSIiOyEw
+Oyl7aWYoKGImMSk9PT0xKXI9cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0s
+ClhVOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUo
+YywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWTpmdW5j
+dGlvbihhLGIpe3JldHVybiB0aGlzLlhVKGEsYiwwKX0sClBrOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxy
+CmlmKGM9PW51bGwpYz1hLmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5U
+RShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVuZ3RoCmlmKGMrcz5yKWM9
+ci1zCnJldHVybiBhLmxhc3RJbmRleE9mKGIsYyl9LApjbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlz
+LlBrKGEsYixudWxsKX0sCklzOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhy
+b3cgSC5iKFAuVEUoYywwLHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGc6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gdGhpcy5JcyhhLGIsMCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKZ2lP
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIscQpmb3Iocz1hLmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cith
+LmNoYXJDb2RlQXQocSkmNTM2ODcwOTExCnI9cisoKHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1y
+Pj42fXI9cisoKHImNjcxMDg4NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2
+MzgzKTw8MTUpJjUzNjg3MDkxMX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVu
+Y3Rpb24oYSxiKXtILnVQKGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIoSC5IWShhLGIpKQpy
+ZXR1cm4gYVtiXX0sCiRpdlg6MSwKJGlxVToxfQpILkJSLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEp
+e3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILkU3KEouSVQodGhpcy5nT04oKSkscy5DKCJAPDE+
+IikuS3Eocy5RWzFdKS5DKCJFNzwxLDI+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhp
+cy5nT04oKSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5nT04oKSl9LApnb3I6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIEouRjcodGhpcy5nT04oKSl9LAplUjpmdW5jdGlvbihhLGIpe3ZhciBzPUgu
+TGgodGhpcykKcmV0dXJuIEguR0ooSi5BNSh0aGlzLmdPTigpLGIpLHMuYyxzLlFbMV0pfSwKRTpmdW5j
+dGlvbihhLGIpe3JldHVybiBILkxoKHRoaXMpLlFbMV0uYShKLkdBKHRoaXMuZ09OKCksYikpfSwKdzpm
+dW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuZ09OKCkpfX0KSC5FNy5wcm90b3R5cGU9ewpGOmZ1bmN0
+aW9uKCl7cmV0dXJuIHRoaXMuYS5GKCl9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aS5RWzFd
+LmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlp5LnByb3RvdHlwZT17CmdPTjpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmF9fQpILm9sLnByb3RvdHlwZT17JGliUToxfQpILlVxLnByb3RvdHlwZT17CnE6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gdGhpcy4kdGkuUVsxXS5hKEoueDkodGhpcy5hLEgudVAoYikpKX0sClk1
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgcz10aGlzLiR0aQpKLnU5KHRoaXMuYSxiLHMuYy5hKHMuUVsxXS5h
+KGMpKSl9LAokaWJROjEsCiRpek06MX0KSC5qVi5wcm90b3R5cGU9ewpkcjpmdW5jdGlvbihhLGIpe3Jl
+dHVybiBuZXcgSC5qVih0aGlzLmEsdGhpcy4kdGkuQygiQDwxPiIpLktxKGIpLkMoImpWPDEsMj4iKSl9
+LApnT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfX0KSC5uLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24o
+YSl7dmFyIHM9dGhpcy5hCnJldHVybiBzIT1udWxsPyJMYXRlSW5pdGlhbGl6YXRpb25FcnJvcjogIitz
+OiJMYXRlSW5pdGlhbGl6YXRpb25FcnJvciJ9fQpILnIzLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
+dmFyIHM9IlJlYWNoYWJpbGl0eUVycm9yOiAiK3RoaXMuYQpyZXR1cm4gc319CkgucWoucHJvdG90eXBl
+PXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIEMueEIuTyh0aGlzLmEsSC51UChiKSl9fQpILkdNLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
+cmV0dXJuIk51bGwgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgJyIrdGhpcy5h
+KyInIG9mIHR5cGUgJyIrSC5LeCh0aGlzLiR0aS5jKS53KDApKyInIn19CkguYlEucHJvdG90eXBlPXt9
+CkguYUwucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcwpyZXR1cm4gbmV3IEguYTco
+cyxzLmdBKHMpLEguTGgocykuQygiYTc8YUwuRT4iKSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
+aXMuZ0EodGhpcyk9PT0wfSwKazpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1wLmdBKHAp
+CmlmKGIubGVuZ3RoIT09MCl7aWYobz09PTApcmV0dXJuIiIKcz1ILkVqKHAuRSgwLDApKQppZihvIT09
+cC5nQShwKSl0aHJvdyBILmIoUC5hNChwKSkKZm9yKHI9cyxxPTE7cTxvOysrcSl7cj1yK2IrSC5Faihw
+LkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpfXJldHVybiByLmNoYXJDb2Rl
+QXQoMCk9PTA/cjpyfWVsc2V7Zm9yKHE9MCxyPSIiO3E8bzsrK3Epe3IrPUguRWoocC5FKDAscSkpCmlm
+KG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6
+cn19LApldjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkdHKDAsSC5MaCh0aGlzKS5DKCJhMihhTC5F
+KSIpLmEoYikpfSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBI
+LmxKKHRoaXMscy5LcShjKS5DKCIxKGFMLkUpIikuYShiKSxzLkMoIkA8YUwuRT4iKS5LcShjKS5DKCJs
+SjwxLDI+IikpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5xQyh0aGlzLGIsbnVsbCxILkxoKHRo
+aXMpLkMoImFMLkUiKSl9LAp0dDpmdW5jdGlvbihhLGIpe3JldHVybiBQLlkxKHRoaXMsITAsSC5MaCh0
+aGlzKS5DKCJhTC5FIikpfSwKYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9fQpILm5I
+LnByb3RvdHlwZT17CkhkOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHI9dGhpcy5iClAuazEociwic3Rh
+cnQiKQpzPXRoaXMuYwppZihzIT1udWxsKXtQLmsxKHMsImVuZCIpCmlmKHI+cyl0aHJvdyBILmIoUC5U
+RShyLDAscywic3RhcnQiLG51bGwpKX19LApnVUQ6ZnVuY3Rpb24oKXt2YXIgcz1KLkhtKHRoaXMuYSks
+cj10aGlzLmMKaWYocj09bnVsbHx8cj5zKXJldHVybiBzCnJldHVybiByfSwKZ0FzOmZ1bmN0aW9uKCl7
+dmFyIHM9Si5IbSh0aGlzLmEpLHI9dGhpcy5iCmlmKHI+cylyZXR1cm4gcwpyZXR1cm4gcn0sCmdBOmZ1
+bmN0aW9uKGEpe3ZhciBzLHI9Si5IbSh0aGlzLmEpLHE9dGhpcy5iCmlmKHE+PXIpcmV0dXJuIDAKcz10
+aGlzLmMKaWYocz09bnVsbHx8cz49cilyZXR1cm4gci1xCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0
+dXJuIHMuSE4oKQpyZXR1cm4gcy1xfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMscj1zLmdBcygp
+K2IKaWYoYjwwfHxyPj1zLmdVRCgpKXRocm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkp
+CnJldHVybiBKLkdBKHMuYSxyKX0sCmVSOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRoaXMKUC5rMShi
+LCJjb3VudCIpCnM9cS5iK2IKcj1xLmMKaWYociE9bnVsbCYmcz49cilyZXR1cm4gbmV3IEguTUIocS4k
+dGkuQygiTUI8MT4iKSkKcmV0dXJuIEgucUMocS5hLHMscixxLiR0aS5jKX0sCnR0OmZ1bmN0aW9uKGEs
+Yil7dmFyIHMscixxLHA9dGhpcyxvPXAuYixuPXAuYSxtPUouVTYobiksbD1tLmdBKG4pLGs9cC5jCmlm
+KGshPW51bGwmJms8bClsPWsKaWYodHlwZW9mIGwhPT0ibnVtYmVyIilyZXR1cm4gbC5ITigpCnM9bC1v
+CmlmKHM8PTApe249Si5RaSgwLHAuJHRpLmMpCnJldHVybiBufXI9UC5POChzLG0uRShuLG8pLCExLHAu
+JHRpLmMpCmZvcihxPTE7cTxzOysrcSl7Qy5ObS5ZNShyLHEsbS5FKG4sbytxKSkKaWYobS5nQShuKTxs
+KXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gcn19CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24o
+KXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPUouVTYocSks
+bz1wLmdBKHEpCmlmKHIuYiE9PW8pdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM+PW8pe3Iuc0ko
+bnVsbCkKcmV0dXJuITF9ci5zSShwLkUocSxzKSk7KytyLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihh
+KXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmkxLnByb3RvdHlwZT17Cmdt
+OmZ1bmN0aW9uKGEpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILk1IKEouSVQodGhpcy5hKSx0
+aGlzLmIscy5DKCJAPDE+IikuS3Eocy5RWzFdKS5DKCJNSDwxLDI+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7
+cmV0dXJuIEouSG0odGhpcy5hKX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gSi51VSh0aGlzLmEpfSwK
+RTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmIuJDEoSi5HQSh0aGlzLmEsYikpfX0KSC54eS5wcm90
+b3R5cGU9eyRpYlE6MX0KSC5NSC5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMu
+YgppZihyLkYoKSl7cy5zSShzLmMuJDEoci5nbCgpKSkKcmV0dXJuITB9cy5zSShudWxsKQpyZXR1cm4h
+MX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX0sCnNJOmZ1bmN0aW9uKGEpe3RoaXMuYT10aGlz
+LiR0aS5DKCIyPyIpLmEoYSl9fQpILmxKLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBK
+LkhtKHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxi
+KSl9fQpILlU1LnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TTyhKLklUKHRo
+aXMuYSksdGhpcy5iLHRoaXMuJHRpLkMoIlNPPDE+IikpfX0KSC5TTy5wcm90b3R5cGU9ewpGOmZ1bmN0
+aW9uKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj10aGlzLmI7cy5GKCk7KWlmKEgub1Qoci4kMShzLmds
+KCkpKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0K
+SC5BTS5wcm90b3R5cGU9ewplUjpmdW5jdGlvbihhLGIpe1AuTVIoYiwiY291bnQiLHQuUykKUC5rMShi
+LCJjb3VudCIpCnJldHVybiBuZXcgSC5BTSh0aGlzLmEsdGhpcy5iK2IsSC5MaCh0aGlzKS5DKCJBTTwx
+PiIpKX0sCmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5VMShKLklUKHRoaXMuYSksdGhpcy5iLEgu
+TGgodGhpcykuQygiVTE8MT4iKSl9fQpILmQ1LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciBz
+PUouSG0odGhpcy5hKS10aGlzLmIKaWYocz49MClyZXR1cm4gcwpyZXR1cm4gMH0sCmVSOmZ1bmN0aW9u
+KGEsYil7UC5NUihiLCJjb3VudCIsdC5TKQpQLmsxKGIsImNvdW50IikKcmV0dXJuIG5ldyBILmQ1KHRo
+aXMuYSx0aGlzLmIrYix0aGlzLiR0aSl9LAokaWJROjF9CkguVTEucHJvdG90eXBlPXsKRjpmdW5jdGlv
+bigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9MDtyPHRoaXMuYjsrK3Ipcy5GKCkKdGhpcy5iPTAKcmV0
+dXJuIHMuRigpfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmdsKCl9fQpILk1CLnByb3RvdHlw
+ZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBDLkd3fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiEwfSwK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LApFOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAuVEUoYiww
+LDAsImluZGV4IixudWxsKSl9LAplUjpmdW5jdGlvbihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4g
+dGhpc319CkguRnUucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2w6ZnVuY3Rpb24o
+KXt0aHJvdyBILmIoSC5XcCgpKX0sCiRpQW46MX0KSC51Ni5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihh
+KXtyZXR1cm4gbmV3IEguSkIoSi5JVCh0aGlzLmEpLHRoaXMuJHRpLkMoIkpCPDE+IikpfX0KSC5KQi5w
+cm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj10aGlzLiR0aS5jO3Mu
+RigpOylpZihyLmIocy5nbCgpKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuJHRpLmMuYSh0aGlzLmEuZ2woKSl9LAokaUFuOjF9CkguU1UucHJvdG90eXBlPXt9CkguUmUu
+cHJvdG90eXBlPXsKWTU6ZnVuY3Rpb24oYSxiLGMpe0guTGgodGhpcykuQygiUmUuRSIpLmEoYykKdGhy
+b3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKSl9fQpILncyLnBy
+b3RvdHlwZT17fQpILnd2LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLl9oYXNo
+Q29kZQppZihzIT1udWxsKXJldHVybiBzCnM9NjY0NTk3KkouaGYodGhpcy5hKSY1MzY4NzA5MTEKdGhp
+cy5faGFzaENvZGU9cwpyZXR1cm4gc30sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuJ1N5bWJvbCgiJytILkVq
+KHRoaXMuYSkrJyIpJ30sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4g
+YiBpbnN0YW5jZW9mIEgud3YmJnRoaXMuYT09Yi5hfSwKJGlHRDoxfQpILlFDLnByb3RvdHlwZT17fQpI
+LlBELnByb3RvdHlwZT17fQpILldVLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
+cy5nQSh0aGlzKT09PTB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKWTU6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcy5jLmEoYikKcy5RWzFdLmEoYykKSC5kYygpCkguQmko
+dS5nKX0sCmdQdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xNChhLEguTGgodGhpcykuQygiTjM8MSwy
+PiIpKX0sCnE0OmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcwpyZXR1cm4gUC5sMChmdW5jdGlvbigpe3Zh
+ciByPWEKdmFyIHE9MCxwPTEsbyxuLG0sbCxrCnJldHVybiBmdW5jdGlvbiAkYXN5bmMkZ1B1KGMsZCl7
+aWYoYz09PTEpe289ZApxPXB9d2hpbGUodHJ1ZSlzd2l0Y2gocSl7Y2FzZSAwOm49cy5ndmMoKSxuPW4u
+Z20obiksbT1ILkxoKHMpLG09bS5DKCJAPDE+IikuS3EobS5RWzFdKS5DKCJOMzwxLDI+IikKY2FzZSAy
+OmlmKCFuLkYoKSl7cT0zCmJyZWFrfWw9bi5nbCgpCms9cy5xKDAsbCkKay50b1N0cmluZwpxPTQKcmV0
+dXJuIG5ldyBQLk4zKGwsayxtKQpjYXNlIDQ6cT0yCmJyZWFrCmNhc2UgMzpyZXR1cm4gUC5UaCgpCmNh
+c2UgMTpyZXR1cm4gUC5ZbShvKX19fSxiKX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQTpmdW5j
+dGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJzdHJpbmci
+KXJldHVybiExCmlmKCJfX3Byb3RvX18iPT09YSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5iLmhhc093blBy
+b3BlcnR5KGEpfSwKcTpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybiBudWxsCnJldHVy
+biB0aGlzLnFQKGIpfSwKcVA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYltILmgoYSldfSwKSzpmdW5j
+dGlvbihhLGIpe3ZhciBzLHIscSxwLG89SC5MaCh0aGlzKQpvLkMoIn4oMSwyKSIpLmEoYikKcz10aGlz
+LmMKZm9yKHI9cy5sZW5ndGgsbz1vLlFbMV0scT0wO3E8cjsrK3Epe3A9c1txXQpiLiQyKHAsby5hKHRo
+aXMucVAocCkpKX19LApndmM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguWFIodGhpcyxILkxoKHRoaXMp
+LkMoIlhSPDE+IikpfX0KSC5YUi5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEu
+YwpyZXR1cm4gbmV3IEoubTEocyxzLmxlbmd0aCxILnQ2KHMpLkMoIm0xPDE+IikpfSwKZ0E6ZnVuY3Rp
+b24oYSl7cmV0dXJuIHRoaXMuYS5jLmxlbmd0aH19CkguTEkucHJvdG90eXBlPXsKZ1dhOmZ1bmN0aW9u
+KCl7dmFyIHM9dGhpcy5hCnJldHVybiBzfSwKZ25kOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlz
+CmlmKG8uYz09PTEpcmV0dXJuIEMuaFUKcz1vLmQKcj1zLmxlbmd0aC1vLmUubGVuZ3RoLW8uZgppZihy
+PT09MClyZXR1cm4gQy5oVQpxPVtdCmZvcihwPTA7cDxyOysrcCl7aWYocD49cy5sZW5ndGgpcmV0dXJu
+IEguT0gocyxwKQpxLnB1c2goc1twXSl9cmV0dXJuIEouekMocSl9LApnVm06ZnVuY3Rpb24oKXt2YXIg
+cyxyLHEscCxvLG4sbSxsLGs9dGhpcwppZihrLmMhPT0wKXJldHVybiBDLldPCnM9ay5lCnI9cy5sZW5n
+dGgKcT1rLmQKcD1xLmxlbmd0aC1yLWsuZgppZihyPT09MClyZXR1cm4gQy5XTwpvPW5ldyBILk41KHQu
+ZW8pCmZvcihuPTA7bjxyOysrbil7aWYobj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxuKQptPXNbbl0K
+bD1wK24KaWYobDwwfHxsPj1xLmxlbmd0aClyZXR1cm4gSC5PSChxLGwpCm8uWTUoMCxuZXcgSC53diht
+KSxxW2xdKX1yZXR1cm4gbmV3IEguUEQobyx0LmdGKX0sCiRpdlE6MX0KSC5Dai5wcm90b3R5cGU9ewok
+MjpmdW5jdGlvbihhLGIpe3ZhciBzCkguaChhKQpzPXRoaXMuYQpzLmI9cy5iKyIkIitILkVqKGEpCkMu
+Tm0uaSh0aGlzLmIsYSkKQy5ObS5pKHRoaXMuYyxiKTsrK3MuYX0sCiRTOjEzfQpILmY5LnByb3RvdHlw
+ZT17CnFTOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9bmV3IFJlZ0V4cChxLmEpLmV4ZWMoYSkK
+aWYocD09bnVsbClyZXR1cm4gbnVsbApzPU9iamVjdC5jcmVhdGUobnVsbCkKcj1xLmIKaWYociE9PS0x
+KXMuYXJndW1lbnRzPXBbcisxXQpyPXEuYwppZihyIT09LTEpcy5hcmd1bWVudHNFeHByPXBbcisxXQpy
+PXEuZAppZihyIT09LTEpcy5leHByPXBbcisxXQpyPXEuZQppZihyIT09LTEpcy5tZXRob2Q9cFtyKzFd
+CnI9cS5mCmlmKHIhPT0tMSlzLnJlY2VpdmVyPXBbcisxXQpyZXR1cm4gc319CkguVzAucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9k
+RXJyb3I6ICIrSC5Faih0aGlzLmEpCnJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBm
+b3VuZDogJyIrcysiJyBvbiBudWxsIn19CkguYXoucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIg
+cyxyPXRoaXMscT0iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciLHA9ci5iCmlm
+KHA9PW51bGwpcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiAiK0guRWooci5hKQpzPXIuYwppZihzPT1u
+dWxsKXJldHVybiBxK3ArIicgKCIrSC5FaihyLmEpKyIpIgpyZXR1cm4gcStwKyInIG9uICciK3MrIicg
+KCIrSC5FaihyLmEpKyIpIn19CkgudlYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlz
+LmEKcmV0dXJuIHMubGVuZ3RoPT09MD8iRXJyb3IiOiJFcnJvcjogIitzfX0KSC50ZS5wcm90b3R5cGU9
+ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJUaHJvdyBvZiBudWxsICgnIisodGhpcy5hPT09bnVsbD8ibnVs
+bCI6InVuZGVmaW5lZCIpKyInIGZyb20gSmF2YVNjcmlwdCkifSwKJGlSejoxfQpILmJxLnByb3RvdHlw
+ZT17fQpILlhPLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIKaWYociE9bnVs
+bClyZXR1cm4gcgpyPXRoaXMuYQpzPXIhPT1udWxsJiZ0eXBlb2Ygcj09PSJvYmplY3QiP3Iuc3RhY2s6
+bnVsbApyZXR1cm4gdGhpcy5iPXM9PW51bGw/IiI6c30sCiRpR3o6MX0KSC5UcC5wcm90b3R5cGU9ewp3
+OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuY29uc3RydWN0b3Iscj1zPT1udWxsP251bGw6cy5uYW1lCnJl
+dHVybiJDbG9zdXJlICciK0guTlEocj09bnVsbD8idW5rbm93biI6cikrIicifSwKJGlFSDoxLApnS3U6
+ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCiRDOiIkMSIsCiRSOjEsCiREOm51bGx9CkgubGMucHJvdG90
+eXBlPXt9CkguengucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLiRzdGF0aWNfbmFt
+ZQppZihzPT1udWxsKXJldHVybiJDbG9zdXJlIG9mIHVua25vd24gc3RhdGljIG1ldGhvZCIKcmV0dXJu
+IkNsb3N1cmUgJyIrSC5OUShzKSsiJyJ9fQpILnJULnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7
+dmFyIHM9dGhpcwppZihiPT1udWxsKXJldHVybiExCmlmKHM9PT1iKXJldHVybiEwCmlmKCEoYiBpbnN0
+YW5jZW9mIEguclQpKXJldHVybiExCnJldHVybiBzLmE9PT1iLmEmJnMuYj09PWIuYiYmcy5jPT09Yi5j
+fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5jCmlmKHI9PW51bGwpcz1ILmVRKHRoaXMuYSkK
+ZWxzZSBzPXR5cGVvZiByIT09Im9iamVjdCI/Si5oZihyKTpILmVRKHIpCnI9SC5lUSh0aGlzLmIpCmlm
+KHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuWSgpCnJldHVybihzXnIpPj4+MH0sCnc6ZnVuY3Rp
+b24oYSl7dmFyIHM9dGhpcy5jCmlmKHM9PW51bGwpcz10aGlzLmEKcmV0dXJuIkNsb3N1cmUgJyIrSC5F
+aih0aGlzLmQpKyInIG9mICIrKCJJbnN0YW5jZSBvZiAnIitILkVqKEguTShzKSkrIiciKX19CkguRXEu
+cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK3RoaXMuYX19Ckgu
+a1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAo
+dGhpcy5hKX19Ckgua3IucHJvdG90eXBlPXt9CkguTjUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHRoaXMuYX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmd2YzpmdW5j
+dGlvbigpe3JldHVybiBuZXcgSC5pNSh0aGlzLEguTGgodGhpcykuQygiaTU8MT4iKSl9LAp4NDpmdW5j
+dGlvbihhKXt2YXIgcyxyCmlmKHR5cGVvZiBhPT0ic3RyaW5nIil7cz10aGlzLmIKaWYocz09bnVsbCly
+ZXR1cm4hMQpyZXR1cm4gdGhpcy5YdShzLGEpfWVsc2V7cj10aGlzLkNYKGEpCnJldHVybiByfX0sCkNY
+OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLkZo
+KHRoaXMuQnQocyxKLmhmKGEpJjB4M2ZmZmZmZiksYSk+PTB9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHMs
+cixxLHAsbz10aGlzLG49bnVsbAppZih0eXBlb2YgYj09InN0cmluZyIpe3M9by5iCmlmKHM9PW51bGwp
+cmV0dXJuIG4Kcj1vLmoyKHMsYikKcT1yPT1udWxsP246ci5iCnJldHVybiBxfWVsc2UgaWYodHlwZW9m
+IGI9PSJudW1iZXIiJiYoYiYweDNmZmZmZmYpPT09Yil7cD1vLmMKaWYocD09bnVsbClyZXR1cm4gbgpy
+PW8uajIocCxiKQpxPXI9PW51bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSByZXR1cm4gby5hYShiKX0sCmFh
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLmQKaWYocT09bnVsbClyZXR1cm4gbnVsbApzPXRoaXMu
+QnQocSxKLmhmKGEpJjB4M2ZmZmZmZikKcj10aGlzLkZoKHMsYSkKaWYocjwwKXJldHVybiBudWxsCnJl
+dHVybiBzW3JdLmJ9LApZNTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPUgu
+TGgobSkKbC5jLmEoYikKbC5RWzFdLmEoYykKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPW0uYgptLkVI
+KHM9PW51bGw/bS5iPW0ueksoKTpzLGIsYyl9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4
+M2ZmZmZmZik9PT1iKXtyPW0uYwptLkVIKHI9PW51bGw/bS5jPW0ueksoKTpyLGIsYyl9ZWxzZXtxPW0u
+ZAppZihxPT1udWxsKXE9bS5kPW0ueksoKQpwPUouaGYoYikmMHgzZmZmZmZmCm89bS5CdChxLHApCmlm
+KG89PW51bGwpbS5FSShxLHAsW20uSG4oYixjKV0pCmVsc2V7bj1tLkZoKG8sYikKaWYobj49MClvW25d
+LmI9YwplbHNlIG8ucHVzaChtLkhuKGIsYykpfX19LApLOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRo
+aXMKSC5MaChxKS5DKCJ+KDEsMikiKS5hKGIpCnM9cS5lCnI9cS5yCmZvcig7cyE9bnVsbDspe2IuJDIo
+cy5hLHMuYikKaWYociE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKcz1zLmN9fSwKRUg6ZnVuY3Rpb24o
+YSxiLGMpe3ZhciBzLHI9dGhpcyxxPUguTGgocikKcS5jLmEoYikKcS5RWzFdLmEoYykKcz1yLmoyKGEs
+YikKaWYocz09bnVsbClyLkVJKGEsYixyLkhuKGIsYykpCmVsc2Ugcy5iPWN9LAprczpmdW5jdGlvbigp
+e3RoaXMucj10aGlzLnIrMSY2NzEwODg2M30sCkhuOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcyxyPUgu
+TGgocykscT1uZXcgSC52aChyLmMuYShhKSxyLlFbMV0uYShiKSkKaWYocy5lPT1udWxsKXMuZT1zLmY9
+cQplbHNle3I9cy5mCnIudG9TdHJpbmcKcS5kPXIKcy5mPXIuYz1xfSsrcy5hCnMua3MoKQpyZXR1cm4g
+cX0sCkZoOmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZihhPT1udWxsKXJldHVybi0xCnM9YS5sZW5ndGgK
+Zm9yKHI9MDtyPHM7KytyKWlmKEouUk0oYVtyXS5hLGIpKXJldHVybiByCnJldHVybi0xfSwKdzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCmoyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbYl19LApC
+dDpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKRUk6ZnVuY3Rpb24oYSxiLGMpe2FbYl09Y30sCnJu
+OmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApYdTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmoy
+KGEsYikhPW51bGx9LAp6SzpmdW5jdGlvbigpe3ZhciBzPSI8bm9uLWlkZW50aWZpZXIta2V5PiIscj1P
+YmplY3QuY3JlYXRlKG51bGwpCnRoaXMuRUkocixzLHIpCnRoaXMucm4ocixzKQpyZXR1cm4gcn0sCiRp
+Rm86MX0KSC52aC5wcm90b3R5cGU9e30KSC5pNS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1
+cm4gdGhpcy5hLmF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5hPT09MH0sCmdtOmZ1bmN0
+aW9uKGEpe3ZhciBzPXRoaXMuYSxyPW5ldyBILk42KHMscy5yLHRoaXMuJHRpLkMoIk42PDE+IikpCnIu
+Yz1zLmUKcmV0dXJuIHJ9LAp0ZzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEueDQoYil9fQpILk42
+LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIg
+cyxyPXRoaXMscT1yLmEKaWYoci5iIT09cS5yKXRocm93IEguYihQLmE0KHEpKQpzPXIuYwppZihzPT1u
+dWxsKXtyLnNxWShudWxsKQpyZXR1cm4hMX1lbHNle3Iuc3FZKHMuYSkKci5jPXMuYwpyZXR1cm4hMH19
+LApzcVk6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRpQW46MX0KSC5k
+Qy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hKGEpfSwKJFM6NH0KSC53Ti5w
+cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEoYSxiKX0sCiRTOjQ2fQpILlZY
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoSC5oKGEpKX0sCiRTOjQxfQpI
+LlZSLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlZ0V4cC8iK3RoaXMuYSsiLyIrdGhp
+cy5iLmZsYWdzfSwKZ0hjOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMuYwppZihyIT1udWxsKXJldHVy
+biByCnI9cy5iCnJldHVybiBzLmM9SC52NChzLmEsci5tdWx0aWxpbmUsIXIuaWdub3JlQ2FzZSxyLnVu
+aWNvZGUsci5kb3RBbGwsITApfSwKZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguS1codGhpcyxi
+LDApfSwKVVo6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuZ0hjKCkKci5sYXN0SW5kZXg9YgpzPXIu
+ZXhlYyhhKQppZihzPT1udWxsKXJldHVybiBudWxsCnJldHVybiBuZXcgSC5FSyhzKX0sCiRpdlg6MSwK
+JGl3TDoxfQpILkVLLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgcwpILnVQKGIpCnM9dGhp
+cy5iCmlmKGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcmV0dXJuIHNbYl19LAokaU9kOjEsCiRp
+aWI6MX0KSC5LVy5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguUGIodGhpcy5h
+LHRoaXMuYix0aGlzLmMpfX0KSC5QYi5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlz
+LmR9LApGOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPW0uYgppZihsPT1udWxsKXJl
+dHVybiExCnM9bS5jCnI9bC5sZW5ndGgKaWYoczw9cil7cT1tLmEKcD1xLlVaKGwscykKaWYocCE9bnVs
+bCl7bS5kPXAKcz1wLmIKbz1zLmluZGV4Cm49bytzWzBdLmxlbmd0aAppZihvPT09bil7aWYocS5iLnVu
+aWNvZGUpe3M9bS5jCnE9cysxCmlmKHE8cil7cz1DLnhCLk8obCxzKQppZihzPj01NTI5NiYmczw9NTYz
+MTkpe3M9Qy54Qi5PKGwscSkKcz1zPj01NjMyMCYmczw9NTczNDN9ZWxzZSBzPSExfWVsc2Ugcz0hMX1l
+bHNlIHM9ITEKbj0ocz9uKzE6bikrMX1tLmM9bgpyZXR1cm4hMH19bS5iPW0uZD1udWxsCnJldHVybiEx
+fSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCmlmKGIhPT0w
+KUgudihQLk83KGIsbnVsbCkpCnJldHVybiB0aGlzLmN9LAokaU9kOjF9CkgudW4ucHJvdG90eXBlPXsK
+Z206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlNkKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19CkguU2Qu
+cHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzLHIscT10aGlzLHA9cS5jLG89cS5iLG49by5sZW5n
+dGgsbT1xLmEsbD1tLmxlbmd0aAppZihwK24+bCl7cS5kPW51bGwKcmV0dXJuITF9cz1tLmluZGV4T2Yo
+byxwKQppZihzPDApe3EuYz1sKzEKcS5kPW51bGwKcmV0dXJuITF9cj1zK24KcS5kPW5ldyBILnRRKHMs
+bykKcS5jPXI9PT1xLmM/cisxOnIKcmV0dXJuITB9LApnbDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuZApz
+LnRvU3RyaW5nCnJldHVybiBzfSwKJGlBbjoxfQpILkVULnByb3RvdHlwZT17JGlFVDoxLCRpQVM6MX0K
+SC5MWi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhqOjF9Ckgu
+RGcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJl
+dHVybiBhW2JdfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe0guR0goYykKSC5vZChiLGEsYS5sZW5ndGgpCmFb
+Yl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTU6ZnVuY3Rpb24o
+YSxiLGMpe0gudVAoYykKSC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAok
+aXpNOjF9CkgueGoucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5s
+ZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kRS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChi
+KQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlpBLnByb3RvdHlwZT17CnE6ZnVuY3Rp
+b24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZFQucHJvdG90
eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2Jd
-fX0KSC5lRS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0
-aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlY2LnByb3Rv
-dHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQ
-KGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sCiRpVjY6MSwKJGluNjoxfQpILlJHLnBy
-b3RvdHlwZT17fQpILlZQLnByb3RvdHlwZT17fQpILldCLnByb3RvdHlwZT17fQpILlpHLnByb3RvdHlw
-ZT17fQpILkpjLnByb3RvdHlwZT17CkM6ZnVuY3Rpb24oYSl7cmV0dXJuIEguY0Uodi50eXBlVW5pdmVy
-c2UsdGhpcyxhKX0sCktxOmZ1bmN0aW9uKGEpe3JldHVybiBILnY1KHYudHlwZVVuaXZlcnNlLHRoaXMs
-YSl9fQpILkcucHJvdG90eXBlPXt9CkgubFkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4g
-SC5kbSh0aGlzLmEsbnVsbCl9fQpILmtTLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuYX19CkguaU0ucHJvdG90eXBlPXt9ClAudGgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
-IHM9dGhpcy5hLHI9cy5hCnMuYT1udWxsCnIuJDAoKX0sCiRTOjEwfQpQLmhhLnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIKdGhpcy5hLmE9dC5NLmEoYSkKcz10aGlzLmIKcj10aGlzLmMKcy5m
-aXJzdENoaWxkP3MucmVtb3ZlQ2hpbGQocik6cy5hcHBlbmRDaGlsZChyKX0sCiRTOjM0fQpQLlZzLnBy
-b3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzoyfQpQ
-LkZ0LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLiQwKCl9LAokQzoiJDAiLAokUjowLAok
-UzoyfQpQLlczLnByb3RvdHlwZT17CkNZOmZ1bmN0aW9uKGEsYil7aWYoc2VsZi5zZXRUaW1lb3V0IT1u
-dWxsKXNlbGYuc2V0VGltZW91dChILnRSKG5ldyBQLnlIKHRoaXMsYiksMCksYSkKZWxzZSB0aHJvdyBI
-LmIoUC5MNCgiYHNldFRpbWVvdXQoKWAgbm90IGZvdW5kLiIpKX19ClAueUgucHJvdG90eXBlPXsKJDA6
-ZnVuY3Rpb24oKXt0aGlzLmIuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjB9ClAuaWgucHJvdG90eXBl
-PXsKYU06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEvPyIpLmEoYikKaWYo
-IXIuYilyLmEuWGYoYikKZWxzZXtzPXIuYQppZihxLkMoImI4PDE+IikuYihiKSlzLmNVKGIpCmVsc2Ug
-cy5YMihxLmMuYShiKSl9fSwKdzA6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihiPT1udWxsKWI9UC52MChh
-KQpzPXRoaXMuYQppZih0aGlzLmIpcy5aTChhLGIpCmVsc2Ugcy5OayhhLGIpfX0KUC5XTS5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLiQyKDAsYSl9LAokUzo1Mn0KUC5TWC5wcm90
-b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS4kMigxLG5ldyBILmJxKGEsdC5sLmEoYikpKX0s
-CiRDOiIkMiIsCiRSOjIsCiRTOjI0fQpQLkdzLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhp
-cy5hKEgudVAoYSksYil9LAokUzoyNn0KUC5GeS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVy
-biJJdGVyYXRpb25NYXJrZXIoIit0aGlzLmIrIiwgIitILkVqKHRoaXMuYSkrIikifX0KUC5HVi5wcm90
-b3R5cGU9ewpnbDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYwppZihzPT1udWxsKXJldHVybiB0aGlzLiR0
-aS5jLmEodGhpcy5iKQpyZXR1cm4gcy5nbCgpfSwKRjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixt
-PXRoaXMKZm9yKHM9bS4kdGkuQygiQW48MT4iKTshMDspe3I9bS5jCmlmKHIhPW51bGwpaWYoci5GKCkp
-cmV0dXJuITAKZWxzZSBtLnNYOShudWxsKQpxPWZ1bmN0aW9uKGEsYixjKXt2YXIgbCxrPWIKd2hpbGUo
-dHJ1ZSl0cnl7cmV0dXJuIGEoayxsKX1jYXRjaChqKXtsPWoKaz1jfX0obS5hLDAsMSkKaWYocSBpbnN0
-YW5jZW9mIFAuRnkpe3A9cS5iCmlmKHA9PT0yKXtvPW0uZAppZihvPT1udWxsfHxvLmxlbmd0aD09PTAp
-e20uc0VDKG51bGwpCnJldHVybiExfWlmKDA+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8sLTEpCm0uYT1v
-LnBvcCgpCmNvbnRpbnVlfWVsc2V7cj1xLmEKaWYocD09PTMpdGhyb3cgcgplbHNle249cy5hKEouSVQo
-cikpCmlmKG4gaW5zdGFuY2VvZiBQLkdWKXtyPW0uZAppZihyPT1udWxsKXI9bS5kPVtdCkMuTm0uaShy
-LG0uYSkKbS5hPW4uYQpjb250aW51ZX1lbHNle20uc1g5KG4pCmNvbnRpbnVlfX19fWVsc2V7bS5zRUMo
-cSkKcmV0dXJuITB9fXJldHVybiExfSwKc0VDOmZ1bmN0aW9uKGEpe3RoaXMuYj10aGlzLiR0aS5DKCIx
-PyIpLmEoYSl9LApzWDk6ZnVuY3Rpb24oYSl7dGhpcy5jPXRoaXMuJHRpLkMoIkFuPDE+PyIpLmEoYSl9
-LAokaUFuOjF9ClAucTQucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkdWKHRo
-aXMuYSgpLHRoaXMuJHRpLkMoIkdWPDE+IikpfX0KUC5QZi5wcm90b3R5cGU9ewp3MDpmdW5jdGlvbihh
-LGIpe3ZhciBzCkguY2IoYSwiZXJyb3IiLHQuSykKcz10aGlzLmEKaWYocy5hIT09MCl0aHJvdyBILmIo
-UC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCmlmKGI9PW51bGwpYj1QLnYwKGEpCnMuTmso
-YSxiKX0sCnBtOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnByb3RvdHlw
-ZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHMscj10aGlzLiR0aQpyLkMoIjEvPyIpLmEoYikKcz10aGlz
-LmEKaWYocy5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCnMu
-WGYoci5DKCIxLyIpLmEoYikpfX0KUC5GZS5wcm90b3R5cGU9ewpIUjpmdW5jdGlvbihhKXtpZigodGhp
-cy5jJjE1KSE9PTYpcmV0dXJuITAKcmV0dXJuIHRoaXMuYi5iLmJ2KHQuYWwuYSh0aGlzLmQpLGEuYSx0
-LnksdC5LKX0sCkt3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZSxyPXQueixxPXQuSyxwPXRoaXMuJHRp
-LkMoIjIvIiksbz10aGlzLmIuYgppZih0LmFnLmIocykpcmV0dXJuIHAuYShvLnJwKHMsYS5hLGEuYixy
-LHEsdC5sKSkKZWxzZSByZXR1cm4gcC5hKG8uYnYodC5iSS5hKHMpLGEuYSxyLHEpKX19ClAudnMucHJv
-dG90eXBlPXsKU3E6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwPXRoaXMuJHRpCnAuS3EoYykuQygi
-MS8oMikiKS5hKGEpCnM9JC5YMwppZihzIT09Qy5OVSl7Yy5DKCJAPDAvPiIpLktxKHAuYykuQygiMSgy
-KSIpLmEoYSkKaWYoYiE9bnVsbCliPVAuVkgoYixzKX1yPW5ldyBQLnZzKHMsYy5DKCJ2czwwPiIpKQpx
-PWI9PW51bGw/MTozCnRoaXMueGYobmV3IFAuRmUocixxLGEsYixwLkMoIkA8MT4iKS5LcShjKS5DKCJG
-ZTwxLDI+IikpKQpyZXR1cm4gcn0sClc3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU3EoYSxudWxs
-LGIpfSwKUWQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9dGhpcy4kdGkKci5LcShjKS5DKCIxLygyKSIp
-LmEoYSkKcz1uZXcgUC52cygkLlgzLGMuQygidnM8MD4iKSkKdGhpcy54ZihuZXcgUC5GZShzLDE5LGEs
-YixyLkMoIkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gc30sCnhmOmZ1bmN0aW9uKGEp
-e3ZhciBzLHI9dGhpcyxxPXIuYQppZihxPD0xKXthLmE9dC5GLmEoci5jKQpyLmM9YX1lbHNle2lmKHE9
-PT0yKXtzPXQuYy5hKHIuYykKcT1zLmEKaWYocTw0KXtzLnhmKGEpCnJldHVybn1yLmE9cQpyLmM9cy5j
-fVAuVGsobnVsbCxudWxsLHIuYix0Lk0uYShuZXcgUC5kYShyLGEpKSl9fSwKalE6ZnVuY3Rpb24oYSl7
-dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPXt9CmwuYT1hCmlmKGE9PW51bGwpcmV0dXJuCnM9bS5hCmlm
-KHM8PTEpe3I9dC5GLmEobS5jKQptLmM9YQppZihyIT1udWxsKXtxPWEuYQpmb3IocD1hO3EhPW51bGw7
-cD1xLHE9bylvPXEuYQpwLmE9cn19ZWxzZXtpZihzPT09Mil7bj10LmMuYShtLmMpCnM9bi5hCmlmKHM8
-NCl7bi5qUShhKQpyZXR1cm59bS5hPXMKbS5jPW4uY31sLmE9bS5OOChhKQpQLlRrKG51bGwsbnVsbCxt
-LmIsdC5NLmEobmV3IFAub1EobCxtKSkpfX0sCmFoOmZ1bmN0aW9uKCl7dmFyIHM9dC5GLmEodGhpcy5j
-KQp0aGlzLmM9bnVsbApyZXR1cm4gdGhpcy5OOChzKX0sCk44OmZ1bmN0aW9uKGEpe3ZhciBzLHIscQpm
-b3Iocz1hLHI9bnVsbDtzIT1udWxsO3I9cyxzPXEpe3E9cy5hCnMuYT1yfXJldHVybiByfSwKZWM6ZnVu
-Y3Rpb24oYSl7dmFyIHMscixxLHA9dGhpcwpwLmE9MQp0cnl7YS5TcShuZXcgUC5wVihwKSxuZXcgUC5V
-NyhwKSx0LlApfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKUC5yYihuZXcgUC52cihwLHMscikp
-fX0sClgyOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwpyLiR0aS5jLmEoYSkKcz1yLmFoKCkKci5hPTQK
-ci5jPWEKUC5IWihyLHMpfSwKWkw6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwp0LmwuYShiKQpz
-PXEuYWgoKQpyPVAuVGwoYSxiKQpxLmE9OApxLmM9cgpQLkhaKHEscyl9LApYZjpmdW5jdGlvbihhKXt2
-YXIgcz10aGlzLiR0aQpzLkMoIjEvIikuYShhKQppZihzLkMoImI4PDE+IikuYihhKSl7dGhpcy5jVShh
-KQpyZXR1cm59dGhpcy53VShzLmMuYShhKSl9LAp3VTpmdW5jdGlvbihhKXt2YXIgcz10aGlzCnMuJHRp
-LmMuYShhKQpzLmE9MQpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEobmV3IFAucnQocyxhKSkpfSwKY1U6
-ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPXMuJHRpCnIuQygiYjg8MT4iKS5hKGEpCmlmKHIuYihhKSl7
-aWYoYS5hPT09OCl7cy5hPTEKUC5UayhudWxsLG51bGwscy5iLHQuTS5hKG5ldyBQLktGKHMsYSkpKX1l
-bHNlIFAuQTkoYSxzKQpyZXR1cm59cy5lYyhhKX0sCk5rOmZ1bmN0aW9uKGEsYil7dGhpcy5hPTEKUC5U
-ayhudWxsLG51bGwsdGhpcy5iLHQuTS5hKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRh
-LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1Eu
-cHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMuYix0aGlzLmEuYSl9LAokUzowfQpQLnBW
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPXRoaXMuYQpwLmE9MAp0cnl7cC5Y
-MihwLiR0aS5jLmEoYSkpfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKcC5aTChzLHIpfX0sCiRT
-OjEwfQpQLlU3LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLlpMKGEsdC5sLmEoYikp
-fSwKJEM6IiQyIiwKJFI6MiwKJFM6Mjl9ClAudnIucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlz
-LmEuWkwodGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLnJ0LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
-dGhpcy5hLlgyKHRoaXMuYil9LAokUzowfQpQLktGLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5B
-OSh0aGlzLmIsdGhpcy5hKX0sCiRTOjB9ClAuWkwucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlz
-LmEuWkwodGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLlJULnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
-dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPW51bGwKdHJ5e3E9bS5hLmEKbD1xLmIuYi56eih0LmZPLmEo
-cS5kKSx0LnopfWNhdGNoKHApe3M9SC5SdShwKQpyPUgudHMocCkKaWYobS5jKXtxPXQubi5hKG0uYi5h
-LmMpLmEKbz1zCm89cT09bnVsbD9vPT1udWxsOnE9PT1vCnE9b31lbHNlIHE9ITEKbz1tLmEKaWYocSlv
-LmM9dC5uLmEobS5iLmEuYykKZWxzZSBvLmM9UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0
-YW5jZW9mIFAudnMmJmwuYT49NCl7aWYobC5hPT09OCl7cT1tLmEKcS5jPXQubi5hKGwuYykKcS5iPSEw
-fXJldHVybn1pZih0LmUuYihsKSl7bj1tLmIuYQpxPW0uYQpxLmM9bC5XNyhuZXcgUC5qWihuKSx0Lnop
-CnEuYj0hMX19LAokUzowfQpQLmpaLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmF9LAokUzozMn0KUC5ycS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixt
-LGwKdHJ5e3E9dGhpcy5hCnA9cS5hCm89cC4kdGkKbj1vLmMKbT1uLmEodGhpcy5iKQpxLmM9cC5iLmIu
-YnYoby5DKCIyLygxKSIpLmEocC5kKSxtLG8uQygiMi8iKSxuKX1jYXRjaChsKXtzPUguUnUobCkKcj1I
-LnRzKGwpCnE9dGhpcy5hCnEuYz1QLlRsKHMscikKcS5iPSEwfX0sCiRTOjB9ClAuUlcucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcwp0cnl7cz10Lm4uYShrLmEu
-YS5jKQpwPWsuYgppZihILm9UKHAuYS5IUihzKSkmJnAuYS5lIT1udWxsKXtwLmM9cC5hLkt3KHMpCnAu
-Yj0hMX19Y2F0Y2gobyl7cj1ILlJ1KG8pCnE9SC50cyhvKQpwPXQubi5hKGsuYS5hLmMpCm49cC5hCm09
-cgpsPWsuYgppZihuPT1udWxsP209PW51bGw6bj09PW0pbC5jPXAKZWxzZSBsLmM9UC5UbChyLHEpCmwu
-Yj0hMH19LAokUzowfQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9u
-KGEpe3ZhciBzLHIscT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgzLHQuZkopCnAuYT0wCnM9SC5MaChx
-KQpyPXMuQygifigxKT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5hKG5ldyBQLnVPKHAsbykpClcuSkUo
-cS5hLHEuYixyLCExLHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e0guTGgodGhpcy5iKS5jLmEoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgo
-dGhpcy5iKS5DKCJ+KDEpIil9fQpQLnVPLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHM9dGhp
-cy5iLHI9cy4kdGkscT1yLkMoIjEvIikuYSh0aGlzLmEuYSkscD1zLmFoKCkKci5jLmEocSkKcy5hPTQK
-cy5jPXEKUC5IWihzLHApfSwKJFM6MH0KUC5NTy5wcm90b3R5cGU9e30KUC5rVC5wcm90b3R5cGU9e30K
-UC54SS5wcm90b3R5cGU9e30KUC5Ddy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBILkVq
-KHRoaXMuYSl9LAokaVhTOjEsCmdJSTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9fQpQLm0wLnByb3Rv
-dHlwZT17JGlRbToxfQpQLnBLLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHM9SC5iKHRoaXMu
-YSkKcy5zdGFjaz1KLmoodGhpcy5iKQp0aHJvdyBzfSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSDpm
-dW5jdGlvbihhKXt2YXIgcyxyLHEscD1udWxsCnQuTS5hKGEpCnRyeXtpZihDLk5VPT09JC5YMyl7YS4k
-MCgpCnJldHVybn1QLlQ4KHAscCx0aGlzLGEsdC5IKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEp
-ClAuTDIocCxwLHRoaXMscyx0LmwuYShyKSl9fSwKRGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxw
-PW51bGwKYy5DKCJ+KDApIikuYShhKQpjLmEoYikKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQxKGIpCnJl
-dHVybn1QLnl2KHAscCx0aGlzLGEsYix0LkgsYyl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpQ
-LkwyKHAscCx0aGlzLHMsdC5sLmEocikpfX0sClJUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmhq
-KHRoaXMsYi5DKCIwKCkiKS5hKGEpLGIpfSwKdDg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlZwKHRo
-aXMsdC5NLmEoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMoIn4o
-MCkiKS5hKGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsfSwKeno6ZnVuY3Rpb24oYSxi
-KXtiLkMoIjAoKSIpLmEoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDAoKQpyZXR1cm4gUC5UOChu
-dWxsLG51bGwsdGhpcyxhLGIpfSwKYnY6ZnVuY3Rpb24oYSxiLGMsZCl7Yy5DKCJAPDA+IikuS3EoZCku
-QygiMSgyKSIpLmEoYSkKZC5hKGIpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQxKGIpCnJldHVybiBQ
-Lnl2KG51bGwsbnVsbCx0aGlzLGEsYixjLGQpfSwKcnA6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2QuQygi
-QDwwPiIpLktxKGUpLktxKGYpLkMoIjEoMiwzKSIpLmEoYSkKZS5hKGIpCmYuYShjKQppZigkLlgzPT09
-Qy5OVSlyZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGwsbnVsbCx0aGlzLGEsYixjLGQsZSxm
-KX0sCkxqOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiLkMoIkA8MD4iKS5LcShjKS5LcShkKS5DKCIx
-KDIsMykiKS5hKGEpfX0KUC5oai5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEu
-enoodGhpcy5iLHRoaXMuYyl9LAokUzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuQygiMCgpIil9fQpQ
-LlZwLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5iSCh0aGlzLmIpfSwKJFM6
-MH0KUC5PUi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmMKcmV0dXJuIHRoaXMu
-YS5EbCh0aGlzLmIscy5hKGEpLHMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLkMoIn4oMCki
-KX19ClAuYjYucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPW5ldyBQLmxtKHMs
-cy5yLEguTGgocykuQygibG08MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCmdBOmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLmF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYT09PTB9LApnb3I6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMuYSE9PTB9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYodHlwZW9m
-IGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3M9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuITEK
-cmV0dXJuIHQubS5hKHNbYl0pIT1udWxsfWVsc2V7cj10aGlzLlBSKGIpCnJldHVybiByfX0sClBSOmZ1
-bmN0aW9uKGEpe3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLlIoc1t0
-aGlzLk4oYSldLGEpPj0wfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT10aGlzCkguTGgocSkuYy5h
-KGIpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXtzPXEuYgpyZXR1cm4gcS5T
-KHM9PW51bGw/cS5iPVAuVDIoKTpzLGIpfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYxMDcz
-NzQxODIzKT09PWIpe3I9cS5jCnJldHVybiBxLlMocj09bnVsbD9xLmM9UC5UMigpOnIsYil9ZWxzZSBy
-ZXR1cm4gcS5HKGIpfSwKRzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlzCkguTGgocCkuYy5hKGEp
-CnM9cC5kCmlmKHM9PW51bGwpcz1wLmQ9UC5UMigpCnI9cC5OKGEpCnE9c1tyXQppZihxPT1udWxsKXNb
-cl09W3AuSChhKV0KZWxzZXtpZihwLlIocSxhKT49MClyZXR1cm4hMQpxLnB1c2gocC5IKGEpKX1yZXR1
-cm4hMH0sCm46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9
-PSJfX3Byb3RvX18iKXJldHVybiBzLkg0KHMuYixiKQplbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYm
-KGImMTA3Mzc0MTgyMyk9PT1iKXJldHVybiBzLkg0KHMuYyxiKQplbHNlIHJldHVybiBzLnFnKGIpfSwK
-cWc6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz10aGlzLG49by5kCmlmKG49PW51bGwpcmV0dXJuITEK
-cz1vLk4oYSkKcj1uW3NdCnE9by5SKHIsYSkKaWYocTwwKXJldHVybiExCnA9ci5zcGxpY2UocSwxKVsw
-XQppZigwPT09ci5sZW5ndGgpZGVsZXRlIG5bc10Kby5HUyhwKQpyZXR1cm4hMH0sClM6ZnVuY3Rpb24o
-YSxiKXtILkxoKHRoaXMpLmMuYShiKQppZih0Lm0uYShhW2JdKSE9bnVsbClyZXR1cm4hMQphW2JdPXRo
-aXMuSChiKQpyZXR1cm4hMH0sCkg0OmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4h
-MQpzPXQubS5hKGFbYl0pCmlmKHM9PW51bGwpcmV0dXJuITEKdGhpcy5HUyhzKQpkZWxldGUgYVtiXQpy
-ZXR1cm4hMH0sCkdZOmZ1bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjEwNzM3NDE4MjN9LApIOmZ1bmN0
-aW9uKGEpe3ZhciBzLHI9dGhpcyxxPW5ldyBQLmJuKEguTGgocikuYy5hKGEpKQppZihyLmU9PW51bGwp
-ci5lPXIuZj1xCmVsc2V7cz1yLmYKcy50b1N0cmluZwpxLmM9cwpyLmY9cy5iPXF9KytyLmEKci5HWSgp
-CnJldHVybiBxfSwKR1M6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPWEuYyxxPWEuYgppZihyPT1udWxs
-KXMuZT1xCmVsc2Ugci5iPXEKaWYocT09bnVsbClzLmY9cgplbHNlIHEuYz1yOy0tcy5hCnMuR1koKX0s
-Ck46ZnVuY3Rpb24oYSl7cmV0dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sClI6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYoSi5S
-TShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9fQpQLmJuLnByb3RvdHlwZT17fQpQLmxtLnByb3Rv
-dHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlz
-LHI9cy5jLHE9cy5hCmlmKHMuYiE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKZWxzZSBpZihyPT1udWxs
-KXtzLnNqKG51bGwpCnJldHVybiExfWVsc2V7cy5zaihzLiR0aS5DKCIxPyIpLmEoci5hKSkKcy5jPXIu
-YgpyZXR1cm4hMH19LApzajpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwK
-JGlBbjoxfQpQLm1XLnByb3RvdHlwZT17fQpQLnV5LnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXpN
-OjF9ClAubEQucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmE3KGEsdGhpcy5n
-QShhKSxILnooYSkuQygiYTc8bEQuRT4iKSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucShh
-LGIpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC56KGEpLkMoIn4obEQuRSkiKS5hKGIpCnM9dGhp
-cy5nQShhKQpmb3Iocj0wO3I8czsrK3Ipe2IuJDEodGhpcy5xKGEscikpCmlmKHMhPT10aGlzLmdBKGEp
-KXRocm93IEguYihQLmE0KGEpKX19LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EoYSk9PT0w
-fSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdsMChhKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgcz1ILnooYSkKcmV0dXJuIG5ldyBILmxKKGEscy5LcShjKS5DKCIxKGxELkUpIikuYShiKSxzLkMo
-IkA8bEQuRT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5x
-QyhhLGIsbnVsbCxILnooYSkuQygibEQuRSIpKX0sCmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBI
-LmpWKGEsSC56KGEpLkMoIkA8bEQuRT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZHU6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHMKSC56KGEpLkMoImxELkU/IikuYShkKQpQLmpCKGIsYyx0aGlzLmdBKGEpKQpm
-b3Iocz1iO3M8YzsrK3MpdGhpcy5ZNShhLHMsZCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKGEs
-IlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEs
-Yil7dmFyIHMscj10aGlzLmEKaWYoIXIuYSl0aGlzLmIuYSs9IiwgIgpyLmE9ITEKcj10aGlzLmIKcz1y
-LmErPUguRWooYSkKci5hPXMrIjogIgpyLmErPUguRWooYil9LAokUzoxMX0KUC5Zay5wcm90b3R5cGU9
-ewpLOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILkxoKHRoaXMpLkMoIn4oWWsuSyxZay5WKSIpLmEoYikK
-Zm9yKHM9Si5JVCh0aGlzLmd2YygpKTtzLkYoKTspe3I9cy5nbCgpCmIuJDIocix0aGlzLnEoMCxyKSl9
-fSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ3ZjKCksbmV3IFAueVEodGhpcyksSC5M
-aCh0aGlzKS5DKCJOMzxZay5LLFlrLlY+IikpfSwKeDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEouemwodGhp
-cy5ndmMoKSxhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuZ3ZjKCkpfSwKZ2wwOmZ1
-bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuZ3ZjKCkpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5u
-Tyh0aGlzKX0sCiRpWjA6MX0KUC55US5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz10aGlz
-LmEscj1ILkxoKHMpCnIuQygiWWsuSyIpLmEoYSkKcmV0dXJuIG5ldyBQLk4zKGEscy5xKDAsYSksci5D
-KCJAPFlrLks+IikuS3Eoci5DKCJZay5WIikpLkMoIk4zPDEsMj4iKSl9LAokUzpmdW5jdGlvbigpe3Jl
-dHVybiBILkxoKHRoaXMuYSkuQygiTjM8WWsuSyxZay5WPihZay5LKSIpfX0KUC5LUC5wcm90b3R5cGU9
-ewpZNTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQp0
-aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIikpfX0KUC5Qbi5wcm90
-b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9LApZNTpmdW5jdGlvbihh
-LGIsYyl7dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWTUoMCxzLmMuYShiKSxzLlFbMV0uYShjKSl9LAp4
-NDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLng0KGEpfSwKSzpmdW5jdGlvbihhLGIpe3RoaXMuYS5L
-KDAsSC5MaCh0aGlzKS5DKCJ+KDEsMikiKS5hKGIpKX0sCmdsMDpmdW5jdGlvbihhKXt2YXIgcz10aGlz
-LmEKcmV0dXJuIHMuZ2wwKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzLmdB
-KHMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuYSl9LApnUHU6ZnVuY3Rpb24oYSl7dmFy
-IHM9dGhpcy5hCnJldHVybiBzLmdQdShzKX0sCiRpWjA6MX0KUC5Hai5wcm90b3R5cGU9e30KUC5sZi5w
-cm90b3R5cGU9ewpnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ29yOmZ1
-bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpIT09MH0sCkZWOmZ1bmN0aW9uKGEsYil7dmFyIHMK
-Zm9yKHM9Si5JVChILkxoKHRoaXMpLkMoImNYPGxmLkU+IikuYShiKSk7cy5GKCk7KXRoaXMuaSgwLHMu
-Z2woKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKHRoaXMsInsiLCJ9Iil9LAprOmZ1bmN0aW9u
-KGEsYil7dmFyIHMscj10aGlzLmdtKHRoaXMpCmlmKCFyLkYoKSlyZXR1cm4iIgppZihiPT09IiIpe3M9
-IiIKZG8gcys9SC5FaihyLmQpCndoaWxlKHIuRigpKX1lbHNle3M9SC5FaihyLmQpCmZvcig7ci5GKCk7
-KXM9cytiK0guRWooci5kKX1yZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmVSOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygibGYuRSIpKX0sCkU6ZnVuY3Rpb24o
-YSxiKXt2YXIgcyxyLHEscD0iaW5kZXgiCkguY2IoYixwLHQuUykKUC5rMShiLHApCmZvcihzPXRoaXMu
-Z20odGhpcykscj0wO3MuRigpOyl7cT1zLmQKaWYoYj09PXIpcmV0dXJuIHE7KytyfXRocm93IEguYihQ
-LkNmKGIsdGhpcyxwLG51bGwscikpfX0KUC5Wai5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl4dTox
-fQpQLlh2LnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAublkucHJvdG90eXBlPXt9ClAu
-V1kucHJvdG90eXBlPXt9ClAuUlUucHJvdG90eXBlPXt9ClAucFIucHJvdG90eXBlPXt9ClAudXcucHJv
-dG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5iCmlmKHI9PW51bGwpcmV0dXJuIHRo
-aXMuYy5xKDAsYikKZWxzZSBpZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIG51bGwKZWxzZXtzPXJb
-Yl0KcmV0dXJuIHR5cGVvZiBzPT0idW5kZWZpbmVkIj90aGlzLmZiKGIpOnN9fSwKZ0E6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYj09bnVsbD90aGlzLmMuYTp0aGlzLkNmKCkubGVuZ3RofSwKZ2wwOmZ1bmN0
-aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCmd2YzpmdW5jdGlvbigpe2lmKHRoaXMuYj09
-bnVsbCl7dmFyIHM9dGhpcy5jCnJldHVybiBuZXcgSC5pNShzLEguTGgocykuQygiaTU8MT4iKSl9cmV0
-dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscT10aGlzCmlmKHEu
-Yj09bnVsbClxLmMuWTUoMCxiLGMpCmVsc2UgaWYocS54NChiKSl7cz1xLmIKc1tiXT1jCnI9cS5hCmlm
-KHI9PW51bGw/cyE9bnVsbDpyIT09cylyW2JdPW51bGx9ZWxzZSBxLlhLKCkuWTUoMCxiLGMpfSwKeDQ6
-ZnVuY3Rpb24oYSl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlzLmMueDQoYSkKcmV0dXJuIE9iamVj
-dC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSl9LApLOmZ1bmN0aW9uKGEsYil7
-dmFyIHMscixxLHAsbz10aGlzCnQuY0EuYShiKQppZihvLmI9PW51bGwpcmV0dXJuIG8uYy5LKDAsYikK
-cz1vLkNmKCkKZm9yKHI9MDtyPHMubGVuZ3RoOysrcil7cT1zW3JdCnA9by5iW3FdCmlmKHR5cGVvZiBw
-PT0idW5kZWZpbmVkIil7cD1QLlFlKG8uYVtxXSkKby5iW3FdPXB9Yi4kMihxLHApCmlmKHMhPT1vLmMp
-dGhyb3cgSC5iKFAuYTQobykpfX0sCkNmOmZ1bmN0aW9uKCl7dmFyIHM9dC5iTS5hKHRoaXMuYykKaWYo
-cz09bnVsbClzPXRoaXMuYz1ILlZNKE9iamVjdC5rZXlzKHRoaXMuYSksdC5zKQpyZXR1cm4gc30sClhL
-OmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuPXRoaXMKaWYobi5iPT1udWxsKXJldHVybiBuLmMKcz1Q
-LkZsKHQuTix0LnopCnI9bi5DZigpCmZvcihxPTA7cD1yLmxlbmd0aCxxPHA7KytxKXtvPXJbcV0Kcy5Z
-NSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShyLCIiKQplbHNlIEMuTm0uc0EociwwKQpuLmE9
-bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmI6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIU9iamVjdC5wcm90
-b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJuIG51bGwKcz1QLlFlKHRoaXMu
-YVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2
-YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5hCmlm
-KHMuYj09bnVsbClzPXMuZ3ZjKCkuRSgwLGIpCmVsc2V7cz1zLkNmKCkKaWYoYjwwfHxiPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLGIpCnM9c1tiXX1yZXR1cm4gc30sCmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRo
-aXMuYQppZihzLmI9PW51bGwpe3M9cy5ndmMoKQpzPXMuZ20ocyl9ZWxzZXtzPXMuQ2YoKQpzPW5ldyBK
-Lm0xKHMscy5sZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX1yZXR1cm4gc30sCnRnOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIHRoaXMuYS54NChiKX19ClAueHIucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIg
-cyxyCnRyeXtzPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHN9Y2F0
-Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0sCiRTOjEyfQpQLk56LnByb3RvdHlwZT17CiQwOmZ1bmN0
-aW9uKCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7ZmF0YWw6ZmFsc2V9KQpy
-ZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxsfSwKJFM6MTJ9ClAuQ1YucHJvdG90eXBl
-PXsKeXI6ZnVuY3Rpb24oYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxk
-LGMsYixhPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgphMj1QLmpCKGExLGEyLGEwLmxl
-bmd0aCkKcz0kLlY3KCkKZm9yKHI9YTEscT1yLHA9bnVsbCxvPS0xLG49LTEsbT0wO3I8YTI7cj1sKXts
-PXIrMQprPUMueEIuVyhhMCxyKQppZihrPT09Mzcpe2o9bCsyCmlmKGo8PWEyKXtpPUgub28oQy54Qi5X
-KGEwLGwpKQpoPUgub28oQy54Qi5XKGEwLGwrMSkpCmc9aSoxNitoLShoJjI1NikKaWYoZz09PTM3KWc9
-LTEKbD1qfWVsc2UgZz0tMX1lbHNlIGc9awppZigwPD1nJiZnPD0xMjcpe2lmKGc8MHx8Zz49cy5sZW5n
-dGgpcmV0dXJuIEguT0gocyxnKQpmPXNbZ10KaWYoZj49MCl7Zz1DLnhCLk8yKCJBQkNERUZHSElKS0xN
-Tk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixmKQppZihn
-PT09ayljb250aW51ZQprPWd9ZWxzZXtpZihmPT09LTEpe2lmKG88MCl7ZT1wPT1udWxsP251bGw6cC5h
-Lmxlbmd0aAppZihlPT1udWxsKWU9MApvPWUrKHItcSkKbj1yfSsrbQppZihrPT09NjEpY29udGludWV9
-az1nfWlmKGYhPT0tMil7aWYocD09bnVsbCl7cD1uZXcgUC5SbigiIikKZT1wfWVsc2UgZT1wCmUuYSs9
-Qy54Qi5OaihhMCxxLHIpCmUuYSs9SC5MdyhrKQpxPWwKY29udGludWV9fXRocm93IEguYihQLnJyKCJJ
-bnZhbGlkIGJhc2U2NCBkYXRhIixhMCxyKSl9aWYocCE9bnVsbCl7ZT1wLmErPUMueEIuTmooYTAscSxh
-MikKZD1lLmxlbmd0aAppZihvPj0wKVAueE0oYTAsbixhMixvLG0sZCkKZWxzZXtjPUMuam4uelkoZC0x
-LDQpKzEKaWYoYz09PTEpdGhyb3cgSC5iKFAucnIoYSxhMCxhMikpCmZvcig7Yzw0Oyl7ZSs9Ij0iCnAu
-YT1lOysrY319ZT1wLmEKcmV0dXJuIEMueEIuaTcoYTAsYTEsYTIsZS5jaGFyQ29kZUF0KDApPT0wP2U6
-ZSl9Yj1hMi1hMQppZihvPj0wKVAueE0oYTAsbixhMixvLG0sYikKZWxzZXtjPUMuam4uelkoYiw0KQpp
-ZihjPT09MSl0aHJvdyBILmIoUC5ycihhLGEwLGEyKSkKaWYoYz4xKWEwPUMueEIuaTcoYTAsYTIsYTIs
-Yz09PTI/Ij09IjoiPSIpfXJldHVybiBhMH19ClAuVTgucHJvdG90eXBlPXt9ClAuVWsucHJvdG90eXBl
-PXt9ClAud0kucHJvdG90eXBlPXt9ClAuWmkucHJvdG90eXBlPXt9ClAuVWQucHJvdG90eXBlPXsKdzpm
-dW5jdGlvbihhKXt2YXIgcz1QLnAodGhpcy5hKQpyZXR1cm4odGhpcy5iIT1udWxsPyJDb252ZXJ0aW5n
-IG9iamVjdCB0byBhbiBlbmNvZGFibGUgb2JqZWN0IGZhaWxlZDoiOiJDb252ZXJ0aW5nIG9iamVjdCBk
-aWQgbm90IHJldHVybiBhbiBlbmNvZGFibGUgb2JqZWN0OiIpKyIgIitzfX0KUC5LOC5wcm90b3R5cGU9
-ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJDeWNsaWMgZXJyb3IgaW4gSlNPTiBzdHJpbmdpZnkifX0KUC5i
-eS5wcm90b3R5cGU9ewpwVzpmdW5jdGlvbihhLGIsYyl7dmFyIHMKdC5mVi5hKGMpCnM9UC5CUyhiLHRo
-aXMuZ0hlKCkuYSkKcmV0dXJuIHN9LApPQjpmdW5jdGlvbihhLGIpe3ZhciBzCnQuZEEuYShiKQpzPVAu
-dVgoYSx0aGlzLmdaRSgpLmIsbnVsbCkKcmV0dXJuIHN9LApnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5u
-WH0sCmdIZTpmdW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5vai5wcm90b3R5cGU9e30KUC5NeC5wcm90
-b3R5cGU9e30KUC5TaC5wcm90b3R5cGU9ewp2cDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxs
-PWEubGVuZ3RoCmZvcihzPUouclkoYSkscj10aGlzLmMscT0wLHA9MDtwPGw7KytwKXtvPXMuVyhhLHAp
-CmlmKG8+OTIpe2lmKG8+PTU1Mjk2KXtuPW8mNjQ1MTIKaWYobj09PTU1Mjk2KXttPXArMQptPSEobTxs
-JiYoQy54Qi5XKGEsbSkmNjQ1MTIpPT09NTYzMjApfWVsc2UgbT0hMQppZighbSlpZihuPT09NTYzMjAp
-e249cC0xCm49IShuPj0wJiYoQy54Qi5PMihhLG4pJjY0NTEyKT09PTU1Mjk2KX1lbHNlIG49ITEKZWxz
-ZSBuPSEwCmlmKG4pe2lmKHA+cSlyLmErPUMueEIuTmooYSxxLHApCnE9cCsxCnIuYSs9SC5Mdyg5MikK
-ci5hKz1ILkx3KDExNykKci5hKz1ILkx3KDEwMCkKbj1vPj4+OCYxNQpyLmErPUguTHcobjwxMD80OCtu
-Ojg3K24pCm49bz4+PjQmMTUKci5hKz1ILkx3KG48MTA/NDgrbjo4NytuKQpuPW8mMTUKci5hKz1ILkx3
-KG48MTA/NDgrbjo4NytuKX19Y29udGludWV9aWYobzwzMil7aWYocD5xKXIuYSs9Qy54Qi5OaihhLHEs
-cCkKcT1wKzEKci5hKz1ILkx3KDkyKQpzd2l0Y2gobyl7Y2FzZSA4OnIuYSs9SC5Mdyg5OCkKYnJlYWsK
-Y2FzZSA5OnIuYSs9SC5MdygxMTYpCmJyZWFrCmNhc2UgMTA6ci5hKz1ILkx3KDExMCkKYnJlYWsKY2Fz
-ZSAxMjpyLmErPUguTHcoMTAyKQpicmVhawpjYXNlIDEzOnIuYSs9SC5MdygxMTQpCmJyZWFrCmRlZmF1
-bHQ6ci5hKz1ILkx3KDExNykKci5hKz1ILkx3KDQ4KQpyLmErPUguTHcoNDgpCm49bz4+PjQmMTUKci5h
-Kz1ILkx3KG48MTA/NDgrbjo4NytuKQpuPW8mMTUKci5hKz1ILkx3KG48MTA/NDgrbjo4NytuKQpicmVh
-a319ZWxzZSBpZihvPT09MzR8fG89PT05Mil7aWYocD5xKXIuYSs9Qy54Qi5OaihhLHEscCkKcT1wKzEK
-ci5hKz1ILkx3KDkyKQpyLmErPUguTHcobyl9fWlmKHE9PT0wKXIuYSs9SC5FaihhKQplbHNlIGlmKHE8
-bClyLmErPXMuTmooYSxxLGwpfSwKSm46ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKZm9yKHM9dGhpcy5h
-LHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9c1txXQppZihhPT1udWxsP3A9PW51bGw6YT09PXApdGhy
-b3cgSC5iKG5ldyBQLks4KGEsbnVsbCkpfUMuTm0uaShzLGEpfSwKaVU6ZnVuY3Rpb24oYSl7dmFyIHMs
-cixxLHAsbz10aGlzCmlmKG8udE0oYSkpcmV0dXJuCm8uSm4oYSkKdHJ5e3M9by5iLiQxKGEpCmlmKCFv
-LnRNKHMpKXtxPVAuR3koYSxudWxsLG8uZ1ZLKCkpCnRocm93IEguYihxKX1xPW8uYQppZigwPj1xLmxl
-bmd0aClyZXR1cm4gSC5PSChxLC0xKQpxLnBvcCgpfWNhdGNoKHApe3I9SC5SdShwKQpxPVAuR3koYSxy
-LG8uZ1ZLKCkpCnRocm93IEguYihxKX19LAp0TTpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcwppZih0
-eXBlb2YgYT09Im51bWJlciIpe2lmKCFpc0Zpbml0ZShhKSlyZXR1cm4hMQpxLmMuYSs9Qy5DRC53KGEp
-CnJldHVybiEwfWVsc2UgaWYoYT09PSEwKXtxLmMuYSs9InRydWUiCnJldHVybiEwfWVsc2UgaWYoYT09
-PSExKXtxLmMuYSs9ImZhbHNlIgpyZXR1cm4hMH1lbHNlIGlmKGE9PW51bGwpe3EuYy5hKz0ibnVsbCIK
-cmV0dXJuITB9ZWxzZSBpZih0eXBlb2YgYT09InN0cmluZyIpe3M9cS5jCnMuYSs9JyInCnEudnAoYSkK
-cy5hKz0nIicKcmV0dXJuITB9ZWxzZSBpZih0LmouYihhKSl7cS5KbihhKQpxLmxLKGEpCnM9cS5hCmlm
-KDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcmV0dXJuITB9ZWxzZSBpZih0LmYu
-YihhKSl7cS5KbihhKQpyPXEuancoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywt
-MSkKcy5wb3AoKQpyZXR1cm4gcn1lbHNlIHJldHVybiExfSwKbEs6ZnVuY3Rpb24oYSl7dmFyIHMscixx
-PXRoaXMuYwpxLmErPSJbIgpzPUouVTYoYSkKaWYocy5nb3IoYSkpe3RoaXMuaVUocy5xKGEsMCkpCmZv
-cihyPTE7cjxzLmdBKGEpOysrcil7cS5hKz0iLCIKdGhpcy5pVShzLnEoYSxyKSl9fXEuYSs9Il0ifSwK
-anc6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPXt9CmlmKGEuZ2wwKGEpKXttLmMu
-YSs9Int9IgpyZXR1cm4hMH1zPWEuZ0EoYSkqMgpyPVAuTzgocyxudWxsLCExLHQuVykKcT1sLmE9MAps
-LmI9ITAKYS5LKDAsbmV3IFAudGkobCxyKSkKaWYoIWwuYilyZXR1cm4hMQpwPW0uYwpwLmErPSJ7Igpm
-b3Iobz0nIic7cTxzO3ErPTIsbz0nLCInKXtwLmErPW8KbS52cChILmgocltxXSkpCnAuYSs9JyI6Jwpu
-PXErMQppZihuPj1zKXJldHVybiBILk9IKHIsbikKbS5pVShyW25dKX1wLmErPSJ9IgpyZXR1cm4hMH19
-ClAudGkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKHR5cGVvZiBhIT0ic3Ry
-aW5nIil0aGlzLmEuYj0hMQpzPXRoaXMuYgpyPXRoaXMuYQpDLk5tLlk1KHMsci5hKyssYSkKQy5ObS5Z
-NShzLHIuYSsrLGIpfSwKJFM6MTF9ClAudHUucHJvdG90eXBlPXsKZ1ZLOmZ1bmN0aW9uKCl7dmFyIHM9
-dGhpcy5jLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fQpQLnU1LnByb3RvdHlwZT17Cmda
-RTpmdW5jdGlvbigpe3JldHVybiBDLlFrfX0KUC5FMy5wcm90b3R5cGU9ewpXSjpmdW5jdGlvbihhKXt2
-YXIgcyxyLHEscD1QLmpCKDAsbnVsbCxhLmxlbmd0aCksbz1wLTAKaWYobz09PTApcmV0dXJuIG5ldyBV
-aW50OEFycmF5KDApCnM9byozCnI9bmV3IFVpbnQ4QXJyYXkocykKcT1uZXcgUC5SdyhyKQppZihxLkd4
-KGEsMCxwKSE9PXApe0ouYTYoYSxwLTEpCnEuUk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoci5zdWJh
-cnJheSgwLEguck0oMCxxLmIscykpKX19ClAuUncucHJvdG90eXBlPXsKUk86ZnVuY3Rpb24oKXt2YXIg
-cz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXErMSxvPXIubGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0go
-cixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTkxCnMu
-Yj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MTg5fSwKTzY6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2NDUxMik9PT01NjMyMCl7cz02NTUzNisoKGEmMTAyMyk8
-PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1uLmI9cSsxCm89ci5sZW5ndGgKaWYocT49bylyZXR1cm4g
-SC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApxPW4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHAp
-CnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09
-cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09cyY2M3wxMjgK
-cmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJuITF9fSwKR3g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIs
-cSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYmKEMueEIuTzIoYSxjLTEpJjY0NTEyKT09PTU1Mjk2KS0t
-Ywpmb3Iocz1sLmMscj1zLmxlbmd0aCxxPWI7cTxjOysrcSl7cD1DLnhCLlcoYSxxKQppZihwPD0xMjcp
-e289bC5iCmlmKG8+PXIpYnJlYWsKbC5iPW8rMQpzW29dPXB9ZWxzZXtvPXAmNjQ1MTIKaWYobz09PTU1
-Mjk2KXtpZihsLmIrND5yKWJyZWFrCm49cSsxCmlmKGwuTzYocCxDLnhCLlcoYSxuKSkpcT1ufWVsc2Ug
-aWYobz09PTU2MzIwKXtpZihsLmIrMz5yKWJyZWFrCmwuUk8oKX1lbHNlIGlmKHA8PTIwNDcpe289bC5i
-Cm09bysxCmlmKG0+PXIpYnJlYWsKbC5iPW0KaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+
-PjZ8MTkyCmwuYj1tKzEKc1ttXT1wJjYzfDEyOH1lbHNle289bC5iCmlmKG8rMj49cilicmVhawptPWwu
-Yj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjEyfDIyNApvPWwuYj1tKzEKaWYo
-bT49cilyZXR1cm4gSC5PSChzLG0pCnNbbV09cD4+PjYmNjN8MTI4CmwuYj1vKzEKaWYobz49cilyZXR1
-cm4gSC5PSChzLG8pCnNbb109cCY2M3wxMjh9fX1yZXR1cm4gcX19ClAuR1kucHJvdG90eXBlPXsKV0o6
-ZnVuY3Rpb24oYSl7dmFyIHMscgp0LkwuYShhKQpzPXRoaXMuYQpyPVAua3kocyxhLDAsbnVsbCkKaWYo
-ciE9bnVsbClyZXR1cm4gcgpyZXR1cm4gbmV3IFAuYnoocykuTmUoYSwwLG51bGwsITApfX0KUC5iei5w
-cm90b3R5cGU9ewpOZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG49dGhpcwp0LkwuYShh
-KQpzPVAuakIoYixjLEouSG0oYSkpCmlmKGI9PT1zKXJldHVybiIiCnI9UC5qeShhLGIscykKcT1uLmhP
-KHIsMCxzLWIsITApCnA9bi5iCmlmKChwJjEpIT09MCl7bz1QLmo0KHApCm4uYj0wCnRocm93IEguYihQ
-LnJyKG8sYSxiK24uYykpfXJldHVybiBxfSwKaE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxPXRo
-aXMKaWYoYy1iPjEwMDApe3M9Qy5qbi5CVShiK2MsMikKcj1xLmhPKGEsYixzLCExKQppZigocS5iJjEp
-IT09MClyZXR1cm4gcgpyZXR1cm4gcitxLmhPKGEscyxjLGQpfXJldHVybiBxLkVoKGEsYixjLGQpfSwK
-RWg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMsaj02NTUzMyxpPWsu
-YixoPWsuYyxnPW5ldyBQLlJuKCIiKSxmPWIrMSxlPWEubGVuZ3RoCmlmKGI8MHx8Yj49ZSlyZXR1cm4g
-SC5PSChhLGIpCnM9YVtiXQokbGFiZWwwJDA6Zm9yKHI9ay5hOyEwOyl7Zm9yKDshMDtmPW8pe3E9Qy54
-Qi5XKCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+fX0KSC5QcS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0
+aCkKcmV0dXJuIGFbYl19fQpILmVFLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
+bmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVti
+XX19CkguVjYucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5j
+dGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwKJGlWNjoxLAok
+aW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAucHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9
+CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90eXBlPXsKQzpmdW5jdGlvbihhKXtyZXR1cm4gSC5j
+RSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3E6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudjUodi50eXBl
+VW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5cGU9e30KSC5sWS5wcm90b3R5cGU9ewp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBILmRtKHRoaXMuYSxudWxsKX19Ckgua1MucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy5hfX0KSC5pTS5wcm90b3R5cGU9e30KUC50aC5wcm90b3R5cGU9ewokMTpm
+dW5jdGlvbihhKXt2YXIgcz10aGlzLmEscj1zLmEKcy5hPW51bGwKci4kMCgpfSwKJFM6MTB9ClAuaGEu
+cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscgp0aGlzLmEuYT10Lk0uYShhKQpzPXRoaXMu
+YgpyPXRoaXMuYwpzLmZpcnN0Q2hpbGQ/cy5yZW1vdmVDaGlsZChyKTpzLmFwcGVuZENoaWxkKHIpfSwK
+JFM6MzR9ClAuVnMucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIs
+CiRSOjAsCiRTOjJ9ClAuRnQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRD
+OiIkMCIsCiRSOjAsCiRTOjJ9ClAuVzMucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiKXtpZihzZWxm
+LnNldFRpbWVvdXQhPW51bGwpc2VsZi5zZXRUaW1lb3V0KEgudFIobmV3IFAueUgodGhpcyxiKSwwKSxh
+KQplbHNlIHRocm93IEguYihQLkw0KCJgc2V0VGltZW91dCgpYCBub3QgZm91bmQuIikpfX0KUC55SC5w
+cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0K
+UC5paC5wcm90b3R5cGU9ewphTTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcyxxPXIuJHRpCnEuQygi
+MS8/IikuYShiKQppZighci5iKXIuYS5YZihiKQplbHNle3M9ci5hCmlmKHEuQygiYjg8MT4iKS5iKGIp
+KXMuY1UoYikKZWxzZSBzLlgyKHEuYy5hKGIpKX19LAp3MDpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGI9
+PW51bGwpYj1QLnYwKGEpCnM9dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikKZWxzZSBzLk5rKGEsYil9
+fQpQLldNLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuJDIoMCxhKX0sCiRT
+OjUyfQpQLlNYLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLiQyKDEsbmV3IEguYnEo
+YSx0LmwuYShiKSkpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MjR9ClAuR3MucHJvdG90eXBlPXsKJDI6ZnVu
+Y3Rpb24oYSxiKXt0aGlzLmEoSC51UChhKSxiKX0sCiRTOjI2fQpQLkZ5LnByb3RvdHlwZT17Cnc6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIkl0ZXJhdGlvbk1hcmtlcigiK3RoaXMuYisiLCAiK0guRWoodGhpcy5hKSsi
+KSJ9fQpQLkdWLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5jCmlmKHM9PW51bGwp
+cmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApGOmZ1bmN0aW9uKCl7dmFy
+IHMscixxLHAsbyxuLG09dGhpcwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1tLmMKaWYociE9
+bnVsbClpZihyLkYoKSlyZXR1cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBsLGs9Ygp3aGlsZSh0cnVlKXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agprPWN9fShtLmEs
+MCwxKQppZihxIGluc3RhbmNlb2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlmKG89PW51bGx8
+fG8ubGVuZ3RoPT09MCl7bS5zRUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgpcmV0dXJuIEgu
+T0gobywtMSkKbS5hPW8ucG9wKCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0aHJvdyByCmVs
+c2V7bj1zLmEoSi5JVChyKSkKaWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9PW51bGwpcj1t
+LmQ9W10KQy5ObS5pKHIsbS5hKQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikKY29udGludWV9
+fX19ZWxzZXttLnNFQyhxKQpyZXR1cm4hMH19cmV0dXJuITF9LApzRUM6ZnVuY3Rpb24oYSl7dGhpcy5i
+PXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCnNYOTpmdW5jdGlvbihhKXt0aGlzLmM9dGhpcy4kdGkuQygi
+QW48MT4/IikuYShhKX0sCiRpQW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFAuR1YodGhpcy5hKCksdGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLkN3LnByb3RvdHlwZT17
+Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguRWoodGhpcy5hKX0sCiRpWFM6MSwKZ0lJOmZ1bmN0aW9uKCl7
+cmV0dXJuIHRoaXMuYn19ClAuUGYucHJvdG90eXBlPXsKdzA6ZnVuY3Rpb24oYSxiKXt2YXIgcwpILmNi
+KGEsImVycm9yIix0LkspCnM9dGhpcy5hCmlmKHMuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBh
+bHJlYWR5IGNvbXBsZXRlZCIpKQppZihiPT1udWxsKWI9UC52MChhKQpzLk5rKGEsYil9LApwbTpmdW5j
+dGlvbihhKXtyZXR1cm4gdGhpcy53MChhLG51bGwpfX0KUC5aZi5wcm90b3R5cGU9ewphTTpmdW5jdGlv
+bihhLGIpe3ZhciBzLHI9dGhpcy4kdGkKci5DKCIxLz8iKS5hKGIpCnM9dGhpcy5hCmlmKHMuYSE9PTAp
+dGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQpzLlhmKHIuQygiMS8iKS5h
+KGIpKX19ClAuRmUucHJvdG90eXBlPXsKSFI6ZnVuY3Rpb24oYSl7aWYoKHRoaXMuYyYxNSkhPT02KXJl
+dHVybiEwCnJldHVybiB0aGlzLmIuYi5idih0LmFsLmEodGhpcy5kKSxhLmEsdC55LHQuSyl9LApLdzpm
+dW5jdGlvbihhKXt2YXIgcz10aGlzLmUscj10LnoscT10LksscD10aGlzLiR0aS5DKCIyLyIpLG89dGhp
+cy5iLmIKaWYodC5hZy5iKHMpKXJldHVybiBwLmEoby5ycChzLGEuYSxhLmIscixxLHQubCkpCmVsc2Ug
+cmV0dXJuIHAuYShvLmJ2KHQuYkkuYShzKSxhLmEscixxKSl9fQpQLnZzLnByb3RvdHlwZT17ClNxOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD10aGlzLiR0aQpwLktxKGMpLkMoIjEvKDIpIikuYShhKQpz
+PSQuWDMKaWYocyE9PUMuTlUpe2MuQygiQDwwLz4iKS5LcShwLmMpLkMoIjEoMikiKS5hKGEpCmlmKGIh
+PW51bGwpYj1QLlZIKGIscyl9cj1uZXcgUC52cyhzLGMuQygidnM8MD4iKSkKcT1iPT1udWxsPzE6Mwp0
+aGlzLnhmKG5ldyBQLkZlKHIscSxhLGIscC5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0
+dXJuIHJ9LApXNzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlNxKGEsbnVsbCxiKX0sClFkOmZ1bmN0
+aW9uKGEsYixjKXt2YXIgcyxyPXRoaXMuJHRpCnIuS3EoYykuQygiMS8oMikiKS5hKGEpCnM9bmV3IFAu
+dnMoJC5YMyxjLkMoInZzPDA+IikpCnRoaXMueGYobmV3IFAuRmUocywxOSxhLGIsci5DKCJAPDE+Iiku
+S3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHN9LAp4ZjpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMs
+cT1yLmEKaWYocTw9MSl7YS5hPXQuRi5hKHIuYykKci5jPWF9ZWxzZXtpZihxPT09Mil7cz10LmMuYShy
+LmMpCnE9cy5hCmlmKHE8NCl7cy54ZihhKQpyZXR1cm59ci5hPXEKci5jPXMuY31QLlRrKG51bGwsbnVs
+bCxyLmIsdC5NLmEobmV3IFAuZGEocixhKSkpfX0sCmpROmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8s
+bixtPXRoaXMsbD17fQpsLmE9YQppZihhPT1udWxsKXJldHVybgpzPW0uYQppZihzPD0xKXtyPXQuRi5h
+KG0uYykKbS5jPWEKaWYociE9bnVsbCl7cT1hLmEKZm9yKHA9YTtxIT1udWxsO3A9cSxxPW8pbz1xLmEK
+cC5hPXJ9fWVsc2V7aWYocz09PTIpe249dC5jLmEobS5jKQpzPW4uYQppZihzPDQpe24ualEoYSkKcmV0
+dXJufW0uYT1zCm0uYz1uLmN9bC5hPW0uTjgoYSkKUC5UayhudWxsLG51bGwsbS5iLHQuTS5hKG5ldyBQ
+Lm9RKGwsbSkpKX19LAphaDpmdW5jdGlvbigpe3ZhciBzPXQuRi5hKHRoaXMuYykKdGhpcy5jPW51bGwK
+cmV0dXJuIHRoaXMuTjgocyl9LApOODpmdW5jdGlvbihhKXt2YXIgcyxyLHEKZm9yKHM9YSxyPW51bGw7
+cyE9bnVsbDtyPXMscz1xKXtxPXMuYQpzLmE9cn1yZXR1cm4gcn0sCmVjOmZ1bmN0aW9uKGEpe3ZhciBz
+LHIscSxwPXRoaXMKcC5hPTEKdHJ5e2EuU3EobmV3IFAucFYocCksbmV3IFAuVTcocCksdC5QKX1jYXRj
+aChxKXtzPUguUnUocSkKcj1ILnRzKHEpClAucmIobmV3IFAudnIocCxzLHIpKX19LApYMjpmdW5jdGlv
+bihhKXt2YXIgcyxyPXRoaXMKci4kdGkuYy5hKGEpCnM9ci5haCgpCnIuYT00CnIuYz1hClAuSFoocixz
+KX0sClpMOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXRoaXMKdC5sLmEoYikKcz1xLmFoKCkKcj1QLlRs
+KGEsYikKcS5hPTgKcS5jPXIKUC5IWihxLHMpfSwKWGY6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy4kdGkK
+cy5DKCIxLyIpLmEoYSkKaWYocy5DKCJiODwxPiIpLmIoYSkpe3RoaXMuY1UoYSkKcmV0dXJufXRoaXMu
+d1Uocy5jLmEoYSkpfSwKd1U6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcwpzLiR0aS5jLmEoYSkKcy5hPTEK
+UC5UayhudWxsLG51bGwscy5iLHQuTS5hKG5ldyBQLnJ0KHMsYSkpKX0sCmNVOmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMscj1zLiR0aQpyLkMoImI4PDE+IikuYShhKQppZihyLmIoYSkpe2lmKGEuYT09PTgpe3Mu
+YT0xClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5LRihzLGEpKSl9ZWxzZSBQLkE5KGEscykK
+cmV0dXJufXMuZWMoYSl9LApOazpmdW5jdGlvbihhLGIpe3RoaXMuYT0xClAuVGsobnVsbCxudWxsLHRo
+aXMuYix0Lk0uYShuZXcgUC5aTCh0aGlzLGEsYikpKX0sCiRpYjg6MX0KUC5kYS5wcm90b3R5cGU9ewok
+MDpmdW5jdGlvbigpe1AuSFoodGhpcy5hLHRoaXMuYil9LAokUzowfQpQLm9RLnByb3RvdHlwZT17CiQw
+OmZ1bmN0aW9uKCl7UC5IWih0aGlzLmIsdGhpcy5hLmEpfSwKJFM6MH0KUC5wVi5wcm90b3R5cGU9ewok
+MTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlzLmEKcC5hPTAKdHJ5e3AuWDIocC4kdGkuYy5hKGEp
+KX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpCnAuWkwocyxyKX19LAokUzoxMH0KUC5VNy5wcm90
+b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5aTChhLHQubC5hKGIpKX0sCiRDOiIkMiIsCiRS
+OjIsCiRTOjI5fQpQLnZyLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0
+aGlzLmMpfSwKJFM6MH0KUC5ydC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5YMih0aGlz
+LmIpfSwKJFM6MH0KUC5LRi5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe1AuQTkodGhpcy5iLHRoaXMu
+YSl9LAokUzowfQpQLlpMLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0
+aGlzLmMpfSwKJFM6MH0KUC5SVC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8s
+bixtPXRoaXMsbD1udWxsCnRyeXtxPW0uYS5hCmw9cS5iLmIuenoodC5mTy5hKHEuZCksdC56KX1jYXRj
+aChwKXtzPUguUnUocCkKcj1ILnRzKHApCmlmKG0uYyl7cT10Lm4uYShtLmIuYS5jKS5hCm89cwpvPXE9
+PW51bGw/bz09bnVsbDpxPT09bwpxPW99ZWxzZSBxPSExCm89bS5hCmlmKHEpby5jPXQubi5hKG0uYi5h
+LmMpCmVsc2Ugby5jPVAuVGwocyxyKQpvLmI9ITAKcmV0dXJufWlmKGwgaW5zdGFuY2VvZiBQLnZzJiZs
+LmE+PTQpe2lmKGwuYT09PTgpe3E9bS5hCnEuYz10Lm4uYShsLmMpCnEuYj0hMH1yZXR1cm59aWYodC5l
+LmIobCkpe249bS5iLmEKcT1tLmEKcS5jPWwuVzcobmV3IFAualoobiksdC56KQpxLmI9ITF9fSwKJFM6
+MH0KUC5qWi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6MzJ9ClAu
+cnEucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsCnRyeXtxPXRoaXMu
+YQpwPXEuYQpvPXAuJHRpCm49by5jCm09bi5hKHRoaXMuYikKcS5jPXAuYi5iLmJ2KG8uQygiMi8oMSki
+KS5hKHAuZCksbSxvLkMoIjIvIiksbil9Y2F0Y2gobCl7cz1ILlJ1KGwpCnI9SC50cyhsKQpxPXRoaXMu
+YQpxLmM9UC5UbChzLHIpCnEuYj0hMH19LAokUzowfQpQLlJXLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
+KCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMKdHJ5e3M9dC5uLmEoay5hLmEuYykKcD1rLmIKaWYo
+SC5vVChwLmEuSFIocykpJiZwLmEuZSE9bnVsbCl7cC5jPXAuYS5LdyhzKQpwLmI9ITF9fWNhdGNoKG8p
+e3I9SC5SdShvKQpxPUgudHMobykKcD10Lm4uYShrLmEuYS5jKQpuPXAuYQptPXIKbD1rLmIKaWYobj09
+bnVsbD9tPT1udWxsOm49PT1tKWwuYz1wCmVsc2UgbC5jPVAuVGwocixxKQpsLmI9ITB9fSwKJFM6MH0K
+UC5PTS5wcm90b3R5cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgcyxyLHE9
+dGhpcyxwPXt9LG89bmV3IFAudnMoJC5YMyx0LmZKKQpwLmE9MApzPUguTGgocSkKcj1zLkMoIn4oMSk/
+IikuYShuZXcgUC5CNShwLHEpKQp0LlouYShuZXcgUC51TyhwLG8pKQpXLkpFKHEuYSxxLmIsciwhMSxz
+LmMpCnJldHVybiBvfX0KUC5CNS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtILkxoKHRoaXMuYiku
+Yy5hKGEpOysrdGhpcy5hLmF9LAokUzpmdW5jdGlvbigpe3JldHVybiBILkxoKHRoaXMuYikuQygifigx
+KSIpfX0KUC51Ty5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYixyPXMuJHRpLHE9
+ci5DKCIxLyIpLmEodGhpcy5hLmEpLHA9cy5haCgpCnIuYy5hKHEpCnMuYT00CnMuYz1xClAuSFoocyxw
+KX0sCiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAua1QucHJvdG90eXBlPXt9ClAueEkucHJvdG90eXBl
+PXt9ClAubTAucHJvdG90eXBlPXskaVFtOjF9ClAucEsucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2
+YXIgcz1ILmIodGhpcy5hKQpzLnN0YWNrPUouaih0aGlzLmIpCnRocm93IHN9LAokUzowfQpQLkppLnBy
+b3RvdHlwZT17CmJIOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPW51bGwKdC5NLmEoYSkKdHJ5e2lmKEMu
+TlU9PT0kLlgzKXthLiQwKCkKcmV0dXJufVAuVDgocCxwLHRoaXMsYSx0LkgpfWNhdGNoKHEpe3M9SC5S
+dShxKQpyPUgudHMocSkKUC5MMihwLHAsdGhpcyxzLHQubC5hKHIpKX19LApEbDpmdW5jdGlvbihhLGIs
+Yyl7dmFyIHMscixxLHA9bnVsbApjLkMoIn4oMCkiKS5hKGEpCmMuYShiKQp0cnl7aWYoQy5OVT09PSQu
+WDMpe2EuJDEoYikKcmV0dXJufVAueXYocCxwLHRoaXMsYSxiLHQuSCxjKX1jYXRjaChxKXtzPUguUnUo
+cSkKcj1ILnRzKHEpClAuTDIocCxwLHRoaXMscyx0LmwuYShyKSl9fSwKUlQ6ZnVuY3Rpb24oYSxiKXty
+ZXR1cm4gbmV3IFAuaGoodGhpcyxiLkMoIjAoKSIpLmEoYSksYil9LApHWTpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFAuVnAodGhpcyx0Lk0uYShhKSl9LApQeTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5P
+Uih0aGlzLGIuQygifigwKSIpLmEoYSksYil9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGx9LAp6
+ejpmdW5jdGlvbihhLGIpe2IuQygiMCgpIikuYShhKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMCgp
+CnJldHVybiBQLlQ4KG51bGwsbnVsbCx0aGlzLGEsYil9LApidjpmdW5jdGlvbihhLGIsYyxkKXtjLkMo
+IkA8MD4iKS5LcShkKS5DKCIxKDIpIikuYShhKQpkLmEoYikKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEu
+JDEoYikKcmV0dXJuIFAueXYobnVsbCxudWxsLHRoaXMsYSxiLGMsZCl9LApycDpmdW5jdGlvbihhLGIs
+YyxkLGUsZil7ZC5DKCJAPDA+IikuS3EoZSkuS3EoZikuQygiMSgyLDMpIikuYShhKQplLmEoYikKZi5h
+KGMpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQyKGIsYykKcmV0dXJuIFAuUXgobnVsbCxudWxsLHRo
+aXMsYSxiLGMsZCxlLGYpfSwKTGo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGIuQygiQDwwPiIpLktx
+KGMpLktxKGQpLkMoIjEoMiwzKSIpLmEoYSl9fQpQLmhqLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
+cmV0dXJuIHRoaXMuYS56eih0aGlzLmIsdGhpcy5jKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
+Yy5DKCIwKCkiKX19ClAuVnAucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmJI
+KHRoaXMuYil9LAokUzowfQpQLk9SLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMu
+YwpyZXR1cm4gdGhpcy5hLkRsKHRoaXMuYixzLmEoYSkscyl9LAokUzpmdW5jdGlvbigpe3JldHVybiB0
+aGlzLmMuQygifigwKSIpfX0KUC5iNi5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlz
+LHI9bmV3IFAubG0ocyxzLnIsSC5MaChzKS5DKCJsbTwxPiIpKQpyLmM9cy5lCnJldHVybiByfSwKZ0E6
+ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hPT09
+MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hIT09MH0sCnRnOmZ1bmN0aW9uKGEsYil7dmFy
+IHMscgppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7cz10aGlzLmIKaWYocz09
+bnVsbClyZXR1cm4hMQpyZXR1cm4gdC5tLmEoc1tiXSkhPW51bGx9ZWxzZXtyPXRoaXMuUFIoYikKcmV0
+dXJuIHJ9fSwKUFI6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5kCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0
+dXJuIHRoaXMuREYoc1t0aGlzLk4oYSldLGEpPj0wfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT10
+aGlzCkguTGgocSkuYy5hKGIpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXtz
+PXEuYgpyZXR1cm4gcS5iUShzPT1udWxsP3EuYj1QLlQyKCk6cyxiKX1lbHNlIGlmKHR5cGVvZiBiPT0i
+bnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1iKXtyPXEuYwpyZXR1cm4gcS5iUShyPT1udWxsP3EuYz1Q
+LlQyKCk6cixiKX1lbHNlIHJldHVybiBxLkI3KGIpfSwKQjc6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9
+dGhpcwpILkxoKHApLmMuYShhKQpzPXAuZAppZihzPT1udWxsKXM9cC5kPVAuVDIoKQpyPXAuTihhKQpx
+PXNbcl0KaWYocT09bnVsbClzW3JdPVtwLnlvKGEpXQplbHNle2lmKHAuREYocSxhKT49MClyZXR1cm4h
+MQpxLnB1c2gocC55byhhKSl9cmV0dXJuITB9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcwppZih0
+eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIilyZXR1cm4gcy5IKHMuYixiKQplbHNlIGlm
+KHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1iKXJldHVybiBzLkgocy5jLGIpCmVs
+c2UgcmV0dXJuIHMucWcoYil9LApxZzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvPXRoaXMsbj1vLmQK
+aWYobj09bnVsbClyZXR1cm4hMQpzPW8uTihhKQpyPW5bc10KcT1vLkRGKHIsYSkKaWYocTwwKXJldHVy
+biExCnA9ci5zcGxpY2UocSwxKVswXQppZigwPT09ci5sZW5ndGgpZGVsZXRlIG5bc10Kby5HKHApCnJl
+dHVybiEwfSwKYlE6ZnVuY3Rpb24oYSxiKXtILkxoKHRoaXMpLmMuYShiKQppZih0Lm0uYShhW2JdKSE9
+bnVsbClyZXR1cm4hMQphW2JdPXRoaXMueW8oYikKcmV0dXJuITB9LApIOmZ1bmN0aW9uKGEsYil7dmFy
+IHMKaWYoYT09bnVsbClyZXR1cm4hMQpzPXQubS5hKGFbYl0pCmlmKHM9PW51bGwpcmV0dXJuITEKdGhp
+cy5HKHMpCmRlbGV0ZSBhW2JdCnJldHVybiEwfSwKUzpmdW5jdGlvbigpe3RoaXMucj10aGlzLnIrMSYx
+MDczNzQxODIzfSwKeW86ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLHE9bmV3IFAuYm4oSC5MaChyKS5j
+LmEoYSkpCmlmKHIuZT09bnVsbClyLmU9ci5mPXEKZWxzZXtzPXIuZgpzLnRvU3RyaW5nCnEuYz1zCnIu
+Zj1zLmI9cX0rK3IuYQpyLlMoKQpyZXR1cm4gcX0sCkc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPWEu
+YyxxPWEuYgppZihyPT1udWxsKXMuZT1xCmVsc2Ugci5iPXEKaWYocT09bnVsbClzLmY9cgplbHNlIHEu
+Yz1yOy0tcy5hCnMuUygpfSwKTjpmdW5jdGlvbihhKXtyZXR1cm4gSi5oZihhKSYxMDczNzQxODIzfSwK
+REY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Io
+cj0wO3I8czsrK3IpaWYoSi5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9fQpQLmJuLnByb3Rv
+dHlwZT17fQpQLmxtLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVu
+Y3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5hCmlmKHMuYiE9PXEucil0aHJvdyBILmIoUC5hNChx
+KSkKZWxzZSBpZihyPT1udWxsKXtzLnNqKG51bGwpCnJldHVybiExfWVsc2V7cy5zaihzLiR0aS5DKCIx
+PyIpLmEoci5hKSkKcy5jPXIuYgpyZXR1cm4hMH19LApzajpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4k
+dGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpQLm1XLnByb3RvdHlwZT17fQpQLnV5LnByb3RvdHlwZT17
+JGliUToxLCRpY1g6MSwkaXpNOjF9ClAubEQucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJu
+IG5ldyBILmE3KGEsdGhpcy5nQShhKSxILnooYSkuQygiYTc8bEQuRT4iKSl9LApFOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIHRoaXMucShhLGIpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC56KGEpLkMoIn4o
+bEQuRSkiKS5hKGIpCnM9dGhpcy5nQShhKQpmb3Iocj0wO3I8czsrK3Ipe2IuJDEodGhpcy5xKGEscikp
+CmlmKHMhPT10aGlzLmdBKGEpKXRocm93IEguYihQLmE0KGEpKX19LApnbDA6ZnVuY3Rpb24oYSl7cmV0
+dXJuIHRoaXMuZ0EoYSk9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdsMChhKX0sCkUy
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILnooYSkKcmV0dXJuIG5ldyBILmxKKGEscy5LcShjKS5DKCIx
+KGxELkUpIikuYShiKSxzLkMoIkA8bEQuRT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwKZVI6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnooYSkuQygibEQuRSIpKX0sCmRyOmZ1bmN0aW9u
+KGEsYil7cmV0dXJuIG5ldyBILmpWKGEsSC56KGEpLkMoIkA8bEQuRT4iKS5LcShiKS5DKCJqVjwxLDI+
+IikpfSwKZHU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMKSC56KGEpLkMoImxELkU/IikuYShkKQpQLmpC
+KGIsYyx0aGlzLmdBKGEpKQpmb3Iocz1iO3M8YzsrK3MpdGhpcy5ZNShhLHMsZCl9LAp3OmZ1bmN0aW9u
+KGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3RvdHlw
+ZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscj10aGlzLmEKaWYoIXIuYSl0aGlzLmIuYSs9IiwgIgpy
+LmE9ITEKcj10aGlzLmIKcz1yLmErPUguRWooYSkKci5hPXMrIjogIgpyLmErPUguRWooYil9LAokUzox
+MX0KUC5Zay5wcm90b3R5cGU9ewpLOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILkxoKHRoaXMpLkMoIn4o
+WWsuSyxZay5WKSIpLmEoYikKZm9yKHM9Si5JVCh0aGlzLmd2YygpKTtzLkYoKTspe3I9cy5nbCgpCmIu
+JDIocix0aGlzLnEoMCxyKSl9fSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ3ZjKCks
+bmV3IFAueVEodGhpcyksSC5MaCh0aGlzKS5DKCJOMzxZay5LLFlrLlY+IikpfSwKeDQ6ZnVuY3Rpb24o
+YSl7cmV0dXJuIEouemwodGhpcy5ndmMoKSxhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRo
+aXMuZ3ZjKCkpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuZ3ZjKCkpfSwKdzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCiRpWjA6MX0KUC55US5wcm90b3R5cGU9ewokMTpmdW5j
+dGlvbihhKXt2YXIgcz10aGlzLmEscj1ILkxoKHMpCnIuQygiWWsuSyIpLmEoYSkKcmV0dXJuIG5ldyBQ
+Lk4zKGEscy5xKDAsYSksci5DKCJAPFlrLks+IikuS3Eoci5DKCJZay5WIikpLkMoIk4zPDEsMj4iKSl9
+LAokUzpmdW5jdGlvbigpe3JldHVybiBILkxoKHRoaXMuYSkuQygiTjM8WWsuSyxZay5WPihZay5LKSIp
+fX0KUC5LUC5wcm90b3R5cGU9ewpZNTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMu
+YShiKQpzLlFbMV0uYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUg
+bWFwIikpfX0KUC5Qbi5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAs
+Yil9LApZNTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWTUoMCxzLmMuYShi
+KSxzLlFbMV0uYShjKSl9LAp4NDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLng0KGEpfSwKSzpmdW5j
+dGlvbihhLGIpe3RoaXMuYS5LKDAsSC5MaCh0aGlzKS5DKCJ+KDEsMikiKS5hKGIpKX0sCmdsMDpmdW5j
+dGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ2wwKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHM9
+dGhpcy5hCnJldHVybiBzLmdBKHMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuYSl9LApn
+UHU6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzLmdQdShzKX0sCiRpWjA6MX0KUC5Hai5w
+cm90b3R5cGU9e30KUC5sZi5wcm90b3R5cGU9ewpnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0Eo
+dGhpcyk9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpIT09MH0sCkZWOmZ1
+bmN0aW9uKGEsYil7dmFyIHMKZm9yKHM9Si5JVChILkxoKHRoaXMpLkMoImNYPGxmLkU+IikuYShiKSk7
+cy5GKCk7KXRoaXMuaSgwLHMuZ2woKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKHRoaXMsInsi
+LCJ9Iil9LAprOmZ1bmN0aW9uKGEsYil7dmFyIHMscj10aGlzLmdtKHRoaXMpCmlmKCFyLkYoKSlyZXR1
+cm4iIgppZihiPT09IiIpe3M9IiIKZG8gcys9SC5FaihyLmQpCndoaWxlKHIuRigpKX1lbHNle3M9SC5F
+aihyLmQpCmZvcig7ci5GKCk7KXM9cytiK0guRWooci5kKX1yZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0w
+P3M6c30sCmVSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygibGYu
+RSIpKX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD0iaW5kZXgiCkguY2IoYixwLHQuUykKUC5r
+MShiLHApCmZvcihzPXRoaXMuZ20odGhpcykscj0wO3MuRigpOyl7cT1zLmQKaWYoYj09PXIpcmV0dXJu
+IHE7KytyfXRocm93IEguYihQLkNmKGIsdGhpcyxwLG51bGwscikpfX0KUC5Wai5wcm90b3R5cGU9eyRp
+YlE6MSwkaWNYOjEsJGl4dToxfQpQLlh2LnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAu
+blkucHJvdG90eXBlPXt9ClAuV1kucHJvdG90eXBlPXt9ClAuUlUucHJvdG90eXBlPXt9ClAucFIucHJv
+dG90eXBlPXt9ClAudXcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5iCmlm
+KHI9PW51bGwpcmV0dXJuIHRoaXMuYy5xKDAsYikKZWxzZSBpZih0eXBlb2YgYiE9InN0cmluZyIpcmV0
+dXJuIG51bGwKZWxzZXtzPXJbYl0KcmV0dXJuIHR5cGVvZiBzPT0idW5kZWZpbmVkIj90aGlzLmZiKGIp
+OnN9fSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYj09bnVsbD90aGlzLmMuYTp0aGlzLkNmKCku
+bGVuZ3RofSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCmd2YzpmdW5j
+dGlvbigpe2lmKHRoaXMuYj09bnVsbCl7dmFyIHM9dGhpcy5jCnJldHVybiBuZXcgSC5pNShzLEguTGgo
+cykuQygiaTU8MT4iKSl9cmV0dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTU6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzLHIscT10aGlzCmlmKHEuYj09bnVsbClxLmMuWTUoMCxiLGMpCmVsc2UgaWYocS54NChiKSl7cz1x
+LmIKc1tiXT1jCnI9cS5hCmlmKHI9PW51bGw/cyE9bnVsbDpyIT09cylyW2JdPW51bGx9ZWxzZSBxLlhL
+KCkuWTUoMCxiLGMpfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlzLmMu
+eDQoYSkKcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSl9
+LApLOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz10aGlzCnQuY0EuYShiKQppZihvLmI9PW51bGwp
+cmV0dXJuIG8uYy5LKDAsYikKcz1vLkNmKCkKZm9yKHI9MDtyPHMubGVuZ3RoOysrcil7cT1zW3JdCnA9
+by5iW3FdCmlmKHR5cGVvZiBwPT0idW5kZWZpbmVkIil7cD1QLlFlKG8uYVtxXSkKby5iW3FdPXB9Yi4k
+MihxLHApCmlmKHMhPT1vLmMpdGhyb3cgSC5iKFAuYTQobykpfX0sCkNmOmZ1bmN0aW9uKCl7dmFyIHM9
+dC5iTS5hKHRoaXMuYykKaWYocz09bnVsbClzPXRoaXMuYz1ILlZNKE9iamVjdC5rZXlzKHRoaXMuYSks
+dC5zKQpyZXR1cm4gc30sClhLOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuPXRoaXMKaWYobi5iPT1u
+dWxsKXJldHVybiBuLmMKcz1QLkZsKHQuTix0LnopCnI9bi5DZigpCmZvcihxPTA7cD1yLmxlbmd0aCxx
+PHA7KytxKXtvPXJbcV0Kcy5ZNSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShyLCIiKQplbHNl
+IEMuTm0uc0EociwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmI6ZnVuY3Rpb24oYSl7dmFy
+IHMKaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJu
+IG51bGwKcz1QLlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9
+ewpnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFOmZ1bmN0aW9uKGEs
+Yil7dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbClzPXMuZ3ZjKCkuRSgwLGIpCmVsc2V7cz1zLkNmKCkK
+aWYoYjwwfHxiPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLGIpCnM9c1tiXX1yZXR1cm4gc30sCmdtOmZ1
+bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQppZihzLmI9PW51bGwpe3M9cy5ndmMoKQpzPXMuZ20ocyl9ZWxz
+ZXtzPXMuQ2YoKQpzPW5ldyBKLm0xKHMscy5sZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX1yZXR1cm4g
+c30sCnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19ClAueHIucHJvdG90eXBlPXsK
+JDA6ZnVuY3Rpb24oKXt2YXIgcyxyCnRyeXtzPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDp0
+cnVlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0sCiRTOjEyfQpQLk56LnBy
+b3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIoInV0Zi04
+Iix7ZmF0YWw6ZmFsc2V9KQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxsfSwKJFM6
+MTJ9ClAuQ1YucHJvdG90eXBlPXsKeXI6ZnVuY3Rpb24oYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8sbixt
+LGwsayxqLGksaCxnLGYsZSxkLGMsYixhPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgph
+Mj1QLmpCKGExLGEyLGEwLmxlbmd0aCkKcz0kLlY3KCkKZm9yKHI9YTEscT1yLHA9bnVsbCxvPS0xLG49
+LTEsbT0wO3I8YTI7cj1sKXtsPXIrMQprPUMueEIuVyhhMCxyKQppZihrPT09Mzcpe2o9bCsyCmlmKGo8
+PWEyKXtpPUgub28oQy54Qi5XKGEwLGwpKQpoPUgub28oQy54Qi5XKGEwLGwrMSkpCmc9aSoxNitoLSho
+JjI1NikKaWYoZz09PTM3KWc9LTEKbD1qfWVsc2UgZz0tMX1lbHNlIGc9awppZigwPD1nJiZnPD0xMjcp
+e2lmKGc8MHx8Zz49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxnKQpmPXNbZ10KaWYoZj49MCl7Zz1DLnhC
+Lk8oIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIz
+NDU2Nzg5Ky8iLGYpCmlmKGc9PT1rKWNvbnRpbnVlCms9Z31lbHNle2lmKGY9PT0tMSl7aWYobzwwKXtl
+PXA9PW51bGw/bnVsbDpwLmEubGVuZ3RoCmlmKGU9PW51bGwpZT0wCm89ZSsoci1xKQpuPXJ9KyttCmlm
+KGs9PT02MSljb250aW51ZX1rPWd9aWYoZiE9PS0yKXtpZihwPT1udWxsKXtwPW5ldyBQLlJuKCIiKQpl
+PXB9ZWxzZSBlPXAKZS5hKz1DLnhCLk5qKGEwLHEscikKZS5hKz1ILkx3KGspCnE9bApjb250aW51ZX19
+dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGEwLHIpKX1pZihwIT1udWxsKXtlPXAu
+YSs9Qy54Qi5OaihhMCxxLGEyKQpkPWUubGVuZ3RoCmlmKG8+PTApUC54TShhMCxuLGEyLG8sbSxkKQpl
+bHNle2M9Qy5qbi56WShkLTEsNCkrMQppZihjPT09MSl0aHJvdyBILmIoUC5ycihhLGEwLGEyKSkKZm9y
+KDtjPDQ7KXtlKz0iPSIKcC5hPWU7KytjfX1lPXAuYQpyZXR1cm4gQy54Qi5pNyhhMCxhMSxhMixlLmNo
+YXJDb2RlQXQoMCk9PTA/ZTplKX1iPWEyLWExCmlmKG8+PTApUC54TShhMCxuLGEyLG8sbSxiKQplbHNl
+e2M9Qy5qbi56WShiLDQpCmlmKGM9PT0xKXRocm93IEguYihQLnJyKGEsYTAsYTIpKQppZihjPjEpYTA9
+Qy54Qi5pNyhhMCxhMixhMixjPT09Mj8iPT0iOiI9Iil9cmV0dXJuIGEwfX0KUC5VOC5wcm90b3R5cGU9
+e30KUC5Vay5wcm90b3R5cGU9e30KUC53SS5wcm90b3R5cGU9e30KUC5aaS5wcm90b3R5cGU9e30KUC5V
+ZC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPVAucCh0aGlzLmEpCnJldHVybih0aGlzLmIh
+PW51bGw/IkNvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOiI6IkNv
+bnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IikrIiAiK3N9
+fQpQLks4LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09O
+IHN0cmluZ2lmeSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwp0LmZW
+LmEoYykKcz1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gc30sCk9COmZ1bmN0aW9uKGEsYil7dmFy
+IHMKdC5kQS5hKGIpCnM9UC51WChhLHRoaXMuZ1pFKCkuYixudWxsKQpyZXR1cm4gc30sCmdaRTpmdW5j
+dGlvbigpe3JldHVybiBDLm5YfSwKZ0hlOmZ1bmN0aW9uKCl7cmV0dXJuIEMuQTN9fQpQLm9qLnByb3Rv
+dHlwZT17fQpQLk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17CnZwOmZ1bmN0aW9uKGEpe3Zh
+ciBzLHIscSxwLG8sbixtLGw9YS5sZW5ndGgKZm9yKHM9Si5yWShhKSxyPXRoaXMuYyxxPTAscD0wO3A8
+bDsrK3Ape289cy5XKGEscCkKaWYobz45Mil7aWYobz49NTUyOTYpe249byY2NDUxMgppZihuPT09NTUy
+OTYpe209cCsxCm09IShtPGwmJihDLnhCLlcoYSxtKSY2NDUxMik9PT01NjMyMCl9ZWxzZSBtPSExCmlm
+KCFtKWlmKG49PT01NjMyMCl7bj1wLTEKbj0hKG4+PTAmJihDLnhCLk8oYSxuKSY2NDUxMik9PT01NTI5
+Nil9ZWxzZSBuPSExCmVsc2Ugbj0hMAppZihuKXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxwKQpxPXAr
+MQpyLmErPUguTHcoOTIpCnIuYSs9SC5MdygxMTcpCnIuYSs9SC5MdygxMDApCm49bz4+PjgmMTUKci5h
+Kz1ILkx3KG48MTA/NDgrbjo4NytuKQpuPW8+Pj40JjE1CnIuYSs9SC5MdyhuPDEwPzQ4K246ODcrbikK
+bj1vJjE1CnIuYSs9SC5MdyhuPDEwPzQ4K246ODcrbil9fWNvbnRpbnVlfWlmKG88MzIpe2lmKHA+cSly
+LmErPUMueEIuTmooYSxxLHApCnE9cCsxCnIuYSs9SC5Mdyg5MikKc3dpdGNoKG8pe2Nhc2UgODpyLmEr
+PUguTHcoOTgpCmJyZWFrCmNhc2UgOTpyLmErPUguTHcoMTE2KQpicmVhawpjYXNlIDEwOnIuYSs9SC5M
+dygxMTApCmJyZWFrCmNhc2UgMTI6ci5hKz1ILkx3KDEwMikKYnJlYWsKY2FzZSAxMzpyLmErPUguTHco
+MTE0KQpicmVhawpkZWZhdWx0OnIuYSs9SC5MdygxMTcpCnIuYSs9SC5Mdyg0OCkKci5hKz1ILkx3KDQ4
+KQpuPW8+Pj40JjE1CnIuYSs9SC5MdyhuPDEwPzQ4K246ODcrbikKbj1vJjE1CnIuYSs9SC5MdyhuPDEw
+PzQ4K246ODcrbikKYnJlYWt9fWVsc2UgaWYobz09PTM0fHxvPT09OTIpe2lmKHA+cSlyLmErPUMueEIu
+TmooYSxxLHApCnE9cCsxCnIuYSs9SC5Mdyg5MikKci5hKz1ILkx3KG8pfX1pZihxPT09MClyLmErPUgu
+RWooYSkKZWxzZSBpZihxPGwpci5hKz1zLk5qKGEscSxsKX0sCkpuOmZ1bmN0aW9uKGEpe3ZhciBzLHIs
+cSxwCmZvcihzPXRoaXMuYSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KaWYoYT09bnVsbD9w
+PT1udWxsOmE9PT1wKXRocm93IEguYihuZXcgUC5LOChhLG51bGwpKX1DLk5tLmkocyxhKX0sCmlVOmZ1
+bmN0aW9uKGEpe3ZhciBzLHIscSxwLG89dGhpcwppZihvLnRNKGEpKXJldHVybgpvLkpuKGEpCnRyeXtz
+PW8uYi4kMShhKQppZighby50TShzKSl7cT1QLkd5KGEsbnVsbCxvLmdWSygpKQp0aHJvdyBILmIocSl9
+cT1vLmEKaWYoMD49cS5sZW5ndGgpcmV0dXJuIEguT0gocSwtMSkKcS5wb3AoKX1jYXRjaChwKXtyPUgu
+UnUocCkKcT1QLkd5KGEscixvLmdWSygpKQp0aHJvdyBILmIocSl9fSwKdE06ZnVuY3Rpb24oYSl7dmFy
+IHMscixxPXRoaXMKaWYodHlwZW9mIGE9PSJudW1iZXIiKXtpZighaXNGaW5pdGUoYSkpcmV0dXJuITEK
+cS5jLmErPUMuQ0QudyhhKQpyZXR1cm4hMH1lbHNlIGlmKGE9PT0hMCl7cS5jLmErPSJ0cnVlIgpyZXR1
+cm4hMH1lbHNlIGlmKGE9PT0hMSl7cS5jLmErPSJmYWxzZSIKcmV0dXJuITB9ZWxzZSBpZihhPT1udWxs
+KXtxLmMuYSs9Im51bGwiCnJldHVybiEwfWVsc2UgaWYodHlwZW9mIGE9PSJzdHJpbmciKXtzPXEuYwpz
+LmErPSciJwpxLnZwKGEpCnMuYSs9JyInCnJldHVybiEwfWVsc2UgaWYodC5qLmIoYSkpe3EuSm4oYSkK
+cS5sSyhhKQpzPXEuYQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVy
+biEwfWVsc2UgaWYodC5mLmIoYSkpe3EuSm4oYSkKcj1xLmp3KGEpCnM9cS5hCmlmKDA+PXMubGVuZ3Ro
+KXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcmV0dXJuIHJ9ZWxzZSByZXR1cm4hMX0sCmxLOmZ1bmN0
+aW9uKGEpe3ZhciBzLHIscT10aGlzLmMKcS5hKz0iWyIKcz1KLlU2KGEpCmlmKHMuZ29yKGEpKXt0aGlz
+LmlVKHMucShhLDApKQpmb3Iocj0xO3I8cy5nQShhKTsrK3Ipe3EuYSs9IiwiCnRoaXMuaVUocy5xKGEs
+cikpfX1xLmErPSJdIn0sCmp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD17fQpp
+ZihhLmdsMChhKSl7bS5jLmErPSJ7fSIKcmV0dXJuITB9cz1hLmdBKGEpKjIKcj1QLk84KHMsbnVsbCwh
+MSx0LlcpCnE9bC5hPTAKbC5iPSEwCmEuSygwLG5ldyBQLnRpKGwscikpCmlmKCFsLmIpcmV0dXJuITEK
+cD1tLmMKcC5hKz0ieyIKZm9yKG89JyInO3E8cztxKz0yLG89JywiJyl7cC5hKz1vCm0udnAoSC5oKHJb
+cV0pKQpwLmErPSciOicKbj1xKzEKaWYobj49cylyZXR1cm4gSC5PSChyLG4pCm0uaVUocltuXSl9cC5h
+Kz0ifSIKcmV0dXJuITB9fQpQLnRpLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpp
+Zih0eXBlb2YgYSE9InN0cmluZyIpdGhpcy5hLmI9ITEKcz10aGlzLmIKcj10aGlzLmEKQy5ObS5ZNShz
+LHIuYSsrLGEpCkMuTm0uWTUocyxyLmErKyxiKX0sCiRTOjExfQpQLnR1LnByb3RvdHlwZT17CmdWSzpm
+dW5jdGlvbigpe3ZhciBzPXRoaXMuYy5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfX0KUC51
+NS5wcm90b3R5cGU9ewpnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsK
+V0o6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9UC5qQigwLG51bGwsYS5sZW5ndGgpLG89cC0wCmlmKG89
+PT0wKXJldHVybiBuZXcgVWludDhBcnJheSgwKQpzPW8qMwpyPW5ldyBVaW50OEFycmF5KHMpCnE9bmV3
+IFAuUncocikKaWYocS5HeChhLDAscCkhPT1wKXtKLmE2KGEscC0xKQpxLlJPKCl9cmV0dXJuIG5ldyBV
+aW50OEFycmF5KHIuc3ViYXJyYXkoMCxILnJNKDAscS5iLHMpKSl9fQpQLlJ3LnByb3RvdHlwZT17ClJP
+OmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMuYyxxPXMuYixwPXMuYj1xKzEsbz1yLmxlbmd0aAppZihx
+Pj1vKXJldHVybiBILk9IKHIscSkKcltxXT0yMzkKcT1zLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0go
+cixwKQpyW3BdPTE5MQpzLmI9cSsxCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTE4OX0sCk82
+OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuPXRoaXMKaWYoKGImNjQ1MTIpPT09NTYzMjApe3M9
+NjU1MzYrKChhJjEwMjMpPDwxMCl8YiYxMDIzCnI9bi5jCnE9bi5iCnA9bi5iPXErMQpvPXIubGVuZ3Ro
+CmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPXM+Pj4xOHwyNDAKcT1uLmI9cCsxCmlmKHA+PW8p
+cmV0dXJuIEguT0gocixwKQpyW3BdPXM+Pj4xMiY2M3wxMjgKcD1uLmI9cSsxCmlmKHE+PW8pcmV0dXJu
+IEguT0gocixxKQpyW3FdPXM+Pj42JjYzfDEyOApuLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixw
+KQpyW3BdPXMmNjN8MTI4CnJldHVybiEwfWVsc2V7bi5STygpCnJldHVybiExfX0sCkd4OmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbSxsPXRoaXMKaWYoYiE9PWMmJihDLnhCLk8oYSxjLTEpJjY0
+NTEyKT09PTU1Mjk2KS0tYwpmb3Iocz1sLmMscj1zLmxlbmd0aCxxPWI7cTxjOysrcSl7cD1DLnhCLlco
+YSxxKQppZihwPD0xMjcpe289bC5iCmlmKG8+PXIpYnJlYWsKbC5iPW8rMQpzW29dPXB9ZWxzZXtvPXAm
+NjQ1MTIKaWYobz09PTU1Mjk2KXtpZihsLmIrND5yKWJyZWFrCm49cSsxCmlmKGwuTzYocCxDLnhCLlco
+YSxuKSkpcT1ufWVsc2UgaWYobz09PTU2MzIwKXtpZihsLmIrMz5yKWJyZWFrCmwuUk8oKX1lbHNlIGlm
+KHA8PTIwNDcpe289bC5iCm09bysxCmlmKG0+PXIpYnJlYWsKbC5iPW0KaWYobz49cilyZXR1cm4gSC5P
+SChzLG8pCnNbb109cD4+PjZ8MTkyCmwuYj1tKzEKc1ttXT1wJjYzfDEyOH1lbHNle289bC5iCmlmKG8r
+Mj49cilicmVhawptPWwuYj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjEyfDIy
+NApvPWwuYj1tKzEKaWYobT49cilyZXR1cm4gSC5PSChzLG0pCnNbbV09cD4+PjYmNjN8MTI4CmwuYj1v
+KzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cCY2M3wxMjh9fX1yZXR1cm4gcX19ClAuR1ku
+cHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHMscgp0LkwuYShhKQpzPXRoaXMuYQpyPVAua3ko
+cyxhLDAsbnVsbCkKaWYociE9bnVsbClyZXR1cm4gcgpyZXR1cm4gbmV3IFAuYnoocykuTmUoYSwwLG51
+bGwsITApfX0KUC5iei5wcm90b3R5cGU9ewpOZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxv
+LG49dGhpcwp0LkwuYShhKQpzPVAuakIoYixjLEouSG0oYSkpCmlmKGI9PT1zKXJldHVybiIiCnI9UC5q
+eShhLGIscykKcT1uLmhPKHIsMCxzLWIsITApCnA9bi5iCmlmKChwJjEpIT09MCl7bz1QLmo0KHApCm4u
+Yj0wCnRocm93IEguYihQLnJyKG8sYSxiK24uYykpfXJldHVybiBxfSwKaE86ZnVuY3Rpb24oYSxiLGMs
+ZCl7dmFyIHMscixxPXRoaXMKaWYoYy1iPjEwMDApe3M9Qy5qbi5CVShiK2MsMikKcj1xLmhPKGEsYixz
+LCExKQppZigocS5iJjEpIT09MClyZXR1cm4gcgpyZXR1cm4gcitxLmhPKGEscyxjLGQpfXJldHVybiBx
+LkVoKGEsYixjLGQpfSwKRWg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRo
+aXMsaj02NTUzMyxpPWsuYixoPWsuYyxnPW5ldyBQLlJuKCIiKSxmPWIrMSxlPWEubGVuZ3RoCmlmKGI8
+MHx8Yj49ZSlyZXR1cm4gSC5PSChhLGIpCnM9YVtiXQokbGFiZWwwJDA6Zm9yKHI9ay5hOyEwOyl7Zm9y
+KDshMDtmPW8pe3E9Qy54Qi5XKCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-QUFBQUFBQUFBQUFBQUZGRkZGRkZGRkZGRkZGRkZHR0dHR0dHR0dHR0dHR0dHSEhISEhISEhISEhISEhI
-SEhISEhISEhISEhISUhISEpFRUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQktDQ0NDQ0NDQ0ND
-Q0NEQ0xPTk5OTUVFRUVFRUVFRUVFIixzKSYzMQpoPWk8PTMyP3MmNjE2OTQ+Pj5xOihzJjYzfGg8PDYp
-Pj4+MAppPUMueEIuVygiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBceDAwMDpYRUNDQ0NDTnZsRGIgXHgwMDA6
-WEVDQ0NDQ046bERiIEFBQUFBXHgwMFx4MDBceDAwXHgwMFx4MDBBQUFBQTAwMDAwQUFBQUE6Ojo6OkFB
-QUFBR0cwMDBBQUFBQTAwS0tLQUFBQUFHOjo6OkFBQUFBOklJSUlBQUFBQTAwMFx4ODAwQUFBQUFceDAw
-XHgwMFx4MDBceDAwIEFBQUFBIixpK3EpCmlmKGk9PT0wKXtnLmErPUguTHcoaCkKaWYoZj09PWMpYnJl
-YWsgJGxhYmVsMCQwCmJyZWFrfWVsc2UgaWYoKGkmMSkhPT0wKXtpZihyKXN3aXRjaChpKXtjYXNlIDY5
-OmNhc2UgNjc6Zy5hKz1ILkx3KGopCmJyZWFrCmNhc2UgNjU6Zy5hKz1ILkx3KGopOy0tZgpicmVhawpk
-ZWZhdWx0OnA9Zy5hKz1ILkx3KGopCmcuYT1wK0guTHcoaikKYnJlYWt9ZWxzZXtrLmI9aQprLmM9Zi0x
-CnJldHVybiIifWk9MH1pZihmPT09YylicmVhayAkbGFiZWwwJDAKbz1mKzEKaWYoZjwwfHxmPj1lKXJl
-dHVybiBILk9IKGEsZikKcz1hW2ZdfW89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9
-YVtmXQppZihzPDEyOCl7d2hpbGUoITApe2lmKCEobzxjKSl7bj1jCmJyZWFrfW09bysxCmlmKG88MHx8
-bz49ZSlyZXR1cm4gSC5PSChhLG8pCnM9YVtvXQppZihzPj0xMjgpe249bS0xCm89bQpicmVha31vPW19
-aWYobi1mPDIwKWZvcihsPWY7bDxuOysrbCl7aWYobD49ZSlyZXR1cm4gSC5PSChhLGwpCmcuYSs9SC5M
-dyhhW2xdKX1lbHNlIGcuYSs9UC5ITShhLGYsbikKaWYobj09PWMpYnJlYWsgJGxhYmVsMCQwCmY9b31l
-bHNlIGY9b31pZihkJiZpPjMyKWlmKHIpZy5hKz1ILkx3KGopCmVsc2V7ay5iPTc3CmsuYz1jCnJldHVy
-biIifWsuYj1pCmsuYz1oCmU9Zy5hCnJldHVybiBlLmNoYXJDb2RlQXQoMCk9PTA/ZTplfX0KUC5XRi5w
-cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQp0LmZvLmEoYSkKcz10aGlzLmIKcj10
-aGlzLmEKcy5hKz1yLmEKcT1zLmErPUguRWooYS5hKQpzLmE9cSsiOiAiCnMuYSs9UC5wKGIpCnIuYT0i
-LCAifSwKJFM6NDJ9ClAuaVAucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJl
-dHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5pUCYmdGhpcy5hPT09Yi5hJiYhMH0sCmdpTzpmdW5j
-dGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuKHNeQy5qbi53RyhzLDMwKSkmMTA3Mzc0MTgyM30sCnc6
-ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPVAuR3EoSC50SihzKSkscT1QLmgwKEguTlMocykpLHA9UC5o
-MChILmpBKHMpKSxvPVAuaDAoSC5JWChzKSksbj1QLmgwKEguY2gocykpLG09UC5oMChILkpkKHMpKSxs
-PVAuVngoSC5vMShzKSksaz1yKyItIitxKyItIitwKyIgIitvKyI6IituKyI6IittKyIuIitsCnJldHVy
-biBrfX0KUC5YUy5wcm90b3R5cGU9ewpnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gSC50cyh0aGlzLiR0aHJv
-d25Kc0Vycm9yKX19ClAuQzYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKaWYo
-cyE9bnVsbClyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAocykKcmV0dXJuIkFzc2VydGlvbiBm
-YWlsZWQifX0KUC5Fei5wcm90b3R5cGU9e30KUC5GLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIlRocm93IG9mIG51bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJJ
-bnZhbGlkIGFyZ3VtZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5jdGlvbigpe3JldHVybiIi
-fSwKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXA9PW51bGw/IiI6IiAoIitwKyIp
-IixuPXEuZCxtPW49PW51bGw/IiI6IjogIitILkVqKG4pLGw9cS5nWigpK28rbQppZighcS5hKXJldHVy
-biBsCnM9cS5ndSgpCnI9UC5wKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnByb3RvdHlwZT17
-CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2YXIgcyxyPXRo
-aXMuZSxxPXRoaXMuZgppZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFs
-IHRvICIrSC5FaihxKToiIgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVx
-dWFsIHRvICIrSC5FaihyKQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUgcmFuZ2UgIitI
-LkVqKHIpKyIuLiIrSC5FaihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5
-IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVkucHJvdG90eXBl
-PXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApndTpmdW5jdGlvbigpe3ZhciBzLHI9
-SC51UCh0aGlzLmIpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIHIuSigpCmlmKHI8MClyZXR1
-cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIKcz10aGlzLmYKaWYocz09PTApcmV0dXJuIjog
-bm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gIitI
-LkVqKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZn19ClAubXAucHJvdG90eXBlPXsKdzpm
-dW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxqPXt9LGk9bmV3IFAuUm4oIiIpCmou
-YT0iIgpzPWsuYwpmb3Iocj1zLmxlbmd0aCxxPTAscD0iIixvPSIiO3E8cjsrK3Esbz0iLCAiKXtuPXNb
-cV0KaS5hPXArbwpwPWkuYSs9UC5wKG4pCmouYT0iLCAifWsuZC5LKDAsbmV3IFAuV0YoaixpKSkKbT1Q
-LnAoay5hKQpsPWkudygwKQpyPSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIr
-SC5FaihrLmIuYSkrIidcblJlY2VpdmVyOiAiK20rIlxuQXJndW1lbnRzOiBbIitsKyJdIgpyZXR1cm4g
-cn19ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0
-aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEK
-cmV0dXJuIHMhPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJvcjogIitzOiJVbmltcGxlbWVudGVkRXJyb3Ii
-fX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5h
-fX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQppZihzPT1udWxsKXJl
-dHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1
-cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb246ICIrUC5wKHMpKyIuIn19ClAuazUucHJv
-dG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApnSUk6ZnVuY3Rpb24o
-KXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVy
-biJTdGFjayBPdmVyZmxvdyJ9LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5j
-LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzPT1udWxsPyJSZWFk
-aW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIjoiUmVhZGluZyBzdGF0
-aWMgdmFyaWFibGUgJyIrcysiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIn19ClAuQ0QucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3RoaXMuYX0sCiRpUno6MX0KUC5h
-RS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnPXRo
-aXMuYSxmPWchPW51bGwmJiIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK0guRWooZyk6IkZvcm1hdEV4
-Y2VwdGlvbiIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmciKXtpZihlIT1udWxs
-KXM9ZTwwfHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1udWxsKXtpZihkLmxl
-bmd0aD43OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9Zm9yKHI9MSxxPTAs
-cD0hMSxvPTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEhPT1vfHwhcCkrK3IK
-cT1vKzEKcD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4xP2YrKCIgKGF0IGxp
-bmUgIityKyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNoYXJhY3RlciAiKyhl
-KzEpKyIpXG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8yKGQsbykKaWYobj09
-PTEwfHxuPT09MTMpe209bwpicmVha319aWYobS1xPjc4KWlmKGUtcTw3NSl7bD1xKzc1Cms9cQpqPSIi
-Cmk9Ii4uLiJ9ZWxzZXtpZihtLWU8NzUpe2s9bS03NQpsPW0KaT0iIn1lbHNle2s9ZS0zNgpsPWUrMzYK
-aT0iLi4uIn1qPSIuLi4ifWVsc2V7bD1tCms9cQpqPSIiCmk9IiJ9aD1DLnhCLk5qKGQsayxsKQpyZXR1
-cm4gZitqK2graSsiXG4iK0MueEIuVCgiICIsZS1rK2oubGVuZ3RoKSsiXlxuIn1lbHNlIHJldHVybiBl
-IT1udWxsP2YrKCIgKGF0IG9mZnNldCAiK0guRWooZSkrIikiKTpmfSwKJGlSejoxfQpQLmNYLnByb3Rv
-dHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguR0oodGhpcyxILkxoKHRoaXMpLkMoImNYLkUi
-KSxiKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBILksxKHRoaXMs
-cy5LcShjKS5DKCIxKGNYLkUpIikuYShiKSxzLkMoImNYLkUiKSxjKX0sCmV2OmZ1bmN0aW9uKGEsYil7
-dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguVTUodGhpcyxzLkMoImEyKGNYLkUpIikuYShiKSxz
-LkMoIlU1PGNYLkU+IikpfSwKdHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5ZMSh0aGlzLGIsSC5MaCh0
-aGlzKS5DKCJjWC5FIikpfSwKYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9LApnQTpm
-dW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKZm9yKHM9MDtyLkYoKTspKytzCnJldHVybiBz
-fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdtKHRoaXMpLkYoKX0sCmdvcjpmdW5jdGlvbihh
-KXtyZXR1cm4hdGhpcy5nbDAodGhpcyl9LAplUjpmdW5jdGlvbihhLGIpe3JldHVybiBILmJLKHRoaXMs
-YixILkxoKHRoaXMpLkMoImNYLkUiKSl9LApncjg6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmdtKHRo
-aXMpCmlmKCFyLkYoKSl0aHJvdyBILmIoSC5XcCgpKQpzPXIuZ2woKQppZihyLkYoKSl0aHJvdyBILmIo
-SC5BbSgpKQpyZXR1cm4gc30sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKUC5rMShiLCJpbmRleCIp
-CmZvcihzPXRoaXMuZ20odGhpcykscj0wO3MuRigpOyl7cT1zLmdsKCkKaWYoYj09PXIpcmV0dXJuIHE7
-KytyfXRocm93IEguYihQLkNmKGIsdGhpcywiaW5kZXgiLG51bGwscikpfSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4gUC5FUCh0aGlzLCIoIiwiKSIpfX0KUC5Bbi5wcm90b3R5cGU9e30KUC5OMy5wcm90b3R5cGU9
-ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJNYXBFbnRyeSgiK0guRWooSi5qKHRoaXMuYSkpKyI6ICIrSC5F
-aihKLmoodGhpcy5iKSkrIikifX0KUC5jOC5wcm90b3R5cGU9ewpnaU86ZnVuY3Rpb24oYSl7cmV0dXJu
-IFAuTWgucHJvdG90eXBlLmdpTy5jYWxsKEMuak4sdGhpcyl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJu
-dWxsIn19ClAuTWgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLk1oLCRpTWg6MSwKRE46ZnVuY3Rpb24o
-YSxiKXtyZXR1cm4gdGhpcz09PWJ9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEodGhpcyl9LAp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJJbnN0YW5jZSBvZiAnIitILkVqKEguTSh0aGlzKSkrIicifSwKZTc6
-ZnVuY3Rpb24oYSxiKXt0Lm8uYShiKQp0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxi
-LmdWbSgpKSl9LAp0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLncodGhpcyl9fQpQLlpkLnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAuUm4ucHJvdG90eXBlPXsK
-Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRo
-aXMuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCiRpQkw6MX0KUC5uMS5wcm90b3R5cGU9
-ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwCnQuSi5hKGEpCkguaChiKQpzPUouclkoYikuT1ko
-YiwiPSIpCmlmKHM9PT0tMSl7aWYoYiE9PSIiKWEuWTUoMCxQLmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEs
-ITApLCIiKX1lbHNlIGlmKHMhPT0wKXtyPUMueEIuTmooYiwwLHMpCnE9Qy54Qi55bihiLHMrMSkKcD10
-aGlzLmEKYS5ZNSgwLFAua3UociwwLHIubGVuZ3RoLHAsITApLFAua3UocSwwLHEubGVuZ3RoLHAsITAp
-KX1yZXR1cm4gYX0sCiRTOjQ0fQpQLmNTLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhyb3cg
-SC5iKFAucnIoIklsbGVnYWwgSVB2NCBhZGRyZXNzLCAiK2EsdGhpcy5hLGIpKX0sCiRTOjIxfQpQLlZD
-LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAucnIoIklsbGVnYWwgSVB2NiBh
-ZGRyZXNzLCAiK2EsdGhpcy5hLGIpKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVs
-bCl9LAokUzo0N30KUC5KVC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGItYT40
-KXRoaXMuYS4kMigiYW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4
-IGRpZ2l0cyIsYSkKcz1QLlFBKEMueEIuTmoodGhpcy5iLGEsYiksMTYpCmlmKHM8MHx8cz42NTUzNSl0
-aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZgIixh
-KQpyZXR1cm4gc30sCiRTOjUxfQpQLkRuLnByb3RvdHlwZT17CmduRDpmdW5jdGlvbigpe3ZhciBzLHIs
-cSxwLG89dGhpcwppZighby55KXtzPW8uYQpyPXMubGVuZ3RoIT09MD9zKyI6IjoiIgpxPW8uYwpwPXE9
-PW51bGwKaWYoIXB8fHM9PT0iZmlsZSIpe3M9cisiLy8iCnI9by5iCmlmKHIubGVuZ3RoIT09MClzPXMr
-cisiQCIKaWYoIXApcys9cQpyPW8uZAppZihyIT1udWxsKXM9cysiOiIrSC5FaihyKX1lbHNlIHM9cgpz
-Kz1vLmUKcj1vLmYKaWYociE9bnVsbClzPXMrIj8iK3IKcj1vLnIKaWYociE9bnVsbClzPXMrIiMiK3IK
-aWYoby55KXRocm93IEguYihILkdRKCJfdGV4dCIpKQpvLng9cy5jaGFyQ29kZUF0KDApPT0wP3M6cwpv
-Lnk9ITB9cmV0dXJuIG8ueH0sCmdGajpmdW5jdGlvbigpe3ZhciBzLHIscT10aGlzCmlmKCFxLlEpe3M9
-cS5lCmlmKHMubGVuZ3RoIT09MCYmQy54Qi5XKHMsMCk9PT00NylzPUMueEIueW4ocywxKQpyPXMubGVu
-Z3RoPT09MD9DLnhEOlAuQUYobmV3IEgubEooSC5WTShzLnNwbGl0KCIvIiksdC5zKSx0LmRPLmEoUC5Q
-SCgpKSx0LmRvKSx0Lk4pCmlmKHEuUSl0aHJvdyBILmIoSC5HUSgicGF0aFNlZ21lbnRzIikpCnEuc0tw
-KHIpCnEuUT0hMH1yZXR1cm4gcS56fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwppZighci5j
-eCl7cz1KLmhmKHIuZ25EKCkpCmlmKHIuY3gpdGhyb3cgSC5iKEguR1EoImhhc2hDb2RlIikpCnIuY2g9
-cwpyLmN4PSEwfXJldHVybiByLmNofSwKZ2hZOmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzCmlmKCFyLmRi
-KXtzPVAuV1goci5ndFAoKSkKaWYoci5kYil0aHJvdyBILmIoSC5HUSgicXVlcnlQYXJhbWV0ZXJzIikp
-CnIuc05NKG5ldyBQLkdqKHMsdC5kdykpCnIuZGI9ITB9cmV0dXJuIHIuY3l9LApna3U6ZnVuY3Rpb24o
-KXtyZXR1cm4gdGhpcy5ifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwppZihzPT1udWxsKXJl
-dHVybiIiCmlmKEMueEIubkMocywiWyIpKXJldHVybiBDLnhCLk5qKHMsMSxzLmxlbmd0aC0xKQpyZXR1
-cm4gc30sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmQKcmV0dXJuIHM9PW51bGw/UC53Syh0aGlz
-LmEpOnN9LApndFA6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmYKcmV0dXJuIHM9PW51bGw/IiI6c30sCmdL
-YTpmdW5jdGlvbigpe3ZhciBzPXRoaXMucgpyZXR1cm4gcz09bnVsbD8iIjpzfSwKbm06ZnVuY3Rpb24o
-YSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaj10aGlzCnQuYzkuYShiKQpzPWouYQpyPXM9PT0iZmls
-ZSIKcT1qLmIKcD1qLmQKbz1qLmMKaWYoIShvIT1udWxsKSlvPXEubGVuZ3RoIT09MHx8cCE9bnVsbHx8
-cj8iIjpudWxsCm49ai5lCmlmKCFyKW09byE9bnVsbCYmbi5sZW5ndGghPT0wCmVsc2UgbT0hMAppZiht
-JiYhQy54Qi5uQyhuLCIvIikpbj0iLyIrbgpsPW4Kaz1QLmxlKG51bGwsMCwwLGIpCnJldHVybiBuZXcg
-UC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4KZm9y
-KHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9MzsrK3N9cT1DLnhCLmNuKGEsIi8iKQp3aGls
-ZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBrKGEsIi8iLHEtMSkKaWYocDwwKWJyZWFr
-Cm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIuTzIoYSxwKzEpPT09NDYpbj0hbnx8Qy54
-Qi5PMihhLHArMik9PT00NgplbHNlIG49ITEKZWxzZSBuPSExCmlmKG4pYnJlYWs7LS1zCnE9cH1yZXR1
-cm4gQy54Qi5pNyhhLHErMSxudWxsLEMueEIueW4oYixyLTMqcykpfSwKWkk6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
-aj10aGlzLGk9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdjaigpKXty
-PWEuZ2t1KCkKcT1hLmdKZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aX1lbHNle3A9aQpxPXAKcj0iIn1v
-PVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOml9ZWxzZXtzPWouYQppZihhLmdjaigpKXty
-PWEuZ2t1KCkKcT1hLmdKZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTppLHMpCm89UC54ZShhLmdJ
-aShhKSkKbj1hLmdRRCgpP2EuZ3RQKCk6aX1lbHNle3I9ai5iCnE9ai5jCnA9ai5kCmlmKGEuZ0lpKGEp
-PT09IiIpe289ai5lCm49YS5nUUQoKT9hLmd0UCgpOmouZn1lbHNle2lmKGEuZ3RUKCkpbz1QLnhlKGEu
-Z0lpKGEpKQplbHNle209ai5lCmlmKG0ubGVuZ3RoPT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0w
-P2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ugbz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtsPWou
-SmgobSxhLmdJaShhKSkKaz1zLmxlbmd0aD09PTAKaWYoIWt8fHEhPW51bGx8fEMueEIubkMobSwiLyIp
-KW89UC54ZShsKQplbHNlIG89UC53RihsLCFrfHxxIT1udWxsKX19bj1hLmdRRCgpP2EuZ3RQKCk6aX19
-fXJldHVybiBuZXcgUC5EbihzLHIscSxwLG8sbixhLmdaOCgpP2EuZ0thKCk6aSl9LApnY2o6ZnVuY3Rp
-b24oKXtyZXR1cm4gdGhpcy5jIT1udWxsfSwKZ3hBOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZCE9bnVs
-bH0sCmdRRDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmYhPW51bGx9LApnWjg6ZnVuY3Rpb24oKXtyZXR1
-cm4gdGhpcy5yIT1udWxsfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0dXJuIEMueEIubkModGhpcy5lLCIvIil9
-LAp0NDpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhy
-b3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK3ErIiBVUkkiKSkK
-aWYoci5ndFAoKSE9PSIiKXRocm93IEguYihQLkw0KHUuaSkpCmlmKHIuZ0thKCkhPT0iIil0aHJvdyBI
-LmIoUC5MNCh1LmwpKQpxPSQud1EoKQppZihILm9UKHEpKXE9UC5tbihyKQplbHNle2lmKHIuYyE9bnVs
-bCYmci5nSmYocikhPT0iIilILnYoUC5MNCh1LmopKQpzPXIuZ0ZqKCkKUC5rRShzLCExKQpxPVAudmco
-Qy54Qi5uQyhyLmUsIi8iKT8iLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0KDApPT0wP3E6cX1yZXR1
-cm4gcX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETjpmdW5jdGlvbihhLGIpe3Zh
-ciBzPXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihzPT09YilyZXR1cm4hMApyZXR1cm4gdC5kRC5i
-KGIpJiZzLmE9PT1iLmdGaSgpJiZzLmMhPW51bGw9PT1iLmdjaigpJiZzLmI9PT1iLmdrdSgpJiZzLmdK
-ZihzKT09PWIuZ0pmKGIpJiZzLmd0cChzKT09PWIuZ3RwKGIpJiZzLmU9PT1iLmdJaShiKSYmcy5mIT1u
-dWxsPT09Yi5nUUQoKSYmcy5ndFAoKT09PWIuZ3RQKCkmJnMuciE9bnVsbD09PWIuZ1o4KCkmJnMuZ0th
-KCk9PT1iLmdLYSgpfSwKc0twOmZ1bmN0aW9uKGEpe3RoaXMuej10LmJrLmEoYSl9LApzTk06ZnVuY3Rp
-b24oYSl7dGhpcy5jeT10LmNaLmEoYSl9LAokaWlEOjEsCmdGaTpmdW5jdGlvbigpe3JldHVybiB0aGlz
-LmF9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZX19ClAuUloucHJvdG90eXBlPXsKJDE6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixILmgoYSksQy54TSwhMSl9LAokUzo1fQpQLk1FLnByb3Rv
-dHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5iLHI9dGhpcy5hCnMuYSs9ci5hCnIuYT0i
-JiIKcj1zLmErPUguRWooUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09
-MCl7cy5hPXIrIj0iCnMuYSs9SC5FaihQLmVQKEMuRjMsYixDLnhNLCEwKSl9fSwKJFM6MjJ9ClAueTUu
-cHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCkguaChhKQppZihiPT1udWxsfHx0eXBl
-b2YgYj09InN0cmluZyIpdGhpcy5hLiQyKGEsSC5rKGIpKQplbHNlIGZvcihzPUouSVQodC51LmEoYikp
-LHI9dGhpcy5hO3MuRigpOylyLiQyKGEsSC5oKHMuZ2woKSkpfSwKJFM6MTN9ClAuUEUucHJvdG90eXBl
-PXsKZ2xSOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzLG49bnVsbCxtPW8uYwppZihtPT1udWxs
-KXttPW8uYgppZigwPj1tLmxlbmd0aClyZXR1cm4gSC5PSChtLDApCnM9by5hCm09bVswXSsxCnI9Qy54
-Qi5YVShzLCI/IixtKQpxPXMubGVuZ3RoCmlmKHI+PTApe3A9UC5QSShzLHIrMSxxLEMuVkMsITEpCnE9
-cn1lbHNlIHA9bgptPW8uYz1uZXcgUC5xZSgiZGF0YSIsIiIsbixuLFAuUEkocyxtLHEsQy5XZCwhMSks
-cCxuKX1yZXR1cm4gbX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIKaWYoMD49ci5sZW5ndGgp
-cmV0dXJuIEguT0gociwwKQpzPXRoaXMuYQpyZXR1cm4gclswXT09PS0xPyJkYXRhOiIrczpzfX0KUC55
-SS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMuYQppZihhPj1zLmxlbmd0aCly
-ZXR1cm4gSC5PSChzLGEpCnM9c1thXQpDLk5BLmR1KHMsMCw5NixiKQpyZXR1cm4gc30sCiRTOjIzfQpQ
-LmM2LnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEKZm9yKHM9Yi5sZW5ndGgs
-cj0wO3I8czsrK3Ipe3E9Qy54Qi5XKGIscileOTYKaWYocT49OTYpcmV0dXJuIEguT0goYSxxKQphW3Fd
-PWN9fSwKJFM6MTR9ClAucWQucHJvdG90eXBlPXsKJDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscQpm
-b3Iocz1DLnhCLlcoYiwwKSxyPUMueEIuVyhiLDEpO3M8PXI7KytzKXtxPShzXjk2KT4+PjAKaWYocT49
-OTYpcmV0dXJuIEguT0goYSxxKQphW3FdPWN9fSwKJFM6MTR9ClAuVWYucHJvdG90eXBlPXsKZ2NqOmZ1
-bmN0aW9uKCl7cmV0dXJuIHRoaXMuYz4wfSwKZ3hBOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYz4wJiZ0
-aGlzLmQrMTx0aGlzLmV9LApnUUQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mPHRoaXMucn0sCmdaODpm
-dW5jdGlvbigpe3JldHVybiB0aGlzLnI8dGhpcy5hLmxlbmd0aH0sCmdOdzpmdW5jdGlvbigpe3JldHVy
-biB0aGlzLmI9PT00JiZDLnhCLm5DKHRoaXMuYSwiZmlsZSIpfSwKZ1daOmZ1bmN0aW9uKCl7cmV0dXJu
-IHRoaXMuYj09PTQmJkMueEIubkModGhpcy5hLCJodHRwIil9LApnUmU6ZnVuY3Rpb24oKXtyZXR1cm4g
-dGhpcy5iPT09NSYmQy54Qi5uQyh0aGlzLmEsImh0dHBzIil9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4g
-Qy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLngKcmV0
-dXJuIHM9PW51bGw/dGhpcy54PXRoaXMuVTIoKTpzfSwKVTI6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9
-cy5iCmlmKHI8PTApcmV0dXJuIiIKaWYocy5nV1ooKSlyZXR1cm4iaHR0cCIKaWYocy5nUmUoKSlyZXR1
-cm4iaHR0cHMiCmlmKHMuZ053KCkpcmV0dXJuImZpbGUiCmlmKHI9PT03JiZDLnhCLm5DKHMuYSwicGFj
-a2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54Qi5OaihzLmEsMCxyKX0sCmdrdTpmdW5jdGlv
-bigpe3ZhciBzPXRoaXMuYyxyPXRoaXMuYiszCnJldHVybiBzPnI/Qy54Qi5Oaih0aGlzLmEscixzLTEp
-OiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gcz4wP0MueEIuTmoodGhpcy5h
-LHMsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKHMuZ3hBKCkpcmV0dXJu
-IFAuUUEoQy54Qi5OaihzLmEscy5kKzEscy5lKSxudWxsKQppZihzLmdXWigpKXJldHVybiA4MAppZihz
-LmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIuTmoo
-dGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5mLHI9dGhpcy5y
-CnJldHVybiBzPHI/Qy54Qi5Oaih0aGlzLmEscysxLHIpOiIifSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHM9
-dGhpcy5yLHI9dGhpcy5hCnJldHVybiBzPHIubGVuZ3RoP0MueEIueW4ocixzKzEpOiIifSwKZ0ZqOmZ1
-bmN0aW9uKCl7dmFyIHMscixxPXRoaXMuZSxwPXRoaXMuZixvPXRoaXMuYQppZihDLnhCLlFpKG8sIi8i
-LHEpKSsrcQppZihxPT09cClyZXR1cm4gQy54RApzPUguVk0oW10sdC5zKQpmb3Iocj1xO3I8cDsrK3Ip
-aWYoQy54Qi5PMihvLHIpPT09NDcpe0MuTm0uaShzLEMueEIuTmoobyxxLHIpKQpxPXIrMX1DLk5tLmko
-cyxDLnhCLk5qKG8scSxwKSkKcmV0dXJuIFAuQUYocyx0Lk4pfSwKZ2hZOmZ1bmN0aW9uKCl7aWYodGhp
-cy5mPj10aGlzLnIpcmV0dXJuIEMuQ00KcmV0dXJuIG5ldyBQLkdqKFAuV1godGhpcy5ndFAoKSksdC5k
-dyl9LAprWDpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmQrMQpyZXR1cm4gcythLmxlbmd0aD09PXRoaXMu
-ZSYmQy54Qi5RaSh0aGlzLmEsYSxzKX0sCk45OmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMucixxPXMu
-YQppZihyPj1xLmxlbmd0aClyZXR1cm4gcwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihxLDAscikscy5i
-LHMuYyxzLmQscy5lLHMuZixyLHMueCl9LApubTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixt
-LGwsayxqLGk9dGhpcyxoPW51bGwKdC5jOS5hKGIpCnM9aS5nRmkoKQpyPXM9PT0iZmlsZSIKcT1pLmMK
-cD1xPjA/Qy54Qi5OaihpLmEsaS5iKzMscSk6IiIKbz1pLmd4QSgpP2kuZ3RwKGkpOmgKcT1pLmMKaWYo
-cT4wKW49Qy54Qi5OaihpLmEscSxpLmQpCmVsc2Ugbj1wLmxlbmd0aCE9PTB8fG8hPW51bGx8fHI/IiI6
-aApxPWkuYQptPUMueEIuTmoocSxpLmUsaS5mKQppZighcilsPW4hPW51bGwmJm0ubGVuZ3RoIT09MApl
-bHNlIGw9ITAKaWYobCYmIUMueEIubkMobSwiLyIpKW09Ii8iK20Kaz1QLmxlKGgsMCwwLGIpCmw9aS5y
-Cmo9bDxxLmxlbmd0aD9DLnhCLnluKHEsbCsxKTpoCnJldHVybiBuZXcgUC5EbihzLHAsbixvLG0sayxq
-KX0sClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVuY3Rpb24oYSl7
-aWYoYSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4gdGhpcy52cygp
-Lm1TKGEpfSwKdTE6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZz1iLmIK
-aWYoZz4wKXJldHVybiBiCnM9Yi5jCmlmKHM+MCl7cj1hLmIKaWYocjw9MClyZXR1cm4gYgppZihhLmdO
-dygpKXE9Yi5lIT09Yi5mCmVsc2UgaWYoYS5nV1ooKSlxPSFiLmtYKCI4MCIpCmVsc2UgcT0hYS5nUmUo
-KXx8IWIua1goIjQ0MyIpCmlmKHEpe3A9cisxCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHAp
-K0MueEIueW4oYi5hLGcrMSkscixzK3AsYi5kK3AsYi5lK3AsYi5mK3AsYi5yK3AsYS54KX1lbHNlIHJl
-dHVybiB0aGlzLnZzKCkubVMoYil9bz1iLmUKZz1iLmYKaWYobz09PWcpe3M9Yi5yCmlmKGc8cyl7cj1h
-LmYKcD1yLWcKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscikrQy54Qi55bihiLmEsZyksYS5i
-LGEuYyxhLmQsYS5lLGcrcCxzK3AsYS54KX1nPWIuYQppZihzPGcubGVuZ3RoKXtyPWEucgpyZXR1cm4g
-bmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnluKGcscyksYS5iLGEuYyxhLmQsYS5lLGEuZixz
-KyhyLXMpLGEueCl9cmV0dXJuIGEuTjkoKX1zPWIuYQppZihDLnhCLlFpKHMsIi8iLG8pKXtyPWEuZQpw
-PXItbwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnluKHMsbyksYS5iLGEuYyxh
-LmQscixnK3AsYi5yK3AsYS54KX1uPWEuZQptPWEuZgppZihuPT09bSYmYS5jPjApe2Zvcig7Qy54Qi5R
-aShzLCIuLi8iLG8pOylvKz0zCnA9bi1vKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsbikr
-Ii8iK0MueEIueW4ocyxvKSxhLmIsYS5jLGEuZCxuLGcrcCxiLnIrcCxhLngpfWw9YS5hCmZvcihrPW47
-Qy54Qi5RaShsLCIuLi8iLGspOylrKz0zCmo9MAp3aGlsZSghMCl7aT1vKzMKaWYoIShpPD1nJiZDLnhC
-LlFpKHMsIi4uLyIsbykpKWJyZWFrOysragpvPWl9Zm9yKGg9IiI7bT5rOyl7LS1tCmlmKEMueEIuTzIo
+QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZGRkZGRkZGRkZGRkZGRkZHR0dHR0dHR0dHR0dHR0dH
+SEhISEhISEhISEhISEhISEhISEhISEhISEhISUhISEpFRUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC
+QkJCQktDQ0NDQ0NDQ0NDQ0NEQ0xPTk5OTUVFRUVFRUVFRUVFIixzKSYzMQpoPWk8PTMyP3MmNjE2OTQ+
+Pj5xOihzJjYzfGg8PDYpPj4+MAppPUMueEIuVygiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBceDAwMDpYRUND
+Q0NDTnZsRGIgXHgwMDA6WEVDQ0NDQ046bERiIEFBQUFBXHgwMFx4MDBceDAwXHgwMFx4MDBBQUFBQTAw
+MDAwQUFBQUE6Ojo6OkFBQUFBR0cwMDBBQUFBQTAwS0tLQUFBQUFHOjo6OkFBQUFBOklJSUlBQUFBQTAw
+MFx4ODAwQUFBQUFceDAwXHgwMFx4MDBceDAwIEFBQUFBIixpK3EpCmlmKGk9PT0wKXtnLmErPUguTHco
+aCkKaWYoZj09PWMpYnJlYWsgJGxhYmVsMCQwCmJyZWFrfWVsc2UgaWYoKGkmMSkhPT0wKXtpZihyKXN3
+aXRjaChpKXtjYXNlIDY5OmNhc2UgNjc6Zy5hKz1ILkx3KGopCmJyZWFrCmNhc2UgNjU6Zy5hKz1ILkx3
+KGopOy0tZgpicmVhawpkZWZhdWx0OnA9Zy5hKz1ILkx3KGopCmcuYT1wK0guTHcoaikKYnJlYWt9ZWxz
+ZXtrLmI9aQprLmM9Zi0xCnJldHVybiIifWk9MH1pZihmPT09YylicmVhayAkbGFiZWwwJDAKbz1mKzEK
+aWYoZjwwfHxmPj1lKXJldHVybiBILk9IKGEsZikKcz1hW2ZdfW89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1
+cm4gSC5PSChhLGYpCnM9YVtmXQppZihzPDEyOCl7d2hpbGUoITApe2lmKCEobzxjKSl7bj1jCmJyZWFr
+fW09bysxCmlmKG88MHx8bz49ZSlyZXR1cm4gSC5PSChhLG8pCnM9YVtvXQppZihzPj0xMjgpe249bS0x
+Cm89bQpicmVha31vPW19aWYobi1mPDIwKWZvcihsPWY7bDxuOysrbCl7aWYobD49ZSlyZXR1cm4gSC5P
+SChhLGwpCmcuYSs9SC5MdyhhW2xdKX1lbHNlIGcuYSs9UC5ITShhLGYsbikKaWYobj09PWMpYnJlYWsg
+JGxhYmVsMCQwCmY9b31lbHNlIGY9b31pZihkJiZpPjMyKWlmKHIpZy5hKz1ILkx3KGopCmVsc2V7ay5i
+PTc3CmsuYz1jCnJldHVybiIifWsuYj1pCmsuYz1oCmU9Zy5hCnJldHVybiBlLmNoYXJDb2RlQXQoMCk9
+PTA/ZTplfX0KUC5XRi5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQp0LmZvLmEo
+YSkKcz10aGlzLmIKcj10aGlzLmEKcy5hKz1yLmEKcT1zLmErPUguRWooYS5hKQpzLmE9cSsiOiAiCnMu
+YSs9UC5wKGIpCnIuYT0iLCAifSwKJFM6NDJ9ClAuaVAucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxi
+KXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5pUCYmdGhpcy5hPT09Yi5h
+JiYhMH0sCmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuKHNeQy5qbi53RyhzLDMwKSkm
+MTA3Mzc0MTgyM30sCnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPVAuR3EoSC50SihzKSkscT1QLmgw
+KEguTlMocykpLHA9UC5oMChILmpBKHMpKSxvPVAuaDAoSC5JWChzKSksbj1QLmgwKEguY2gocykpLG09
+UC5oMChILkpkKHMpKSxsPVAuVngoSC5vMShzKSksaz1yKyItIitxKyItIitwKyIgIitvKyI6IituKyI6
+IittKyIuIitsCnJldHVybiBrfX0KUC5YUy5wcm90b3R5cGU9ewpnSUk6ZnVuY3Rpb24oKXtyZXR1cm4g
+SC50cyh0aGlzLiR0aHJvd25Kc0Vycm9yKX19ClAuQzYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2
+YXIgcz10aGlzLmEKaWYocyE9bnVsbClyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAocykKcmV0
+dXJuIkFzc2VydGlvbiBmYWlsZWQifX0KUC5Fei5wcm90b3R5cGU9e30KUC5GLnByb3RvdHlwZT17Cnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpmdW5j
+dGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3VtZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5j
+dGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXA9PW51
+bGw/IiI6IiAoIitwKyIpIixuPXEuZCxtPW49PW51bGw/IiI6IjogIitILkVqKG4pLGw9cS5nWigpK28r
+bQppZighcS5hKXJldHVybiBsCnM9cS5ndSgpCnI9UC5wKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQ
+LmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rp
+b24oKXt2YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgppZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVz
+cyB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihxKToiIgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3Jl
+YXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihyKQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNs
+dXNpdmUgcmFuZ2UgIitILkVqKHIpKyIuLiIrSC5FaihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVl
+IHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319
+ClAuZVkucHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApndTpmdW5j
+dGlvbigpe3ZhciBzLHI9SC51UCh0aGlzLmIpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIHIu
+SigpCmlmKHI8MClyZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIKcz10aGlzLmYKaWYo
+cz09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBi
+ZSBsZXNzIHRoYW4gIitILkVqKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZn19ClAubXAu
+cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxqPXt9LGk9
+bmV3IFAuUm4oIiIpCmouYT0iIgpzPWsuYwpmb3Iocj1zLmxlbmd0aCxxPTAscD0iIixvPSIiO3E8cjsr
+K3Esbz0iLCAiKXtuPXNbcV0KaS5hPXArbwpwPWkuYSs9UC5wKG4pCmouYT0iLCAifWsuZC5LKDAsbmV3
+IFAuV0YoaixpKSkKbT1QLnAoay5hKQpsPWkudygwKQpyPSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9k
+IG5vdCBmb3VuZDogJyIrSC5FaihrLmIuYSkrIidcblJlY2VpdmVyOiAiK20rIlxuQXJndW1lbnRzOiBb
+IitsKyJdIgpyZXR1cm4gcn19ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVW5z
+dXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihh
+KXt2YXIgcz10aGlzLmEKcmV0dXJuIHMhPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJvcjogIitzOiJVbmlt
+cGxlbWVudGVkRXJyb3IifX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJCYWQg
+c3RhdGU6ICIrdGhpcy5hfX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMu
+YQppZihzPT1udWxsKXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9u
+LiIKcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb246ICIrUC5wKHMp
+KyIuIn19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9
+LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3OmZ1
+bmN0aW9uKGEpe3JldHVybiJTdGFjayBPdmVyZmxvdyJ9LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVs
+bH0sCiRpWFM6MX0KUC5jLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVy
+biBzPT1udWxsPyJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9u
+IjoiUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrcysiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9u
+In19ClAuQ0QucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3RoaXMu
+YX0sCiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixt
+LGwsayxqLGksaCxnPXRoaXMuYSxmPWchPW51bGwmJiIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK0gu
+RWooZyk6IkZvcm1hdEV4Y2VwdGlvbiIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJp
+bmciKXtpZihlIT1udWxsKXM9ZTwwfHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihl
+PT1udWxsKXtpZihkLmxlbmd0aD43OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4i
+K2R9Zm9yKHI9MSxxPTAscD0hMSxvPTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lm
+KHEhPT1vfHwhcCkrK3IKcT1vKzEKcD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9
+cj4xP2YrKCIgKGF0IGxpbmUgIityKyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0
+IGNoYXJhY3RlciAiKyhlKzEpKyIpXG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhC
+Lk8oZCxvKQppZihuPT09MTB8fG49PT0xMyl7bT1vCmJyZWFrfX1pZihtLXE+NzgpaWYoZS1xPDc1KXts
+PXErNzUKaz1xCmo9IiIKaT0iLi4uIn1lbHNle2lmKG0tZTw3NSl7az1tLTc1Cmw9bQppPSIifWVsc2V7
+az1lLTM2Cmw9ZSszNgppPSIuLi4ifWo9Ii4uLiJ9ZWxzZXtsPW0Kaz1xCmo9IiIKaT0iIn1oPUMueEIu
+TmooZCxrLGwpCnJldHVybiBmK2oraCtpKyJcbiIrQy54Qi5UKCIgIixlLWsrai5sZW5ndGgpKyJeXG4i
+fWVsc2UgcmV0dXJuIGUhPW51bGw/ZisoIiAoYXQgb2Zmc2V0ICIrSC5FaihlKSsiKSIpOmZ9LAokaVJ6
+OjF9ClAuY1gucHJvdG90eXBlPXsKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5HSih0aGlzLEguTGgo
+dGhpcykuQygiY1guRSIpLGIpfSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0
+dXJuIEguSzEodGhpcyxzLktxKGMpLkMoIjEoY1guRSkiKS5hKGIpLHMuQygiY1guRSIpLGMpfSwKZXY6
+ZnVuY3Rpb24oYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5VNSh0aGlzLHMuQygiYTIo
+Y1guRSkiKS5hKGIpLHMuQygiVTU8Y1guRT4iKSl9LAp0dDpmdW5jdGlvbihhLGIpe3JldHVybiBQLlkx
+KHRoaXMsYixILkxoKHRoaXMpLkMoImNYLkUiKSl9LApicjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50
+dChhLCEwKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQpmb3Iocz0wO3IuRigp
+OykrK3MKcmV0dXJuIHN9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ20odGhpcykuRigpfSwK
+Z29yOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdsMCh0aGlzKX0sCmVSOmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmdyODpmdW5jdGlvbihhKXt2YXIg
+cyxyPXRoaXMuZ20odGhpcykKaWYoIXIuRigpKXRocm93IEguYihILldwKCkpCnM9ci5nbCgpCmlmKHIu
+RigpKXRocm93IEguYihILkFtKCkpCnJldHVybiBzfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQpQ
+LmsxKGIsImluZGV4IikKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7KXtxPXMuZ2woKQppZihi
+PT09cilyZXR1cm4gcTsrK3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxyKSl9LAp3
+OmZ1bmN0aW9uKGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQ
+Lk4zLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIk1hcEVudHJ5KCIrSC5FaihKLmoodGhp
+cy5hKSkrIjogIitILkVqKEouaih0aGlzLmIpKSsiKSJ9fQpQLmM4LnByb3RvdHlwZT17CmdpTzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5NaC5wcm90b3R5cGUuZ2lPLmNhbGwoQy5qTix0aGlzKX0sCnc6ZnVuY3Rp
+b24oYSl7cmV0dXJuIm51bGwifX0KUC5NaC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlAuTWgsJGlNaDox
+LApETjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzPT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4g
+SC5lUSh0aGlzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5NKHRo
+aXMpKSsiJyJ9LAplNzpmdW5jdGlvbihhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKHRoaXMsYi5n
+V2EoKSxiLmduZCgpLGIuZ1ZtKCkpKX0sCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudyh0
+aGlzKX19ClAuWmQucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iIn0sCiRpR3o6MX0KUC5S
+bi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnc6ZnVuY3Rp
+b24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKJGlCTDoxfQpQ
+Lm4xLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAKdC5KLmEoYSkKSC5oKGIp
+CnM9Si5yWShiKS5PWShiLCI9IikKaWYocz09PS0xKXtpZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIu
+bGVuZ3RoLHRoaXMuYSwhMCksIiIpfWVsc2UgaWYocyE9PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhC
+LnluKGIscysxKQpwPXRoaXMuYQphLlk1KDAsUC5rdShyLDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAs
+cS5sZW5ndGgscCwhMCkpfXJldHVybiBhfSwKJFM6NDR9ClAuY1MucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
+b24oYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY0IGFkZHJlc3MsICIrYSx0aGlzLmEsYikp
+fSwKJFM6MjF9ClAuVkMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5ycigi
+SWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJDE6ZnVuY3Rpb24oYSl7cmV0dXJu
+IHRoaXMuJDIoYSxudWxsKX0sCiRTOjQ3fQpQLkpULnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+dmFyIHMKaWYoYi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1h
+eGltdW0gb2YgNCBoZXggZGlnaXRzIixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIsYSxiKSwxNikKaWYo
+czwwfHxzPjY1NTM1KXRoaXMuYS4kMigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAw
+eDAuLjB4RkZGRmAiLGEpCnJldHVybiBzfSwKJFM6NTF9ClAuRG4ucHJvdG90eXBlPXsKZ25EOmZ1bmN0
+aW9uKCl7dmFyIHMscixxLHAsbz10aGlzCmlmKCFvLnkpe3M9by5hCnI9cy5sZW5ndGghPT0wP3MrIjoi
+OiIiCnE9by5jCnA9cT09bnVsbAppZighcHx8cz09PSJmaWxlIil7cz1yKyIvLyIKcj1vLmIKaWYoci5s
+ZW5ndGghPT0wKXM9cytyKyJAIgppZighcClzKz1xCnI9by5kCmlmKHIhPW51bGwpcz1zKyI6IitILkVq
+KHIpfWVsc2Ugcz1yCnMrPW8uZQpyPW8uZgppZihyIT1udWxsKXM9cysiPyIrcgpyPW8ucgppZihyIT1u
+dWxsKXM9cysiIyIrcgppZihvLnkpdGhyb3cgSC5iKEguR1EoIl90ZXh0IikpCm8ueD1zLmNoYXJDb2Rl
+QXQoMCk9PTA/czpzCm8ueT0hMH1yZXR1cm4gby54fSwKZ0ZqOmZ1bmN0aW9uKCl7dmFyIHMscixxPXRo
+aXMKaWYoIXEuUSl7cz1xLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09PTQ3KXM9Qy54Qi55
+bihzLDEpCnI9cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlZNKHMuc3BsaXQoIi8iKSx0
+LnMpLHQuZE8uYShQLlBIKCkpLHQuZG8pLHQuTikKaWYocS5RKXRocm93IEguYihILkdRKCJwYXRoU2Vn
+bWVudHMiKSkKcS5zS3AocikKcS5RPSEwfXJldHVybiBxLnp9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHMs
+cj10aGlzCmlmKCFyLmN4KXtzPUouaGYoci5nbkQoKSkKaWYoci5jeCl0aHJvdyBILmIoSC5HUSgiaGFz
+aENvZGUiKSkKci5jaD1zCnIuY3g9ITB9cmV0dXJuIHIuY2h9LApnaFk6ZnVuY3Rpb24oKXt2YXIgcyxy
+PXRoaXMKaWYoIXIuZGIpe3M9UC5XWChyLmd0UCgpKQppZihyLmRiKXRocm93IEguYihILkdRKCJxdWVy
+eVBhcmFtZXRlcnMiKSkKci5zTk0obmV3IFAuR2oocyx0LmR3KSkKci5kYj0hMH1yZXR1cm4gci5jeX0s
+CmdrdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5j
+CmlmKHM9PW51bGwpcmV0dXJuIiIKaWYoQy54Qi5uKHMsIlsiKSlyZXR1cm4gQy54Qi5OaihzLDEscy5s
+ZW5ndGgtMSkKcmV0dXJuIHN9LApndHA6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5kCnJldHVybiBzPT1u
+dWxsP1Aud0sodGhpcy5hKTpzfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5mCnJldHVybiBzPT1u
+dWxsPyIiOnN9LApnS2E6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLnIKcmV0dXJuIHM9PW51bGw/IiI6c30s
+Cm5tOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9dGhpcwp0LmM5LmEoYikKcz1q
+LmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5jCmlmKCEobyE9bnVsbCkpbz1xLmxlbmd0aCE9
+PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZighciltPW8hPW51bGwmJm4ubGVuZ3RoIT09MApl
+bHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0iLyIrbgpsPW4Kaz1QLmxlKG51bGwsMCwwLGIp
+CnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
+LHEscCxvLG4KZm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9MzsrK3N9cT1DLnhCLmNu
+KGEsIi8iKQp3aGlsZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBrKGEsIi8iLHEtMSkK
+aWYocDwwKWJyZWFrCm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIuTyhhLHArMSk9PT00
+NiluPSFufHxDLnhCLk8oYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKWJyZWFrOy0t
+cwpxPXB9cmV0dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLnluKGIsci0zKnMpKX0sClpJOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAs
+byxuLG0sbCxrLGo9dGhpcyxpPW51bGwKaWYoYS5nRmkoKS5sZW5ndGghPT0wKXtzPWEuZ0ZpKCkKaWYo
+YS5nY2ooKSl7cj1hLmdrdSgpCnE9YS5nSmYoYSkKcD1hLmd4QSgpP2EuZ3RwKGEpOml9ZWxzZXtwPWkK
+cT1wCnI9IiJ9bz1QLnhlKGEuZ0lpKGEpKQpuPWEuZ1FEKCk/YS5ndFAoKTppfWVsc2V7cz1qLmEKaWYo
+YS5nY2ooKSl7cj1hLmdrdSgpCnE9YS5nSmYoYSkKcD1QLndCKGEuZ3hBKCk/YS5ndHAoYSk6aSxzKQpv
+PVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOml9ZWxzZXtyPWouYgpxPWouYwpwPWouZApp
+ZihhLmdJaShhKT09PSIiKXtvPWouZQpuPWEuZ1FEKCk/YS5ndFAoKTpqLmZ9ZWxzZXtpZihhLmd0VCgp
+KW89UC54ZShhLmdJaShhKSkKZWxzZXttPWouZQppZihtLmxlbmd0aD09PTApaWYocT09bnVsbClvPXMu
+bGVuZ3RoPT09MD9hLmdJaShhKTpQLnhlKGEuZ0lpKGEpKQplbHNlIG89UC54ZSgiLyIrYS5nSWkoYSkp
+CmVsc2V7bD1qLkpoKG0sYS5nSWkoYSkpCms9cy5sZW5ndGg9PT0wCmlmKCFrfHxxIT1udWxsfHxDLnhC
+Lm4obSwiLyIpKW89UC54ZShsKQplbHNlIG89UC53RihsLCFrfHxxIT1udWxsKX19bj1hLmdRRCgpP2Eu
+Z3RQKCk6aX19fXJldHVybiBuZXcgUC5EbihzLHIscSxwLG8sbixhLmdaOCgpP2EuZ0thKCk6aSl9LApn
+Y2o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jIT1udWxsfSwKZ3hBOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
+aXMuZCE9bnVsbH0sCmdRRDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmYhPW51bGx9LApnWjg6ZnVuY3Rp
+b24oKXtyZXR1cm4gdGhpcy5yIT1udWxsfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0dXJuIEMueEIubih0aGlz
+LmUsIi8iKX0sCnQ0OmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzLHE9ci5hCmlmKHEhPT0iIiYmcSE9PSJm
+aWxlIil0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICIrcSsi
+IFVSSSIpKQppZihyLmd0UCgpIT09IiIpdGhyb3cgSC5iKFAuTDQodS5pKSkKaWYoci5nS2EoKSE9PSIi
+KXRocm93IEguYihQLkw0KHUubCkpCnE9JC53USgpCmlmKEgub1QocSkpcT1QLm1uKHIpCmVsc2V7aWYo
+ci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtFKHMsITEp
+CnE9UC52ZyhDLnhCLm4oci5lLCIvIik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNvZGVBdCgwKT09MD9x
+OnF9cmV0dXJuIHF9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmduRCgpfSwKRE46ZnVuY3Rpb24o
+YSxiKXt2YXIgcz10aGlzCmlmKGI9PW51bGwpcmV0dXJuITEKaWYocz09PWIpcmV0dXJuITAKcmV0dXJu
+IHQuZEQuYihiKSYmcy5hPT09Yi5nRmkoKSYmcy5jIT1udWxsPT09Yi5nY2ooKSYmcy5iPT09Yi5na3Uo
+KSYmcy5nSmYocyk9PT1iLmdKZihiKSYmcy5ndHAocyk9PT1iLmd0cChiKSYmcy5lPT09Yi5nSWkoYikm
+JnMuZiE9bnVsbD09PWIuZ1FEKCkmJnMuZ3RQKCk9PT1iLmd0UCgpJiZzLnIhPW51bGw9PT1iLmdaOCgp
+JiZzLmdLYSgpPT09Yi5nS2EoKX0sCnNLcDpmdW5jdGlvbihhKXt0aGlzLno9dC5iay5hKGEpfSwKc05N
+OmZ1bmN0aW9uKGEpe3RoaXMuY3k9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmk6ZnVuY3Rpb24oKXtyZXR1
+cm4gdGhpcy5hfSwKZ0lpOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmV9fQpQLlJaLnByb3RvdHlwZT17
+CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBQLmVQKEMuWkosSC5oKGEpLEMueE0sITEpfSwKJFM6NX0KUC5N
+RS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMuYixyPXRoaXMuYQpzLmErPXIu
+YQpyLmE9IiYiCnI9cy5hKz1ILkVqKFAuZVAoQy5GMyxhLEMueE0sITApKQppZihiIT1udWxsJiZiLmxl
+bmd0aCE9PTApe3MuYT1yKyI9IgpzLmErPUguRWooUC5lUChDLkYzLGIsQy54TSwhMCkpfX0sCiRTOjIy
+fQpQLnk1LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILmgoYSkKaWYoYj09bnVs
+bHx8dHlwZW9mIGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBmb3Iocz1KLklUKHQu
+dS5hKGIpKSxyPXRoaXMuYTtzLkYoKTspci4kMihhLEguaChzLmdsKCkpKX0sCiRTOjEzfQpQLlBFLnBy
+b3RvdHlwZT17CmdsUjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMKaWYo
+bT09bnVsbCl7bT1vLmIKaWYoMD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1bMF0r
+MQpyPUMueEIuWFUocywiPyIsbSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxDLlZD
+LCExKQpxPXJ9ZWxzZSBwPW4KbT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxxLEMu
+V2QsITEpLHAsbil9cmV0dXJuIG19LAp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIu
+bGVuZ3RoKXJldHVybiBILk9IKHIsMCkKcz10aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6
+c319ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEKaWYoYT49cy5s
+ZW5ndGgpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5kdShzLDAsOTYsYikKcmV0dXJuIHN9LAok
+UzoyM30KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxCmZvcihzPWIu
+bGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2KXJldHVybiBILk9IKGEs
+cSkKYVtxXT1jfX0sCiRTOjE0fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEsYixjKXt2YXIg
+cyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0oc145Nik+Pj4w
+CmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE0fQpQLlVmLnByb3RvdHlwZT17
+CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3JldHVybiB0aGlz
+LmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9
+LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6ZnVuY3Rpb24o
+KXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiZmlsZSIpfSwKZ1daOmZ1bmN0aW9uKCl7
+cmV0dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0dHAiKX0sCmdSZTpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0
+dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy54
+CnJldHVybiBzPT1udWxsP3RoaXMueD10aGlzLlUyKCk6c30sClUyOmZ1bmN0aW9uKCl7dmFyIHM9dGhp
+cyxyPXMuYgppZihyPD0wKXJldHVybiIiCmlmKHMuZ1daKCkpcmV0dXJuImh0dHAiCmlmKHMuZ1JlKCkp
+cmV0dXJuImh0dHBzIgppZihzLmdOdygpKXJldHVybiJmaWxlIgppZihyPT09NyYmQy54Qi5uKHMuYSwi
+cGFja2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54Qi5OaihzLmEsMCxyKX0sCmdrdTpmdW5j
+dGlvbigpe3ZhciBzPXRoaXMuYyxyPXRoaXMuYiszCnJldHVybiBzPnI/Qy54Qi5Oaih0aGlzLmEscixz
+LTEpOiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gcz4wP0MueEIuTmoodGhp
+cy5hLHMsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKHMuZ3hBKCkpcmV0
+dXJuIFAuUUEoQy54Qi5OaihzLmEscy5kKzEscy5lKSxudWxsKQppZihzLmdXWigpKXJldHVybiA4MApp
+ZihzLmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIu
+TmoodGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5mLHI9dGhp
+cy5yCnJldHVybiBzPHI/Qy54Qi5Oaih0aGlzLmEscysxLHIpOiIifSwKZ0thOmZ1bmN0aW9uKCl7dmFy
+IHM9dGhpcy5yLHI9dGhpcy5hCnJldHVybiBzPHIubGVuZ3RoP0MueEIueW4ocixzKzEpOiIifSwKZ0Zq
+OmZ1bmN0aW9uKCl7dmFyIHMscixxPXRoaXMuZSxwPXRoaXMuZixvPXRoaXMuYQppZihDLnhCLlFpKG8s
+Ii8iLHEpKSsrcQppZihxPT09cClyZXR1cm4gQy54RApzPUguVk0oW10sdC5zKQpmb3Iocj1xO3I8cDsr
+K3IpaWYoQy54Qi5PKG8scik9PT00Nyl7Qy5ObS5pKHMsQy54Qi5OaihvLHEscikpCnE9cisxfUMuTm0u
+aShzLEMueEIuTmoobyxxLHApKQpyZXR1cm4gUC5BRihzLHQuTil9LApnaFk6ZnVuY3Rpb24oKXtpZih0
+aGlzLmY+PXRoaXMucilyZXR1cm4gQy5DTQpyZXR1cm4gbmV3IFAuR2ooUC5XWCh0aGlzLmd0UCgpKSx0
+LmR3KX0sCmtYOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZCsxCnJldHVybiBzK2EubGVuZ3RoPT09dGhp
+cy5lJiZDLnhCLlFpKHRoaXMuYSxhLHMpfSwKTjk6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5yLHE9
+cy5hCmlmKHI+PXEubGVuZ3RoKXJldHVybiBzCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKHEsMCxyKSxz
+LmIscy5jLHMuZCxzLmUscy5mLHIscy54KX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxu
+LG0sbCxrLGosaT10aGlzLGg9bnVsbAp0LmM5LmEoYikKcz1pLmdGaSgpCnI9cz09PSJmaWxlIgpxPWku
+YwpwPXE+MD9DLnhCLk5qKGkuYSxpLmIrMyxxKToiIgpvPWkuZ3hBKCk/aS5ndHAoaSk6aApxPWkuYwpp
+ZihxPjApbj1DLnhCLk5qKGkuYSxxLGkuZCkKZWxzZSBuPXAubGVuZ3RoIT09MHx8byE9bnVsbHx8cj8i
+IjpoCnE9aS5hCm09Qy54Qi5OaihxLGkuZSxpLmYpCmlmKCFyKWw9biE9bnVsbCYmbS5sZW5ndGghPT0w
+CmVsc2UgbD0hMAppZihsJiYhQy54Qi5uKG0sIi8iKSltPSIvIittCms9UC5sZShoLDAsMCxiKQpsPWku
+cgpqPWw8cS5sZW5ndGg/Qy54Qi55bihxLGwrMSk6aApyZXR1cm4gbmV3IFAuRG4ocyxwLG4sbyxtLGss
+ail9LApaSTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tUyhQLmhLKGEpKX0sCm1TOmZ1bmN0aW9uKGEp
+e2lmKGEgaW5zdGFuY2VvZiBQLlVmKXJldHVybiB0aGlzLnUxKHRoaXMsYSkKcmV0dXJuIHRoaXMudnMo
+KS5tUyhhKX0sCnUxOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9Yi5i
+CmlmKGc+MClyZXR1cm4gYgpzPWIuYwppZihzPjApe3I9YS5iCmlmKHI8PTApcmV0dXJuIGIKaWYoYS5n
+TncoKSlxPWIuZSE9PWIuZgplbHNlIGlmKGEuZ1daKCkpcT0hYi5rWCgiODAiKQplbHNlIHE9IWEuZ1Jl
+KCl8fCFiLmtYKCI0NDMiKQppZihxKXtwPXIrMQpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxw
+KStDLnhCLnluKGIuYSxnKzEpLHIscytwLGIuZCtwLGIuZStwLGIuZitwLGIucitwLGEueCl9ZWxzZSBy
+ZXR1cm4gdGhpcy52cygpLm1TKGIpfW89Yi5lCmc9Yi5mCmlmKG89PT1nKXtzPWIucgppZihnPHMpe3I9
+YS5mCnA9ci1nCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYi5hLGcpLGEu
+YixhLmMsYS5kLGEuZSxnK3AscytwLGEueCl9Zz1iLmEKaWYoczxnLmxlbmd0aCl7cj1hLnIKcmV0dXJu
+IG5ldyBQLlVmKEMueEIuTmooYS5hLDAscikrQy54Qi55bihnLHMpLGEuYixhLmMsYS5kLGEuZSxhLmYs
+cysoci1zKSxhLngpfXJldHVybiBhLk45KCl9cz1iLmEKaWYoQy54Qi5RaShzLCIvIixvKSl7cj1hLmUK
+cD1yLW8KcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscikrQy54Qi55bihzLG8pLGEuYixhLmMs
+YS5kLHIsZytwLGIucitwLGEueCl9bj1hLmUKbT1hLmYKaWYobj09PW0mJmEuYz4wKXtmb3IoO0MueEIu
+UWkocywiLi4vIixvKTspbys9MwpwPW4tbysxCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLG4p
+KyIvIitDLnhCLnluKHMsbyksYS5iLGEuYyxhLmQsbixnK3AsYi5yK3AsYS54KX1sPWEuYQpmb3Ioaz1u
+O0MueEIuUWkobCwiLi4vIixrKTspays9MwpqPTAKd2hpbGUoITApe2k9byszCmlmKCEoaTw9ZyYmQy54
+Qi5RaShzLCIuLi8iLG8pKSlicmVhazsrK2oKbz1pfWZvcihoPSIiO20+azspey0tbQppZihDLnhCLk8o
bCxtKT09PTQ3KXtpZihqPT09MCl7aD0iLyIKYnJlYWt9LS1qCmg9Ii8ifX1pZihtPT09ayYmYS5iPD0w
JiYhQy54Qi5RaShsLCIvIixuKSl7by09aiozCmg9IiJ9cD1tLW8raC5sZW5ndGgKcmV0dXJuIG5ldyBQ
LlVmKEMueEIuTmoobCwwLG0pK2grQy54Qi55bihzLG8pLGEuYixhLmMsYS5kLG4sZytwLGIucitwLGEu
@@ -10540,7 +10540,7 @@
PXMuaW1wbGVtZW50YXRpb24Kci50b1N0cmluZwpyPUMubUguRGMociwiIikKJC54bz1yCiQuQk89ci5j
cmVhdGVSYW5nZSgpCnI9JC54by5jcmVhdGVFbGVtZW50KCJiYXNlIikKdC5jUi5hKHIpCnM9cy5iYXNl
VVJJCnMudG9TdHJpbmcKci5ocmVmPXMKJC54by5oZWFkLmFwcGVuZENoaWxkKHIpfXM9JC54bwppZihz
-LmJvZHk9PW51bGwpe3I9cy5jcmVhdGVFbGVtZW50KCJib2R5IikKQy5CWi5zWEcocyx0LnAuYShyKSl9
+LmJvZHk9PW51bGwpe3I9cy5jcmVhdGVFbGVtZW50KCJib2R5IikKQy5CWi5zR1Mocyx0LnAuYShyKSl9
cz0kLnhvCmlmKHQucC5iKGEpKXtzPXMuYm9keQpzLnRvU3RyaW5nCnE9c31lbHNle3MudG9TdHJpbmcK
cT1zLmNyZWF0ZUVsZW1lbnQoYS50YWdOYW1lKQokLnhvLmJvZHkuYXBwZW5kQ2hpbGQocSl9aWYoImNy
ZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSYmIUMuTm0udGco
@@ -10561,7 +10561,7 @@
dmVudExpc3RlbmVyKGIsSC50Uih0LmJ3LmEoYyksMSksZCl9LAokaUQwOjF9ClcuaEgucHJvdG90eXBl
PXskaWhIOjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0K
Vy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLlZiLnByb3Rv
-dHlwZT17CnNYRzpmdW5jdGlvbihhLGIpe2EuYm9keT1ifX0KVy5mSi5wcm90b3R5cGU9ewplbzpmdW5j
+dHlwZT17CnNHUzpmdW5jdGlvbihhLGIpe2EuYm9keT1ifX0KVy5mSi5wcm90b3R5cGU9ewplbzpmdW5j
dGlvbihhLGIsYyxkKXtyZXR1cm4gYS5vcGVuKGIsYywhMCl9LAokaWZKOjF9Clcud2EucHJvdG90eXBl
PXt9ClcuU2cucHJvdG90eXBlPXskaVNnOjF9ClcudzcucHJvdG90eXBlPXsKZ0RyOmZ1bmN0aW9uKGEp
e2lmKCJvcmlnaW4iIGluIGEpcmV0dXJuIGEub3JpZ2luCnJldHVybiBILkVqKGEucHJvdG9jb2wpKyIv
@@ -10657,148 +10657,148 @@
bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8KZm9yKHM9YS5sZW5ndGgscj0wLHE9IiI7cjxzOysrcil7cD1h
W3JdCm89cC50b0xvd2VyQ2FzZSgpCnE9KHAhPT1vJiZyPjA/cSsiLSI6cSkrb31yZXR1cm4gcS5jaGFy
Q29kZUF0KDApPT0wP3E6cX19ClcuS1MucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtpZihKLnJZ
-KGEpLm5DKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS54cShDLnhCLnluKGEsNSkpLGIpfSwKJFM6
-MTV9ClcuQTMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtpZihKLnJZKGEpLm5DKGEsImRhdGEt
-IikpQy5ObS5pKHRoaXMuYix0aGlzLmEueHEoQy54Qi55bihhLDUpKSl9LAokUzoxNX0KVy5JNC5wcm90
-b3R5cGU9ewpEOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz1QLkxzKHQuTikKZm9yKHM9dGhpcy5hLmNs
-YXNzTmFtZS5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihw
-Lmxlbmd0aCE9PTApby5pKDAscCl9cmV0dXJuIG99LApYOmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05h
-bWU9dC5DLmEoYSkuaygwLCIgIil9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlz
-dC5sZW5ndGh9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoPT09
-MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGghPT0wfSwKVjE6
-ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT0iIn0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhp
-cy5hLmNsYXNzTGlzdC5jb250YWlucyhiKQpyZXR1cm4gc30sCmk6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
-CkguaChiKQpzPXRoaXMuYS5jbGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIpCnMuYWRkKGIpCnJldHVybiFy
-fSwKbjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9dGhpcy5h
-LmNsYXNzTGlzdApyPXMuY29udGFpbnMoYikKcy5yZW1vdmUoYikKcT1yfWVsc2UgcT0hMQpyZXR1cm4g
-cX0sCkZWOmZ1bmN0aW9uKGEsYil7Vy5UTih0aGlzLmEsdC5RLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9
-e30KVy5STy5wcm90b3R5cGU9e30KVy5ldS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52
-Ti5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLiQxKHQuQi5hKGEpKX0sCiRT
-OjI3fQpXLkpRLnByb3RvdHlwZT17CkNZOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKCQub3IuYT09PTApe2Zv
-cihzPTA7czwyNjI7KytzKSQub3IuWTUoMCxDLmNtW3NdLFcucFMoKSkKZm9yKHM9MDtzPDEyOysrcykk
-Lm9yLlk1KDAsQy5CSVtzXSxXLlY0KCkpfX0sCmkwOmZ1bmN0aW9uKGEpe3JldHVybiAkLkFOKCkudGco
-MCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz0kLm9yLnEoMCxILkVqKFcuclMoYSkp
-KyI6OiIrYikKaWYocz09bnVsbClzPSQub3IucSgwLCIqOjoiK2IpCmlmKHM9PW51bGwpcmV0dXJuITEK
-cmV0dXJuIEgueTgocy4kNChhLGIsYyx0aGlzKSl9LAokaWtGOjF9ClcuR20ucHJvdG90eXBlPXsKZ206
-ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLlc5KGEsdGhpcy5nQShhKSxILnooYSkuQygiVzk8R20uRT4i
-KSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxu
-ZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBX
-LkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJu
-IHQuRS5hKGEpLmkwKHRoaXMuYSl9LAokUzoxNn0KVy5FZy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gdC5FLmEoYSkuRWIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MTZ9ClcubTYucHJv
-dG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCnRoaXMuYS5GVigwLGMpCnM9Yi5l
-digwLG5ldyBXLkVvKCkpCnI9Yi5ldigwLG5ldyBXLldrKCkpCnRoaXMuYi5GVigwLHMpCnE9dGhpcy5j
-CnEuRlYoMCxDLnhEKQpxLkZWKDAscil9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAs
-Vy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9dGhpcyxyPVcuclMoYSkscT1zLmMKaWYo
-cS50ZygwLEguRWoocikrIjo6IitiKSlyZXR1cm4gcy5kLkR0KGMpCmVsc2UgaWYocS50ZygwLCIqOjoi
-K2IpKXJldHVybiBzLmQuRHQoYykKZWxzZXtxPXMuYgppZihxLnRnKDAsSC5FaihyKSsiOjoiK2IpKXJl
-dHVybiEwCmVsc2UgaWYocS50ZygwLCIqOjoiK2IpKXJldHVybiEwCmVsc2UgaWYocS50ZygwLEguRWoo
-cikrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYocS50ZygwLCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9
-LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5C
-SSxILmgoYSkpfSwKJFM6Nn0KVy5Xay5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5O
-bS50ZyhDLkJJLEguaChhKSl9LAokUzo2fQpXLmN0LnByb3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixj
-KXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihiPT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVy
-biEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIpPT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIp
-CnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6
-OiIrSC5FaihILmgoYSkpfSwKJFM6NX0KVy5Pdy5wcm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXt2YXIg
-cwppZih0LmV3LmIoYSkpcmV0dXJuITEKcz10Lmc3LmIoYSkKaWYocyYmVy5yUyhhKT09PSJmb3JlaWdu
-T2JqZWN0IilyZXR1cm4hMQppZihzKXJldHVybiEwCnJldHVybiExfSwKRWI6ZnVuY3Rpb24oYSxiLGMp
-e2lmKGI9PT0iaXMifHxDLnhCLm5DKGIsIm9uIikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAok
-aWtGOjF9ClcuVzkucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLmMrMSxxPXMu
-YgppZihyPHEpe3Muc3AoSi54OShzLmEscikpCnMuYz1yCnJldHVybiEwfXMuc3AobnVsbCkKcy5jPXEK
-cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApzcDpmdW5jdGlvbihhKXt0aGlz
-LmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpXLmRXLnByb3RvdHlwZT17JGlEMDoxLCRp
-djY6MX0KVy5tay5wcm90b3R5cGU9eyRpeTA6MX0KVy5Lby5wcm90b3R5cGU9ewpQbjpmdW5jdGlvbihh
-KXt2YXIgcz10aGlzLHI9bmV3IFcuZm0ocykKcy5iPSExCnIuJDIoYSxudWxsKQpmb3IoO3MuYjspe3Mu
-Yj0hMQpyLiQyKGEsbnVsbCl9fSwKRVA6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmI9ITAKaWYoYiE9
-bnVsbD9iIT09YS5wYXJlbnROb2RlOnMpSi5MdChhKQplbHNlIGIucmVtb3ZlQ2hpbGQoYSl9LApJNDpm
-dW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbj0hMCxtPW51bGwsbD1udWxsCnRyeXttPUouaWcoYSkK
-bD1tLmEuZ2V0QXR0cmlidXRlKCJpcyIpCnQuaC5hKGEpCnM9ZnVuY3Rpb24oYyl7aWYoIShjLmF0dHJp
-YnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVlCmlmKGMuaWQ9PSdsYXN0Q2hp
-bGQnfHxjLm5hbWU9PSdsYXN0Q2hpbGQnfHxjLmlkPT0ncHJldmlvdXNTaWJsaW5nJ3x8Yy5uYW1lPT0n
-cHJldmlvdXNTaWJsaW5nJ3x8Yy5pZD09J2NoaWxkcmVuJ3x8Yy5uYW1lPT0nY2hpbGRyZW4nKXJldHVy
-biB0cnVlCnZhciBrPWMuY2hpbGROb2RlcwppZihjLmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1rW2su
-bGVuZ3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3RhbmNl
-b2YgSFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRy
-dWUKdmFyIGo9MAppZihjLmNoaWxkcmVuKWo9Yy5jaGlsZHJlbi5sZW5ndGgKZm9yKHZhciBpPTA7aTxq
-O2krKyl7dmFyIGg9Yy5jaGlsZHJlbltpXQppZihoLmlkPT0nYXR0cmlidXRlcyd8fGgubmFtZT09J2F0
-dHJpYnV0ZXMnfHxoLmlkPT0nbGFzdENoaWxkJ3x8aC5uYW1lPT0nbGFzdENoaWxkJ3x8aC5pZD09J3By
-ZXZpb3VzU2libGluZyd8fGgubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGguaWQ9PSdjaGlsZHJlbid8
-fGgubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KGEpCm49SC5vVChzKT8h
-MDohKGEuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCl9Y2F0Y2gocCl7SC5SdShwKX1y
-PSJlbGVtZW50IHVucHJpbnRhYmxlIgp0cnl7cj1KLmooYSl9Y2F0Y2gocCl7SC5SdShwKX10cnl7cT1X
-LnJTKGEpCnRoaXMua1IodC5oLmEoYSksYixuLHIscSx0LmYuYShtKSxILmsobCkpfWNhdGNoKHApe2lm
-KEguUnUocCkgaW5zdGFuY2VvZiBQLnUpdGhyb3cgcAplbHNle3RoaXMuRVAoYSxiKQp3aW5kb3cKbz0i
-UmVtb3ZpbmcgY29ycnVwdGVkIGVsZW1lbnQgIitILkVqKHIpCmlmKHR5cGVvZiBjb25zb2xlIT0idW5k
-ZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKG8pfX19LAprUjpmdW5jdGlvbihhLGIsYyxkLGUsZixn
-KXt2YXIgcyxyLHEscCxvLG4sbT10aGlzCmlmKGMpe20uRVAoYSxiKQp3aW5kb3cKcz0iUmVtb3Zpbmcg
-ZWxlbWVudCBkdWUgdG8gY29ycnVwdGVkIGF0dHJpYnV0ZXMgb24gPCIrZCsiPiIKaWYodHlwZW9mIGNv
-bnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufWlmKCFtLmEuaTAo
-YSkpe20uRVAoYSxiKQp3aW5kb3cKcz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBlbGVtZW50IDwiK0guRWoo
-ZSkrIj4gZnJvbSAiK0guRWooYikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5j
-b25zb2xlLndhcm4ocykKcmV0dXJufWlmKGchPW51bGwpaWYoIW0uYS5FYihhLCJpcyIsZykpe20uRVAo
-YSxiKQp3aW5kb3cKcz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCB0eXBlIGV4dGVuc2lvbiA8IitILkVqKGUp
-KycgaXM9IicrZysnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29s
-ZS53YXJuKHMpCnJldHVybn1zPWYuZ3ZjKCkKcj1ILlZNKHMuc2xpY2UoMCksSC50NihzKSkKZm9yKHE9
-Zi5ndmMoKS5sZW5ndGgtMSxzPWYuYTtxPj0wOy0tcSl7aWYocT49ci5sZW5ndGgpcmV0dXJuIEguT0go
-cixxKQpwPXJbcV0Kbz1tLmEKbj1KLmNIKHApCkguaChwKQppZighby5FYihhLG4scy5nZXRBdHRyaWJ1
-dGUocCkpKXt3aW5kb3cKbz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRyaWJ1dGUgPCIrSC5FaihlKSsi
-ICIrcCsnPSInK0guRWoocy5nZXRBdHRyaWJ1dGUocCkpKyciPicKaWYodHlwZW9mIGNvbnNvbGUhPSJ1
-bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4obykKcy5yZW1vdmVBdHRyaWJ1dGUocCl9fWlmKHQu
-YVcuYihhKSl7cz1hLmNvbnRlbnQKcy50b1N0cmluZwptLlBuKHMpfX0sCiRpb246MX0KVy5mbS5wcm90
-b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMuYQpzd2l0Y2goYS5u
-b2RlVHlwZSl7Y2FzZSAxOm0uSTQoYSxiKQpicmVhawpjYXNlIDg6Y2FzZSAxMTpjYXNlIDM6Y2FzZSA0
-OmJyZWFrCmRlZmF1bHQ6bS5FUChhLGIpfXM9YS5sYXN0Q2hpbGQKZm9yKHE9dC5BO251bGwhPXM7KXty
-PW51bGwKdHJ5e3I9cy5wcmV2aW91c1NpYmxpbmcKaWYociE9bnVsbCl7cD1yLm5leHRTaWJsaW5nCm89
-cwpvPXA9PW51bGw/byE9bnVsbDpwIT09bwpwPW99ZWxzZSBwPSExCmlmKHApe3A9UC5QVigiQ29ycnVw
-dCBIVE1MIikKdGhyb3cgSC5iKHApfX1jYXRjaChuKXtILlJ1KG4pCnA9cS5hKHMpCm0uYj0hMApvPXAu
-cGFyZW50Tm9kZQpvPWE9PW51bGw/byE9bnVsbDphIT09bwppZihvKXtvPXAucGFyZW50Tm9kZQppZihv
-IT1udWxsKW8ucmVtb3ZlQ2hpbGQocCl9ZWxzZSBhLnJlbW92ZUNoaWxkKHApCnM9bnVsbApyPWEubGFz
-dENoaWxkfWlmKHMhPW51bGwpdGhpcy4kMihzLGEpCnM9cn19LAokUzozMH0KVy5MZS5wcm90b3R5cGU9
-e30KVy5LNy5wcm90b3R5cGU9e30KVy5yQi5wcm90b3R5cGU9e30KVy5YVy5wcm90b3R5cGU9e30KVy5v
-YS5wcm90b3R5cGU9e30KUC5pSi5wcm90b3R5cGU9ewpWSDpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMu
-YSxxPXIubGVuZ3RoCmZvcihzPTA7czxxOysrcylpZihyW3NdPT09YSlyZXR1cm4gcwpDLk5tLmkocixh
-KQpDLk5tLmkodGhpcy5iLG51bGwpCnJldHVybiBxfSwKUHY6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9
-dGhpcyxvPXt9CmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoSC5sKGEpKXJldHVybiBhCmlmKHR5cGVvZiBh
-PT0ibnVtYmVyIilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYSBpbnN0
-YW5jZW9mIFAuaVApcmV0dXJuIG5ldyBEYXRlKGEuYSkKaWYodC5mdi5iKGEpKXRocm93IEguYihQLlNZ
-KCJzdHJ1Y3R1cmVkIGNsb25lIG9mIFJlZ0V4cCIpKQppZih0LmM4LmIoYSkpcmV0dXJuIGEKaWYodC53
-LmIoYSkpcmV0dXJuIGEKaWYodC5JLmIoYSkpcmV0dXJuIGEKcz10LmRFLmIoYSl8fCExCmlmKHMpcmV0
-dXJuIGEKaWYodC5mLmIoYSkpe3I9cC5WSChhKQpzPXAuYgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5P
-SChzLHIpCnE9by5hPXNbcl0KaWYocSE9bnVsbClyZXR1cm4gcQpxPXt9Cm8uYT1xCkMuTm0uWTUocyxy
-LHEpCmEuSygwLG5ldyBQLmpnKG8scCkpCnJldHVybiBvLmF9aWYodC5qLmIoYSkpe3I9cC5WSChhKQpv
-PXAuYgppZihyPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLHIpCnE9b1tyXQppZihxIT1udWxsKXJldHVy
-biBxCnJldHVybiBwLmVrKGEscil9aWYodC5lSC5iKGEpKXtyPXAuVkgoYSkKcz1wLmIKaWYocj49cy5s
-ZW5ndGgpcmV0dXJuIEguT0gocyxyKQpxPW8uYj1zW3JdCmlmKHEhPW51bGwpcmV0dXJuIHEKcT17fQpv
-LmI9cQpDLk5tLlk1KHMscixxKQpwLmltKGEsbmV3IFAuVGEobyxwKSkKcmV0dXJuIG8uYn10aHJvdyBI
-LmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBvdGhlciB0eXBlIikpfSwKZWs6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyPUouVTYoYSkscT1yLmdBKGEpLHA9bmV3IEFycmF5KHEpCkMuTm0uWTUodGhpcy5iLGIs
-cCkKZm9yKHM9MDtzPHE7KytzKUMuTm0uWTUocCxzLHRoaXMuUHYoci5xKGEscykpKQpyZXR1cm4gcH19
-ClAuamcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLmIuUHYoYil9
-LAokUzozMX0KUC5UYS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5iW2FdPXRoaXMu
-Yi5QdihiKX0sCiRTOjE3fQpQLkJmLnByb3RvdHlwZT17CmltOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
-LHAKdC5iOC5hKGIpCmZvcihzPU9iamVjdC5rZXlzKGEpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9
-c1txXQpiLiQyKHAsYVtwXSl9fX0KUC5Bcy5wcm90b3R5cGU9ewpWOmZ1bmN0aW9uKGEpe3ZhciBzCkgu
-aChhKQpzPSQuaEcoKS5iCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnYoSC50TChhKSkKaWYocy50ZXN0
-KGEpKXJldHVybiBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFsaWQgY2xhc3MgdG9r
-ZW4iKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtOmZ1bmN0aW9u
-KGEpe3ZhciBzPXRoaXMuRCgpCnJldHVybiBQLnJqKHMscy5yLEguTGgocykuYyl9LApnbDA6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMuRCgpLmE9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQo
-KS5hIT09MH0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQoKS5hfSwKdGc6ZnVuY3Rpb24oYSxi
-KXt0aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMK
-SC5oKGIpCnRoaXMuVihiKQpzPXRoaXMuTyhuZXcgUC5HRShiKSkKcmV0dXJuIEgueTgocz09bnVsbD8h
-MTpzKX0sCm46ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4h
-MQp0aGlzLlYoYikKcz10aGlzLkQoKQpyPXMubigwLGIpCnRoaXMuWChzKQpyZXR1cm4gcn0sCkZWOmZ1
-bmN0aW9uKGEsYil7dGhpcy5PKG5ldyBQLk43KHRoaXMsdC5RLmEoYikpKX0sCmVSOmZ1bmN0aW9uKGEs
-Yil7dmFyIHM9dGhpcy5EKCkKcmV0dXJuIEguYksocyxiLEguTGgocykuQygibGYuRSIpKX0sCkU6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5EKCkuRSgwLGIpfSwKVjE6ZnVuY3Rpb24oYSl7dGhpcy5PKG5l
-dyBQLnVRKCkpfSwKTzpmdW5jdGlvbihhKXt2YXIgcyxyCnQuYlUuYShhKQpzPXRoaXMuRCgpCnI9YS4k
-MShzKQp0aGlzLlgocykKcmV0dXJuIHJ9fQpQLkdFLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0LkMuYShhKS5pKDAsdGhpcy5hKX0sCiRTOjMzfQpQLk43LnByb3RvdHlwZT17CiQxOmZ1bmN0
-aW9uKGEpe3ZhciBzPXRoaXMuYixyPUgudDYocykKcmV0dXJuIHQuQy5hKGEpLkZWKDAsbmV3IEgubEoo
-cyxyLkMoInFVKDEpIikuYSh0aGlzLmEuZ3VNKCkpLHIuQygibEo8MSxxVT4iKSkpfSwKJFM6MTh9ClAu
-dVEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5DLmEoYSkKaWYoYS5hPjApe2EuYj1hLmM9YS5k
-PWEuZT1hLmY9bnVsbAphLmE9MAphLkdZKCl9cmV0dXJuIG51bGx9LAokUzoxOH0KUC5oRi5wcm90b3R5
+KGEpLm4oYSwiZGF0YS0iKSl0aGlzLmIuJDIodGhpcy5hLnhxKEMueEIueW4oYSw1KSksYil9LAokUzox
+NX0KVy5BMy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIp
+KUMuTm0uaSh0aGlzLmIsdGhpcy5hLnhxKEMueEIueW4oYSw1KSkpfSwKJFM6MTV9ClcuSTQucHJvdG90
+eXBlPXsKRDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89UC5Mcyh0Lk4pCmZvcihzPXRoaXMuYS5jbGFz
+c05hbWUuc3BsaXQoIiAiKSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPUouVDAoc1txXSkKaWYocC5s
+ZW5ndGghPT0wKW8uaSgwLHApfXJldHVybiBvfSwKWDpmdW5jdGlvbihhKXt0aGlzLmEuY2xhc3NOYW1l
+PXQuQy5hKGEpLmsoMCwiICIpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3Qu
+bGVuZ3RofSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aD09PTB9
+LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoIT09MH0sClYxOmZ1
+bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMu
+YS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJuIHN9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpI
+LmgoYikKcz10aGlzLmEuY2xhc3NMaXN0CnI9cy5jb250YWlucyhiKQpzLmFkZChiKQpyZXR1cm4hcn0s
+ClI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPXRoaXMuYS5j
+bGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIpCnMucmVtb3ZlKGIpCnE9cn1lbHNlIHE9ITEKcmV0dXJuIHF9
+LApGVjpmdW5jdGlvbihhLGIpe1cuVE4odGhpcy5hLHQuUS5hKGIpKX19ClcuRmsucHJvdG90eXBlPXt9
+ClcuUk8ucHJvdG90eXBlPXt9ClcuZXUucHJvdG90eXBlPXt9ClcueEMucHJvdG90eXBlPXt9Clcudk4u
+cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS4kMSh0LkIuYShhKSl9LAokUzoy
+N30KVy5KUS5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhKXt2YXIgcwppZigkLm9yLmE9PT0wKXtmb3Io
+cz0wO3M8MjYyOysrcykkLm9yLlk1KDAsQy5jbVtzXSxXLnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5v
+ci5ZNSgwLEMuQklbc10sVy5WNCgpKX19LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gJC5BTigpLnRnKDAs
+Vy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9JC5vci5xKDAsSC5FaihXLnJTKGEpKSsi
+OjoiK2IpCmlmKHM9PW51bGwpcz0kLm9yLnEoMCwiKjo6IitiKQppZihzPT1udWxsKXJldHVybiExCnJl
+dHVybiBILnk4KHMuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17CmdtOmZ1
+bmN0aW9uKGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56KGEpLkMoIlc5PEdtLkU+Iikp
+fX0KVy52RC5wcm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3
+IFcuVXYoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5F
+ZyhhLGIsYykpfSwKJGlrRjoxfQpXLlV2LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0
+LkUuYShhKS5pMCh0aGlzLmEpfSwKJFM6MTZ9ClcuRWcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHQuRS5hKGEpLkViKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjE2fQpXLm02LnByb3Rv
+dHlwZT17CkNZOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQp0aGlzLmEuRlYoMCxjKQpzPWIuZXYo
+MCxuZXcgVy5FbygpKQpyPWIuZXYoMCxuZXcgVy5XaygpKQp0aGlzLmIuRlYoMCxzKQpxPXRoaXMuYwpx
+LkZWKDAsQy54RCkKcS5GVigwLHIpfSwKaTA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS50ZygwLFcu
+clMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPXRoaXMscj1XLnJTKGEpLHE9cy5jCmlmKHEu
+dGcoMCxILkVqKHIpKyI6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNlIGlmKHEudGcoMCwiKjo6Iiti
+KSlyZXR1cm4gcy5kLkR0KGMpCmVsc2V7cT1zLmIKaWYocS50ZygwLEguRWoocikrIjo6IitiKSlyZXR1
+cm4hMAplbHNlIGlmKHEudGcoMCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCxILkVqKHIp
+KyI6OioiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwK
+JGlrRjoxfQpXLkVvLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiFDLk5tLnRnKEMuQkks
+SC5oKGEpKX0sCiRTOjZ9ClcuV2sucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEMuTm0u
+dGcoQy5CSSxILmgoYSkpfSwKJFM6Nn0KVy5jdC5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7
+aWYodGhpcy5qRihhLGIsYykpcmV0dXJuITAKaWYoYj09PSJ0ZW1wbGF0ZSImJmM9PT0iIilyZXR1cm4h
+MAppZihhLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUiKT09PSIiKXJldHVybiB0aGlzLmUudGcoMCxiKQpy
+ZXR1cm4hMX19ClcuSUEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIlRFTVBMQVRFOjoi
+K0guRWooSC5oKGEpKX0sCiRTOjV9ClcuT3cucHJvdG90eXBlPXsKaTA6ZnVuY3Rpb24oYSl7dmFyIHMK
+aWYodC5ldy5iKGEpKXJldHVybiExCnM9dC5nNy5iKGEpCmlmKHMmJlcuclMoYSk9PT0iZm9yZWlnbk9i
+amVjdCIpcmV0dXJuITEKaWYocylyZXR1cm4hMApyZXR1cm4hMX0sCkViOmZ1bmN0aW9uKGEsYixjKXtp
+ZihiPT09ImlzInx8Qy54Qi5uKGIsIm9uIikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAokaWtG
+OjF9ClcuVzkucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLmMrMSxxPXMuYgpp
+ZihyPHEpe3Muc3AoSi54OShzLmEscikpCnMuYz1yCnJldHVybiEwfXMuc3AobnVsbCkKcy5jPXEKcmV0
+dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApzcDpmdW5jdGlvbihhKXt0aGlzLmQ9
+dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpXLmRXLnByb3RvdHlwZT17JGlEMDoxLCRpdjY6
+MX0KVy5tay5wcm90b3R5cGU9eyRpeTA6MX0KVy5Lby5wcm90b3R5cGU9ewpQbjpmdW5jdGlvbihhKXt2
+YXIgcz10aGlzLHI9bmV3IFcuZm0ocykKcy5iPSExCnIuJDIoYSxudWxsKQpmb3IoO3MuYjspe3MuYj0h
+MQpyLiQyKGEsbnVsbCl9fSwKRVA6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmI9ITAKaWYoYiE9bnVs
+bD9iIT09YS5wYXJlbnROb2RlOnMpSi5MdChhKQplbHNlIGIucmVtb3ZlQ2hpbGQoYSl9LApJNDpmdW5j
+dGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbj0hMCxtPW51bGwsbD1udWxsCnRyeXttPUouaWcoYSkKbD1t
+LmEuZ2V0QXR0cmlidXRlKCJpcyIpCnQuaC5hKGEpCnM9ZnVuY3Rpb24oYyl7aWYoIShjLmF0dHJpYnV0
+ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVlCmlmKGMuaWQ9PSdsYXN0Q2hpbGQn
+fHxjLm5hbWU9PSdsYXN0Q2hpbGQnfHxjLmlkPT0ncHJldmlvdXNTaWJsaW5nJ3x8Yy5uYW1lPT0ncHJl
+dmlvdXNTaWJsaW5nJ3x8Yy5pZD09J2NoaWxkcmVuJ3x8Yy5uYW1lPT0nY2hpbGRyZW4nKXJldHVybiB0
+cnVlCnZhciBrPWMuY2hpbGROb2RlcwppZihjLmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1rW2subGVu
+Z3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3RhbmNlb2Yg
+SFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRydWUK
+dmFyIGo9MAppZihjLmNoaWxkcmVuKWo9Yy5jaGlsZHJlbi5sZW5ndGgKZm9yKHZhciBpPTA7aTxqO2kr
+Kyl7dmFyIGg9Yy5jaGlsZHJlbltpXQppZihoLmlkPT0nYXR0cmlidXRlcyd8fGgubmFtZT09J2F0dHJp
+YnV0ZXMnfHxoLmlkPT0nbGFzdENoaWxkJ3x8aC5uYW1lPT0nbGFzdENoaWxkJ3x8aC5pZD09J3ByZXZp
+b3VzU2libGluZyd8fGgubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGguaWQ9PSdjaGlsZHJlbid8fGgu
+bmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KGEpCm49SC5vVChzKT8hMDoh
+KGEuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCl9Y2F0Y2gocCl7SC5SdShwKX1yPSJl
+bGVtZW50IHVucHJpbnRhYmxlIgp0cnl7cj1KLmooYSl9Y2F0Y2gocCl7SC5SdShwKX10cnl7cT1XLnJT
+KGEpCnRoaXMua1IodC5oLmEoYSksYixuLHIscSx0LmYuYShtKSxILmsobCkpfWNhdGNoKHApe2lmKEgu
+UnUocCkgaW5zdGFuY2VvZiBQLnUpdGhyb3cgcAplbHNle3RoaXMuRVAoYSxiKQp3aW5kb3cKbz0iUmVt
+b3ZpbmcgY29ycnVwdGVkIGVsZW1lbnQgIitILkVqKHIpCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZp
+bmVkIil3aW5kb3cuY29uc29sZS53YXJuKG8pfX19LAprUjpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2
+YXIgcyxyLHEscCxvLG4sbT10aGlzCmlmKGMpe20uRVAoYSxiKQp3aW5kb3cKcz0iUmVtb3ZpbmcgZWxl
+bWVudCBkdWUgdG8gY29ycnVwdGVkIGF0dHJpYnV0ZXMgb24gPCIrZCsiPiIKaWYodHlwZW9mIGNvbnNv
+bGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufWlmKCFtLmEuaTAoYSkp
+e20uRVAoYSxiKQp3aW5kb3cKcz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBlbGVtZW50IDwiK0guRWooZSkr
+Ij4gZnJvbSAiK0guRWooYikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25z
+b2xlLndhcm4ocykKcmV0dXJufWlmKGchPW51bGwpaWYoIW0uYS5FYihhLCJpcyIsZykpe20uRVAoYSxi
+KQp3aW5kb3cKcz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCB0eXBlIGV4dGVuc2lvbiA8IitILkVqKGUpKycg
+aXM9IicrZysnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53
+YXJuKHMpCnJldHVybn1zPWYuZ3ZjKCkKcj1ILlZNKHMuc2xpY2UoMCksSC50NihzKSkKZm9yKHE9Zi5n
+dmMoKS5sZW5ndGgtMSxzPWYuYTtxPj0wOy0tcSl7aWYocT49ci5sZW5ndGgpcmV0dXJuIEguT0gocixx
+KQpwPXJbcV0Kbz1tLmEKbj1KLmNIKHApCkguaChwKQppZighby5FYihhLG4scy5nZXRBdHRyaWJ1dGUo
+cCkpKXt3aW5kb3cKbz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRyaWJ1dGUgPCIrSC5FaihlKSsiICIr
+cCsnPSInK0guRWoocy5nZXRBdHRyaWJ1dGUocCkpKyciPicKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRl
+ZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4obykKcy5yZW1vdmVBdHRyaWJ1dGUocCl9fWlmKHQuYVcu
+YihhKSl7cz1hLmNvbnRlbnQKcy50b1N0cmluZwptLlBuKHMpfX0sCiRpb246MX0KVy5mbS5wcm90b3R5
+cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMuYQpzd2l0Y2goYS5ub2Rl
+VHlwZSl7Y2FzZSAxOm0uSTQoYSxiKQpicmVhawpjYXNlIDg6Y2FzZSAxMTpjYXNlIDM6Y2FzZSA0OmJy
+ZWFrCmRlZmF1bHQ6bS5FUChhLGIpfXM9YS5sYXN0Q2hpbGQKZm9yKHE9dC5BO251bGwhPXM7KXtyPW51
+bGwKdHJ5e3I9cy5wcmV2aW91c1NpYmxpbmcKaWYociE9bnVsbCl7cD1yLm5leHRTaWJsaW5nCm89cwpv
+PXA9PW51bGw/byE9bnVsbDpwIT09bwpwPW99ZWxzZSBwPSExCmlmKHApe3A9UC5QVigiQ29ycnVwdCBI
+VE1MIikKdGhyb3cgSC5iKHApfX1jYXRjaChuKXtILlJ1KG4pCnA9cS5hKHMpCm0uYj0hMApvPXAucGFy
+ZW50Tm9kZQpvPWE9PW51bGw/byE9bnVsbDphIT09bwppZihvKXtvPXAucGFyZW50Tm9kZQppZihvIT1u
+dWxsKW8ucmVtb3ZlQ2hpbGQocCl9ZWxzZSBhLnJlbW92ZUNoaWxkKHApCnM9bnVsbApyPWEubGFzdENo
+aWxkfWlmKHMhPW51bGwpdGhpcy4kMihzLGEpCnM9cn19LAokUzozMH0KVy5MZS5wcm90b3R5cGU9e30K
+Vy5LNy5wcm90b3R5cGU9e30KVy5yQi5wcm90b3R5cGU9e30KVy5YVy5wcm90b3R5cGU9e30KVy5vYS5w
+cm90b3R5cGU9e30KUC5pSi5wcm90b3R5cGU9ewpWSDpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuYSxx
+PXIubGVuZ3RoCmZvcihzPTA7czxxOysrcylpZihyW3NdPT09YSlyZXR1cm4gcwpDLk5tLmkocixhKQpD
+Lk5tLmkodGhpcy5iLG51bGwpCnJldHVybiBxfSwKUHY6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9dGhp
+cyxvPXt9CmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoSC5sKGEpKXJldHVybiBhCmlmKHR5cGVvZiBhPT0i
+bnVtYmVyIilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYSBpbnN0YW5j
+ZW9mIFAuaVApcmV0dXJuIG5ldyBEYXRlKGEuYSkKaWYodC5mdi5iKGEpKXRocm93IEguYihQLlNZKCJz
+dHJ1Y3R1cmVkIGNsb25lIG9mIFJlZ0V4cCIpKQppZih0LmM4LmIoYSkpcmV0dXJuIGEKaWYodC53LmIo
+YSkpcmV0dXJuIGEKaWYodC5JLmIoYSkpcmV0dXJuIGEKcz10LmRFLmIoYSl8fCExCmlmKHMpcmV0dXJu
+IGEKaWYodC5mLmIoYSkpe3I9cC5WSChhKQpzPXAuYgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChz
+LHIpCnE9by5hPXNbcl0KaWYocSE9bnVsbClyZXR1cm4gcQpxPXt9Cm8uYT1xCkMuTm0uWTUocyxyLHEp
+CmEuSygwLG5ldyBQLmpnKG8scCkpCnJldHVybiBvLmF9aWYodC5qLmIoYSkpe3I9cC5WSChhKQpvPXAu
+YgppZihyPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLHIpCnE9b1tyXQppZihxIT1udWxsKXJldHVybiBx
+CnJldHVybiBwLmVrKGEscil9aWYodC5lSC5iKGEpKXtyPXAuVkgoYSkKcz1wLmIKaWYocj49cy5sZW5n
+dGgpcmV0dXJuIEguT0gocyxyKQpxPW8uYj1zW3JdCmlmKHEhPW51bGwpcmV0dXJuIHEKcT17fQpvLmI9
+cQpDLk5tLlk1KHMscixxKQpwLmltKGEsbmV3IFAuVGEobyxwKSkKcmV0dXJuIG8uYn10aHJvdyBILmIo
+UC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBvdGhlciB0eXBlIikpfSwKZWs6ZnVuY3Rpb24oYSxiKXt2
+YXIgcyxyPUouVTYoYSkscT1yLmdBKGEpLHA9bmV3IEFycmF5KHEpCkMuTm0uWTUodGhpcy5iLGIscCkK
+Zm9yKHM9MDtzPHE7KytzKUMuTm0uWTUocCxzLHRoaXMuUHYoci5xKGEscykpKQpyZXR1cm4gcH19ClAu
+amcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLmIuUHYoYil9LAok
+UzozMX0KUC5UYS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5iW2FdPXRoaXMuYi5Q
+dihiKX0sCiRTOjE3fQpQLkJmLnByb3RvdHlwZT17CmltOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAK
+dC5iOC5hKGIpCmZvcihzPU9iamVjdC5rZXlzKGEpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9c1tx
+XQpiLiQyKHAsYVtwXSl9fX0KUC5Bcy5wcm90b3R5cGU9ewpWOmZ1bmN0aW9uKGEpe3ZhciBzCkguaChh
+KQpzPSQuaEcoKS5iCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnYoSC50TChhKSkKaWYocy50ZXN0KGEp
+KXJldHVybiBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFsaWQgY2xhc3MgdG9rZW4i
+KSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtOmZ1bmN0aW9uKGEp
+e3ZhciBzPXRoaXMuRCgpCnJldHVybiBQLnJqKHMscy5yLEguTGgocykuYyl9LApnbDA6ZnVuY3Rpb24o
+YSl7cmV0dXJuIHRoaXMuRCgpLmE9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQoKS5h
+IT09MH0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQoKS5hfSwKdGc6ZnVuY3Rpb24oYSxiKXt0
+aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMKSC5o
+KGIpCnRoaXMuVihiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnk4KHM9PW51bGw/ITE6
+cyl9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuITEK
+dGhpcy5WKGIpCnM9dGhpcy5EKCkKcj1zLlIoMCxiKQp0aGlzLlgocykKcmV0dXJuIHJ9LApGVjpmdW5j
+dGlvbihhLGIpe3RoaXMuT1MobmV3IFAuTjcodGhpcyx0LlEuYShiKSkpfSwKZVI6ZnVuY3Rpb24oYSxi
+KXt2YXIgcz10aGlzLkQoKQpyZXR1cm4gSC5iSyhzLGIsSC5MaChzKS5DKCJsZi5FIikpfSwKRTpmdW5j
+dGlvbihhLGIpe3JldHVybiB0aGlzLkQoKS5FKDAsYil9LApWMTpmdW5jdGlvbihhKXt0aGlzLk9TKG5l
+dyBQLnVRKCkpfSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHMscgp0LmJVLmEoYSkKcz10aGlzLkQoKQpyPWEu
+JDEocykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXty
+ZXR1cm4gdC5DLmEoYSkuaSgwLHRoaXMuYSl9LAokUzozM30KUC5ONy5wcm90b3R5cGU9ewokMTpmdW5j
+dGlvbihhKXt2YXIgcz10aGlzLmIscj1ILnQ2KHMpCnJldHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxK
+KHMsci5DKCJxVSgxKSIpLmEodGhpcy5hLmd1TSgpKSxyLkMoImxKPDEscVU+IikpKX0sCiRTOjE4fQpQ
+LnVRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3QuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEu
+ZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0dXJuIG51bGx9LAokUzoxOH0KUC5oRi5wcm90b3R5
cGU9eyRpaEY6MX0KUC5QQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0LlkuYShhKQpz
PWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5w
cm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0ocywkLncoKSxh
@@ -10931,8 +10931,8 @@
TC5HNyhzLHIscSwhMSxudWxsKQplbHNle0wuQkUocyxCLndSKCksITApCkwuQlgoIiZuYnNwOyIsbnVs
bCl9fSwKJFM6MTl9CkwuV3gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9ImNv
bGxhcHNlZCIKdC5PLmEoYSkKcz10aGlzLmEKcj1KLllFKHMpCnE9dGhpcy5iCmlmKCFyLmdQKHMpLnRn
-KDAscCkpe3IuZ1AocykuaSgwLHApCkouZFIocSkuaSgwLHApfWVsc2V7ci5nUChzKS5uKDAscCkKSi5k
-UihxKS5uKDAscCl9fSwKJFM6MX0KTC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz1K
+KDAscCkpe3IuZ1AocykuaSgwLHApCkouZFIocSkuaSgwLHApfWVsc2V7ci5nUChzKS5SKDAscCkKSi5k
+UihxKS5SKDAscCl9fSwKJFM6MX0KTC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz1K
LnFGKHQuZy5hKGEpKSxyPXMuJHRpLHE9ci5DKCJ+KDEpPyIpLmEobmV3IEwuZE4odGhpcy5hKSkKdC5a
LmEobnVsbCkKVy5KRShzLmEscy5iLHEsITEsci5jKX0sCiRTOjN9CkwuZE4ucHJvdG90eXBlPXsKJDE6
ZnVuY3Rpb24oYSl7cmV0dXJuIEwudDIodC5PLmEoYSksdGhpcy5hKX0sCiRTOjd9CkwuSG8ucHJvdG90
@@ -10959,7 +10959,7 @@
LmEsdGhpcy5iKX0sCiRTOjJ9CkwuVlMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscj0i
c2VsZWN0ZWQtZmlsZSIKdC5nLmEoYSkKYS50b1N0cmluZwpzPUouWUUoYSkKaWYoYS5nZXRBdHRyaWJ1
dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhhKSkuT1UoIm5hbWUiKSk9PT10aGlzLmEuYSlzLmdQ
-KGEpLmkoMCxyKQplbHNlIHMuZ1AoYSkubigwLHIpfSwKJFM6M30KTC5URC5wcm90b3R5cGU9ewokMTpm
+KGEpLmkoMCxyKQplbHNlIHMuZ1AoYSkuUigwLHIpfSwKJFM6M30KTC5URC5wcm90b3R5cGU9ewokMTpm
dW5jdGlvbihhKXt2YXIgcyxyCnQuTy5hKGEpCnM9dGhpcy5hCnN3aXRjaChzLmdMKCkpe2Nhc2UgQy5j
dzpicmVhawpjYXNlIEMuV0Q6cy5uRygpCmJyZWFrCmNhc2UgQy5YajpzLmMyKCkKYnJlYWsKY2FzZSBD
LmRjOnMuYzIoKQpicmVha31yPXRoaXMuYgpMLmhsKHIscykKTC54bih0aGlzLmMscykKTC5BUihyLHMp
@@ -11026,798 +11026,798 @@
LnRvU3RyaW5nCnM9dGhpcy5hCnI9cy5ZcihhKQppZihyIT09MCl7aWYocz09PSQuS2soKSlmb3IocT0w
O3E8cjsrK3EpaWYoQy54Qi5XKGEscSk9PT00NylyZXR1cm4hMApwPXIKbz00N31lbHNle3A9MApvPW51
bGx9Zm9yKG49bmV3IEgucWooYSkuYSxtPW4ubGVuZ3RoLHE9cCxsPW51bGw7cTxtOysrcSxsPW8sbz1r
-KXtrPUMueEIuTzIobixxKQppZihzLnI0KGspKXtpZihzPT09JC5LaygpJiZrPT09NDcpcmV0dXJuITAK
-aWYobyE9bnVsbCYmcy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpaj1sPT1udWxsfHxsPT09NDZ8fHMu
-cjQobCkKZWxzZSBqPSExCmlmKGopcmV0dXJuITB9fWlmKG89PW51bGwpcmV0dXJuITAKaWYocy5yNChv
-KSlyZXR1cm4hMAppZihvPT09NDYpcz1sPT1udWxsfHxzLnI0KGwpfHxsPT09NDYKZWxzZSBzPSExCmlm
-KHMpcmV0dXJuITAKcmV0dXJuITF9LApIUDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9
-dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5Z
-cihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEpCmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1s
-LldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4wKXRocm93IEguYihYLkk3KGsrSC5FaihhKSsn
-IiBmcm9tICInK0guRWooYikrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpxPVguQ0woYSxzKQpxLnJS
-KCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApCnA9Si5S
-TShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIuYgpvPXEuYgppZihwIT1v
-KXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYocClyZXR1cm4gcS53KDAp
-CndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZAptPW4ubGVuZ3RoCmlmKG0h
-PT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0pcmV0dXJuIEguT0gobiww
-KQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZighcClicmVhawpDLk5tLlc0
-KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0KHEuZSwxKX1wPXIuZApv
-PXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1KLlJNKHBbMF0sIi4u
-Iil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaytILkVqKGEpKyciIGZyb20gIicrSC5Faihi
-KSsnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgsIi4uIiwhMSxwKSkKQy5O
-bS5ZNShxLmUsMCwiIikKQy5ObS5VRyhxLmUsMSxQLk84KHIuZC5sZW5ndGgscy5nbUkoKSwhMSxwKSkK
-cz1xLmQKcD1zLmxlbmd0aAppZihwPT09MClyZXR1cm4iLiIKaWYocD4xJiZKLlJNKEMuTm0uZ3JaKHMp
-LCIuIikpe3M9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUK
-aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQppZigwPj1zLmxlbmd0aClyZXR1
-cm4gSC5PSChzLC0xKQpzLnBvcCgpCkMuTm0uaShzLCIiKX1xLmI9IiIKcS5JeCgpCnJldHVybiBxLnco
-MCl9fQpNLnE3LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBILmgoYSkhPT0iIn0sCiRT
-OjZ9Ck0uTm8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7SC5rKGEpCnJldHVybiBhPT1udWxsPyJu
-dWxsIjonIicrYSsnIid9LAokUzo1MH0KQi5mdi5wcm90b3R5cGU9ewp4WjpmdW5jdGlvbihhKXt2YXIg
-cyxyPXRoaXMuWXIoYSkKaWYocj4wKXJldHVybiBKLmxkKGEsMCxyKQppZih0aGlzLmhLKGEpKXtpZigw
-Pj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLDApCnM9YVswXX1lbHNlIHM9bnVsbApyZXR1cm4gc30sCk5j
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PWJ9fQpYLldELnByb3RvdHlwZT17Ckl4OmZ1bmN0aW9uKCl7
-dmFyIHMscixxPXRoaXMKd2hpbGUoITApe3M9cS5kCmlmKCEocy5sZW5ndGghPT0wJiZKLlJNKEMuTm0u
-Z3JaKHMpLCIiKSkpYnJlYWsKcz1xLmQKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5w
-b3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpfXM9cS5lCnI9
-cy5sZW5ndGgKaWYociE9PTApQy5ObS5ZNShzLHItMSwiIil9LApyUjpmdW5jdGlvbigpe3ZhciBzLHIs
-cSxwLG8sbixtPXRoaXMsbD1ILlZNKFtdLHQucykKZm9yKHM9bS5kLHI9cy5sZW5ndGgscT0wLHA9MDtw
-PHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyksKytwKXtvPXNbcF0Kbj1KLmlhKG8pCmlm
-KCEobi5ETihvLCIuIil8fG4uRE4obywiIikpKWlmKG4uRE4obywiLi4iKSl7bj1sLmxlbmd0aAppZihu
-IT09MCl7aWYoMD49bilyZXR1cm4gSC5PSChsLC0xKQpsLnBvcCgpfWVsc2UgKytxfWVsc2UgQy5ObS5p
-KGwsbyl9aWYobS5iPT1udWxsKUMuTm0uVUcobCwwLFAuTzgocSwiLi4iLCExLHQuTikpCmlmKGwubGVu
-Z3RoPT09MCYmbS5iPT1udWxsKUMuTm0uaShsLCIuIikKbS5zbkoobCkKcz1tLmEKbS5zUGgoUC5POChs
-Lmxlbmd0aCsxLHMuZ21JKCksITAsdC5OKSkKcj1tLmIKaWYocj09bnVsbHx8bC5sZW5ndGg9PT0wfHwh
-cy5kcyhyKSlDLk5tLlk1KG0uZSwwLCIiKQpyPW0uYgppZihyIT1udWxsJiZzPT09JC5LaygpKXtyLnRv
-U3RyaW5nCm0uYj1ILnlzKHIsIi8iLCJcXCIpfW0uSXgoKX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscixx
-PXRoaXMscD1xLmIKcD1wIT1udWxsP3A6IiIKZm9yKHM9MDtzPHEuZC5sZW5ndGg7KytzKXtyPXEuZQpp
-ZihzPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHMpCnI9cCtILkVqKHJbc10pCnA9cS5kCmlmKHM+PXAu
-bGVuZ3RoKXJldHVybiBILk9IKHAscykKcD1yK0guRWoocFtzXSl9cCs9SC5FaihDLk5tLmdyWihxLmUp
-KQpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCnNuSjpmdW5jdGlvbihhKXt0aGlzLmQ9dC5E
-LmEoYSl9LApzUGg6ZnVuY3Rpb24oYSl7dGhpcy5lPXQuRC5hKGEpfX0KWC5kdi5wcm90b3R5cGU9ewp3
-OmZ1bmN0aW9uKGEpe3JldHVybiJQYXRoRXhjZXB0aW9uOiAiK3RoaXMuYX0sCiRpUno6MX0KTy56TC5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdvYyh0aGlzKX19CkUuT0YucHJvdG90
-eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7
-cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCnJldHVybiBzIT09MCYm
-Qy54Qi5PMihhLHMtMSkhPT00N30sClNwOmZ1bmN0aW9uKGEsYil7aWYoYS5sZW5ndGghPT0wJiZDLnhC
-LlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-U3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4hMX0sCmdvYzpmdW5jdGlvbigpe3JldHVybiJw
-b3NpeCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlwZT17ClVkOmZ1bmN0
-aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09NDd9
-LApkczpmdW5jdGlvbihhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQppZihDLnhCLk8y
-KGEscy0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09
-c30sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz1hLmxlbmd0aAppZihvPT09MClyZXR1cm4g
-MAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcihzPTA7czxvOysrcyl7cj1DLnhCLlcoYSxz
-KQppZihyPT09NDcpcmV0dXJuIDAKaWYocj09PTU4KXtpZihzPT09MClyZXR1cm4gMApxPUMueEIuWFUo
-YSwiLyIsQy54Qi5RaShhLCIvLyIscysxKT9zKzM6cykKaWYocTw9MClyZXR1cm4gbwppZighYnx8bzxx
-KzMpcmV0dXJuIHEKaWYoIUMueEIubkMoYSwiZmlsZTovLyIpKXJldHVybiBxCmlmKCFCLll1KGEscSsx
-KSlyZXR1cm4gcQpwPXErMwpyZXR1cm4gbz09PXA/cDpxKzR9fXJldHVybiAwfSwKWXI6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGghPT0w
-JiZDLnhCLlcoYSwwKT09PTQ3fSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuInVybCJ9LApnbUk6ZnVuY3Rp
-b24oKXtyZXR1cm4iLyJ9fQpMLklWLnByb3RvdHlwZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhC
-LnRnKGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09NDd8fGE9PT05Mn0sCmRzOmZ1bmN0
-aW9uKGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM9PT0wKXJldHVybiExCnM9Qy54Qi5PMihhLHMtMSkKcmV0
-dXJuIShzPT09NDd8fHM9PT05Mil9LApTcDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1hLmxlbmd0aApp
-ZihxPT09MClyZXR1cm4gMApzPUMueEIuVyhhLDApCmlmKHM9PT00NylyZXR1cm4gMQppZihzPT09OTIp
-e2lmKHE8Mnx8Qy54Qi5XKGEsMSkhPT05MilyZXR1cm4gMQpyPUMueEIuWFUoYSwiXFwiLDIpCmlmKHI+
-MCl7cj1DLnhCLlhVKGEsIlxcIixyKzEpCmlmKHI+MClyZXR1cm4gcn1yZXR1cm4gcX1pZihxPDMpcmV0
-dXJuIDAKaWYoIUIuT1MocykpcmV0dXJuIDAKaWYoQy54Qi5XKGEsMSkhPT01OClyZXR1cm4gMApxPUMu
-eEIuVyhhLDIpCmlmKCEocT09PTQ3fHxxPT09OTIpKXJldHVybiAwCnJldHVybiAzfSwKWXI6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5Zcihh
-KT09PTF9LApPdDpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGE9PT1iKXJldHVybiEwCmlmKGE9PT00Nyly
-ZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3CmlmKChhXmIpIT09MzIpcmV0dXJuITEK
-cz1hfDMyCnJldHVybiBzPj05NyYmczw9MTIyfSwKTmM6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKaWYo
-YT09YilyZXR1cm4hMApzPWEubGVuZ3RoCmlmKHMhPT1iLmxlbmd0aClyZXR1cm4hMQpmb3Iocj1KLnJZ
-KGIpLHE9MDtxPHM7KytxKWlmKCF0aGlzLk90KEMueEIuVyhhLHEpLHIuVyhiLHEpKSlyZXR1cm4hMQpy
-ZXR1cm4hMH0sCmdvYzpmdW5jdGlvbigpe3JldHVybiJ3aW5kb3dzIn0sCmdtSTpmdW5jdGlvbigpe3Jl
-dHVybiJcXCJ9fTsoZnVuY3Rpb24gYWxpYXNlcygpe3ZhciBzPUouR3YucHJvdG90eXBlCnMuVT1zLncK
-cy5Taj1zLmU3CnM9Si5NRi5wcm90b3R5cGUKcy50PXMudwpzPVAuY1gucHJvdG90eXBlCnMuR0c9cy5l
-dgpzPVAuTWgucHJvdG90eXBlCnMueGI9cy53CnM9Vy5jdi5wcm90b3R5cGUKcy5EVz1zLnI2CnM9Vy5t
-Ni5wcm90b3R5cGUKcy5qRj1zLkViCnM9UC5FNC5wcm90b3R5cGUKcy5Vcj1zLnEKcy5lND1zLlk1CnM9
-UC5jby5wcm90b3R5cGUKcy5iaD1zLlk1fSkoKTsoZnVuY3Rpb24gaW5zdGFsbFRlYXJPZmZzKCl7dmFy
-IHM9aHVua0hlbHBlcnMuX3N0YXRpY18xLHI9aHVua0hlbHBlcnMuX3N0YXRpY18wLHE9aHVua0hlbHBl
-cnMuaW5zdGFsbEluc3RhbmNlVGVhck9mZixwPWh1bmtIZWxwZXJzLmluc3RhbGxTdGF0aWNUZWFyT2Zm
-LG89aHVua0hlbHBlcnMuX2luc3RhbmNlXzF1CnMoUCwiRVgiLCJaViIsOCkKcyhQLCJ5dCIsIm9BIiw4
-KQpzKFAsInFXIiwiQnoiLDgpCnIoUCwiVUkiLCJlTiIsMCkKcShQLlBmLnByb3RvdHlwZSwiZ1lKIiww
-LDEsbnVsbCxbIiQyIiwiJDEiXSxbIncwIiwicG0iXSwyOCwwKQpzKFAsIkN5IiwiTkMiLDQpCnMoUCwi
-UEgiLCJNdCIsNSkKcChXLCJwUyIsNCxudWxsLFsiJDQiXSxbInFEIl0sOSwwKQpwKFcsIlY0Iiw0LG51
-bGwsWyIkNCJdLFsiUVciXSw5LDApCm8oUC5Bcy5wcm90b3R5cGUsImd1TSIsIlYiLDUpCnMoUCwiaUci
-LCJ3WSIsNTMpCnMoUCwidzAiLCJkVSIsMzYpCnMoTCwiaVMiLCJpNiIsNyl9KSgpOyhmdW5jdGlvbiBp
-bmhlcml0YW5jZSgpe3ZhciBzPWh1bmtIZWxwZXJzLm1peGluLHI9aHVua0hlbHBlcnMuaW5oZXJpdCxx
-PWh1bmtIZWxwZXJzLmluaGVyaXRNYW55CnIoUC5NaCxudWxsKQpxKFAuTWgsW0guRkssSi5HdixKLm0x
-LFAuY1gsSC5FNyxQLlhTLFAublksSC5hNyxQLkFuLEguRnUsSC5KQixILlNVLEguUmUsSC53dixQLlBu
-LEguV1UsSC5MSSxILlRwLEguZjksSC50ZSxILmJxLEguWE8sSC5rcixQLllrLEgudmgsSC5ONixILlZS
-LEguRUssSC5QYixILnRRLEguU2QsSC5KYyxILkcsSC5sWSxQLlczLFAuaWgsUC5GeSxQLkdWLFAuUGYs
-UC5GZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5wUixQLmJuLFAubG0s
-UC5sRCxQLktQLFAubGYsUC5XWSxQLlVrLFAuU2gsUC5SdyxQLmJ6LFAuaVAsUC5rNSxQLktZLFAuQ0Qs
-UC5hRSxQLk4zLFAuYzgsUC5aZCxQLlJuLFAuRG4sUC5QRSxQLlVmLFcuaWQsVy5GayxXLkpRLFcuR20s
-Vy52RCxXLm02LFcuT3csVy5XOSxXLmRXLFcubWssVy5LbyxQLmlKLFAuRTQsTS5INyxVLkxMLFUuZDIs
-VS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5tUSxMLlhBLEwuRDgsTC5POSxMLkdiLE0ubEks
-Ty56TCxYLldELFguZHZdKQpxKEouR3YsW0oueUUsSi53ZSxKLk1GLEouamQsSi5xSSxKLkRyLEguRVQs
-Vy5EMCxXLkF6LFcuTGUsVy5OaCxXLmFlLFcuSUIsVy5uNyxXLmVhLFcuYnIsVy5TZyxXLnc3LFcuSzcs
-Vy5YVyxQLmhGXSkKcShKLk1GLFtKLmlDLEoua2QsSi5jNV0pCnIoSi5QbyxKLmpkKQpxKEoucUksW0ou
-YlUsSi5WQV0pCnEoUC5jWCxbSC5CUixILmJRLEguaTEsSC5VNSxILkFNLEgudTYsSC5YUixQLm1XLEgu
-dW5dKQpxKEguQlIsW0guWnksSC5RQ10pCnIoSC5vbCxILlp5KQpyKEguVXEsSC5RQykKcihILmpWLEgu
-VXEpCnEoUC5YUyxbSC5uLEgucjMsSC5HTSxQLkV6LEguYXosSC52VixILkVxLFAuQzYsSC5rUyxQLlVk
-LFAuRixQLnUsUC5tcCxQLnViLFAuZHMsUC5saixQLlVWLFAuY10pCnIoUC51eSxQLm5ZKQpxKFAudXks
-W0gudzIsVy53eixXLmU3XSkKcihILnFqLEgudzIpCnEoSC5iUSxbSC5hTCxILk1CLEguaTVdKQpxKEgu
-YUwsW0gubkgsSC5sSixQLmk4XSkKcihILnh5LEguaTEpCnEoUC5BbixbSC5NSCxILlNPLEguVTFdKQpy
-KEguZDUsSC5BTSkKcihQLlJVLFAuUG4pCnIoUC5HaixQLlJVKQpyKEguUEQsUC5HaikKcihILkxQLEgu
-V1UpCnEoSC5UcCxbSC5DaixILmxjLEguZEMsSC53TixILlZYLFAudGgsUC5oYSxQLlZzLFAuRnQsUC55
-SCxQLldNLFAuU1gsUC5HcyxQLmRhLFAub1EsUC5wVixQLlU3LFAudnIsUC5ydCxQLktGLFAuWkwsUC5S
-VCxQLmpaLFAucnEsUC5SVyxQLkI1LFAudU8sUC5wSyxQLmhqLFAuVnAsUC5PUixQLnJhLFAueVEsUC54
-cixQLk56LFAudGksUC5XRixQLm4xLFAuY1MsUC5WQyxQLkpULFAuUlosUC5NRSxQLnk1LFAueUksUC5j
-NixQLnFkLFcuQ3YsVy5LUyxXLkEzLFcudk4sVy5VdixXLkVnLFcuRW8sVy5XayxXLklBLFcuZm0sUC5q
-ZyxQLlRhLFAuR0UsUC5ONyxQLnVRLFAuUEMsUC5tdCxQLlFTLFAubnAsUC5VdCxVLk1ELFUuYU4sVS5i
-MCxMLmUsTC5WVyxMLm9aLEwuanIsTC5xbCxMLkhpLEwuQlQsTC5QWSxMLnU4LEwuTCxMLld4LEwuQU8s
-TC5kTixMLkhvLEwueHosTC5JQyxMLmZDLEwublQsTC5OWSxMLnVlLEwuZVgsTC5FRSxMLlFMLEwuVlMs
-TC5URCxMLklmLEwudEIsTC5tMixNLnE3LE0uTm9dKQpyKEguVzAsUC5FeikKcShILmxjLFtILnp4LEgu
-clRdKQpyKEgua1ksUC5DNikKcihQLmlsLFAuWWspCnEoUC5pbCxbSC5ONSxQLnV3LFcuY2YsVy5TeV0p
-CnEoUC5tVyxbSC5LVyxQLnE0XSkKcihILkxaLEguRVQpCnEoSC5MWixbSC5SRyxILldCXSkKcihILlZQ
-LEguUkcpCnIoSC5EZyxILlZQKQpyKEguWkcsSC5XQikKcihILlBnLEguWkcpCnEoSC5QZyxbSC54aixI
-LmRFLEguWkEsSC5kVCxILlBxLEguZUUsSC5WNl0pCnIoSC5pTSxILmtTKQpyKFAuWmYsUC5QZikKcihQ
-LkppLFAubTApCnIoUC5YdixQLnBSKQpyKFAuYjYsUC5YdikKcihQLlZqLFAuV1kpCnEoUC5VayxbUC5D
-VixQLlppLFAuYnldKQpyKFAud0ksUC5rVCkKcShQLndJLFtQLlU4LFAub2osUC5NeCxQLkUzLFAuR1ld
-KQpyKFAuSzgsUC5VZCkKcihQLnR1LFAuU2gpCnIoUC51NSxQLlppKQpxKFAudSxbUC5iSixQLmVZXSkK
-cihQLnFlLFAuRG4pCnEoVy5EMCxbVy51SCxXLndhLFcuSzUsVy5DbV0pCnEoVy51SCxbVy5jdixXLm54
-LFcuUUYsVy5DUV0pCnEoVy5jdixbVy5xRSxQLmhpXSkKcShXLnFFLFtXLkdoLFcuZlksVy5uQixXLlFQ
-LFcuaDQsVy5TTixXLmxwLFcuVGIsVy5JdixXLldQLFcueVldKQpyKFcub0osVy5MZSkKcihXLmhILFcu
-QXopCnIoVy5WYixXLlFGKQpyKFcuZkosVy53YSkKcShXLmVhLFtXLnc2LFcuZXddKQpyKFcuQWosVy53
-NikKcihXLnJCLFcuSzcpCnIoVy5CSCxXLnJCKQpyKFcudzQsVy5JQikKcihXLm9hLFcuWFcpCnIoVy5y
-aCxXLm9hKQpyKFcuaTcsVy5jZikKcihQLkFzLFAuVmopCnEoUC5BcyxbVy5JNCxQLktlXSkKcihXLlJP
-LFAucWgpCnIoVy5ldSxXLlJPKQpyKFcueEMsUC5NTykKcihXLmN0LFcubTYpCnIoUC5CZixQLmlKKQpx
-KFAuRTQsW1AucjcsUC5jb10pCnIoUC5UeixQLmNvKQpyKFAubmQsUC5oaSkKcShMLkQ4LFtMLnZ0LEwu
-Y0RdKQpyKEIuZnYsTy56TCkKcShCLmZ2LFtFLk9GLEYucnUsTC5JVl0pCnMoSC53MixILlJlKQpzKEgu
-UUMsUC5sRCkKcyhILlJHLFAubEQpCnMoSC5WUCxILlNVKQpzKEguV0IsUC5sRCkKcyhILlpHLEguU1Up
-CnMoUC5uWSxQLmxEKQpzKFAuV1ksUC5sZikKcyhQLlJVLFAuS1ApCnMoUC5wUixQLmxmKQpzKFcuTGUs
-Vy5pZCkKcyhXLks3LFAubEQpCnMoVy5yQixXLkdtKQpzKFcuWFcsUC5sRCkKcyhXLm9hLFcuR20pCnMo
-UC5jbyxQLmxEKX0pKCkKdmFyIHY9e3R5cGVVbml2ZXJzZTp7ZUM6bmV3IE1hcCgpLHRSOnt9LGVUOnt9
-LHRQVjp7fSxzRUE6W119LG1hbmdsZWRHbG9iYWxOYW1lczp7QjI6ImludCIsQ1A6ImRvdWJsZSIsWlo6
-Im51bSIscVU6IlN0cmluZyIsYTI6ImJvb2wiLGM4OiJOdWxsIix6TToiTGlzdCJ9LG1hbmdsZWROYW1l
-czp7fSxnZXRUeXBlRnJvbU5hbWU6Z2V0R2xvYmFsRnJvbU5hbWUsbWV0YWRhdGE6W10sdHlwZXM6WyJ+
-KCkiLCJjOChBaiopIiwiYzgoKSIsImM4KGN2KikiLCJAKEApIiwicVUocVUpIiwiYTIocVUpIiwifihB
-aiopIiwifih+KCkpIiwiYTIoY3YscVUscVUsSlEpIiwiYzgoQCkiLCJ+KE1oPyxNaD8pIiwiQCgpIiwi
-fihxVSxAKSIsIn4objYscVUsQjIpIiwifihxVSxxVSkiLCJhMihrRikiLCJjOChALEApIiwifih4dTxx
-VT4pIiwiYzgoZWEqKSIsImI4PGM4PiooQWoqKSIsIn4ocVUsQjIpIiwifihxVSxxVT8pIiwibjYoQCxA
-KSIsImM4KEAsR3opIiwiYTIodUgpIiwifihCMixAKSIsIn4oZWEpIiwifihNaFtHej9dKSIsImM4KE1o
-LEd6KSIsIn4odUgsdUg/KSIsIn4oQCxAKSIsInZzPEA+KEApIiwiYTIoeHU8cVU+KSIsImM4KH4oKSki
-LCJyNyhAKSIsIk1oPyhAKSIsIkU0KEApIiwiYTIqKEg3KikiLCJMTCooQCkiLCJaMDxxVSosTWgqPioo
-TEwqKSIsIkAocVUpIiwifihHRCxAKSIsImM4KFowPHFVKixNaCo+KikiLCJaMDxxVSxxVT4oWjA8cVUs
-cVU+LHFVKSIsInFVKihBaiopIiwiQChALHFVKSIsIn4ocVVbQF0pIiwiYzgoZXcqKSIsInFVKihaMDxA
-LEA+KikiLCJxVShxVT8pIiwiQjIoQjIsQjIpIiwifihAKSIsIk1oPyhNaD8pIiwiVHo8QD4oQCkiXSxp
-bnRlcmNlcHRvcnNCeVRhZzpudWxsLGxlYWZUYWdzOm51bGwsYXJyYXlSdGk6dHlwZW9mIFN5bWJvbD09
-ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj9TeW1ib2woIiR0aSIpOiIkdGkifQpI
-LnhiKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYzUiOiJNRiIsImlDIjoiTUYiLCJrZCI6Ik1G
-IiwicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImhpIiwidHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFF
-IiwiZUwiOiJxRSIsIkkwIjoidUgiLCJocyI6InVIIiwiWGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2
-IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJh
-MiI6W119LCJ3ZSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6W10sIkVIIjpbXX0sImpkIjp7InpNIjpbIjEi
-XSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJQbyI6eyJqZCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsi
-MSJdLCJjWCI6WyIxIl19LCJtMSI6eyJBbiI6WyIxIl19LCJxSSI6eyJDUCI6W10sIlpaIjpbXX0sImJV
-Ijp7IkNQIjpbXSwiQjIiOltdLCJaWiI6W119LCJWQSI6eyJDUCI6W10sIlpaIjpbXX0sIkRyIjp7InFV
-IjpbXSwidlgiOltdfSwiQlIiOnsiY1giOlsiMiJdfSwiRTciOnsiQW4iOlsiMiJdfSwiWnkiOnsiQlIi
-OlsiMSIsIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJvbCI6eyJaeSI6WyIxIiwiMiJdLCJCUiI6
-WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwiVXEiOnsibEQiOlsiMiJd
-LCJ6TSI6WyIyIl0sIkJSIjpbIjEiLCIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdfSwialYiOnsiVXEi
-OlsiMSIsIjIiXSwibEQiOlsiMiJdLCJ6TSI6WyIyIl0sIkJSIjpbIjEiLCIyIl0sImJRIjpbIjIiXSwi
-Y1giOlsiMiJdLCJsRC5FIjoiMiIsImNYLkUiOiIyIn0sIm4iOnsiWFMiOltdfSwicjMiOnsiWFMiOltd
-fSwicWoiOnsibEQiOlsiQjIiXSwiUmUiOlsiQjIiXSwiek0iOlsiQjIiXSwiYlEiOlsiQjIiXSwiY1gi
-OlsiQjIiXSwibEQuRSI6IkIyIiwiUmUuRSI6IkIyIn0sIkdNIjp7IlhTIjpbXX0sImJRIjp7ImNYIjpb
-IjEiXX0sImFMIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibkgiOnsiYUwiOlsiMSJdLCJiUSI6WyIx
-Il0sImNYIjpbIjEiXSwiYUwuRSI6IjEiLCJjWC5FIjoiMSJ9LCJhNyI6eyJBbiI6WyIxIl19LCJpMSI6
-eyJjWCI6WyIyIl0sImNYLkUiOiIyIn0sInh5Ijp7ImkxIjpbIjEiLCIyIl0sImJRIjpbIjIiXSwiY1gi
-OlsiMiJdLCJjWC5FIjoiMiJ9LCJNSCI6eyJBbiI6WyIyIl19LCJsSiI6eyJhTCI6WyIyIl0sImJRIjpb
-IjIiXSwiY1giOlsiMiJdLCJhTC5FIjoiMiIsImNYLkUiOiIyIn0sIlU1Ijp7ImNYIjpbIjEiXSwiY1gu
-RSI6IjEifSwiU08iOnsiQW4iOlsiMSJdfSwiQU0iOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJkNSI6
-eyJBTSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJVMSI6eyJBbiI6WyIx
-Il19LCJNQiI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiRnUiOnsiQW4iOlsiMSJd
-fSwidTYiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJKQiI6eyJBbiI6WyIxIl19LCJ3MiI6eyJsRCI6
-WyIxIl0sIlJlIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sInd2Ijp7IkdE
-IjpbXX0sIlBEIjp7IkdqIjpbIjEiLCIyIl0sIlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQ
-IjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJXVSI6eyJaMCI6WyIxIiwiMiJdfSwiTFAiOnsiV1Ui
-OlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIlhSIjp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTEki
-OnsidlEiOltdfSwiVzAiOnsiWFMiOltdfSwiYXoiOnsiWFMiOltdfSwidlYiOnsiWFMiOltdfSwidGUi
-OnsiUnoiOltdfSwiWE8iOnsiR3oiOltdfSwiVHAiOnsiRUgiOltdfSwibGMiOnsiRUgiOltdfSwiengi
-OnsiRUgiOltdfSwiclQiOnsiRUgiOltdfSwiRXEiOnsiWFMiOltdfSwia1kiOnsiWFMiOltdfSwiTjUi
-OnsiWWsiOlsiMSIsIjIiXSwiRm8iOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXSwiWWsuSyI6IjEiLCJZ
-ay5WIjoiMiJ9LCJpNSI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4i
-OlsiMSJdfSwiVlIiOnsid0wiOltdLCJ2WCI6W119LCJFSyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7
-ImNYIjpbImliIl0sImNYLkUiOiJpYiJ9LCJQYiI6eyJBbiI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwi
-dW4iOnsiY1giOlsiT2QiXSwiY1guRSI6Ik9kIn0sIlNkIjp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6
-W119LCJMWiI6eyJYaiI6WyIxIl0sIkVUIjpbXSwiQVMiOltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoi
-OlsiQ1AiXSwiek0iOlsiQ1AiXSwiRVQiOltdLCJiUSI6WyJDUCJdLCJBUyI6W10sImNYIjpbIkNQIl0s
-IlNVIjpbIkNQIl0sImxELkUiOiJDUCJ9LCJQZyI6eyJsRCI6WyJCMiJdLCJYaiI6WyJCMiJdLCJ6TSI6
-WyJCMiJdLCJFVCI6W10sImJRIjpbIkIyIl0sIkFTIjpbXSwiY1giOlsiQjIiXSwiU1UiOlsiQjIiXX0s
-InhqIjp7ImxEIjpbIkIyIl0sIlhqIjpbIkIyIl0sInpNIjpbIkIyIl0sIkVUIjpbXSwiYlEiOlsiQjIi
-XSwiQVMiOltdLCJjWCI6WyJCMiJdLCJTVSI6WyJCMiJdLCJsRC5FIjoiQjIifSwiZEUiOnsibEQiOlsi
-QjIiXSwiWGoiOlsiQjIiXSwiek0iOlsiQjIiXSwiRVQiOltdLCJiUSI6WyJCMiJdLCJBUyI6W10sImNY
-IjpbIkIyIl0sIlNVIjpbIkIyIl0sImxELkUiOiJCMiJ9LCJaQSI6eyJsRCI6WyJCMiJdLCJYaiI6WyJC
-MiJdLCJ6TSI6WyJCMiJdLCJFVCI6W10sImJRIjpbIkIyIl0sIkFTIjpbXSwiY1giOlsiQjIiXSwiU1Ui
-OlsiQjIiXSwibEQuRSI6IkIyIn0sImRUIjp7ImxEIjpbIkIyIl0sIlhqIjpbIkIyIl0sInpNIjpbIkIy
-Il0sIkVUIjpbXSwiYlEiOlsiQjIiXSwiQVMiOltdLCJjWCI6WyJCMiJdLCJTVSI6WyJCMiJdLCJsRC5F
-IjoiQjIifSwiUHEiOnsibEQiOlsiQjIiXSwiWGoiOlsiQjIiXSwiek0iOlsiQjIiXSwiRVQiOltdLCJi
-USI6WyJCMiJdLCJBUyI6W10sImNYIjpbIkIyIl0sIlNVIjpbIkIyIl0sImxELkUiOiJCMiJ9LCJlRSI6
+KXtrPUMueEIuTyhuLHEpCmlmKHMucjQoaykpe2lmKHM9PT0kLktrKCkmJms9PT00NylyZXR1cm4hMApp
+ZihvIT1udWxsJiZzLnI0KG8pKXJldHVybiEwCmlmKG89PT00NilqPWw9PW51bGx8fGw9PT00Nnx8cy5y
+NChsKQplbHNlIGo9ITEKaWYoailyZXR1cm4hMH19aWYobz09bnVsbClyZXR1cm4hMAppZihzLnI0KG8p
+KXJldHVybiEwCmlmKG89PT00NilzPWw9PW51bGx8fHMucjQobCl8fGw9PT00NgplbHNlIHM9ITEKaWYo
+cylyZXR1cm4hMApyZXR1cm4hMX0sCkhQOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD10
+aGlzLGs9J1VuYWJsZSB0byBmaW5kIGEgcGF0aCB0byAiJwpiPWwuV08oMCxiKQpzPWwuYQppZihzLlly
+KGIpPD0wJiZzLllyKGEpPjApcmV0dXJuIGwubzUoYSkKaWYocy5ZcihhKTw9MHx8cy5oSyhhKSlhPWwu
+V08oMCxhKQppZihzLllyKGEpPD0wJiZzLllyKGIpPjApdGhyb3cgSC5iKFguSTcoaytILkVqKGEpKyci
+IGZyb20gIicrSC5FaihiKSsnIi4nKSkKcj1YLkNMKGIscykKci5yUigpCnE9WC5DTChhLHMpCnEuclIo
+KQpwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1KLlJN
+KHBbMF0sIi4iKX1lbHNlIHA9ITEKaWYocClyZXR1cm4gcS53KDApCnA9ci5iCm89cS5iCmlmKHAhPW8p
+cD1wPT1udWxsfHxvPT1udWxsfHwhcy5OYyhwLG8pCmVsc2UgcD0hMQppZihwKXJldHVybiBxLncoMCkK
+d2hpbGUoITApe3A9ci5kCm89cC5sZW5ndGgKaWYobyE9PTApe249cS5kCm09bi5sZW5ndGgKaWYobSE9
+PTApe2lmKDA+PW8pcmV0dXJuIEguT0gocCwwKQpwPXBbMF0KaWYoMD49bSlyZXR1cm4gSC5PSChuLDAp
+Cm49cy5OYyhwLG5bMF0pCnA9bn1lbHNlIHA9ITF9ZWxzZSBwPSExCmlmKCFwKWJyZWFrCkMuTm0uVzQo
+ci5kLDApCkMuTm0uVzQoci5lLDEpCkMuTm0uVzQocS5kLDApCkMuTm0uVzQocS5lLDEpfXA9ci5kCm89
+cC5sZW5ndGgKaWYobyE9PTApe2lmKDA+PW8pcmV0dXJuIEguT0gocCwwKQpwPUouUk0ocFswXSwiLi4i
+KX1lbHNlIHA9ITEKaWYocCl0aHJvdyBILmIoWC5JNyhrK0guRWooYSkrJyIgZnJvbSAiJytILkVqKGIp
+KyciLicpKQpwPXQuTgpDLk5tLlVHKHEuZCwwLFAuTzgoci5kLmxlbmd0aCwiLi4iLCExLHApKQpDLk5t
+Llk1KHEuZSwwLCIiKQpDLk5tLlVHKHEuZSwxLFAuTzgoci5kLmxlbmd0aCxzLmdtSSgpLCExLHApKQpz
+PXEuZApwPXMubGVuZ3RoCmlmKHA9PT0wKXJldHVybiIuIgppZihwPjEmJkouUk0oQy5ObS5ncloocyks
+Ii4iKSl7cz1xLmQKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpzPXEuZQpp
+ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKDA+PXMubGVuZ3RoKXJldHVy
+biBILk9IKHMsLTEpCnMucG9wKCkKQy5ObS5pKHMsIiIpfXEuYj0iIgpxLkl4KCkKcmV0dXJuIHEudygw
+KX19Ck0ucTcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguaChhKSE9PSIifSwKJFM6
+Nn0KTS5Oby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtILmsoYSkKcmV0dXJuIGE9PW51bGw/Im51
+bGwiOiciJythKyciJ30sCiRTOjUwfQpCLmZ2LnByb3RvdHlwZT17CnhaOmZ1bmN0aW9uKGEpe3ZhciBz
+LHI9dGhpcy5ZcihhKQppZihyPjApcmV0dXJuIEoubGQoYSwwLHIpCmlmKHRoaXMuaEsoYSkpe2lmKDA+
+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsMCkKcz1hWzBdfWVsc2Ugcz1udWxsCnJldHVybiBzfSwKTmM6
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09Yn19ClguV0QucHJvdG90eXBlPXsKSXg6ZnVuY3Rpb24oKXt2
+YXIgcyxyLHE9dGhpcwp3aGlsZSghMCl7cz1xLmQKaWYoIShzLmxlbmd0aCE9PTAmJkouUk0oQy5ObS5n
+cloocyksIiIpKSlicmVhawpzPXEuZAppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBv
+cCgpCnM9cS5lCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCl9cz1xLmUKcj1z
+Lmxlbmd0aAppZihyIT09MClDLk5tLlk1KHMsci0xLCIiKX0sCnJSOmZ1bmN0aW9uKCl7dmFyIHMscixx
+LHAsbyxuLG09dGhpcyxsPUguVk0oW10sdC5zKQpmb3Iocz1tLmQscj1zLmxlbmd0aCxxPTAscD0wO3A8
+cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3Ape289c1twXQpuPUouaWEobykKaWYo
+IShuLkROKG8sIi4iKXx8bi5ETihvLCIiKSkpaWYobi5ETihvLCIuLiIpKXtuPWwubGVuZ3RoCmlmKG4h
+PT0wKXtpZigwPj1uKXJldHVybiBILk9IKGwsLTEpCmwucG9wKCl9ZWxzZSArK3F9ZWxzZSBDLk5tLmko
+bCxvKX1pZihtLmI9PW51bGwpQy5ObS5VRyhsLDAsUC5POChxLCIuLiIsITEsdC5OKSkKaWYobC5sZW5n
+dGg9PT0wJiZtLmI9PW51bGwpQy5ObS5pKGwsIi4iKQptLnNuSihsKQpzPW0uYQptLnNQaChQLk84KGwu
+bGVuZ3RoKzEscy5nbUkoKSwhMCx0Lk4pKQpyPW0uYgppZihyPT1udWxsfHxsLmxlbmd0aD09PTB8fCFz
+LmRzKHIpKUMuTm0uWTUobS5lLDAsIiIpCnI9bS5iCmlmKHIhPW51bGwmJnM9PT0kLktrKCkpe3IudG9T
+dHJpbmcKbS5iPUgueXMociwiLyIsIlxcIil9bS5JeCgpfSwKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9
+dGhpcyxwPXEuYgpwPXAhPW51bGw/cDoiIgpmb3Iocz0wO3M8cS5kLmxlbmd0aDsrK3Mpe3I9cS5lCmlm
+KHM+PXIubGVuZ3RoKXJldHVybiBILk9IKHIscykKcj1wK0guRWoocltzXSkKcD1xLmQKaWYocz49cC5s
+ZW5ndGgpcmV0dXJuIEguT0gocCxzKQpwPXIrSC5FaihwW3NdKX1wKz1ILkVqKEMuTm0uZ3JaKHEuZSkp
+CnJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwKc25KOmZ1bmN0aW9uKGEpe3RoaXMuZD10LkQu
+YShhKX0sCnNQaDpmdW5jdGlvbihhKXt0aGlzLmU9dC5ELmEoYSl9fQpYLmR2LnByb3RvdHlwZT17Cnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIlBhdGhFeGNlcHRpb246ICIrdGhpcy5hfSwKJGlSejoxfQpPLnpMLnBy
+b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0KRS5PRi5wcm90b3R5
+cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXty
+ZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHM9YS5sZW5ndGgKcmV0dXJuIHMhPT0wJiZD
+LnhCLk8oYSxzLTEpIT09NDd9LApTcDpmdW5jdGlvbihhLGIpe2lmKGEubGVuZ3RoIT09MCYmQy54Qi5X
+KGEsMCk9PT00NylyZXR1cm4gMQpyZXR1cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNw
+KGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuITF9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4icG9z
+aXgifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifX0KRi5ydS5wcm90b3R5cGU9ewpVZDpmdW5jdGlv
+bihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwK
+ZHM6ZnVuY3Rpb24oYSl7dmFyIHM9YS5sZW5ndGgKaWYocz09PTApcmV0dXJuITEKaWYoQy54Qi5PKGEs
+cy0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09c30s
+ClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz1hLmxlbmd0aAppZihvPT09MClyZXR1cm4gMApp
+ZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcihzPTA7czxvOysrcyl7cj1DLnhCLlcoYSxzKQpp
+ZihyPT09NDcpcmV0dXJuIDAKaWYocj09PTU4KXtpZihzPT09MClyZXR1cm4gMApxPUMueEIuWFUoYSwi
+LyIsQy54Qi5RaShhLCIvLyIscysxKT9zKzM6cykKaWYocTw9MClyZXR1cm4gbwppZighYnx8bzxxKzMp
+cmV0dXJuIHEKaWYoIUMueEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHEKaWYoIUIuWXUoYSxxKzEpKXJl
+dHVybiBxCnA9cSszCnJldHVybiBvPT09cD9wOnErNH19cmV0dXJuIDB9LApZcjpmdW5jdGlvbihhKXty
+ZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTAmJkMu
+eEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0sCmdtSTpmdW5jdGlvbigp
+e3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGco
+YSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTkyfSwKZHM6ZnVuY3Rpb24o
+YSl7dmFyIHM9YS5sZW5ndGgKaWYocz09PTApcmV0dXJuITEKcz1DLnhCLk8oYSxzLTEpCnJldHVybiEo
+cz09PTQ3fHxzPT09OTIpfSwKU3A6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9YS5sZW5ndGgKaWYocT09
+PTApcmV0dXJuIDAKcz1DLnhCLlcoYSwwKQppZihzPT09NDcpcmV0dXJuIDEKaWYocz09PTkyKXtpZihx
+PDJ8fEMueEIuVyhhLDEpIT09OTIpcmV0dXJuIDEKcj1DLnhCLlhVKGEsIlxcIiwyKQppZihyPjApe3I9
+Qy54Qi5YVShhLCJcXCIscisxKQppZihyPjApcmV0dXJuIHJ9cmV0dXJuIHF9aWYocTwzKXJldHVybiAw
+CmlmKCFCLk9TKHMpKXJldHVybiAwCmlmKEMueEIuVyhhLDEpIT09NTgpcmV0dXJuIDAKcT1DLnhCLlco
+YSwyKQppZighKHE9PT00N3x8cT09PTkyKSlyZXR1cm4gMApyZXR1cm4gM30sCllyOmZ1bmN0aW9uKGEp
+e3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWXIoYSk9PT0x
+fSwKT3Q6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihhPT09YilyZXR1cm4hMAppZihhPT09NDcpcmV0dXJu
+IGI9PT05MgppZihhPT09OTIpcmV0dXJuIGI9PT00NwppZigoYV5iKSE9PTMyKXJldHVybiExCnM9YXwz
+MgpyZXR1cm4gcz49OTcmJnM8PTEyMn0sCk5jOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmlmKGE9PWIp
+cmV0dXJuITAKcz1hLmxlbmd0aAppZihzIT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHI9Si5yWShiKSxx
+PTA7cTxzOysrcSlpZighdGhpcy5PdChDLnhCLlcoYSxxKSxyLlcoYixxKSkpcmV0dXJuITEKcmV0dXJu
+ITB9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4id2luZG93cyJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4i
+XFwifX07KGZ1bmN0aW9uIGFsaWFzZXMoKXt2YXIgcz1KLkd2LnByb3RvdHlwZQpzLlU9cy53CnMuU2o9
+cy5lNwpzPUouTUYucHJvdG90eXBlCnMudD1zLncKcz1QLmNYLnByb3RvdHlwZQpzLkdHPXMuZXYKcz1Q
+Lk1oLnByb3RvdHlwZQpzLnhiPXMudwpzPVcuY3YucHJvdG90eXBlCnMuRFc9cy5yNgpzPVcubTYucHJv
+dG90eXBlCnMuakY9cy5FYgpzPVAuRTQucHJvdG90eXBlCnMuVXI9cy5xCnMuZTQ9cy5ZNQpzPVAuY28u
+cHJvdG90eXBlCnMuYmg9cy5ZNX0pKCk7KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygpe3ZhciBzPWh1
+bmtIZWxwZXJzLl9zdGF0aWNfMSxyPWh1bmtIZWxwZXJzLl9zdGF0aWNfMCxxPWh1bmtIZWxwZXJzLmlu
+c3RhbGxJbnN0YW5jZVRlYXJPZmYscD1odW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVhck9mZixvPWh1
+bmtIZWxwZXJzLl9pbnN0YW5jZV8xdQpzKFAsIkVYIiwiWlYiLDgpCnMoUCwieXQiLCJvQSIsOCkKcyhQ
+LCJxVyIsIkJ6Iiw4KQpyKFAsIlVJIiwiZU4iLDApCnEoUC5QZi5wcm90b3R5cGUsImdZSiIsMCwxLG51
+bGwsWyIkMiIsIiQxIl0sWyJ3MCIsInBtIl0sMjgsMCkKcyhQLCJDeSIsIk5DIiw0KQpzKFAsIlBIIiwi
+TXQiLDUpCnAoVywicFMiLDQsbnVsbCxbIiQ0Il0sWyJxRCJdLDksMCkKcChXLCJWNCIsNCxudWxsLFsi
+JDQiXSxbIlFXIl0sOSwwKQpvKFAuQXMucHJvdG90eXBlLCJndU0iLCJWIiw1KQpzKFAsImlHIiwid1ki
+LDUzKQpzKFAsIncwIiwiZFUiLDM2KQpzKEwsImlTIiwiaTYiLDcpfSkoKTsoZnVuY3Rpb24gaW5oZXJp
+dGFuY2UoKXt2YXIgcz1odW5rSGVscGVycy5taXhpbixyPWh1bmtIZWxwZXJzLmluaGVyaXQscT1odW5r
+SGVscGVycy5pbmhlcml0TWFueQpyKFAuTWgsbnVsbCkKcShQLk1oLFtILkZLLEouR3YsSi5tMSxQLmNY
+LEguRTcsUC5YUyxQLm5ZLEguYTcsUC5BbixILkZ1LEguSkIsSC5TVSxILlJlLEgud3YsUC5QbixILldV
+LEguTEksSC5UcCxILmY5LEgudGUsSC5icSxILlhPLEgua3IsUC5ZayxILnZoLEguTjYsSC5WUixILkVL
+LEguUGIsSC50USxILlNkLEguSmMsSC5HLEgubFksUC5XMyxQLmloLFAuRnksUC5HVixQLkN3LFAuUGYs
+UC5GZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC54SSxQLm0wLFAucFIsUC5ibixQLmxtLFAubEQs
+UC5LUCxQLmxmLFAuV1ksUC5VayxQLlNoLFAuUncsUC5ieixQLmlQLFAuazUsUC5LWSxQLkNELFAuYUUs
+UC5OMyxQLmM4LFAuWmQsUC5SbixQLkRuLFAuUEUsUC5VZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQs
+Vy5tNixXLk93LFcuVzksVy5kVyxXLm1rLFcuS28sUC5pSixQLkU0LE0uSDcsVS5MTCxVLmQyLFUuU2Us
+VS5NbCxVLnlELFUud2IsQi5qOCxCLnFwLFQubVEsTC5YQSxMLkQ4LEwuTzksTC5HYixNLmxJLE8uekws
+WC5XRCxYLmR2XSkKcShKLkd2LFtKLnlFLEoud2UsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAs
+Vy5BeixXLkxlLFcuTmgsVy5hZSxXLklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy53NyxXLks3LFcuWFcs
+UC5oRl0pCnEoSi5NRixbSi5pQyxKLmtkLEouYzVdKQpyKEouUG8sSi5qZCkKcShKLnFJLFtKLmJVLEou
+VkFdKQpxKFAuY1gsW0guQlIsSC5iUSxILmkxLEguVTUsSC5BTSxILnU2LEguWFIsUC5tVyxILnVuXSkK
+cShILkJSLFtILlp5LEguUUNdKQpyKEgub2wsSC5aeSkKcihILlVxLEguUUMpCnIoSC5qVixILlVxKQpx
+KFAuWFMsW0gubixILnIzLEguR00sUC5FeixILmF6LEgudlYsSC5FcSxQLkM2LEgua1MsUC5VZCxQLkYs
+UC51LFAubXAsUC51YixQLmRzLFAubGosUC5VVixQLmNdKQpyKFAudXksUC5uWSkKcShQLnV5LFtILncy
+LFcud3osVy5lN10pCnIoSC5xaixILncyKQpxKEguYlEsW0guYUwsSC5NQixILmk1XSkKcShILmFMLFtI
+Lm5ILEgubEosUC5pOF0pCnIoSC54eSxILmkxKQpxKFAuQW4sW0guTUgsSC5TTyxILlUxXSkKcihILmQ1
+LEguQU0pCnIoUC5SVSxQLlBuKQpyKFAuR2osUC5SVSkKcihILlBELFAuR2opCnIoSC5MUCxILldVKQpx
+KEguVHAsW0guQ2osSC5sYyxILmRDLEgud04sSC5WWCxQLnRoLFAuaGEsUC5WcyxQLkZ0LFAueUgsUC5X
+TSxQLlNYLFAuR3MsUC5kYSxQLm9RLFAucFYsUC5VNyxQLnZyLFAucnQsUC5LRixQLlpMLFAuUlQsUC5q
+WixQLnJxLFAuUlcsUC5CNSxQLnVPLFAucEssUC5oaixQLlZwLFAuT1IsUC5yYSxQLnlRLFAueHIsUC5O
+eixQLnRpLFAuV0YsUC5uMSxQLmNTLFAuVkMsUC5KVCxQLlJaLFAuTUUsUC55NSxQLnlJLFAuYzYsUC5x
+ZCxXLkN2LFcuS1MsVy5BMyxXLnZOLFcuVXYsVy5FZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAuamcsUC5U
+YSxQLkdFLFAuTjcsUC51USxQLlBDLFAubXQsUC5RUyxQLm5wLFAuVXQsVS5NRCxVLmFOLFUuYjAsTC5l
+LEwuVlcsTC5vWixMLmpyLEwucWwsTC5IaSxMLkJULEwuUFksTC51OCxMLkwsTC5XeCxMLkFPLEwuZE4s
+TC5IbyxMLnh6LEwuSUMsTC5mQyxMLm5ULEwuTlksTC51ZSxMLmVYLEwuRUUsTC5RTCxMLlZTLEwuVEQs
+TC5JZixMLnRCLEwubTIsTS5xNyxNLk5vXSkKcihILlcwLFAuRXopCnEoSC5sYyxbSC56eCxILnJUXSkK
+cihILmtZLFAuQzYpCnIoUC5pbCxQLllrKQpxKFAuaWwsW0guTjUsUC51dyxXLmNmLFcuU3ldKQpxKFAu
+bVcsW0guS1csUC5xNF0pCnIoSC5MWixILkVUKQpxKEguTFosW0guUkcsSC5XQl0pCnIoSC5WUCxILlJH
+KQpyKEguRGcsSC5WUCkKcihILlpHLEguV0IpCnIoSC5QZyxILlpHKQpxKEguUGcsW0gueGosSC5kRSxI
+LlpBLEguZFQsSC5QcSxILmVFLEguVjZdKQpyKEguaU0sSC5rUykKcihQLlpmLFAuUGYpCnIoUC5KaSxQ
+Lm0wKQpyKFAuWHYsUC5wUikKcihQLmI2LFAuWHYpCnIoUC5WaixQLldZKQpxKFAuVWssW1AuQ1YsUC5a
+aSxQLmJ5XSkKcihQLndJLFAua1QpCnEoUC53SSxbUC5VOCxQLm9qLFAuTXgsUC5FMyxQLkdZXSkKcihQ
+Lks4LFAuVWQpCnIoUC50dSxQLlNoKQpyKFAudTUsUC5aaSkKcShQLnUsW1AuYkosUC5lWV0pCnIoUC5x
+ZSxQLkRuKQpxKFcuRDAsW1cudUgsVy53YSxXLks1LFcuQ21dKQpxKFcudUgsW1cuY3YsVy5ueCxXLlFG
+LFcuQ1FdKQpxKFcuY3YsW1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcubkIsVy5RUCxXLmg0
+LFcuU04sVy5scCxXLlRiLFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIoVy5oSCxXLkF6KQpy
+KFcuVmIsVy5RRikKcihXLmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihXLkFqLFcudzYpCnIo
+Vy5yQixXLks3KQpyKFcuQkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhXKQpyKFcucmgsVy5v
+YSkKcihXLmk3LFcuY2YpCnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0pCnIoVy5STyxQLnFo
+KQpyKFcuZXUsVy5STykKcihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYsUC5pSikKcShQLkU0
+LFtQLnI3LFAuY29dKQpyKFAuVHosUC5jbykKcihQLm5kLFAuaGkpCnEoTC5EOCxbTC52dCxMLmNEXSkK
+cihCLmZ2LE8uekwpCnEoQi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkKcyhILlFDLFAu
+bEQpCnMoSC5SRyxQLmxEKQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxILlNVKQpzKFAu
+blksUC5sRCkKcyhQLldZLFAubGYpCnMoUC5SVSxQLktQKQpzKFAucFIsUC5sZikKcyhXLkxlLFcuaWQp
+CnMoVy5LNyxQLmxEKQpzKFcuckIsVy5HbSkKcyhXLlhXLFAubEQpCnMoVy5vYSxXLkdtKQpzKFAuY28s
+UC5sRCl9KSgpCnZhciB2PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAoKSx0Ujp7fSxlVDp7fSx0UFY6
+e30sc0VBOltdfSxtYW5nbGVkR2xvYmFsTmFtZXM6e0IyOiJpbnQiLENQOiJkb3VibGUiLFpaOiJudW0i
+LHFVOiJTdHJpbmciLGEyOiJib29sIixjODoiTnVsbCIsek06Ikxpc3QifSxtYW5nbGVkTmFtZXM6e30s
+Z2V0VHlwZUZyb21OYW1lOmdldEdsb2JhbEZyb21OYW1lLG1ldGFkYXRhOltdLHR5cGVzOlsifigpIiwi
+YzgoQWoqKSIsImM4KCkiLCJjOChjdiopIiwiQChAKSIsInFVKHFVKSIsImEyKHFVKSIsIn4oQWoqKSIs
+In4ofigpKSIsImEyKGN2LHFVLHFVLEpRKSIsImM4KEApIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUs
+QCkiLCJ+KG42LHFVLEIyKSIsIn4ocVUscVUpIiwiYTIoa0YpIiwiYzgoQCxAKSIsIn4oeHU8cVU+KSIs
+ImM4KGVhKikiLCJiODxjOD4qKEFqKikiLCJ+KHFVLEIyKSIsIn4ocVUscVU/KSIsIm42KEAsQCkiLCJj
+OChALEd6KSIsImEyKHVIKSIsIn4oQjIsQCkiLCJ+KGVhKSIsIn4oTWhbR3o/XSkiLCJjOChNaCxHeiki
+LCJ+KHVILHVIPykiLCJ+KEAsQCkiLCJ2czxAPihAKSIsImEyKHh1PHFVPikiLCJjOCh+KCkpIiwicjco
+QCkiLCJNaD8oQCkiLCJFNChAKSIsImEyKihINyopIiwiTEwqKEApIiwiWjA8cVUqLE1oKj4qKExMKiki
+LCJAKHFVKSIsIn4oR0QsQCkiLCJjOChaMDxxVSosTWgqPiopIiwiWjA8cVUscVU+KFowPHFVLHFVPixx
+VSkiLCJxVSooQWoqKSIsIkAoQCxxVSkiLCJ+KHFVW0BdKSIsImM4KGV3KikiLCJxVSooWjA8QCxAPiop
+IiwicVUocVU/KSIsIkIyKEIyLEIyKSIsIn4oQCkiLCJNaD8oTWg/KSIsIlR6PEA+KEApIl0saW50ZXJj
+ZXB0b3JzQnlUYWc6bnVsbCxsZWFmVGFnczpudWxsLGFycmF5UnRpOnR5cGVvZiBTeW1ib2w9PSJmdW5j
+dGlvbiImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/U3ltYm9sKCIkdGkiKToiJHRpIn0KSC54Yih2
+LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNlKCd7ImM1IjoiTUYiLCJpQyI6Ik1GIiwia2QiOiJNRiIsInJ4
+IjoiZWEiLCJlNSI6ImVhIiwiWTAiOiJoaSIsInRwIjoiaGkiLCJHOCI6ImV3IiwiTXIiOiJxRSIsImVM
+IjoicUUiLCJJMCI6InVIIiwiaHMiOiJ1SCIsIlhnIjoiUUYiLCJuciI6IkFqIiwieTQiOiJ3NiIsImFQ
+IjoiQ20iLCJ4YyI6Im54Iiwia0oiOiJueCIsInpVIjoiRGciLCJkZiI6IkVUIiwieUUiOnsiYTIiOltd
+fSwid2UiOnsiYzgiOltdfSwiTUYiOnsidm0iOltdLCJFSCI6W119LCJqZCI6eyJ6TSI6WyIxIl0sImJR
+IjpbIjEiXSwiY1giOlsiMSJdfSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwi
+Y1giOlsiMSJdfSwibTEiOnsiQW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJaWiI6W119LCJiVSI6eyJD
+UCI6W10sIkIyIjpbXSwiWloiOltdfSwiVkEiOnsiQ1AiOltdLCJaWiI6W119LCJEciI6eyJxVSI6W10s
+InZYIjpbXX0sIkJSIjp7ImNYIjpbIjIiXX0sIkU3Ijp7IkFuIjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEi
+LCIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwib2wiOnsiWnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIs
+IjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIlVxIjp7ImxEIjpbIjIiXSwiek0i
+OlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXX0sImpWIjp7IlVxIjpbIjEi
+LCIyIl0sImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpb
+IjIiXSwibEQuRSI6IjIiLCJjWC5FIjoiMiJ9LCJuIjp7IlhTIjpbXX0sInIzIjp7IlhTIjpbXX0sInFq
+Ijp7ImxEIjpbIkIyIl0sIlJlIjpbIkIyIl0sInpNIjpbIkIyIl0sImJRIjpbIkIyIl0sImNYIjpbIkIy
+Il0sImxELkUiOiJCMiIsIlJlLkUiOiJCMiJ9LCJHTSI6eyJYUyI6W119LCJiUSI6eyJjWCI6WyIxIl19
+LCJhTCI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEiXSwiYlEiOlsiMSJdLCJj
+WCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiaTEiOnsiY1gi
+OlsiMiJdLCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIi
+XSwiY1guRSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsiMiJdLCJiUSI6WyIyIl0s
+ImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIxIl0sImNYLkUiOiIx
+In0sIlNPIjp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiZDUiOnsiQU0i
+OlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEiOnsiQW4iOlsiMSJdfSwi
+TUIiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7IkFuIjpbIjEiXX0sInU2
+Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwidzIiOnsibEQiOlsiMSJd
+LCJSZSI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119
+LCJQRCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIx
+IiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEi
+LCIyIl0sIlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkxJIjp7InZR
+IjpbXX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7IlhTIjpbXX0sInZWIjp7IlhTIjpbXX0sInRlIjp7IlJ6
+IjpbXX0sIlhPIjp7Ikd6IjpbXX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7IkVIIjpbXX0sInp4Ijp7IkVI
+IjpbXX0sInJUIjp7IkVIIjpbXX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7IlhTIjpbXX0sIk41Ijp7Illr
+IjpbIjEiLCIyIl0sIkZvIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl0sIllrLksiOiIxIiwiWWsuViI6
+IjIifSwiaTUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIk42Ijp7IkFuIjpbIjEi
+XX0sIlZSIjp7IndMIjpbXSwidlgiOltdfSwiRUsiOnsiaWIiOltdLCJPZCI6W119LCJLVyI6eyJjWCI6
+WyJpYiJdLCJjWC5FIjoiaWIifSwiUGIiOnsiQW4iOlsiaWIiXX0sInRRIjp7Ik9kIjpbXX0sInVuIjp7
+ImNYIjpbIk9kIl0sImNYLkUiOiJPZCJ9LCJTZCI6eyJBbiI6WyJPZCJdfSwiRVQiOnsiQVMiOltdfSwi
+TFoiOnsiWGoiOlsiMSJdLCJFVCI6W10sIkFTIjpbXX0sIkRnIjp7ImxEIjpbIkNQIl0sIlhqIjpbIkNQ
+Il0sInpNIjpbIkNQIl0sIkVUIjpbXSwiYlEiOlsiQ1AiXSwiQVMiOltdLCJjWCI6WyJDUCJdLCJTVSI6
+WyJDUCJdLCJsRC5FIjoiQ1AifSwiUGciOnsibEQiOlsiQjIiXSwiWGoiOlsiQjIiXSwiek0iOlsiQjIi
+XSwiRVQiOltdLCJiUSI6WyJCMiJdLCJBUyI6W10sImNYIjpbIkIyIl0sIlNVIjpbIkIyIl19LCJ4aiI6
eyJsRCI6WyJCMiJdLCJYaiI6WyJCMiJdLCJ6TSI6WyJCMiJdLCJFVCI6W10sImJRIjpbIkIyIl0sIkFT
-IjpbXSwiY1giOlsiQjIiXSwiU1UiOlsiQjIiXSwibEQuRSI6IkIyIn0sIlY2Ijp7ImxEIjpbIkIyIl0s
-Im42IjpbXSwiWGoiOlsiQjIiXSwiek0iOlsiQjIiXSwiRVQiOltdLCJiUSI6WyJCMiJdLCJBUyI6W10s
-ImNYIjpbIkIyIl0sIlNVIjpbIkIyIl0sImxELkUiOiJCMiJ9LCJrUyI6eyJYUyI6W119LCJpTSI6eyJY
-UyI6W119LCJHViI6eyJBbiI6WyIxIl19LCJxNCI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlpmIjp7
-IlBmIjpbIjEiXX0sInZzIjp7ImI4IjpbIjEiXX0sIkN3Ijp7IlhTIjpbXX0sIm0wIjp7IlFtIjpbXX0s
-IkppIjp7Im0wIjpbXSwiUW0iOltdfSwiYjYiOnsibGYiOlsiMSJdLCJ4dSI6WyIxIl0sImJRIjpbIjEi
-XSwiY1giOlsiMSJdLCJsZi5FIjoiMSJ9LCJsbSI6eyJBbiI6WyIxIl19LCJtVyI6eyJjWCI6WyIxIl19
-LCJ1eSI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJpbCI6eyJZ
-ayI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiWWsiOnsiWjAiOlsiMSIsIjIiXX0sIlBuIjp7Ilow
-IjpbIjEiLCIyIl19LCJHaiI6eyJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwi
-MiJdLCJaMCI6WyIxIiwiMiJdfSwiVmoiOnsibGYiOlsiMSJdLCJ4dSI6WyIxIl0sImJRIjpbIjEiXSwi
-Y1giOlsiMSJdfSwiWHYiOnsibGYiOlsiMSJdLCJ4dSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJd
-fSwidXciOnsiWWsiOlsicVUiLCJAIl0sIlowIjpbInFVIiwiQCJdLCJZay5LIjoicVUiLCJZay5WIjoi
-QCJ9LCJpOCI6eyJhTCI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdLCJhTC5FIjoicVUiLCJj
-WC5FIjoicVUifSwiQ1YiOnsiVWsiOlsiek08QjI+IiwicVUiXSwiVWsuUyI6InpNPEIyPiJ9LCJVOCI6
-eyJ3SSI6WyJ6TTxCMj4iLCJxVSJdfSwiWmkiOnsiVWsiOlsicVUiLCJ6TTxCMj4iXX0sIlVkIjp7IlhT
-IjpbXX0sIks4Ijp7IlhTIjpbXX0sImJ5Ijp7IlVrIjpbIk1oPyIsInFVIl0sIlVrLlMiOiJNaD8ifSwi
-b2oiOnsid0kiOlsiTWg/IiwicVUiXX0sIk14Ijp7IndJIjpbInFVIiwiTWg/Il19LCJ1NSI6eyJVayI6
-WyJxVSIsInpNPEIyPiJdLCJVay5TIjoicVUifSwiRTMiOnsid0kiOlsicVUiLCJ6TTxCMj4iXX0sIkdZ
-Ijp7IndJIjpbInpNPEIyPiIsInFVIl19LCJDUCI6eyJaWiI6W119LCJCMiI6eyJaWiI6W119LCJ6TSI6
-eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImliIjp7Ik9kIjpbXX0sInh1Ijp7ImJRIjpbIjEiXSwiY1gi
-OlsiMSJdfSwicVUiOnsidlgiOltdfSwiQzYiOnsiWFMiOltdfSwiRXoiOnsiWFMiOltdfSwiRiI6eyJY
-UyI6W119LCJ1Ijp7IlhTIjpbXX0sImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhT
-IjpbXX0sInViIjp7IlhTIjpbXX0sImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhT
-IjpbXX0sIms1Ijp7IlhTIjpbXX0sIktZIjp7IlhTIjpbXX0sImMiOnsiWFMiOltdfSwiQ0QiOnsiUnoi
-OltdfSwiYUUiOnsiUnoiOltdfSwiWmQiOnsiR3oiOltdfSwiUm4iOnsiQkwiOltdfSwiRG4iOnsiaUQi
-OltdfSwiVWYiOnsiaUQiOltdfSwicWUiOnsiaUQiOltdfSwicUUiOnsiY3YiOltdLCJ1SCI6W10sIkQw
-IjpbXX0sIkdoIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJmWSI6eyJjdiI6W10sInVIIjpbXSwi
-RDAiOltdfSwibkIiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlFQIjp7ImN2IjpbXSwidUgiOltd
-LCJEMCI6W119LCJueCI6eyJ1SCI6W10sIkQwIjpbXX0sIlFGIjp7InVIIjpbXSwiRDAiOltdfSwiSUIi
-OnsidG4iOlsiWloiXX0sInd6Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpb
-IjEiXSwibEQuRSI6IjEifSwiY3YiOnsidUgiOltdLCJEMCI6W119LCJoSCI6eyJBeiI6W119LCJoNCI6
-eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiVmIiOnsidUgiOltdLCJEMCI6W119LCJmSiI6eyJEMCI6
-W119LCJ3YSI6eyJEMCI6W119LCJBaiI6eyJlYSI6W119LCJlNyI6eyJsRCI6WyJ1SCJdLCJ6TSI6WyJ1
-SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgifSwidUgiOnsiRDAiOltdfSwiQkgi
-OnsibEQiOlsidUgiXSwiR20iOlsidUgiXSwiek0iOlsidUgiXSwiWGoiOlsidUgiXSwiYlEiOlsidUgi
-XSwiY1giOlsidUgiXSwibEQuRSI6InVIIiwiR20uRSI6InVIIn0sIlNOIjp7ImN2IjpbXSwidUgiOltd
-LCJEMCI6W119LCJldyI6eyJlYSI6W119LCJscCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiVGIi
-OnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkl2Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJX
-UCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwieVkiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0s
-Inc2Ijp7ImVhIjpbXX0sIks1Ijp7InY2IjpbXSwiRDAiOltdfSwiQ20iOnsiRDAiOltdfSwiQ1EiOnsi
-dUgiOltdLCJEMCI6W119LCJ3NCI6eyJ0biI6WyJaWiJdfSwicmgiOnsibEQiOlsidUgiXSwiR20iOlsi
-dUgiXSwiek0iOlsidUgiXSwiWGoiOlsidUgiXSwiYlEiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6
-InVIIiwiR20uRSI6InVIIn0sImNmIjp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdfSwi
-aTciOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJx
-VSJ9LCJTeSI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsu
-ViI6InFVIn0sIkk0Ijp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFV
-Il0sImxmLkUiOiJxVSJ9LCJSTyI6eyJxaCI6WyIxIl19LCJldSI6eyJSTyI6WyIxIl0sInFoIjpbIjEi
-XX0sInhDIjp7Ik1PIjpbIjEiXX0sIkpRIjp7ImtGIjpbXX0sInZEIjp7ImtGIjpbXX0sIm02Ijp7ImtG
-IjpbXX0sImN0Ijp7ImtGIjpbXX0sIk93Ijp7ImtGIjpbXX0sIlc5Ijp7IkFuIjpbIjEiXX0sImRXIjp7
-InY2IjpbXSwiRDAiOltdfSwibWsiOnsieTAiOltdfSwiS28iOnsib24iOltdfSwiQXMiOnsibGYiOlsi
-cVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXX0sInI3Ijp7IkU0IjpbXX0sIlR6
-Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sIkU0IjpbXSwiY1giOlsiMSJdLCJsRC5F
-IjoiMSJ9LCJuZCI6eyJoaSI6W10sImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJLZSI6eyJsZiI6WyJx
-VSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdLCJsZi5FIjoicVUifSwiaGkiOnsi
-Y3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlhBIjp7ImtGIjpbXX0sInZ0Ijp7IkQ4IjpbXX0sImNEIjp7
-IkQ4IjpbXX0sImR2Ijp7IlJ6IjpbXX0sIk9GIjp7ImZ2IjpbXX0sInJ1Ijp7ImZ2IjpbXX0sIklWIjp7
-ImZ2IjpbXX0sIm42Ijp7InpNIjpbIkIyIl0sImJRIjpbIkIyIl0sImNYIjpbIkIyIl0sIkFTIjpbXX19
-JykpCkguRkYodi50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJ3MiI6MSwiUUMiOjIsIkxaIjoxLCJr
-VCI6MiwibVciOjEsInV5IjoxLCJpbCI6MiwiVmoiOjEsIlh2IjoxLCJuWSI6MSwiV1kiOjEsInBSIjox
-LCJjbyI6MX0nKSkKdmFyIHU9e2w6IkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkg
-d2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudCIsaToiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJv
-bSBhIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50IixqOiJDYW5ub3QgZXh0cmFjdCBhIG5vbi1XaW5k
-b3dzIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkgd2l0aCBhbiBhdXRob3JpdHkiLGc6ImBudWxsYCBl
-bmNvdW50ZXJlZCBhcyB0aGUgcmVzdWx0IGZyb20gZXhwcmVzc2lvbiB3aXRoIHR5cGUgYE5ldmVyYC4i
-LGQ6ImFyZWEtYW5hbHl6ZXIsYW5hbHl6ZXItbm5iZC1taWdyYXRpb24sdHlwZS1idWcifQp2YXIgdD0o
-ZnVuY3Rpb24gcnRpaSgpe3ZhciBzPUguTjAKcmV0dXJue246cygiQ3ciKSxjUjpzKCJuQiIpLHc6cygi
-QXoiKSxwOnMoIlFQIiksZ0Y6cygiUEQ8R0QsQD4iKSxkOnMoImJRPEA+IiksaDpzKCJjdiIpLHI6cygi
-WFMiKSxCOnMoImVhIiksYVM6cygiRDAiKSxnODpzKCJSeiIpLGM4OnMoImhIIiksWTpzKCJFSCIpLGU6
-cygiYjg8QD4iKSxJOnMoIlNnIiksbzpzKCJ2USIpLGVoOnMoImNYPHVIPiIpLFE6cygiY1g8cVU+Iiks
-dTpzKCJjWDxAPiIpLHY6cygiamQ8a0Y+IiksczpzKCJqZDxxVT4iKSxnTjpzKCJqZDxuNj4iKSxiOnMo
-ImpkPEA+IiksYTpzKCJqZDxCMj4iKSxkNzpzKCJqZDxTZSo+IiksaDQ6cygiamQ8ajgqPiIpLEc6cygi
-amQ8WjA8cVUqLE1oKj4qPiIpLGNROnMoImpkPEQ4Kj4iKSxpOnMoImpkPHFVKj4iKSxhQTpzKCJqZDx5
-RCo+IiksYUo6cygiamQ8d2IqPiIpLFY6cygiamQ8QjIqPiIpLGQ0OnMoImpkPHFVPz4iKSxUOnMoIndl
-IiksZUg6cygidm0iKSx4OnMoImM1IiksYVU6cygiWGo8QD4iKSxhbTpzKCJUejxAPiIpLGVvOnMoIk41
-PEdELEA+IiksZHo6cygiaEYiKSxEOnMoInpNPHFVPiIpLGo6cygiek08QD4iKSxMOnMoInpNPEIyPiIp
-LEo6cygiWjA8cVUscVU+IiksZjpzKCJaMDxALEA+IiksZG86cygibEo8cVUsQD4iKSxmajpzKCJsSjxx
-VSoscVU+IiksZEU6cygiRVQiKSxibTpzKCJWNiIpLEE6cygidUgiKSxFOnMoImtGIiksUDpzKCJjOCIp
-LEs6cygiTWgiKSxxOnMoInRuPFpaPiIpLGZ2OnMoIndMIiksZXc6cygibmQiKSxDOnMoInh1PHFVPiIp
-LGw6cygiR3oiKSxOOnMoInFVIiksZDA6cygicVUocVUqKSIpLGc3OnMoImhpIiksZm86cygiR0QiKSxh
-VzpzKCJ5WSIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSjpzKCJrZCIpLGR3OnMoIkdqPHFVLHFVPiIp
-LGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcyOnMoIkNtIiks
-YkM6cygiWmY8ZkoqPiIpLGg5OnMoIkNRIiksYWM6cygiZTciKSxrOnMoImV1PEFqKj4iKSxSOnMoInd6
-PGN2Kj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8QjI+IiksZ1Y6cygidnM8ZkoqPiIpLGNyOnMoIkpR
-IikseTpzKCJhMiIpLGFsOnMoImEyKE1oKSIpLGdSOnMoIkNQIiksejpzKCJAIiksZk86cygiQCgpIiks
-Ykk6cygiQChNaCkiKSxhZzpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRPOnMoIkAocVUp
-IiksYjg6cygiQChALEApIiksUzpzKCJCMiIpLGRkOnMoIkdoKiIpLGc6cygiY3YqIiksYUw6cygiZWEq
-IiksYVg6cygiTEwqIiksZkU6cygiSDcqIiksVTpzKCJjWDxAPioiKSxkSDpzKCJFNCoiKSxmSzpzKCJ6
-TTxAPioiKSxkXzpzKCJ6TTxqOCo+KiIpLGRwOnMoInpNPFowPHFVKixNaCo+Kj4qIiksZUU6cygiek08
-TWgqPioiKSxhdzpzKCJaMDxALEA+KiIpLHQ6cygiWjA8cVUqLE1oKj4qIiksTzpzKCJBaioiKSxjRjpz
-KCIwJioiKSxfOnMoIk1oKiIpLGVROnMoImV3KiIpLFg6cygicVUqIiksY2g6cygiRDA/IiksYkc6cygi
-Yjg8Yzg+PyIpLGJrOnMoInpNPHFVPj8iKSxiTTpzKCJ6TTxAPj8iKSxjWjpzKCJaMDxxVSxxVT4/Iiks
-Yzk6cygiWjA8cVUsQD4/IiksVzpzKCJNaD8iKSxGOnMoIkZlPEAsQD4/IiksbTpzKCJibj8iKSxiNzpz
-KCJhMihNaCk/IiksYnc6cygiQChlYSk/IiksZlY6cygiTWg/KE1oPyxNaD8pPyIpLGRBOnMoIk1oPyhA
-KT8iKSxaOnMoIn4oKT8iKSxlYjpzKCJ+KGV3Kik/IiksZGk6cygiWloiKSxIOnMoIn4iKSxNOnMoIn4o
-KSIpLGVBOnMoIn4ocVUscVUpIiksY0E6cygifihxVSxAKSIpfX0pKCk7KGZ1bmN0aW9uIGNvbnN0YW50
-cygpe3ZhciBzPWh1bmtIZWxwZXJzLm1ha2VDb25zdExpc3QKQy54bj1XLkdoLnByb3RvdHlwZQpDLlJZ
-PVcuUVAucHJvdG90eXBlCkMubUg9Vy5hZS5wcm90b3R5cGUKQy5CWj1XLlZiLnByb3RvdHlwZQpDLkR0
-PVcuZkoucHJvdG90eXBlCkMuT2s9Si5Hdi5wcm90b3R5cGUKQy5ObT1KLmpkLnByb3RvdHlwZQpDLmpu
-PUouYlUucHJvdG90eXBlCkMuak49Si53ZS5wcm90b3R5cGUKQy5DRD1KLnFJLnByb3RvdHlwZQpDLnhC
-PUouRHIucHJvdG90eXBlCkMuREc9Si5jNS5wcm90b3R5cGUKQy5FeD1XLnc3LnByb3RvdHlwZQpDLk5B
-PUguVjYucHJvdG90eXBlCkMudDU9Vy5CSC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlwZQpDLlpR
-PUouaUMucHJvdG90eXBlCkMuSWU9Vy5UYi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlwZQpDLm9s
-PVcuSzUucHJvdG90eXBlCkMueTg9bmV3IFAuVTgoKQpDLmg5PW5ldyBQLkNWKCkKQy5Hdz1uZXcgSC5G
-dShILk4wKCJGdTxjOD4iKSkKQy5PND1mdW5jdGlvbiBnZXRUYWdGYWxsYmFjayhvKSB7CiAgdmFyIHMg
-PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7CiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgs
-IHMubGVuZ3RoIC0gMSk7Cn0KQy5ZcT1mdW5jdGlvbigpIHsKICB2YXIgdG9TdHJpbmdGdW5jdGlvbiA9
-IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgZnVuY3Rpb24gZ2V0VGFnKG8pIHsKICAgIHZhciBz
-ID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG8pOwogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVu
-Z3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9uIGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpIHsKICAgIGlm
-ICgvXkhUTUxbQS1aXS4qRWxlbWVudCQvLnRlc3QodGFnKSkgewogICAgICB2YXIgbmFtZSA9IHRvU3Ry
-aW5nRnVuY3Rpb24uY2FsbChvYmplY3QpOwogICAgICBpZiAobmFtZSA9PSAiW29iamVjdCBPYmplY3Rd
-IikgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiAiSFRNTEVsZW1lbnQiOwogICAgfQogIH0KICBmdW5j
-dGlvbiBnZXRVbmtub3duVGFnR2VuZXJpY0Jyb3dzZXIob2JqZWN0LCB0YWcpIHsKICAgIGlmIChzZWxm
-LkhUTUxFbGVtZW50ICYmIG9iamVjdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSByZXR1cm4gIkhUTUxF
-bGVtZW50IjsKICAgIHJldHVybiBnZXRVbmtub3duVGFnKG9iamVjdCwgdGFnKTsKICB9CiAgZnVuY3Rp
-b24gcHJvdG90eXBlRm9yVGFnKHRhZykgewogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5l
-ZCIpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiB3aW5kb3dbdGFnXSA9PSAidW5kZWZpbmVkIikg
-cmV0dXJuIG51bGw7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmICh0eXBl
-b2YgY29uc3RydWN0b3IgIT0gImZ1bmN0aW9uIikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3Ry
-dWN0b3IucHJvdG90eXBlOwogIH0KICBmdW5jdGlvbiBkaXNjcmltaW5hdG9yKHRhZykgeyByZXR1cm4g
-bnVsbDsgfQogIHZhciBpc0Jyb3dzZXIgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiOwogIHJl
-dHVybiB7CiAgICBnZXRUYWc6IGdldFRhZywKICAgIGdldFVua25vd25UYWc6IGlzQnJvd3NlciA/IGdl
-dFVua25vd25UYWdHZW5lcmljQnJvd3NlciA6IGdldFVua25vd25UYWcsCiAgICBwcm90b3R5cGVGb3JU
-YWc6IHByb3RvdHlwZUZvclRhZywKICAgIGRpc2NyaW1pbmF0b3I6IGRpc2NyaW1pbmF0b3IgfTsKfQpD
-LndiPWZ1bmN0aW9uKGdldFRhZ0ZhbGxiYWNrKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGhvb2tzKSB7CiAg
-ICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPSAib2JqZWN0IikgcmV0dXJuIGhvb2tzOwogICAgdmFyIHVh
-ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgIGlmICh1YS5pbmRleE9mKCJEdW1wUmVuZGVyVHJlZSIp
-ID49IDApIHJldHVybiBob29rczsKICAgIGlmICh1YS5pbmRleE9mKCJDaHJvbWUiKSA+PSAwKSB7CiAg
-ICAgIGZ1bmN0aW9uIGNvbmZpcm0ocCkgewogICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09ICJv
-YmplY3QiICYmIHdpbmRvd1twXSAmJiB3aW5kb3dbcF0ubmFtZSA9PSBwOwogICAgICB9CiAgICAgIGlm
-IChjb25maXJtKCJXaW5kb3ciKSAmJiBjb25maXJtKCJIVE1MRWxlbWVudCIpKSByZXR1cm4gaG9va3M7
-CiAgICB9CiAgICBob29rcy5nZXRUYWcgPSBnZXRUYWdGYWxsYmFjazsKICB9Owp9CkMuS1U9ZnVuY3Rp
-b24oaG9va3MpIHsKICBpZiAodHlwZW9mIGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyAhPSAiZnVu
-Y3Rpb24iKSByZXR1cm4gaG9va3M7CiAgaG9va3MuZ2V0VGFnID0gZGFydEV4cGVyaW1lbnRhbEZpeHVw
-R2V0VGFnKGhvb2tzLmdldFRhZyk7Cn0KQy5mUT1mdW5jdGlvbihob29rcykgewogIHZhciBnZXRUYWcg
-PSBob29rcy5nZXRUYWc7CiAgdmFyIHByb3RvdHlwZUZvclRhZyA9IGhvb2tzLnByb3RvdHlwZUZvclRh
-ZzsKICBmdW5jdGlvbiBnZXRUYWdGaXhlZChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAg
-aWYgKHRhZyA9PSAiRG9jdW1lbnQiKSB7CiAgICAgIGlmICghIW8ueG1sVmVyc2lvbikgcmV0dXJuICIh
-RG9jdW1lbnQiOwogICAgICByZXR1cm4gIiFIVE1MRG9jdW1lbnQiOwogICAgfQogICAgcmV0dXJuIHRh
-ZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnRml4ZWQodGFnKSB7CiAgICBpZiAodGFnID09
-ICJEb2N1bWVudCIpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHByb3RvdHlwZUZvclRhZyh0YWcpOwog
-IH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXhlZDsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBw
-cm90b3R5cGVGb3JUYWdGaXhlZDsKfQpDLmRrPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2Vu
-dCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7
-CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IikgPT0gLTEpIHJldHVybiBob29rczsKICB2
-YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxv
-YWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiR2Vv
-R2VvbG9jYXRpb24iOiAiR2VvbG9jYXRpb24iLAogICAgIkxvY2F0aW9uIjogIiFMb2NhdGlvbiIsCiAg
-ICAiV29ya2VyTWVzc2FnZUV2ZW50IjogIk1lc3NhZ2VFdmVudCIsCiAgICAiWE1MRG9jdW1lbnQiOiAi
-IURvY3VtZW50In07CiAgZnVuY3Rpb24gZ2V0VGFnRmlyZWZveChvKSB7CiAgICB2YXIgdGFnID0gZ2V0
-VGFnKG8pOwogICAgcmV0dXJuIHF1aWNrTWFwW3RhZ10gfHwgdGFnOwogIH0KICBob29rcy5nZXRUYWcg
-PSBnZXRUYWdGaXJlZm94Owp9CkMueGk9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0g
-dHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBp
-ZiAodXNlckFnZW50LmluZGV4T2YoIlRyaWRlbnQvIikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIg
-Z2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRF
-dmVudCI6ICJFdmVudCIsCiAgICAiRGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiSFRNTERE
-RWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTERURWxlbWVudCI6ICJIVE1MRWxlbWVudCIs
-CiAgICAiSFRNTFBocmFzZUVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIlBvc2l0aW9uIjogIkdl
-b3Bvc2l0aW9uIgogIH07CiAgZnVuY3Rpb24gZ2V0VGFnSUUobykgewogICAgdmFyIHRhZyA9IGdldFRh
-ZyhvKTsKICAgIHZhciBuZXdUYWcgPSBxdWlja01hcFt0YWddOwogICAgaWYgKG5ld1RhZykgcmV0dXJu
-IG5ld1RhZzsKICAgIGlmICh0YWcgPT0gIk9iamVjdCIpIHsKICAgICAgaWYgKHdpbmRvdy5EYXRhVmll
-dyAmJiAobyBpbnN0YW5jZW9mIHdpbmRvdy5EYXRhVmlldykpIHJldHVybiAiRGF0YVZpZXciOwogICAg
-fQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnSUUodGFnKSB7CiAg
-ICB2YXIgY29uc3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxs
-KSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGhvb2tz
-LmdldFRhZyA9IGdldFRhZ0lFOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRh
-Z0lFOwp9CkMuaTc9ZnVuY3Rpb24oaG9va3MpIHsgcmV0dXJuIGhvb2tzOyB9CgpDLkN0PW5ldyBQLmJ5
-KCkKQy5FcT1uZXcgUC5rNSgpCkMueE09bmV3IFAudTUoKQpDLlFrPW5ldyBQLkUzKCkKQy5Odj1uZXcg
-SC5rcigpCkMuTlU9bmV3IFAuSmkoKQpDLnBkPW5ldyBQLlpkKCkKQy5BZD1uZXcgTS5INygwLCJIaW50
-QWN0aW9uS2luZC5hZGROdWxsYWJsZUhpbnQiKQpDLm5lPW5ldyBNLkg3KDEsIkhpbnRBY3Rpb25LaW5k
-LmFkZE5vbk51bGxhYmxlSGludCIpCkMubXk9bmV3IE0uSDcoMiwiSGludEFjdGlvbktpbmQuY2hhbmdl
-VG9OdWxsYWJsZUhpbnQiKQpDLnJ4PW5ldyBNLkg3KDMsIkhpbnRBY3Rpb25LaW5kLmNoYW5nZVRvTm9u
-TnVsbGFibGVIaW50IikKQy53Vj1uZXcgTS5INyg0LCJIaW50QWN0aW9uS2luZC5yZW1vdmVOdWxsYWJs
-ZUhpbnQiKQpDLmZSPW5ldyBNLkg3KDUsIkhpbnRBY3Rpb25LaW5kLnJlbW92ZU5vbk51bGxhYmxlSGlu
-dCIpCkMuQTM9bmV3IFAuTXgobnVsbCkKQy5uWD1uZXcgUC5vaihudWxsKQpDLmN3PW5ldyBMLkdiKDAs
-IlVuaXRNaWdyYXRpb25TdGF0dXMuYWxyZWFkeU1pZ3JhdGVkIikKQy5kYz1uZXcgTC5HYigxLCJVbml0
-TWlncmF0aW9uU3RhdHVzLmluZGV0ZXJtaW5hdGUiKQpDLldEPW5ldyBMLkdiKDIsIlVuaXRNaWdyYXRp
-b25TdGF0dXMubWlncmF0aW5nIikKQy5Yaj1uZXcgTC5HYigzLCJVbml0TWlncmF0aW9uU3RhdHVzLm9w
-dGluZ091dCIpCkMubDA9SC5WTShzKFtDLmN3LEMuZGMsQy5XRCxDLlhqXSksSC5OMCgiamQ8R2IqPiIp
-KQpDLmFrPUguVk0ocyhbMCwwLDMyNzc2LDMzNzkyLDEsMTAyNDAsMCwwXSksdC5WKQpDLmNtPUguVk0o
-cyhbIio6OmNsYXNzIiwiKjo6ZGlyIiwiKjo6ZHJhZ2dhYmxlIiwiKjo6aGlkZGVuIiwiKjo6aWQiLCIq
-OjppbmVydCIsIio6Oml0ZW1wcm9wIiwiKjo6aXRlbXJlZiIsIio6Oml0ZW1zY29wZSIsIio6Omxhbmci
-LCIqOjpzcGVsbGNoZWNrIiwiKjo6dGl0bGUiLCIqOjp0cmFuc2xhdGUiLCJBOjphY2Nlc3NrZXkiLCJB
-Ojpjb29yZHMiLCJBOjpocmVmbGFuZyIsIkE6Om5hbWUiLCJBOjpzaGFwZSIsIkE6OnRhYmluZGV4Iiwi
-QTo6dGFyZ2V0IiwiQTo6dHlwZSIsIkFSRUE6OmFjY2Vzc2tleSIsIkFSRUE6OmFsdCIsIkFSRUE6OmNv
-b3JkcyIsIkFSRUE6Om5vaHJlZiIsIkFSRUE6OnNoYXBlIiwiQVJFQTo6dGFiaW5kZXgiLCJBUkVBOjp0
-YXJnZXQiLCJBVURJTzo6Y29udHJvbHMiLCJBVURJTzo6bG9vcCIsIkFVRElPOjptZWRpYWdyb3VwIiwi
-QVVESU86Om11dGVkIiwiQVVESU86OnByZWxvYWQiLCJCRE86OmRpciIsIkJPRFk6OmFsaW5rIiwiQk9E
-WTo6Ymdjb2xvciIsIkJPRFk6OmxpbmsiLCJCT0RZOjp0ZXh0IiwiQk9EWTo6dmxpbmsiLCJCUjo6Y2xl
-YXIiLCJCVVRUT046OmFjY2Vzc2tleSIsIkJVVFRPTjo6ZGlzYWJsZWQiLCJCVVRUT046Om5hbWUiLCJC
-VVRUT046OnRhYmluZGV4IiwiQlVUVE9OOjp0eXBlIiwiQlVUVE9OOjp2YWx1ZSIsIkNBTlZBUzo6aGVp
-Z2h0IiwiQ0FOVkFTOjp3aWR0aCIsIkNBUFRJT046OmFsaWduIiwiQ09MOjphbGlnbiIsIkNPTDo6Y2hh
-ciIsIkNPTDo6Y2hhcm9mZiIsIkNPTDo6c3BhbiIsIkNPTDo6dmFsaWduIiwiQ09MOjp3aWR0aCIsIkNP
-TEdST1VQOjphbGlnbiIsIkNPTEdST1VQOjpjaGFyIiwiQ09MR1JPVVA6OmNoYXJvZmYiLCJDT0xHUk9V
-UDo6c3BhbiIsIkNPTEdST1VQOjp2YWxpZ24iLCJDT0xHUk9VUDo6d2lkdGgiLCJDT01NQU5EOjpjaGVj
-a2VkIiwiQ09NTUFORDo6Y29tbWFuZCIsIkNPTU1BTkQ6OmRpc2FibGVkIiwiQ09NTUFORDo6bGFiZWwi
-LCJDT01NQU5EOjpyYWRpb2dyb3VwIiwiQ09NTUFORDo6dHlwZSIsIkRBVEE6OnZhbHVlIiwiREVMOjpk
-YXRldGltZSIsIkRFVEFJTFM6Om9wZW4iLCJESVI6OmNvbXBhY3QiLCJESVY6OmFsaWduIiwiREw6OmNv
-bXBhY3QiLCJGSUVMRFNFVDo6ZGlzYWJsZWQiLCJGT05UOjpjb2xvciIsIkZPTlQ6OmZhY2UiLCJGT05U
-OjpzaXplIiwiRk9STTo6YWNjZXB0IiwiRk9STTo6YXV0b2NvbXBsZXRlIiwiRk9STTo6ZW5jdHlwZSIs
-IkZPUk06Om1ldGhvZCIsIkZPUk06Om5hbWUiLCJGT1JNOjpub3ZhbGlkYXRlIiwiRk9STTo6dGFyZ2V0
-IiwiRlJBTUU6Om5hbWUiLCJIMTo6YWxpZ24iLCJIMjo6YWxpZ24iLCJIMzo6YWxpZ24iLCJINDo6YWxp
-Z24iLCJINTo6YWxpZ24iLCJINjo6YWxpZ24iLCJIUjo6YWxpZ24iLCJIUjo6bm9zaGFkZSIsIkhSOjpz
-aXplIiwiSFI6OndpZHRoIiwiSFRNTDo6dmVyc2lvbiIsIklGUkFNRTo6YWxpZ24iLCJJRlJBTUU6OmZy
-YW1lYm9yZGVyIiwiSUZSQU1FOjpoZWlnaHQiLCJJRlJBTUU6Om1hcmdpbmhlaWdodCIsIklGUkFNRTo6
-bWFyZ2lud2lkdGgiLCJJRlJBTUU6OndpZHRoIiwiSU1HOjphbGlnbiIsIklNRzo6YWx0IiwiSU1HOjpi
-b3JkZXIiLCJJTUc6OmhlaWdodCIsIklNRzo6aHNwYWNlIiwiSU1HOjppc21hcCIsIklNRzo6bmFtZSIs
-IklNRzo6dXNlbWFwIiwiSU1HOjp2c3BhY2UiLCJJTUc6OndpZHRoIiwiSU5QVVQ6OmFjY2VwdCIsIklO
-UFVUOjphY2Nlc3NrZXkiLCJJTlBVVDo6YWxpZ24iLCJJTlBVVDo6YWx0IiwiSU5QVVQ6OmF1dG9jb21w
-bGV0ZSIsIklOUFVUOjphdXRvZm9jdXMiLCJJTlBVVDo6Y2hlY2tlZCIsIklOUFVUOjpkaXNhYmxlZCIs
-IklOUFVUOjppbnB1dG1vZGUiLCJJTlBVVDo6aXNtYXAiLCJJTlBVVDo6bGlzdCIsIklOUFVUOjptYXgi
-LCJJTlBVVDo6bWF4bGVuZ3RoIiwiSU5QVVQ6Om1pbiIsIklOUFVUOjptdWx0aXBsZSIsIklOUFVUOjpu
-YW1lIiwiSU5QVVQ6OnBsYWNlaG9sZGVyIiwiSU5QVVQ6OnJlYWRvbmx5IiwiSU5QVVQ6OnJlcXVpcmVk
-IiwiSU5QVVQ6OnNpemUiLCJJTlBVVDo6c3RlcCIsIklOUFVUOjp0YWJpbmRleCIsIklOUFVUOjp0eXBl
-IiwiSU5QVVQ6OnVzZW1hcCIsIklOUFVUOjp2YWx1ZSIsIklOUzo6ZGF0ZXRpbWUiLCJLRVlHRU46OmRp
-c2FibGVkIiwiS0VZR0VOOjprZXl0eXBlIiwiS0VZR0VOOjpuYW1lIiwiTEFCRUw6OmFjY2Vzc2tleSIs
-IkxBQkVMOjpmb3IiLCJMRUdFTkQ6OmFjY2Vzc2tleSIsIkxFR0VORDo6YWxpZ24iLCJMSTo6dHlwZSIs
-IkxJOjp2YWx1ZSIsIkxJTks6OnNpemVzIiwiTUFQOjpuYW1lIiwiTUVOVTo6Y29tcGFjdCIsIk1FTlU6
-OmxhYmVsIiwiTUVOVTo6dHlwZSIsIk1FVEVSOjpoaWdoIiwiTUVURVI6OmxvdyIsIk1FVEVSOjptYXgi
-LCJNRVRFUjo6bWluIiwiTUVURVI6OnZhbHVlIiwiT0JKRUNUOjp0eXBlbXVzdG1hdGNoIiwiT0w6OmNv
-bXBhY3QiLCJPTDo6cmV2ZXJzZWQiLCJPTDo6c3RhcnQiLCJPTDo6dHlwZSIsIk9QVEdST1VQOjpkaXNh
-YmxlZCIsIk9QVEdST1VQOjpsYWJlbCIsIk9QVElPTjo6ZGlzYWJsZWQiLCJPUFRJT046OmxhYmVsIiwi
-T1BUSU9OOjpzZWxlY3RlZCIsIk9QVElPTjo6dmFsdWUiLCJPVVRQVVQ6OmZvciIsIk9VVFBVVDo6bmFt
-ZSIsIlA6OmFsaWduIiwiUFJFOjp3aWR0aCIsIlBST0dSRVNTOjptYXgiLCJQUk9HUkVTUzo6bWluIiwi
-UFJPR1JFU1M6OnZhbHVlIiwiU0VMRUNUOjphdXRvY29tcGxldGUiLCJTRUxFQ1Q6OmRpc2FibGVkIiwi
-U0VMRUNUOjptdWx0aXBsZSIsIlNFTEVDVDo6bmFtZSIsIlNFTEVDVDo6cmVxdWlyZWQiLCJTRUxFQ1Q6
-OnNpemUiLCJTRUxFQ1Q6OnRhYmluZGV4IiwiU09VUkNFOjp0eXBlIiwiVEFCTEU6OmFsaWduIiwiVEFC
-TEU6OmJnY29sb3IiLCJUQUJMRTo6Ym9yZGVyIiwiVEFCTEU6OmNlbGxwYWRkaW5nIiwiVEFCTEU6OmNl
-bGxzcGFjaW5nIiwiVEFCTEU6OmZyYW1lIiwiVEFCTEU6OnJ1bGVzIiwiVEFCTEU6OnN1bW1hcnkiLCJU
-QUJMRTo6d2lkdGgiLCJUQk9EWTo6YWxpZ24iLCJUQk9EWTo6Y2hhciIsIlRCT0RZOjpjaGFyb2ZmIiwi
-VEJPRFk6OnZhbGlnbiIsIlREOjphYmJyIiwiVEQ6OmFsaWduIiwiVEQ6OmF4aXMiLCJURDo6Ymdjb2xv
-ciIsIlREOjpjaGFyIiwiVEQ6OmNoYXJvZmYiLCJURDo6Y29sc3BhbiIsIlREOjpoZWFkZXJzIiwiVEQ6
-OmhlaWdodCIsIlREOjpub3dyYXAiLCJURDo6cm93c3BhbiIsIlREOjpzY29wZSIsIlREOjp2YWxpZ24i
-LCJURDo6d2lkdGgiLCJURVhUQVJFQTo6YWNjZXNza2V5IiwiVEVYVEFSRUE6OmF1dG9jb21wbGV0ZSIs
-IlRFWFRBUkVBOjpjb2xzIiwiVEVYVEFSRUE6OmRpc2FibGVkIiwiVEVYVEFSRUE6OmlucHV0bW9kZSIs
-IlRFWFRBUkVBOjpuYW1lIiwiVEVYVEFSRUE6OnBsYWNlaG9sZGVyIiwiVEVYVEFSRUE6OnJlYWRvbmx5
-IiwiVEVYVEFSRUE6OnJlcXVpcmVkIiwiVEVYVEFSRUE6OnJvd3MiLCJURVhUQVJFQTo6dGFiaW5kZXgi
-LCJURVhUQVJFQTo6d3JhcCIsIlRGT09UOjphbGlnbiIsIlRGT09UOjpjaGFyIiwiVEZPT1Q6OmNoYXJv
-ZmYiLCJURk9PVDo6dmFsaWduIiwiVEg6OmFiYnIiLCJUSDo6YWxpZ24iLCJUSDo6YXhpcyIsIlRIOjpi
-Z2NvbG9yIiwiVEg6OmNoYXIiLCJUSDo6Y2hhcm9mZiIsIlRIOjpjb2xzcGFuIiwiVEg6OmhlYWRlcnMi
-LCJUSDo6aGVpZ2h0IiwiVEg6Om5vd3JhcCIsIlRIOjpyb3dzcGFuIiwiVEg6OnNjb3BlIiwiVEg6OnZh
-bGlnbiIsIlRIOjp3aWR0aCIsIlRIRUFEOjphbGlnbiIsIlRIRUFEOjpjaGFyIiwiVEhFQUQ6OmNoYXJv
-ZmYiLCJUSEVBRDo6dmFsaWduIiwiVFI6OmFsaWduIiwiVFI6OmJnY29sb3IiLCJUUjo6Y2hhciIsIlRS
-OjpjaGFyb2ZmIiwiVFI6OnZhbGlnbiIsIlRSQUNLOjpkZWZhdWx0IiwiVFJBQ0s6OmtpbmQiLCJUUkFD
-Szo6bGFiZWwiLCJUUkFDSzo6c3JjbGFuZyIsIlVMOjpjb21wYWN0IiwiVUw6OnR5cGUiLCJWSURFTzo6
-Y29udHJvbHMiLCJWSURFTzo6aGVpZ2h0IiwiVklERU86Omxvb3AiLCJWSURFTzo6bWVkaWFncm91cCIs
-IlZJREVPOjptdXRlZCIsIlZJREVPOjpwcmVsb2FkIiwiVklERU86OndpZHRoIl0pLHQuaSkKQy5WQz1I
-LlZNKHMoWzAsMCw2NTQ5MCw0NTA1NSw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5tSz1I
-LlZNKHMoWzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcsNjU1MzQsMjA0N10pLHQuVikKQy5TcT1ILlZN
-KHMoWyJIRUFEIiwiQVJFQSIsIkJBU0UiLCJCQVNFRk9OVCIsIkJSIiwiQ09MIiwiQ09MR1JPVVAiLCJF
-TUJFRCIsIkZSQU1FIiwiRlJBTUVTRVQiLCJIUiIsIklNQUdFIiwiSU1HIiwiSU5QVVQiLCJJU0lOREVY
-IiwiTElOSyIsIk1FVEEiLCJQQVJBTSIsIlNPVVJDRSIsIlNUWUxFIiwiVElUTEUiLCJXQlIiXSksdC5p
-KQpDLmhVPUguVk0ocyhbXSksdC5iKQpDLmRuPUguVk0ocyhbXSksSC5OMCgiamQ8TEwqPiIpKQpDLnhE
-PUguVk0ocyhbXSksdC5pKQpDLnRvPUguVk0ocyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM0LDM0ODE1LDY1
-NTM0LDE4NDMxXSksdC5WKQpDLnJrPUguVk0ocyhbQy5BZCxDLm5lLEMubXksQy5yeCxDLndWLEMuZlJd
-KSxILk4wKCJqZDxINyo+IikpCkMuRjM9SC5WTShzKFswLDAsMjQ1NzYsMTAyMyw2NTUzNCwzNDgxNSw2
-NTUzNCwxODQzMV0pLHQuVikKQy5lYT1ILlZNKHMoWzAsMCwzMjc1NCwxMTI2Myw2NTUzNCwzNDgxNSw2
-NTUzNCwxODQzMV0pLHQuVikKQy5aSj1ILlZNKHMoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNSwzNDgxNSw2
-NTUzNCwxODQzMV0pLHQuVikKQy5XZD1ILlZNKHMoWzAsMCw2NTQ5MCwxMjI4Nyw2NTUzNSwzNDgxNSw2
-NTUzNCwxODQzMV0pLHQuVikKQy5ReD1ILlZNKHMoWyJiaW5kIiwiaWYiLCJyZWYiLCJyZXBlYXQiLCJz
-eW50YXgiXSksdC5pKQpDLkJJPUguVk0ocyhbIkE6OmhyZWYiLCJBUkVBOjpocmVmIiwiQkxPQ0tRVU9U
-RTo6Y2l0ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJDT01NQU5EOjppY29uIiwiREVMOjpjaXRlIiwiRk9S
-TTo6YWN0aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6c3JjIiwiSU5TOjpjaXRlIiwiUTo6Y2l0ZSIsIlZJ
-REVPOjpwb3N0ZXIiXSksdC5pKQpDLkR4PW5ldyBILkxQKDAse30sQy54RCxILk4wKCJMUDxxVSosek08
-ajgqPio+IikpCkMuQ009bmV3IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVKixxVSo+IikpCkMuaUg9
-SC5WTShzKFtdKSxILk4wKCJqZDxHRCo+IikpCkMuV089bmV3IEguTFAoMCx7fSxDLmlILEguTjAoIkxQ
-PEdEKixAPiIpKQpDLlkyPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVUeXBlLmRpcmVjdG9yeSIp
-CkMucmY9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZmlsZSIpCkMuVGU9bmV3IEgud3Yo
-ImNhbGwiKQpDLm9FPW5ldyBQLkdZKCExKQpDLndRPW5ldyBQLkZ5KG51bGwsMil9KSgpOyhmdW5jdGlv
-biBzdGF0aWNGaWVsZHMoKXskLnptPW51bGwKJC55aj0wCiQubUo9bnVsbAokLlA0PW51bGwKJC5ORj1u
-dWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVsbAokLkJ2PW51bGwKJC5TNj1u
-dWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUKJC54Zz1ILlZNKFtdLEguTjAo
-ImpkPE1oPiIpKQokLnhvPW51bGwKJC5CTz1udWxsCiQubHQ9bnVsbAokLkVVPW51bGwKJC5vcj1QLkZs
-KHQuTix0LlkpCiQuSVI9bnVsbAokLkk2PW51bGwKJC5GZj1udWxsfSkoKTsoZnVuY3Rpb24gbGF6eUlu
-aXRpYWxpemVycygpe3ZhciBzPWh1bmtIZWxwZXJzLmxhenlGaW5hbCxyPWh1bmtIZWxwZXJzLmxhenlP
-bGQKcygkLCJmYSIsInciLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIp
-fSkKcygkLCJVMiIsIlNuIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoewp0b1N0cmluZzpmdW5j
-dGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQpzKCQsInhxIiwibHEiLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguY00oSC5TNyh7JG1ldGhvZCQ6bnVsbCwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJl
-Y2VpdmVyJCJ9fSkpfSkKcygkLCJSMSIsIk45IixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcobnVs
-bCkpfSkKcygkLCJmTiIsImlJIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRh
-cmd1bWVudHNFeHByJD0iJGFyZ3VtZW50cyQiCnRyeXtudWxsLiRtZXRob2QkKCRhcmd1bWVudHNFeHBy
-JCl9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkpfSkKcygkLCJxaSIsIlVOIixmdW5jdGlvbigp
-e3JldHVybiBILmNNKEguUzcodm9pZCAwKSl9KQpzKCQsInJaIiwiWmgiLGZ1bmN0aW9uKCl7cmV0dXJu
-IEguY00oZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSIkYXJndW1lbnRzJCIKdHJ5eyh2b2lk
-IDApLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkp
-fSkKcygkLCJrcSIsInJOIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoobnVsbCkpfSkKcygkLCJ0
-dCIsImMzIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5e251bGwuJG1ldGhvZCR9
-Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkpfSkKcygkLCJkdCIsIkhLIixmdW5jdGlvbigpe3Jl
-dHVybiBILmNNKEguTWoodm9pZCAwKSl9KQpzKCQsIkE3IiwicjEiLGZ1bmN0aW9uKCl7cmV0dXJuIEgu
-Y00oZnVuY3Rpb24oKXt0cnl7KHZvaWQgMCkuJG1ldGhvZCR9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2Fn
-ZX19KCkpfSkKcygkLCJXYyIsInV0IixmdW5jdGlvbigpe3JldHVybiBQLk9qKCl9KQpzKCQsImtoIiwi
-cmYiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLnhyKCkuJDAoKX0pCnMoJCwiZEgiLCJIRyIsZnVuY3Rp
-b24oKXtyZXR1cm4gbmV3IFAuTnooKS4kMCgpfSkKcygkLCJidCIsIlY3IixmdW5jdGlvbigpe3JldHVy
-biBuZXcgSW50OEFycmF5KEguWEYoSC5WTShbLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
-LTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
-LTIsLTIsLTIsLTIsLTIsLTIsLTEsLTIsLTIsLTIsLTIsLTIsNjIsLTIsNjIsLTIsNjMsNTIsNTMsNTQs
-NTUsNTYsNTcsNTgsNTksNjAsNjEsLTIsLTIsLTIsLTEsLTIsLTIsLTIsMCwxLDIsMyw0LDUsNiw3LDgs
-OSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMiwtMiwtMiwt
-Miw2MywtMiwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0
-Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMiwtMiwtMiwtMiwtMl0sdC5hKSkpfSkKcygkLCJNNSIs
-IndRIixmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5w
-cm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09IltvYmplY3QgcHJvY2Vzc10iJiZwcm9jZXNz
-LnBsYXRmb3JtPT0id2luMzIifSkKcygkLCJtZiIsIno0IixmdW5jdGlvbigpe3JldHVybiBQLm51KCJe
-W1xcLVxcLjAtOUEtWl9hLXp+XSokIil9KQpzKCQsIk9RIiwidloiLGZ1bmN0aW9uKCl7cmV0dXJuIFAu
-S04oKX0pCnMoJCwiU0MiLCJBTiIsZnVuY3Rpb24oKXtyZXR1cm4gUC50TShbIkEiLCJBQkJSIiwiQUNS
-T05ZTSIsIkFERFJFU1MiLCJBUkVBIiwiQVJUSUNMRSIsIkFTSURFIiwiQVVESU8iLCJCIiwiQkRJIiwi
-QkRPIiwiQklHIiwiQkxPQ0tRVU9URSIsIkJSIiwiQlVUVE9OIiwiQ0FOVkFTIiwiQ0FQVElPTiIsIkNF
-TlRFUiIsIkNJVEUiLCJDT0RFIiwiQ09MIiwiQ09MR1JPVVAiLCJDT01NQU5EIiwiREFUQSIsIkRBVEFM
-SVNUIiwiREQiLCJERUwiLCJERVRBSUxTIiwiREZOIiwiRElSIiwiRElWIiwiREwiLCJEVCIsIkVNIiwi
-RklFTERTRVQiLCJGSUdDQVBUSU9OIiwiRklHVVJFIiwiRk9OVCIsIkZPT1RFUiIsIkZPUk0iLCJIMSIs
-IkgyIiwiSDMiLCJINCIsIkg1IiwiSDYiLCJIRUFERVIiLCJIR1JPVVAiLCJIUiIsIkkiLCJJRlJBTUUi
-LCJJTUciLCJJTlBVVCIsIklOUyIsIktCRCIsIkxBQkVMIiwiTEVHRU5EIiwiTEkiLCJNQVAiLCJNQVJL
-IiwiTUVOVSIsIk1FVEVSIiwiTkFWIiwiTk9CUiIsIk9MIiwiT1BUR1JPVVAiLCJPUFRJT04iLCJPVVRQ
-VVQiLCJQIiwiUFJFIiwiUFJPR1JFU1MiLCJRIiwiUyIsIlNBTVAiLCJTRUNUSU9OIiwiU0VMRUNUIiwi
-U01BTEwiLCJTT1VSQ0UiLCJTUEFOIiwiU1RSSUtFIiwiU1RST05HIiwiU1VCIiwiU1VNTUFSWSIsIlNV
-UCIsIlRBQkxFIiwiVEJPRFkiLCJURCIsIlRFWFRBUkVBIiwiVEZPT1QiLCJUSCIsIlRIRUFEIiwiVElN
-RSIsIlRSIiwiVFJBQ0siLCJUVCIsIlUiLCJVTCIsIlZBUiIsIlZJREVPIiwiV0JSIl0sdC5OKX0pCnMo
-JCwiWDQiLCJoRyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXlxcUyskIil9KQpzKCQsIndPIiwib3ci
-LGZ1bmN0aW9uKCl7cmV0dXJuIFAuTkQoc2VsZil9KQpzKCQsImt0IiwiUjgiLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguWWcoIl8kZGFydF9kYXJ0T2JqZWN0Iil9KQpzKCQsImZLIiwia0kiLGZ1bmN0aW9uKCl7cmV0
-dXJuIGZ1bmN0aW9uIERhcnRPYmplY3QoYSl7dGhpcy5vPWF9fSkKcigkLCJxdCIsInpCIixmdW5jdGlv
-bigpe3JldHVybiBuZXcgVC5tUSgpfSkKcigkLCJPbCIsIlVFIixmdW5jdGlvbigpe3JldHVybiBQLmhL
-KEMub2wuZ21XKFcueDMoKSkuaHJlZikuZ2hZKCkucSgwLCJhdXRoVG9rZW4iKX0pCnIoJCwiaFQiLCJ5
-UCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0LWxpc3QgLnBhbmVs
-LWNvbnRlbnQiKX0pCnIoJCwiVzYiLCJoTCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2Vs
-ZWN0b3IoIi5lZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50Iil9KQpyKCQsIlRSIiwiRFciLGZ1bmN0aW9u
-KCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJmb290ZXIiKX0pCnIoJCwiRVkiLCJmaSIsZnVu
-Y3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoImhlYWRlciIpfSkKcigkLCJhdiIsIkQ5
-IixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiI3VuaXQtbmFtZSIpfSkKcigk
-LCJ0MCIsImJOIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiI21pZ3JhdGUt
-dW5pdC1zdGF0dXMtaWNvbi1sYWJlbCIpfSkKcigkLCJiQSIsImMwIixmdW5jdGlvbigpe3JldHVybiBX
-LlpyKCkucXVlcnlTZWxlY3RvcigiI21pZ3JhdGUtdW5pdC1zdGF0dXMtaWNvbiIpfSkKcigkLCJmZSIs
-IktHIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5YQSgpfSkKcygkLCJlbyIsIm5VIixmdW5jdGlvbigp
-e3JldHVybiBuZXcgTS5sSSgkLkhrKCkpfSkKcygkLCJ5ciIsImJEIixmdW5jdGlvbigpe3JldHVybiBu
-ZXcgRS5PRihQLm51KCIvIiksUC5udSgiW14vXSQiKSxQLm51KCJeLyIpKX0pCnMoJCwiTWsiLCJLayIs
-ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuSVYoUC5udSgiWy9cXFxcXSIpLFAubnUoIlteL1xcXFxdJCIp
-LFAubnUoIl4oXFxcXFxcXFxbXlxcXFxdK1xcXFxbXlxcXFwvXSt8W2EtekEtWl06Wy9cXFxcXSkiKSxQ
-Lm51KCJeWy9cXFxcXSg/IVsvXFxcXF0pIikpfSkKcygkLCJhayIsIkViIixmdW5jdGlvbigpe3JldHVy
-biBuZXcgRi5ydShQLm51KCIvIiksUC5udSgiKF5bYS16QS1aXVstKy5hLXpBLVpcXGRdKjovL3xbXi9d
-KSQiKSxQLm51KCJbYS16QS1aXVstKy5hLXpBLVpcXGRdKjovL1teL10qIiksUC5udSgiXi8iKSl9KQpz
-KCQsImxzIiwiSGsiLGZ1bmN0aW9uKCl7cmV0dXJuIE8uUmgoKX0pfSkoKTsoZnVuY3Rpb24gbmF0aXZl
-U3VwcG9ydCgpeyFmdW5jdGlvbigpe3ZhciBzPWZ1bmN0aW9uKGEpe3ZhciBtPXt9Cm1bYV09MQpyZXR1
-cm4gT2JqZWN0LmtleXMoaHVua0hlbHBlcnMuY29udmVydFRvRmFzdE9iamVjdChtKSlbMF19CnYuZ2V0
-SXNvbGF0ZVRhZz1mdW5jdGlvbihhKXtyZXR1cm4gcygiX19fZGFydF8iK2Erdi5pc29sYXRlVGFnKX0K
-dmFyIHI9Il9fX2RhcnRfaXNvbGF0ZV90YWdzXyIKdmFyIHE9T2JqZWN0W3JdfHwoT2JqZWN0W3JdPU9i
-amVjdC5jcmVhdGUobnVsbCkpCnZhciBwPSJfWnhZeFgiCmZvcih2YXIgbz0wOztvKyspe3ZhciBuPXMo
-cCsiXyIrbysiXyIpCmlmKCEobiBpbiBxKSl7cVtuXT0xCnYuaXNvbGF0ZVRhZz1uCmJyZWFrfX12LmRp
-c3BhdGNoUHJvcGVydHlOYW1lPXYuZ2V0SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIil9KCkKaHVu
-a0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRlcmNlcHRvcnNCeVRhZyh7RE9NRXJyb3I6Si5HdixNZWRpYUVy
-cm9yOkouR3YsTmF2aWdhdG9yOkouR3YsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOkouR3YsTmF2
-aWdhdG9yVXNlck1lZGlhRXJyb3I6Si5HdixPdmVyY29uc3RyYWluZWRFcnJvcjpKLkd2LFBvc2l0aW9u
-RXJyb3I6Si5HdixSYW5nZTpKLkd2LFNRTEVycm9yOkouR3YsRGF0YVZpZXc6SC5FVCxBcnJheUJ1ZmZl
-clZpZXc6SC5FVCxGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0QXJyYXk6SC5EZyxJbnQxNkFycmF5Okgu
-eGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVpbnQxNkFycmF5OkguZFQsVWludDMyQXJy
-YXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZhc1BpeGVsQXJyYXk6SC5lRSxVaW50OEFy
-cmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxCUkVsZW1lbnQ6Vy5xRSxIVE1MQnV0dG9u
-RWxlbWVudDpXLnFFLEhUTUxDYW52YXNFbGVtZW50OlcucUUsSFRNTENvbnRlbnRFbGVtZW50OlcucUUs
-SFRNTERMaXN0RWxlbWVudDpXLnFFLEhUTUxEYXRhRWxlbWVudDpXLnFFLEhUTUxEYXRhTGlzdEVsZW1l
-bnQ6Vy5xRSxIVE1MRGV0YWlsc0VsZW1lbnQ6Vy5xRSxIVE1MRGlhbG9nRWxlbWVudDpXLnFFLEhUTUxE
-aXZFbGVtZW50OlcucUUsSFRNTEVtYmVkRWxlbWVudDpXLnFFLEhUTUxGaWVsZFNldEVsZW1lbnQ6Vy5x
-RSxIVE1MSFJFbGVtZW50OlcucUUsSFRNTEhlYWRFbGVtZW50OlcucUUsSFRNTEhlYWRpbmdFbGVtZW50
-OlcucUUsSFRNTEh0bWxFbGVtZW50OlcucUUsSFRNTElGcmFtZUVsZW1lbnQ6Vy5xRSxIVE1MSW1hZ2VF
-bGVtZW50OlcucUUsSFRNTElucHV0RWxlbWVudDpXLnFFLEhUTUxMSUVsZW1lbnQ6Vy5xRSxIVE1MTGFi
-ZWxFbGVtZW50OlcucUUsSFRNTExlZ2VuZEVsZW1lbnQ6Vy5xRSxIVE1MTGlua0VsZW1lbnQ6Vy5xRSxI
-VE1MTWFwRWxlbWVudDpXLnFFLEhUTUxNZWRpYUVsZW1lbnQ6Vy5xRSxIVE1MTWVudUVsZW1lbnQ6Vy5x
-RSxIVE1MTWV0YUVsZW1lbnQ6Vy5xRSxIVE1MTWV0ZXJFbGVtZW50OlcucUUsSFRNTE1vZEVsZW1lbnQ6
-Vy5xRSxIVE1MT0xpc3RFbGVtZW50OlcucUUsSFRNTE9iamVjdEVsZW1lbnQ6Vy5xRSxIVE1MT3B0R3Jv
-dXBFbGVtZW50OlcucUUsSFRNTE9wdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MT3V0cHV0RWxlbWVudDpXLnFF
-LEhUTUxQYXJhbUVsZW1lbnQ6Vy5xRSxIVE1MUGljdHVyZUVsZW1lbnQ6Vy5xRSxIVE1MUHJlRWxlbWVu
-dDpXLnFFLEhUTUxQcm9ncmVzc0VsZW1lbnQ6Vy5xRSxIVE1MUXVvdGVFbGVtZW50OlcucUUsSFRNTFNj
-cmlwdEVsZW1lbnQ6Vy5xRSxIVE1MU2hhZG93RWxlbWVudDpXLnFFLEhUTUxTbG90RWxlbWVudDpXLnFF
-LEhUTUxTb3VyY2VFbGVtZW50OlcucUUsSFRNTFNwYW5FbGVtZW50OlcucUUsSFRNTFN0eWxlRWxlbWVu
-dDpXLnFFLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OlcucUUsSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6Vy5x
-RSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudDpX
-LnFFLEhUTUxUYWJsZUNvbEVsZW1lbnQ6Vy5xRSxIVE1MVGV4dEFyZWFFbGVtZW50OlcucUUsSFRNTFRp
-bWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVudDpXLnFFLEhUTUxUcmFja0VsZW1lbnQ6Vy5xRSxI
-VE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25vd25FbGVtZW50OlcucUUsSFRNTFZpZGVvRWxlbWVu
-dDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50OlcucUUsSFRNTEZvbnRFbGVtZW50OlcucUUsSFRNTEZy
-YW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVsZW1lbnQ6Vy5xRSxIVE1MTWFycXVlZUVsZW1lbnQ6
-Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEhUTUxBbmNob3JFbGVtZW50OlcuR2gsSFRNTEFyZWFFbGVtZW50
-OlcuZlksSFRNTEJhc2VFbGVtZW50OlcubkIsQmxvYjpXLkF6LEhUTUxCb2R5RWxlbWVudDpXLlFQLENE
-QVRBU2VjdGlvbjpXLm54LENoYXJhY3RlckRhdGE6Vy5ueCxDb21tZW50OlcubngsUHJvY2Vzc2luZ0lu
-c3RydWN0aW9uOlcubngsVGV4dDpXLm54LENTU1N0eWxlRGVjbGFyYXRpb246Vy5vSixNU1N0eWxlQ1NT
-UHJvcGVydGllczpXLm9KLENTUzJQcm9wZXJ0aWVzOlcub0osWE1MRG9jdW1lbnQ6Vy5RRixEb2N1bWVu
-dDpXLlFGLERPTUV4Y2VwdGlvbjpXLk5oLERPTUltcGxlbWVudGF0aW9uOlcuYWUsRE9NUmVjdFJlYWRP
-bmx5OlcuSUIsRE9NVG9rZW5MaXN0OlcubjcsRWxlbWVudDpXLmN2LEFib3J0UGF5bWVudEV2ZW50Olcu
-ZWEsQW5pbWF0aW9uRXZlbnQ6Vy5lYSxBbmltYXRpb25QbGF5YmFja0V2ZW50OlcuZWEsQXBwbGljYXRp
-b25DYWNoZUVycm9yRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OlcuZWEsQmFja2dy
-b3VuZEZldGNoRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5k
-RmV0Y2hlZEV2ZW50OlcuZWEsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OlcuZWEsQmVmb3JlVW5sb2Fk
-RXZlbnQ6Vy5lYSxCbG9iRXZlbnQ6Vy5lYSxDYW5NYWtlUGF5bWVudEV2ZW50OlcuZWEsQ2xpcGJvYXJk
-RXZlbnQ6Vy5lYSxDbG9zZUV2ZW50OlcuZWEsQ3VzdG9tRXZlbnQ6Vy5lYSxEZXZpY2VNb3Rpb25FdmVu
-dDpXLmVhLERldmljZU9yaWVudGF0aW9uRXZlbnQ6Vy5lYSxFcnJvckV2ZW50OlcuZWEsRXh0ZW5kYWJs
-ZUV2ZW50OlcuZWEsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDpXLmVhLEZldGNoRXZlbnQ6Vy5lYSxGb250
-RmFjZVNldExvYWRFdmVudDpXLmVhLEZvcmVpZ25GZXRjaEV2ZW50OlcuZWEsR2FtZXBhZEV2ZW50Olcu
-ZWEsSGFzaENoYW5nZUV2ZW50OlcuZWEsSW5zdGFsbEV2ZW50OlcuZWEsTWVkaWFFbmNyeXB0ZWRFdmVu
-dDpXLmVhLE1lZGlhS2V5TWVzc2FnZUV2ZW50OlcuZWEsTWVkaWFRdWVyeUxpc3RFdmVudDpXLmVhLE1l
-ZGlhU3RyZWFtRXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6Vy5lYSxNZXNzYWdlRXZlbnQ6
-Vy5lYSxNSURJQ29ubmVjdGlvbkV2ZW50OlcuZWEsTUlESU1lc3NhZ2VFdmVudDpXLmVhLE11dGF0aW9u
-RXZlbnQ6Vy5lYSxOb3RpZmljYXRpb25FdmVudDpXLmVhLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxQ
-YXltZW50UmVxdWVzdEV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDpXLmVhLFBvcFN0
-YXRlRXZlbnQ6Vy5lYSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6Vy5lYSxQcmVz
-ZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDpXLmVhLFByb21pc2VSZWplY3Rpb25FdmVudDpXLmVh
-LFB1c2hFdmVudDpXLmVhLFJUQ0RhdGFDaGFubmVsRXZlbnQ6Vy5lYSxSVENEVE1GVG9uZUNoYW5nZUV2
-ZW50OlcuZWEsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDpXLmVhLFJUQ1RyYWNrRXZlbnQ6Vy5lYSxT
-ZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OlcuZWEsU2Vuc29yRXJyb3JFdmVudDpXLmVhLFNwZWVj
-aFJlY29nbml0aW9uRXJyb3I6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OlcuZWEsU3BlZWNoU3lu
-dGhlc2lzRXZlbnQ6Vy5lYSxTdG9yYWdlRXZlbnQ6Vy5lYSxTeW5jRXZlbnQ6Vy5lYSxUcmFja0V2ZW50
-OlcuZWEsVHJhbnNpdGlvbkV2ZW50OlcuZWEsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OlcuZWEsVlJEZXZp
-Y2VFdmVudDpXLmVhLFZSRGlzcGxheUV2ZW50OlcuZWEsVlJTZXNzaW9uRXZlbnQ6Vy5lYSxNb2pvSW50
-ZXJmYWNlUmVxdWVzdEV2ZW50OlcuZWEsVVNCQ29ubmVjdGlvbkV2ZW50OlcuZWEsSURCVmVyc2lvbkNo
-YW5nZUV2ZW50OlcuZWEsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6Vy5lYSxPZmZsaW5lQXVkaW9Db21wbGV0
-aW9uRXZlbnQ6Vy5lYSxXZWJHTENvbnRleHRFdmVudDpXLmVhLEV2ZW50OlcuZWEsSW5wdXRFdmVudDpX
-LmVhLFN1Ym1pdEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuaEgsSFRNTEZvcm1FbGVt
-ZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0OlcuZkos
-WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9uOlcudzcs
-TW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdoZWVsRXZlbnQ6
-Vy5BaixEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpXLnVILERvY3VtZW50VHlwZTpXLnVI
-LE5vZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdyYXBoRWxl
-bWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5ldyxIVE1M
-U2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dFbGVtZW50
-OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5XUCxIVE1MVGVtcGxhdGVFbGVtZW50OlcueVks
-Q29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50OlcudzYsVGV4
-dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxET01XaW5k
-b3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJHbG9iYWxT
-Y29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2NvcGU6Vy5D
-bSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6Vy5yaCxN
-b3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6UC5uZCxT
-VkdBRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVFbGVtZW50OlAuaGksU1ZHQW5pbWF0ZU1vdGlvbkVsZW1l
-bnQ6UC5oaSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmhpLFNWR0FuaW1hdGlvbkVsZW1lbnQ6
-UC5oaSxTVkdDaXJjbGVFbGVtZW50OlAuaGksU1ZHQ2xpcFBhdGhFbGVtZW50OlAuaGksU1ZHRGVmc0Vs
-ZW1lbnQ6UC5oaSxTVkdEZXNjRWxlbWVudDpQLmhpLFNWR0Rpc2NhcmRFbGVtZW50OlAuaGksU1ZHRWxs
-aXBzZUVsZW1lbnQ6UC5oaSxTVkdGRUJsZW5kRWxlbWVudDpQLmhpLFNWR0ZFQ29sb3JNYXRyaXhFbGVt
-ZW50OlAuaGksU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5oaSxTVkdGRUNvbXBvc2l0ZUVs
-ZW1lbnQ6UC5oaSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZFRGlmZnVzZUxpZ2h0
-aW5nRWxlbWVudDpQLmhpLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmhpLFNWR0ZFRGlzdGFu
-dExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFRmxvb2RFbGVtZW50OlAuaGksU1ZHRkVGdW5jQUVsZW1lbnQ6
-UC5oaSxTVkdGRUZ1bmNCRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0dFbGVtZW50OlAuaGksU1ZHRkVGdW5j
-UkVsZW1lbnQ6UC5oaSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5oaSxTVkdGRUltYWdlRWxlbWVu
-dDpQLmhpLFNWR0ZFTWVyZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAuaGksU1ZH
-RkVNb3JwaG9sb2d5RWxlbWVudDpQLmhpLFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmhpLFNWR0ZFUG9pbnRM
-aWdodEVsZW1lbnQ6UC5oaSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuaGksU1ZHRkVTcG90
-TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVUaWxlRWxlbWVudDpQLmhpLFNWR0ZFVHVyYnVsZW5jZUVsZW1l
-bnQ6UC5oaSxTVkdGaWx0ZXJFbGVtZW50OlAuaGksU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6UC5oaSxT
-VkdHRWxlbWVudDpQLmhpLFNWR0dlb21ldHJ5RWxlbWVudDpQLmhpLFNWR0dyYXBoaWNzRWxlbWVudDpQ
-LmhpLFNWR0ltYWdlRWxlbWVudDpQLmhpLFNWR0xpbmVFbGVtZW50OlAuaGksU1ZHTGluZWFyR3JhZGll
-bnRFbGVtZW50OlAuaGksU1ZHTWFya2VyRWxlbWVudDpQLmhpLFNWR01hc2tFbGVtZW50OlAuaGksU1ZH
-TWV0YWRhdGFFbGVtZW50OlAuaGksU1ZHUGF0aEVsZW1lbnQ6UC5oaSxTVkdQYXR0ZXJuRWxlbWVudDpQ
-LmhpLFNWR1BvbHlnb25FbGVtZW50OlAuaGksU1ZHUG9seWxpbmVFbGVtZW50OlAuaGksU1ZHUmFkaWFs
-R3JhZGllbnRFbGVtZW50OlAuaGksU1ZHUmVjdEVsZW1lbnQ6UC5oaSxTVkdTZXRFbGVtZW50OlAuaGks
-U1ZHU3RvcEVsZW1lbnQ6UC5oaSxTVkdTdHlsZUVsZW1lbnQ6UC5oaSxTVkdTVkdFbGVtZW50OlAuaGks
-U1ZHU3dpdGNoRWxlbWVudDpQLmhpLFNWR1N5bWJvbEVsZW1lbnQ6UC5oaSxTVkdUU3BhbkVsZW1lbnQ6
-UC5oaSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5oaSxTVkdUZXh0RWxlbWVudDpQLmhpLFNWR1RleHRQ
-YXRoRWxlbWVudDpQLmhpLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5oaSxTVkdUaXRsZUVsZW1l
-bnQ6UC5oaSxTVkdVc2VFbGVtZW50OlAuaGksU1ZHVmlld0VsZW1lbnQ6UC5oaSxTVkdHcmFkaWVudEVs
-ZW1lbnQ6UC5oaSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmhpLFNWR0ZFRHJv
-cFNoYWRvd0VsZW1lbnQ6UC5oaSxTVkdNUGF0aEVsZW1lbnQ6UC5oaSxTVkdFbGVtZW50OlAuaGl9KQpo
-dW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLE1lZGlhRXJyb3I6dHJ1
-ZSxOYXZpZ2F0b3I6dHJ1ZSxOYXZpZ2F0b3JDb25jdXJyZW50SGFyZHdhcmU6dHJ1ZSxOYXZpZ2F0b3JV
-c2VyTWVkaWFFcnJvcjp0cnVlLE92ZXJjb25zdHJhaW5lZEVycm9yOnRydWUsUG9zaXRpb25FcnJvcjp0
-cnVlLFJhbmdlOnRydWUsU1FMRXJyb3I6dHJ1ZSxEYXRhVmlldzp0cnVlLEFycmF5QnVmZmVyVmlldzpm
-YWxzZSxGbG9hdDMyQXJyYXk6dHJ1ZSxGbG9hdDY0QXJyYXk6dHJ1ZSxJbnQxNkFycmF5OnRydWUsSW50
-MzJBcnJheTp0cnVlLEludDhBcnJheTp0cnVlLFVpbnQxNkFycmF5OnRydWUsVWludDMyQXJyYXk6dHJ1
-ZSxVaW50OENsYW1wZWRBcnJheTp0cnVlLENhbnZhc1BpeGVsQXJyYXk6dHJ1ZSxVaW50OEFycmF5OmZh
-bHNlLEhUTUxBdWRpb0VsZW1lbnQ6dHJ1ZSxIVE1MQlJFbGVtZW50OnRydWUsSFRNTEJ1dHRvbkVsZW1l
-bnQ6dHJ1ZSxIVE1MQ2FudmFzRWxlbWVudDp0cnVlLEhUTUxDb250ZW50RWxlbWVudDp0cnVlLEhUTUxE
-TGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGF0YUVsZW1lbnQ6dHJ1ZSxIVE1MRGF0YUxpc3RFbGVtZW50OnRy
-dWUsSFRNTERldGFpbHNFbGVtZW50OnRydWUsSFRNTERpYWxvZ0VsZW1lbnQ6dHJ1ZSxIVE1MRGl2RWxl
-bWVudDp0cnVlLEhUTUxFbWJlZEVsZW1lbnQ6dHJ1ZSxIVE1MRmllbGRTZXRFbGVtZW50OnRydWUsSFRN
-TEhSRWxlbWVudDp0cnVlLEhUTUxIZWFkRWxlbWVudDp0cnVlLEhUTUxIZWFkaW5nRWxlbWVudDp0cnVl
-LEhUTUxIdG1sRWxlbWVudDp0cnVlLEhUTUxJRnJhbWVFbGVtZW50OnRydWUsSFRNTEltYWdlRWxlbWVu
-dDp0cnVlLEhUTUxJbnB1dEVsZW1lbnQ6dHJ1ZSxIVE1MTElFbGVtZW50OnRydWUsSFRNTExhYmVsRWxl
-bWVudDp0cnVlLEhUTUxMZWdlbmRFbGVtZW50OnRydWUsSFRNTExpbmtFbGVtZW50OnRydWUsSFRNTE1h
-cEVsZW1lbnQ6dHJ1ZSxIVE1MTWVkaWFFbGVtZW50OnRydWUsSFRNTE1lbnVFbGVtZW50OnRydWUsSFRN
-TE1ldGFFbGVtZW50OnRydWUsSFRNTE1ldGVyRWxlbWVudDp0cnVlLEhUTUxNb2RFbGVtZW50OnRydWUs
-SFRNTE9MaXN0RWxlbWVudDp0cnVlLEhUTUxPYmplY3RFbGVtZW50OnRydWUsSFRNTE9wdEdyb3VwRWxl
-bWVudDp0cnVlLEhUTUxPcHRpb25FbGVtZW50OnRydWUsSFRNTE91dHB1dEVsZW1lbnQ6dHJ1ZSxIVE1M
-UGFyYW1FbGVtZW50OnRydWUsSFRNTFBpY3R1cmVFbGVtZW50OnRydWUsSFRNTFByZUVsZW1lbnQ6dHJ1
-ZSxIVE1MUHJvZ3Jlc3NFbGVtZW50OnRydWUsSFRNTFF1b3RlRWxlbWVudDp0cnVlLEhUTUxTY3JpcHRF
-bGVtZW50OnRydWUsSFRNTFNoYWRvd0VsZW1lbnQ6dHJ1ZSxIVE1MU2xvdEVsZW1lbnQ6dHJ1ZSxIVE1M
-U291cmNlRWxlbWVudDp0cnVlLEhUTUxTcGFuRWxlbWVudDp0cnVlLEhUTUxTdHlsZUVsZW1lbnQ6dHJ1
-ZSxIVE1MVGFibGVDYXB0aW9uRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNlbGxFbGVtZW50OnRydWUsSFRN
-TFRhYmxlRGF0YUNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6dHJ1ZSxI
-VE1MVGFibGVDb2xFbGVtZW50OnRydWUsSFRNTFRleHRBcmVhRWxlbWVudDp0cnVlLEhUTUxUaW1lRWxl
-bWVudDp0cnVlLEhUTUxUaXRsZUVsZW1lbnQ6dHJ1ZSxIVE1MVHJhY2tFbGVtZW50OnRydWUsSFRNTFVM
-aXN0RWxlbWVudDp0cnVlLEhUTUxVbmtub3duRWxlbWVudDp0cnVlLEhUTUxWaWRlb0VsZW1lbnQ6dHJ1
-ZSxIVE1MRGlyZWN0b3J5RWxlbWVudDp0cnVlLEhUTUxGb250RWxlbWVudDp0cnVlLEhUTUxGcmFtZUVs
-ZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVTZXRFbGVtZW50OnRydWUsSFRNTE1hcnF1ZWVFbGVtZW50OnRydWUs
-SFRNTEVsZW1lbnQ6ZmFsc2UsSFRNTEFuY2hvckVsZW1lbnQ6dHJ1ZSxIVE1MQXJlYUVsZW1lbnQ6dHJ1
-ZSxIVE1MQmFzZUVsZW1lbnQ6dHJ1ZSxCbG9iOmZhbHNlLEhUTUxCb2R5RWxlbWVudDp0cnVlLENEQVRB
-U2VjdGlvbjp0cnVlLENoYXJhY3RlckRhdGE6dHJ1ZSxDb21tZW50OnRydWUsUHJvY2Vzc2luZ0luc3Ry
-dWN0aW9uOnRydWUsVGV4dDp0cnVlLENTU1N0eWxlRGVjbGFyYXRpb246dHJ1ZSxNU1N0eWxlQ1NTUHJv
-cGVydGllczp0cnVlLENTUzJQcm9wZXJ0aWVzOnRydWUsWE1MRG9jdW1lbnQ6dHJ1ZSxEb2N1bWVudDpm
-YWxzZSxET01FeGNlcHRpb246dHJ1ZSxET01JbXBsZW1lbnRhdGlvbjp0cnVlLERPTVJlY3RSZWFkT25s
-eTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50OnRy
-dWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGljYXRp
-b25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFja2dy
-b3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5k
-RmV0Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5sb2Fk
-RXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJvYXJk
-RXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25FdmVu
-dDp0cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5kYWJs
-ZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxGb250
-RmFjZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50OnRy
-dWUsSGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRFdmVu
-dDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVlLE1l
-ZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6
-dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0aW9u
-RXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQ
-YXltZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBvcFN0
-YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQcmVz
-ZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0cnVl
-LFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5nZUV2
-ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxT
-ZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNwZWVj
-aFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNoU3lu
-dGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2ZW50
-OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJEZXZp
-Y2VFdmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pvSW50
-ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lvbkNo
-YW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21wbGV0
-aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZlbnQ6
-ZmFsc2UsU3VibWl0RXZlbnQ6ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3Jt
-RWxlbWVudDp0cnVlLEhpc3Rvcnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0
-cnVlLFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246
-dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxF
-dmVudDp0cnVlLERvY3VtZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBl
-OnRydWUsTm9kZTpmYWxzZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdy
-YXBoRWxlbWVudDp0cnVlLFByb2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1
-ZSxIVE1MU2VsZWN0RWxlbWVudDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dF
-bGVtZW50OnRydWUsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50
-OnRydWUsQ29tcG9zaXRpb25FdmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRy
-dWUsVGV4dEV2ZW50OnRydWUsVG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUs
-RE9NV2luZG93OnRydWUsRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2Vy
-R2xvYmFsU2NvcGU6dHJ1ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNj
-b3BlOnRydWUsQXR0cjp0cnVlLENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFw
-OnRydWUsTW96TmFtZWRBdHRyTWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50
-OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rp
-b25FbGVtZW50OnRydWUsU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25F
-bGVtZW50OnRydWUsU1ZHQ2lyY2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNW
-R0RlZnNFbGVtZW50OnRydWUsU1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVl
-LFNWR0VsbGlwc2VFbGVtZW50OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0
-cml4RWxlbWVudDp0cnVlLFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21w
-b3NpdGVFbGVtZW50OnRydWUsU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1
-c2VMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdG
-RURpc3RhbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FF
-bGVtZW50OnRydWUsU1ZHRkVGdW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNW
-R0ZFRnVuY1JFbGVtZW50OnRydWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFn
-ZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0
-cnVlLFNWR0ZFTW9ycGhvbG9neUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdG
-RVBvaW50TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNW
-R0ZFU3BvdExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVu
-Y2VFbGVtZW50OnRydWUsU1ZHRmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50
-OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0Vs
-ZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVh
-ckdyYWRpZW50RWxlbWVudDp0cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0
-cnVlLFNWR01ldGFkYXRhRWxlbWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVs
-ZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNW
-R1JhZGlhbEdyYWRpZW50RWxlbWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVu
-dDp0cnVlLFNWR1N0b3BFbGVtZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVu
-dDp0cnVlLFNWR1N3aXRjaEVsZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5F
-bGVtZW50OnRydWUsU1ZHVGV4dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxT
-VkdUZXh0UGF0aEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0
-bGVFbGVtZW50OnRydWUsU1ZHVXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3Jh
-ZGllbnRFbGVtZW50OnRydWUsU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxT
-VkdGRURyb3BTaGFkb3dFbGVtZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpm
-YWxzZX0pCkguTFouJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0
-aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFn
-PSJBcnJheUJ1ZmZlclZpZXciCkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmll
-dyIKSC5XQi4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVT
-dXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFy
-cmF5QnVmZmVyVmlldyJ9KSgpCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9i
-amVjdCgkKTsoZnVuY3Rpb24oYSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVs
-bCkKcmV0dXJufWlmKHR5cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0idW5kZWZpbmVkIil7YShk
-b2N1bWVudC5jdXJyZW50U2NyaXB0KQpyZXR1cm59dmFyIHM9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlv
-biBvbkxvYWQoYil7Zm9yKHZhciBxPTA7cTxzLmxlbmd0aDsrK3Epc1txXS5yZW1vdmVFdmVudExpc3Rl
-bmVyKCJsb2FkIixvbkxvYWQsZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcj0wO3I8cy5sZW5ndGg7
-KytyKXNbcl0uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEp
-e3YuY3VycmVudFNjcmlwdD1hCnZhciBzPUwuSXEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09ImZ1
-bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihzLFtdKQplbHNlIHMoW10pfSl9KSgpCi8vIyBzb3VyY2VNYXBw
-aW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
+IjpbXSwiY1giOlsiQjIiXSwiU1UiOlsiQjIiXSwibEQuRSI6IkIyIn0sImRFIjp7ImxEIjpbIkIyIl0s
+IlhqIjpbIkIyIl0sInpNIjpbIkIyIl0sIkVUIjpbXSwiYlEiOlsiQjIiXSwiQVMiOltdLCJjWCI6WyJC
+MiJdLCJTVSI6WyJCMiJdLCJsRC5FIjoiQjIifSwiWkEiOnsibEQiOlsiQjIiXSwiWGoiOlsiQjIiXSwi
+ek0iOlsiQjIiXSwiRVQiOltdLCJiUSI6WyJCMiJdLCJBUyI6W10sImNYIjpbIkIyIl0sIlNVIjpbIkIy
+Il0sImxELkUiOiJCMiJ9LCJkVCI6eyJsRCI6WyJCMiJdLCJYaiI6WyJCMiJdLCJ6TSI6WyJCMiJdLCJF
+VCI6W10sImJRIjpbIkIyIl0sIkFTIjpbXSwiY1giOlsiQjIiXSwiU1UiOlsiQjIiXSwibEQuRSI6IkIy
+In0sIlBxIjp7ImxEIjpbIkIyIl0sIlhqIjpbIkIyIl0sInpNIjpbIkIyIl0sIkVUIjpbXSwiYlEiOlsi
+QjIiXSwiQVMiOltdLCJjWCI6WyJCMiJdLCJTVSI6WyJCMiJdLCJsRC5FIjoiQjIifSwiZUUiOnsibEQi
+OlsiQjIiXSwiWGoiOlsiQjIiXSwiek0iOlsiQjIiXSwiRVQiOltdLCJiUSI6WyJCMiJdLCJBUyI6W10s
+ImNYIjpbIkIyIl0sIlNVIjpbIkIyIl0sImxELkUiOiJCMiJ9LCJWNiI6eyJsRCI6WyJCMiJdLCJuNiI6
+W10sIlhqIjpbIkIyIl0sInpNIjpbIkIyIl0sIkVUIjpbXSwiYlEiOlsiQjIiXSwiQVMiOltdLCJjWCI6
+WyJCMiJdLCJTVSI6WyJCMiJdLCJsRC5FIjoiQjIifSwia1MiOnsiWFMiOltdfSwiaU0iOnsiWFMiOltd
+fSwiR1YiOnsiQW4iOlsiMSJdfSwicTQiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJDdyI6eyJYUyI6
+W119LCJaZiI6eyJQZiI6WyIxIl19LCJ2cyI6eyJiOCI6WyIxIl19LCJtMCI6eyJRbSI6W119LCJKaSI6
+eyJtMCI6W10sIlFtIjpbXX0sImI2Ijp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNY
+IjpbIjEiXSwibGYuRSI6IjEifSwibG0iOnsiQW4iOlsiMSJdfSwibVciOnsiY1giOlsiMSJdfSwidXki
+OnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwiaWwiOnsiWWsiOlsi
+MSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIllrIjp7IlowIjpbIjEiLCIyIl19LCJQbiI6eyJaMCI6WyIx
+IiwiMiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwi
+WjAiOlsiMSIsIjIiXX0sIlZqIjp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpb
+IjEiXX0sIlh2Ijp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sInV3
+Ijp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwiWWsuSyI6InFVIiwiWWsuViI6IkAifSwi
+aTgiOnsiYUwiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwiYUwuRSI6InFVIiwiY1guRSI6
+InFVIn0sIkNWIjp7IlVrIjpbInpNPEIyPiIsInFVIl0sIlVrLlMiOiJ6TTxCMj4ifSwiVTgiOnsid0ki
+Olsiek08QjI+IiwicVUiXX0sIlppIjp7IlVrIjpbInFVIiwiek08QjI+Il19LCJVZCI6eyJYUyI6W119
+LCJLOCI6eyJYUyI6W119LCJieSI6eyJVayI6WyJNaD8iLCJxVSJdLCJVay5TIjoiTWg/In0sIm9qIjp7
+IndJIjpbIk1oPyIsInFVIl19LCJNeCI6eyJ3SSI6WyJxVSIsIk1oPyJdfSwidTUiOnsiVWsiOlsicVUi
+LCJ6TTxCMj4iXSwiVWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08QjI+Il19LCJHWSI6eyJ3
+SSI6WyJ6TTxCMj4iLCJxVSJdfSwiQ1AiOnsiWloiOltdfSwiQjIiOnsiWloiOltdfSwiek0iOnsiYlEi
+OlsiMSJdLCJjWCI6WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJiUSI6WyIxIl0sImNYIjpbIjEi
+XX0sInFVIjp7InZYIjpbXX0sIkM2Ijp7IlhTIjpbXX0sIkV6Ijp7IlhTIjpbXX0sIkYiOnsiWFMiOltd
+fSwidSI6eyJYUyI6W119LCJiSiI6eyJYUyI6W119LCJlWSI6eyJYUyI6W119LCJtcCI6eyJYUyI6W119
+LCJ1YiI6eyJYUyI6W119LCJkcyI6eyJYUyI6W119LCJsaiI6eyJYUyI6W119LCJVViI6eyJYUyI6W119
+LCJrNSI6eyJYUyI6W119LCJLWSI6eyJYUyI6W119LCJjIjp7IlhTIjpbXX0sIkNEIjp7IlJ6IjpbXX0s
+ImFFIjp7IlJ6IjpbXX0sIlpkIjp7Ikd6IjpbXX0sIlJuIjp7IkJMIjpbXX0sIkRuIjp7ImlEIjpbXX0s
+IlVmIjp7ImlEIjpbXX0sInFlIjp7ImlEIjpbXX0sInFFIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119
+LCJHaCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZlkiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpb
+XX0sIm5CIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJRUCI6eyJjdiI6W10sInVIIjpbXSwiRDAi
+OltdfSwibngiOnsidUgiOltdLCJEMCI6W119LCJRRiI6eyJ1SCI6W10sIkQwIjpbXX0sIklCIjp7InRu
+IjpbIlpaIl19LCJ3eiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0s
+ImxELkUiOiIxIn0sImN2Ijp7InVIIjpbXSwiRDAiOltdfSwiaEgiOnsiQXoiOltdfSwiaDQiOnsiY3Yi
+OltdLCJ1SCI6W10sIkQwIjpbXX0sIlZiIjp7InVIIjpbXSwiRDAiOltdfSwiZkoiOnsiRDAiOltdfSwi
+d2EiOnsiRDAiOltdfSwiQWoiOnsiZWEiOltdfSwiZTciOnsibEQiOlsidUgiXSwiek0iOlsidUgiXSwi
+YlEiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIn0sInVIIjp7IkQwIjpbXX0sIkJIIjp7ImxE
+IjpbInVIIl0sIkdtIjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVIIl0sImJRIjpbInVIIl0sImNY
+IjpbInVIIl0sImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJTTiI6eyJjdiI6W10sInVIIjpbXSwiRDAi
+OltdfSwiZXciOnsiZWEiOltdfSwibHAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlRiIjp7ImN2
+IjpbXSwidUgiOltdLCJEMCI6W119LCJJdiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiV1AiOnsi
+Y3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sInlZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJ3NiI6
+eyJlYSI6W119LCJLNSI6eyJ2NiI6W10sIkQwIjpbXX0sIkNtIjp7IkQwIjpbXX0sIkNRIjp7InVIIjpb
+XSwiRDAiOltdfSwidzQiOnsidG4iOlsiWloiXX0sInJoIjp7ImxEIjpbInVIIl0sIkdtIjpbInVIIl0s
+InpNIjpbInVIIl0sIlhqIjpbInVIIl0sImJRIjpbInVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCIs
+IkdtLkUiOiJ1SCJ9LCJjZiI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXX0sImk3Ijp7
+IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwi
+U3kiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJx
+VSJ9LCJJNCI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdLCJs
+Zi5FIjoicVUifSwiUk8iOnsicWgiOlsiMSJdfSwiZXUiOnsiUk8iOlsiMSJdLCJxaCI6WyIxIl19LCJ4
+QyI6eyJNTyI6WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2RCI6eyJrRiI6W119LCJtNiI6eyJrRiI6W119
+LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIxIl19LCJkVyI6eyJ2NiI6
+W10sIkQwIjpbXX0sIm1rIjp7InkwIjpbXX0sIktvIjp7Im9uIjpbXX0sIkFzIjp7ImxmIjpbInFVIl0s
+Inh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6W119LCJUeiI6eyJs
+RCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJFNCI6W10sImNYIjpbIjEiXSwibEQuRSI6IjEi
+fSwibmQiOnsiaGkiOltdLCJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiS2UiOnsibGYiOlsicVUiXSwi
+eHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6InFVIn0sImhpIjp7ImN2Ijpb
+XSwidUgiOltdLCJEMCI6W119LCJYQSI6eyJrRiI6W119LCJ2dCI6eyJEOCI6W119LCJjRCI6eyJEOCI6
+W119LCJkdiI6eyJSeiI6W119LCJPRiI6eyJmdiI6W119LCJydSI6eyJmdiI6W119LCJJViI6eyJmdiI6
+W119LCJuNiI6eyJ6TSI6WyJCMiJdLCJiUSI6WyJCMiJdLCJjWCI6WyJCMiJdLCJBUyI6W119fScpKQpI
+LkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3sidzIiOjEsIlFDIjoyLCJMWiI6MSwia1QiOjIs
+Im1XIjoxLCJ1eSI6MSwiaWwiOjIsIlZqIjoxLCJYdiI6MSwiblkiOjEsIldZIjoxLCJwUiI6MSwiY28i
+OjF9JykpCnZhciB1PXtsOiJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGgg
+YSBmcmFnbWVudCBjb21wb25lbnQiLGk6IkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBV
+Ukkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIsajoiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBm
+aWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IixnOiJgbnVsbGAgZW5jb3Vu
+dGVyZWQgYXMgdGhlIHJlc3VsdCBmcm9tIGV4cHJlc3Npb24gd2l0aCB0eXBlIGBOZXZlcmAuIixkOiJh
+cmVhLWFuYWx5emVyLGFuYWx5emVyLW5uYmQtbWlncmF0aW9uLHR5cGUtYnVnIn0KdmFyIHQ9KGZ1bmN0
+aW9uIHJ0aWkoKXt2YXIgcz1ILk4wCnJldHVybntuOnMoIkN3IiksY1I6cygibkIiKSx3OnMoIkF6Iiks
+cDpzKCJRUCIpLGdGOnMoIlBEPEdELEA+IiksZDpzKCJiUTxAPiIpLGg6cygiY3YiKSxyOnMoIlhTIiks
+QjpzKCJlYSIpLGFTOnMoIkQwIiksZzg6cygiUnoiKSxjODpzKCJoSCIpLFk6cygiRUgiKSxlOnMoImI4
+PEA+IiksSTpzKCJTZyIpLG86cygidlEiKSxlaDpzKCJjWDx1SD4iKSxROnMoImNYPHFVPiIpLHU6cygi
+Y1g8QD4iKSx2OnMoImpkPGtGPiIpLHM6cygiamQ8cVU+IiksZ046cygiamQ8bjY+IiksYjpzKCJqZDxA
+PiIpLGE6cygiamQ8QjI+IiksZDc6cygiamQ8U2UqPiIpLGg0OnMoImpkPGo4Kj4iKSxHOnMoImpkPFow
+PHFVKixNaCo+Kj4iKSxjUTpzKCJqZDxEOCo+IiksaTpzKCJqZDxxVSo+IiksYUE6cygiamQ8eUQqPiIp
+LGFKOnMoImpkPHdiKj4iKSxWOnMoImpkPEIyKj4iKSxkNDpzKCJqZDxxVT8+IiksVDpzKCJ3ZSIpLGVI
+OnMoInZtIikseDpzKCJjNSIpLGFVOnMoIlhqPEA+IiksYW06cygiVHo8QD4iKSxlbzpzKCJONTxHRCxA
+PiIpLGR6OnMoImhGIiksRDpzKCJ6TTxxVT4iKSxqOnMoInpNPEA+IiksTDpzKCJ6TTxCMj4iKSxKOnMo
+IlowPHFVLHFVPiIpLGY6cygiWjA8QCxAPiIpLGRvOnMoImxKPHFVLEA+IiksZmo6cygibEo8cVUqLHFV
+PiIpLGRFOnMoIkVUIiksYm06cygiVjYiKSxBOnMoInVIIiksRTpzKCJrRiIpLFA6cygiYzgiKSxLOnMo
+Ik1oIikscTpzKCJ0bjxaWj4iKSxmdjpzKCJ3TCIpLGV3OnMoIm5kIiksQzpzKCJ4dTxxVT4iKSxsOnMo
+Ikd6IiksTjpzKCJxVSIpLGQwOnMoInFVKHFVKikiKSxnNzpzKCJoaSIpLGZvOnMoIkdEIiksYVc6cygi
+eVkiKSxhazpzKCJBUyIpLGdjOnMoIm42IiksYko6cygia2QiKSxkdzpzKCJHajxxVSxxVT4iKSxkRDpz
+KCJpRCIpLGVKOnMoInU2PHFVPiIpLGc0OnMoIks1IiksY2k6cygidjYiKSxnMjpzKCJDbSIpLGJDOnMo
+IlpmPGZKKj4iKSxoOTpzKCJDUSIpLGFjOnMoImU3IiksazpzKCJldTxBaio+IiksUjpzKCJ3ejxjdio+
+IiksYzpzKCJ2czxAPiIpLGZKOnMoInZzPEIyPiIpLGdWOnMoInZzPGZKKj4iKSxjcjpzKCJKUSIpLHk6
+cygiYTIiKSxhbDpzKCJhMihNaCkiKSxnUjpzKCJDUCIpLHo6cygiQCIpLGZPOnMoIkAoKSIpLGJJOnMo
+IkAoTWgpIiksYWc6cygiQChNaCxHeikiKSxiVTpzKCJAKHh1PHFVPikiKSxkTzpzKCJAKHFVKSIpLGI4
+OnMoIkAoQCxAKSIpLFM6cygiQjIiKSxkZDpzKCJHaCoiKSxnOnMoImN2KiIpLGFMOnMoImVhKiIpLGFY
+OnMoIkxMKiIpLGZFOnMoIkg3KiIpLFU6cygiY1g8QD4qIiksZEg6cygiRTQqIiksZks6cygiek08QD4q
+IiksZF86cygiek08ajgqPioiKSxkcDpzKCJ6TTxaMDxxVSosTWgqPio+KiIpLGVFOnMoInpNPE1oKj4q
+IiksYXc6cygiWjA8QCxAPioiKSx0OnMoIlowPHFVKixNaCo+KiIpLE86cygiQWoqIiksY0Y6cygiMCYq
+IiksXzpzKCJNaCoiKSxlUTpzKCJldyoiKSxYOnMoInFVKiIpLGNoOnMoIkQwPyIpLGJHOnMoImI4PGM4
+Pj8iKSxiazpzKCJ6TTxxVT4/IiksYk06cygiek08QD4/IiksY1o6cygiWjA8cVUscVU+PyIpLGM5OnMo
+IlowPHFVLEA+PyIpLFc6cygiTWg/IiksRjpzKCJGZTxALEA+PyIpLG06cygiYm4/IiksYjc6cygiYTIo
+TWgpPyIpLGJ3OnMoIkAoZWEpPyIpLGZWOnMoIk1oPyhNaD8sTWg/KT8iKSxkQTpzKCJNaD8oQCk/Iiks
+WjpzKCJ+KCk/IiksZWI6cygifihldyopPyIpLGRpOnMoIlpaIiksSDpzKCJ+IiksTTpzKCJ+KCkiKSxl
+QTpzKCJ+KHFVLHFVKSIpLGNBOnMoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFudHMoKXt2
+YXIgcz1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMueG49Vy5HaC5wcm90b3R5cGUKQy5SWT1XLlFQ
+LnByb3RvdHlwZQpDLm1IPVcuYWUucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLmZK
+LnByb3RvdHlwZQpDLk9rPUouR3YucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLmJV
+LnByb3RvdHlwZQpDLmpOPUoud2UucHJvdG90eXBlCkMuQ0Q9Si5xSS5wcm90b3R5cGUKQy54Qj1KLkRy
+LnByb3RvdHlwZQpDLkRHPUouYzUucHJvdG90eXBlCkMuRXg9Vy53Ny5wcm90b3R5cGUKQy5OQT1ILlY2
+LnByb3RvdHlwZQpDLnQ1PVcuQkgucHJvdG90eXBlCkMuTHQ9Vy5TTi5wcm90b3R5cGUKQy5aUT1KLmlD
+LnByb3RvdHlwZQpDLkllPVcuVGIucHJvdG90eXBlCkMudkI9Si5rZC5wcm90b3R5cGUKQy5vbD1XLks1
+LnByb3RvdHlwZQpDLnk4PW5ldyBQLlU4KCkKQy5oOT1uZXcgUC5DVigpCkMuR3c9bmV3IEguRnUoSC5O
+MCgiRnU8Yzg+IikpCkMuTzQ9ZnVuY3Rpb24gZ2V0VGFnRmFsbGJhY2sobykgewogIHZhciBzID0gT2Jq
+ZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pOwogIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxl
+bmd0aCAtIDEpOwp9CkMuWXE9ZnVuY3Rpb24oKSB7CiAgdmFyIHRvU3RyaW5nRnVuY3Rpb24gPSBPYmpl
+Y3QucHJvdG90eXBlLnRvU3RyaW5nOwogIGZ1bmN0aW9uIGdldFRhZyhvKSB7CiAgICB2YXIgcyA9IHRv
+U3RyaW5nRnVuY3Rpb24uY2FsbChvKTsKICAgIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxlbmd0aCAt
+IDEpOwogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnKG9iamVjdCwgdGFnKSB7CiAgICBpZiAoL15I
+VE1MW0EtWl0uKkVsZW1lbnQkLy50ZXN0KHRhZykpIHsKICAgICAgdmFyIG5hbWUgPSB0b1N0cmluZ0Z1
+bmN0aW9uLmNhbGwob2JqZWN0KTsKICAgICAgaWYgKG5hbWUgPT0gIltvYmplY3QgT2JqZWN0XSIpIHJl
+dHVybiBudWxsOwogICAgICByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIH0KICB9CiAgZnVuY3Rpb24g
+Z2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyKG9iamVjdCwgdGFnKSB7CiAgICBpZiAoc2VsZi5IVE1M
+RWxlbWVudCAmJiBvYmplY3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgcmV0dXJuICJIVE1MRWxlbWVu
+dCI7CiAgICByZXR1cm4gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZyk7CiAgfQogIGZ1bmN0aW9uIHBy
+b3RvdHlwZUZvclRhZyh0YWcpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICJ1bmRlZmluZWQiKSBy
+ZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2Ygd2luZG93W3RhZ10gPT0gInVuZGVmaW5lZCIpIHJldHVy
+biBudWxsOwogICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAodHlwZW9mIGNv
+bnN0cnVjdG9yICE9ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9y
+LnByb3RvdHlwZTsKICB9CiAgZnVuY3Rpb24gZGlzY3JpbWluYXRvcih0YWcpIHsgcmV0dXJuIG51bGw7
+IH0KICB2YXIgaXNCcm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IjsKICByZXR1cm4g
+ewogICAgZ2V0VGFnOiBnZXRUYWcsCiAgICBnZXRVbmtub3duVGFnOiBpc0Jyb3dzZXIgPyBnZXRVbmtu
+b3duVGFnR2VuZXJpY0Jyb3dzZXIgOiBnZXRVbmtub3duVGFnLAogICAgcHJvdG90eXBlRm9yVGFnOiBw
+cm90b3R5cGVGb3JUYWcsCiAgICBkaXNjcmltaW5hdG9yOiBkaXNjcmltaW5hdG9yIH07Cn0KQy53Yj1m
+dW5jdGlvbihnZXRUYWdGYWxsYmFjaykgewogIHJldHVybiBmdW5jdGlvbihob29rcykgewogICAgaWYg
+KHR5cGVvZiBuYXZpZ2F0b3IgIT0gIm9iamVjdCIpIHJldHVybiBob29rczsKICAgIHZhciB1YSA9IG5h
+dmlnYXRvci51c2VyQWdlbnQ7CiAgICBpZiAodWEuaW5kZXhPZigiRHVtcFJlbmRlclRyZWUiKSA+PSAw
+KSByZXR1cm4gaG9va3M7CiAgICBpZiAodWEuaW5kZXhPZigiQ2hyb21lIikgPj0gMCkgewogICAgICBm
+dW5jdGlvbiBjb25maXJtKHApIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PSAib2JqZWN0
+IiAmJiB3aW5kb3dbcF0gJiYgd2luZG93W3BdLm5hbWUgPT0gcDsKICAgICAgfQogICAgICBpZiAoY29u
+ZmlybSgiV2luZG93IikgJiYgY29uZmlybSgiSFRNTEVsZW1lbnQiKSkgcmV0dXJuIGhvb2tzOwogICAg
+fQogICAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRmFsbGJhY2s7CiAgfTsKfQpDLktVPWZ1bmN0aW9uKGhv
+b2tzKSB7CiAgaWYgKHR5cGVvZiBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcgIT0gImZ1bmN0aW9u
+IikgcmV0dXJuIGhvb2tzOwogIGhvb2tzLmdldFRhZyA9IGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRh
+Zyhob29rcy5nZXRUYWcpOwp9CkMuZlE9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgZ2V0VGFnID0gaG9v
+a3MuZ2V0VGFnOwogIHZhciBwcm90b3R5cGVGb3JUYWcgPSBob29rcy5wcm90b3R5cGVGb3JUYWc7CiAg
+ZnVuY3Rpb24gZ2V0VGFnRml4ZWQobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIGlmICh0
+YWcgPT0gIkRvY3VtZW50IikgewogICAgICBpZiAoISFvLnhtbFZlcnNpb24pIHJldHVybiAiIURvY3Vt
+ZW50IjsKICAgICAgcmV0dXJuICIhSFRNTERvY3VtZW50IjsKICAgIH0KICAgIHJldHVybiB0YWc7CiAg
+fQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0ZpeGVkKHRhZykgewogICAgaWYgKHRhZyA9PSAiRG9j
+dW1lbnQiKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBwcm90b3R5cGVGb3JUYWcodGFnKTsKICB9CiAg
+aG9va3MuZ2V0VGFnID0gZ2V0VGFnRml4ZWQ7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90
+eXBlRm9yVGFnRml4ZWQ7Cn0KQy5kaz1mdW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0
+eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlm
+ICh1c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpID09IC0xKSByZXR1cm4gaG9va3M7CiAgdmFyIGdl
+dFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAiQmVmb3JlVW5sb2FkRXZl
+bnQiOiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQiLAogICAgIkdlb0dlb2xv
+Y2F0aW9uIjogIkdlb2xvY2F0aW9uIiwKICAgICJMb2NhdGlvbiI6ICIhTG9jYXRpb24iLAogICAgIldv
+cmtlck1lc3NhZ2VFdmVudCI6ICJNZXNzYWdlRXZlbnQiLAogICAgIlhNTERvY3VtZW50IjogIiFEb2N1
+bWVudCJ9OwogIGZ1bmN0aW9uIGdldFRhZ0ZpcmVmb3gobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhv
+KTsKICAgIHJldHVybiBxdWlja01hcFt0YWddIHx8IHRhZzsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0
+VGFnRmlyZWZveDsKfQpDLnhpPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVv
+ZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVz
+ZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50LyIpID09IC0xKSByZXR1cm4gaG9va3M7CiAgdmFyIGdldFRh
+ZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAiQmVmb3JlVW5sb2FkRXZlbnQi
+OiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQiLAogICAgIkhUTUxEREVsZW1l
+bnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIkhUTUxEVEVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAg
+IkhUTUxQaHJhc2VFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJQb3NpdGlvbiI6ICJHZW9wb3Np
+dGlvbiIKICB9OwogIGZ1bmN0aW9uIGdldFRhZ0lFKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7
+CiAgICB2YXIgbmV3VGFnID0gcXVpY2tNYXBbdGFnXTsKICAgIGlmIChuZXdUYWcpIHJldHVybiBuZXdU
+YWc7CiAgICBpZiAodGFnID09ICJPYmplY3QiKSB7CiAgICAgIGlmICh3aW5kb3cuRGF0YVZpZXcgJiYg
+KG8gaW5zdGFuY2VvZiB3aW5kb3cuRGF0YVZpZXcpKSByZXR1cm4gIkRhdGFWaWV3IjsKICAgIH0KICAg
+IHJldHVybiB0YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0lFKHRhZykgewogICAgdmFy
+IGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCkgcmV0
+dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBob29rcy5nZXRU
+YWcgPSBnZXRUYWdJRTsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdJRTsK
+fQpDLmk3PWZ1bmN0aW9uKGhvb2tzKSB7IHJldHVybiBob29rczsgfQoKQy5DdD1uZXcgUC5ieSgpCkMu
+RXE9bmV3IFAuazUoKQpDLnhNPW5ldyBQLnU1KCkKQy5Raz1uZXcgUC5FMygpCkMuTnY9bmV3IEgua3Io
+KQpDLk5VPW5ldyBQLkppKCkKQy5wZD1uZXcgUC5aZCgpCkMuQWQ9bmV3IE0uSDcoMCwiSGludEFjdGlv
+bktpbmQuYWRkTnVsbGFibGVIaW50IikKQy5uZT1uZXcgTS5INygxLCJIaW50QWN0aW9uS2luZC5hZGRO
+b25OdWxsYWJsZUhpbnQiKQpDLm15PW5ldyBNLkg3KDIsIkhpbnRBY3Rpb25LaW5kLmNoYW5nZVRvTnVs
+bGFibGVIaW50IikKQy5yeD1uZXcgTS5INygzLCJIaW50QWN0aW9uS2luZC5jaGFuZ2VUb05vbk51bGxh
+YmxlSGludCIpCkMud1Y9bmV3IE0uSDcoNCwiSGludEFjdGlvbktpbmQucmVtb3ZlTnVsbGFibGVIaW50
+IikKQy5mUj1uZXcgTS5INyg1LCJIaW50QWN0aW9uS2luZC5yZW1vdmVOb25OdWxsYWJsZUhpbnQiKQpD
+LkEzPW5ldyBQLk14KG51bGwpCkMublg9bmV3IFAub2oobnVsbCkKQy5jdz1uZXcgTC5HYigwLCJVbml0
+TWlncmF0aW9uU3RhdHVzLmFscmVhZHlNaWdyYXRlZCIpCkMuZGM9bmV3IEwuR2IoMSwiVW5pdE1pZ3Jh
+dGlvblN0YXR1cy5pbmRldGVybWluYXRlIikKQy5XRD1uZXcgTC5HYigyLCJVbml0TWlncmF0aW9uU3Rh
+dHVzLm1pZ3JhdGluZyIpCkMuWGo9bmV3IEwuR2IoMywiVW5pdE1pZ3JhdGlvblN0YXR1cy5vcHRpbmdP
+dXQiKQpDLmwwPUguVk0ocyhbQy5jdyxDLmRjLEMuV0QsQy5Yal0pLEguTjAoImpkPEdiKj4iKSkKQy5h
+az1ILlZNKHMoWzAsMCwzMjc3NiwzMzc5MiwxLDEwMjQwLDAsMF0pLHQuVikKQy5jbT1ILlZNKHMoWyIq
+OjpjbGFzcyIsIio6OmRpciIsIio6OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIsIio6OmlkIiwiKjo6aW5l
+cnQiLCIqOjppdGVtcHJvcCIsIio6Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUiLCIqOjpsYW5nIiwiKjo6
+c3BlbGxjaGVjayIsIio6OnRpdGxlIiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNjZXNza2V5IiwiQTo6Y29v
+cmRzIiwiQTo6aHJlZmxhbmciLCJBOjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0YWJpbmRleCIsIkE6OnRh
+cmdldCIsIkE6OnR5cGUiLCJBUkVBOjphY2Nlc3NrZXkiLCJBUkVBOjphbHQiLCJBUkVBOjpjb29yZHMi
+LCJBUkVBOjpub2hyZWYiLCJBUkVBOjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4IiwiQVJFQTo6dGFyZ2V0
+IiwiQVVESU86OmNvbnRyb2xzIiwiQVVESU86Omxvb3AiLCJBVURJTzo6bWVkaWFncm91cCIsIkFVRElP
+OjptdXRlZCIsIkFVRElPOjpwcmVsb2FkIiwiQkRPOjpkaXIiLCJCT0RZOjphbGluayIsIkJPRFk6OmJn
+Y29sb3IiLCJCT0RZOjpsaW5rIiwiQk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5rIiwiQlI6OmNsZWFyIiwi
+QlVUVE9OOjphY2Nlc3NrZXkiLCJCVVRUT046OmRpc2FibGVkIiwiQlVUVE9OOjpuYW1lIiwiQlVUVE9O
+Ojp0YWJpbmRleCIsIkJVVFRPTjo6dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJDQU5WQVM6OmhlaWdodCIs
+IkNBTlZBUzo6d2lkdGgiLCJDQVBUSU9OOjphbGlnbiIsIkNPTDo6YWxpZ24iLCJDT0w6OmNoYXIiLCJD
+T0w6OmNoYXJvZmYiLCJDT0w6OnNwYW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6d2lkdGgiLCJDT0xHUk9V
+UDo6YWxpZ24iLCJDT0xHUk9VUDo6Y2hhciIsIkNPTEdST1VQOjpjaGFyb2ZmIiwiQ09MR1JPVVA6OnNw
+YW4iLCJDT0xHUk9VUDo6dmFsaWduIiwiQ09MR1JPVVA6OndpZHRoIiwiQ09NTUFORDo6Y2hlY2tlZCIs
+IkNPTU1BTkQ6OmNvbW1hbmQiLCJDT01NQU5EOjpkaXNhYmxlZCIsIkNPTU1BTkQ6OmxhYmVsIiwiQ09N
+TUFORDo6cmFkaW9ncm91cCIsIkNPTU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1ZSIsIkRFTDo6ZGF0ZXRp
+bWUiLCJERVRBSUxTOjpvcGVuIiwiRElSOjpjb21wYWN0IiwiRElWOjphbGlnbiIsIkRMOjpjb21wYWN0
+IiwiRklFTERTRVQ6OmRpc2FibGVkIiwiRk9OVDo6Y29sb3IiLCJGT05UOjpmYWNlIiwiRk9OVDo6c2l6
+ZSIsIkZPUk06OmFjY2VwdCIsIkZPUk06OmF1dG9jb21wbGV0ZSIsIkZPUk06OmVuY3R5cGUiLCJGT1JN
+OjptZXRob2QiLCJGT1JNOjpuYW1lIiwiRk9STTo6bm92YWxpZGF0ZSIsIkZPUk06OnRhcmdldCIsIkZS
+QU1FOjpuYW1lIiwiSDE6OmFsaWduIiwiSDI6OmFsaWduIiwiSDM6OmFsaWduIiwiSDQ6OmFsaWduIiwi
+SDU6OmFsaWduIiwiSDY6OmFsaWduIiwiSFI6OmFsaWduIiwiSFI6Om5vc2hhZGUiLCJIUjo6c2l6ZSIs
+IkhSOjp3aWR0aCIsIkhUTUw6OnZlcnNpb24iLCJJRlJBTUU6OmFsaWduIiwiSUZSQU1FOjpmcmFtZWJv
+cmRlciIsIklGUkFNRTo6aGVpZ2h0IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQiLCJJRlJBTUU6Om1hcmdp
+bndpZHRoIiwiSUZSQU1FOjp3aWR0aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFsdCIsIklNRzo6Ym9yZGVy
+IiwiSU1HOjpoZWlnaHQiLCJJTUc6OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJTUc6Om5hbWUiLCJJTUc6
+OnVzZW1hcCIsIklNRzo6dnNwYWNlIiwiSU1HOjp3aWR0aCIsIklOUFVUOjphY2NlcHQiLCJJTlBVVDo6
+YWNjZXNza2V5IiwiSU5QVVQ6OmFsaWduIiwiSU5QVVQ6OmFsdCIsIklOUFVUOjphdXRvY29tcGxldGUi
+LCJJTlBVVDo6YXV0b2ZvY3VzIiwiSU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6ZGlzYWJsZWQiLCJJTlBV
+VDo6aW5wdXRtb2RlIiwiSU5QVVQ6OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJTlBVVDo6bWF4IiwiSU5Q
+VVQ6Om1heGxlbmd0aCIsIklOUFVUOjptaW4iLCJJTlBVVDo6bXVsdGlwbGUiLCJJTlBVVDo6bmFtZSIs
+IklOUFVUOjpwbGFjZWhvbGRlciIsIklOUFVUOjpyZWFkb25seSIsIklOUFVUOjpyZXF1aXJlZCIsIklO
+UFVUOjpzaXplIiwiSU5QVVQ6OnN0ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJTlBVVDo6dHlwZSIsIklO
+UFVUOjp1c2VtYXAiLCJJTlBVVDo6dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwiS0VZR0VOOjpkaXNhYmxl
+ZCIsIktFWUdFTjo6a2V5dHlwZSIsIktFWUdFTjo6bmFtZSIsIkxBQkVMOjphY2Nlc3NrZXkiLCJMQUJF
+TDo6Zm9yIiwiTEVHRU5EOjphY2Nlc3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwiTEk6OnR5cGUiLCJMSTo6
+dmFsdWUiLCJMSU5LOjpzaXplcyIsIk1BUDo6bmFtZSIsIk1FTlU6OmNvbXBhY3QiLCJNRU5VOjpsYWJl
+bCIsIk1FTlU6OnR5cGUiLCJNRVRFUjo6aGlnaCIsIk1FVEVSOjpsb3ciLCJNRVRFUjo6bWF4IiwiTUVU
+RVI6Om1pbiIsIk1FVEVSOjp2YWx1ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRjaCIsIk9MOjpjb21wYWN0
+IiwiT0w6OnJldmVyc2VkIiwiT0w6OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRHUk9VUDo6ZGlzYWJsZWQi
+LCJPUFRHUk9VUDo6bGFiZWwiLCJPUFRJT046OmRpc2FibGVkIiwiT1BUSU9OOjpsYWJlbCIsIk9QVElP
+Tjo6c2VsZWN0ZWQiLCJPUFRJT046OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJPVVRQVVQ6Om5hbWUiLCJQ
+OjphbGlnbiIsIlBSRTo6d2lkdGgiLCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JFU1M6Om1pbiIsIlBST0dS
+RVNTOjp2YWx1ZSIsIlNFTEVDVDo6YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpkaXNhYmxlZCIsIlNFTEVD
+VDo6bXVsdGlwbGUiLCJTRUxFQ1Q6Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVkIiwiU0VMRUNUOjpzaXpl
+IiwiU0VMRUNUOjp0YWJpbmRleCIsIlNPVVJDRTo6dHlwZSIsIlRBQkxFOjphbGlnbiIsIlRBQkxFOjpi
+Z2NvbG9yIiwiVEFCTEU6OmJvcmRlciIsIlRBQkxFOjpjZWxscGFkZGluZyIsIlRBQkxFOjpjZWxsc3Bh
+Y2luZyIsIlRBQkxFOjpmcmFtZSIsIlRBQkxFOjpydWxlcyIsIlRBQkxFOjpzdW1tYXJ5IiwiVEFCTEU6
+OndpZHRoIiwiVEJPRFk6OmFsaWduIiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6Y2hhcm9mZiIsIlRCT0RZ
+Ojp2YWxpZ24iLCJURDo6YWJiciIsIlREOjphbGlnbiIsIlREOjpheGlzIiwiVEQ6OmJnY29sb3IiLCJU
+RDo6Y2hhciIsIlREOjpjaGFyb2ZmIiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVhZGVycyIsIlREOjpoZWln
+aHQiLCJURDo6bm93cmFwIiwiVEQ6OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJURDo6dmFsaWduIiwiVEQ6
+OndpZHRoIiwiVEVYVEFSRUE6OmFjY2Vzc2tleSIsIlRFWFRBUkVBOjphdXRvY29tcGxldGUiLCJURVhU
+QVJFQTo6Y29scyIsIlRFWFRBUkVBOjpkaXNhYmxlZCIsIlRFWFRBUkVBOjppbnB1dG1vZGUiLCJURVhU
+QVJFQTo6bmFtZSIsIlRFWFRBUkVBOjpwbGFjZWhvbGRlciIsIlRFWFRBUkVBOjpyZWFkb25seSIsIlRF
+WFRBUkVBOjpyZXF1aXJlZCIsIlRFWFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6OnRhYmluZGV4IiwiVEVY
+VEFSRUE6OndyYXAiLCJURk9PVDo6YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRGT09UOjpjaGFyb2ZmIiwi
+VEZPT1Q6OnZhbGlnbiIsIlRIOjphYmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4aXMiLCJUSDo6Ymdjb2xv
+ciIsIlRIOjpjaGFyIiwiVEg6OmNoYXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRIOjpoZWFkZXJzIiwiVEg6
+OmhlaWdodCIsIlRIOjpub3dyYXAiLCJUSDo6cm93c3BhbiIsIlRIOjpzY29wZSIsIlRIOjp2YWxpZ24i
+LCJUSDo6d2lkdGgiLCJUSEVBRDo6YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRIRUFEOjpjaGFyb2ZmIiwi
+VEhFQUQ6OnZhbGlnbiIsIlRSOjphbGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6OmNoYXIiLCJUUjo6Y2hh
+cm9mZiIsIlRSOjp2YWxpZ24iLCJUUkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpraW5kIiwiVFJBQ0s6Omxh
+YmVsIiwiVFJBQ0s6OnNyY2xhbmciLCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBlIiwiVklERU86OmNvbnRy
+b2xzIiwiVklERU86OmhlaWdodCIsIlZJREVPOjpsb29wIiwiVklERU86Om1lZGlhZ3JvdXAiLCJWSURF
+Tzo6bXV0ZWQiLCJWSURFTzo6cHJlbG9hZCIsIlZJREVPOjp3aWR0aCJdKSx0LmkpCkMuVkM9SC5WTShz
+KFswLDAsNjU0OTAsNDUwNTUsNjU1MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LlYpCkMubUs9SC5WTShz
+KFswLDAsMjY2MjQsMTAyMyw2NTUzNCwyMDQ3LDY1NTM0LDIwNDddKSx0LlYpCkMuU3E9SC5WTShzKFsi
+SEVBRCIsIkFSRUEiLCJCQVNFIiwiQkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNPTEdST1VQIiwiRU1CRUQi
+LCJGUkFNRSIsIkZSQU1FU0VUIiwiSFIiLCJJTUFHRSIsIklNRyIsIklOUFVUIiwiSVNJTkRFWCIsIkxJ
+TksiLCJNRVRBIiwiUEFSQU0iLCJTT1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwiV0JSIl0pLHQuaSkKQy5o
+VT1ILlZNKHMoW10pLHQuYikKQy5kbj1ILlZNKHMoW10pLEguTjAoImpkPExMKj4iKSkKQy54RD1ILlZN
+KHMoW10pLHQuaSkKQy50bz1ILlZNKHMoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNCwzNDgxNSw2NTUzNCwx
+ODQzMV0pLHQuVikKQy5yaz1ILlZNKHMoW0MuQWQsQy5uZSxDLm15LEMucngsQy53VixDLmZSXSksSC5O
+MCgiamQ8SDcqPiIpKQpDLkYzPUguVk0ocyhbMCwwLDI0NTc2LDEwMjMsNjU1MzQsMzQ4MTUsNjU1MzQs
+MTg0MzFdKSx0LlYpCkMuZWE9SC5WTShzKFswLDAsMzI3NTQsMTEyNjMsNjU1MzQsMzQ4MTUsNjU1MzQs
+MTg0MzFdKSx0LlYpCkMuWko9SC5WTShzKFswLDAsMzI3MjIsMTIyODcsNjU1MzUsMzQ4MTUsNjU1MzQs
+MTg0MzFdKSx0LlYpCkMuV2Q9SC5WTShzKFswLDAsNjU0OTAsMTIyODcsNjU1MzUsMzQ4MTUsNjU1MzQs
+MTg0MzFdKSx0LlYpCkMuUXg9SC5WTShzKFsiYmluZCIsImlmIiwicmVmIiwicmVwZWF0Iiwic3ludGF4
+Il0pLHQuaSkKQy5CST1ILlZNKHMoWyJBOjpocmVmIiwiQVJFQTo6aHJlZiIsIkJMT0NLUVVPVEU6OmNp
+dGUiLCJCT0RZOjpiYWNrZ3JvdW5kIiwiQ09NTUFORDo6aWNvbiIsIkRFTDo6Y2l0ZSIsIkZPUk06OmFj
+dGlvbiIsIklNRzo6c3JjIiwiSU5QVVQ6OnNyYyIsIklOUzo6Y2l0ZSIsIlE6OmNpdGUiLCJWSURFTzo6
+cG9zdGVyIl0pLHQuaSkKQy5EeD1uZXcgSC5MUCgwLHt9LEMueEQsSC5OMCgiTFA8cVUqLHpNPGo4Kj4q
+PiIpKQpDLkNNPW5ldyBILkxQKDAse30sQy54RCxILk4wKCJMUDxxVSoscVUqPiIpKQpDLmlIPUguVk0o
+cyhbXSksSC5OMCgiamQ8R0QqPiIpKQpDLldPPW5ldyBILkxQKDAse30sQy5pSCxILk4wKCJMUDxHRCos
+QD4iKSkKQy5ZMj1uZXcgTC5POSgiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5kaXJlY3RvcnkiKQpDLnJm
+PW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVUeXBlLmZpbGUiKQpDLlRlPW5ldyBILnd2KCJjYWxs
+IikKQy5vRT1uZXcgUC5HWSghMSkKQy53UT1uZXcgUC5GeShudWxsLDIpfSkoKTsoZnVuY3Rpb24gc3Rh
+dGljRmllbGRzKCl7JC56bT1udWxsCiQueWo9MAokLm1KPW51bGwKJC5QND1udWxsCiQuTkY9bnVsbAok
+LlRYPW51bGwKJC54Nz1udWxsCiQubnc9bnVsbAokLnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAok
+Lms4PW51bGwKJC5tZz1udWxsCiQuVUQ9ITEKJC5YMz1DLk5VCiQueGc9SC5WTShbXSxILk4wKCJqZDxN
+aD4iKSkKJC54bz1udWxsCiQuQk89bnVsbAokLmx0PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh0Lk4s
+dC5ZKQokLklSPW51bGwKJC5JNj1udWxsCiQuRmY9bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFs
+aXplcnMoKXt2YXIgcz1odW5rSGVscGVycy5sYXp5RmluYWwscj1odW5rSGVscGVycy5sYXp5T2xkCnMo
+JCwiZmEiLCJ3IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMo
+JCwiVTIiLCJTbiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24o
+KXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkKcygkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBI
+LmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZl
+ciQifX0pKX0pCnMoJCwiUjEiLCJOOSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0p
+CnMoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1l
+bnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0cnl7bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNh
+dGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1
+cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKcygkLCJyWiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNN
+KGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNFeHByJD0iJGFyZ3VtZW50cyQiCnRyeXsodm9pZCAwKS4k
+bWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMo
+JCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJj
+MyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNo
+KHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4g
+SC5jTShILk1qKHZvaWQgMCkpfSkKcygkLCJBNyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1
+bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgp
+KX0pCnMoJCwiV2MiLCJ1dCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixm
+dW5jdGlvbigpe3JldHVybiBuZXcgUC54cigpLiQwKCl9KQpzKCQsImRIIiwiSEciLGZ1bmN0aW9uKCl7
+cmV0dXJuIG5ldyBQLk56KCkuJDAoKX0pCnMoJCwiYnQiLCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3
+IEludDhBcnJheShILlhGKEguVk0oWy0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
+LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
+LC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2
+LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAs
+MTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMs
+LTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQs
+NDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIsLTIsLTIsLTJdLHQuYSkpKX0pCnMoJCwiTTUiLCJ3USIs
+ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90
+eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0
+Zm9ybT09IndpbjMyIn0pCnMoJCwibWYiLCJ6NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1c
+XC4wLTlBLVpfYS16fl0qJCIpfSkKcygkLCJPUSIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9
+KQpzKCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0i
+LCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUiLCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIs
+IkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIi
+LCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdST1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIs
+IkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIsIkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxE
+U0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIsIkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIs
+IkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVSIiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1H
+IiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1F
+TlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJPTCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwi
+UCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMiLCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxM
+IiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIsIlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJU
+QUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJFQSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJU
+UiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJWSURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0
+IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5cXFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5j
+dGlvbigpe3JldHVybiBQLk5EKHNlbGYpfSkKcygkLCJrdCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBI
+LllnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkKcygkLCJmSyIsImtJIixmdW5jdGlvbigpe3JldHVybiBm
+dW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMubz1hfX0pCnIoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXty
+ZXR1cm4gbmV3IFQubVEoKX0pCnIoJCwiT2wiLCJVRSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9s
+LmdtVyhXLngzKCkpLmhyZWYpLmdoWSgpLnEoMCwiYXV0aFRva2VuIil9KQpyKCQsImhUIiwieVAiLGZ1
+bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250
+ZW50Iil9KQpyKCQsIlc2IiwiaEwiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9y
+KCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIpfSkKcigkLCJUUiIsIkRXIixmdW5jdGlvbigpe3Jl
+dHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiZm9vdGVyIil9KQpyKCQsIkVZIiwiZmkiLGZ1bmN0aW9u
+KCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJoZWFkZXIiKX0pCnIoJCwiYXYiLCJEOSIsZnVu
+Y3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiN1bml0LW5hbWUiKX0pCnIoJCwidDAi
+LCJiTiIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQt
+c3RhdHVzLWljb24tbGFiZWwiKX0pCnIoJCwiYkEiLCJjMCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigp
+LnF1ZXJ5U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24iKX0pCnIoJCwiZmUiLCJLRyIs
+ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWEEoKX0pCnMoJCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1
+cm4gbmV3IE0ubEkoJC5IaygpKX0pCnMoJCwieXIiLCJiRCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEUu
+T0YoUC5udSgiLyIpLFAubnUoIlteL10kIiksUC5udSgiXi8iKSl9KQpzKCQsIk1rIiwiS2siLGZ1bmN0
+aW9uKCl7cmV0dXJuIG5ldyBMLklWKFAubnUoIlsvXFxcXF0iKSxQLm51KCJbXi9cXFxcXSQiKSxQLm51
+KCJeKFxcXFxcXFxcW15cXFxcXStcXFxcW15cXFxcL10rfFthLXpBLVpdOlsvXFxcXF0pIiksUC5udSgi
+XlsvXFxcXF0oPyFbL1xcXFxdKSIpKX0pCnMoJCwiYWsiLCJFYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3
+IEYucnUoUC5udSgiLyIpLFAubnUoIiheW2EtekEtWl1bLSsuYS16QS1aXFxkXSo6Ly98W14vXSkkIiks
+UC5udSgiW2EtekEtWl1bLSsuYS16QS1aXFxkXSo6Ly9bXi9dKiIpLFAubnUoIl4vIikpfSkKcygkLCJs
+cyIsIkhrIixmdW5jdGlvbigpe3JldHVybiBPLlJoKCl9KX0pKCk7KGZ1bmN0aW9uIG5hdGl2ZVN1cHBv
+cnQoKXshZnVuY3Rpb24oKXt2YXIgcz1mdW5jdGlvbihhKXt2YXIgbT17fQptW2FdPTEKcmV0dXJuIE9i
+amVjdC5rZXlzKGh1bmtIZWxwZXJzLmNvbnZlcnRUb0Zhc3RPYmplY3QobSkpWzBdfQp2LmdldElzb2xh
+dGVUYWc9ZnVuY3Rpb24oYSl7cmV0dXJuIHMoIl9fX2RhcnRfIithK3YuaXNvbGF0ZVRhZyl9CnZhciBy
+PSJfX19kYXJ0X2lzb2xhdGVfdGFnc18iCnZhciBxPU9iamVjdFtyXXx8KE9iamVjdFtyXT1PYmplY3Qu
+Y3JlYXRlKG51bGwpKQp2YXIgcD0iX1p4WXhYIgpmb3IodmFyIG89MDs7bysrKXt2YXIgbj1zKHArIl8i
+K28rIl8iKQppZighKG4gaW4gcSkpe3Fbbl09MQp2Lmlzb2xhdGVUYWc9bgpicmVha319di5kaXNwYXRj
+aFByb3BlcnR5TmFtZT12LmdldElzb2xhdGVUYWcoImRpc3BhdGNoX3JlY29yZCIpfSgpCmh1bmtIZWxw
+ZXJzLnNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcoe0RPTUVycm9yOkouR3YsTWVkaWFFcnJvcjpK
+Lkd2LE5hdmlnYXRvcjpKLkd2LE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLkd2LE5hdmlnYXRv
+clVzZXJNZWRpYUVycm9yOkouR3YsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si5HdixQb3NpdGlvbkVycm9y
+OkouR3YsUmFuZ2U6Si5HdixTUUxFcnJvcjpKLkd2LERhdGFWaWV3OkguRVQsQXJyYXlCdWZmZXJWaWV3
+OkguRVQsRmxvYXQzMkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLElu
+dDMyQXJyYXk6SC5kRSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILmRULFVpbnQzMkFycmF5Okgu
+UHEsVWludDhDbGFtcGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpI
+LlY2LEhUTUxBdWRpb0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1l
+bnQ6Vy5xRSxIVE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxE
+TGlzdEVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50Olcu
+cUUsSFRNTERldGFpbHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxl
+bWVudDpXLnFFLEhUTUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRN
+TEhSRWxlbWVudDpXLnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFF
+LEhUTUxIdG1sRWxlbWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVu
+dDpXLnFFLEhUTUxJbnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxl
+bWVudDpXLnFFLEhUTUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1h
+cEVsZW1lbnQ6Vy5xRSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRN
+TE1ldGFFbGVtZW50OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUs
+SFRNTE9MaXN0RWxlbWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxl
+bWVudDpXLnFFLEhUTUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1M
+UGFyYW1FbGVtZW50OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5x
+RSxIVE1MUHJvZ3Jlc3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRF
+bGVtZW50OlcucUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1M
+U291cmNlRWxlbWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5x
+RSxIVE1MVGFibGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRN
+TFRhYmxlRGF0YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxI
+VE1MVGFibGVDb2xFbGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxl
+bWVudDpXLnFFLEhUTUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVM
+aXN0RWxlbWVudDpXLnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5x
+RSxIVE1MRGlyZWN0b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVs
+ZW1lbnQ6Vy5xRSxIVE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUs
+SFRNTEVsZW1lbnQ6Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZ
+LEhUTUxCYXNlRWxlbWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNl
+Y3Rpb246Vy5ueCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVj
+dGlvbjpXLm54LFRleHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3Bl
+cnRpZXM6Vy5vSixDU1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5R
+RixET01FeGNlcHRpb246Vy5OaCxET01JbXBsZW1lbnRhdGlvbjpXLmFlLERPTVJlY3RSZWFkT25seTpX
+LklCLERPTVRva2VuTGlzdDpXLm43LEVsZW1lbnQ6Vy5jdixBYm9ydFBheW1lbnRFdmVudDpXLmVhLEFu
+aW1hdGlvbkV2ZW50OlcuZWEsQW5pbWF0aW9uUGxheWJhY2tFdmVudDpXLmVhLEFwcGxpY2F0aW9uQ2Fj
+aGVFcnJvckV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDpXLmVhLEJhY2tncm91bmRG
+ZXRjaEV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNo
+ZWRFdmVudDpXLmVhLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDpXLmVhLEJlZm9yZVVubG9hZEV2ZW50
+OlcuZWEsQmxvYkV2ZW50OlcuZWEsQ2FuTWFrZVBheW1lbnRFdmVudDpXLmVhLENsaXBib2FyZEV2ZW50
+OlcuZWEsQ2xvc2VFdmVudDpXLmVhLEN1c3RvbUV2ZW50OlcuZWEsRGV2aWNlTW90aW9uRXZlbnQ6Vy5l
+YSxEZXZpY2VPcmllbnRhdGlvbkV2ZW50OlcuZWEsRXJyb3JFdmVudDpXLmVhLEV4dGVuZGFibGVFdmVu
+dDpXLmVhLEV4dGVuZGFibGVNZXNzYWdlRXZlbnQ6Vy5lYSxGZXRjaEV2ZW50OlcuZWEsRm9udEZhY2VT
+ZXRMb2FkRXZlbnQ6Vy5lYSxGb3JlaWduRmV0Y2hFdmVudDpXLmVhLEdhbWVwYWRFdmVudDpXLmVhLEhh
+c2hDaGFuZ2VFdmVudDpXLmVhLEluc3RhbGxFdmVudDpXLmVhLE1lZGlhRW5jcnlwdGVkRXZlbnQ6Vy5l
+YSxNZWRpYUtleU1lc3NhZ2VFdmVudDpXLmVhLE1lZGlhUXVlcnlMaXN0RXZlbnQ6Vy5lYSxNZWRpYVN0
+cmVhbUV2ZW50OlcuZWEsTWVkaWFTdHJlYW1UcmFja0V2ZW50OlcuZWEsTWVzc2FnZUV2ZW50OlcuZWEs
+TUlESUNvbm5lY3Rpb25FdmVudDpXLmVhLE1JRElNZXNzYWdlRXZlbnQ6Vy5lYSxNdXRhdGlvbkV2ZW50
+OlcuZWEsTm90aWZpY2F0aW9uRXZlbnQ6Vy5lYSxQYWdlVHJhbnNpdGlvbkV2ZW50OlcuZWEsUGF5bWVu
+dFJlcXVlc3RFdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6Vy5lYSxQb3BTdGF0ZUV2
+ZW50OlcuZWEsUHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OlcuZWEsUHJlc2VudGF0
+aW9uQ29ubmVjdGlvbkNsb3NlRXZlbnQ6Vy5lYSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6Vy5lYSxQdXNo
+RXZlbnQ6Vy5lYSxSVENEYXRhQ2hhbm5lbEV2ZW50OlcuZWEsUlRDRFRNRlRvbmVDaGFuZ2VFdmVudDpX
+LmVhLFJUQ1BlZXJDb25uZWN0aW9uSWNlRXZlbnQ6Vy5lYSxSVENUcmFja0V2ZW50OlcuZWEsU2VjdXJp
+dHlQb2xpY3lWaW9sYXRpb25FdmVudDpXLmVhLFNlbnNvckVycm9yRXZlbnQ6Vy5lYSxTcGVlY2hSZWNv
+Z25pdGlvbkVycm9yOlcuZWEsU3BlZWNoUmVjb2duaXRpb25FdmVudDpXLmVhLFNwZWVjaFN5bnRoZXNp
+c0V2ZW50OlcuZWEsU3RvcmFnZUV2ZW50OlcuZWEsU3luY0V2ZW50OlcuZWEsVHJhY2tFdmVudDpXLmVh
+LFRyYW5zaXRpb25FdmVudDpXLmVhLFdlYktpdFRyYW5zaXRpb25FdmVudDpXLmVhLFZSRGV2aWNlRXZl
+bnQ6Vy5lYSxWUkRpc3BsYXlFdmVudDpXLmVhLFZSU2Vzc2lvbkV2ZW50OlcuZWEsTW9qb0ludGVyZmFj
+ZVJlcXVlc3RFdmVudDpXLmVhLFVTQkNvbm5lY3Rpb25FdmVudDpXLmVhLElEQlZlcnNpb25DaGFuZ2VF
+dmVudDpXLmVhLEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OlcuZWEsT2ZmbGluZUF1ZGlvQ29tcGxldGlvbkV2
+ZW50OlcuZWEsV2ViR0xDb250ZXh0RXZlbnQ6Vy5lYSxFdmVudDpXLmVhLElucHV0RXZlbnQ6Vy5lYSxT
+dWJtaXRFdmVudDpXLmVhLEV2ZW50VGFyZ2V0OlcuRDAsRmlsZTpXLmhILEhUTUxGb3JtRWxlbWVudDpX
+Lmg0LEhpc3Rvcnk6Vy5icixIVE1MRG9jdW1lbnQ6Vy5WYixYTUxIdHRwUmVxdWVzdDpXLmZKLFhNTEh0
+dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6Vy53YSxJbWFnZURhdGE6Vy5TZyxMb2NhdGlvbjpXLnc3LE1vdXNl
+RXZlbnQ6Vy5BaixEcmFnRXZlbnQ6Vy5BaixQb2ludGVyRXZlbnQ6Vy5BaixXaGVlbEV2ZW50OlcuQWos
+RG9jdW1lbnRGcmFnbWVudDpXLnVILFNoYWRvd1Jvb3Q6Vy51SCxEb2N1bWVudFR5cGU6Vy51SCxOb2Rl
+OlcudUgsTm9kZUxpc3Q6Vy5CSCxSYWRpb05vZGVMaXN0OlcuQkgsSFRNTFBhcmFncmFwaEVsZW1lbnQ6
+Vy5TTixQcm9ncmVzc0V2ZW50OlcuZXcsUmVzb3VyY2VQcm9ncmVzc0V2ZW50OlcuZXcsSFRNTFNlbGVj
+dEVsZW1lbnQ6Vy5scCxIVE1MVGFibGVFbGVtZW50OlcuVGIsSFRNTFRhYmxlUm93RWxlbWVudDpXLkl2
+LEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OlcuV1AsSFRNTFRlbXBsYXRlRWxlbWVudDpXLnlZLENvbXBv
+c2l0aW9uRXZlbnQ6Vy53NixGb2N1c0V2ZW50OlcudzYsS2V5Ym9hcmRFdmVudDpXLnc2LFRleHRFdmVu
+dDpXLnc2LFRvdWNoRXZlbnQ6Vy53NixVSUV2ZW50OlcudzYsV2luZG93OlcuSzUsRE9NV2luZG93Olcu
+SzUsRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6
+Vy5DbSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sQXR0
+cjpXLkNRLENsaWVudFJlY3Q6Vy53NCxET01SZWN0OlcudzQsTmFtZWROb2RlTWFwOlcucmgsTW96TmFt
+ZWRBdHRyTWFwOlcucmgsSURCS2V5UmFuZ2U6UC5oRixTVkdTY3JpcHRFbGVtZW50OlAubmQsU1ZHQUVs
+ZW1lbnQ6UC5oaSxTVkdBbmltYXRlRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OlAu
+aGksU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6UC5oaSxTVkdBbmltYXRpb25FbGVtZW50OlAuaGks
+U1ZHQ2lyY2xlRWxlbWVudDpQLmhpLFNWR0NsaXBQYXRoRWxlbWVudDpQLmhpLFNWR0RlZnNFbGVtZW50
+OlAuaGksU1ZHRGVzY0VsZW1lbnQ6UC5oaSxTVkdEaXNjYXJkRWxlbWVudDpQLmhpLFNWR0VsbGlwc2VF
+bGVtZW50OlAuaGksU1ZHRkVCbGVuZEVsZW1lbnQ6UC5oaSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDpQ
+LmhpLFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OlAuaGksU1ZHRkVDb21wb3NpdGVFbGVtZW50
+OlAuaGksU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRURpZmZ1c2VMaWdodGluZ0Vs
+ZW1lbnQ6UC5oaSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6UC5oaSxTVkdGRURpc3RhbnRMaWdo
+dEVsZW1lbnQ6UC5oaSxTVkdGRUZsb29kRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0FFbGVtZW50OlAuaGks
+U1ZHRkVGdW5jQkVsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNHRWxlbWVudDpQLmhpLFNWR0ZFRnVuY1JFbGVt
+ZW50OlAuaGksU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OlAuaGksU1ZHRkVJbWFnZUVsZW1lbnQ6UC5o
+aSxTVkdGRU1lcmdlRWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDpQLmhpLFNWR0ZFTW9y
+cGhvbG9neUVsZW1lbnQ6UC5oaSxTVkdGRU9mZnNldEVsZW1lbnQ6UC5oaSxTVkdGRVBvaW50TGlnaHRF
+bGVtZW50OlAuaGksU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFU3BvdExpZ2h0
+RWxlbWVudDpQLmhpLFNWR0ZFVGlsZUVsZW1lbnQ6UC5oaSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OlAu
+aGksU1ZHRmlsdGVyRWxlbWVudDpQLmhpLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OlAuaGksU1ZHR0Vs
+ZW1lbnQ6UC5oaSxTVkdHZW9tZXRyeUVsZW1lbnQ6UC5oaSxTVkdHcmFwaGljc0VsZW1lbnQ6UC5oaSxT
+VkdJbWFnZUVsZW1lbnQ6UC5oaSxTVkdMaW5lRWxlbWVudDpQLmhpLFNWR0xpbmVhckdyYWRpZW50RWxl
+bWVudDpQLmhpLFNWR01hcmtlckVsZW1lbnQ6UC5oaSxTVkdNYXNrRWxlbWVudDpQLmhpLFNWR01ldGFk
+YXRhRWxlbWVudDpQLmhpLFNWR1BhdGhFbGVtZW50OlAuaGksU1ZHUGF0dGVybkVsZW1lbnQ6UC5oaSxT
+VkdQb2x5Z29uRWxlbWVudDpQLmhpLFNWR1BvbHlsaW5lRWxlbWVudDpQLmhpLFNWR1JhZGlhbEdyYWRp
+ZW50RWxlbWVudDpQLmhpLFNWR1JlY3RFbGVtZW50OlAuaGksU1ZHU2V0RWxlbWVudDpQLmhpLFNWR1N0
+b3BFbGVtZW50OlAuaGksU1ZHU3R5bGVFbGVtZW50OlAuaGksU1ZHU1ZHRWxlbWVudDpQLmhpLFNWR1N3
+aXRjaEVsZW1lbnQ6UC5oaSxTVkdTeW1ib2xFbGVtZW50OlAuaGksU1ZHVFNwYW5FbGVtZW50OlAuaGks
+U1ZHVGV4dENvbnRlbnRFbGVtZW50OlAuaGksU1ZHVGV4dEVsZW1lbnQ6UC5oaSxTVkdUZXh0UGF0aEVs
+ZW1lbnQ6UC5oaSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OlAuaGksU1ZHVGl0bGVFbGVtZW50OlAu
+aGksU1ZHVXNlRWxlbWVudDpQLmhpLFNWR1ZpZXdFbGVtZW50OlAuaGksU1ZHR3JhZGllbnRFbGVtZW50
+OlAuaGksU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6UC5oaSxTVkdGRURyb3BTaGFk
+b3dFbGVtZW50OlAuaGksU1ZHTVBhdGhFbGVtZW50OlAuaGksU1ZHRWxlbWVudDpQLmhpfSkKaHVua0hl
+bHBlcnMuc2V0T3JVcGRhdGVMZWFmVGFncyh7RE9NRXJyb3I6dHJ1ZSxNZWRpYUVycm9yOnRydWUsTmF2
+aWdhdG9yOnRydWUsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOnRydWUsTmF2aWdhdG9yVXNlck1l
+ZGlhRXJyb3I6dHJ1ZSxPdmVyY29uc3RyYWluZWRFcnJvcjp0cnVlLFBvc2l0aW9uRXJyb3I6dHJ1ZSxS
+YW5nZTp0cnVlLFNRTEVycm9yOnRydWUsRGF0YVZpZXc6dHJ1ZSxBcnJheUJ1ZmZlclZpZXc6ZmFsc2Us
+RmxvYXQzMkFycmF5OnRydWUsRmxvYXQ2NEFycmF5OnRydWUsSW50MTZBcnJheTp0cnVlLEludDMyQXJy
+YXk6dHJ1ZSxJbnQ4QXJyYXk6dHJ1ZSxVaW50MTZBcnJheTp0cnVlLFVpbnQzMkFycmF5OnRydWUsVWlu
+dDhDbGFtcGVkQXJyYXk6dHJ1ZSxDYW52YXNQaXhlbEFycmF5OnRydWUsVWludDhBcnJheTpmYWxzZSxI
+VE1MQXVkaW9FbGVtZW50OnRydWUsSFRNTEJSRWxlbWVudDp0cnVlLEhUTUxCdXR0b25FbGVtZW50OnRy
+dWUsSFRNTENhbnZhc0VsZW1lbnQ6dHJ1ZSxIVE1MQ29udGVudEVsZW1lbnQ6dHJ1ZSxIVE1MRExpc3RF
+bGVtZW50OnRydWUsSFRNTERhdGFFbGVtZW50OnRydWUsSFRNTERhdGFMaXN0RWxlbWVudDp0cnVlLEhU
+TUxEZXRhaWxzRWxlbWVudDp0cnVlLEhUTUxEaWFsb2dFbGVtZW50OnRydWUsSFRNTERpdkVsZW1lbnQ6
+dHJ1ZSxIVE1MRW1iZWRFbGVtZW50OnRydWUsSFRNTEZpZWxkU2V0RWxlbWVudDp0cnVlLEhUTUxIUkVs
+ZW1lbnQ6dHJ1ZSxIVE1MSGVhZEVsZW1lbnQ6dHJ1ZSxIVE1MSGVhZGluZ0VsZW1lbnQ6dHJ1ZSxIVE1M
+SHRtbEVsZW1lbnQ6dHJ1ZSxIVE1MSUZyYW1lRWxlbWVudDp0cnVlLEhUTUxJbWFnZUVsZW1lbnQ6dHJ1
+ZSxIVE1MSW5wdXRFbGVtZW50OnRydWUsSFRNTExJRWxlbWVudDp0cnVlLEhUTUxMYWJlbEVsZW1lbnQ6
+dHJ1ZSxIVE1MTGVnZW5kRWxlbWVudDp0cnVlLEhUTUxMaW5rRWxlbWVudDp0cnVlLEhUTUxNYXBFbGVt
+ZW50OnRydWUsSFRNTE1lZGlhRWxlbWVudDp0cnVlLEhUTUxNZW51RWxlbWVudDp0cnVlLEhUTUxNZXRh
+RWxlbWVudDp0cnVlLEhUTUxNZXRlckVsZW1lbnQ6dHJ1ZSxIVE1MTW9kRWxlbWVudDp0cnVlLEhUTUxP
+TGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MT2JqZWN0RWxlbWVudDp0cnVlLEhUTUxPcHRHcm91cEVsZW1lbnQ6
+dHJ1ZSxIVE1MT3B0aW9uRWxlbWVudDp0cnVlLEhUTUxPdXRwdXRFbGVtZW50OnRydWUsSFRNTFBhcmFt
+RWxlbWVudDp0cnVlLEhUTUxQaWN0dXJlRWxlbWVudDp0cnVlLEhUTUxQcmVFbGVtZW50OnRydWUsSFRN
+TFByb2dyZXNzRWxlbWVudDp0cnVlLEhUTUxRdW90ZUVsZW1lbnQ6dHJ1ZSxIVE1MU2NyaXB0RWxlbWVu
+dDp0cnVlLEhUTUxTaGFkb3dFbGVtZW50OnRydWUsSFRNTFNsb3RFbGVtZW50OnRydWUsSFRNTFNvdXJj
+ZUVsZW1lbnQ6dHJ1ZSxIVE1MU3BhbkVsZW1lbnQ6dHJ1ZSxIVE1MU3R5bGVFbGVtZW50OnRydWUsSFRN
+TFRhYmxlQ2FwdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJs
+ZURhdGFDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50OnRydWUsSFRNTFRh
+YmxlQ29sRWxlbWVudDp0cnVlLEhUTUxUZXh0QXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MVGltZUVsZW1lbnQ6
+dHJ1ZSxIVE1MVGl0bGVFbGVtZW50OnRydWUsSFRNTFRyYWNrRWxlbWVudDp0cnVlLEhUTUxVTGlzdEVs
+ZW1lbnQ6dHJ1ZSxIVE1MVW5rbm93bkVsZW1lbnQ6dHJ1ZSxIVE1MVmlkZW9FbGVtZW50OnRydWUsSFRN
+TERpcmVjdG9yeUVsZW1lbnQ6dHJ1ZSxIVE1MRm9udEVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVFbGVtZW50
+OnRydWUsSFRNTEZyYW1lU2V0RWxlbWVudDp0cnVlLEhUTUxNYXJxdWVlRWxlbWVudDp0cnVlLEhUTUxF
+bGVtZW50OmZhbHNlLEhUTUxBbmNob3JFbGVtZW50OnRydWUsSFRNTEFyZWFFbGVtZW50OnRydWUsSFRN
+TEJhc2VFbGVtZW50OnRydWUsQmxvYjpmYWxzZSxIVE1MQm9keUVsZW1lbnQ6dHJ1ZSxDREFUQVNlY3Rp
+b246dHJ1ZSxDaGFyYWN0ZXJEYXRhOnRydWUsQ29tbWVudDp0cnVlLFByb2Nlc3NpbmdJbnN0cnVjdGlv
+bjp0cnVlLFRleHQ6dHJ1ZSxDU1NTdHlsZURlY2xhcmF0aW9uOnRydWUsTVNTdHlsZUNTU1Byb3BlcnRp
+ZXM6dHJ1ZSxDU1MyUHJvcGVydGllczp0cnVlLFhNTERvY3VtZW50OnRydWUsRG9jdW1lbnQ6ZmFsc2Us
+RE9NRXhjZXB0aW9uOnRydWUsRE9NSW1wbGVtZW50YXRpb246dHJ1ZSxET01SZWN0UmVhZE9ubHk6ZmFs
+c2UsRE9NVG9rZW5MaXN0OnRydWUsRWxlbWVudDpmYWxzZSxBYm9ydFBheW1lbnRFdmVudDp0cnVlLEFu
+aW1hdGlvbkV2ZW50OnRydWUsQW5pbWF0aW9uUGxheWJhY2tFdmVudDp0cnVlLEFwcGxpY2F0aW9uQ2Fj
+aGVFcnJvckV2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDp0cnVlLEJhY2tncm91bmRG
+ZXRjaEV2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OnRydWUsQmFja2dyb3VuZEZldGNo
+ZWRFdmVudDp0cnVlLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDp0cnVlLEJlZm9yZVVubG9hZEV2ZW50
+OnRydWUsQmxvYkV2ZW50OnRydWUsQ2FuTWFrZVBheW1lbnRFdmVudDp0cnVlLENsaXBib2FyZEV2ZW50
+OnRydWUsQ2xvc2VFdmVudDp0cnVlLEN1c3RvbUV2ZW50OnRydWUsRGV2aWNlTW90aW9uRXZlbnQ6dHJ1
+ZSxEZXZpY2VPcmllbnRhdGlvbkV2ZW50OnRydWUsRXJyb3JFdmVudDp0cnVlLEV4dGVuZGFibGVFdmVu
+dDp0cnVlLEV4dGVuZGFibGVNZXNzYWdlRXZlbnQ6dHJ1ZSxGZXRjaEV2ZW50OnRydWUsRm9udEZhY2VT
+ZXRMb2FkRXZlbnQ6dHJ1ZSxGb3JlaWduRmV0Y2hFdmVudDp0cnVlLEdhbWVwYWRFdmVudDp0cnVlLEhh
+c2hDaGFuZ2VFdmVudDp0cnVlLEluc3RhbGxFdmVudDp0cnVlLE1lZGlhRW5jcnlwdGVkRXZlbnQ6dHJ1
+ZSxNZWRpYUtleU1lc3NhZ2VFdmVudDp0cnVlLE1lZGlhUXVlcnlMaXN0RXZlbnQ6dHJ1ZSxNZWRpYVN0
+cmVhbUV2ZW50OnRydWUsTWVkaWFTdHJlYW1UcmFja0V2ZW50OnRydWUsTWVzc2FnZUV2ZW50OnRydWUs
+TUlESUNvbm5lY3Rpb25FdmVudDp0cnVlLE1JRElNZXNzYWdlRXZlbnQ6dHJ1ZSxNdXRhdGlvbkV2ZW50
+OnRydWUsTm90aWZpY2F0aW9uRXZlbnQ6dHJ1ZSxQYWdlVHJhbnNpdGlvbkV2ZW50OnRydWUsUGF5bWVu
+dFJlcXVlc3RFdmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6dHJ1ZSxQb3BTdGF0ZUV2
+ZW50OnRydWUsUHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OnRydWUsUHJlc2VudGF0
+aW9uQ29ubmVjdGlvbkNsb3NlRXZlbnQ6dHJ1ZSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6dHJ1ZSxQdXNo
+RXZlbnQ6dHJ1ZSxSVENEYXRhQ2hhbm5lbEV2ZW50OnRydWUsUlRDRFRNRlRvbmVDaGFuZ2VFdmVudDp0
+cnVlLFJUQ1BlZXJDb25uZWN0aW9uSWNlRXZlbnQ6dHJ1ZSxSVENUcmFja0V2ZW50OnRydWUsU2VjdXJp
+dHlQb2xpY3lWaW9sYXRpb25FdmVudDp0cnVlLFNlbnNvckVycm9yRXZlbnQ6dHJ1ZSxTcGVlY2hSZWNv
+Z25pdGlvbkVycm9yOnRydWUsU3BlZWNoUmVjb2duaXRpb25FdmVudDp0cnVlLFNwZWVjaFN5bnRoZXNp
+c0V2ZW50OnRydWUsU3RvcmFnZUV2ZW50OnRydWUsU3luY0V2ZW50OnRydWUsVHJhY2tFdmVudDp0cnVl
+LFRyYW5zaXRpb25FdmVudDp0cnVlLFdlYktpdFRyYW5zaXRpb25FdmVudDp0cnVlLFZSRGV2aWNlRXZl
+bnQ6dHJ1ZSxWUkRpc3BsYXlFdmVudDp0cnVlLFZSU2Vzc2lvbkV2ZW50OnRydWUsTW9qb0ludGVyZmFj
+ZVJlcXVlc3RFdmVudDp0cnVlLFVTQkNvbm5lY3Rpb25FdmVudDp0cnVlLElEQlZlcnNpb25DaGFuZ2VF
+dmVudDp0cnVlLEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OnRydWUsT2ZmbGluZUF1ZGlvQ29tcGxldGlvbkV2
+ZW50OnRydWUsV2ViR0xDb250ZXh0RXZlbnQ6dHJ1ZSxFdmVudDpmYWxzZSxJbnB1dEV2ZW50OmZhbHNl
+LFN1Ym1pdEV2ZW50OmZhbHNlLEV2ZW50VGFyZ2V0OmZhbHNlLEZpbGU6dHJ1ZSxIVE1MRm9ybUVsZW1l
+bnQ6dHJ1ZSxIaXN0b3J5OnRydWUsSFRNTERvY3VtZW50OnRydWUsWE1MSHR0cFJlcXVlc3Q6dHJ1ZSxY
+TUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OmZhbHNlLEltYWdlRGF0YTp0cnVlLExvY2F0aW9uOnRydWUs
+TW91c2VFdmVudDp0cnVlLERyYWdFdmVudDp0cnVlLFBvaW50ZXJFdmVudDp0cnVlLFdoZWVsRXZlbnQ6
+dHJ1ZSxEb2N1bWVudEZyYWdtZW50OnRydWUsU2hhZG93Um9vdDp0cnVlLERvY3VtZW50VHlwZTp0cnVl
+LE5vZGU6ZmFsc2UsTm9kZUxpc3Q6dHJ1ZSxSYWRpb05vZGVMaXN0OnRydWUsSFRNTFBhcmFncmFwaEVs
+ZW1lbnQ6dHJ1ZSxQcm9ncmVzc0V2ZW50OnRydWUsUmVzb3VyY2VQcm9ncmVzc0V2ZW50OnRydWUsSFRN
+TFNlbGVjdEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVFbGVtZW50OnRydWUsSFRNTFRhYmxlUm93RWxlbWVu
+dDp0cnVlLEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OnRydWUsSFRNTFRlbXBsYXRlRWxlbWVudDp0cnVl
+LENvbXBvc2l0aW9uRXZlbnQ6dHJ1ZSxGb2N1c0V2ZW50OnRydWUsS2V5Ym9hcmRFdmVudDp0cnVlLFRl
+eHRFdmVudDp0cnVlLFRvdWNoRXZlbnQ6dHJ1ZSxVSUV2ZW50OmZhbHNlLFdpbmRvdzp0cnVlLERPTVdp
+bmRvdzp0cnVlLERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlOnRydWUsU2VydmljZVdvcmtlckdsb2Jh
+bFNjb3BlOnRydWUsU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxXb3JrZXJHbG9iYWxTY29wZTp0
+cnVlLEF0dHI6dHJ1ZSxDbGllbnRSZWN0OnRydWUsRE9NUmVjdDp0cnVlLE5hbWVkTm9kZU1hcDp0cnVl
+LE1vek5hbWVkQXR0ck1hcDp0cnVlLElEQktleVJhbmdlOnRydWUsU1ZHU2NyaXB0RWxlbWVudDp0cnVl
+LFNWR0FFbGVtZW50OnRydWUsU1ZHQW5pbWF0ZUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlTW90aW9uRWxl
+bWVudDp0cnVlLFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50OnRydWUsU1ZHQW5pbWF0aW9uRWxlbWVu
+dDp0cnVlLFNWR0NpcmNsZUVsZW1lbnQ6dHJ1ZSxTVkdDbGlwUGF0aEVsZW1lbnQ6dHJ1ZSxTVkdEZWZz
+RWxlbWVudDp0cnVlLFNWR0Rlc2NFbGVtZW50OnRydWUsU1ZHRGlzY2FyZEVsZW1lbnQ6dHJ1ZSxTVkdF
+bGxpcHNlRWxlbWVudDp0cnVlLFNWR0ZFQmxlbmRFbGVtZW50OnRydWUsU1ZHRkVDb2xvck1hdHJpeEVs
+ZW1lbnQ6dHJ1ZSxTVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVudDp0cnVlLFNWR0ZFQ29tcG9zaXRl
+RWxlbWVudDp0cnVlLFNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVEaWZmdXNlTGln
+aHRpbmdFbGVtZW50OnRydWUsU1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OnRydWUsU1ZHRkVEaXN0
+YW50TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVGbG9vZEVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNBRWxlbWVu
+dDp0cnVlLFNWR0ZFRnVuY0JFbGVtZW50OnRydWUsU1ZHRkVGdW5jR0VsZW1lbnQ6dHJ1ZSxTVkdGRUZ1
+bmNSRWxlbWVudDp0cnVlLFNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVudDp0cnVlLFNWR0ZFSW1hZ2VFbGVt
+ZW50OnRydWUsU1ZHRkVNZXJnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6dHJ1ZSxT
+VkdGRU1vcnBob2xvZ3lFbGVtZW50OnRydWUsU1ZHRkVPZmZzZXRFbGVtZW50OnRydWUsU1ZHRkVQb2lu
+dExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxTVkdGRVNw
+b3RMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVRpbGVFbGVtZW50OnRydWUsU1ZHRkVUdXJidWxlbmNlRWxl
+bWVudDp0cnVlLFNWR0ZpbHRlckVsZW1lbnQ6dHJ1ZSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDp0cnVl
+LFNWR0dFbGVtZW50OnRydWUsU1ZHR2VvbWV0cnlFbGVtZW50OnRydWUsU1ZHR3JhcGhpY3NFbGVtZW50
+OnRydWUsU1ZHSW1hZ2VFbGVtZW50OnRydWUsU1ZHTGluZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lYXJHcmFk
+aWVudEVsZW1lbnQ6dHJ1ZSxTVkdNYXJrZXJFbGVtZW50OnRydWUsU1ZHTWFza0VsZW1lbnQ6dHJ1ZSxT
+VkdNZXRhZGF0YUVsZW1lbnQ6dHJ1ZSxTVkdQYXRoRWxlbWVudDp0cnVlLFNWR1BhdHRlcm5FbGVtZW50
+OnRydWUsU1ZHUG9seWdvbkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5bGluZUVsZW1lbnQ6dHJ1ZSxTVkdSYWRp
+YWxHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdSZWN0RWxlbWVudDp0cnVlLFNWR1NldEVsZW1lbnQ6dHJ1
+ZSxTVkdTdG9wRWxlbWVudDp0cnVlLFNWR1N0eWxlRWxlbWVudDp0cnVlLFNWR1NWR0VsZW1lbnQ6dHJ1
+ZSxTVkdTd2l0Y2hFbGVtZW50OnRydWUsU1ZHU3ltYm9sRWxlbWVudDp0cnVlLFNWR1RTcGFuRWxlbWVu
+dDp0cnVlLFNWR1RleHRDb250ZW50RWxlbWVudDp0cnVlLFNWR1RleHRFbGVtZW50OnRydWUsU1ZHVGV4
+dFBhdGhFbGVtZW50OnRydWUsU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDp0cnVlLFNWR1RpdGxlRWxl
+bWVudDp0cnVlLFNWR1VzZUVsZW1lbnQ6dHJ1ZSxTVkdWaWV3RWxlbWVudDp0cnVlLFNWR0dyYWRpZW50
+RWxlbWVudDp0cnVlLFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50OnRydWUsU1ZHRkVE
+cm9wU2hhZG93RWxlbWVudDp0cnVlLFNWR01QYXRoRWxlbWVudDp0cnVlLFNWR0VsZW1lbnQ6ZmFsc2V9
+KQpILkxaLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUkcuJG5hdGl2ZVN1
+cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5WUC4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJy
+YXlCdWZmZXJWaWV3IgpILkRnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkgu
+V0IuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5aRy4kbmF0aXZlU3VwZXJj
+bGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlBnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1
+ZmZlclZpZXcifSkoKQpjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KHcpCmNvbnZlcnRUb0Zhc3RPYmplY3Qo
+JCk7KGZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBkb2N1bWVudD09PSJ1bmRlZmluZWQiKXthKG51bGwpCnJl
+dHVybn1pZih0eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCE9InVuZGVmaW5lZCIpe2EoZG9jdW1l
+bnQuY3VycmVudFNjcmlwdCkKcmV0dXJufXZhciBzPWRvY3VtZW50LnNjcmlwdHMKZnVuY3Rpb24gb25M
+b2FkKGIpe2Zvcih2YXIgcT0wO3E8cy5sZW5ndGg7KytxKXNbcV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigi
+bG9hZCIsb25Mb2FkLGZhbHNlKQphKGIudGFyZ2V0KX1mb3IodmFyIHI9MDtyPHMubGVuZ3RoOysrcilz
+W3JdLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSl9KShmdW5jdGlvbihhKXt2LmN1
+cnJlbnRTY3JpcHQ9YQp2YXIgcz1MLklxCmlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlv
+biIpZGFydE1haW5SdW5uZXIocyxbXSkKZWxzZSBzKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGluZ1VS
+TD1taWdyYXRpb24uanMubWFwCg==
''';
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 7f4cdc4..e465aec 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
@@ -794,9 +794,14 @@
link.classes.remove('selected-file');
}
});
- migrateUnitStatusIconLabel.classes.add('visible');
var entity = navigationTree.find(path);
- updateIconForStatus(migrateUnitStatusIcon, entity.migrationStatus);
+ // Update migration status for files in current migration.
+ if (entity == null) {
+ migrateUnitStatusIconLabel.classes.remove('visible');
+ } else {
+ migrateUnitStatusIconLabel.classes.add('visible');
+ updateIconForStatus(migrateUnitStatusIcon, entity.migrationStatus);
+ }
}
/// Updates the parent icons of [entity] with list item [element] in the
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index e1bda51..7b4b56f 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -1434,22 +1434,6 @@
var edge = step.edge;
if (!edge.isTriggered) continue;
var node = edge.destinationNode;
- var nonNullIntent = node.nonNullIntent;
- if (nonNullIntent.isPresent) {
- if (edge.isCheckable) {
- // The node has already been marked as having non-null intent, and
- // the edge can be addressed by adding a null check, so we prefer to
- // leave the edge unsatisfied and let the null check happen.
- result.unsatisfiedEdges.add(edge);
- continue;
- }
- if (nonNullIntent.isDirect) {
- // The node has direct non-null intent so we aren't in a position to
- // mark it as nullable.
- result.unsatisfiedEdges.add(edge);
- continue;
- }
- }
if (edge.isUninit && !node.isNullable) {
// [edge] is an edge from always to an uninitialized variable
// declaration.
@@ -1473,6 +1457,22 @@
continue;
}
}
+ var nonNullIntent = node.nonNullIntent;
+ if (nonNullIntent.isPresent) {
+ if (edge.isCheckable) {
+ // The node has already been marked as having non-null intent, and
+ // the edge can be addressed by adding a null check, so we prefer to
+ // leave the edge unsatisfied and let the null check happen.
+ result.unsatisfiedEdges.add(edge);
+ continue;
+ }
+ if (nonNullIntent.isDirect) {
+ // The node has direct non-null intent so we aren't in a position to
+ // mark it as nullable.
+ result.unsatisfiedEdges.add(edge);
+ continue;
+ }
+ }
if (node is NullabilityNodeMutable && !node.isNullable) {
assert(step.targetNode == null);
step.targetNode = node;
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 8e1285fa..4006512 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -1918,8 +1918,8 @@
class C<T> {
int Function(T) f;
}
-void main() {
- C<String> c;
+void main(dynamic d) {
+ C<String> c = d;
int Function(String) f1 = c.f; // should not have a nullable arg
c.f(null); // exact nullability induced here
}
@@ -1928,8 +1928,8 @@
class C<T> {
int Function(T)? f;
}
-void main() {
- C<String?> c;
+void main(dynamic d) {
+ C<String?> c = d;
int Function(String)? f1 = c.f; // should not have a nullable arg
c.f!(null); // exact nullability induced here
}
@@ -1945,8 +1945,8 @@
T Function(String) f;
}
int Function(String) f1; // should not have a nullable return
-void main() {
- C<int> c;
+void main(dynamic d) {
+ C<int> c = d;
c.f = f1;
c.f = (_) => null; // exact nullability induced here
}
@@ -1956,8 +1956,8 @@
T Function(String)? f;
}
int Function(String)? f1; // should not have a nullable return
-void main() {
- C<int?> c;
+void main(dynamic d) {
+ C<int?> c = d;
c.f = f1;
c.f = (_) => null; // exact nullability induced here
}
@@ -3071,6 +3071,28 @@
await _checkSingleFileChanges(content, expected);
}
+ Future<void> test_function_expression_return() async {
+ var content = '''
+void test({String foo}) async {
+ var f = () {
+ return "hello";
+ }
+
+ foo.length;
+}
+''';
+ var expected = '''
+void test({required String foo}) async {
+ var f = () {
+ return "hello";
+ }
+
+ foo.length;
+}
+''';
+ await _checkSingleFileChanges(content, expected);
+ }
+
Future<void> test_function_typed_field_formal_param() async {
var content = '''
class C {
@@ -4458,6 +4480,24 @@
{path2: file2, path1: file1}, {path1: expected1, path2: expected2});
}
+ Future<void> test_list_conditional_element() async {
+ var content = '''
+void bar(List<String> l) {}
+
+void test({String foo}) {
+ bar([if (foo != null) foo]);
+}
+''';
+ var expected = '''
+void bar(List<String> l) {}
+
+void test({String? foo}) {
+ bar([if (foo != null) foo]);
+}
+''';
+ await _checkSingleFileChanges(content, expected);
+ }
+
Future<void> test_literal_null_without_valid_migration() async {
var content = '''
void f(int/*!*/ x) {}
@@ -4551,6 +4591,28 @@
await _checkSingleFileChanges(content, expected);
}
+ Future<void> test_local_function_return() async {
+ var content = '''
+void test({String foo}) async {
+ String f() {
+ return "hello";
+ }
+
+ foo.length;
+}
+''';
+ var expected = '''
+void test({required String foo}) async {
+ String f() {
+ return "hello";
+ }
+
+ foo.length;
+}
+''';
+ await _checkSingleFileChanges(content, expected);
+ }
+
Future<void> test_localVariable_type_inferred() async {
var content = '''
int f() => null;
@@ -6800,7 +6862,7 @@
var expected = '''
typedef F = Function(int?);
-F _f;
+late F _f;
f() {
_f(null);
@@ -6865,7 +6927,7 @@
var expected = '''
typedef F = Function<T>(T);
-F _f;
+late F _f;
f() {
_f<int?>(null);
@@ -6887,7 +6949,7 @@
var expected = '''
typedef F<R> = Function<T>(T);
-F<Object> _f;
+late F<Object> _f;
f() {
_f<int?>(null);
@@ -6909,7 +6971,7 @@
var expected = '''
typedef F<T> = Function(T);
-F<int?> _f;
+late F<int?> _f;
f() {
_f(null);
@@ -6931,7 +6993,7 @@
var expected = '''
typedef F<T> = Function(T);
-F<int?> _f;
+late F<int?> _f;
f() {
_f(null);
@@ -6967,7 +7029,7 @@
var expected = '''
typedef F(int? x);
-F _f;
+late F _f;
f() {
_f(null);
@@ -7017,7 +7079,7 @@
var expected = '''
typedef F<T>(T t);
-F<int?> _f;
+late F<int?> _f;
f() {
_f(null);
@@ -7039,7 +7101,7 @@
var expected = '''
typedef F<T>(T t);
-F<int?> _f;
+late F<int?> _f;
f() {
_f(null);
diff --git a/pkg/nnbd_migration/tool/codegen/generate_resources.dart b/pkg/nnbd_migration/tool/codegen/generate_resources.dart
index 43c9356..8de7d12 100644
--- a/pkg/nnbd_migration/tool/codegen/generate_resources.dart
+++ b/pkg/nnbd_migration/tool/codegen/generate_resources.dart
@@ -12,12 +12,14 @@
import 'package:args/args.dart';
import 'package:crypto/crypto.dart';
+import 'package:meta/meta.dart';
import 'package:path/path.dart' as path;
void main(List<String> args) async {
var argParser = ArgParser()
..addFlag('verify', negatable: false)
..addFlag('dev', negatable: false)
+ ..addOption('dart2js_path')
..addFlag('help', negatable: false);
var argResults = argParser.parse(args);
if (argResults['help'] == true) {
@@ -44,7 +46,8 @@
if (verify) {
verifyResourcesGDartGenerated();
} else {
- await compileWebFrontEnd(devMode: dev);
+ await compileWebFrontEnd(
+ devMode: dev, dart2jsPath: dart2jsPath(argResults));
print('');
@@ -52,6 +55,17 @@
}
}
+/// Returns the dart2jsPath, either from [argResults] or the Platform.
+String dart2jsPath(ArgResults argResults) {
+ if (argResults.wasParsed('dart2js_path')) {
+ return argResults['dart2js_path'] as String;
+ } else {
+ var sdkBinDir = path.dirname(Platform.resolvedExecutable);
+ var dart2jsBinary = Platform.isWindows ? 'dart2js.bat' : 'dart2js';
+ return path.join(sdkBinDir, dart2jsBinary);
+ }
+}
+
final File dartSources = File(path.join('pkg', 'nnbd_migration', 'lib', 'src',
'front_end', 'web', 'migration.dart'));
@@ -88,11 +102,8 @@
return lines.join('\n');
}
-Future<void> compileWebFrontEnd({bool devMode = false}) async {
- var sdkBinDir = path.dirname(Platform.resolvedExecutable);
- var dart2jsBinary = Platform.isWindows ? 'dart2js.bat' : 'dart2js';
- var dart2jsPath = path.join(sdkBinDir, dart2jsBinary);
-
+Future<void> compileWebFrontEnd(
+ {@required bool devMode, @required String dart2jsPath}) async {
// dart2js -m -o output source
var process = await Process.start(dart2jsPath, [
devMode ? '-O1' : '-m',
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index b5c33f7..45d05d8 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -504,7 +504,7 @@
// invocation to the receiver class. A new allocated class discovered
// in the receiver cone will invalidate this invocation.
receiver = typeFlowAnalysis.hierarchyCache
- .specializeTypeCone((receiver as ConeType).cls);
+ .specializeTypeCone((receiver as ConeType).cls, allowWideCone: false);
}
assert(targets.isEmpty);
@@ -936,6 +936,11 @@
}
class _TFClassImpl extends TFClass {
+ /// Maximum number of concrete types to use when calculating
+ /// subtype cone specialization. If number of allocated types
+ /// exceeds this constant, then WideConeType approximation is used.
+ static const int maxAllocatedTypesInSetSpecializations = 128;
+
final Set<_TFClassImpl> supertypes; // List of super-types including this.
final Set<_TFClassImpl> _allocatedSubtypes = new Set<_TFClassImpl>();
final Map<Selector, Member> _dispatchTargets = <Selector, Member>{};
@@ -959,6 +964,15 @@
Type get specializedConeType =>
_specializedConeType ??= _calculateConeTypeSpecialization();
+ bool get hasWideCone =>
+ _allocatedSubtypes.length > maxAllocatedTypesInSetSpecializations;
+
+ WideConeType _wideConeType;
+ WideConeType get wideConeType {
+ assert(hasWideCone);
+ return _wideConeType ??= new WideConeType(this);
+ }
+
Type _calculateConeTypeSpecialization() {
final int numSubTypes = _allocatedSubtypes.length;
if (numSubTypes == 0) {
@@ -1154,21 +1168,23 @@
}
@override
- Type specializeTypeCone(TFClass baseClass) {
+ Type specializeTypeCone(TFClass baseClass, {bool allowWideCone = false}) {
if (kPrintTrace) {
tracePrint("specializeTypeCone for $baseClass");
}
Statistics.typeConeSpecializations++;
- // TODO(alexmarkov): consider approximating type if number of allocated
- // subtypes is too large
-
if (baseClass.classNode == coreTypes.objectClass) {
return const AnyType();
}
final _TFClassImpl cls = baseClass as _TFClassImpl;
+ if (allowWideCone && cls.hasWideCone) {
+ Statistics.typeSpecializationsUsedWideCone++;
+ return cls.wideConeType;
+ }
+
if (!_sealed) {
cls.dependencyTracker
.addDependentInvocation(_typeFlowAnalysis.currentInvocation);
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index b009b27..20ad897 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -23,6 +23,7 @@
abstract class Statement extends TypeExpr {
/// Index of this statement in the [Summary].
int index = -1;
+ Summary summary;
@override
Type getComputedType(List<Type> types) {
@@ -258,9 +259,11 @@
if (selector is! DirectSelector) {
_observeReceiverType(argTypes[0], typeHierarchy);
}
+ final Stopwatch timer = kPrintTimings ? (new Stopwatch()..start()) : null;
Type result = callHandler.applyCall(
this, selector, new Args<Type>(argTypes, names: args.names),
isResultUsed: isResultUsed);
+ summary.calleeTime += kPrintTimings ? timer.elapsedMicroseconds : 0;
if (isResultUsed) {
if (staticResultType != null) {
result = result.intersection(staticResultType, typeHierarchy);
@@ -586,6 +589,7 @@
/// Summary is a linear sequence of statements representing a type flow in
/// one member, function or initializer.
class Summary {
+ final String name;
int parameterCount;
int positionalParameterCount;
int requiredParameterCount;
@@ -594,7 +598,10 @@
TypeExpr result = null;
Type resultType = EmptyType();
- Summary(
+ // Analysis time of callees. Populated only if kPrintTimings.
+ int calleeTime;
+
+ Summary(this.name,
{this.parameterCount: 0,
this.positionalParameterCount: 0,
this.requiredParameterCount: 0});
@@ -603,6 +610,7 @@
Statement add(Statement op) {
op.index = _statements.length;
+ op.summary = this;
_statements.add(op);
return op;
}
@@ -621,6 +629,9 @@
/// Apply this summary to the given arguments and return the resulting type.
Type apply(Args<Type> arguments, TypeHierarchy typeHierarchy,
CallHandler callHandler) {
+ final Stopwatch timer = kPrintTimings ? (new Stopwatch()..start()) : null;
+ final int oldCalleeTime = calleeTime;
+ calleeTime = 0;
final args = arguments.values;
final positionalArgCount = arguments.positionalCount;
final namedArgCount = arguments.namedCount;
@@ -699,6 +710,16 @@
Type computedType = result.getComputedType(types);
resultType = resultType.union(computedType, typeHierarchy);
+
+ if (kPrintTimings) {
+ final dirtyTime = timer.elapsedMicroseconds;
+ final pureTime = dirtyTime < calleeTime ? 0 : (dirtyTime - calleeTime);
+ Statistics.numSummaryApplications.add(name);
+ Statistics.dirtySummaryAnalysisTime.add(name, dirtyTime);
+ Statistics.pureSummaryAnalysisTime.add(name, pureTime);
+ }
+ calleeTime = oldCalleeTime;
+
return computedType;
}
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 4a03d0f..789d1e1 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -596,8 +596,9 @@
Summary createSummary(Member member,
{fieldSummaryType: FieldSummaryType.kInitializer}) {
- debugPrint(
- "===== ${member}${fieldSummaryType == FieldSummaryType.kFieldGuard ? " (guard)" : ""} =====");
+ final String summaryName =
+ "${member}${fieldSummaryType == FieldSummaryType.kFieldGuard ? " (guard)" : ""}";
+ debugPrint("===== $summaryName =====");
assert(!member.isAbstract);
assert(!(member is Procedure && member.isRedirectingFactoryConstructor));
@@ -620,14 +621,14 @@
if (hasReceiver) {
final int numArgs =
fieldSummaryType == FieldSummaryType.kInitializer ? 1 : 2;
- _summary = new Summary(
+ _summary = new Summary(summaryName,
parameterCount: numArgs, positionalParameterCount: numArgs);
// TODO(alexmarkov): subclass cone
_receiver = _declareParameter("this",
_environment.coreTypes.legacyRawType(member.enclosingClass), null,
isReceiver: true);
} else {
- _summary = new Summary();
+ _summary = new Summary(summaryName);
}
_translator = new RuntimeTypeTranslatorImpl(
@@ -647,7 +648,7 @@
final numTypeParameters = numTypeParams(member);
final firstParamIndex = (hasReceiver ? 1 : 0) + numTypeParameters;
- _summary = new Summary(
+ _summary = new Summary(summaryName,
parameterCount: firstParamIndex +
function.positionalParameters.length +
function.namedParameters.length,
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index 4392865..c871bd0 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -129,8 +129,14 @@
bool isSubtype(Class sub, Class sup);
/// Return a more specific type for the type cone with [base] root.
- /// May return EmptyType, AnyType, ConcreteType or a SetType.
- Type specializeTypeCone(TFClass base);
+ /// May return EmptyType, AnyType, WideConeType, ConcreteType or a SetType.
+ /// WideConeType can be returned only if [allowWideCone].
+ ///
+ /// This method is used when calculating type flow throughout the program.
+ /// It is correct (although less accurate) for [specializeTypeCone] to return
+ /// a larger set. In such case analysis would admit that a larger set of
+ /// values can flow through the program.
+ Type specializeTypeCone(TFClass base, {bool allowWideCone = false});
Type _cachedIntType;
Type get intType {
@@ -184,9 +190,19 @@
Type specialize(TypeHierarchy typeHierarchy) => this;
/// Calculate union of this and [other] types.
+ ///
+ /// This method is used when calculating type flow throughout the program.
+ /// It is correct (although less accurate) for [union] to return
+ /// a larger set. In such case analysis would admit that a larger set of
+ /// values can flow through the program.
Type union(Type other, TypeHierarchy typeHierarchy);
/// Calculate intersection of this and [other] types.
+ ///
+ /// This method is used when calculating type flow throughout the program.
+ /// It is correct (although less accurate) for [intersection] to return
+ /// a larger set. In such case analysis would admit that a larger set of
+ /// values can flow through the program.
Type intersection(Type other, TypeHierarchy typeHierarchy);
}
@@ -197,6 +213,7 @@
Empty,
Nullable,
Any,
+ WideCone,
Set,
Cone,
Concrete,
@@ -502,7 +519,7 @@
: new SetType(_unionLists(types, <ConcreteType>[other]));
} else if (other is ConeType) {
return typeHierarchy
- .specializeTypeCone(other.cls)
+ .specializeTypeCone(other.cls, allowWideCone: true)
.union(this, typeHierarchy);
} else {
throw 'Unexpected type $other';
@@ -535,7 +552,7 @@
return EmptyType();
} else if (other is ConeType) {
return typeHierarchy
- .specializeTypeCone(other.cls)
+ .specializeTypeCone(other.cls, allowWideCone: true)
.intersection(this, typeHierarchy);
} else {
throw 'Unexpected type $other';
@@ -552,8 +569,9 @@
ConeType(this.cls);
@override
- Class getConcreteClass(TypeHierarchy typeHierarchy) =>
- typeHierarchy.specializeTypeCone(cls).getConcreteClass(typeHierarchy);
+ Class getConcreteClass(TypeHierarchy typeHierarchy) => typeHierarchy
+ .specializeTypeCone(cls, allowWideCone: true)
+ .getConcreteClass(typeHierarchy);
@override
bool isSubtypeOf(TypeHierarchy typeHierarchy, Class cls) =>
@@ -588,7 +606,7 @@
@override
Type specialize(TypeHierarchy typeHierarchy) =>
- typeHierarchy.specializeTypeCone(cls);
+ typeHierarchy.specializeTypeCone(cls, allowWideCone: true);
@override
Type union(Type other, TypeHierarchy typeHierarchy) {
@@ -611,7 +629,9 @@
return this;
}
}
- return typeHierarchy.specializeTypeCone(cls).union(other, typeHierarchy);
+ return typeHierarchy
+ .specializeTypeCone(cls, allowWideCone: true)
+ .union(other, typeHierarchy);
}
@override
@@ -638,11 +658,101 @@
}
}
return typeHierarchy
- .specializeTypeCone(cls)
+ .specializeTypeCone(cls, allowWideCone: true)
.intersection(other, typeHierarchy);
}
}
+/// Type representing a subtype cone which has too many concrete classes.
+/// It contains instances of all Dart types which extend, mix-in or implement
+/// certain class.
+class WideConeType extends ConeType {
+ WideConeType(TFClass cls) : super(cls);
+
+ @override
+ Class getConcreteClass(TypeHierarchy typeHierarchy) => null;
+
+ @override
+ int get hashCode => (cls.id + 41) & kHashMask;
+
+ @override
+ bool operator ==(other) =>
+ identical(this, other) ||
+ (other is WideConeType) && identical(this.cls, other.cls);
+
+ @override
+ int get order => TypeOrder.WideCone.index;
+
+ @override
+ bool get isSpecialized => true;
+
+ @override
+ Type specialize(TypeHierarchy typeHierarchy) => this;
+
+ @override
+ Type union(Type other, TypeHierarchy typeHierarchy) {
+ if (identical(this, other)) return this;
+ if (other.order < this.order) {
+ return other.union(this, typeHierarchy);
+ }
+ if (other is ConeType) {
+ if (typeHierarchy.isSubtype(other.cls.classNode, this.cls.classNode)) {
+ return this;
+ }
+ if (typeHierarchy.isSubtype(this.cls.classNode, other.cls.classNode)) {
+ return other;
+ }
+ } else if (other is ConcreteType) {
+ if (typeHierarchy.isSubtype(other.cls.classNode, this.cls.classNode)) {
+ return this;
+ }
+ if (typeHierarchy.isSubtype(this.cls.classNode, other.cls.classNode)) {
+ return ConeType(other.cls);
+ }
+ } else if (other is SetType) {
+ bool subtypes = true;
+ for (ConcreteType t in other.types) {
+ if (!typeHierarchy.isSubtype(t.cls.classNode, this.cls.classNode)) {
+ subtypes = false;
+ break;
+ }
+ }
+ if (subtypes) {
+ return this;
+ }
+ } else {
+ throw 'Unexpected type $other';
+ }
+ // Wider approximation.
+ return const AnyType();
+ }
+
+ @override
+ Type intersection(Type other, TypeHierarchy typeHierarchy) {
+ if (identical(this, other)) return this;
+ if (other.order < this.order) {
+ return other.intersection(this, typeHierarchy);
+ }
+ if (other is ConeType) {
+ if (typeHierarchy.isSubtype(other.cls.classNode, this.cls.classNode)) {
+ return other;
+ }
+ } else if (other is ConcreteType) {
+ if (typeHierarchy.isSubtype(other.cls.classNode, this.cls.classNode)) {
+ return other;
+ } else {
+ return const EmptyType();
+ }
+ } else if (other is SetType) {
+ return other;
+ } else {
+ throw 'Unexpected type $other';
+ }
+ // Wider approximation.
+ return this;
+ }
+}
+
/// Type representing a set of instances of a specific Dart class (no subtypes
/// or `null` object).
class ConcreteType extends Type implements Comparable<ConcreteType> {
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index 2502904..2762bd8 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -17,6 +17,9 @@
const bool kPrintDebug =
const bool.fromEnvironment('global.type.flow.print.debug');
+const bool kPrintTimings =
+ const bool.fromEnvironment('global.type.flow.print.timings');
+
const bool kPrintStats =
const bool.fromEnvironment('global.type.flow.print.stats');
@@ -123,6 +126,51 @@
.firstWhere((p) => p.name == name, orElse: () => null);
}
+class Histogram<K> {
+ final Map<K, int> values = <K, int>{};
+
+ void add(K key, [int addition = 1]) {
+ final v = values[key];
+ values[key] = (v ?? 0) + addition;
+ }
+
+ void printTop(String title, int n) {
+ print(
+ '-------------------------------------------------------------------');
+ print(title);
+ print(
+ '-------------------------------------------------------------------');
+ List<K> keys = values.keys.toList();
+ keys.sort((k1, k2) => values[k1].compareTo(values[k2]));
+ final cut = keys.length < n ? 0 : keys.length - n;
+ for (int i = keys.length - 1; i >= cut; --i) {
+ final k = keys[i];
+ print("${values[k].toString().padLeft(9)} $k");
+ }
+ print(
+ '-------------------------------------------------------------------');
+ }
+}
+
+class CommutativePair {
+ final dynamic v1;
+ final dynamic v2;
+
+ CommutativePair(this.v1, this.v2);
+
+ @override
+ bool operator ==(other) =>
+ other is CommutativePair &&
+ ((v1 == other.v1 && v2 == other.v2) ||
+ (v1 == other.v2 && v2 == other.v1));
+
+ @override
+ int get hashCode => v1.hashCode ^ v2.hashCode;
+
+ @override
+ String toString() => "<$v1, $v2>";
+}
+
/// Holds various statistic counters for type flow analysis.
class Statistics {
static int summariesCreated = 0;
@@ -134,6 +182,7 @@
static int maxInvalidationsPerInvocation = 0;
static int recursiveInvocationsApproximated = 0;
static int typeConeSpecializations = 0;
+ static int typeSpecializationsUsedWideCone = 0;
static int iterationsOverInvocationsWorkList = 0;
static int invocationsInvalidatedDuringProcessing = 0;
static int invocationsQueriedInCache = 0;
@@ -152,6 +201,9 @@
static int protobufMessagesUsed = 0;
static int protobufMetadataInitializersUpdated = 0;
static int protobufMetadataFieldsPruned = 0;
+ static Histogram<String> numSummaryApplications = Histogram<String>();
+ static Histogram<String> dirtySummaryAnalysisTime = Histogram<String>();
+ static Histogram<String> pureSummaryAnalysisTime = Histogram<String>();
/// Resets statistic counters.
static void reset() {
@@ -164,6 +216,7 @@
maxInvalidationsPerInvocation = 0;
recursiveInvocationsApproximated = 0;
typeConeSpecializations = 0;
+ typeSpecializationsUsedWideCone = 0;
iterationsOverInvocationsWorkList = 0;
invocationsInvalidatedDuringProcessing = 0;
invocationsQueriedInCache = 0;
@@ -182,9 +235,22 @@
protobufMessagesUsed = 0;
protobufMetadataInitializersUpdated = 0;
protobufMetadataFieldsPruned = 0;
+ numSummaryApplications = Histogram<String>();
+ dirtySummaryAnalysisTime = Histogram<String>();
+ pureSummaryAnalysisTime = Histogram<String>();
}
static void print(String caption) {
+ if (kPrintTimings) {
+ numSummaryApplications.printTop(
+ "Top summaries by number of times analyzed", 1000);
+ dirtySummaryAnalysisTime.printTop(
+ "Top summaries by dirty analysis time (including callees), in microseconds",
+ 1000);
+ pureSummaryAnalysisTime.printTop(
+ "Top summaries by pure analysis time (excluding callees), in microseconds",
+ 1000);
+ }
statPrint("""${caption}:
${summariesCreated} summaries created
${summariesAnalyzed} summaries analyzed
@@ -195,6 +261,7 @@
${maxInvalidationsPerInvocation} maximum invalidations per invocation
${recursiveInvocationsApproximated} recursive invocations approximated
${typeConeSpecializations} type cones specialized
+ ${typeSpecializationsUsedWideCone} type specializations used wide cone
${iterationsOverInvocationsWorkList} iterations over invocations work list
${invocationsInvalidatedDuringProcessing} invocations invalidated during processing
${invocationsQueriedInCache} invocations queried in cache
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 326ce81..dbdf093 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -25,7 +25,7 @@
}
@override
- Type specializeTypeCone(TFClass base) {
+ Type specializeTypeCone(TFClass base, {bool allowWideCone = false}) {
Type result = specializations[base.classNode];
expect(result, isNotNull,
reason: "specializeTypeCone($base) is not defined");
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 14bcf2c..31414a2 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,4 +1,6 @@
# Changelog
+## 6.0.0-nullsafety.1
+- Null safety migration, take two. Assume all object fields are nullable.
## 6.0.0-nullsafety-dev
- Migrate to use null safety.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 365cb7f..a0938bf 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -245,18 +245,18 @@
vms.AllocationProfile assertAllocationProfile(vms.AllocationProfile obj) {
assertNotNull(obj);
- assertListOfClassHeapStats(obj.members);
- assertMemoryUsage(obj.memoryUsage);
+ assertListOfClassHeapStats(obj.members!);
+ assertMemoryUsage(obj.memoryUsage!);
return obj;
}
vms.BoundField assertBoundField(vms.BoundField obj) {
assertNotNull(obj);
- assertFieldRef(obj.decl);
+ assertFieldRef(obj.decl!);
if (obj.value is vms.InstanceRef) {
- assertInstanceRef(obj.value);
+ assertInstanceRef(obj.value!);
} else if (obj.value is vms.Sentinel) {
- assertSentinel(obj.value);
+ assertSentinel(obj.value!);
} else {
throw "Unexpected value: ${obj.value}";
}
@@ -265,19 +265,19 @@
vms.BoundVariable assertBoundVariable(vms.BoundVariable obj) {
assertNotNull(obj);
- assertString(obj.name);
+ assertString(obj.name!);
if (obj.value is vms.InstanceRef) {
- assertInstanceRef(obj.value);
+ assertInstanceRef(obj.value!);
} else if (obj.value is vms.TypeArgumentsRef) {
- assertTypeArgumentsRef(obj.value);
+ assertTypeArgumentsRef(obj.value!);
} else if (obj.value is vms.Sentinel) {
- assertSentinel(obj.value);
+ assertSentinel(obj.value!);
} else {
throw "Unexpected value: ${obj.value}";
}
- assertInt(obj.declarationTokenPos);
- assertInt(obj.scopeStartTokenPos);
- assertInt(obj.scopeEndTokenPos);
+ assertInt(obj.declarationTokenPos!);
+ assertInt(obj.scopeStartTokenPos!);
+ assertInt(obj.scopeEndTokenPos!);
return obj;
}
@@ -291,13 +291,13 @@
vms.Breakpoint assertBreakpoint(vms.Breakpoint obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInt(obj.breakpointNumber);
- assertBool(obj.resolved);
+ assertString(obj.id!);
+ assertInt(obj.breakpointNumber!);
+ assertBool(obj.resolved!);
if (obj.location is vms.SourceLocation) {
- assertSourceLocation(obj.location);
+ assertSourceLocation(obj.location!);
} else if (obj.location is vms.UnresolvedSourceLocation) {
- assertUnresolvedSourceLocation(obj.location);
+ assertUnresolvedSourceLocation(obj.location!);
} else {
throw "Unexpected value: ${obj.location}";
}
@@ -313,8 +313,8 @@
vms.ClassRef assertClassRef(vms.ClassRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
+ assertString(obj.id!);
+ assertString(obj.name!);
return obj;
}
@@ -327,25 +327,25 @@
vms.Class assertClass(vms.Class obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertBool(obj.isAbstract);
- assertBool(obj.isConst);
- assertLibraryRef(obj.library);
- assertListOfInstanceRef(obj.interfaces);
- assertListOfFieldRef(obj.fields);
- assertListOfFuncRef(obj.functions);
- assertListOfClassRef(obj.subclasses);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertBool(obj.isAbstract!);
+ assertBool(obj.isConst!);
+ assertLibraryRef(obj.library!);
+ assertListOfInstanceRef(obj.interfaces!);
+ assertListOfFieldRef(obj.fields!);
+ assertListOfFuncRef(obj.functions!);
+ assertListOfClassRef(obj.subclasses!);
return obj;
}
vms.ClassHeapStats assertClassHeapStats(vms.ClassHeapStats obj) {
assertNotNull(obj);
- assertClassRef(obj.classRef);
- assertInt(obj.accumulatedSize);
- assertInt(obj.bytesCurrent);
- assertInt(obj.instancesAccumulated);
- assertInt(obj.instancesCurrent);
+ assertClassRef(obj.classRef!);
+ assertInt(obj.accumulatedSize!);
+ assertInt(obj.bytesCurrent!);
+ assertInt(obj.instancesAccumulated!);
+ assertInt(obj.instancesCurrent!);
return obj;
}
@@ -359,15 +359,15 @@
vms.ClassList assertClassList(vms.ClassList obj) {
assertNotNull(obj);
- assertListOfClassRef(obj.classes);
+ assertListOfClassRef(obj.classes!);
return obj;
}
vms.CodeRef assertCodeRef(vms.CodeRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertCodeKind(obj.kind);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertCodeKind(obj.kind!);
return obj;
}
@@ -380,16 +380,16 @@
vms.Code assertCode(vms.Code obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertCodeKind(obj.kind);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertCodeKind(obj.kind!);
return obj;
}
vms.ContextRef assertContextRef(vms.ContextRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInt(obj.length);
+ assertString(obj.id!);
+ assertInt(obj.length!);
return obj;
}
@@ -402,18 +402,18 @@
vms.Context assertContext(vms.Context obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInt(obj.length);
- assertListOfContextElement(obj.variables);
+ assertString(obj.id!);
+ assertInt(obj.length!);
+ assertListOfContextElement(obj.variables!);
return obj;
}
vms.ContextElement assertContextElement(vms.ContextElement obj) {
assertNotNull(obj);
if (obj.value is vms.InstanceRef) {
- assertInstanceRef(obj.value);
+ assertInstanceRef(obj.value!);
} else if (obj.value is vms.Sentinel) {
- assertSentinel(obj.value);
+ assertSentinel(obj.value!);
} else {
throw "Unexpected value: ${obj.value}";
}
@@ -430,23 +430,23 @@
vms.CpuSamples assertCpuSamples(vms.CpuSamples obj) {
assertNotNull(obj);
- assertInt(obj.samplePeriod);
- assertInt(obj.maxStackDepth);
- assertInt(obj.sampleCount);
- assertInt(obj.timeSpan);
- assertInt(obj.timeOriginMicros);
- assertInt(obj.timeExtentMicros);
- assertInt(obj.pid);
- assertListOfProfileFunction(obj.functions);
- assertListOfCpuSample(obj.samples);
+ assertInt(obj.samplePeriod!);
+ assertInt(obj.maxStackDepth!);
+ assertInt(obj.sampleCount!);
+ assertInt(obj.timeSpan!);
+ assertInt(obj.timeOriginMicros!);
+ assertInt(obj.timeExtentMicros!);
+ assertInt(obj.pid!);
+ assertListOfProfileFunction(obj.functions!);
+ assertListOfCpuSample(obj.samples!);
return obj;
}
vms.CpuSample assertCpuSample(vms.CpuSample obj) {
assertNotNull(obj);
- assertInt(obj.tid);
- assertInt(obj.timestamp);
- assertListOfInt(obj.stack);
+ assertInt(obj.tid!);
+ assertInt(obj.timestamp!);
+ assertListOfInt(obj.stack!);
return obj;
}
@@ -459,9 +459,9 @@
vms.ErrorRef assertErrorRef(vms.ErrorRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertErrorKind(obj.kind);
- assertString(obj.message);
+ assertString(obj.id!);
+ assertErrorKind(obj.kind!);
+ assertString(obj.message!);
return obj;
}
@@ -474,16 +474,16 @@
vms.Error assertError(vms.Error obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertErrorKind(obj.kind);
- assertString(obj.message);
+ assertString(obj.id!);
+ assertErrorKind(obj.kind!);
+ assertString(obj.message!);
return obj;
}
vms.Event assertEvent(vms.Event obj) {
assertNotNull(obj);
- assertEventKind(obj.kind);
- assertInt(obj.timestamp);
+ assertEventKind(obj.kind!);
+ assertInt(obj.timestamp!);
return obj;
}
@@ -494,13 +494,13 @@
vms.FieldRef assertFieldRef(vms.FieldRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertObjRef(obj.owner);
- assertInstanceRef(obj.declaredType);
- assertBool(obj.isConst);
- assertBool(obj.isFinal);
- assertBool(obj.isStatic);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertObjRef(obj.owner!);
+ assertInstanceRef(obj.declaredType!);
+ assertBool(obj.isConst!);
+ assertBool(obj.isFinal!);
+ assertBool(obj.isStatic!);
return obj;
}
@@ -513,21 +513,21 @@
vms.Field assertField(vms.Field obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertObjRef(obj.owner);
- assertInstanceRef(obj.declaredType);
- assertBool(obj.isConst);
- assertBool(obj.isFinal);
- assertBool(obj.isStatic);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertObjRef(obj.owner!);
+ assertInstanceRef(obj.declaredType!);
+ assertBool(obj.isConst!);
+ assertBool(obj.isFinal!);
+ assertBool(obj.isStatic!);
return obj;
}
vms.Flag assertFlag(vms.Flag obj) {
assertNotNull(obj);
- assertString(obj.name);
- assertString(obj.comment);
- assertBool(obj.modified);
+ assertString(obj.name!);
+ assertString(obj.comment!);
+ assertBool(obj.modified!);
return obj;
}
@@ -540,13 +540,13 @@
vms.FlagList assertFlagList(vms.FlagList obj) {
assertNotNull(obj);
- assertListOfFlag(obj.flags);
+ assertListOfFlag(obj.flags!);
return obj;
}
vms.Frame assertFrame(vms.Frame obj) {
assertNotNull(obj);
- assertInt(obj.index);
+ assertInt(obj.index!);
return obj;
}
@@ -559,19 +559,19 @@
vms.FuncRef assertFuncRef(vms.FuncRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
+ assertString(obj.id!);
+ assertString(obj.name!);
if (obj.owner is vms.LibraryRef) {
- assertLibraryRef(obj.owner);
+ assertLibraryRef(obj.owner!);
} else if (obj.owner is vms.ClassRef) {
- assertClassRef(obj.owner);
+ assertClassRef(obj.owner!);
} else if (obj.owner is vms.FuncRef) {
- assertFuncRef(obj.owner);
+ assertFuncRef(obj.owner!);
} else {
throw "Unexpected value: ${obj.owner}";
}
- assertBool(obj.isStatic);
- assertBool(obj.isConst);
+ assertBool(obj.isStatic!);
+ assertBool(obj.isConst!);
return obj;
}
@@ -584,27 +584,27 @@
vms.Func assertFunc(vms.Func obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
+ assertString(obj.id!);
+ assertString(obj.name!);
if (obj.owner is vms.LibraryRef) {
- assertLibraryRef(obj.owner);
+ assertLibraryRef(obj.owner!);
} else if (obj.owner is vms.ClassRef) {
- assertClassRef(obj.owner);
+ assertClassRef(obj.owner!);
} else if (obj.owner is vms.FuncRef) {
- assertFuncRef(obj.owner);
+ assertFuncRef(obj.owner!);
} else {
throw "Unexpected value: ${obj.owner}";
}
- assertBool(obj.isStatic);
- assertBool(obj.isConst);
+ assertBool(obj.isStatic!);
+ assertBool(obj.isConst!);
return obj;
}
vms.InstanceRef assertInstanceRef(vms.InstanceRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInstanceKind(obj.kind);
- assertClassRef(obj.classRef);
+ assertString(obj.id!);
+ assertInstanceKind(obj.kind!);
+ assertClassRef(obj.classRef!);
return obj;
}
@@ -617,18 +617,18 @@
vms.Instance assertInstance(vms.Instance obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInstanceKind(obj.kind);
- assertClassRef(obj.classRef);
+ assertString(obj.id!);
+ assertInstanceKind(obj.kind!);
+ assertClassRef(obj.classRef!);
return obj;
}
vms.IsolateRef assertIsolateRef(vms.IsolateRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.number);
- assertString(obj.name);
- assertBool(obj.isSystemIsolate);
+ assertString(obj.id!);
+ assertString(obj.number!);
+ assertString(obj.name!);
+ assertBool(obj.isSystemIsolate!);
return obj;
}
@@ -641,35 +641,35 @@
vms.Isolate assertIsolate(vms.Isolate obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.number);
- assertString(obj.name);
- assertBool(obj.isSystemIsolate);
- assertListOfIsolateFlag(obj.isolateFlags);
- assertInt(obj.startTime);
- assertBool(obj.runnable);
- assertInt(obj.livePorts);
- assertBool(obj.pauseOnExit);
- assertEvent(obj.pauseEvent);
- assertListOfLibraryRef(obj.libraries);
- assertListOfBreakpoint(obj.breakpoints);
- assertExceptionPauseMode(obj.exceptionPauseMode);
+ assertString(obj.id!);
+ assertString(obj.number!);
+ assertString(obj.name!);
+ assertBool(obj.isSystemIsolate!);
+ assertListOfIsolateFlag(obj.isolateFlags!);
+ assertInt(obj.startTime!);
+ assertBool(obj.runnable!);
+ assertInt(obj.livePorts!);
+ assertBool(obj.pauseOnExit!);
+ assertEvent(obj.pauseEvent!);
+ assertListOfLibraryRef(obj.libraries!);
+ assertListOfBreakpoint(obj.breakpoints!);
+ assertExceptionPauseMode(obj.exceptionPauseMode!);
return obj;
}
vms.IsolateFlag assertIsolateFlag(vms.IsolateFlag obj) {
assertNotNull(obj);
- assertString(obj.name);
- assertString(obj.valueAsString);
+ assertString(obj.name!);
+ assertString(obj.valueAsString!);
return obj;
}
vms.IsolateGroupRef assertIsolateGroupRef(vms.IsolateGroupRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.number);
- assertString(obj.name);
- assertBool(obj.isSystemIsolateGroup);
+ assertString(obj.id!);
+ assertString(obj.number!);
+ assertString(obj.name!);
+ assertBool(obj.isSystemIsolateGroup!);
return obj;
}
@@ -683,23 +683,23 @@
vms.IsolateGroup assertIsolateGroup(vms.IsolateGroup obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.number);
- assertString(obj.name);
- assertBool(obj.isSystemIsolateGroup);
- assertListOfIsolateRef(obj.isolates);
+ assertString(obj.id!);
+ assertString(obj.number!);
+ assertString(obj.name!);
+ assertBool(obj.isSystemIsolateGroup!);
+ assertListOfIsolateRef(obj.isolates!);
return obj;
}
vms.InboundReferences assertInboundReferences(vms.InboundReferences obj) {
assertNotNull(obj);
- assertListOfInboundReference(obj.references);
+ assertListOfInboundReference(obj.references!);
return obj;
}
vms.InboundReference assertInboundReference(vms.InboundReference obj) {
assertNotNull(obj);
- assertObjRef(obj.source);
+ assertObjRef(obj.source!);
return obj;
}
@@ -713,16 +713,16 @@
vms.InstanceSet assertInstanceSet(vms.InstanceSet obj) {
assertNotNull(obj);
- assertInt(obj.totalCount);
- assertListOfObjRef(obj.instances);
+ assertInt(obj.totalCount!);
+ assertListOfObjRef(obj.instances!);
return obj;
}
vms.LibraryRef assertLibraryRef(vms.LibraryRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertString(obj.uri);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertString(obj.uri!);
return obj;
}
@@ -735,24 +735,24 @@
vms.Library assertLibrary(vms.Library obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertString(obj.uri);
- assertBool(obj.debuggable);
- assertListOfLibraryDependency(obj.dependencies);
- assertListOfScriptRef(obj.scripts);
- assertListOfFieldRef(obj.variables);
- assertListOfFuncRef(obj.functions);
- assertListOfClassRef(obj.classes);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertString(obj.uri!);
+ assertBool(obj.debuggable!);
+ assertListOfLibraryDependency(obj.dependencies!);
+ assertListOfScriptRef(obj.scripts!);
+ assertListOfFieldRef(obj.variables!);
+ assertListOfFuncRef(obj.functions!);
+ assertListOfClassRef(obj.classes!);
return obj;
}
vms.LibraryDependency assertLibraryDependency(vms.LibraryDependency obj) {
assertNotNull(obj);
- assertBool(obj.isImport);
- assertBool(obj.isDeferred);
- assertString(obj.prefix);
- assertLibraryRef(obj.target);
+ assertBool(obj.isImport!);
+ assertBool(obj.isDeferred!);
+ assertString(obj.prefix!);
+ assertLibraryRef(obj.target!);
return obj;
}
@@ -766,30 +766,30 @@
vms.LogRecord assertLogRecord(vms.LogRecord obj) {
assertNotNull(obj);
- assertInstanceRef(obj.message);
- assertInt(obj.time);
- assertInt(obj.level);
- assertInt(obj.sequenceNumber);
- assertInstanceRef(obj.loggerName);
- assertInstanceRef(obj.zone);
- assertInstanceRef(obj.error);
- assertInstanceRef(obj.stackTrace);
+ assertInstanceRef(obj.message!);
+ assertInt(obj.time!);
+ assertInt(obj.level!);
+ assertInt(obj.sequenceNumber!);
+ assertInstanceRef(obj.loggerName!);
+ assertInstanceRef(obj.zone!);
+ assertInstanceRef(obj.error!);
+ assertInstanceRef(obj.stackTrace!);
return obj;
}
vms.MapAssociation assertMapAssociation(vms.MapAssociation obj) {
assertNotNull(obj);
if (obj.key is vms.InstanceRef) {
- assertInstanceRef(obj.key);
+ assertInstanceRef(obj.key!);
} else if (obj.key is vms.Sentinel) {
- assertSentinel(obj.key);
+ assertSentinel(obj.key!);
} else {
throw "Unexpected value: ${obj.key}";
}
if (obj.value is vms.InstanceRef) {
- assertInstanceRef(obj.value);
+ assertInstanceRef(obj.value!);
} else if (obj.value is vms.Sentinel) {
- assertSentinel(obj.value);
+ assertSentinel(obj.value!);
} else {
throw "Unexpected value: ${obj.value}";
}
@@ -798,18 +798,18 @@
vms.MemoryUsage assertMemoryUsage(vms.MemoryUsage obj) {
assertNotNull(obj);
- assertInt(obj.externalUsage);
- assertInt(obj.heapCapacity);
- assertInt(obj.heapUsage);
+ assertInt(obj.externalUsage!);
+ assertInt(obj.heapCapacity!);
+ assertInt(obj.heapUsage!);
return obj;
}
vms.Message assertMessage(vms.Message obj) {
assertNotNull(obj);
- assertInt(obj.index);
- assertString(obj.name);
- assertString(obj.messageObjectId);
- assertInt(obj.size);
+ assertInt(obj.index!);
+ assertString(obj.name!);
+ assertString(obj.messageObjectId!);
+ assertInt(obj.size!);
return obj;
}
@@ -822,16 +822,16 @@
vms.NativeFunction assertNativeFunction(vms.NativeFunction obj) {
assertNotNull(obj);
- assertString(obj.name);
+ assertString(obj.name!);
return obj;
}
vms.NullValRef assertNullValRef(vms.NullValRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInstanceKind(obj.kind);
- assertClassRef(obj.classRef);
- assertString(obj.valueAsString);
+ assertString(obj.id!);
+ assertInstanceKind(obj.kind!);
+ assertClassRef(obj.classRef!);
+ assertString(obj.valueAsString!);
return obj;
}
@@ -844,16 +844,16 @@
vms.NullVal assertNullVal(vms.NullVal obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertInstanceKind(obj.kind);
- assertClassRef(obj.classRef);
- assertString(obj.valueAsString);
+ assertString(obj.id!);
+ assertInstanceKind(obj.kind!);
+ assertClassRef(obj.classRef!);
+ assertString(obj.valueAsString!);
return obj;
}
vms.ObjRef assertObjRef(vms.ObjRef obj) {
assertNotNull(obj);
- assertString(obj.id);
+ assertString(obj.id!);
return obj;
}
@@ -866,23 +866,23 @@
vms.Obj assertObj(vms.Obj obj) {
assertNotNull(obj);
- assertString(obj.id);
+ assertString(obj.id!);
return obj;
}
vms.PortList assertPortList(vms.PortList obj) {
assertNotNull(obj);
- assertListOfInstanceRef(obj.ports);
+ assertListOfInstanceRef(obj.ports!);
return obj;
}
vms.ProfileFunction assertProfileFunction(vms.ProfileFunction obj) {
assertNotNull(obj);
- assertString(obj.kind);
- assertInt(obj.inclusiveTicks);
- assertInt(obj.exclusiveTicks);
- assertString(obj.resolvedUrl);
- assertDynamic(obj.function);
+ assertString(obj.kind!);
+ assertInt(obj.inclusiveTicks!);
+ assertInt(obj.exclusiveTicks!);
+ assertString(obj.resolvedUrl!);
+ assertDynamic(obj.function!);
return obj;
}
@@ -896,15 +896,15 @@
vms.ProtocolList assertProtocolList(vms.ProtocolList obj) {
assertNotNull(obj);
- assertListOfProtocol(obj.protocols);
+ assertListOfProtocol(obj.protocols!);
return obj;
}
vms.Protocol assertProtocol(vms.Protocol obj) {
assertNotNull(obj);
- assertString(obj.protocolName);
- assertInt(obj.major);
- assertInt(obj.minor);
+ assertString(obj.protocolName!);
+ assertInt(obj.major!);
+ assertInt(obj.minor!);
return obj;
}
@@ -917,16 +917,16 @@
vms.ProcessMemoryUsage assertProcessMemoryUsage(vms.ProcessMemoryUsage obj) {
assertNotNull(obj);
- assertProcessMemoryItem(obj.root);
+ assertProcessMemoryItem(obj.root!);
return obj;
}
vms.ProcessMemoryItem assertProcessMemoryItem(vms.ProcessMemoryItem obj) {
assertNotNull(obj);
- assertString(obj.name);
- assertString(obj.description);
- assertInt(obj.size);
- assertListOfProcessMemoryItem(obj.children);
+ assertString(obj.name!);
+ assertString(obj.description!);
+ assertInt(obj.size!);
+ assertListOfProcessMemoryItem(obj.children!);
return obj;
}
@@ -940,13 +940,13 @@
vms.ReloadReport assertReloadReport(vms.ReloadReport obj) {
assertNotNull(obj);
- assertBool(obj.success);
+ assertBool(obj.success!);
return obj;
}
vms.RetainingObject assertRetainingObject(vms.RetainingObject obj) {
assertNotNull(obj);
- assertObjRef(obj.value);
+ assertObjRef(obj.value!);
return obj;
}
@@ -960,9 +960,9 @@
vms.RetainingPath assertRetainingPath(vms.RetainingPath obj) {
assertNotNull(obj);
- assertInt(obj.length);
- assertString(obj.gcRootType);
- assertListOfRetainingObject(obj.elements);
+ assertInt(obj.length!);
+ assertString(obj.gcRootType!);
+ assertListOfRetainingObject(obj.elements!);
return obj;
}
@@ -973,15 +973,15 @@
vms.Sentinel assertSentinel(vms.Sentinel obj) {
assertNotNull(obj);
- assertSentinelKind(obj.kind);
- assertString(obj.valueAsString);
+ assertSentinelKind(obj.kind!);
+ assertString(obj.valueAsString!);
return obj;
}
vms.ScriptRef assertScriptRef(vms.ScriptRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.uri);
+ assertString(obj.id!);
+ assertString(obj.uri!);
return obj;
}
@@ -994,46 +994,46 @@
vms.Script assertScript(vms.Script obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.uri);
- assertLibraryRef(obj.library);
+ assertString(obj.id!);
+ assertString(obj.uri!);
+ assertLibraryRef(obj.library!);
return obj;
}
vms.ScriptList assertScriptList(vms.ScriptList obj) {
assertNotNull(obj);
- assertListOfScriptRef(obj.scripts);
+ assertListOfScriptRef(obj.scripts!);
return obj;
}
vms.SourceLocation assertSourceLocation(vms.SourceLocation obj) {
assertNotNull(obj);
- assertScriptRef(obj.script);
- assertInt(obj.tokenPos);
+ assertScriptRef(obj.script!);
+ assertInt(obj.tokenPos!);
return obj;
}
vms.SourceReport assertSourceReport(vms.SourceReport obj) {
assertNotNull(obj);
- assertListOfSourceReportRange(obj.ranges);
- assertListOfScriptRef(obj.scripts);
+ assertListOfSourceReportRange(obj.ranges!);
+ assertListOfScriptRef(obj.scripts!);
return obj;
}
vms.SourceReportCoverage assertSourceReportCoverage(
vms.SourceReportCoverage obj) {
assertNotNull(obj);
- assertListOfInt(obj.hits);
- assertListOfInt(obj.misses);
+ assertListOfInt(obj.hits!);
+ assertListOfInt(obj.misses!);
return obj;
}
vms.SourceReportRange assertSourceReportRange(vms.SourceReportRange obj) {
assertNotNull(obj);
- assertInt(obj.scriptIndex);
- assertInt(obj.startPos);
- assertInt(obj.endPos);
- assertBool(obj.compiled);
+ assertInt(obj.scriptIndex!);
+ assertInt(obj.startPos!);
+ assertInt(obj.endPos!);
+ assertBool(obj.compiled!);
return obj;
}
@@ -1047,17 +1047,17 @@
vms.Stack assertStack(vms.Stack obj) {
assertNotNull(obj);
- assertListOfFrame(obj.frames);
- assertListOfMessage(obj.messages);
- assertBool(obj.truncated);
+ assertListOfFrame(obj.frames!);
+ assertListOfMessage(obj.messages!);
+ assertBool(obj.truncated!);
return obj;
}
vms.Timeline assertTimeline(vms.Timeline obj) {
assertNotNull(obj);
- assertListOfTimelineEvent(obj.traceEvents);
- assertInt(obj.timeOriginMicros);
- assertInt(obj.timeExtentMicros);
+ assertListOfTimelineEvent(obj.traceEvents!);
+ assertInt(obj.timeOriginMicros!);
+ assertInt(obj.timeExtentMicros!);
return obj;
}
@@ -1076,22 +1076,22 @@
vms.TimelineFlags assertTimelineFlags(vms.TimelineFlags obj) {
assertNotNull(obj);
- assertString(obj.recorderName);
- assertListOfString(obj.availableStreams);
- assertListOfString(obj.recordedStreams);
+ assertString(obj.recorderName!);
+ assertListOfString(obj.availableStreams!);
+ assertListOfString(obj.recordedStreams!);
return obj;
}
vms.Timestamp assertTimestamp(vms.Timestamp obj) {
assertNotNull(obj);
- assertInt(obj.timestamp);
+ assertInt(obj.timestamp!);
return obj;
}
vms.TypeArgumentsRef assertTypeArgumentsRef(vms.TypeArgumentsRef obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
+ assertString(obj.id!);
+ assertString(obj.name!);
return obj;
}
@@ -1105,9 +1105,9 @@
vms.TypeArguments assertTypeArguments(vms.TypeArguments obj) {
assertNotNull(obj);
- assertString(obj.id);
- assertString(obj.name);
- assertListOfInstanceRef(obj.types);
+ assertString(obj.id!);
+ assertString(obj.name!);
+ assertListOfInstanceRef(obj.types!);
return obj;
}
@@ -1119,14 +1119,14 @@
vms.Version assertVersion(vms.Version obj) {
assertNotNull(obj);
- assertInt(obj.major);
- assertInt(obj.minor);
+ assertInt(obj.major!);
+ assertInt(obj.minor!);
return obj;
}
vms.VMRef assertVMRef(vms.VMRef obj) {
assertNotNull(obj);
- assertString(obj.name);
+ assertString(obj.name!);
return obj;
}
@@ -1139,17 +1139,17 @@
vms.VM assertVM(vms.VM obj) {
assertNotNull(obj);
- assertString(obj.name);
- assertInt(obj.architectureBits);
- assertString(obj.hostCPU);
- assertString(obj.operatingSystem);
- assertString(obj.targetCPU);
- assertString(obj.version);
- assertInt(obj.pid);
- assertInt(obj.startTime);
- assertListOfIsolateRef(obj.isolates);
- assertListOfIsolateGroupRef(obj.isolateGroups);
- assertListOfIsolateRef(obj.systemIsolates);
- assertListOfIsolateGroupRef(obj.systemIsolateGroups);
+ assertString(obj.name!);
+ assertInt(obj.architectureBits!);
+ assertString(obj.hostCPU!);
+ assertString(obj.operatingSystem!);
+ assertString(obj.targetCPU!);
+ assertString(obj.version!);
+ assertInt(obj.pid!);
+ assertInt(obj.startTime!);
+ assertListOfIsolateRef(obj.isolates!);
+ assertListOfIsolateGroupRef(obj.isolateGroups!);
+ assertListOfIsolateRef(obj.systemIsolates!);
+ assertListOfIsolateGroupRef(obj.systemIsolateGroups!);
return obj;
}
diff --git a/pkg/vm_service/example/vm_service_tester.dart b/pkg/vm_service/example/vm_service_tester.dart
index e22d5fc..2406111 100644
--- a/pkg/vm_service/example/vm_service_tester.dart
+++ b/pkg/vm_service/example/vm_service_tester.dart
@@ -112,7 +112,7 @@
VM vm = await serviceClient.getVM();
print('hostCPU=${vm.hostCPU}');
print(await serviceClient.getVersion());
- List<IsolateRef> isolates = await vm.isolates;
+ List<IsolateRef> isolates = await vm.isolates!;
print(isolates);
// Disable the json reserialization checks since custom services are not
@@ -121,11 +121,11 @@
await testServiceRegistration();
checkResponseJsonCompatibility = true;
- await testScriptParse(vm.isolates.first);
- await testSourceReport(vm.isolates.first);
+ await testScriptParse(vm.isolates!.first);
+ await testSourceReport(vm.isolates!.first);
IsolateRef isolateRef = isolates.first;
- print(await serviceClient.resume(isolateRef.id));
+ print(await serviceClient.resume(isolateRef.id!));
print('waiting for client to shut down...');
await serviceClient.dispose();
@@ -183,13 +183,14 @@
}
Future testScriptParse(IsolateRef isolateRef) async {
- final Isolate isolate = await serviceClient.getIsolate(isolateRef.id);
- final Library rootLibrary = await serviceClient.getObject(
- isolateRef.id, isolate.rootLib!.id) as Library;
- final ScriptRef scriptRef = rootLibrary.scripts.first;
+ final isolateId = isolateRef.id!;
+ final Isolate isolate = await serviceClient.getIsolate(isolateId);
+ final Library rootLibrary =
+ await serviceClient.getObject(isolateId, isolate.rootLib!.id!) as Library;
+ final ScriptRef scriptRef = rootLibrary.scripts!.first;
final Script script =
- await serviceClient.getObject(isolateRef.id, scriptRef.id) as Script;
+ await serviceClient.getObject(isolateId, scriptRef.id!) as Script;
print(script);
print(script.uri);
print(script.library);
@@ -198,19 +199,20 @@
}
Future testSourceReport(IsolateRef isolateRef) async {
- final Isolate isolate = await serviceClient.getIsolate(isolateRef.id);
- final Library rootLibrary = await serviceClient.getObject(
- isolateRef.id, isolate.rootLib!.id) as Library;
- final ScriptRef scriptRef = rootLibrary.scripts.first;
+ final isolateId = isolateRef.id!;
+ final Isolate isolate = await serviceClient.getIsolate(isolateId);
+ final Library rootLibrary =
+ await serviceClient.getObject(isolateId, isolate.rootLib!.id!) as Library;
+ final ScriptRef scriptRef = rootLibrary.scripts!.first;
// make sure some code has run
- await serviceClient.resume(isolateRef.id);
+ await serviceClient.resume(isolateId);
await Future.delayed(const Duration(milliseconds: 25));
final SourceReport sourceReport = await serviceClient.getSourceReport(
- isolateRef.id, [SourceReportKind.kCoverage],
+ isolateId, [SourceReportKind.kCoverage],
scriptId: scriptRef.id);
- for (SourceReportRange range in sourceReport.ranges) {
+ for (SourceReportRange range in sourceReport.ranges!) {
print(' $range');
if (range.coverage != null) {
print(' ${range.coverage}');
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index acbca2d..7ab74eb 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -95,7 +95,7 @@
final version = await _version(isolateId);
// Parameter name changed in version 1.4.
final enableKey =
- ((version.major == 1 && version.minor > 3) || version.major >= 2)
+ ((version.major! == 1 && version.minor! > 3) || version.major! >= 2)
? 'enabled'
: 'enable';
return _callHelper('ext.dart.io.httpEnableTimelineLogging', isolateId,
diff --git a/pkg/vm_service/lib/src/snapshot_graph.dart b/pkg/vm_service/lib/src/snapshot_graph.dart
index e237dd7..7e93eed 100644
--- a/pkg/vm_service/lib/src/snapshot_graph.dart
+++ b/pkg/vm_service/lib/src/snapshot_graph.dart
@@ -270,7 +270,7 @@
}
});
- await service.requestHeapSnapshot(isolate.id);
+ await service.requestHeapSnapshot(isolate.id!);
return completer.future;
}
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 12d1b61..031eb06 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -2538,22 +2538,22 @@
json == null ? null : AllocationProfile._fromJson(json);
/// Allocation information for all class types.
- late final List<ClassHeapStats> members;
+ List<ClassHeapStats>? members;
/// Information about memory usage for the isolate.
- late final MemoryUsage memoryUsage;
+ MemoryUsage? memoryUsage;
/// The timestamp of the last accumulator reset.
///
/// If the accumulators have not been reset, this field is not present.
@optional
- late final int? dateLastAccumulatorReset;
+ int? dateLastAccumulatorReset;
/// The timestamp of the last manually triggered GC.
///
/// If a GC has not been triggered manually, this field is not present.
@optional
- late final int? dateLastServiceGC;
+ int? dateLastServiceGC;
AllocationProfile({
required this.members,
@@ -2587,8 +2587,8 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'members': members.map((f) => f.toJson()).toList(),
- 'memoryUsage': memoryUsage.toJson(),
+ 'members': members?.map((f) => f.toJson()).toList(),
+ 'memoryUsage': memoryUsage?.toJson(),
});
_setIfNotNull(json, 'dateLastAccumulatorReset', dateLastAccumulatorReset);
_setIfNotNull(json, 'dateLastServiceGC', dateLastServiceGC);
@@ -2611,10 +2611,10 @@
static BoundField? parse(Map<String, dynamic>? json) =>
json == null ? null : BoundField._fromJson(json);
- late final FieldRef decl;
+ FieldRef? decl;
/// [value] can be one of [InstanceRef] or [Sentinel].
- late final dynamic value;
+ dynamic? value;
BoundField({
required this.decl,
@@ -2631,8 +2631,8 @@
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json.addAll({
- 'decl': decl.toJson(),
- 'value': value.toJson(),
+ 'decl': decl?.toJson(),
+ 'value': value?.toJson(),
});
return json;
}
@@ -2655,19 +2655,19 @@
static BoundVariable? parse(Map<String, dynamic>? json) =>
json == null ? null : BoundVariable._fromJson(json);
- late final String name;
+ String? name;
/// [value] can be one of [InstanceRef], [TypeArgumentsRef] or [Sentinel].
- late final dynamic value;
+ dynamic? value;
/// The token position where this variable was declared.
- late final int declarationTokenPos;
+ int? declarationTokenPos;
/// The first token position where this variable is visible to the scope.
- late final int scopeStartTokenPos;
+ int? scopeStartTokenPos;
/// The last token position where this variable is visible to the scope.
- late final int scopeEndTokenPos;
+ int? scopeEndTokenPos;
BoundVariable({
required this.name,
@@ -2695,7 +2695,7 @@
json['type'] = type;
json.addAll({
'name': name,
- 'value': value.toJson(),
+ 'value': value?.toJson(),
'declarationTokenPos': declarationTokenPos,
'scopeStartTokenPos': scopeStartTokenPos,
'scopeEndTokenPos': scopeEndTokenPos,
@@ -2719,21 +2719,21 @@
json == null ? null : Breakpoint._fromJson(json);
/// A number identifying this breakpoint to the user.
- late final int breakpointNumber;
+ int? breakpointNumber;
/// Has this breakpoint been assigned to a specific program location?
- late final bool resolved;
+ bool? resolved;
/// Is this a breakpoint that was added synthetically as part of a step
/// OverAsyncSuspension resume command?
@optional
- late final bool? isSyntheticAsyncContinuation;
+ bool? isSyntheticAsyncContinuation;
/// SourceLocation when breakpoint is resolved, UnresolvedSourceLocation when
/// a breakpoint is not resolved.
///
/// [location] can be one of [SourceLocation] or [UnresolvedSourceLocation].
- late final dynamic location;
+ dynamic? location;
Breakpoint({
required this.breakpointNumber,
@@ -2763,7 +2763,7 @@
json.addAll({
'breakpointNumber': breakpointNumber,
'resolved': resolved,
- 'location': location.toJson(),
+ 'location': location?.toJson(),
});
_setIfNotNull(
json, 'isSyntheticAsyncContinuation', isSyntheticAsyncContinuation);
@@ -2785,7 +2785,7 @@
json == null ? null : ClassRef._fromJson(json);
/// The name of this class.
- late final String name;
+ String? name;
ClassRef({
required this.name,
@@ -2824,55 +2824,55 @@
json == null ? null : Class._fromJson(json);
/// The name of this class.
- late final String name;
+ String? name;
/// The error which occurred during class finalization, if it exists.
@optional
- late final ErrorRef? error;
+ ErrorRef? error;
/// Is this an abstract class?
- late final bool isAbstract;
+ bool? isAbstract;
/// Is this a const class?
- late final bool isConst;
+ bool? isConst;
/// The library which contains this class.
- late final LibraryRef library;
+ LibraryRef? library;
/// The location of this class in the source code.
@optional
- late final SourceLocation? location;
+ SourceLocation? location;
/// The superclass of this class, if any.
@optional
- late final ClassRef? superClass;
+ ClassRef? superClass;
/// The supertype for this class, if any.
///
/// The value will be of the kind: Type.
@optional
- late final InstanceRef? superType;
+ InstanceRef? superType;
/// A list of interface types for this class.
///
/// The values will be of the kind: Type.
- late final List<InstanceRef> interfaces;
+ List<InstanceRef>? interfaces;
/// The mixin type for this class, if any.
///
/// The value will be of the kind: Type.
@optional
- late final InstanceRef? mixin;
+ InstanceRef? mixin;
/// A list of fields in this class. Does not include fields from superclasses.
- late final List<FieldRef> fields;
+ List<FieldRef>? fields;
/// A list of functions in this class. Does not include functions from
/// superclasses.
- late final List<FuncRef> functions;
+ List<FuncRef>? functions;
/// A list of subclasses of this class.
- late final List<ClassRef> subclasses;
+ List<ClassRef>? subclasses;
Class({
required this.name,
@@ -2933,11 +2933,11 @@
'name': name,
'abstract': isAbstract,
'const': isConst,
- 'library': library.toJson(),
- 'interfaces': interfaces.map((f) => f.toJson()).toList(),
- 'fields': fields.map((f) => f.toJson()).toList(),
- 'functions': functions.map((f) => f.toJson()).toList(),
- 'subclasses': subclasses.map((f) => f.toJson()).toList(),
+ 'library': library?.toJson(),
+ 'interfaces': interfaces?.map((f) => f.toJson()).toList(),
+ 'fields': fields?.map((f) => f.toJson()).toList(),
+ 'functions': functions?.map((f) => f.toJson()).toList(),
+ 'subclasses': subclasses?.map((f) => f.toJson()).toList(),
});
_setIfNotNull(json, 'error', error?.toJson());
_setIfNotNull(json, 'location', location?.toJson());
@@ -2959,21 +2959,21 @@
json == null ? null : ClassHeapStats._fromJson(json);
/// The class for which this memory information is associated.
- late final ClassRef classRef;
+ ClassRef? classRef;
/// The number of bytes allocated for instances of class since the accumulator
/// was last reset.
- late final int accumulatedSize;
+ int? accumulatedSize;
/// The number of bytes currently allocated for instances of class.
- late final int bytesCurrent;
+ int? bytesCurrent;
/// The number of instances of class which have been allocated since the
/// accumulator was last reset.
- late final int instancesAccumulated;
+ int? instancesAccumulated;
/// The number of instances of class which are currently alive.
- late final int instancesCurrent;
+ int? instancesCurrent;
ClassHeapStats({
required this.classRef,
@@ -3000,7 +3000,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'class': classRef.toJson(),
+ 'class': classRef?.toJson(),
'accumulatedSize': accumulatedSize,
'bytesCurrent': bytesCurrent,
'instancesAccumulated': instancesAccumulated,
@@ -3018,7 +3018,7 @@
static ClassList? parse(Map<String, dynamic>? json) =>
json == null ? null : ClassList._fromJson(json);
- late final List<ClassRef> classes;
+ List<ClassRef>? classes;
ClassList({
required this.classes,
@@ -3038,7 +3038,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'classes': classes.map((f) => f.toJson()).toList(),
+ 'classes': classes?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -3052,10 +3052,10 @@
json == null ? null : CodeRef._fromJson(json);
/// A name for this code object.
- late final String name;
+ String? name;
/// What kind of code object is this?
- late final /*CodeKind*/ String kind;
+ /*CodeKind*/ String? kind;
CodeRef({
required this.name,
@@ -3097,10 +3097,10 @@
json == null ? null : Code._fromJson(json);
/// A name for this code object.
- late final String name;
+ String? name;
/// What kind of code object is this?
- late final /*CodeKind*/ String kind;
+ /*CodeKind*/ String? kind;
Code({
required this.name,
@@ -3141,7 +3141,7 @@
json == null ? null : ContextRef._fromJson(json);
/// The number of variables in this context.
- late final int length;
+ int? length;
ContextRef({
required this.length,
@@ -3181,14 +3181,14 @@
json == null ? null : Context._fromJson(json);
/// The number of variables in this context.
- late final int length;
+ int? length;
/// The enclosing context for this context.
@optional
- late final Context? parent;
+ Context? parent;
/// The variables in this context object.
- late final List<ContextElement> variables;
+ List<ContextElement>? variables;
Context({
required this.length,
@@ -3217,7 +3217,7 @@
json['type'] = type;
json.addAll({
'length': length,
- 'variables': variables.map((f) => f.toJson()).toList(),
+ 'variables': variables?.map((f) => f.toJson()).toList(),
});
_setIfNotNull(json, 'parent', parent?.toJson());
return json;
@@ -3236,7 +3236,7 @@
json == null ? null : ContextElement._fromJson(json);
/// [value] can be one of [InstanceRef] or [Sentinel].
- late final dynamic value;
+ dynamic? value;
ContextElement({
required this.value,
@@ -3251,7 +3251,7 @@
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json.addAll({
- 'value': value.toJson(),
+ 'value': value?.toJson(),
});
return json;
}
@@ -3265,35 +3265,35 @@
json == null ? null : CpuSamples._fromJson(json);
/// The sampling rate for the profiler in microseconds.
- late final int samplePeriod;
+ int? samplePeriod;
/// The maximum possible stack depth for samples.
- late final int maxStackDepth;
+ int? maxStackDepth;
/// The number of samples returned.
- late final int sampleCount;
+ int? sampleCount;
/// The timespan the set of returned samples covers, in microseconds.
- late final int timeSpan;
+ int? timeSpan;
/// The start of the period of time in which the returned samples were
/// collected.
- late final int timeOriginMicros;
+ int? timeOriginMicros;
/// The duration of time covered by the returned samples.
- late final int timeExtentMicros;
+ int? timeExtentMicros;
/// The process ID for the VM.
- late final int pid;
+ int? pid;
/// A list of functions seen in the relevant samples. These references can be
/// looked up using the indicies provided in a `CpuSample` `stack` to
/// determine which function was on the stack.
- late final List<ProfileFunction> functions;
+ List<ProfileFunction>? functions;
/// A list of samples collected in the range `[timeOriginMicros,
/// timeOriginMicros + timeExtentMicros]`
- late final List<CpuSample> samples;
+ List<CpuSample>? samples;
CpuSamples({
required this.samplePeriod,
@@ -3339,8 +3339,8 @@
'timeOriginMicros': timeOriginMicros,
'timeExtentMicros': timeExtentMicros,
'pid': pid,
- 'functions': functions.map((f) => f.toJson()).toList(),
- 'samples': samples.map((f) => f.toJson()).toList(),
+ 'functions': functions?.map((f) => f.toJson()).toList(),
+ 'samples': samples?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -3354,26 +3354,26 @@
json == null ? null : CpuSample._fromJson(json);
/// The thread ID representing the thread on which this sample was collected.
- late final int tid;
+ int? tid;
/// The time this sample was collected in microseconds.
- late final int timestamp;
+ int? timestamp;
/// The name of VM tag set when this sample was collected. Omitted if the VM
/// tag for the sample is not considered valid.
@optional
- late final String? vmTag;
+ String? vmTag;
/// The name of the User tag set when this sample was collected. Omitted if no
/// User tag was set when this sample was collected.
@optional
- late final String? userTag;
+ String? userTag;
/// Provided and set to true if the sample's stack was truncated. This can
/// happen if the stack is deeper than the `stackDepth` in the `CpuSamples`
/// response.
@optional
- late final bool? truncated;
+ bool? truncated;
/// The call stack at the time this sample was collected. The stack is to be
/// interpreted as top to bottom. Each element in this array is a key into the
@@ -3383,7 +3383,7 @@
///
/// `functions[stack[0]] = @Function(bar())` `functions[stack[1]] =
/// @Function(foo())` `functions[stack[2]] = @Function(main())`
- late final List<int> stack;
+ List<int>? stack;
CpuSample({
required this.tid,
@@ -3408,7 +3408,7 @@
json.addAll({
'tid': tid,
'timestamp': timestamp,
- 'stack': stack.map((f) => f).toList(),
+ 'stack': stack?.map((f) => f).toList(),
});
_setIfNotNull(json, 'vmTag', vmTag);
_setIfNotNull(json, 'userTag', userTag);
@@ -3426,10 +3426,10 @@
json == null ? null : ErrorRef._fromJson(json);
/// What kind of error is this?
- late final /*ErrorKind*/ String kind;
+ /*ErrorKind*/ String? kind;
/// A description of the error.
- late final String message;
+ String? message;
ErrorRef({
required this.kind,
@@ -3473,20 +3473,20 @@
json == null ? null : Error._fromJson(json);
/// What kind of error is this?
- late final /*ErrorKind*/ String kind;
+ /*ErrorKind*/ String? kind;
/// A description of the error.
- late final String message;
+ String? message;
/// If this error is due to an unhandled exception, this is the exception
/// thrown.
@optional
- late final InstanceRef? exception;
+ InstanceRef? exception;
/// If this error is due to an unhandled exception, this is the stacktrace
/// object.
@optional
- late final InstanceRef? stacktrace;
+ InstanceRef? stacktrace;
Error({
required this.kind,
@@ -3540,27 +3540,27 @@
json == null ? null : Event._fromJson(json);
/// What kind of event is this?
- late final /*EventKind*/ String kind;
+ /*EventKind*/ String? kind;
/// The isolate with which this event is associated.
///
/// This is provided for all event kinds except for:
/// - VMUpdate, VMFlagUpdate
@optional
- late final IsolateRef? isolate;
+ IsolateRef? isolate;
/// The vm with which this event is associated.
///
/// This is provided for the event kind:
/// - VMUpdate, VMFlagUpdate
@optional
- late final VMRef? vm;
+ VMRef? vm;
/// The timestamp (in milliseconds since the epoch) associated with this
/// event. For some isolate pause events, the timestamp is from when the
/// isolate was paused. For other events, the timestamp is from when the event
/// was created.
- late final int timestamp;
+ int? timestamp;
/// The breakpoint which was added, removed, or resolved.
///
@@ -3570,7 +3570,7 @@
/// - BreakpointRemoved
/// - BreakpointResolved
@optional
- late final Breakpoint? breakpoint;
+ Breakpoint? breakpoint;
/// The list of breakpoints at which we are currently paused for a
/// PauseBreakpoint event.
@@ -3584,7 +3584,7 @@
/// This is provided for the event kinds:
/// - PauseBreakpoint
@optional
- late final List<Breakpoint>? pauseBreakpoints;
+ List<Breakpoint>? pauseBreakpoints;
/// The top stack frame associated with this event, if applicable.
///
@@ -3600,54 +3600,54 @@
/// the initial resume event that is delivered when an isolate begins
/// execution.
@optional
- late final Frame? topFrame;
+ Frame? topFrame;
/// The exception associated with this event, if this is a PauseException
/// event.
@optional
- late final InstanceRef? exception;
+ InstanceRef? exception;
/// An array of bytes, encoded as a base64 string.
///
/// This is provided for the WriteEvent event.
@optional
- late final String? bytes;
+ String? bytes;
/// The argument passed to dart:developer.inspect.
///
/// This is provided for the Inspect event.
@optional
- late final InstanceRef? inspectee;
+ InstanceRef? inspectee;
/// The RPC name of the extension that was added.
///
/// This is provided for the ServiceExtensionAdded event.
@optional
- late final String? extensionRPC;
+ String? extensionRPC;
/// The extension event kind.
///
/// This is provided for the Extension event.
@optional
- late final String? extensionKind;
+ String? extensionKind;
/// The extension event data.
///
/// This is provided for the Extension event.
@optional
- late final ExtensionData? extensionData;
+ ExtensionData? extensionData;
/// An array of TimelineEvents
///
/// This is provided for the TimelineEvents event.
@optional
- late final List<TimelineEvent>? timelineEvents;
+ List<TimelineEvent>? timelineEvents;
/// The new set of recorded timeline streams.
///
/// This is provided for the TimelineStreamSubscriptionsUpdate event.
@optional
- late final List<String>? updatedStreams;
+ List<String>? updatedStreams;
/// Is the isolate paused at an await, yield, or yield* statement?
///
@@ -3655,19 +3655,19 @@
/// - PauseBreakpoint
/// - PauseInterrupted
@optional
- late final bool? atAsyncSuspension;
+ bool? atAsyncSuspension;
/// The status (success or failure) related to the event. This is provided for
/// the event kinds:
/// - IsolateReloaded
@optional
- late final String? status;
+ String? status;
/// LogRecord data.
///
/// This is provided for the Logging event.
@optional
- late final LogRecord? logRecord;
+ LogRecord? logRecord;
/// The service identifier.
///
@@ -3675,7 +3675,7 @@
/// - ServiceRegistered
/// - ServiceUnregistered
@optional
- late final String? service;
+ String? service;
/// The RPC method that should be used to invoke the service.
///
@@ -3683,42 +3683,42 @@
/// - ServiceRegistered
/// - ServiceUnregistered
@optional
- late final String? method;
+ String? method;
/// The alias of the registered service.
///
/// This is provided for the event kinds:
/// - ServiceRegistered
@optional
- late final String? alias;
+ String? alias;
/// The name of the changed flag.
///
/// This is provided for the event kinds:
/// - VMFlagUpdate
@optional
- late final String? flag;
+ String? flag;
/// The new value of the changed flag.
///
/// This is provided for the event kinds:
/// - VMFlagUpdate
@optional
- late final String? newValue;
+ String? newValue;
/// Specifies whether this event is the last of a group of events.
///
/// This is provided for the event kinds:
/// - HeapSnapshot
@optional
- late final bool? last;
+ bool? last;
/// Binary data associated with the event.
///
/// This is provided for the event kinds:
/// - HeapSnapshot
@optional
- late final ByteData? data;
+ ByteData? data;
Event({
required this.kind,
@@ -3839,25 +3839,25 @@
json == null ? null : FieldRef._fromJson(json);
/// The name of this field.
- late final String name;
+ String? name;
/// The owner of this field, which can be either a Library or a Class.
- late final ObjRef owner;
+ ObjRef? owner;
/// The declared type of this field.
///
/// The value will always be of one of the kinds: Type, TypeRef,
/// TypeParameter, BoundedType.
- late final InstanceRef declaredType;
+ InstanceRef? declaredType;
/// Is this field const?
- late final bool isConst;
+ bool? isConst;
/// Is this field final?
- late final bool isFinal;
+ bool? isFinal;
/// Is this field static?
- late final bool isStatic;
+ bool? isStatic;
FieldRef({
required this.name,
@@ -3891,8 +3891,8 @@
json['type'] = type;
json.addAll({
'name': name,
- 'owner': owner.toJson(),
- 'declaredType': declaredType.toJson(),
+ 'owner': owner?.toJson(),
+ 'declaredType': declaredType?.toJson(),
'const': isConst,
'final': isFinal,
'static': isStatic,
@@ -3915,33 +3915,33 @@
json == null ? null : Field._fromJson(json);
/// The name of this field.
- late final String name;
+ String? name;
/// The owner of this field, which can be either a Library or a Class.
- late final ObjRef owner;
+ ObjRef? owner;
/// The declared type of this field.
///
/// The value will always be of one of the kinds: Type, TypeRef,
/// TypeParameter, BoundedType.
- late final InstanceRef declaredType;
+ InstanceRef? declaredType;
/// Is this field const?
- late final bool isConst;
+ bool? isConst;
/// Is this field final?
- late final bool isFinal;
+ bool? isFinal;
/// Is this field static?
- late final bool isStatic;
+ bool? isStatic;
/// The value of this field, if the field is static.
@optional
- late final InstanceRef? staticValue;
+ InstanceRef? staticValue;
/// The location of this field in the source code.
@optional
- late final SourceLocation? location;
+ SourceLocation? location;
Field({
required this.name,
@@ -3982,8 +3982,8 @@
json['type'] = type;
json.addAll({
'name': name,
- 'owner': owner.toJson(),
- 'declaredType': declaredType.toJson(),
+ 'owner': owner?.toJson(),
+ 'declaredType': declaredType?.toJson(),
'const': isConst,
'final': isFinal,
'static': isStatic,
@@ -4008,19 +4008,19 @@
json == null ? null : Flag._fromJson(json);
/// The name of the flag.
- late final String name;
+ String? name;
/// A description of the flag.
- late final String comment;
+ String? comment;
/// Has this flag been modified from its default setting?
- late final bool modified;
+ bool? modified;
/// The value of this flag as a string.
///
/// If this property is absent, then the value of the flag was NULL.
@optional
- late final String? valueAsString;
+ String? valueAsString;
Flag({
required this.name,
@@ -4057,7 +4057,7 @@
json == null ? null : FlagList._fromJson(json);
/// A list of all flags in the VM.
- late final List<Flag> flags;
+ List<Flag>? flags;
FlagList({
required this.flags,
@@ -4076,7 +4076,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'flags': flags.map((f) => f.toJson()).toList(),
+ 'flags': flags?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -4088,22 +4088,23 @@
static Frame? parse(Map<String, dynamic>? json) =>
json == null ? null : Frame._fromJson(json);
- late final int index;
+ int? index;
@optional
- late final FuncRef? function;
+ FuncRef? function;
@optional
- late final CodeRef? code;
+ CodeRef? code;
@optional
- late final SourceLocation? location;
+ SourceLocation? location;
@optional
- late final List<BoundVariable>? vars;
+ List<BoundVariable>? vars;
@optional
- late final /*FrameKind*/ String? kind;
+ /*FrameKind*/
+ String? kind;
Frame({
required this.index,
@@ -4156,18 +4157,18 @@
json == null ? null : FuncRef._fromJson(json);
/// The name of this function.
- late final String name;
+ String? name;
/// The owner of this function, which can be a Library, Class, or a Function.
///
/// [owner] can be one of [LibraryRef], [ClassRef] or [FuncRef].
- late final dynamic owner;
+ dynamic? owner;
/// Is this function static?
- late final bool isStatic;
+ bool? isStatic;
/// Is this function const?
- late final bool isConst;
+ bool? isConst;
FuncRef({
required this.name,
@@ -4196,7 +4197,7 @@
json['type'] = type;
json.addAll({
'name': name,
- 'owner': owner.toJson(),
+ 'owner': owner?.toJson(),
'static': isStatic,
'const': isConst,
});
@@ -4218,26 +4219,26 @@
json == null ? null : Func._fromJson(json);
/// The name of this function.
- late final String name;
+ String? name;
/// The owner of this function, which can be a Library, Class, or a Function.
///
/// [owner] can be one of [LibraryRef], [ClassRef] or [FuncRef].
- late final dynamic owner;
+ dynamic? owner;
/// Is this function static?
- late final bool isStatic;
+ bool? isStatic;
/// Is this function const?
- late final bool isConst;
+ bool? isConst;
/// The location of this function in the source code.
@optional
- late final SourceLocation? location;
+ SourceLocation? location;
/// The compiled code associated with this function.
@optional
- late final CodeRef? code;
+ CodeRef? code;
Func({
required this.name,
@@ -4271,7 +4272,7 @@
json['type'] = type;
json.addAll({
'name': name,
- 'owner': owner.toJson(),
+ 'owner': owner?.toJson(),
'static': isStatic,
'const': isConst,
});
@@ -4295,10 +4296,10 @@
json == null ? null : InstanceRef._fromJson(json);
/// What kind of instance is this?
- late final /*InstanceKind*/ String kind;
+ /*InstanceKind*/ String? kind;
/// Instance references always include their class.
- late final ClassRef classRef;
+ ClassRef? classRef;
/// The value of this instance as a string.
///
@@ -4313,14 +4314,14 @@
/// - Int32x4
/// - StackTrace
@optional
- late final String? valueAsString;
+ String? valueAsString;
/// The valueAsString for String references may be truncated. If so, this
/// property is added with the value 'true'.
///
/// New code should use 'length' and 'count' instead.
@optional
- late final bool? valueAsStringIsTruncated;
+ bool? valueAsStringIsTruncated;
/// The length of a List or the number of associations in a Map or the number
/// of codeunits in a String.
@@ -4344,28 +4345,28 @@
/// - Float32x4List
/// - Float64x2List
@optional
- late final int? length;
+ int? length;
/// The name of a Type instance.
///
/// Provided for instance kinds:
/// - Type
@optional
- late final String? name;
+ String? name;
/// The corresponding Class if this Type has a resolved typeClass.
///
/// Provided for instance kinds:
/// - Type
@optional
- late final ClassRef? typeClass;
+ ClassRef? typeClass;
/// The parameterized class of a type parameter:
///
/// Provided for instance kinds:
/// - TypeParameter
@optional
- late final ClassRef? parameterizedClass;
+ ClassRef? parameterizedClass;
/// The pattern of a RegExp instance.
///
@@ -4374,42 +4375,42 @@
/// Provided for instance kinds:
/// - RegExp
@optional
- late final InstanceRef? pattern;
+ InstanceRef? pattern;
/// The function associated with a Closure instance.
///
/// Provided for instance kinds:
/// - Closure
@optional
- late final FuncRef? closureFunction;
+ FuncRef? closureFunction;
/// The context associated with a Closure instance.
///
/// Provided for instance kinds:
/// - Closure
@optional
- late final ContextRef? closureContext;
+ ContextRef? closureContext;
/// The port ID for a ReceivePort.
///
/// Provided for instance kinds:
/// - ReceivePort
@optional
- late final int? portId;
+ int? portId;
/// The stack trace associated with the allocation of a ReceivePort.
///
/// Provided for instance kinds:
/// - ReceivePort
@optional
- late final InstanceRef? allocationLocation;
+ InstanceRef? allocationLocation;
/// A name associated with a ReceivePort used for debugging purposes.
///
/// Provided for instance kinds:
/// - ReceivePort
@optional
- late final String? debugName;
+ String? debugName;
InstanceRef({
required this.kind,
@@ -4468,7 +4469,7 @@
json['type'] = type;
json.addAll({
'kind': kind,
- 'class': classRef.toJson(),
+ 'class': classRef?.toJson(),
});
_setIfNotNull(json, 'valueAsString', valueAsString);
_setIfNotNull(json, 'valueAsStringIsTruncated', valueAsStringIsTruncated);
@@ -4499,11 +4500,11 @@
json == null ? null : Instance._fromJson(json);
/// What kind of instance is this?
- late final /*InstanceKind*/ String kind;
+ /*InstanceKind*/ String? kind;
/// Instance references always include their class.
@override
- covariant late final ClassRef classRef;
+ ClassRef? classRef;
/// The value of this instance as a string.
///
@@ -4514,14 +4515,14 @@
/// - String (value may be truncated)
/// - StackTrace
@optional
- late final String? valueAsString;
+ String? valueAsString;
/// The valueAsString for String references may be truncated. If so, this
/// property is added with the value 'true'.
///
/// New code should use 'length' and 'count' instead.
@optional
- late final bool? valueAsStringIsTruncated;
+ bool? valueAsStringIsTruncated;
/// The length of a List or the number of associations in a Map or the number
/// of codeunits in a String.
@@ -4545,7 +4546,7 @@
/// - Float32x4List
/// - Float64x2List
@optional
- late final int? length;
+ int? length;
/// The index of the first element or association or codeunit returned. This
/// is only provided when it is non-zero.
@@ -4569,7 +4570,7 @@
/// - Float32x4List
/// - Float64x2List
@optional
- late final int? offset;
+ int? offset;
/// The number of elements or associations or codeunits returned. This is only
/// provided when it is less than length.
@@ -4593,46 +4594,46 @@
/// - Float32x4List
/// - Float64x2List
@optional
- late final int? count;
+ int? count;
/// The name of a Type instance.
///
/// Provided for instance kinds:
/// - Type
@optional
- late final String? name;
+ String? name;
/// The corresponding Class if this Type is canonical.
///
/// Provided for instance kinds:
/// - Type
@optional
- late final ClassRef? typeClass;
+ ClassRef? typeClass;
/// The parameterized class of a type parameter:
///
/// Provided for instance kinds:
/// - TypeParameter
@optional
- late final ClassRef? parameterizedClass;
+ ClassRef? parameterizedClass;
/// The fields of this Instance.
@optional
- late final List<BoundField>? fields;
+ List<BoundField>? fields;
/// The elements of a List instance.
///
/// Provided for instance kinds:
/// - List
@optional
- late final List<dynamic>? elements;
+ List<dynamic>? elements;
/// The elements of a Map instance.
///
/// Provided for instance kinds:
/// - Map
@optional
- late final List<MapAssociation>? associations;
+ List<MapAssociation>? associations;
/// The bytes of a TypedData instance.
///
@@ -4654,77 +4655,77 @@
/// - Float32x4List
/// - Float64x2List
@optional
- late final String? bytes;
+ String? bytes;
/// The referent of a MirrorReference instance.
///
/// Provided for instance kinds:
/// - MirrorReference
@optional
- late final InstanceRef? mirrorReferent;
+ InstanceRef? mirrorReferent;
/// The pattern of a RegExp instance.
///
/// Provided for instance kinds:
/// - RegExp
@optional
- late final InstanceRef? pattern;
+ InstanceRef? pattern;
/// The function associated with a Closure instance.
///
/// Provided for instance kinds:
/// - Closure
@optional
- late final FuncRef? closureFunction;
+ FuncRef? closureFunction;
/// The context associated with a Closure instance.
///
/// Provided for instance kinds:
/// - Closure
@optional
- late final ContextRef? closureContext;
+ ContextRef? closureContext;
/// Whether this regular expression is case sensitive.
///
/// Provided for instance kinds:
/// - RegExp
@optional
- late final bool? isCaseSensitive;
+ bool? isCaseSensitive;
/// Whether this regular expression matches multiple lines.
///
/// Provided for instance kinds:
/// - RegExp
@optional
- late final bool? isMultiLine;
+ bool? isMultiLine;
/// The key for a WeakProperty instance.
///
/// Provided for instance kinds:
/// - WeakProperty
@optional
- late final InstanceRef? propertyKey;
+ InstanceRef? propertyKey;
/// The key for a WeakProperty instance.
///
/// Provided for instance kinds:
/// - WeakProperty
@optional
- late final InstanceRef? propertyValue;
+ InstanceRef? propertyValue;
/// The type arguments for this type.
///
/// Provided for instance kinds:
/// - Type
@optional
- late final TypeArgumentsRef? typeArguments;
+ TypeArgumentsRef? typeArguments;
/// The index of a TypeParameter instance.
///
/// Provided for instance kinds:
/// - TypeParameter
@optional
- late final int? parameterIndex;
+ int? parameterIndex;
/// The type bounded by a BoundedType instance - or - the referent of a
/// TypeRef instance.
@@ -4736,7 +4737,7 @@
/// - BoundedType
/// - TypeRef
@optional
- late final InstanceRef? targetType;
+ InstanceRef? targetType;
/// The bound of a TypeParameter or BoundedType.
///
@@ -4747,28 +4748,28 @@
/// - BoundedType
/// - TypeParameter
@optional
- late final InstanceRef? bound;
+ InstanceRef? bound;
/// The port ID for a ReceivePort.
///
/// Provided for instance kinds:
/// - ReceivePort
@optional
- late final int? portId;
+ int? portId;
/// The stack trace associated with the allocation of a ReceivePort.
///
/// Provided for instance kinds:
/// - ReceivePort
@optional
- late final InstanceRef? allocationLocation;
+ InstanceRef? allocationLocation;
/// A name associated with a ReceivePort used for debugging purposes.
///
/// Provided for instance kinds:
/// - ReceivePort
@optional
- late final String? debugName;
+ String? debugName;
Instance({
required this.kind,
@@ -4835,7 +4836,7 @@
json['type'] = type;
json.addAll({
'kind': kind,
- 'class': classRef.toJson(),
+ 'class': classRef?.toJson(),
});
_setIfNotNull(json, 'valueAsString', valueAsString);
_setIfNotNull(json, 'valueAsStringIsTruncated', valueAsStringIsTruncated);
@@ -4882,17 +4883,17 @@
json == null ? null : IsolateRef._fromJson(json);
/// The id which is passed to the getIsolate RPC to load this isolate.
- late final String id;
+ String? id;
/// A numeric id for this isolate, represented as a string. Unique.
- late final String number;
+ String? number;
/// A name identifying this isolate. Not guaranteed to be unique.
- late final String name;
+ String? name;
/// Specifies whether the isolate was spawned by the VM or embedder for
/// internal use. If `false`, this isolate is likely running user code.
- late final bool isSystemIsolate;
+ bool? isSystemIsolate;
IsolateRef({
required this.id,
@@ -4938,65 +4939,65 @@
json == null ? null : Isolate._fromJson(json);
/// The id which is passed to the getIsolate RPC to reload this isolate.
- late final String id;
+ String? id;
/// A numeric id for this isolate, represented as a string. Unique.
- late final String number;
+ String? number;
/// A name identifying this isolate. Not guaranteed to be unique.
- late final String name;
+ String? name;
/// Specifies whether the isolate was spawned by the VM or embedder for
/// internal use. If `false`, this isolate is likely running user code.
- late final bool isSystemIsolate;
+ bool? isSystemIsolate;
/// The list of isolate flags provided to this isolate. See Dart_IsolateFlags
/// in dart_api.h for the list of accepted isolate flags.
- late final List<IsolateFlag> isolateFlags;
+ List<IsolateFlag>? isolateFlags;
/// The time that the VM started in milliseconds since the epoch.
///
/// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
- late final int startTime;
+ int? startTime;
/// Is the isolate in a runnable state?
- late final bool runnable;
+ bool? runnable;
/// The number of live ports for this isolate.
- late final int livePorts;
+ int? livePorts;
/// Will this isolate pause when exiting?
- late final bool pauseOnExit;
+ bool? pauseOnExit;
/// The last pause event delivered to the isolate. If the isolate is running,
/// this will be a resume event.
- late final Event pauseEvent;
+ Event? pauseEvent;
/// The root library for this isolate.
///
/// Guaranteed to be initialized when the IsolateRunnable event fires.
@optional
- late final LibraryRef? rootLib;
+ LibraryRef? rootLib;
/// A list of all libraries for this isolate.
///
/// Guaranteed to be initialized when the IsolateRunnable event fires.
- late final List<LibraryRef> libraries;
+ List<LibraryRef>? libraries;
/// A list of all breakpoints for this isolate.
- late final List<Breakpoint> breakpoints;
+ List<Breakpoint>? breakpoints;
/// The error that is causing this isolate to exit, if applicable.
@optional
- late final Error? error;
+ Error? error;
/// The current pause on exception mode for this isolate.
- late final /*ExceptionPauseMode*/ String exceptionPauseMode;
+ /*ExceptionPauseMode*/ String? exceptionPauseMode;
/// The list of service extension RPCs that are registered for this isolate,
/// if any.
@optional
- late final List<String>? extensionRPCs;
+ List<String>? extensionRPCs;
Isolate({
required this.id,
@@ -5060,14 +5061,14 @@
'number': number,
'name': name,
'isSystemIsolate': isSystemIsolate,
- 'isolateFlags': isolateFlags.map((f) => f.toJson()).toList(),
+ 'isolateFlags': isolateFlags?.map((f) => f.toJson()).toList(),
'startTime': startTime,
'runnable': runnable,
'livePorts': livePorts,
'pauseOnExit': pauseOnExit,
- 'pauseEvent': pauseEvent.toJson(),
- 'libraries': libraries.map((f) => f.toJson()).toList(),
- 'breakpoints': breakpoints.map((f) => f.toJson()).toList(),
+ 'pauseEvent': pauseEvent?.toJson(),
+ 'libraries': libraries?.map((f) => f.toJson()).toList(),
+ 'breakpoints': breakpoints?.map((f) => f.toJson()).toList(),
'exceptionPauseMode': exceptionPauseMode,
});
_setIfNotNull(json, 'rootLib', rootLib?.toJson());
@@ -5089,10 +5090,10 @@
json == null ? null : IsolateFlag._fromJson(json);
/// The name of the flag.
- late final String name;
+ String? name;
/// The value of this flag as a string.
- late final String valueAsString;
+ String? valueAsString;
IsolateFlag({
required this.name,
@@ -5124,17 +5125,17 @@
/// The id which is passed to the getIsolateGroup RPC to load this isolate
/// group.
- late final String id;
+ String? id;
/// A numeric id for this isolate group, represented as a string. Unique.
- late final String number;
+ String? number;
/// A name identifying this isolate group. Not guaranteed to be unique.
- late final String name;
+ String? name;
/// Specifies whether the isolate group was spawned by the VM or embedder for
/// internal use. If `false`, this isolate group is likely running user code.
- late final bool isSystemIsolateGroup;
+ bool? isSystemIsolateGroup;
IsolateGroupRef({
required this.id,
@@ -5180,20 +5181,20 @@
json == null ? null : IsolateGroup._fromJson(json);
/// The id which is passed to the getIsolate RPC to reload this isolate.
- late final String id;
+ String? id;
/// A numeric id for this isolate, represented as a string. Unique.
- late final String number;
+ String? number;
/// A name identifying this isolate. Not guaranteed to be unique.
- late final String name;
+ String? name;
/// Specifies whether the isolate group was spawned by the VM or embedder for
/// internal use. If `false`, this isolate group is likely running user code.
- late final bool isSystemIsolateGroup;
+ bool? isSystemIsolateGroup;
/// A list of all isolates in this isolate group.
- late final List<IsolateRef> isolates;
+ List<IsolateRef>? isolates;
IsolateGroup({
required this.id,
@@ -5225,7 +5226,7 @@
'number': number,
'name': name,
'isSystemIsolateGroup': isSystemIsolateGroup,
- 'isolates': isolates.map((f) => f.toJson()).toList(),
+ 'isolates': isolates?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -5245,7 +5246,7 @@
json == null ? null : InboundReferences._fromJson(json);
/// An array of inbound references to an object.
- late final List<InboundReference> references;
+ List<InboundReference>? references;
InboundReferences({
required this.references,
@@ -5267,7 +5268,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'references': references.map((f) => f.toJson()).toList(),
+ 'references': references?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -5281,17 +5282,17 @@
json == null ? null : InboundReference._fromJson(json);
/// The object holding the inbound reference.
- late final ObjRef source;
+ ObjRef? source;
/// If source is a List, parentListIndex is the index of the inbound
/// reference.
@optional
- late final int? parentListIndex;
+ int? parentListIndex;
/// If source is a field of an object, parentField is the field containing the
/// inbound reference.
@optional
- late final FieldRef? parentField;
+ FieldRef? parentField;
InboundReference({
required this.source,
@@ -5309,7 +5310,7 @@
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json.addAll({
- 'source': source.toJson(),
+ 'source': source?.toJson(),
});
_setIfNotNull(json, 'parentListIndex', parentListIndex);
_setIfNotNull(json, 'parentField', parentField?.toJson());
@@ -5325,10 +5326,10 @@
json == null ? null : InstanceSet._fromJson(json);
/// The number of instances of the requested type currently allocated.
- late final int totalCount;
+ int? totalCount;
/// An array of instances of the requested type.
- late final List<ObjRef> instances;
+ List<ObjRef>? instances;
InstanceSet({
required this.totalCount,
@@ -5351,7 +5352,7 @@
json['type'] = type;
json.addAll({
'totalCount': totalCount,
- 'instances': instances.map((f) => f.toJson()).toList(),
+ 'instances': instances?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -5366,10 +5367,10 @@
json == null ? null : LibraryRef._fromJson(json);
/// The name of this library.
- late final String name;
+ String? name;
/// The uri of this library.
- late final String uri;
+ String? uri;
LibraryRef({
required this.name,
@@ -5413,28 +5414,28 @@
json == null ? null : Library._fromJson(json);
/// The name of this library.
- late final String name;
+ String? name;
/// The uri of this library.
- late final String uri;
+ String? uri;
/// Is this library debuggable? Default true.
- late final bool debuggable;
+ bool? debuggable;
/// A list of the imports for this library.
- late final List<LibraryDependency> dependencies;
+ List<LibraryDependency>? dependencies;
/// A list of the scripts which constitute this library.
- late final List<ScriptRef> scripts;
+ List<ScriptRef>? scripts;
/// A list of the top-level variables in this library.
- late final List<FieldRef> variables;
+ List<FieldRef>? variables;
/// A list of the top-level functions in this library.
- late final List<FuncRef> functions;
+ List<FuncRef>? functions;
/// A list of all classes in this library.
- late final List<ClassRef> classes;
+ List<ClassRef>? classes;
Library({
required this.name,
@@ -5481,11 +5482,11 @@
'name': name,
'uri': uri,
'debuggable': debuggable,
- 'dependencies': dependencies.map((f) => f.toJson()).toList(),
- 'scripts': scripts.map((f) => f.toJson()).toList(),
- 'variables': variables.map((f) => f.toJson()).toList(),
- 'functions': functions.map((f) => f.toJson()).toList(),
- 'classes': classes.map((f) => f.toJson()).toList(),
+ 'dependencies': dependencies?.map((f) => f.toJson()).toList(),
+ 'scripts': scripts?.map((f) => f.toJson()).toList(),
+ 'variables': variables?.map((f) => f.toJson()).toList(),
+ 'functions': functions?.map((f) => f.toJson()).toList(),
+ 'classes': classes?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -5503,16 +5504,16 @@
json == null ? null : LibraryDependency._fromJson(json);
/// Is this dependency an import (rather than an export)?
- late final bool isImport;
+ bool? isImport;
/// Is this dependency deferred?
- late final bool isDeferred;
+ bool? isDeferred;
/// The prefix of an 'as' import, or null.
- late final String prefix;
+ String? prefix;
/// The library being imported or exported.
- late final LibraryRef target;
+ LibraryRef? target;
LibraryDependency({
required this.isImport,
@@ -5535,7 +5536,7 @@
'isImport': isImport,
'isDeferred': isDeferred,
'prefix': prefix,
- 'target': target.toJson(),
+ 'target': target?.toJson(),
});
return json;
}
@@ -5550,31 +5551,31 @@
json == null ? null : LogRecord._fromJson(json);
/// The log message.
- late final InstanceRef message;
+ InstanceRef? message;
/// The timestamp.
- late final int time;
+ int? time;
/// The severity level (a value between 0 and 2000).
///
/// See the package:logging `Level` class for an overview of the possible
/// values.
- late final int level;
+ int? level;
/// A monotonically increasing sequence number.
- late final int sequenceNumber;
+ int? sequenceNumber;
/// The name of the source of the log message.
- late final InstanceRef loggerName;
+ InstanceRef? loggerName;
/// The zone where the log was emitted.
- late final InstanceRef zone;
+ InstanceRef? zone;
/// An error object associated with this log event.
- late final InstanceRef error;
+ InstanceRef? error;
/// A stack trace associated with this log event.
- late final InstanceRef stackTrace;
+ InstanceRef? stackTrace;
LogRecord({
required this.message,
@@ -5611,14 +5612,14 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'message': message.toJson(),
+ 'message': message?.toJson(),
'time': time,
'level': level,
'sequenceNumber': sequenceNumber,
- 'loggerName': loggerName.toJson(),
- 'zone': zone.toJson(),
- 'error': error.toJson(),
- 'stackTrace': stackTrace.toJson(),
+ 'loggerName': loggerName?.toJson(),
+ 'zone': zone?.toJson(),
+ 'error': error?.toJson(),
+ 'stackTrace': stackTrace?.toJson(),
});
return json;
}
@@ -5631,10 +5632,10 @@
json == null ? null : MapAssociation._fromJson(json);
/// [key] can be one of [InstanceRef] or [Sentinel].
- late final dynamic key;
+ dynamic? key;
/// [value] can be one of [InstanceRef] or [Sentinel].
- late final dynamic value;
+ dynamic? value;
MapAssociation({
required this.key,
@@ -5652,8 +5653,8 @@
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json.addAll({
- 'key': key.toJson(),
- 'value': value.toJson(),
+ 'key': key?.toJson(),
+ 'value': value?.toJson(),
});
return json;
}
@@ -5674,15 +5675,15 @@
/// supplied to these APIs from the VM embedder or native extensions. This
/// external memory applies GC pressure, but is separate from heapUsage and
/// heapCapacity.
- late final int externalUsage;
+ int? externalUsage;
/// The total capacity of the heap in bytes. This is the amount of memory used
/// by the Dart heap from the perspective of the operating system.
- late final int heapCapacity;
+ int? heapCapacity;
/// The current heap memory usage in bytes. Heap usage is always less than or
/// equal to the heap capacity.
- late final int heapUsage;
+ int? heapUsage;
MemoryUsage({
required this.externalUsage,
@@ -5724,25 +5725,25 @@
/// The index in the isolate's message queue. The 0th message being the next
/// message to be processed.
- late final int index;
+ int? index;
/// An advisory name describing this message.
- late final String name;
+ String? name;
/// An instance id for the decoded message. This id can be passed to other
/// RPCs, for example, getObject or evaluate.
- late final String messageObjectId;
+ String? messageObjectId;
/// The size (bytes) of the encoded message.
- late final int size;
+ int? size;
/// A reference to the function that will be invoked to handle this message.
@optional
- late final FuncRef? handler;
+ FuncRef? handler;
/// The source location of handler.
@optional
- late final SourceLocation? location;
+ SourceLocation? location;
Message({
required this.index,
@@ -5794,7 +5795,7 @@
json == null ? null : NativeFunction._fromJson(json);
/// The name of the native function this object represents.
- late final String name;
+ String? name;
NativeFunction({
required this.name,
@@ -5822,7 +5823,7 @@
/// Always 'null'.
@override
- covariant late final String valueAsString;
+ String? valueAsString;
NullValRef({
required this.valueAsString,
@@ -5867,7 +5868,7 @@
/// Always 'null'.
@override
- covariant late final String valueAsString;
+ String? valueAsString;
NullVal({
required this.valueAsString,
@@ -5912,13 +5913,13 @@
/// A unique identifier for an Object. Passed to the getObject RPC to load
/// this Object.
- late final String id;
+ String? id;
/// Provided and set to true if the id of an Object is fixed. If true, the id
/// of an Object is guaranteed not to change or expire. The object may,
/// however, still be _Collected_.
@optional
- late final bool? fixedId;
+ bool? fixedId;
ObjRef({
required this.id,
@@ -5960,13 +5961,13 @@
/// this Object.
///
/// Some objects may get a new id when they are reloaded.
- late final String id;
+ String? id;
/// Provided and set to true if the id of an Object is fixed. If true, the id
/// of an Object is guaranteed not to change or expire. The object may,
/// however, still be _Collected_.
@optional
- late final bool? fixedId;
+ bool? fixedId;
/// If an object is allocated in the Dart heap, it will have a corresponding
/// class object.
@@ -5977,7 +5978,7 @@
/// Moving an Object into or out of the heap is considered a backwards
/// compatible change for types other than Instance.
@optional
- late final ClassRef? classRef;
+ ClassRef? classRef;
/// The size of this object in the heap.
///
@@ -5987,7 +5988,7 @@
/// implementation, this occurs for small integers, which are stored entirely
/// within their object pointers.
@optional
- late final int? size;
+ int? size;
Obj({
required this.id,
@@ -6034,7 +6035,7 @@
static PortList? parse(Map<String, dynamic>? json) =>
json == null ? null : PortList._fromJson(json);
- late final List<InstanceRef> ports;
+ List<InstanceRef>? ports;
PortList({
required this.ports,
@@ -6054,7 +6055,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'ports': ports.map((f) => f.toJson()).toList(),
+ 'ports': ports?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -6071,20 +6072,20 @@
json == null ? null : ProfileFunction._fromJson(json);
/// The kind of function this object represents.
- late final String kind;
+ String? kind;
/// The number of times function appeared on the stack during sampling events.
- late final int inclusiveTicks;
+ int? inclusiveTicks;
/// The number of times function appeared on the top of the stack during
/// sampling events.
- late final int exclusiveTicks;
+ int? exclusiveTicks;
/// The resolved URL for the script containing function.
- late final String resolvedUrl;
+ String? resolvedUrl;
/// The function captured during profiling.
- late final dynamic function;
+ dynamic? function;
ProfileFunction({
required this.kind,
@@ -6110,7 +6111,7 @@
'inclusiveTicks': inclusiveTicks,
'exclusiveTicks': exclusiveTicks,
'resolvedUrl': resolvedUrl,
- 'function': function.toJson(),
+ 'function': function?.toJson(),
});
return json;
}
@@ -6129,7 +6130,7 @@
json == null ? null : ProtocolList._fromJson(json);
/// A list of supported protocols provided by this service.
- late final List<Protocol> protocols;
+ List<Protocol>? protocols;
ProtocolList({
required this.protocols,
@@ -6149,7 +6150,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'protocols': protocols.map((f) => f.toJson()).toList(),
+ 'protocols': protocols?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -6163,13 +6164,13 @@
json == null ? null : Protocol._fromJson(json);
/// The name of the supported protocol.
- late final String protocolName;
+ String? protocolName;
/// The major revision of the protocol.
- late final int major;
+ int? major;
/// The minor revision of the protocol.
- late final int minor;
+ int? minor;
Protocol({
required this.protocolName,
@@ -6202,7 +6203,7 @@
static ProcessMemoryUsage? parse(Map<String, dynamic>? json) =>
json == null ? null : ProcessMemoryUsage._fromJson(json);
- late final ProcessMemoryItem root;
+ ProcessMemoryItem? root;
ProcessMemoryUsage({
required this.root,
@@ -6222,7 +6223,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'root': root.toJson(),
+ 'root': root?.toJson(),
});
return json;
}
@@ -6235,17 +6236,17 @@
json == null ? null : ProcessMemoryItem._fromJson(json);
/// A short name for this bucket of memory.
- late final String name;
+ String? name;
/// A longer description for this item.
- late final String description;
+ String? description;
/// The amount of memory in bytes. This is a retained size, not a shallow
/// size. That is, it includes the size of children.
- late final int size;
+ int? size;
/// Subdivisons of this bucket of memory.
- late final List<ProcessMemoryItem> children;
+ List<ProcessMemoryItem>? children;
ProcessMemoryItem({
required this.name,
@@ -6270,7 +6271,7 @@
'name': name,
'description': description,
'size': size,
- 'children': children.map((f) => f.toJson()).toList(),
+ 'children': children?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -6285,7 +6286,7 @@
json == null ? null : ReloadReport._fromJson(json);
/// Did the reload succeed or fail?
- late final bool success;
+ bool? success;
ReloadReport({
required this.success,
@@ -6317,19 +6318,19 @@
json == null ? null : RetainingObject._fromJson(json);
/// An object that is part of a retaining path.
- late final ObjRef value;
+ ObjRef? value;
/// The offset of the retaining object in a containing list.
@optional
- late final int? parentListIndex;
+ int? parentListIndex;
/// The key mapping to the retaining object in a containing map.
@optional
- late final ObjRef? parentMapKey;
+ ObjRef? parentMapKey;
/// The name of the field containing the retaining object within an object.
@optional
- late final String? parentField;
+ String? parentField;
RetainingObject({
required this.value,
@@ -6349,7 +6350,7 @@
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json.addAll({
- 'value': value.toJson(),
+ 'value': value?.toJson(),
});
_setIfNotNull(json, 'parentListIndex', parentListIndex);
_setIfNotNull(json, 'parentMapKey', parentMapKey?.toJson());
@@ -6366,15 +6367,15 @@
json == null ? null : RetainingPath._fromJson(json);
/// The length of the retaining path.
- late final int length;
+ int? length;
/// The type of GC root which is holding a reference to the specified object.
/// Possible values include: * class table * local handle * persistent
/// handle * stack * user global * weak persistent handle * unknown
- late final String gcRootType;
+ String? gcRootType;
/// The chain of objects which make up the retaining path.
- late final List<RetainingObject> elements;
+ List<RetainingObject>? elements;
RetainingPath({
required this.length,
@@ -6401,7 +6402,7 @@
json.addAll({
'length': length,
'gcRootType': gcRootType,
- 'elements': elements.map((f) => f.toJson()).toList(),
+ 'elements': elements?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -6446,10 +6447,10 @@
json == null ? null : Sentinel._fromJson(json);
/// What kind of sentinel is this?
- late final /*SentinelKind*/ String kind;
+ /*SentinelKind*/ String? kind;
/// A reasonable string representation of this sentinel.
- late final String valueAsString;
+ String? valueAsString;
Sentinel({
required this.kind,
@@ -6485,7 +6486,7 @@
json == null ? null : ScriptRef._fromJson(json);
/// The uri from which this script was loaded.
- late final String uri;
+ String? uri;
ScriptRef({
required this.uri,
@@ -6556,26 +6557,26 @@
final _tokenToColumn = <int, int>{};
/// The uri from which this script was loaded.
- late final String uri;
+ String? uri;
/// The library which owns this script.
- late final LibraryRef library;
+ LibraryRef? library;
@optional
- late final int? lineOffset;
+ int? lineOffset;
@optional
- late final int? columnOffset;
+ int? columnOffset;
/// The source code for this script. This can be null for certain built-in
/// scripts.
@optional
- late final String? source;
+ String? source;
/// A table encoding a mapping from token position to line and column. This
/// field is null if sources aren't available.
@optional
- late final List<List<int>>? tokenPosTable;
+ List<List<int>>? tokenPosTable;
Script({
required this.uri,
@@ -6640,7 +6641,7 @@
json['type'] = type;
json.addAll({
'uri': uri,
- 'library': library.toJson(),
+ 'library': library?.toJson(),
});
_setIfNotNull(json, 'lineOffset', lineOffset);
_setIfNotNull(json, 'columnOffset', columnOffset);
@@ -6661,7 +6662,7 @@
static ScriptList? parse(Map<String, dynamic>? json) =>
json == null ? null : ScriptList._fromJson(json);
- late final List<ScriptRef> scripts;
+ List<ScriptRef>? scripts;
ScriptList({
required this.scripts,
@@ -6681,7 +6682,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'scripts': scripts.map((f) => f.toJson()).toList(),
+ 'scripts': scripts?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -6696,14 +6697,14 @@
json == null ? null : SourceLocation._fromJson(json);
/// The script containing the source location.
- late final ScriptRef script;
+ ScriptRef? script;
/// The first token of the location.
- late final int tokenPos;
+ int? tokenPos;
/// The last token of the location if this is a range.
@optional
- late final int? endTokenPos;
+ int? endTokenPos;
SourceLocation({
required this.script,
@@ -6726,7 +6727,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'script': script.toJson(),
+ 'script': script?.toJson(),
'tokenPos': tokenPos,
});
_setIfNotNull(json, 'endTokenPos', endTokenPos);
@@ -6751,10 +6752,10 @@
/// functions.
///
/// Note that ranges may be duplicated, in the case of mixins.
- late final List<SourceReportRange> ranges;
+ List<SourceReportRange>? ranges;
/// A list of scripts, referenced by index in the report's ranges.
- late final List<ScriptRef> scripts;
+ List<ScriptRef>? scripts;
SourceReport({
required this.ranges,
@@ -6777,8 +6778,8 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'ranges': ranges.map((f) => f.toJson()).toList(),
- 'scripts': scripts.map((f) => f.toJson()).toList(),
+ 'ranges': ranges?.map((f) => f.toJson()).toList(),
+ 'scripts': scripts?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -6797,11 +6798,11 @@
/// A list of token positions in a SourceReportRange which have been executed.
/// The list is sorted.
- late final List<int> hits;
+ List<int>? hits;
/// A list of token positions in a SourceReportRange which have not been
/// executed. The list is sorted.
- late final List<int> misses;
+ List<int>? misses;
SourceReportCoverage({
required this.hits,
@@ -6816,8 +6817,8 @@
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json.addAll({
- 'hits': hits.map((f) => f).toList(),
- 'misses': misses.map((f) => f).toList(),
+ 'hits': hits?.map((f) => f).toList(),
+ 'misses': misses?.map((f) => f).toList(),
});
return json;
}
@@ -6838,33 +6839,33 @@
/// An index into the script table of the SourceReport, indicating which
/// script contains this range of code.
- late final int scriptIndex;
+ int? scriptIndex;
/// The token position at which this range begins.
- late final int startPos;
+ int? startPos;
/// The token position at which this range ends. Inclusive.
- late final int endPos;
+ int? endPos;
/// Has this range been compiled by the Dart VM?
- late final bool compiled;
+ bool? compiled;
/// The error while attempting to compile this range, if this report was
/// generated with forceCompile=true.
@optional
- late final ErrorRef? error;
+ ErrorRef? error;
/// Code coverage information for this range. Provided only when the Coverage
/// report has been requested and the range has been compiled.
@optional
- late final SourceReportCoverage? coverage;
+ SourceReportCoverage? coverage;
/// Possible breakpoint information for this range, represented as a sorted
/// list of token positions. Provided only when the when the
/// PossibleBreakpoint report has been requested and the range has been
/// compiled.
@optional
- late final List<int>? possibleBreakpoints;
+ List<int>? possibleBreakpoints;
SourceReportRange({
required this.scriptIndex,
@@ -6920,24 +6921,24 @@
/// A list of frames that make up the synchronous stack, rooted at the message
/// loop (i.e., the frames since the last asynchronous gap or the isolate's
/// entrypoint).
- late final List<Frame> frames;
+ List<Frame>? frames;
/// A list of frames representing the asynchronous path. Comparable to
/// `awaiterFrames`, if provided, although some frames may be different.
@optional
- late final List<Frame>? asyncCausalFrames;
+ List<Frame>? asyncCausalFrames;
/// A list of frames representing the asynchronous path. Comparable to
/// `asyncCausalFrames`, if provided, although some frames may be different.
@optional
- late final List<Frame>? awaiterFrames;
+ List<Frame>? awaiterFrames;
/// A list of messages in the isolate's message queue.
- late final List<Message> messages;
+ List<Message>? messages;
/// Specifies whether or not this stack is complete or has been artificially
/// truncated.
- late final bool truncated;
+ bool? truncated;
Stack({
required this.frames,
@@ -6974,8 +6975,8 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'frames': frames.map((f) => f.toJson()).toList(),
- 'messages': messages.map((f) => f.toJson()).toList(),
+ 'frames': frames?.map((f) => f.toJson()).toList(),
+ 'messages': messages?.map((f) => f.toJson()).toList(),
'truncated': truncated,
});
_setIfNotNull(json, 'asyncCausalFrames',
@@ -7019,13 +7020,13 @@
/// A list of timeline events. No order is guarenteed for these events; in
/// particular, these events may be unordered with respect to their
/// timestamps.
- late final List<TimelineEvent> traceEvents;
+ List<TimelineEvent>? traceEvents;
/// The start of the period of time in which traceEvents were collected.
- late final int timeOriginMicros;
+ int? timeOriginMicros;
/// The duration of time covered by the timeline.
- late final int timeExtentMicros;
+ int? timeExtentMicros;
Timeline({
required this.traceEvents,
@@ -7050,7 +7051,7 @@
final json = <String, dynamic>{};
json['type'] = type;
json.addAll({
- 'traceEvents': traceEvents.map((f) => f.toJson()).toList(),
+ 'traceEvents': traceEvents?.map((f) => f.toJson()).toList(),
'timeOriginMicros': timeOriginMicros,
'timeExtentMicros': timeExtentMicros,
});
@@ -7093,13 +7094,13 @@
/// The name of the recorder currently in use. Recorder types include, but are
/// not limited to: Callback, Endless, Fuchsia, Macos, Ring, Startup, and
/// Systrace. Set to "null" if no recorder is currently set.
- late final String recorderName;
+ String? recorderName;
/// The list of all available timeline streams.
- late final List<String> availableStreams;
+ List<String>? availableStreams;
/// The list of timeline streams that are currently enabled.
- late final List<String> recordedStreams;
+ List<String>? recordedStreams;
TimelineFlags({
required this.recorderName,
@@ -7122,8 +7123,8 @@
json['type'] = type;
json.addAll({
'recorderName': recorderName,
- 'availableStreams': availableStreams.map((f) => f).toList(),
- 'recordedStreams': recordedStreams.map((f) => f).toList(),
+ 'availableStreams': availableStreams?.map((f) => f).toList(),
+ 'recordedStreams': recordedStreams?.map((f) => f).toList(),
});
return json;
}
@@ -7138,7 +7139,7 @@
json == null ? null : Timestamp._fromJson(json);
/// A timestamp in microseconds since epoch.
- late final int timestamp;
+ int? timestamp;
Timestamp({
required this.timestamp,
@@ -7170,7 +7171,7 @@
json == null ? null : TypeArgumentsRef._fromJson(json);
/// A name for this type argument list.
- late final String name;
+ String? name;
TypeArgumentsRef({
required this.name,
@@ -7211,13 +7212,13 @@
json == null ? null : TypeArguments._fromJson(json);
/// A name for this type argument list.
- late final String name;
+ String? name;
/// A list of types.
///
/// The value will always be one of the kinds: Type, TypeRef, TypeParameter,
/// BoundedType.
- late final List<InstanceRef> types;
+ List<InstanceRef>? types;
TypeArguments({
required this.name,
@@ -7243,7 +7244,7 @@
json['type'] = type;
json.addAll({
'name': name,
- 'types': types.map((f) => f.toJson()).toList(),
+ 'types': types?.map((f) => f.toJson()).toList(),
});
return json;
}
@@ -7272,27 +7273,27 @@
/// The script containing the source location if the script has been loaded.
@optional
- late final ScriptRef? script;
+ ScriptRef? script;
/// The uri of the script containing the source location if the script has yet
/// to be loaded.
@optional
- late final String? scriptUri;
+ String? scriptUri;
/// An approximate token position for the source location. This may change
/// when the location is resolved.
@optional
- late final int? tokenPos;
+ int? tokenPos;
/// An approximate line number for the source location. This may change when
/// the location is resolved.
@optional
- late final int? line;
+ int? line;
/// An approximate column number for the source location. This may change when
/// the location is resolved.
@optional
- late final int? column;
+ int? column;
UnresolvedSourceLocation({
this.script,
@@ -7337,11 +7338,11 @@
/// The major version number is incremented when the protocol is changed in a
/// potentially incompatible way.
- late final int major;
+ int? major;
/// The minor version number is incremented when the protocol is changed in a
/// backwards compatible way.
- late final int minor;
+ int? minor;
Version({
required this.major,
@@ -7376,7 +7377,7 @@
json == null ? null : VMRef._fromJson(json);
/// A name identifying this vm. Not guaranteed to be unique.
- late final String name;
+ String? name;
VMRef({
required this.name,
@@ -7407,42 +7408,42 @@
json == null ? null : VM._fromJson(json);
/// A name identifying this vm. Not guaranteed to be unique.
- late final String name;
+ String? name;
/// Word length on target architecture (e.g. 32, 64).
- late final int architectureBits;
+ int? architectureBits;
/// The CPU we are actually running on.
- late final String hostCPU;
+ String? hostCPU;
/// The operating system we are running on.
- late final String operatingSystem;
+ String? operatingSystem;
/// The CPU we are generating code for.
- late final String targetCPU;
+ String? targetCPU;
/// The Dart VM version string.
- late final String version;
+ String? version;
/// The process id for the VM.
- late final int pid;
+ int? pid;
/// The time that the VM started in milliseconds since the epoch.
///
/// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
- late final int startTime;
+ int? startTime;
/// A list of isolates running in the VM.
- late final List<IsolateRef> isolates;
+ List<IsolateRef>? isolates;
/// A list of isolate groups running in the VM.
- late final List<IsolateGroupRef> isolateGroups;
+ List<IsolateGroupRef>? isolateGroups;
/// A list of system isolates running in the VM.
- late final List<IsolateRef> systemIsolates;
+ List<IsolateRef>? systemIsolates;
/// A list of isolate groups which contain system isolates running in the VM.
- late final List<IsolateGroupRef> systemIsolateGroups;
+ List<IsolateGroupRef>? systemIsolateGroups;
VM({
required this.name,
@@ -7500,11 +7501,11 @@
'version': version,
'pid': pid,
'startTime': startTime,
- 'isolates': isolates.map((f) => f.toJson()).toList(),
- 'isolateGroups': isolateGroups.map((f) => f.toJson()).toList(),
- 'systemIsolates': systemIsolates.map((f) => f.toJson()).toList(),
+ 'isolates': isolates?.map((f) => f.toJson()).toList(),
+ 'isolateGroups': isolateGroups?.map((f) => f.toJson()).toList(),
+ 'systemIsolates': systemIsolates?.map((f) => f.toJson()).toList(),
'systemIsolateGroups':
- systemIsolateGroups.map((f) => f.toJson()).toList(),
+ systemIsolateGroups?.map((f) => f.toJson()).toList(),
});
return json;
}
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index e4ff937..77a68c4 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -3,7 +3,7 @@
A library to communicate with a service implementing the Dart VM
service protocol.
-version: 6.0.0-nullsafety-dev
+version: 6.0.0-nullsafety.1
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
diff --git a/pkg/vm_service/test/async_generator_breakpoint_test.dart b/pkg/vm_service/test/async_generator_breakpoint_test.dart
index d6e8e65..d4c20a7 100644
--- a/pkg/vm_service/test/async_generator_breakpoint_test.dart
+++ b/pkg/vm_service/test/async_generator_breakpoint_test.dart
@@ -46,28 +46,30 @@
}
Future testAsync(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
final Library lib =
- (await service.getObject(isolate.id, isolate.rootLib!.id)) as Library;
- final script = lib.scripts[0];
+ (await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
+ final script = lib.scripts![0];
+ final scriptId = script.id!;
- final bp1 = await service.addBreakpoint(isolate.id, script.id, 11);
+ final bp1 = await service.addBreakpoint(isolateId, scriptId, 11);
expect(bp1, isNotNull);
expect(bp1 is Breakpoint, isTrue);
- final bp2 = await service.addBreakpoint(isolate.id, script.id, 16);
+ final bp2 = await service.addBreakpoint(isolateId, scriptId, 16);
expect(bp2, isNotNull);
expect(bp2 is Breakpoint, isTrue);
- final bp3 = await service.addBreakpoint(isolate.id, script.id, 21);
+ final bp3 = await service.addBreakpoint(isolateId, scriptId, 21);
expect(bp3, isNotNull);
expect(bp3 is Breakpoint, isTrue);
- final bp4 = await service.addBreakpoint(isolate.id, script.id, 25);
+ final bp4 = await service.addBreakpoint(isolateId, scriptId, 25);
expect(bp4, isNotNull);
expect(bp4 is Breakpoint, isTrue);
- final bp5 = await service.addBreakpoint(isolate.id, script.id, 42);
+ final bp5 = await service.addBreakpoint(isolateId, scriptId, 42);
expect(bp5, isNotNull);
expect(bp5 is Breakpoint, isTrue);
@@ -76,9 +78,9 @@
// ignore: unawaited_futures
service
- .evaluate(isolate.id, lib.id, 'testerReady = true')
+ .evaluate(isolateId, lib.id!, 'testerReady = true')
.then((Response result) async {
- Obj res = await service.getObject(isolate.id, (result as InstanceRef).id);
+ Obj res = await service.getObject(isolateId, (result as InstanceRef).id!);
print(res);
expect((res as Instance).valueAsString, equals('true'));
});
@@ -89,7 +91,7 @@
assert(event.pauseBreakpoints!.isNotEmpty);
final bp = event.pauseBreakpoints!.first;
hits.add(bp);
- await service.resume(isolate.id);
+ await service.resume(isolateId);
if (hits.length == 5) break;
}
diff --git a/pkg/vm_service/test/async_scope_test.dart b/pkg/vm_service/test/async_scope_test.dart
index 4304553..5b8d262 100644
--- a/pkg/vm_service/test/async_scope_test.dart
+++ b/pkg/vm_service/test/async_scope_test.dart
@@ -35,18 +35,20 @@
Future<void> checkAsyncVarDescriptors(
VmService? service, IsolateRef? isolateRef) async {
- final stack = await service!.getStack(isolateRef!.id);
- expect(stack.frames.length, greaterThanOrEqualTo(1));
- final frame = stack.frames[0];
+ final isolateId = isolateRef!.id!;
+ final stack = await service!.getStack(isolateId);
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
+ final frame = stack.frames![0];
final vars = frame.vars!.map((v) => v.name).join(' ');
expect(vars, 'param1 local1'); // no :async_op et al
}
Future checkAsyncStarVarDescriptors(
VmService? service, IsolateRef? isolateRef) async {
- final stack = await service!.getStack(isolateRef!.id);
- expect(stack.frames.length, greaterThanOrEqualTo(1));
- final frame = stack.frames[0];
+ final isolateId = isolateRef!.id!;
+ final stack = await service!.getStack(isolateId);
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
+ final frame = stack.frames![0];
final vars = frame.vars!.map((v) => v.name).join(' ');
expect(vars, 'param2 local2'); // no :async_op et al
}
diff --git a/pkg/vm_service/test/common/service_test_common.dart b/pkg/vm_service/test/common/service_test_common.dart
index e54d930..8277753 100644
--- a/pkg/vm_service/test/common/service_test_common.dart
+++ b/pkg/vm_service/test/common/service_test_common.dart
@@ -14,9 +14,9 @@
Future<void> smartNext(VmService service, IsolateRef isolateRef) async {
print('smartNext');
- final isolate = await service.getIsolate(isolateRef.id);
- if ((isolate.pauseEvent.kind == EventKind.kPauseBreakpoint)) {
- Event event = isolate.pauseEvent;
+ final isolate = await service.getIsolate(isolateRef.id!);
+ Event event = isolate.pauseEvent!;
+ if ((event.kind == EventKind.kPauseBreakpoint)) {
// TODO(bkonyi): remove needless refetching of isolate object.
if (event.atAsyncSuspension ?? false) {
return asyncNext(service, isolateRef);
@@ -30,13 +30,15 @@
Future<void> asyncNext(VmService service, IsolateRef isolateRef) async {
print('asyncNext');
- final isolate = await service.getIsolate(isolateRef.id);
- if ((isolate.pauseEvent.kind == EventKind.kPauseBreakpoint)) {
+ final id = isolateRef.id!;
+ final isolate = await service.getIsolate(id);
+ final event = isolate.pauseEvent!;
+ if ((event.kind == EventKind.kPauseBreakpoint)) {
dynamic event = isolate.pauseEvent;
if (!event.atAsyncSuspension) {
throw 'No async continuation at this location';
} else {
- await service.resume(isolateRef.id, step: 'OverAsyncSuspension');
+ await service.resume(id, step: 'OverAsyncSuspension');
}
} else {
throw 'The program is already running';
@@ -45,9 +47,11 @@
Future<void> syncNext(VmService service, IsolateRef isolateRef) async {
print('syncNext');
- final isolate = await service.getIsolate(isolateRef.id);
- if ((isolate.pauseEvent.kind == EventKind.kPauseBreakpoint)) {
- await service.resume(isolate.id, step: 'Over');
+ final id = isolateRef.id!;
+ final isolate = await service.getIsolate(id);
+ final event = isolate.pauseEvent!;
+ if ((event.kind == EventKind.kPauseBreakpoint)) {
+ await service.resume(id, step: 'Over');
} else {
throw 'The program is already running';
}
@@ -74,8 +78,10 @@
await _subscribeDebugStream(service);
// Pause may have happened before we subscribed.
- final isolate = await service.getIsolate(isolateRef.id);
- if ((isolate.pauseEvent.kind == kind)) {
+ final id = isolateRef.id!;
+ final isolate = await service.getIsolate(id);
+ final event = isolate.pauseEvent!;
+ if ((event.kind == kind)) {
if (completer != null) {
try {
await service.streamCancel(EventStreams.kDebug);
@@ -113,12 +119,13 @@
IsolateTest setBreakpointAtLine(int line) {
return (VmService service, IsolateRef isolateRef) async {
print("Setting breakpoint for line $line");
- final isolate = await service.getIsolate(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
final Library lib =
- (await service.getObject(isolate.id, isolate.rootLib!.id)) as Library;
- final script = lib.scripts.first;
+ (await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
+ final script = lib.scripts!.first;
- Breakpoint bpt = await service.addBreakpoint(isolate.id, script.id, line);
+ Breakpoint bpt = await service.addBreakpoint(isolateId, script.id!, line);
print("Breakpoint is $bpt");
};
}
@@ -128,26 +135,28 @@
print("Checking we are at line $line");
// Make sure that the isolate has stopped.
- final isolate = await service.getIsolate(isolateRef.id);
- expect(isolate.pauseEvent.kind != EventKind.kResume, isTrue);
+ final id = isolateRef.id!;
+ final isolate = await service.getIsolate(id);
+ final event = isolate.pauseEvent!;
+ expect(event.kind != EventKind.kResume, isTrue);
- final stack = await service.getStack(isolateRef.id);
+ final stack = await service.getStack(id);
- final frames = stack.frames;
+ final frames = stack.frames!;
expect(frames.length, greaterThanOrEqualTo(1));
final top = frames[0];
- final Script script = (await service.getObject(
- isolate.id, top.location!.script.id)) as Script;
- int actualLine = script.getLineNumberFromTokenPos(top.location!.tokenPos)!;
+ final Script script =
+ (await service.getObject(id, top.location!.script!.id!)) as Script;
+ int actualLine = script.getLineNumberFromTokenPos(top.location!.tokenPos!)!;
if (actualLine != line) {
print("Actual: $actualLine Line: $line");
final sb = StringBuffer();
sb.write("Expected to be at line $line but actually at line $actualLine");
sb.write("\nFull stack trace:\n");
- for (Frame f in stack.frames) {
+ for (Frame f in frames) {
sb.write(
- " $f [${script.getLineNumberFromTokenPos(f.location!.tokenPos)}]\n");
+ " $f [${script.getLineNumberFromTokenPos(f.location!.tokenPos!)}]\n");
}
throw sb.toString();
} else {
@@ -170,7 +179,7 @@
}
});
await service.streamListen(EventStreams.kDebug);
- await service.resume(isolate.id);
+ await service.resume(isolate.id!);
return completer.future;
}
@@ -193,21 +202,21 @@
Future<void> stepOver(VmService service, IsolateRef isolateRef) async {
await service.streamListen(EventStreams.kDebug);
await _subscribeDebugStream(service);
- await service.resume(isolateRef.id, step: 'Over');
+ await service.resume(isolateRef.id!, step: 'Over');
await hasStoppedAtBreakpoint(service, isolateRef);
await _unsubscribeDebugStream(service);
}
Future<void> stepInto(VmService service, IsolateRef isolateRef) async {
await _subscribeDebugStream(service);
- await service.resume(isolateRef.id, step: 'Into');
+ await service.resume(isolateRef.id!, step: 'Into');
await hasStoppedAtBreakpoint(service, isolateRef);
await _unsubscribeDebugStream(service);
}
Future<void> stepOut(VmService service, IsolateRef isolateRef) async {
await _subscribeDebugStream(service);
- await service.resume(isolateRef.id, step: 'Out');
+ await service.resume(isolateRef.id!, step: 'Out');
await hasStoppedAtBreakpoint(service, isolateRef);
await _unsubscribeDebugStream(service);
}
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index 72ae563..634ec64 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -311,9 +311,9 @@
Future<IsolateRef> getFirstIsolate(VmService service) async {
var vm = await service.getVM();
-
- if (vm.isolates.isNotEmpty) {
- return vm.isolates.first;
+ final vmIsolates = vm.isolates!;
+ if (vmIsolates.isNotEmpty) {
+ return vmIsolates.first;
}
Completer<dynamic>? completer = Completer();
late StreamSubscription subscription;
@@ -324,18 +324,18 @@
}
if (event.kind == EventKind.kIsolateRunnable) {
vm = await service.getVM();
- assert(vm.isolates.isNotEmpty);
+ assert(vmIsolates.isNotEmpty);
await subscription.cancel();
- completer!.complete(vm.isolates.first);
+ completer!.complete(vmIsolates.first);
completer = null;
}
});
// The isolate may have started before we subscribed.
vm = await service.getVM();
- if (vm.isolates.isNotEmpty) {
+ if (vmIsolates.isNotEmpty) {
await subscription.cancel();
- completer!.complete(vm.isolates.first);
+ completer!.complete(vmIsolates.first);
completer = null;
}
return await (completer!.future as FutureOr<IsolateRef>);
diff --git a/pkg/vm_service/test/coverage_leaf_function_test.dart b/pkg/vm_service/test/coverage_leaf_function_test.dart
index 42cd1a0..1e5146f 100644
--- a/pkg/vm_service/test/coverage_leaf_function_test.dart
+++ b/pkg/vm_service/test/coverage_leaf_function_test.dart
@@ -30,18 +30,19 @@
var tests = <IsolateTest>[
hasStoppedAtBreakpoint,
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
- final stack = await service.getStack(isolate.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
+ final stack = await service.getStack(isolateId);
// Make sure we are in the right place.
- expect(stack.frames.length, greaterThanOrEqualTo(1));
- expect(stack.frames[0].function!.name, 'testFunction');
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
+ expect(stack.frames![0].function!.name, 'testFunction');
final Library root =
- await service.getObject(isolate.id, isolate.rootLib!.id) as Library;
+ await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
FuncRef funcRef =
- root.functions.singleWhere((f) => f.name == 'leafFunction');
- Func func = await service.getObject(isolate.id, funcRef.id) as Func;
+ root.functions!.singleWhere((f) => f.name == 'leafFunction');
+ Func func = await service.getObject(isolateId, funcRef.id!) as Func;
final expectedRange = {
'scriptIndex': 0,
@@ -56,31 +57,33 @@
final location = func.location!;
final report = await service.getSourceReport(
- isolate.id, [SourceReportKind.kCoverage],
- scriptId: location.script.id,
+ isolateId, [SourceReportKind.kCoverage],
+ scriptId: location.script!.id,
tokenPos: location.tokenPos,
endTokenPos: location.endTokenPos,
forceCompile: true);
- expect(report.ranges.length, 1);
- expect(report.ranges[0].toJson(), expectedRange);
- expect(report.scripts.length, 1);
- expect(report.scripts[0].uri, endsWith('coverage_leaf_function_test.dart'));
+ expect(report.ranges!.length, 1);
+ expect(report.ranges![0].toJson(), expectedRange);
+ expect(report.scripts!.length, 1);
+ expect(
+ report.scripts![0].uri, endsWith('coverage_leaf_function_test.dart'));
},
resumeIsolate,
hasStoppedAtBreakpoint,
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
- final stack = await service.getStack(isolate.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
+ final stack = await service.getStack(isolateId);
// Make sure we are in the right place.
- expect(stack.frames.length, greaterThanOrEqualTo(1));
- expect(stack.frames[0].function!.name, 'testFunction');
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
+ expect(stack.frames![0].function!.name, 'testFunction');
final Library root =
- await service.getObject(isolate.id, isolate.rootLib!.id) as Library;
+ await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
FuncRef funcRef =
- root.functions.singleWhere((f) => f.name == 'leafFunction');
- Func func = await service.getObject(isolate.id, funcRef.id) as Func;
+ root.functions!.singleWhere((f) => f.name == 'leafFunction');
+ Func func = await service.getObject(isolateId, funcRef.id!) as Func;
var expectedRange = {
'scriptIndex': 0,
@@ -95,15 +98,16 @@
final location = func.location!;
final report = await service.getSourceReport(
- isolate.id, [SourceReportKind.kCoverage],
- scriptId: location.script.id,
+ isolateId, [SourceReportKind.kCoverage],
+ scriptId: location.script!.id,
tokenPos: location.tokenPos,
endTokenPos: location.endTokenPos,
forceCompile: true);
- expect(report.ranges.length, 1);
- expect(report.ranges[0].toJson(), expectedRange);
- expect(report.scripts.length, 1);
- expect(report.scripts[0].uri, endsWith('coverage_leaf_function_test.dart'));
+ expect(report.ranges!.length, 1);
+ expect(report.ranges![0].toJson(), expectedRange);
+ expect(report.scripts!.length, 1);
+ expect(
+ report.scripts![0].uri, endsWith('coverage_leaf_function_test.dart'));
},
];
diff --git a/pkg/vm_service/test/debugging_test.dart b/pkg/vm_service/test/debugging_test.dart
index 068af19..615dfc2 100644
--- a/pkg/vm_service/test/debugging_test.dart
+++ b/pkg/vm_service/test/debugging_test.dart
@@ -30,6 +30,7 @@
var tests = <IsolateTest>[
// Pause
(VmService? service, IsolateRef? isolateRef) async {
+ final isolateId = isolateRef!.id!;
Completer completer = Completer();
var stream = service!.onDebugEvent;
late var subscription;
@@ -40,13 +41,14 @@
}
});
await service.streamListen(EventStreams.kDebug);
- await service.pause(isolateRef!.id);
+ await service.pause(isolateId);
await completer.future;
await service.streamCancel(EventStreams.kDebug);
},
// Resume
(VmService service, IsolateRef isolate) async {
+ final isolateId = isolate.id!;
Completer completer = Completer();
var stream = service.onDebugEvent;
late var subscription;
@@ -57,16 +59,17 @@
}
});
await service.streamListen(EventStreams.kDebug);
- await service.resume(isolate.id);
+ await service.resume(isolateId);
await completer.future;
await service.streamCancel(EventStreams.kDebug);
},
// Add breakpoint
(VmService service, IsolateRef isolateRef) async {
- Isolate isolate = await service.getIsolate(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ Isolate isolate = await service.getIsolate(isolateId);
final Library rootLib =
- (await service.getObject(isolate.id, isolate.rootLib!.id)) as Library;
+ (await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
// Set up a listener to wait for breakpoint events.
Completer completer = Completer();
@@ -81,29 +84,31 @@
});
await service.streamListen(EventStreams.kDebug);
final Script script = (await service.getObject(
- isolate.id, rootLib.scripts.first.id)) as Script;
+ isolateId, rootLib.scripts!.first.id!)) as Script;
// Add the breakpoint.
final Breakpoint bpt =
- await service.addBreakpoint(isolate.id, script.id, 16);
+ await service.addBreakpoint(isolateId, script.id!, 16);
final SourceLocation location = bpt.location;
- expect(location.script.id, script.id);
- expect(script.getLineNumberFromTokenPos(location.tokenPos), 16);
+ expect(location.script!.id, script.id);
+ expect(script.getLineNumberFromTokenPos(location.tokenPos!), 16);
- isolate = await service.getIsolate(isolate.id);
- expect(isolate.breakpoints.length, 1);
+ isolate = await service.getIsolate(isolateId);
+ expect(isolate.breakpoints!.length, 1);
await completer.future; // Wait for breakpoint events.
await service.streamCancel(EventStreams.kDebug);
},
// We are at the breakpoint on line 16.
(VmService service, IsolateRef isolateRef) async {
- final stack = await service.getStack(isolateRef.id);
- expect(stack.frames.length, greaterThanOrEqualTo(1));
+ final isolateId = isolateRef.id!;
+ final stack = await service.getStack(isolateId);
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
Script script = (await service.getObject(
- isolateRef.id, stack.frames[0].location!.script.id)) as Script;
+ isolateId, stack.frames![0].location!.script!.id!)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
- expect(script.getLineNumberFromTokenPos(stack.frames[0].location!.tokenPos),
+ expect(
+ script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
16);
},
@@ -128,17 +133,20 @@
},
// We are now at line 17.
(VmService service, IsolateRef isolateRef) async {
- final stack = await service.getStack(isolateRef.id);
- expect(stack.frames.length, greaterThanOrEqualTo(1));
+ final isolateId = isolateRef.id!;
+ final stack = await service.getStack(isolateId);
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
final Script script = (await service.getObject(
- isolateRef.id, stack.frames[0].location!.script.id)) as Script;
+ isolateId, stack.frames![0].location!.script!.id!)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
- expect(script.getLineNumberFromTokenPos(stack.frames[0].location!.tokenPos),
+ expect(
+ script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
17);
},
// Remove breakpoint
(VmService service, IsolateRef isolateRef) async {
+ final isolateId = isolateRef.id!;
// Set up a listener to wait for breakpoint events.
final completer = Completer();
var stream = service.onDebugEvent;
@@ -146,18 +154,18 @@
subscription = stream.listen((Event event) async {
if (event.kind == EventKind.kBreakpointRemoved) {
print('Breakpoint removed');
- final isolate = await service.getIsolate(isolateRef.id);
- expect(isolate.breakpoints.length, 0);
+ final isolate = await service.getIsolate(isolateId);
+ expect(isolate.breakpoints!.length, 0);
subscription.cancel();
completer.complete();
}
});
- final Isolate isolate = await service.getIsolate(isolateRef.id);
- expect(isolate.breakpoints.length, 1);
- final bpt = isolate.breakpoints.first;
+ final Isolate isolate = await service.getIsolate(isolateId);
+ expect(isolate.breakpoints!.length, 1);
+ final bpt = isolate.breakpoints!.first;
await service.streamListen(EventStreams.kDebug);
- await service.removeBreakpoint(isolate.id, bpt.id);
+ await service.removeBreakpoint(isolateId, bpt.id!);
await completer.future;
await service.streamCancel(EventStreams.kDebug);
},
@@ -177,7 +185,8 @@
},
// Add breakpoint at function entry
(VmService service, IsolateRef isolateRef) async {
- Isolate isolate = await service.getIsolate(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ Isolate isolate = await service.getIsolate(isolateId);
// Set up a listener to wait for breakpoint events.
final completer = Completer();
var stream = service.onDebugEvent;
@@ -192,35 +201,37 @@
await service.streamListen(EventStreams.kDebug);
final Library rootLib =
- (await service.getObject(isolate.id, isolate.rootLib!.id)) as Library;
+ (await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
// Find a specific function.
final FuncRef function =
- rootLib.functions.firstWhere((f) => f.name == 'periodicTask');
+ rootLib.functions!.firstWhere((f) => f.name == 'periodicTask');
expect(function, isNotNull);
// Add the breakpoint at function entry
- final bpt = await service.addBreakpointAtEntry(isolate.id, function.id);
+ final bpt = await service.addBreakpointAtEntry(isolateId, function.id!);
final Script script =
- (await service.getObject(isolate.id, bpt.location.script.id)) as Script;
+ (await service.getObject(isolateId, bpt.location.script.id)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
expect(script.getLineNumberFromTokenPos(bpt.location.tokenPos), 14);
// Refresh isolate state.
- isolate = await service.getIsolate(isolate.id);
- expect(isolate.breakpoints.length, 1);
+ isolate = await service.getIsolate(isolateId);
+ expect(isolate.breakpoints!.length, 1);
await completer.future; // Wait for breakpoint events.
},
// We are now at line 14.
(VmService service, IsolateRef isolateRef) async {
- final stack = await service.getStack(isolateRef.id);
- expect(stack.frames.length, greaterThanOrEqualTo(1));
+ final isolateId = isolateRef.id!;
+ final stack = await service.getStack(isolateId);
+ expect(stack.frames!.length, greaterThanOrEqualTo(1));
final Script script = (await service.getObject(
- isolateRef.id, stack.frames[0].location!.script.id)) as Script;
+ isolateId, stack.frames![0].location!.script!.id!)) as Script;
expect(script.uri, endsWith('debugging_test.dart'));
- expect(script.getLineNumberFromTokenPos(stack.frames[0].location!.tokenPos),
+ expect(
+ script.getLineNumberFromTokenPos(stack.frames![0].location!.tokenPos!),
14);
},
];
diff --git a/pkg/vm_service/test/eval_test.dart b/pkg/vm_service/test/eval_test.dart
index 031b1a9e..5be029f 100644
--- a/pkg/vm_service/test/eval_test.dart
+++ b/pkg/vm_service/test/eval_test.dart
@@ -39,54 +39,56 @@
// Evaluate against library, class, and instance.
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
- final stack = await service.getStack(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
+ final stack = await service.getStack(isolateId);
// Make sure we are in the right place.
- expect(stack.frames.length, greaterThanOrEqualTo(2));
- expect(stack.frames[0].function!.name, 'method');
- expect((stack.frames[0].function!.owner as ClassRef).name, 'MyClass');
+ expect(stack.frames!.length, greaterThanOrEqualTo(2));
+ expect(stack.frames![0].function!.name, 'method');
+ expect((stack.frames![0].function!.owner as ClassRef).name, 'MyClass');
final LibraryRef lib = isolate.rootLib!;
- final ClassRef cls = stack.frames[0].function!.owner;
- final InstanceRef instance = stack.frames[0].vars![0].value;
+ final ClassRef cls = stack.frames![0].function!.owner;
+ final InstanceRef instance = stack.frames![0].vars![0].value;
dynamic result =
- await service.evaluate(isolate.id, lib.id, 'globalVar + 5');
+ await service.evaluate(isolateId, lib.id!, 'globalVar + 5');
print(result);
expect(result.valueAsString, '105');
await expectError(() =>
- service.evaluate(isolate.id, lib.id, 'globalVar + staticVar + 5'));
+ service.evaluate(isolateId, lib.id!, 'globalVar + staticVar + 5'));
result =
- await service.evaluate(isolate.id, cls.id, 'globalVar + staticVar + 5');
+ await service.evaluate(isolateId, cls.id!, 'globalVar + staticVar + 5');
print(result);
expect(result.valueAsString, '1105');
- await expectError(() => service.evaluate(isolate.id, cls.id, 'this + 5'));
+ await expectError(() => service.evaluate(isolateId, cls.id!, 'this + 5'));
- result = await service.evaluate(isolate.id, instance.id, 'this + 5');
+ result = await service.evaluate(isolateId, instance.id!, 'this + 5');
print(result);
expect(result.valueAsString, '10005');
await expectError(
- () => service.evaluate(isolate.id, instance.id, 'this + frog'));
+ () => service.evaluate(isolateId, instance.id!, 'this + frog'));
},
resumeIsolate,
hasStoppedAtBreakpoint,
(VmService service, IsolateRef isolate) async {
- final stack = await service.getStack(isolate.id);
+ final isolateId = isolate.id!;
+ final stack = await service.getStack(isolateId);
// Make sure we are in the right place.
- expect(stack.frames.length, greaterThanOrEqualTo(2));
- expect(stack.frames[0].function!.name, 'foo');
- expect((stack.frames[0].function!.owner as ClassRef).name, '_MyClass');
+ expect(stack.frames!.length, greaterThanOrEqualTo(2));
+ expect(stack.frames![0].function!.name, 'foo');
+ expect((stack.frames![0].function!.owner as ClassRef).name, '_MyClass');
- final ClassRef cls = stack.frames[0].function!.owner;
+ final ClassRef cls = stack.frames![0].function!.owner;
final InstanceRef result =
- await service.evaluate(isolate.id, cls.id, "1+1") as InstanceRef;
+ await service.evaluate(isolateId, cls.id!, "1+1") as InstanceRef;
print(result);
expect(result.valueAsString, "2");
}
diff --git a/pkg/vm_service/test/evaluate_with_scope_test.dart b/pkg/vm_service/test/evaluate_with_scope_test.dart
index 4d04f7c..54e8979 100644
--- a/pkg/vm_service/test/evaluate_with_scope_test.dart
+++ b/pkg/vm_service/test/evaluate_with_scope_test.dart
@@ -14,24 +14,26 @@
thing2 = 4;
}
-Future evaluate(VmService service, isolate, target, x, y) async => await service
- .evaluate(isolate.id, target.id, 'x + y', scope: {'x': x.id, 'y': y.id});
+Future evaluate(VmService service, isolate, target, x, y) async =>
+ await service.evaluate(isolate!.id!!, target.id!, 'x + y',
+ scope: {'x': x.id!, 'y': y.id!});
final tests = <IsolateTest>[
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
final Library lib =
- (await service.getObject(isolate.id, isolate.rootLib!.id)) as Library;
+ (await service.getObject(isolateId, isolate.rootLib!.id!)) as Library;
- final Field field1 = (await service.getObject(isolate.id,
- lib.variables.singleWhere((v) => v.name == 'thing1').id)) as Field;
+ final Field field1 = (await service.getObject(isolateId,
+ lib.variables!.singleWhere((v) => v.name == 'thing1').id!)) as Field;
final thing1 =
- (await service.getObject(isolate.id, field1.staticValue!.id));
+ (await service.getObject(isolateId, field1.staticValue!.id!));
- final Field field2 = (await service.getObject(isolate.id,
- lib.variables.singleWhere((v) => v.name == 'thing2').id)) as Field;
+ final Field field2 = (await service.getObject(isolateId,
+ lib.variables!.singleWhere((v) => v.name == 'thing2').id!)) as Field;
final thing2 =
- (await service.getObject(isolate.id, field2.staticValue!.id));
+ (await service.getObject(isolateId, field2.staticValue!.id!));
var result = await evaluate(service, isolate, lib, thing1, thing2);
expect(result.valueAsString, equals('7'));
@@ -49,8 +51,8 @@
didThrow = false;
try {
- result = await service.evaluate(isolate.id, lib.id, "x + y",
- scope: <String, String>{"not&an&identifier": thing1.id});
+ result = await service.evaluate(isolateId, lib.id!, "x + y",
+ scope: <String, String>{"not&an&id!entifier": thing1.id!});
print(result);
} catch (e) {
didThrow = true;
diff --git a/pkg/vm_service/test/file_service_test.dart b/pkg/vm_service/test/file_service_test.dart
index c74fdae..045ba1e 100644
--- a/pkg/vm_service/test/file_service_test.dart
+++ b/pkg/vm_service/test/file_service_test.dart
@@ -71,16 +71,17 @@
var fileTests = <IsolateTest>[
(VmService service, IsolateRef isolate) async {
+ final isolateId = isolate.id!;
await service.callServiceExtension(
'ext.dart.io.setup',
isolateId: isolate.id,
);
try {
- final result = await service.getOpenFiles(isolate.id);
+ final result = await service.getOpenFiles(isolateId);
expect(result, isA<OpenFileList>());
expect(result.files.length, equals(2));
final writing = await service.getOpenFileById(
- isolate.id,
+ isolateId,
result.files[0].id,
);
@@ -92,7 +93,7 @@
expect(writing.lastReadTime.millisecondsSinceEpoch, 0);
final reading = await service.getOpenFileById(
- isolate.id,
+ isolateId,
result.files[1].id,
);
expect(reading.readBytes, 5);
diff --git a/pkg/vm_service/test/get_allocation_profile_rpc_test.dart b/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
index c4540e5..4ce9675 100644
--- a/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
+++ b/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
@@ -12,25 +12,27 @@
var tests = <IsolateTest>[
(VmService service, IsolateRef isolate) async {
- AllocationProfile result = await service.getAllocationProfile(isolate.id);
+ final isolateId = isolate.id!;
+
+ AllocationProfile result = await service.getAllocationProfile(isolateId);
expect(result.dateLastAccumulatorReset, isNull);
expect(result.dateLastServiceGC, isNull);
- expect(result.members.length, isPositive);
+ expect(result.members!.length, isPositive);
- ClassHeapStats member = result.members[0];
+ ClassHeapStats member = result.members![0];
expect(member.instancesAccumulated, isNotNull);
expect(member.instancesCurrent, isNotNull);
expect(member.bytesCurrent, isNotNull);
expect(member.accumulatedSize, isNotNull);
// reset.
- result = await service.getAllocationProfile(isolate.id, reset: true);
+ result = await service.getAllocationProfile(isolateId, reset: true);
final firstReset = result.dateLastAccumulatorReset;
expect(firstReset, isNotNull);
expect(result.dateLastServiceGC, isNull);
- expect(result.members.length, isPositive);
+ expect(result.members!.length, isPositive);
- member = result.members[0];
+ member = result.members![0];
expect(member.instancesAccumulated, isNotNull);
expect(member.instancesCurrent, isNotNull);
expect(member.bytesCurrent, isNotNull);
@@ -38,18 +40,18 @@
await sleep(1000);
- result = await service.getAllocationProfile(isolate.id, reset: true);
+ result = await service.getAllocationProfile(isolateId, reset: true);
final secondReset = result.dateLastAccumulatorReset;
expect(secondReset, isNot(firstReset));
// gc.
- result = await service.getAllocationProfile(isolate.id, gc: true);
+ result = await service.getAllocationProfile(isolateId, gc: true);
expect(result.dateLastAccumulatorReset, secondReset);
final firstGC = result.dateLastServiceGC;
expect(firstGC, isNotNull);
- expect(result.members.length, isPositive);
+ expect(result.members!.length, isPositive);
- member = result.members[0];
+ member = result.members![0];
expect(member.instancesAccumulated, isNotNull);
expect(member.instancesCurrent, isNotNull);
expect(member.bytesCurrent, isNotNull);
@@ -57,7 +59,7 @@
await sleep(1000);
- result = await service.getAllocationProfile(isolate.id, gc: true);
+ result = await service.getAllocationProfile(isolateId, gc: true);
final secondGC = result.dateLastAccumulatorReset;
expect(secondGC, isNot(firstGC));
},
diff --git a/pkg/vm_service/test/get_cpu_samples_rpc_test.dart b/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
index 321a01c..95d8c85 100644
--- a/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
+++ b/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
@@ -22,15 +22,16 @@
Future checkSamples(VmService service, IsolateRef isolate) async {
// Grab all the samples.
- final result = await service.getCpuSamples(isolate.id, 0, ~0);
+ final isolateId = isolate.id!;
+ final result = await service.getCpuSamples(isolateId, 0, ~0);
final isString = TypeMatcher<String>();
final isInt = TypeMatcher<int>();
final isList = TypeMatcher<List>();
- expect(result.functions.length, greaterThan(10),
- reason: "Should have many functions");
+ expect(result.functions!.length, greaterThan(10),
+ reason: "Should have many functions!");
- final samples = result.samples;
+ final samples = result.samples!;
expect(samples.length, greaterThan(10), reason: "Should have many samples");
expect(samples.length, result.sampleCount);
diff --git a/pkg/vm_service/test/get_flag_list_rpc_test.dart b/pkg/vm_service/test/get_flag_list_rpc_test.dart
index 791687d..1fba955 100644
--- a/pkg/vm_service/test/get_flag_list_rpc_test.dart
+++ b/pkg/vm_service/test/get_flag_list_rpc_test.dart
@@ -11,7 +11,7 @@
Future getFlagValue(VmService service, String flagName) async {
final result = await service.getFlagList();
- final flags = result.flags;
+ final flags = result.flags!;
for (final flag in flags) {
if (flag.name == flagName) {
return flag.valueAsString;
diff --git a/pkg/vm_service/test/get_isolate_group_memory_usage.dart b/pkg/vm_service/test/get_isolate_group_memory_usage.dart
index c59608a..6ab44e5 100644
--- a/pkg/vm_service/test/get_isolate_group_memory_usage.dart
+++ b/pkg/vm_service/test/get_isolate_group_memory_usage.dart
@@ -11,7 +11,7 @@
(VmService service) async {
final vm = await service.getVM();
final result =
- await service.getIsolateGroupMemoryUsage(vm.isolateGroups.first.id);
+ await service.getIsolateGroupMemoryUsage(vm.isolateGroups!.first.id!);
expect(result.heapUsage, isPositive);
expect(result.heapCapacity, isPositive);
expect(result.externalUsage, isNonNegative);
diff --git a/pkg/vm_service/test/get_isolate_rpc_test.dart b/pkg/vm_service/test/get_isolate_rpc_test.dart
index bb7dfed..29e3d7a 100644
--- a/pkg/vm_service/test/get_isolate_rpc_test.dart
+++ b/pkg/vm_service/test/get_isolate_rpc_test.dart
@@ -10,22 +10,22 @@
var tests = <VMTest>[
(VmService service) async {
final vm = await service.getVM();
- final result = await service.getIsolate(vm.isolates.first.id);
+ final result = await service.getIsolate(vm.isolates!.first.id!);
expect(result.id, startsWith('isolates/'));
expect(result.number, isNotNull);
expect(result.isolateFlags, isNotNull);
- expect(result.isolateFlags.length, isPositive);
+ expect(result.isolateFlags!.length, isPositive);
expect(result.isSystemIsolate, isFalse);
expect(result.json!['_originNumber'], result.number);
expect(result.startTime, isPositive);
expect(result.livePorts, isPositive);
expect(result.pauseOnExit, isFalse);
- expect(result.pauseEvent.type, 'Event');
+ expect(result.pauseEvent!.type, 'Event');
expect(result.error, isNull);
expect(result.rootLib, isNotNull);
- expect(result.libraries.length, isPositive);
- expect(result.libraries[0], isNotNull);
- expect(result.breakpoints.length, isZero);
+ expect(result.libraries!.length, isPositive);
+ expect(result.libraries![0], isNotNull);
+ expect(result.breakpoints!.length, isZero);
expect(result.json!['_heaps']['new']['type'], 'HeapSpace');
expect(result.json!['_heaps']['old']['type'], 'HeapSpace');
},
diff --git a/pkg/vm_service/test/get_memory_usage.dart b/pkg/vm_service/test/get_memory_usage.dart
index b6adbef..9325f59 100644
--- a/pkg/vm_service/test/get_memory_usage.dart
+++ b/pkg/vm_service/test/get_memory_usage.dart
@@ -10,7 +10,7 @@
var tests = <VMTest>[
(VmService service) async {
final vm = await service.getVM();
- final result = await service.getMemoryUsage(vm.isolates.first.id);
+ final result = await service.getMemoryUsage(vm.isolates!.first.id!);
expect(result.heapUsage, isPositive);
expect(result.heapCapacity, isPositive);
expect(result.externalUsage, isPositive);
diff --git a/pkg/vm_service/test/get_stack_test.dart b/pkg/vm_service/test/get_stack_test.dart
index 2cd0f93..f1ba6f1 100644
--- a/pkg/vm_service/test/get_stack_test.dart
+++ b/pkg/vm_service/test/get_stack_test.dart
@@ -52,12 +52,11 @@
// Before the first await.
hasStoppedAtBreakpoint,
stoppedAtLine(LINE_A),
- // At LINE_A we're still running sync. so no asyncCausalFrames.
(VmService service, IsolateRef isolateRef) async {
- final result = await service.getStack(isolateRef.id);
+ final result = await service.getStack(isolateRef.id!);
expect(result.frames, hasLength(16));
- expect(result.asyncCausalFrames, isNull);
+ expect(result.asyncCausalFrames, hasLength(16));
expect(result.awaiterFrames, hasLength(16));
expectFrames(result.frames, [
@@ -74,6 +73,20 @@
[equals('Regular'), endsWith(' testMain')],
]);
+ expectFrames(result.asyncCausalFrames, [
+ [equals('Regular'), endsWith(' func10')],
+ [equals('Regular'), endsWith(' func9')],
+ [equals('Regular'), endsWith(' func8')],
+ [equals('Regular'), endsWith(' func7')],
+ [equals('Regular'), endsWith(' func6')],
+ [equals('Regular'), endsWith(' func5')],
+ [equals('Regular'), endsWith(' func4')],
+ [equals('Regular'), endsWith(' func3')],
+ [equals('Regular'), endsWith(' func2')],
+ [equals('Regular'), endsWith(' func1')],
+ [equals('Regular'), endsWith(' testMain')],
+ ]);
+
expectFrames(result.awaiterFrames, [
[equals('AsyncActivation'), endsWith(' func10')],
[equals('AsyncActivation'), endsWith(' func9')],
@@ -88,18 +101,18 @@
[equals('AsyncActivation'), endsWith(' testMain')],
]);
},
+ // After resuming the continuation - i.e. running async.
resumeIsolate,
hasStoppedAtBreakpoint,
stoppedAtLine(LINE_B),
- // After resuming the continuation - i.e. running async.
(VmService service, IsolateRef isolateRef) async {
- final result = await service.getStack(isolateRef.id);
+ final result = await service.getStack(isolateRef.id!);
expect(result.frames, hasLength(10));
expect(result.asyncCausalFrames, hasLength(26));
expect(result.awaiterFrames, hasLength(2));
- expectFrames(result.frames, [
+ expectFrames(result.frames!, [
[equals('Regular'), endsWith(' func10')],
[equals('Regular'), endsWith(' _RootZone.runUnary')],
[equals('Regular'), anything], // Internal mech. ..
diff --git a/pkg/vm_service/test/get_version_rpc_test.dart b/pkg/vm_service/test/get_version_rpc_test.dart
index 130bf21..3cfedda 100644
--- a/pkg/vm_service/test/get_version_rpc_test.dart
+++ b/pkg/vm_service/test/get_version_rpc_test.dart
@@ -10,8 +10,8 @@
var tests = <VMTest>[
(VmService vm) async {
final result = await vm.getVersion();
- expect(result.major > 0, isTrue);
- expect(result.minor >= 0, isTrue);
+ expect(result.major! > 0, isTrue);
+ expect(result.minor! >= 0, isTrue);
},
];
diff --git a/pkg/vm_service/test/http_enable_timeline_logging_service_test.dart b/pkg/vm_service/test/http_enable_timeline_logging_service_test.dart
index a4f88f7..2bbc902 100644
--- a/pkg/vm_service/test/http_enable_timeline_logging_service_test.dart
+++ b/pkg/vm_service/test/http_enable_timeline_logging_service_test.dart
@@ -24,7 +24,7 @@
VmService service, IsolateRef isolateRef, bool state,
{bool useSetter = true}) async {
final completer = Completer<void>();
- final isolateId = isolateRef.id;
+ final isolateId = isolateRef.id!;
late StreamSubscription sub;
sub = service.onExtensionEvent.listen((event) {
expect(event.extensionKind, 'HttpTimelineLoggingStateChange');
@@ -47,7 +47,7 @@
var tests = <IsolateTest>[
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
+ final isolate = await service.getIsolate(isolateRef.id!);
// Ensure all HTTP service extensions are registered.
expect(isolate.extensionRPCs!.length, greaterThanOrEqualTo(2));
expect(
@@ -57,7 +57,7 @@
expect(isolate.extensionRPCs!.contains(kHttpEnableTimelineLogging), isTrue);
},
(VmService service, IsolateRef isolateRef) async {
- final isolateId = isolateRef.id;
+ final isolateId = isolateRef.id!;
// ignore: deprecated_member_use_from_same_package
dynamic response = await service.getHttpEnableTimelineLogging(isolateId);
expect(response.enabled, false);
@@ -73,7 +73,7 @@
expect(response.enabled, false);
},
(VmService service, IsolateRef isolateRef) async {
- final isolateId = isolateRef.id;
+ final isolateId = isolateRef.id!;
dynamic response = await service.httpEnableTimelineLogging(isolateId, null);
expect(response.enabled, false);
diff --git a/pkg/vm_service/test/invoke_test.dart b/pkg/vm_service/test/invoke_test.dart
index 47d7f8c..b928130 100644
--- a/pkg/vm_service/test/invoke_test.dart
+++ b/pkg/vm_service/test/invoke_test.dart
@@ -30,41 +30,42 @@
var tests = <IsolateTest>[
hasStoppedAtBreakpoint,
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ final isolate = await service.getIsolate(isolateId);
final Library lib =
- await service.getObject(isolate.id, isolate.rootLib!.id) as Library;
- final cls = lib.classes.singleWhere((cls) => cls.name == "Klass");
+ await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+ final cls = lib.classes!.singleWhere((cls) => cls.name == "Klass");
FieldRef fieldRef =
- lib.variables.singleWhere((field) => field.name == "instance");
- Field field = await service.getObject(isolate.id, fieldRef.id) as Field;
- final instance = await service.getObject(isolate.id, field.staticValue!.id);
+ lib.variables!.singleWhere((field) => field.name == "instance");
+ Field field = await service.getObject(isolateId, fieldRef.id!) as Field;
+ final instance = await service.getObject(isolateId, field.staticValue!.id!);
- fieldRef = lib.variables.singleWhere((field) => field.name == "apple");
- field = await service.getObject(isolate.id, fieldRef.id) as Field;
- final apple = await service.getObject(isolate.id, field.staticValue!.id);
- fieldRef = lib.variables.singleWhere((field) => field.name == "banana");
- field = await service.getObject(isolate.id, fieldRef.id) as Field;
+ fieldRef = lib.variables!.singleWhere((field) => field.name == "apple");
+ field = await service.getObject(isolateId, fieldRef.id!) as Field;
+ final apple = await service.getObject(isolateId, field.staticValue!.id!);
+ fieldRef = lib.variables!.singleWhere((field) => field.name == "banana");
+ field = await service.getObject(isolateId, fieldRef.id!) as Field;
Instance banana =
- await service.getObject(isolate.id, field.staticValue!.id) as Instance;
+ await service.getObject(isolateId, field.staticValue!.id!) as Instance;
dynamic result =
- await service.invoke(isolate.id, lib.id, 'libraryFunction', []);
+ await service.invoke(isolateId, lib.id!, 'libraryFunction', []);
expect(result.valueAsString, equals('foobar1'));
result =
- await service.invoke(isolate.id, cls.id, "classFunction", [apple.id]);
+ await service.invoke(isolateId, cls.id!, "classFunction", [apple.id!]);
expect(result.valueAsString, equals('foobar2apple'));
result = await service.invoke(
- isolate.id, instance.id, "instanceFunction", [apple.id, banana.id]);
+ isolateId, instance.id!, "instanceFunction", [apple.id!, banana.id!]);
expect(result.valueAsString, equals('foobar3applebanana'));
// Wrong arity.
await expectError(() => service
- .invoke(isolate.id, instance.id, "instanceFunction", [apple.id]));
+ .invoke(isolateId, instance.id!, "instanceFunction", [apple.id!]));
// No such target.
await expectError(() => service
- .invoke(isolate.id, instance.id, "functionDoesNotExist", [apple.id]));
+ .invoke(isolateId, instance.id!, "functionDoesNotExist", [apple.id!]));
},
resumeIsolate,
];
diff --git a/pkg/vm_service/test/network_profiling_test.dart b/pkg/vm_service/test/network_profiling_test.dart
index 1463fbe..b993389 100644
--- a/pkg/vm_service/test/network_profiling_test.dart
+++ b/pkg/vm_service/test/network_profiling_test.dart
@@ -28,7 +28,7 @@
VmService service, IsolateRef isolateRef, bool state,
{bool useSetter = true}) async {
final completer = Completer<void>();
- final isolateId = isolateRef.id;
+ final isolateId = isolateRef.id!;
late StreamSubscription sub;
sub = service.onExtensionEvent.listen((event) {
expect(event.extensionKind, 'SocketProfilingStateChange');
@@ -86,7 +86,7 @@
var tests = <IsolateTest>[
(VmService service, IsolateRef isolateRef) async {
- final isolate = await service.getIsolate(isolateRef.id);
+ final isolate = await service.getIsolate(isolateRef.id!);
// Ensure all network profiling service extensions are registered.
expect(isolate.extensionRPCs!.length, greaterThanOrEqualTo(5));
expect(isolate.extensionRPCs!.contains(kClearSocketProfileRPC), isTrue);
@@ -99,36 +99,33 @@
// Test getSocketProfiler
(VmService service, IsolateRef isolateRef) async {
- final socketProfile = await service.getSocketProfile(isolateRef.id);
+ final socketProfile = await service.getSocketProfile(isolateRef.id!);
expect(socketProfile.sockets.isEmpty, isTrue);
},
// Exercise methods naively
(VmService service, IsolateRef isolateRef) async {
- final version = await service.getDartIOVersion(isolateRef.id);
- expect(version.major >= 1, true);
- expect(version.minor >= 0, true);
- await service.clearSocketProfile(isolateRef.id);
- await service.getSocketProfile(isolateRef.id);
+ final isolateId = isolateRef.id!;
+ final version = await service.getDartIOVersion(isolateId);
+ expect(version.major! >= 1, true);
+ expect(version.minor! >= 0, true);
+ await service.clearSocketProfile(isolateId);
+ await service.getSocketProfile(isolateId);
},
(VmService service, IsolateRef isolateRef) async {
- final initial =
- (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+ final isolateId = isolateRef.id!;
+ final initial = (await service.socketProfilingEnabled(isolateId)).enabled;
await waitForStreamEvent(service, isolateRef, !initial);
- expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
- !initial);
+ expect((await service.socketProfilingEnabled(isolateId)).enabled, !initial);
await waitForStreamEvent(service, isolateRef, initial);
- expect(
- (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+ expect((await service.socketProfilingEnabled(isolateId)).enabled, initial);
},
(VmService service, IsolateRef isolateRef) async {
- final initial =
- (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+ final isolateId = isolateRef.id!;
+ final initial = (await service.socketProfilingEnabled(isolateId)).enabled;
await waitForStreamEvent(service, isolateRef, !initial, useSetter: false);
- expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
- !initial);
+ expect((await service.socketProfilingEnabled(isolateId)).enabled, !initial);
await waitForStreamEvent(service, isolateRef, initial, useSetter: false);
- expect(
- (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+ expect((await service.socketProfilingEnabled(isolateId)).enabled, initial);
}
// TODO(bkonyi): fully port observatory test for socket profiling.
];
diff --git a/pkg/vm_service/test/process_service_test.dart b/pkg/vm_service/test/process_service_test.dart
index d8f63ea..b1c269a 100644
--- a/pkg/vm_service/test/process_service_test.dart
+++ b/pkg/vm_service/test/process_service_test.dart
@@ -91,16 +91,17 @@
final processTests = <IsolateTest>[
// Initial.
(VmService service, IsolateRef isolate) async {
+ final isolateId = isolate.id!;
final setup = await service.callServiceExtension(
'ext.dart.io.setup',
- isolateId: isolate.id,
+ isolateId: isolateId,
);
try {
- SpawnedProcessList all = await service.getSpawnedProcesses(isolate.id);
+ SpawnedProcessList all = await service.getSpawnedProcesses(isolateId);
expect(all.processes.length, equals(3));
final first = await service.getSpawnedProcessById(
- isolate.id,
+ isolateId,
all.processes[0].id,
);
@@ -110,7 +111,7 @@
expect(first.startedAt, greaterThan(0));
final second = await service.getSpawnedProcessById(
- isolate.id,
+ isolateId,
all.processes[1].id,
);
@@ -122,7 +123,7 @@
expect(second.startedAt, greaterThanOrEqualTo(first.startedAt));
final third = await service.getSpawnedProcessById(
- isolate.id,
+ isolateId,
all.processes[2].id,
);
@@ -134,14 +135,14 @@
await service.callServiceExtension(
'ext.dart.io.closeStdin',
- isolateId: isolate.id,
+ isolateId: isolateId,
);
- all = await service.getSpawnedProcesses(isolate.id);
+ all = await service.getSpawnedProcesses(isolateId);
expect(all.processes.length, equals(2));
} finally {
await service.callServiceExtension(
'ext.dart.io.cleanup',
- isolateId: isolate.id,
+ isolateId: isolateId,
);
}
},
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 2e5743c6..2f812ff 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -1787,7 +1787,6 @@
// Writes the code to retrieve the serialized value of a field.
void generateSerializedFieldAccess(TypeField field, DartGenerator gen) {
- var nullAware = field.optional ? '?' : '';
if (field.type.isSimple || field.type.isEnum) {
gen.write('${field.generatableName}');
if (field.defaultValue != null) {
@@ -1795,9 +1794,9 @@
}
} else if (name == 'Event' && field.name == 'extensionData') {
// Special case `Event.extensionData`.
- gen.writeln('extensionData$nullAware.data');
+ gen.writeln('extensionData?.data');
} else if (field.type.isArray) {
- gen.write('${field.generatableName}$nullAware.map((f) => f');
+ gen.write('${field.generatableName}?.map((f) => f');
// Special case `tokenPosTable` which is a List<List<int>>.
if (field.name == 'tokenPosTable') {
gen.write('.toList()');
@@ -1806,7 +1805,7 @@
}
gen.write(').toList()');
} else {
- gen.write('${field.generatableName}$nullAware.toJson()');
+ gen.write('${field.generatableName}?.toJson()');
}
}
@@ -1822,7 +1821,7 @@
String assertMethodName = 'assertListOf' +
arrayType.name!.substring(0, 1).toUpperCase() +
arrayType.name!.substring(1);
- gen.writeln('$assertMethodName(obj.${field.generatableName});');
+ gen.writeln('$assertMethodName(obj.${field.generatableName}!);');
} else {
gen.writeln(
'// assert obj.${field.generatableName} is ${type.name}');
@@ -1837,7 +1836,7 @@
String assertMethodName = 'assert' +
typeRef.name!.substring(0, 1).toUpperCase() +
typeRef.name!.substring(1);
- gen.writeln('$assertMethodName(obj.${field.generatableName});');
+ gen.writeln('$assertMethodName(obj.${field.generatableName}!);');
}
gen.writeln('} else {');
gen.writeln(
@@ -1847,7 +1846,7 @@
String assertMethodName = 'assert' +
type.name!.substring(0, 1).toUpperCase() +
type.name!.substring(1);
- gen.writeln('$assertMethodName(obj.${field.generatableName});');
+ gen.writeln('$assertMethodName(obj.${field.generatableName}!);');
}
}
}
@@ -1928,18 +1927,16 @@
if (overrides) gen.write('@override ');
// Special case where Instance extends Obj, but 'classRef' is not optional
// for Instance although it is for Obj.
- if (parent.name == 'Instance' && generatableName == 'classRef') {
+ /*if (parent.name == 'Instance' && generatableName == 'classRef') {
gen.writeStatement('covariant late final ClassRef classRef;');
} else if (parent.name!.contains('NullVal') &&
generatableName == 'valueAsString') {
gen.writeStatement('covariant late final String valueAsString;');
- } else {
+ } else */
+ {
String? typeName =
api.isEnumName(type.name) ? '/*${type.name}*/ String' : type.name;
- if (optional) {
- typeName = '$typeName?';
- }
- typeName = 'late final $typeName';
+ typeName = '$typeName?';
gen.writeStatement('${typeName} ${generatableName};');
if (parent.fields.any((field) => field.hasDocs)) gen.writeln();
}
diff --git a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
index 01331cd..3a90e4a 100644
--- a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
@@ -11,8 +11,8 @@
import 'test_helper.dart';
const LINE_C = 19;
-const LINE_A = 25;
-const LINE_B = 31;
+const LINE_A = 24;
+const LINE_B = 30;
foobar() {
debugger();
@@ -20,7 +20,6 @@
}
helper() async {
- await 0; // Yield. The rest will run async.
debugger();
print('helper'); // LINE_A.
foobar();
@@ -37,7 +36,6 @@
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
// No causal frames because we are in a completely synchronous stack.
- // Async function hasn't yielded yet.
expect(stack['asyncCausalFrames'], isNull);
},
resumeIsolate,
@@ -45,7 +43,7 @@
stoppedAtLine(LINE_A),
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
- // Async function has yielded once, so it's now running async.
+ // Has causal frames (we are inside an async function)
expect(stack['asyncCausalFrames'], isNotNull);
},
resumeIsolate,
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
index 9b605cb..4d3e448 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
@@ -39,7 +39,7 @@
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
// No causal frames because we are in a completely synchronous stack.
- expect(stack['asyncCausalFrames'], isNull);
+ expect(stack['asyncCausalFrames'], isNotNull);
},
resumeIsolate,
hasStoppedAtBreakpoint,
diff --git a/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart b/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
index cd9ef6a..f52f4a1 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_stack_presence_test.dart
@@ -11,8 +11,8 @@
import 'test_helper.dart';
const LINE_C = 19;
-const LINE_A = 25;
-const LINE_B = 31;
+const LINE_A = 24;
+const LINE_B = 30;
foobar() {
debugger();
@@ -20,7 +20,6 @@
}
helper() async {
- await 0; // Yield. The rest will run async.
debugger();
print('helper'); // LINE_A.
foobar();
diff --git a/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart b/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
index 8acf40d..7fb385a 100644
--- a/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory_2/tests/service_2/causal_async_star_stack_presence_test.dart
@@ -39,7 +39,7 @@
(Isolate isolate) async {
ServiceMap stack = await isolate.getStack();
// No causal frames because we are in a completely synchronous stack.
- expect(stack['asyncCausalFrames'], isNull);
+ expect(stack['asyncCausalFrames'], isNotNull);
},
resumeIsolate,
hasStoppedAtBreakpoint,
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 8b75f98..73ffe1d 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -178,22 +178,12 @@
return Future.sync(throwAsync).whenComplete(() => 'nop');
}
-// ----
-// Scenario: Future.then:
-// ----
-
-Future futureThen() {
- return Future.value(0).then((value) {
- throwSync();
- });
-}
-
// Helpers:
// We want lines that either start with a frame index or an async gap marker.
final _lineRE = RegExp(r'^(?:#(?<number>\d+)|<asynchronous suspension>)');
-Future<void> assertStack(List<String> expects, StackTrace stackTrace,
+void assertStack(List<String> expects, StackTrace stackTrace,
[String? debugInfoFilename]) async {
final original = await Stream.value(stackTrace.toString())
.transform(const LineSplitter())
@@ -263,7 +253,7 @@
await f();
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -277,7 +267,7 @@
await f().then((e) => Expect.fail('No exception thrown!'));
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -288,7 +278,7 @@
await f().catchError((e, s) {
stackTrace = s;
});
- return assertStack(expectedStack, stackTrace, debugInfoFilename);
+ assertStack(expectedStack, stackTrace, debugInfoFilename);
}
// ----
@@ -337,32 +327,39 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
+ r'^#16 doTestAwaitCatchError ',
r'^#17 _RootZone.runUnary ',
r'^#18 _FutureListener.handleValue ',
r'^#19 Future._propagateToListeners.handleValueCallback ',
r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#21 Future._completeError ',
+ r'^#22 _completeOnAsyncError ',
+ r'^#23 allYield ',
+ r'^#24 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#25 _RootZone.runBinary ',
+ r'^#26 _FutureListener.handleError ',
+ r'^#27 Future._propagateToListeners.handleError ',
+ r'^#28 Future._propagateToListeners ',
+ r'^#29 Future._completeError ',
+ r'^#30 _completeOnAsyncError ',
+ r'^#31 allYield2 ',
+ r'^#32 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#33 _RootZone.runBinary ',
+ r'^#34 _FutureListener.handleError ',
+ r'^#35 Future._propagateToListeners.handleError ',
+ r'^#36 Future._propagateToListeners ',
+ r'^#37 Future._completeError ',
+ r'^#38 _completeOnAsyncError ',
+ r'^#39 allYield3 ',
+ r'^#40 _RootZone.runUnary ',
+ r'^#41 _FutureListener.handleValue ',
+ r'^#42 Future._propagateToListeners.handleValueCallback ',
+ r'^#43 Future._propagateToListeners ',
+ r'^#44 Future._addListener.<anonymous closure> ',
+ r'^#45 _microtaskLoop ',
+ r'^#46 _startMicrotaskLoop ',
+ r'^#47 _runPendingImmediateCallback ',
+ r'^#48 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitThen(
@@ -378,32 +375,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwait ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitCatchError(
@@ -419,32 +418,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwaitThen ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
@@ -641,497 +642,329 @@
await doTestAwaitCatchError(
futureSyncWhenComplete, expected, debugInfoFilename);
}
-
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> \(.*/utils.dart:187(:5)?\)$',
- r'^#2 _RootZone.runUnary ',
- r'^#3 _FutureListener.handleValue ',
- r'^#4 Future._propagateToListeners.handleValueCallback ',
- r'^#5 Future._propagateToListeners ',
- r'^#6 Future._completeWithValue ',
- r'^#7 Future._asyncCompleteWithValue.<anonymous closure> ',
- r'^#8 _microtaskLoop ',
- r'^#9 _startMicrotaskLoop ',
- r'^#10 _runPendingImmediateCallback ',
- r'^#11 _RawReceivePortImpl._handleMessage ',
- ];
- await doTestAwait(futureThen, expected, debugInfoFilename);
- await doTestAwaitThen(futureThen, expected, debugInfoFilename);
- await doTestAwaitCatchError(futureThen, expected, debugInfoFilename);
- }
}
// For: --lazy-async-stacks
Future<void> doTestsLazy([String? debugInfoFilename]) async {
- // allYield
- {
- final allYieldExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final allYieldExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(allYield, allYieldExpected, debugInfoFilename);
- // noYields
- {
- final noYieldsExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
- r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
- r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
- ];
- await doTestAwait(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final noYieldsExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
+ r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
+ r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
+ ];
+ await doTestAwait(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitCatchError ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
- // mixedYields
- {
- final mixedYieldsExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final mixedYieldsExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ mixedYields, mixedYieldsExpected, debugInfoFilename);
- // syncSuffix
- {
- final syncSuffixExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final syncSuffixExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ syncSuffix, syncSuffixExpected, debugInfoFilename);
- // nonAsyncNoStack
- {
- final nonAsyncNoStackExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final nonAsyncNoStackExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowSync
- {
- final asyncStarThrowSyncExpected = const <String>[
- r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
- r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowSyncExpected = const <String>[
+ r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
+ r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowAsync
- {
- final asyncStarThrowAsyncExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowAsyncExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected, debugInfoFilename);
- // listenAsyncStarThrowAsync
- {
- final listenAsyncStartExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitThen(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- }
+ final listenAsyncStartExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- // customErrorZone
- {
- final customErrorZoneExpected = const <String>[
- r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
- r'<asynchronous suspension>$',
- ];
- await doTestAwait(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitThen(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- }
+ final customErrorZoneExpected = const <String>[
+ r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
+ r'<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
- // awaitTimeout
- {
- final awaitTimeoutExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitTimeout ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitTimeoutExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitTimeout ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitTimeout, awaitTimeoutExpected, debugInfoFilename);
- // awaitWait
- {
- final awaitWaitExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitWait ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitWait ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitWait, awaitWaitExpected, debugInfoFilename);
- // futureSyncWhenComplete
{
final expected = const <String>[
r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
@@ -1153,70 +986,11 @@
futureSyncWhenComplete,
expected +
const <String>[
- r'^#1 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
+ r'^#1 doTestAwaitThen.<anonymous closure> ',
r'^<asynchronous suspension>$',
],
debugInfoFilename);
await doTestAwaitCatchError(
- futureSyncWhenComplete,
- expected +
- const <String>[
- r'^#1 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
-
- // futureThen
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
+ futureSyncWhenComplete, expected, debugInfoFilename);
}
}
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index b7c4e02..192984f 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -178,22 +178,12 @@
return Future.sync(throwAsync).whenComplete(() => 'nop');
}
-// ----
-// Scenario: Future.then:
-// ----
-
-Future futureThen() {
- return Future.value(0).then((value) {
- throwSync();
- });
-}
-
// Helpers:
// We want lines that either start with a frame index or an async gap marker.
final _lineRE = RegExp(r'^(?:#(?<number>\d+)|<asynchronous suspension>)');
-Future<void> assertStack(List<String> expects, StackTrace stackTrace,
+void assertStack(List<String> expects, StackTrace stackTrace,
[String debugInfoFilename]) async {
final original = await Stream.value(stackTrace.toString())
.transform(const LineSplitter())
@@ -263,7 +253,7 @@
await f();
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -277,7 +267,7 @@
await f().then((e) => Expect.fail('No exception thrown!'));
Expect.fail('No exception thrown!');
} on String catch (e, s) {
- return assertStack(expectedStack, s, debugInfoFilename);
+ assertStack(expectedStack, s, debugInfoFilename);
}
}
@@ -288,7 +278,7 @@
await f().catchError((e, s) {
stackTrace = s;
});
- return assertStack(expectedStack, stackTrace, debugInfoFilename);
+ assertStack(expectedStack, stackTrace, debugInfoFilename);
}
// ----
@@ -337,32 +327,39 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
+ r'^#16 doTestAwaitCatchError ',
r'^#17 _RootZone.runUnary ',
r'^#18 _FutureListener.handleValue ',
r'^#19 Future._propagateToListeners.handleValueCallback ',
r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#21 Future._completeError ',
+ r'^#22 _completeOnAsyncError ',
+ r'^#23 allYield ',
+ r'^#24 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#25 _RootZone.runBinary ',
+ r'^#26 _FutureListener.handleError ',
+ r'^#27 Future._propagateToListeners.handleError ',
+ r'^#28 Future._propagateToListeners ',
+ r'^#29 Future._completeError ',
+ r'^#30 _completeOnAsyncError ',
+ r'^#31 allYield2 ',
+ r'^#32 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#33 _RootZone.runBinary ',
+ r'^#34 _FutureListener.handleError ',
+ r'^#35 Future._propagateToListeners.handleError ',
+ r'^#36 Future._propagateToListeners ',
+ r'^#37 Future._completeError ',
+ r'^#38 _completeOnAsyncError ',
+ r'^#39 allYield3 ',
+ r'^#40 _RootZone.runUnary ',
+ r'^#41 _FutureListener.handleValue ',
+ r'^#42 Future._propagateToListeners.handleValueCallback ',
+ r'^#43 Future._propagateToListeners ',
+ r'^#44 Future._addListener.<anonymous closure> ',
+ r'^#45 _microtaskLoop ',
+ r'^#46 _startMicrotaskLoop ',
+ r'^#47 _runPendingImmediateCallback ',
+ r'^#48 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitThen(
@@ -378,32 +375,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwait ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
await doTestAwaitCatchError(
@@ -419,32 +418,34 @@
r'^#13 Future._propagateToListeners ',
r'^#14 Future._completeWithValue ',
r'^#15 _completeOnAsyncReturn ',
- r'^#16 assertStack ',
- r'^#17 _RootZone.runUnary ',
- r'^#18 _FutureListener.handleValue ',
- r'^#19 Future._propagateToListeners.handleValueCallback ',
- r'^#20 Future._propagateToListeners ',
- r'^#21 Future._complete ',
- r'^#22 Stream.toList.<anonymous closure> ',
- r'^#23 _RootZone.runGuarded ',
- r'^#24 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#25 _BufferingStreamSubscription._sendDone ',
- r'^#26 _BufferingStreamSubscription._close ',
- r'^#27 _SinkTransformerStreamSubscription._close ',
- r'^#28 _EventSinkWrapper.close ',
- r'^#29 _StringAdapterSink.close ',
- r'^#30 _LineSplitterSink.close ',
- r'^#31 _SinkTransformerStreamSubscription._handleDone ',
- r'^#32 _RootZone.runGuarded ',
- r'^#33 _BufferingStreamSubscription._sendDone.sendDone ',
- r'^#34 _BufferingStreamSubscription._sendDone ',
- r'^#35 _DelayedDone.perform ',
- r'^#36 _StreamImplEvents.handleNext ',
- r'^#37 _PendingEvents.schedule.<anonymous closure> ',
- r'^#38 _microtaskLoop ',
- r'^#39 _startMicrotaskLoop ',
- r'^#40 _runPendingImmediateCallback ',
- r'^#41 _RawReceivePortImpl._handleMessage ',
+ r'^#16 doTestAwaitThen ',
+ r'^#17 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#18 _RootZone.runBinary ',
+ r'^#19 _FutureListener.handleError ',
+ r'^#20 Future._propagateToListeners.handleError ',
+ r'^#21 Future._propagateToListeners ',
+ r'^#22 Future._completeError ',
+ r'^#23 _completeOnAsyncError ',
+ r'^#24 noYields ',
+ r'^#25 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#26 _RootZone.runBinary ',
+ r'^#27 _FutureListener.handleError ',
+ r'^#28 Future._propagateToListeners.handleError ',
+ r'^#29 Future._propagateToListeners ',
+ r'^#30 Future._completeError ',
+ r'^#31 _completeOnAsyncError ',
+ r'^#32 noYields2 ',
+ r'^#33 _asyncErrorWrapperHelper.errorCallback ',
+ r'^#34 _RootZone.runBinary ',
+ r'^#35 _FutureListener.handleError ',
+ r'^#36 Future._propagateToListeners.handleError ',
+ r'^#37 Future._propagateToListeners ',
+ r'^#38 Future._completeError ',
+ r'^#39 Future._asyncCompleteError.<anonymous closure> ',
+ r'^#40 _microtaskLoop ',
+ r'^#41 _startMicrotaskLoop ',
+ r'^#42 _runPendingImmediateCallback ',
+ r'^#43 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
@@ -641,505 +642,337 @@
await doTestAwaitCatchError(
futureSyncWhenComplete, expected, debugInfoFilename);
}
-
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> \(.*/utils.dart:187(:5)?\)$',
- r'^#2 _RootZone.runUnary ',
- r'^#3 _FutureListener.handleValue ',
- r'^#4 Future._propagateToListeners.handleValueCallback ',
- r'^#5 Future._propagateToListeners ',
- r'^#6 Future._completeWithValue ',
- r'^#7 Future._asyncCompleteWithValue.<anonymous closure> ',
- r'^#8 _microtaskLoop ',
- r'^#9 _startMicrotaskLoop ',
- r'^#10 _runPendingImmediateCallback ',
- r'^#11 _RawReceivePortImpl._handleMessage ',
- ];
- await doTestAwait(futureThen, expected, debugInfoFilename);
- await doTestAwaitThen(futureThen, expected, debugInfoFilename);
- await doTestAwaitCatchError(futureThen, expected, debugInfoFilename);
- }
}
// For: --lazy-async-stacks
Future<void> doTestsLazy([String debugInfoFilename]) async {
- // allYield
- {
- final allYieldExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- allYield,
- allYieldExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final allYieldExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ allYield,
+ allYieldExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(allYield, allYieldExpected, debugInfoFilename);
- // noYields
- {
- final noYieldsExpected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
- r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
- r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
- ];
- await doTestAwait(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwait ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitThen ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- noYields,
- noYieldsExpected +
- const <String>[
- r'^#4 doTestAwaitCatchError ',
- r'^#5 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#6 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final noYieldsExpected = const <String>[
+ r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'^#1 noYields3 \(.*/utils.dart:54(:3)?\)$',
+ r'^#2 noYields2 \(.*/utils.dart:50(:9)?\)$',
+ r'^#3 noYields \(.*/utils.dart:46(:9)?\)$',
+ ];
+ await doTestAwait(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwait ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitThen ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ noYields,
+ noYieldsExpected +
+ const <String>[
+ r'^#4 doTestAwaitCatchError ',
+ r'^#5 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#6 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
- // mixedYields
- {
- final mixedYieldsExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- mixedYields,
- mixedYieldsExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final mixedYieldsExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 mixedYields2 \(.*/utils.dart:66(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 mixedYields \(.*/utils.dart:61(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ mixedYields,
+ mixedYieldsExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ mixedYields, mixedYieldsExpected, debugInfoFilename);
- // syncSuffix
- {
- final syncSuffixExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- syncSuffix,
- syncSuffixExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final syncSuffixExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 syncSuffix2 \(.*/utils.dart:82(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 syncSuffix \(.*/utils.dart:77(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ syncSuffix,
+ syncSuffixExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ syncSuffix, syncSuffixExpected, debugInfoFilename);
- // nonAsyncNoStack
- {
- final nonAsyncNoStackExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- nonAsyncNoStack,
- nonAsyncNoStackExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final nonAsyncNoStackExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 nonAsyncNoStack1 \(.*/utils.dart:95(:36)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 nonAsyncNoStack \(.*/utils.dart:93(:35)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ nonAsyncNoStack,
+ nonAsyncNoStackExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ nonAsyncNoStack, nonAsyncNoStackExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowSync
- {
- final asyncStarThrowSyncExpected = const <String>[
- r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
- r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowSync,
- asyncStarThrowSyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowSyncExpected = const <String>[
+ r'^#0 throwSync \(.+/utils.dart:16(:3)?\)$',
+ r'^#1 asyncStarThrowSync \(.+/utils.dart:112(:11)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowSync \(.+/utils.dart:104(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowSync,
+ asyncStarThrowSyncExpected, debugInfoFilename);
- // awaitEveryAsyncStarThrowAsync
- {
- final asyncStarThrowAsyncExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitEveryAsyncStarThrowAsync,
- asyncStarThrowAsyncExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final asyncStarThrowAsyncExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitEveryAsyncStarThrowAsync \(.+/utils.dart:117(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitEveryAsyncStarThrowAsync,
+ asyncStarThrowAsyncExpected, debugInfoFilename);
- // listenAsyncStarThrowAsync
- {
- final listenAsyncStartExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
- r'^<asynchronous suspension>$',
- r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitThen(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- }
+ final listenAsyncStartExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ listenAsyncStarThrowAsync, listenAsyncStartExpected, debugInfoFilename);
- // customErrorZone
- {
- final customErrorZoneExpected = const <String>[
- r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
- r'<asynchronous suspension>$',
- r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
- r'<asynchronous suspension>$',
- ];
- await doTestAwait(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitThen(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- await doTestAwaitCatchError(
- customErrorZone, customErrorZoneExpected, debugInfoFilename);
- }
+ final customErrorZoneExpected = const <String>[
+ r'#0 throwSync \(.*/utils.dart:16(:3)?\)$',
+ r'#1 allYield3 \(.*/utils.dart:39(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#2 allYield2 \(.*/utils.dart:34(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#3 allYield \(.*/utils.dart:29(:3)?\)$',
+ r'<asynchronous suspension>$',
+ r'#4 customErrorZone.<anonymous closure> \(.*/utils.dart:144(:5)?\)$',
+ r'<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitThen(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
+ await doTestAwaitCatchError(
+ customErrorZone, customErrorZoneExpected, debugInfoFilename);
- // awaitTimeout
- {
- final awaitTimeoutExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitTimeout ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitTimeout,
- awaitTimeoutExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitTimeoutExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.timeout.<anonymous closure> \(dart:async/future_impl.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitTimeout ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitTimeout,
+ awaitTimeoutExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitTimeout, awaitTimeoutExpected, debugInfoFilename);
- // awaitWait
- {
- final awaitWaitExpected = const <String>[
- r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
- r'^<asynchronous suspension>$',
- r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
- r'^<asynchronous suspension>$',
- r'^#2 awaitWait ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- awaitWait,
- awaitWaitExpected +
- const <String>[
- r'^#3 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#4 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#5 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitWait ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(awaitWait, awaitWaitExpected, debugInfoFilename);
- // futureSyncWhenComplete
{
- final expected = const <String>[
+ final expect = const <String>[
r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
r'^<asynchronous suspension>$',
];
await doTestAwait(
futureSyncWhenComplete,
- expected +
+ expect +
const <String>[
r'^#1 doTestAwait ',
r'^<asynchronous suspension>$',
@@ -1151,72 +984,13 @@
debugInfoFilename);
await doTestAwaitThen(
futureSyncWhenComplete,
- expected +
+ expect +
const <String>[
- r'^#1 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
+ r'^#1 doTestAwaitThen.<anonymous closure> ',
r'^<asynchronous suspension>$',
],
debugInfoFilename);
await doTestAwaitCatchError(
- futureSyncWhenComplete,
- expected +
- const <String>[
- r'^#1 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#2 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#3 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- }
-
- // futureThen
- {
- final expected = const <String>[
- r'^#0 throwSync \(.*/utils.dart:16(:3)?\)$',
- r'^#1 futureThen.<anonymous closure> ',
- r'^<asynchronous suspension>$',
- ];
- await doTestAwait(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwait ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitThen(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitThen ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
- await doTestAwaitCatchError(
- futureThen,
- expected +
- const <String>[
- r'^#2 doTestAwaitCatchError ',
- r'^<asynchronous suspension>$',
- r'^#3 doTestsLazy ',
- r'^<asynchronous suspension>$',
- r'^#4 main ',
- r'^<asynchronous suspension>$',
- ],
- debugInfoFilename);
+ futureSyncWhenComplete, expect, debugInfoFilename);
}
}
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 6822001..185af0a 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -196,8 +196,6 @@
V(_Utf8Decoder, _scan, Utf8DecoderScan, 0xb35ced99) \
V(_Future, timeout, FutureTimeout, 0x6ad7d1ef) \
V(Future, wait, FutureWait, 0x264aacc2) \
- V(_RootZone, runUnary, RootZoneRunUnary, 0x76e41d34) \
- V(_FutureListener, handleValue, FutureListenerHandleValue, 0x73894d16) \
// List of intrinsics:
// (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 51975f3..7f6775d 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1848,7 +1848,7 @@
/*skip_frames=*/0, &on_sync_frame,
&has_async);
- // If the entire stack is sync, return no (async) trace.
+ // If the entire stack is sync, return no trace.
if (!has_async) {
return nullptr;
}
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 96ad60d..5a6c5a9 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -528,19 +528,6 @@
frames_.Unpoison();
}
-StackFrameIterator::StackFrameIterator(const StackFrameIterator& orig)
- : validate_(orig.validate_),
- entry_(orig.thread_),
- exit_(orig.thread_),
- frames_(orig.thread_),
- current_frame_(nullptr),
- thread_(orig.thread_) {
- frames_.fp_ = orig.frames_.fp_;
- frames_.sp_ = orig.frames_.sp_;
- frames_.pc_ = orig.frames_.pc_;
- frames_.Unpoison();
-}
-
StackFrame* StackFrameIterator::NextFrame() {
// When we are at the start of iteration after having created an
// iterator object, current_frame_ will be NULL as we haven't seen
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 6969642..92f864f 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -236,8 +236,6 @@
Thread* thread,
CrossThreadPolicy cross_thread_policy);
- StackFrameIterator(const StackFrameIterator& orig);
-
// Checks if a next frame exists.
bool HasNextFrame() const { return frames_.fp_ != 0; }
@@ -302,6 +300,7 @@
Thread* thread_;
friend class ProfilerDartStackWalker;
+ DISALLOW_COPY_AND_ASSIGN(StackFrameIterator);
};
// Iterator for iterating over all dart frames (skips over exit frames,
@@ -340,8 +339,6 @@
thread,
cross_thread_policy) {}
- DartFrameIterator(const DartFrameIterator& orig) : frames_(orig.frames_) {}
-
// Get next dart frame.
StackFrame* NextFrame() {
StackFrame* frame = frames_.NextFrame();
@@ -353,6 +350,8 @@
private:
StackFrameIterator frames_;
+
+ DISALLOW_COPY_AND_ASSIGN(DartFrameIterator);
};
// Iterator for iterating over all inlined dart functions in an optimized
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index a231568..ae8849a 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -10,18 +10,11 @@
namespace dart {
-// Keep in sync with:
-// - sdk/lib/async/stream_controller.dart:_StreamController._STATE_SUBSCRIBED.
+// Keep in sync with
+// sdk/lib/async/stream_controller.dart:_StreamController._STATE_SUBSCRIBED.
const intptr_t k_StreamController__STATE_SUBSCRIBED = 1;
-// - sdk/lib/async/future_impl.dart:_FutureListener.stateThen.
-const intptr_t k_FutureListener_stateThen = 1;
-// - sdk/lib/async/future_impl.dart:_FutureListener.stateCatchError.
-const intptr_t k_FutureListener_stateCatchError = 2;
-// - sdk/lib/async/future_impl.dart:_FutureListener.stateWhenComplete.
-const intptr_t k_FutureListener_stateWhenComplete = 8;
-
-// Keep in sync with sdk/lib/async/future_impl.dart:_FutureListener.handleValue.
-const intptr_t kNumArgsFutureListenerHandleValue = 1;
+// sdk/lib/async/future_impl.dart:_FutureListener.stateWhencomplete.
+const intptr_t k_FutureListener_stateWhencomplete = 8;
// Find current yield index from async closure.
// Async closures contains a variable, :await_jump_var that holds the index into
@@ -147,19 +140,21 @@
ASSERT(!future.IsNull());
ASSERT(future.GetClassId() == future_impl_class.id());
- // Since this function is recursive, we have to keep a local ref.
- auto& listener = Object::Handle(
- Instance::Cast(future).GetField(future_result_or_listeners_field));
- if (listener.GetClassId() != future_listener_class.id()) {
+ listener_ = Instance::Cast(future).GetField(future_result_or_listeners_field);
+ if (listener_.GetClassId() != future_listener_class.id()) {
return Closure::null();
}
- callback_ = GetCallerInFutureListener(listener);
- if (callback_.IsInstance() && !callback_.IsNull()) {
- return Closure::Cast(callback_).ptr();
+ // If the _FutureListener is a whenComplete listener, follow the Future being
+ // completed, `result`, instead of the dangling whenComplete `callback`.
+ state_ = Instance::Cast(listener_).GetField(future_listener_state_field);
+ ASSERT(state_.IsSmi());
+ if (Smi::Cast(state_).Value() == k_FutureListener_stateWhencomplete) {
+ future_ = Instance::Cast(listener_).GetField(future_listener_result_field);
+ return GetCallerInFutureImpl(future_);
}
- callback_ = Instance::Cast(listener).GetField(callback_field);
+ callback_ = Instance::Cast(listener_).GetField(callback_field);
// This happens for e.g.: await f().catchError(..);
if (callback_.IsNull()) {
return Closure::null();
@@ -226,46 +221,22 @@
UNREACHABLE(); // If no onData is found we have a bug.
}
-ClosurePtr CallerClosureFinder::GetCallerInFutureListener(
- const Object& future_listener) {
- ASSERT(future_listener.GetClassId() == future_listener_class.id());
-
- state_ =
- Instance::Cast(future_listener).GetField(future_listener_state_field);
-
- auto value = Smi::Cast(state_).Value();
- // If the _FutureListener is a `then`, `catchError`, or `whenComplete`
- // listener, follow the Future being completed, `result`, instead of the
- // dangling whenComplete `callback`.
- if (value == k_FutureListener_stateThen ||
- value == k_FutureListener_stateCatchError ||
- value == k_FutureListener_stateWhenComplete) {
- future_ =
- Instance::Cast(future_listener).GetField(future_listener_result_field);
- return GetCallerInFutureImpl(future_);
- }
-
- return Closure::null();
-}
-
ClosurePtr CallerClosureFinder::FindCaller(const Closure& receiver_closure) {
receiver_function_ = receiver_closure.function();
receiver_context_ = receiver_closure.context();
if (receiver_function_.IsAsyncClosure()) {
return FindCallerInAsyncClosure(receiver_context_);
- }
- if (receiver_function_.IsAsyncGenClosure()) {
+ } else if (receiver_function_.IsAsyncGenClosure()) {
return FindCallerInAsyncGenClosure(receiver_context_);
- }
- if (receiver_function_.IsLocalFunction()) {
+ } else if (receiver_function_.IsLocalFunction()) {
parent_function_ = receiver_function_.parent_function();
if (parent_function_.recognized_kind() ==
MethodRecognizer::kFutureTimeout) {
context_entry_ = receiver_context_.At(Context::kFutureTimeoutFutureIndex);
return GetCallerInFutureImpl(context_entry_);
- }
- if (parent_function_.recognized_kind() == MethodRecognizer::kFutureWait) {
+ } else if (parent_function_.recognized_kind() ==
+ MethodRecognizer::kFutureWait) {
receiver_context_ = receiver_context_.parent();
ASSERT(!receiver_context_.IsNull());
context_entry_ = receiver_context_.At(Context::kFutureWaitFutureIndex);
@@ -329,114 +300,6 @@
UNREACHABLE();
}
-ClosurePtr StackTraceUtils::ClosureFromFrameFunction(
- Zone* zone,
- CallerClosureFinder* caller_closure_finder,
- const DartFrameIterator& frames,
- StackFrame* frame,
- bool* skip_frame,
- bool* is_async) {
- auto& closure = Closure::Handle(zone);
- auto& function = Function::Handle(zone);
-
- function = frame->LookupDartFunction();
- if (function.IsNull()) {
- return Closure::null();
- }
-
- if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
- {
- NoSafepointScope nsp;
-
- // Next, look up caller's closure on the stack and walk backwards
- // through the yields.
- ObjectPtr* last_caller_obj =
- reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
- closure = FindClosureInFrame(last_caller_obj, function);
-
- // If this async function hasn't yielded yet, we're still dealing with a
- // normal stack. Continue to next frame as usual.
- if (!caller_closure_finder->IsRunningAsync(closure)) {
- return Closure::null();
- }
- }
-
- *is_async = true;
-
- // Skip: Already handled this as a sync. frame.
- return caller_closure_finder->FindCaller(closure);
- }
-
- // May have been called from `_FutureListener.handleValue`, which means its
- // receiver holds the Future chain.
- if (function.recognized_kind() == MethodRecognizer::kRootZoneRunUnary) {
- DartFrameIterator future_frames(frames);
- frame = future_frames.NextFrame();
- function = frame->LookupDartFunction();
- if (function.recognized_kind() !=
- MethodRecognizer::kFutureListenerHandleValue) {
- return Closure::null();
- }
- }
- if (function.recognized_kind() ==
- MethodRecognizer::kFutureListenerHandleValue) {
- *is_async = true;
- *skip_frame = true;
-
- // The _FutureListener receiver is at the top of the previous frame, right
- // before the arguments to the call.
- Object& receiver =
- Object::Handle(*(reinterpret_cast<ObjectPtr*>(frame->GetCallerSp()) +
- kNumArgsFutureListenerHandleValue));
-
- return caller_closure_finder->GetCallerInFutureListener(receiver);
- }
-
- return Closure::null();
-}
-
-void StackTraceUtils::UnwindAwaiterChain(
- Zone* zone,
- const GrowableObjectArray& code_array,
- const GrowableObjectArray& pc_offset_array,
- CallerClosureFinder* caller_closure_finder,
- ClosurePtr leaf_closure) {
- auto& code = Code::Handle(zone);
- auto& function = Function::Handle(zone);
- auto& closure = Closure::Handle(zone, leaf_closure);
- auto& pc_descs = PcDescriptors::Handle(zone);
- auto& offset = Smi::Handle(zone);
-
- // Inject async suspension marker.
- code_array.Add(StubCode::AsynchronousGapMarker());
- offset = Smi::New(0);
- pc_offset_array.Add(offset);
-
- // Traverse the trail of async futures all the way up.
- for (; !closure.IsNull();
- closure = caller_closure_finder->FindCaller(closure)) {
- function = closure.function();
- if (function.IsNull()) {
- continue;
- }
- // In hot-reload-test-mode we sometimes have to do this:
- code = function.EnsureHasCode();
- RELEASE_ASSERT(!code.IsNull());
- code_array.Add(code);
- pc_descs = code.pc_descriptors();
- offset = Smi::New(FindPcOffset(pc_descs, GetYieldIndex(closure)));
- // Unlike other sources of PC offsets, the offset may be 0 here if we
- // reach a non-async closure receiving the yielded value.
- ASSERT(offset.Value() >= 0);
- pc_offset_array.Add(offset);
-
- // Inject async suspension marker.
- code_array.Add(StubCode::AsynchronousGapMarker());
- offset = Smi::New(0);
- pc_offset_array.Add(offset);
- }
-}
-
void StackTraceUtils::CollectFramesLazy(
Thread* thread,
const GrowableObjectArray& code_array,
@@ -457,10 +320,13 @@
return;
}
+ auto& function = Function::Handle(zone);
auto& code = Code::Handle(zone);
auto& offset = Smi::Handle(zone);
+ auto& closure = Closure::Handle(zone);
CallerClosureFinder caller_closure_finder(zone);
+ auto& pc_descs = PcDescriptors::Handle();
// Start by traversing the sync. part of the stack.
for (; frame != nullptr; frame = frames.NextFrame()) {
@@ -469,36 +335,79 @@
continue;
}
- // If we encounter a known part of the async/Future mechanism, unwind the
- // awaiter chain from the closures.
- bool skip_frame = false;
- bool is_async = false;
- auto closure_ptr = ClosureFromFrameFunction(
- zone, &caller_closure_finder, frames, frame, &skip_frame, &is_async);
+ function = frame->LookupDartFunction();
- // This isn't a special (async) frame we should skip.
- if (!skip_frame) {
- // Add the current synchronous frame.
- code = frame->LookupDartCode();
- code_array.Add(code);
- const intptr_t pc_offset = frame->pc() - code.PayloadStart();
- ASSERT(pc_offset > 0 && pc_offset <= code.Size());
- offset = Smi::New(pc_offset);
- pc_offset_array.Add(offset);
- // Callback for sync frame.
- if (on_sync_frames != nullptr) {
- (*on_sync_frames)(frame);
- }
+ // Add the current synchronous frame.
+ code = frame->LookupDartCode();
+ ASSERT(function.ptr() == code.function());
+ code_array.Add(code);
+ const intptr_t pc_offset = frame->pc() - code.PayloadStart();
+ ASSERT(pc_offset > 0 && pc_offset <= code.Size());
+ offset = Smi::New(pc_offset);
+ pc_offset_array.Add(offset);
+ if (on_sync_frames != nullptr) {
+ (*on_sync_frames)(frame);
}
- // This frame is running async.
- // Note: The closure might still be null in case it's an unawaited future.
- if (is_async) {
- UnwindAwaiterChain(zone, code_array, pc_offset_array,
- &caller_closure_finder, closure_ptr);
+ // Either continue the loop (sync-async case) or find all await'ers and
+ // return.
+ if (!function.IsNull() &&
+ (function.IsAsyncClosure() || function.IsAsyncGenClosure())) {
if (has_async != nullptr) {
*has_async = true;
}
+
+ {
+ NoSafepointScope nsp;
+
+ // Next, look up caller's closure on the stack and walk backwards
+ // through the yields.
+ ObjectPtr* last_caller_obj =
+ reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
+ closure = FindClosureInFrame(last_caller_obj, function);
+
+ // If this async function hasn't yielded yet, we're still dealing with a
+ // normal stack. Continue to next frame as usual.
+ if (!caller_closure_finder.IsRunningAsync(closure)) {
+ continue;
+ }
+ }
+
+ // Inject async suspension marker.
+ code_array.Add(StubCode::AsynchronousGapMarker());
+ offset = Smi::New(0);
+ pc_offset_array.Add(offset);
+
+ // Skip: Already handled this frame's function above.
+ closure = caller_closure_finder.FindCaller(closure);
+
+ // Traverse the trail of async futures all the way up.
+ for (; !closure.IsNull();
+ closure = caller_closure_finder.FindCaller(closure)) {
+ function = closure.function();
+ // In hot-reload-test-mode we sometimes have to do this:
+ if (!function.HasCode()) {
+ function.EnsureHasCode();
+ }
+ if (function.HasCode()) {
+ code = function.CurrentCode();
+ code_array.Add(code);
+ pc_descs = code.pc_descriptors();
+ offset = Smi::New(FindPcOffset(pc_descs, GetYieldIndex(closure)));
+ } else {
+ UNREACHABLE();
+ }
+ // Unlike other sources of PC offsets, the offset may be 0 here if we
+ // reach a non-async closure receiving the yielded value.
+ ASSERT(offset.Value() >= 0);
+ pc_offset_array.Add(offset);
+
+ // Inject async suspension marker.
+ code_array.Add(StubCode::AsynchronousGapMarker());
+ offset = Smi::New(0);
+ pc_offset_array.Add(offset);
+ }
+
// Ignore the rest of the stack; already unwound all async calls.
return;
}
diff --git a/runtime/vm/stack_trace.h b/runtime/vm/stack_trace.h
index 75ba724..215da83 100644
--- a/runtime/vm/stack_trace.h
+++ b/runtime/vm/stack_trace.h
@@ -21,8 +21,6 @@
ClosurePtr GetCallerInFutureImpl(const Object& future_);
- ClosurePtr GetCallerInFutureListener(const Object& future_listener);
-
ClosurePtr FindCallerInAsyncClosure(const Context& receiver_context);
ClosurePtr FindCallerInAsyncGenClosure(const Context& receiver_context);
@@ -63,8 +61,6 @@
Field& state_field;
Field& on_data_field;
Field& state_data_field;
-
- DISALLOW_COPY_AND_ASSIGN(CallerClosureFinder);
};
class StackTraceUtils : public AllStatic {
@@ -73,20 +69,6 @@
static ClosurePtr FindClosureInFrame(ObjectPtr* last_object_in_caller,
const Function& function);
- static ClosurePtr ClosureFromFrameFunction(
- Zone* zone,
- CallerClosureFinder* caller_closure_finder,
- const DartFrameIterator& frames,
- StackFrame* frame,
- bool* skip_frame,
- bool* is_async);
-
- static void UnwindAwaiterChain(Zone* zone,
- const GrowableObjectArray& code_array,
- const GrowableObjectArray& pc_offset_array,
- CallerClosureFinder* caller_closure_finder,
- ClosurePtr leaf_closure);
-
/// Collects all frames on the current stack until an async/async* frame is
/// hit which has yielded before (i.e. is not in sync-async case).
///
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index a9f2b80..df8a347 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -63,19 +63,18 @@
}
class _FutureListener<S, T> {
- // Keep in sync with sdk/runtime/vm/stack_trace.cc.
static const int maskValue = 1;
static const int maskError = 2;
static const int maskTestError = 4;
- static const int maskWhenComplete = 8;
+ static const int maskWhencomplete = 8;
static const int stateChain = 0;
static const int stateThen = maskValue;
static const int stateThenOnerror = maskValue | maskError;
- static const int stateCatchError = maskError;
- static const int stateCatchErrorTest = maskError | maskTestError;
- static const int stateWhenComplete = maskWhenComplete;
+ static const int stateCatcherror = maskError;
+ static const int stateCatcherrorTest = maskError | maskTestError;
+ static const int stateWhencomplete = maskWhencomplete;
static const int maskType =
- maskValue | maskError | maskTestError | maskWhenComplete;
+ maskValue | maskError | maskTestError | maskWhencomplete;
static const int stateIsAwait = 16;
// Listeners on the same future are linked through this link.
@@ -110,18 +109,18 @@
stateIsAwait;
_FutureListener.catchError(this.result, this.errorCallback, this.callback)
- : state = (callback == null) ? stateCatchError : stateCatchErrorTest;
+ : state = (callback == null) ? stateCatcherror : stateCatcherrorTest;
_FutureListener.whenComplete(this.result, this.callback)
: errorCallback = null,
- state = stateWhenComplete;
+ state = stateWhencomplete;
_Zone get _zone => result._zone;
bool get handlesValue => (state & maskValue != 0);
bool get handlesError => (state & maskError != 0);
- bool get hasErrorTest => (state & maskType == stateCatchErrorTest);
- bool get handlesComplete => (state & maskType == stateWhenComplete);
+ bool get hasErrorTest => (state & maskType == stateCatcherrorTest);
+ bool get handlesComplete => (state & maskType == stateWhencomplete);
bool get isAwait => (state & stateIsAwait != 0);
FutureOr<T> Function(S) get _onValue {
@@ -149,8 +148,6 @@
return _onError != null;
}
- @pragma("vm:recognized", "other")
- @pragma("vm:never-inline")
FutureOr<T> handleValue(S sourceResult) {
return _zone.runUnary<FutureOr<T>, S>(_onValue, sourceResult);
}
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 5400814..4f0873d 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -1608,7 +1608,6 @@
return _rootRun(null, null, this, f);
}
- @pragma("vm:recognized", "other")
R runUnary<R, T>(R f(T arg), T arg) {
if (identical(Zone._current, _rootZone)) return f(arg);
return _rootRunUnary(null, null, this, f, arg);
diff --git a/tests/dart2js/native/browser_compat_1_prepatched_test.dart b/tests/dart2js/native/browser_compat_1_prepatched_test.dart
index e49b134..cf544f1 100644
--- a/tests/dart2js/native/browser_compat_1_prepatched_test.dart
+++ b/tests/dart2js/native/browser_compat_1_prepatched_test.dart
@@ -41,9 +41,9 @@
self.makeT1B = function(){return new T1CrazyB()};
self.makeT1C = function(){return new T1fakeA()};
- self.nativeConstructor(T1A);
- self.nativeConstructor(T1CrazyB);
- self.nativeConstructor(T1fakeA);
+ self.nativeConstructor(T1A, undefined, true);
+ self.nativeConstructor(T1CrazyB, undefined, true);
+ self.nativeConstructor(T1fakeA, undefined, true);
var getTagCount = 0;
getTagCallCount = function() { return getTagCount; };
diff --git a/tests/dart2js/native/browser_compat_2_test.dart b/tests/dart2js/native/browser_compat_2_test.dart
index 50a88b4..cef4a56 100644
--- a/tests/dart2js/native/browser_compat_2_test.dart
+++ b/tests/dart2js/native/browser_compat_2_test.dart
@@ -64,10 +64,10 @@
self.makeT1C = function(){return new T1C()};
self.makeT1D = function(){return new T1D()};
-self.nativeConstructor(T1A);
-self.nativeConstructor(T1B);
-self.nativeConstructor(T1C);
-self.nativeConstructor(T1D);
+self.nativeConstructor(T1A, undefined, true);
+self.nativeConstructor(T1B, undefined, true);
+self.nativeConstructor(T1C, undefined, true);
+self.nativeConstructor(T1D, undefined, true);
var getTagCount = 0;
self.getTagCallCount = function() { return getTagCount; };
diff --git a/tests/dart2js/native/native_testing.dart b/tests/dart2js/native/native_testing.dart
index bc214b5..002ca79 100644
--- a/tests/dart2js/native/native_testing.dart
+++ b/tests/dart2js/native/native_testing.dart
@@ -40,10 +40,10 @@
// Internally this exports the name on the top scope (needed for dartdevc) and
// overrides the toString show the name of the constructor like browsers do
// for native types (needed for dart2js).
- self.nativeConstructor = function(constructor, opt_name) {
+ self.nativeConstructor = function(constructor, opt_name, opt_dont_export) {
var toStringResult = "[object " + (opt_name || constructor.name) + "]";
constructor[toStringResultProperty] = toStringResult;
- self[constructor.name] = constructor;
+ if (!opt_dont_export) self[constructor.name] = constructor;
};
})())
''');
diff --git a/tests/language/mixin/invalid_override_in_mixin_test.dart b/tests/language/mixin/invalid_override_in_mixin_test.dart
index bd79f66..de7b18c 100644
--- a/tests/language/mixin/invalid_override_in_mixin_test.dart
+++ b/tests/language/mixin/invalid_override_in_mixin_test.dart
@@ -14,8 +14,6 @@
class C extends Object with A {
// ^
// [cfe] Applying the mixin 'A' to 'Object' introduces an erroneous override of 'noSuchMethod'.
-// ^
-// [cfe] Class 'Object with A' inherits multiple members named 'noSuchMethod' with incompatible signatures.
// ^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
test() {
diff --git a/tests/language/mixin/method_override_test.dart b/tests/language/mixin/method_override_test.dart
index 166599e..e50464d 100644
--- a/tests/language/mixin/method_override_test.dart
+++ b/tests/language/mixin/method_override_test.dart
@@ -21,34 +21,26 @@
// Wrong return type.
abstract class C1 = CII with CIS;
-// ^^
-// [cfe] Class 'C1' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'C1' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class C2 extends CII with CIS {}
-// ^^
-// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'CII with CIS' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
// Wrong argument type.
abstract class C3 = CII with CSI;
-// ^^
-// [cfe] Class 'C3' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'C3' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class C4 extends CII with CSI {}
-// ^^
-// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'CII with CSI' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -56,17 +48,13 @@
abstract class C5 = CII with CTT<int>;
abstract class C6 extends CII with CTT<int> {}
abstract class C7 = CII with CTT<String>;
-// ^^
-// [cfe] Class 'C7' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'C7' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class C8 extends CII with CTT<String> {}
-// ^^
-// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'CII with CTT<String>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -92,34 +80,26 @@
abstract class N2 extends NIIx with NIIxy {}
// It's NOT OK to rename named parameters.
abstract class N3 = NIIx with NIIy;
-// ^^
-// [cfe] Class 'N3' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N3' introduces an erroneous override of 'id'.
// ^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N4 extends NIIx with NIIy {}
-// ^^
-// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NIIy' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
// It's NOT OK to drop named parameters.
abstract class N5 = NIIx with NII;
-// ^^
-// [cfe] Class 'N5' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N5' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N6 extends NIIx with NII {}
-// ^^
-// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NII' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -139,45 +119,33 @@
abstract class N7 = NIIx with NBABxy<int, int>;
abstract class N8 extends NIIx with NBABxy<int, int> {}
abstract class N9 = NIIx with NBABxy<String, int>;
-// ^^
-// [cfe] Class 'N9' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N9' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N10 extends NIIx with NBABxy<String, int> {}
-// ^^^
-// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NBABxy<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N11 = NIIx with NTTy<int>;
-// ^^^
-// [cfe] Class 'N11' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N11' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N12 extends NIIx with NTTy<int> {}
-// ^^^
-// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NTTy<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N13 = NIIx with NTTx<int>;
-// ^^^
-// [cfe] Class 'N13' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N13' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N14 extends NIIx with NTTx<int> {}
-// ^^^
-// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NTTx<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -232,17 +200,13 @@
abstract class O7 = OII with OBAB<int, int>;
abstract class O8 extends OII with OBAB<int, int> {}
abstract class O9 = OII with OBAB<String, int>;
-// ^^
-// [cfe] Class 'O9' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'O9' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class O10 extends OII with OBAB<String, int> {}
-// ^^^
-// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'OII with OBAB<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class O11 = OII with OTTy<int>;
@@ -280,22 +244,16 @@
}
class G1 = GTTnum with MTTnum;
class G2 = GTTnum with MTTint;
-// ^^
-// [cfe] Class 'G2' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'G2' introduces an erroneous override of 'id'.
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
class G3 = GTTnum with MTT;
-// ^^
-// [cfe] Class 'G3' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'G3' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
class G4 = GTTnum with MTTnumR;
-// ^^
-// [cfe] Class 'G4' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'G4' introduces an erroneous override of 'id'.
// ^^^^^^^
diff --git a/tests/language/regress/regress33235_11_test.dart b/tests/language/regress/regress33235_11_test.dart
index 74710f4..74ccf45 100644
--- a/tests/language/regress/regress33235_11_test.dart
+++ b/tests/language/regress/regress33235_11_test.dart
@@ -14,6 +14,8 @@
static int n() => 42;
// ^
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+ // [cfe] 'n' is already declared in this scope.
+ // ^
// [cfe] Conflicts with setter 'n'.
}
diff --git a/tests/language_2/mixin/invalid_override_in_mixin_test.dart b/tests/language_2/mixin/invalid_override_in_mixin_test.dart
index bd79f66..de7b18c 100644
--- a/tests/language_2/mixin/invalid_override_in_mixin_test.dart
+++ b/tests/language_2/mixin/invalid_override_in_mixin_test.dart
@@ -14,8 +14,6 @@
class C extends Object with A {
// ^
// [cfe] Applying the mixin 'A' to 'Object' introduces an erroneous override of 'noSuchMethod'.
-// ^
-// [cfe] Class 'Object with A' inherits multiple members named 'noSuchMethod' with incompatible signatures.
// ^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
test() {
diff --git a/tests/language_2/mixin/method_override_test.dart b/tests/language_2/mixin/method_override_test.dart
index 137156e..54844a9 100644
--- a/tests/language_2/mixin/method_override_test.dart
+++ b/tests/language_2/mixin/method_override_test.dart
@@ -21,34 +21,26 @@
// Wrong return type.
abstract class C1 = CII with CIS;
-// ^^
-// [cfe] Class 'C1' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'C1' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class C2 extends CII with CIS {}
-// ^^
-// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'CII with CIS' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CIS' to 'CII' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
// Wrong argument type.
abstract class C3 = CII with CSI;
-// ^^
-// [cfe] Class 'C3' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'C3' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class C4 extends CII with CSI {}
-// ^^
-// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'CII with CSI' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CSI' to 'CII' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -56,17 +48,13 @@
abstract class C5 = CII with CTT<int>;
abstract class C6 extends CII with CTT<int> {}
abstract class C7 = CII with CTT<String>;
-// ^^
-// [cfe] Class 'C7' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'C7' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class C8 extends CII with CTT<String> {}
-// ^^
-// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'CII with CTT<String>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'CTT' to 'CII' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -92,34 +80,26 @@
abstract class N2 extends NIIx with NIIxy {}
// It's NOT OK to rename named parameters.
abstract class N3 = NIIx with NIIy;
-// ^^
-// [cfe] Class 'N3' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N3' introduces an erroneous override of 'id'.
// ^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N4 extends NIIx with NIIy {}
-// ^^
-// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NIIy' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NIIy' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
// It's NOT OK to drop named parameters.
abstract class N5 = NIIx with NII;
-// ^^
-// [cfe] Class 'N5' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N5' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N6 extends NIIx with NII {}
-// ^^
-// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NII' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NII' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -139,45 +119,33 @@
abstract class N7 = NIIx with NBABxy<int, int>;
abstract class N8 extends NIIx with NBABxy<int, int> {}
abstract class N9 = NIIx with NBABxy<String, int>;
-// ^^
-// [cfe] Class 'N9' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N9' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N10 extends NIIx with NBABxy<String, int> {}
-// ^^^
-// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NBABxy<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NBABxy' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N11 = NIIx with NTTy<int>;
-// ^^^
-// [cfe] Class 'N11' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N11' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N12 extends NIIx with NTTy<int> {}
-// ^^^
-// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NTTy<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTy' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N13 = NIIx with NTTx<int>;
-// ^^^
-// [cfe] Class 'N13' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'N13' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class N14 extends NIIx with NTTx<int> {}
-// ^^^
-// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'NIIx with NTTx<int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'NTTx' to 'NIIx' introduces an erroneous override of 'id'.
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
@@ -232,17 +200,13 @@
abstract class O7 = OII with OBAB<int, int>;
abstract class O8 extends OII with OBAB<int, int> {}
abstract class O9 = OII with OBAB<String, int>;
-// ^^
-// [cfe] Class 'O9' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'O9' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class O10 extends OII with OBAB<String, int> {}
-// ^^^
-// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
// ^
-// [cfe] Class 'OII with OBAB<String, int>' inherits multiple members named 'id' with incompatible signatures.
+// [cfe] Applying the mixin 'OBAB' to 'OII' introduces an erroneous override of 'id'.
// ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
abstract class O11 = OII with OTTy<int>;
@@ -280,22 +244,16 @@
}
class G1 = GTTnum with MTTnum;
class G2 = GTTnum with MTTint;
-// ^^
-// [cfe] Class 'G2' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'G2' introduces an erroneous override of 'id'.
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
class G3 = GTTnum with MTT;
-// ^^
-// [cfe] Class 'G3' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'G3' introduces an erroneous override of 'id'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
class G4 = GTTnum with MTTnumR;
-// ^^
-// [cfe] Class 'G4' inherits multiple members named 'id' with incompatible signatures.
// ^
// [cfe] The mixin application class 'G4' introduces an erroneous override of 'id'.
// ^^^^^^^
diff --git a/tests/language_2/regress/regress33235_11_test.dart b/tests/language_2/regress/regress33235_11_test.dart
index 74710f4..74ccf45 100644
--- a/tests/language_2/regress/regress33235_11_test.dart
+++ b/tests/language_2/regress/regress33235_11_test.dart
@@ -14,6 +14,8 @@
static int n() => 42;
// ^
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+ // [cfe] 'n' is already declared in this scope.
+ // ^
// [cfe] Conflicts with setter 'n'.
}
diff --git a/tools/VERSION b/tools/VERSION
index 1113dfc..0ee1a68 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 244
+PRERELEASE 245
PRERELEASE_PATCH 0
\ No newline at end of file