main = #lib::main;
 [@vm.bytecode=
BytecodeMetadata {
Bytecode (version: stable)
Main library: #lib
Library '#lib'
    name '#lib'
    script '#lib'

Class '', script = '#lib'

Field '_stdinFD', type = dart:core::int, reflectable, static
    value = const 0

Field '_stdoutFD', type = dart:core::int, reflectable, static
    value = const 1

Field '_stderrFD', type = dart:core::int, reflectable, static
    value = const 2

Field '_rawScript', type = dart:core::String, reflectable, static
    value = null

Field '_stdin', type = #lib::Stdin, reflectable, static
    value = null

Function '_printString', static, reflectable, debuggable, native 'Builtin_PrintString'
    parameters [dart:core::String 's'] (required: 1)
    return-type void

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Builtin_PrintString
}


Function '_print', static, reflectable, debuggable
    parameters [dynamic 'arg'] (required: 1)
    return-type void

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  InterfaceCall        CP#0, 1
  DirectCall           CP#2, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = InterfaceCall 'dart:core::Object::toString', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
  [2] = DirectCall '#lib::_printString', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
}


Function '_getPrintClosure', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const tear-off #lib::_print
}


Function '_setScheduleImmediateClosure', static, reflectable, debuggable
    parameters [FunctionType (FunctionType () -> void) -> void 'closure'] (required: 1)
    return-type void

Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  StoreStaticTOS       CP#0
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_ScheduleImmediate::_closure (field)
}


Function '_setStdioFDs', static, reflectable, debuggable
    parameters [dart:core::int 'stdin', dart:core::int 'stdout', dart:core::int 'stderr'] (required: 3)
    return-type void

Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-7]
  StoreStaticTOS       CP#0
  Push                 FP[-6]
  StoreStaticTOS       CP#1
  Push                 FP[-5]
  StoreStaticTOS       CP#2
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_stdinFD (field)
  [1] = StaticField #lib::_stdoutFD (field)
  [2] = StaticField #lib::_stderrFD (field)
}


Function '_scriptUri', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dart:core::Uri

Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#1
  InterfaceCall        CP#2, 2
  AssertBoolean        0
  JumpIfTrue           L1
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#4
  InterfaceCall        CP#2, 2
  AssertBoolean        0
  PopLocal             r1
  Jump                 L2
L1:
  PushTrue
  PopLocal             r1
L2:
  Push                 r1
  JumpIfTrue           L3
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#5
  InterfaceCall        CP#2, 2
  AssertBoolean        0
  PopLocal             r0
  Jump                 L4
L3:
  PushTrue
  PopLocal             r0
L4:
  Push                 r0
  JumpIfFalse          L5
  PushConstant         CP#0
  PushStatic           CP#0
  DirectCall           CP#6, 1
  ReturnTOS
L5:
  DirectCall           CP#8, 0
  PushNull
  PushConstant         CP#0
  PushStatic           CP#0
  DirectCall           CP#10, 2
  InterfaceCall        CP#12, 2
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_rawScript (field)
  [1] = ObjectRef 'http:'
  [2] = InterfaceCall 'dart:core::String::startsWith', ArgDesc num-args 2, num-type-args 0, names []
  [3] = Reserved
  [4] = ObjectRef 'https:'
  [5] = ObjectRef 'file:'
  [6] = DirectCall 'dart:core::Uri::parse', ArgDesc num-args 1, num-type-args 0, names []
  [7] = Reserved
  [8] = DirectCall 'dart:core::Uri::get:base', ArgDesc num-args 0, num-type-args 0, names []
  [9] = Reserved
  [10] = DirectCall 'dart:core::_Uri::file (constructor)', ArgDesc num-args 2, num-type-args 0, names []
  [11] = Reserved
  [12] = InterfaceCall 'dart:core::Uri::resolveUri', ArgDesc num-args 2, num-type-args 0, names []
  [13] = Reserved
}


Function '_setupHooks', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const tear-off #lib::_scriptUri
  [1] = DirectCall '#lib::VMLibraryHooks::set:platformScript', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
}


Function 'get:stdin', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::Stdin

Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  PushConstant         CP#1
  PushStatic           CP#1
  DirectCall           CP#2, 1
  StoreLocal           r1
  Push                 r1
  StoreStaticTOS       CP#0
  PopLocal             r0
  Jump                 L2
L1:
  PushNull
  PopLocal             r0
L2:
  Push                 r0
  Drop1
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_stdin (field)
  [1] = StaticField #lib::_stdinFD (field)
  [2] = DirectCall '#lib::_StdIOUtils::_getStdioInputStream', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
}


Function 'main', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}

Class '_ScheduleImmediate', script = '#lib'
    extends dart:core::Object

Field '_closure', type = FunctionType (FunctionType () -> void) -> void, reflectable, static
    value = null

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::_ScheduleImmediate

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

Class '_NamespaceImpl', script = '#lib'
    extends dart:core::Object
    implements [#lib::_Namespace]

Field '_cachedNamespace', type = #lib::_NamespaceImpl, reflectable, static
    value = null

Function '_', constructor, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::_NamespaceImpl

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function '_create', static, reflectable, debuggable, native 'Namespace_Create'
    parameters [#lib::_NamespaceImpl 'namespace', dynamic 'n'] (required: 2)
    return-type #lib::_NamespaceImpl

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-6]
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_Create
}


Function '_getPointer', static, reflectable, debuggable, native 'Namespace_GetPointer'
    parameters [#lib::_NamespaceImpl 'namespace'] (required: 1)
    return-type dart:core::int

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_GetPointer
}


Function '_getDefault', static, reflectable, debuggable, native 'Namespace_GetDefault'
    parameters [] (required: 0)
    return-type dart:core::int

Bytecode {
  Entry                0
  CheckStack           0
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_GetDefault
}


Function '_setupNamespace', static, reflectable, debuggable
    parameters [dynamic 'namespace'] (required: 1)
    return-type void

Bytecode {
  Entry                2
  CheckStack           0
  Allocate             CP#0
  StoreLocal           r1
  Push                 r1
  DirectCall           CP#1, 1
  Drop1
  Push                 FP[-5]
  DirectCall           CP#3, 2
  StoreStaticTOS       CP#5
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Class #lib::_NamespaceImpl
  [1] = DirectCall '#lib::_NamespaceImpl::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = DirectCall '#lib::_NamespaceImpl::_create', ArgDesc num-args 2, num-type-args 0, names []
  [4] = Reserved
  [5] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
}


Function 'get:_namespace', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::_NamespaceImpl

Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  Allocate             CP#1
  StoreLocal           r1
  Push                 r1
  DirectCall           CP#2, 1
  Drop1
  DirectCall           CP#4, 0
  DirectCall           CP#6, 2
  StoreStaticTOS       CP#0
L1:
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
  [1] = Class #lib::_NamespaceImpl
  [2] = DirectCall '#lib::_NamespaceImpl::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
  [4] = DirectCall '#lib::_NamespaceImpl::_getDefault', ArgDesc num-args 0, num-type-args 0, names []
  [5] = Reserved
  [6] = DirectCall '#lib::_NamespaceImpl::_create', ArgDesc num-args 2, num-type-args 0, names []
  [7] = Reserved
}


Function 'get:_namespacePointer', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Bytecode {
  Entry                0
  CheckStack           0
  DirectCall           CP#0, 0
  DirectCall           CP#2, 1
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespace', ArgDesc num-args 0, num-type-args 0, names []
  [1] = Reserved
  [2] = DirectCall '#lib::_NamespaceImpl::_getPointer', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
}

Class '_Namespace', script = '#lib'
    extends dart:core::Object


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::_Namespace

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function '_setupNamespace', static, reflectable, debuggable
    parameters [dynamic 'namespace'] (required: 1)
    return-type void

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::_setupNamespace', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'get:_namespace', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::_Namespace

Bytecode {
  Entry                0
  CheckStack           0
  DirectCall           CP#0, 0
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespace', ArgDesc num-args 0, num-type-args 0, names []
  [1] = Reserved
}


Function 'get:_namespacePointer', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dart:core::int

Bytecode {
  Entry                0
  CheckStack           0
  DirectCall           CP#0, 0
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespacePointer', ArgDesc num-args 0, num-type-args 0, names []
  [1] = Reserved
}

Class 'VMLibraryHooks', script = '#lib'
    extends dart:core::Object

Field 'timerFactory', type = dynamic, reflectable, static
    value = null

Field 'eventHandlerSendData', type = dynamic, reflectable, static
    value = null

Field 'timerMillisecondClock', type = dynamic, reflectable, static
    value = null

Field 'resourceReadAsBytes', type = dynamic, reflectable, static
    value = null

Field 'packageRootString', type = dynamic, reflectable, static
    value = null

Field 'packageConfigString', type = dynamic, reflectable, static
    value = null

Field 'packageRootUriFuture', type = dynamic, reflectable, static
    value = null

Field 'packageConfigUriFuture', type = dynamic, reflectable, static
    value = null

Field 'resolvePackageUriFuture', type = dynamic, reflectable, static
    value = null

Field '_computeScriptUri', type = dynamic, reflectable, static
    value = null

Field '_cachedScript', type = dynamic, reflectable, static
    value = null

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::VMLibraryHooks

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'set:platformScript', setter, static, reflectable, debuggable
    parameters [dynamic 'f'] (required: 1)
    return-type void

Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  StoreStaticTOS       CP#0
  PushNull
  StoreStaticTOS       CP#1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
  [1] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
}


Function 'get:platformScript', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  PushConstant         CP#1
  PushStatic           CP#1
  EqualsNull
  BooleanNegateTOS
  PopLocal             r0
  Jump                 L2
L1:
  PushFalse
  PopLocal             r0
L2:
  Push                 r0
  JumpIfFalse          L3
  PushConstant         CP#1
  PushStatic           CP#1
  DynamicCall          CP#3, 1
  StoreStaticTOS       CP#0
L3:
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
  [2] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
  [3] = ICData dynamic target-name 'call', arg-desc CP#2
}

Class 'Stdin', script = '#lib'
    extends dart:core::Object


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::Stdin

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

Class '_StdIOUtils', script = '#lib'
    extends dart:core::Object


Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::_StdIOUtils

Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           CP#0, 1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function '_getStdioInputStream', static, reflectable, debuggable
    parameters [dart:core::int 'fd'] (required: 1)
    return-type #lib::Stdin

Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}


}
]library #lib from "#lib" as #lib {

  typedef _ScheduleImmediateClosure = (() → void) → void;
  class _ScheduleImmediate extends dart.core::Object {
    static field (() → void) → void _closure = null;
    synthetic constructor •() → #lib::_ScheduleImmediate
      : super dart.core::Object::•()
      ;
  }
  class _NamespaceImpl extends dart.core::Object implements #lib::_Namespace {
    static field #lib::_NamespaceImpl _cachedNamespace = null;
    constructor _() → #lib::_NamespaceImpl
      : super dart.core::Object::•()
      ;
    @dart._internal::ExternalName::•("Namespace_Create")
    external static method _create(#lib::_NamespaceImpl namespace, dynamic n) → #lib::_NamespaceImpl;
    @dart._internal::ExternalName::•("Namespace_GetPointer")
    external static method _getPointer(#lib::_NamespaceImpl namespace) → dart.core::int;
    @dart._internal::ExternalName::•("Namespace_GetDefault")
    external static method _getDefault() → dart.core::int;
    static method _setupNamespace(dynamic namespace) → void {
      #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), namespace);
    }
    static get _namespace() → #lib::_NamespaceImpl {
      if(#lib::_NamespaceImpl::_cachedNamespace.{dart.core::Object::==}(null)) {
        #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), #lib::_NamespaceImpl::_getDefault());
      }
      return #lib::_NamespaceImpl::_cachedNamespace;
    }
    static get _namespacePointer() → dart.core::int
      return #lib::_NamespaceImpl::_getPointer(#lib::_NamespaceImpl::_namespace);
  }
  class _Namespace extends dart.core::Object {
    synthetic constructor •() → #lib::_Namespace
      : super dart.core::Object::•()
      ;
    static method _setupNamespace(dynamic namespace) → void {
      #lib::_NamespaceImpl::_setupNamespace(namespace);
    }
    static get _namespace() → #lib::_Namespace
      return #lib::_NamespaceImpl::_namespace;
    static get _namespacePointer() → dart.core::int
      return #lib::_NamespaceImpl::_namespacePointer;
  }
  class VMLibraryHooks extends dart.core::Object {
    static field dynamic timerFactory = null;
    static field dynamic eventHandlerSendData = null;
    static field dynamic timerMillisecondClock = null;
    static field dynamic resourceReadAsBytes = null;
    static field dynamic packageRootString = null;
    static field dynamic packageConfigString = null;
    static field dynamic packageRootUriFuture = null;
    static field dynamic packageConfigUriFuture = null;
    static field dynamic resolvePackageUriFuture = null;
    static field dynamic _computeScriptUri = null;
    static field dynamic _cachedScript = null;
    synthetic constructor •() → #lib::VMLibraryHooks
      : super dart.core::Object::•()
      ;
    static set platformScript(dynamic f) → void {
      #lib::VMLibraryHooks::_computeScriptUri = f;
      #lib::VMLibraryHooks::_cachedScript = null;
    }
    static get platformScript() → dynamic {
      if(#lib::VMLibraryHooks::_cachedScript.{dart.core::Object::==}(null) && !#lib::VMLibraryHooks::_computeScriptUri.{dart.core::Object::==}(null)) {
        #lib::VMLibraryHooks::_cachedScript = [@vm.call-site-attributes.metadata=receiverType:dynamic] #lib::VMLibraryHooks::_computeScriptUri.call();
      }
      return #lib::VMLibraryHooks::_cachedScript;
    }
  }
  class Stdin extends dart.core::Object {
    synthetic constructor •() → #lib::Stdin
      : super dart.core::Object::•()
      ;
  }
  class _StdIOUtils extends dart.core::Object {
    synthetic constructor •() → #lib::_StdIOUtils
      : super dart.core::Object::•()
      ;
    static method _getStdioInputStream(dart.core::int fd) → #lib::Stdin
      return null;
  }
  static field dart.core::int _stdinFD = 0;
  static field dart.core::int _stdoutFD = 1;
  static field dart.core::int _stderrFD = 2;
  static field dart.core::String _rawScript;
  static field #lib::Stdin _stdin;
  @dart._internal::ExternalName::•("Builtin_PrintString")
  external static method _printString(dart.core::String s) → void;
  static method _print(dynamic arg) → void {
    #lib::_printString(arg.{dart.core::Object::toString}());
  }
  static method _getPrintClosure() → dynamic
    return #lib::_print;
  static method _setScheduleImmediateClosure((() → void) → void closure) → void {
    #lib::_ScheduleImmediate::_closure = closure;
  }
  static method _setStdioFDs(dart.core::int stdin, dart.core::int stdout, dart.core::int stderr) → void {
    #lib::_stdinFD = stdin;
    #lib::_stdoutFD = stdout;
    #lib::_stderrFD = stderr;
  }
  static method _scriptUri() → dart.core::Uri {
    if(#lib::_rawScript.{dart.core::String::startsWith}("http:") || #lib::_rawScript.{dart.core::String::startsWith}("https:") || #lib::_rawScript.{dart.core::String::startsWith}("file:")) {
      return dart.core::Uri::parse(#lib::_rawScript);
    }
    else {
      return dart.core::Uri::base.{dart.core::Uri::resolveUri}(dart.core::_Uri::file(#lib::_rawScript));
    }
  }
  static method _setupHooks() → dynamic {
    #lib::VMLibraryHooks::platformScript = #lib::_scriptUri;
  }
  static get stdin() → #lib::Stdin {
    #lib::_stdin.{dart.core::Object::==}(null) ?{#lib::Stdin} #lib::_stdin = #lib::_StdIOUtils::_getStdioInputStream(#lib::_stdinFD) : null;
    return #lib::_stdin;
  }
  static method main() → dynamic {}
}
