library test;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//       int x = /*error:INVALID_ASSIGNMENT*/ i;
//                                            ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
//       int x = /*error:INVALID_ASSIGNMENT*/ i;
//                                            ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
//     String y = /*error:INVALID_ASSIGNMENT*/ x;
//                                             ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
// Try changing the type of the variable.
//   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
//                     ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:76: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
//  - 'Map' is from 'dart:core'.
//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
//  - 'Stream' is from 'dart:async'.
//   await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
//                                                                            ^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

class Foo extends core::Object {
  field core::int* bar = 42;
  synthetic constructor •() → self::Foo*
    : super core::Object::•()
    ;
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
  synthetic constructor •() → self::Bar<self::Bar::T*>*
    : super core::Object::•()
    ;
  method foo(generic-covariant-impl self::Bar::T* t) → dynamic async {
    await for (core::String* i in t) {
      core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
      int x = /*error:INVALID_ASSIGNMENT*/ i;
                                           ^" in i as{TypeError} core::int*;
    }
  }
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = asy::Stream<dynamic>*, S extends self::Baz::E* = asy::Stream<dynamic>*> extends core::Object {
  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
    : super core::Object::•()
    ;
  method foo(generic-covariant-impl self::Baz::S* t) → dynamic async {
    await for (self::Baz::T* i in t) {
      core::int* x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
      int x = /*error:INVALID_ASSIGNMENT*/ i;
                                           ^" in i as{TypeError} core::int*;
      self::Baz::T* y = i;
    }
  }
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
    return null;
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ 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 /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ 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 /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ 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 /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ asyncExpand<E extends core::Object* = dynamic>((self::MyStream::T*) →* asy::Stream<self::MyStream::asyncExpand::E*>* convert) → asy::Stream<self::MyStream::asyncExpand::E*>*; -> asy::Stream::asyncExpand
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ handleError(core::Function* onError, {(dynamic) →* core::bool* test = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::handleError
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ expand<S extends core::Object* = dynamic>((self::MyStream::T*) →* core::Iterable<self::MyStream::expand::S*>* convert) → asy::Stream<self::MyStream::expand::S*>*; -> asy::Stream::expand
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ pipe(generic-covariant-impl asy::StreamConsumer<self::MyStream::T*>* streamConsumer) → asy::Future<dynamic>*; -> asy::Stream::pipe
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ transform<S extends core::Object* = dynamic>(generic-covariant-impl asy::StreamTransformer<self::MyStream::T*, self::MyStream::transform::S*>* streamTransformer) → asy::Stream<self::MyStream::transform::S*>*; -> asy::Stream::transform
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ reduce(generic-covariant-impl (self::MyStream::T*, self::MyStream::T*) →* self::MyStream::T* combine) → asy::Future<self::MyStream::T*>*; -> asy::Stream::reduce
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ fold<S extends core::Object* = dynamic>(self::MyStream::fold::S* initialValue, (self::MyStream::fold::S*, self::MyStream::T*) →* self::MyStream::fold::S* combine) → asy::Future<self::MyStream::fold::S*>*; -> asy::Stream::fold
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ join([core::String* separator = #C2]) → asy::Future<core::String*>*; -> asy::Stream::join
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ contains(core::Object* needle) → asy::Future<core::bool*>*; -> asy::Stream::contains
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ forEach((self::MyStream::T*) →* void action) → asy::Future<dynamic>*; -> asy::Stream::forEach
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ every((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::every
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ any((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::any
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ length() → asy::Future<core::int*>*; -> asy::Stream::length
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ isEmpty() → asy::Future<core::bool*>*; -> asy::Stream::isEmpty
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ cast<R extends core::Object* = dynamic>() → asy::Stream<self::MyStream::cast::R*>*; -> asy::Stream::cast
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ toList() → asy::Future<core::List<self::MyStream::T*>*>*; -> asy::Stream::toList
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ toSet() → asy::Future<core::Set<self::MyStream::T*>*>*; -> asy::Stream::toSet
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ drain<E extends core::Object* = dynamic>([self::MyStream::drain::E* futureValue = #C1]) → asy::Future<self::MyStream::drain::E*>*; -> asy::Stream::drain
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ take(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::take
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ takeWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::takeWhile
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ skip(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skip
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ skipWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skipWhile
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ distinct([(self::MyStream::T*, self::MyStream::T*) →* core::bool* equals = #C1]) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::distinct
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ first() → asy::Future<self::MyStream::T*>*; -> asy::Stream::first
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ last() → asy::Future<self::MyStream::T*>*; -> asy::Stream::last
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ single() → asy::Future<self::MyStream::T*>*; -> asy::Stream::single
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ firstWhere((self::MyStream::T*) →* core::bool* test, {generic-covariant-impl () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::firstWhere
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ lastWhere((self::MyStream::T*) →* core::bool* test, {generic-covariant-impl () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::lastWhere
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ singleWhere((self::MyStream::T*) →* core::bool* test, {generic-covariant-impl () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::singleWhere
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ elementAt(core::int* index) → asy::Future<self::MyStream::T*>*; -> asy::Stream::elementAt
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/async/stream.dart */ timeout(core::Duration* timeLimit, {(asy::EventSink<self::MyStream::T*>*) →* void onTimeout = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::timeout
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method test() → dynamic async {
  self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
  await for (self::Foo* x in myStream) {
    core::String* y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
 - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
    String y = /*error:INVALID_ASSIGNMENT*/ x;
                                            ^" in x as{TypeError} core::String*;
  }
  await for (dynamic x in myStream) {
    core::String* y = x as{TypeError,ForDynamic} core::String*;
  }
  await for (final self::Foo* #t4 in myStream) {
    core::String* x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
 - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
Try changing the type of the variable.
  await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                    ^" in #t4 as{TypeError} core::String*;
    core::String* y = x;
  }
  dynamic z;
  await for (final self::Foo* #t6 in myStream) {
    z = #t6;
    core::String* y = z as{TypeError,ForDynamic} core::String*;
  }
  asy::Stream<dynamic>* stream = myStream;
  await for (final dynamic #t7 in stream) {
    self::Foo* x = #t7 as{TypeError,ForDynamic} self::Foo*;
    self::Foo* y = x;
  }
  dynamic stream2 = myStream;
  await for (final dynamic #t8 in stream2 as{TypeError,ForDynamic} asy::Stream<dynamic>*) {
    self::Foo* x = #t8 as{TypeError,ForDynamic} self::Foo*;
    self::Foo* y = x;
  }
  core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
  await for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:76: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
 - 'Map' is from 'dart:core'.
 - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
 - 'Stream' is from 'dart:async'.
  await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                           ^" in map as{TypeError} asy::Stream<dynamic>*) {
    core::String* y = x as{TypeError,ForDynamic} core::String*;
  }
}
static method main() → dynamic {}

constants  {
  #C1 = null
  #C2 = ""
}
