library;
import self as self;

import "org-dartlang-testcase:///opt_in_lib.dart";

static method main() → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as self2;
import "dart:core" as core;

class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class1::redirect, self2::Class1::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class1<self2::Class1::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object?>() → self2::Class1<self2::Class1::redirect::T%>
    let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object?>() → self2::Class1<self2::Class1::constRedirect::T%>
    let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object?>() → self2::Class1<self2::Class1::fact::T%>
    ;
}
class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class2::redirect, self2::Class2::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class2<self2::Class2::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object>() → self2::Class2<self2::Class2::redirect::T>
    let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::redirect::T #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object>() → self2::Class2<self2::Class2::constRedirect::T>
    let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object>() → self2::Class2<self2::Class2::fact::T>
    ;
}
class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class3::redirect, self2::Class3::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class3<self2::Class3::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::String>() → self2::Class3<self2::Class3::redirect::T>
    let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::redirect::T #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::String>() → self2::Class3<self2::Class3::constRedirect::T>
    let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::String>() → self2::Class3<self2::Class3::fact::T>
    ;
}
class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class4::redirect, self2::Class4::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class4<self2::Class4::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::redirect::T%>
    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::constRedirect::T%>
    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::fact::T%>
    ;
}
class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class5::redirect, self2::Class5::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class5<self2::Class5::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends dynamic>() → self2::Class5<self2::Class5::redirect::T%>
    let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends dynamic>() → self2::Class5<self2::Class5::constRedirect::T%>
    let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends dynamic>() → self2::Class5<self2::Class5::fact::T%>
    ;
}
static method testOptIn() → dynamic
  ;
