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

static method main() → dynamic /* originally async */ {
  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  dynamic :return_value;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        core::bool b = (() → core::bool => true)(){() → core::bool};
        (dynamic _) → core::int? {
          if(b)
            return 42;
        };
        (dynamic _) → asy::Future<core::int?> /* originally async */ {
          final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
          core::bool* :is_sync = false;
          core::int? :return_value;
          (dynamic) → dynamic :async_op_then;
          (core::Object, core::StackTrace) → dynamic :async_op_error;
          core::int :await_jump_var = 0;
          dynamic :await_ctx_var;
          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
            try {
              #L2:
              {
                if(b) {
                  :return_value = 42;
                  break #L2;
                }
              }
              asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
              return;
            }
            on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
            }
          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
          :async_op(){() → dynamic};
          :is_sync = true;
          return :async_future;
        };
      }
      asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
      return;
    }
    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_op(){() → dynamic};
  :is_sync = true;
  return :async_future;
}
