dart_library.library('dart_sdk', null, /* Imports */[
], function load__dart_sdk(exports) {
  'use strict';
  const dart = Object.create(null);
  const dartx = Object.create(null);
  const _debugger = Object.create(null);
  const _foreign_helper = Object.create(null);
  const _interceptors = Object.create(null);
  const _internal = Object.create(null);
  const _isolate_helper = Object.create(null);
  const _js_embedded_names = Object.create(null);
  const _js_helper = Object.create(null);
  const _js_mirrors = Object.create(null);
  const _js_primitives = Object.create(null);
  const _metadata = Object.create(null);
  const _native_typed_data = Object.create(null);
  const async = Object.create(null);
  const collection = Object.create(null);
  const convert = Object.create(null);
  const core = Object.create(null);
  const developer = Object.create(null);
  const io = Object.create(null);
  const isolate = Object.create(null);
  const js = Object.create(null);
  const js_util = Object.create(null);
  const math = Object.create(null);
  const mirrors = Object.create(null);
  const typed_data = Object.create(null);
  const indexed_db = Object.create(null);
  const html$ = Object.create(null);
  const html_common = Object.create(null);
  const svg$ = Object.create(null);
  const web_audio = Object.create(null);
  const web_gl = Object.create(null);
  const web_sql = Object.create(null);
  let ListOfObject = () => (ListOfObject = dart.constFn(core.List$(core.Object)))();
  let JSArrayOfListOfObject = () => (JSArrayOfListOfObject = dart.constFn(_interceptors.JSArray$(ListOfObject())))();
  let JSArrayOfObject = () => (JSArrayOfObject = dart.constFn(_interceptors.JSArray$(core.Object)))();
  let MapOfSymbol$dynamic = () => (MapOfSymbol$dynamic = dart.constFn(core.Map$(core.Symbol, dart.dynamic)))();
  let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
  let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
  let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
  let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
  let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
  let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
  let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
  let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
  let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
  let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
  let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
  let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
  let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
  let JSMutableArray = () => (JSMutableArray = dart.constFn(_interceptors.JSMutableArray$()))();
  let JSFixedArray = () => (JSFixedArray = dart.constFn(_interceptors.JSFixedArray$()))();
  let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
  let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
  let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
  let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
  let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
  let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
  let ComparableOfnum = () => (ComparableOfnum = dart.constFn(core.Comparable$(core.num)))();
  let StringTonum = () => (StringTonum = dart.constFn(dart.functionType(core.num, [core.String])))();
  let StringTodouble = () => (StringTodouble = dart.constFn(dart.functionType(core.double, [core.String])))();
  let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.functionType(core.bool, [dart.dynamic])))();
  let ListMixin = () => (ListMixin = dart.constFn(collection.ListMixin$()))();
  let ListBase = () => (ListBase = dart.constFn(collection.ListBase$()))();
  let UnmodifiableListMixin = () => (UnmodifiableListMixin = dart.constFn(_internal.UnmodifiableListMixin$()))();
  let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
  let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
  let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
  let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
  let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
  let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
  let _Transformation = () => (_Transformation = dart.constFn(_internal._Transformation$()))();
  let MappedIterable = () => (MappedIterable = dart.constFn(_internal.MappedIterable$()))();
  let EfficientLengthMappedIterable = () => (EfficientLengthMappedIterable = dart.constFn(_internal.EfficientLengthMappedIterable$()))();
  let Iterator = () => (Iterator = dart.constFn(core.Iterator$()))();
  let MappedIterator = () => (MappedIterator = dart.constFn(_internal.MappedIterator$()))();
  let MappedListIterable = () => (MappedListIterable = dart.constFn(_internal.MappedListIterable$()))();
  let _ElementPredicate = () => (_ElementPredicate = dart.constFn(_internal._ElementPredicate$()))();
  let WhereIterable = () => (WhereIterable = dart.constFn(_internal.WhereIterable$()))();
  let WhereIterator = () => (WhereIterator = dart.constFn(_internal.WhereIterator$()))();
  let _ExpandFunction = () => (_ExpandFunction = dart.constFn(_internal._ExpandFunction$()))();
  let ExpandIterable = () => (ExpandIterable = dart.constFn(_internal.ExpandIterable$()))();
  let ExpandIterator = () => (ExpandIterator = dart.constFn(_internal.ExpandIterator$()))();
  let TakeIterable = () => (TakeIterable = dart.constFn(_internal.TakeIterable$()))();
  let EfficientLengthTakeIterable = () => (EfficientLengthTakeIterable = dart.constFn(_internal.EfficientLengthTakeIterable$()))();
  let TakeIterator = () => (TakeIterator = dart.constFn(_internal.TakeIterator$()))();
  let TakeWhileIterable = () => (TakeWhileIterable = dart.constFn(_internal.TakeWhileIterable$()))();
  let TakeWhileIterator = () => (TakeWhileIterator = dart.constFn(_internal.TakeWhileIterator$()))();
  let SkipIterable = () => (SkipIterable = dart.constFn(_internal.SkipIterable$()))();
  let EfficientLengthSkipIterable = () => (EfficientLengthSkipIterable = dart.constFn(_internal.EfficientLengthSkipIterable$()))();
  let SkipIterator = () => (SkipIterator = dart.constFn(_internal.SkipIterator$()))();
  let SkipWhileIterable = () => (SkipWhileIterable = dart.constFn(_internal.SkipWhileIterable$()))();
  let SkipWhileIterator = () => (SkipWhileIterator = dart.constFn(_internal.SkipWhileIterator$()))();
  let EmptyIterable = () => (EmptyIterable = dart.constFn(_internal.EmptyIterable$()))();
  let EmptyIterator = () => (EmptyIterator = dart.constFn(_internal.EmptyIterator$()))();
  let FixedLengthListMixin = () => (FixedLengthListMixin = dart.constFn(_internal.FixedLengthListMixin$()))();
  let FixedLengthListBase = () => (FixedLengthListBase = dart.constFn(_internal.FixedLengthListBase$()))();
  let ListMapView = () => (ListMapView = dart.constFn(_internal.ListMapView$()))();
  let ReversedListIterable = () => (ReversedListIterable = dart.constFn(_internal.ReversedListIterable$()))();
  let MapOfint$_IsolateContext = () => (MapOfint$_IsolateContext = dart.constFn(core.Map$(core.int, _isolate_helper._IsolateContext)))();
  let MapOfint$dynamic = () => (MapOfint$dynamic = dart.constFn(core.Map$(core.int, dart.dynamic)))();
  let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
  let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
  let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
  let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
  let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
  let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
  let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic])))();
  let StringTovoid = () => (StringTovoid = dart.constFn(dart.functionType(dart.void, [core.String])))();
  let ExpandoOfint = () => (ExpandoOfint = dart.constFn(core.Expando$(core.int)))();
  let _FutureOfString = () => (_FutureOfString = dart.constFn(async._Future$(core.String)))();
  let _FutureOfbool = () => (_FutureOfbool = dart.constFn(async._Future$(core.bool)))();
  let _FutureOfint = () => (_FutureOfint = dart.constFn(async._Future$(core.int)))();
  let VoidToObject = () => (VoidToObject = dart.constFn(dart.functionType(core.Object, [])))();
  let Stream = () => (Stream = dart.constFn(async.Stream$()))();
  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.functionType(dart.void, [])))();
  let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.functionType(dart.void, [async.Timer])))();
  let MapOfdynamic$int = () => (MapOfdynamic$int = dart.constFn(core.Map$(dart.dynamic, core.int)))();
  let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic])))();
  let InternalMap = () => (InternalMap = dart.constFn(_js_helper.InternalMap$()))();
  let JSArrayOfint = () => (JSArrayOfint = dart.constFn(_interceptors.JSArray$(core.int)))();
  let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
  let SyncIterator = () => (SyncIterator = dart.constFn(_js_helper.SyncIterator$()))();
  let IterableBase = () => (IterableBase = dart.constFn(collection.IterableBase$()))();
  let SyncIterable = () => (SyncIterable = dart.constFn(_js_helper.SyncIterable$()))();
  let JsLinkedHashMap = () => (JsLinkedHashMap = dart.constFn(_js_helper.JsLinkedHashMap$()))();
  let Es6LinkedHashMap = () => (Es6LinkedHashMap = dart.constFn(_js_helper.Es6LinkedHashMap$()))();
  let LinkedHashMapCell = () => (LinkedHashMapCell = dart.constFn(_js_helper.LinkedHashMapCell$()))();
  let LinkedHashMapKeyIterable = () => (LinkedHashMapKeyIterable = dart.constFn(_js_helper.LinkedHashMapKeyIterable$()))();
  let LinkedHashMapKeyIterator = () => (LinkedHashMapKeyIterator = dart.constFn(_js_helper.LinkedHashMapKeyIterator$()))();
  let IteratorOfMatch = () => (IteratorOfMatch = dart.constFn(core.Iterator$(core.Match)))();
  let IterableOfMatch = () => (IterableOfMatch = dart.constFn(core.Iterable$(core.Match)))();
  let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
  let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
  let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
  let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
  let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
  let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
  let JSArrayOfClassMirror = () => (JSArrayOfClassMirror = dart.constFn(_interceptors.JSArray$(mirrors.ClassMirror)))();
  let ListOfClassMirror = () => (ListOfClassMirror = dart.constFn(core.List$(mirrors.ClassMirror)))();
  let ListOfTypeVariableMirror = () => (ListOfTypeVariableMirror = dart.constFn(core.List$(mirrors.TypeVariableMirror)))();
  let MapOfSymbol$MethodMirror = () => (MapOfSymbol$MethodMirror = dart.constFn(core.Map$(core.Symbol, mirrors.MethodMirror)))();
  let JSArrayOfType = () => (JSArrayOfType = dart.constFn(_interceptors.JSArray$(core.Type)))();
  let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
  let ListOfFloat32x4 = () => (ListOfFloat32x4 = dart.constFn(core.List$(typed_data.Float32x4)))();
  let ListOfInt32x4 = () => (ListOfInt32x4 = dart.constFn(core.List$(typed_data.Int32x4)))();
  let ListOfFloat64x2 = () => (ListOfFloat64x2 = dart.constFn(core.List$(typed_data.Float64x2)))();
  let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
  let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
  let ListOfdouble = () => (ListOfdouble = dart.constFn(core.List$(core.double)))();
  let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
  let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
  let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
  let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
  let ZoneBinaryCallbackOfdynamic$Object$StackTrace = () => (ZoneBinaryCallbackOfdynamic$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, core.Object, core.StackTrace)))();
  let _BufferingStreamSubscription = () => (_BufferingStreamSubscription = dart.constFn(async._BufferingStreamSubscription$()))();
  let _ControllerSubscription = () => (_ControllerSubscription = dart.constFn(async._ControllerSubscription$()))();
  let _BroadcastSubscription = () => (_BroadcastSubscription = dart.constFn(async._BroadcastSubscription$()))();
  let _BroadcastStreamController = () => (_BroadcastStreamController = dart.constFn(async._BroadcastStreamController$()))();
  let _SyncBroadcastStreamController = () => (_SyncBroadcastStreamController = dart.constFn(async._SyncBroadcastStreamController$()))();
  let _AsyncBroadcastStreamController = () => (_AsyncBroadcastStreamController = dart.constFn(async._AsyncBroadcastStreamController$()))();
  let _AsBroadcastStreamController = () => (_AsBroadcastStreamController = dart.constFn(async._AsBroadcastStreamController$()))();
  let _DoneSubscription = () => (_DoneSubscription = dart.constFn(async._DoneSubscription$()))();
  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.functionType(dart.dynamic, [])))();
  let Future = () => (Future = dart.constFn(async.Future$()))();
  let Completer = () => (Completer = dart.constFn(async.Completer$()))();
  let _FutureOnValue = () => (_FutureOnValue = dart.constFn(async._FutureOnValue$()))();
  let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
  let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
  let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
  let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
  let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
  let _Future = () => (_Future = dart.constFn(async._Future$()))();
  let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
  let EventSink = () => (EventSink = dart.constFn(async.EventSink$()))();
  let StreamView = () => (StreamView = dart.constFn(async.StreamView$()))();
  let StreamConsumer = () => (StreamConsumer = dart.constFn(async.StreamConsumer$()))();
  let StreamSink = () => (StreamSink = dart.constFn(async.StreamSink$()))();
  let StreamTransformer = () => (StreamTransformer = dart.constFn(async.StreamTransformer$()))();
  let StreamIterator = () => (StreamIterator = dart.constFn(async.StreamIterator$()))();
  let _ControllerEventSinkWrapper = () => (_ControllerEventSinkWrapper = dart.constFn(async._ControllerEventSinkWrapper$()))();
  let StreamController = () => (StreamController = dart.constFn(async.StreamController$()))();
  let SynchronousStreamController = () => (SynchronousStreamController = dart.constFn(async.SynchronousStreamController$()))();
  let _StreamControllerLifecycle = () => (_StreamControllerLifecycle = dart.constFn(async._StreamControllerLifecycle$()))();
  let _StreamController = () => (_StreamController = dart.constFn(async._StreamController$()))();
  let _SyncStreamControllerDispatch = () => (_SyncStreamControllerDispatch = dart.constFn(async._SyncStreamControllerDispatch$()))();
  let _AsyncStreamControllerDispatch = () => (_AsyncStreamControllerDispatch = dart.constFn(async._AsyncStreamControllerDispatch$()))();
  let _AsyncStreamController = () => (_AsyncStreamController = dart.constFn(async._AsyncStreamController$()))();
  let _SyncStreamController = () => (_SyncStreamController = dart.constFn(async._SyncStreamController$()))();
  let _StreamSinkWrapper = () => (_StreamSinkWrapper = dart.constFn(async._StreamSinkWrapper$()))();
  let _AddStreamState = () => (_AddStreamState = dart.constFn(async._AddStreamState$()))();
  let _StreamControllerAddStreamState = () => (_StreamControllerAddStreamState = dart.constFn(async._StreamControllerAddStreamState$()))();
  let _EventSink = () => (_EventSink = dart.constFn(async._EventSink$()))();
  let _EventDispatch = () => (_EventDispatch = dart.constFn(async._EventDispatch$()))();
  let _EventGenerator = () => (_EventGenerator = dart.constFn(async._EventGenerator$()))();
  let _GeneratedStreamImpl = () => (_GeneratedStreamImpl = dart.constFn(async._GeneratedStreamImpl$()))();
  let _PendingEvents = () => (_PendingEvents = dart.constFn(async._PendingEvents$()))();
  let _IterablePendingEvents = () => (_IterablePendingEvents = dart.constFn(async._IterablePendingEvents$()))();
  let _DataHandler = () => (_DataHandler = dart.constFn(async._DataHandler$()))();
  let _DelayedEvent = () => (_DelayedEvent = dart.constFn(async._DelayedEvent$()))();
  let _DelayedData = () => (_DelayedData = dart.constFn(async._DelayedData$()))();
  let _StreamImplEvents = () => (_StreamImplEvents = dart.constFn(async._StreamImplEvents$()))();
  let _BroadcastCallback = () => (_BroadcastCallback = dart.constFn(async._BroadcastCallback$()))();
  let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
  let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
  let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
  let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
  let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
  let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
  let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
  let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
  let _WhereStream = () => (_WhereStream = dart.constFn(async._WhereStream$()))();
  let _Transformation$ = () => (_Transformation$ = dart.constFn(async._Transformation$()))();
  let _MapStream = () => (_MapStream = dart.constFn(async._MapStream$()))();
  let _ExpandStream = () => (_ExpandStream = dart.constFn(async._ExpandStream$()))();
  let _HandleErrorStream = () => (_HandleErrorStream = dart.constFn(async._HandleErrorStream$()))();
  let _TakeStream = () => (_TakeStream = dart.constFn(async._TakeStream$()))();
  let _StateStreamSubscription = () => (_StateStreamSubscription = dart.constFn(async._StateStreamSubscription$()))();
  let _TakeWhileStream = () => (_TakeWhileStream = dart.constFn(async._TakeWhileStream$()))();
  let _SkipStream = () => (_SkipStream = dart.constFn(async._SkipStream$()))();
  let _SkipWhileStream = () => (_SkipWhileStream = dart.constFn(async._SkipWhileStream$()))();
  let _Equality = () => (_Equality = dart.constFn(async._Equality$()))();
  let _DistinctStream = () => (_DistinctStream = dart.constFn(async._DistinctStream$()))();
  let _EventSinkWrapper = () => (_EventSinkWrapper = dart.constFn(async._EventSinkWrapper$()))();
  let _SinkTransformerStreamSubscription = () => (_SinkTransformerStreamSubscription = dart.constFn(async._SinkTransformerStreamSubscription$()))();
  let _SinkMapper = () => (_SinkMapper = dart.constFn(async._SinkMapper$()))();
  let _StreamSinkTransformer = () => (_StreamSinkTransformer = dart.constFn(async._StreamSinkTransformer$()))();
  let _BoundSinkStream = () => (_BoundSinkStream = dart.constFn(async._BoundSinkStream$()))();
  let _TransformDataHandler = () => (_TransformDataHandler = dart.constFn(async._TransformDataHandler$()))();
  let _TransformErrorHandler = () => (_TransformErrorHandler = dart.constFn(async._TransformErrorHandler$()))();
  let _TransformDoneHandler = () => (_TransformDoneHandler = dart.constFn(async._TransformDoneHandler$()))();
  let _HandlerEventSink = () => (_HandlerEventSink = dart.constFn(async._HandlerEventSink$()))();
  let _StreamHandlerTransformer = () => (_StreamHandlerTransformer = dart.constFn(async._StreamHandlerTransformer$()))();
  let _SubscriptionTransformer = () => (_SubscriptionTransformer = dart.constFn(async._SubscriptionTransformer$()))();
  let _StreamSubscriptionTransformer = () => (_StreamSubscriptionTransformer = dart.constFn(async._StreamSubscriptionTransformer$()))();
  let _BoundSubscriptionStream = () => (_BoundSubscriptionStream = dart.constFn(async._BoundSubscriptionStream$()))();
  let ZoneCallback = () => (ZoneCallback = dart.constFn(async.ZoneCallback$()))();
  let ZoneUnaryCallback = () => (ZoneUnaryCallback = dart.constFn(async.ZoneUnaryCallback$()))();
  let ZoneBinaryCallback = () => (ZoneBinaryCallback = dart.constFn(async.ZoneBinaryCallback$()))();
  let HandleUncaughtErrorHandler = () => (HandleUncaughtErrorHandler = dart.constFn(async.HandleUncaughtErrorHandler$()))();
  let RunHandler = () => (RunHandler = dart.constFn(async.RunHandler$()))();
  let RunUnaryHandler = () => (RunUnaryHandler = dart.constFn(async.RunUnaryHandler$()))();
  let RunBinaryHandler = () => (RunBinaryHandler = dart.constFn(async.RunBinaryHandler$()))();
  let RegisterCallbackHandler = () => (RegisterCallbackHandler = dart.constFn(async.RegisterCallbackHandler$()))();
  let RegisterUnaryCallbackHandler = () => (RegisterUnaryCallbackHandler = dart.constFn(async.RegisterUnaryCallbackHandler$()))();
  let RegisterBinaryCallbackHandler = () => (RegisterBinaryCallbackHandler = dart.constFn(async.RegisterBinaryCallbackHandler$()))();
  let _ZoneFunction = () => (_ZoneFunction = dart.constFn(async._ZoneFunction$()))();
  let _ZoneFunctionOfRunHandler = () => (_ZoneFunctionOfRunHandler = dart.constFn(async._ZoneFunction$(async.RunHandler)))();
  let _ZoneFunctionOfRunUnaryHandler = () => (_ZoneFunctionOfRunUnaryHandler = dart.constFn(async._ZoneFunction$(async.RunUnaryHandler)))();
  let _ZoneFunctionOfRunBinaryHandler = () => (_ZoneFunctionOfRunBinaryHandler = dart.constFn(async._ZoneFunction$(async.RunBinaryHandler)))();
  let _ZoneFunctionOfRegisterCallbackHandler = () => (_ZoneFunctionOfRegisterCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterCallbackHandler)))();
  let _ZoneFunctionOfRegisterUnaryCallbackHandler = () => (_ZoneFunctionOfRegisterUnaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterUnaryCallbackHandler)))();
  let _ZoneFunctionOfRegisterBinaryCallbackHandler = () => (_ZoneFunctionOfRegisterBinaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterBinaryCallbackHandler)))();
  let _ZoneFunctionOfErrorCallbackHandler = () => (_ZoneFunctionOfErrorCallbackHandler = dart.constFn(async._ZoneFunction$(async.ErrorCallbackHandler)))();
  let _ZoneFunctionOfScheduleMicrotaskHandler = () => (_ZoneFunctionOfScheduleMicrotaskHandler = dart.constFn(async._ZoneFunction$(async.ScheduleMicrotaskHandler)))();
  let _ZoneFunctionOfCreateTimerHandler = () => (_ZoneFunctionOfCreateTimerHandler = dart.constFn(async._ZoneFunction$(async.CreateTimerHandler)))();
  let _ZoneFunctionOfCreatePeriodicTimerHandler = () => (_ZoneFunctionOfCreatePeriodicTimerHandler = dart.constFn(async._ZoneFunction$(async.CreatePeriodicTimerHandler)))();
  let _ZoneFunctionOfPrintHandler = () => (_ZoneFunctionOfPrintHandler = dart.constFn(async._ZoneFunction$(async.PrintHandler)))();
  let _ZoneFunctionOfForkHandler = () => (_ZoneFunctionOfForkHandler = dart.constFn(async._ZoneFunction$(async.ForkHandler)))();
  let _ZoneFunctionOfHandleUncaughtErrorHandler = () => (_ZoneFunctionOfHandleUncaughtErrorHandler = dart.constFn(async._ZoneFunction$(async.HandleUncaughtErrorHandler)))();
  let _HashMap = () => (_HashMap = dart.constFn(collection._HashMap$()))();
  let _IdentityHashMap = () => (_IdentityHashMap = dart.constFn(collection._IdentityHashMap$()))();
  let _PredicateOfObject = () => (_PredicateOfObject = dart.constFn(collection._Predicate$(core.Object)))();
  let _CustomHashMap = () => (_CustomHashMap = dart.constFn(collection._CustomHashMap$()))();
  let _HashMapKeyIterable = () => (_HashMapKeyIterable = dart.constFn(collection._HashMapKeyIterable$()))();
  let _HashMapKeyIterator = () => (_HashMapKeyIterator = dart.constFn(collection._HashMapKeyIterator$()))();
  let _LinkedIdentityHashMap = () => (_LinkedIdentityHashMap = dart.constFn(collection._LinkedIdentityHashMap$()))();
  let _Es6LinkedIdentityHashMap = () => (_Es6LinkedIdentityHashMap = dart.constFn(collection._Es6LinkedIdentityHashMap$()))();
  let _Es6MapIterable = () => (_Es6MapIterable = dart.constFn(collection._Es6MapIterable$()))();
  let _Es6MapIterator = () => (_Es6MapIterator = dart.constFn(collection._Es6MapIterator$()))();
  let _LinkedCustomHashMap = () => (_LinkedCustomHashMap = dart.constFn(collection._LinkedCustomHashMap$()))();
  let IterableOfObject = () => (IterableOfObject = dart.constFn(core.Iterable$(core.Object)))();
  let SetOfObject = () => (SetOfObject = dart.constFn(core.Set$(core.Object)))();
  let SetMixin = () => (SetMixin = dart.constFn(collection.SetMixin$()))();
  let SetBase = () => (SetBase = dart.constFn(collection.SetBase$()))();
  let _HashSetBase = () => (_HashSetBase = dart.constFn(collection._HashSetBase$()))();
  let _HashSet = () => (_HashSet = dart.constFn(collection._HashSet$()))();
  let _IdentityHashSet = () => (_IdentityHashSet = dart.constFn(collection._IdentityHashSet$()))();
  let _CustomHashSet = () => (_CustomHashSet = dart.constFn(collection._CustomHashSet$()))();
  let _HashSetIterator = () => (_HashSetIterator = dart.constFn(collection._HashSetIterator$()))();
  let _LinkedHashSet = () => (_LinkedHashSet = dart.constFn(collection._LinkedHashSet$()))();
  let _LinkedIdentityHashSet = () => (_LinkedIdentityHashSet = dart.constFn(collection._LinkedIdentityHashSet$()))();
  let _LinkedCustomHashSet = () => (_LinkedCustomHashSet = dart.constFn(collection._LinkedCustomHashSet$()))();
  let _LinkedHashSetCell = () => (_LinkedHashSetCell = dart.constFn(collection._LinkedHashSetCell$()))();
  let _LinkedHashSetIterator = () => (_LinkedHashSetIterator = dart.constFn(collection._LinkedHashSetIterator$()))();
  let UnmodifiableListView = () => (UnmodifiableListView = dart.constFn(collection.UnmodifiableListView$()))();
  let _Equality$ = () => (_Equality$ = dart.constFn(collection._Equality$()))();
  let _Hasher = () => (_Hasher = dart.constFn(collection._Hasher$()))();
  let HashMap = () => (HashMap = dart.constFn(collection.HashMap$()))();
  let HashSet = () => (HashSet = dart.constFn(collection.HashSet$()))();
  let IterableMixin = () => (IterableMixin = dart.constFn(collection.IterableMixin$()))();
  let HasNextIterator = () => (HasNextIterator = dart.constFn(collection.HasNextIterator$()))();
  let LinkedHashMap = () => (LinkedHashMap = dart.constFn(collection.LinkedHashMap$()))();
  let LinkedHashSet = () => (LinkedHashSet = dart.constFn(collection.LinkedHashSet$()))();
  let LinkedList = () => (LinkedList = dart.constFn(collection.LinkedList$()))();
  let _LinkedListIterator = () => (_LinkedListIterator = dart.constFn(collection._LinkedListIterator$()))();
  let LinkedListEntry = () => (LinkedListEntry = dart.constFn(collection.LinkedListEntry$()))();
  let MapMixin = () => (MapMixin = dart.constFn(collection.MapMixin$()))();
  let MapBase = () => (MapBase = dart.constFn(collection.MapBase$()))();
  let _UnmodifiableMapMixin = () => (_UnmodifiableMapMixin = dart.constFn(collection._UnmodifiableMapMixin$()))();
  let UnmodifiableMapBase = () => (UnmodifiableMapBase = dart.constFn(collection.UnmodifiableMapBase$()))();
  let _MapBaseValueIterable = () => (_MapBaseValueIterable = dart.constFn(collection._MapBaseValueIterable$()))();
  let _MapBaseValueIterator = () => (_MapBaseValueIterator = dart.constFn(collection._MapBaseValueIterator$()))();
  let MapView = () => (MapView = dart.constFn(collection.MapView$()))();
  let UnmodifiableMapView = () => (UnmodifiableMapView = dart.constFn(collection.UnmodifiableMapView$()))();
  let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic, dart.dynamic])))();
  let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
  let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
  let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
  let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
  let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
  let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
  let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
  let DoubleLinkedQueue = () => (DoubleLinkedQueue = dart.constFn(collection.DoubleLinkedQueue$()))();
  let _DoubleLinkedQueueIterator = () => (_DoubleLinkedQueueIterator = dart.constFn(collection._DoubleLinkedQueueIterator$()))();
  let ListQueue = () => (ListQueue = dart.constFn(collection.ListQueue$()))();
  let _ListQueueIterator = () => (_ListQueueIterator = dart.constFn(collection._ListQueueIterator$()))();
  let _Predicate$ = () => (_Predicate$ = dart.constFn(collection._Predicate$()))();
  let _SplayTreeNode = () => (_SplayTreeNode = dart.constFn(collection._SplayTreeNode$()))();
  let _SplayTreeMapNode = () => (_SplayTreeMapNode = dart.constFn(collection._SplayTreeMapNode$()))();
  let _SplayTree = () => (_SplayTree = dart.constFn(collection._SplayTree$()))();
  let _TypeTest = () => (_TypeTest = dart.constFn(collection._TypeTest$()))();
  let SplayTreeMap = () => (SplayTreeMap = dart.constFn(collection.SplayTreeMap$()))();
  let _SplayTreeIterator = () => (_SplayTreeIterator = dart.constFn(collection._SplayTreeIterator$()))();
  let _SplayTreeKeyIterable = () => (_SplayTreeKeyIterable = dart.constFn(collection._SplayTreeKeyIterable$()))();
  let _SplayTreeValueIterable = () => (_SplayTreeValueIterable = dart.constFn(collection._SplayTreeValueIterable$()))();
  let _SplayTreeKeyIterator = () => (_SplayTreeKeyIterator = dart.constFn(collection._SplayTreeKeyIterator$()))();
  let _SplayTreeValueIterator = () => (_SplayTreeValueIterator = dart.constFn(collection._SplayTreeValueIterator$()))();
  let _SplayTreeNodeIterator = () => (_SplayTreeNodeIterator = dart.constFn(collection._SplayTreeNodeIterator$()))();
  let SplayTreeSet = () => (SplayTreeSet = dart.constFn(collection.SplayTreeSet$()))();
  let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
  let MappedIterableOfString$dynamic = () => (MappedIterableOfString$dynamic = dart.constFn(_internal.MappedIterable$(core.String, dart.dynamic)))();
  let SinkOfObject = () => (SinkOfObject = dart.constFn(core.Sink$(core.Object)))();
  let Codec = () => (Codec = dart.constFn(convert.Codec$()))();
  let ComparableOfString = () => (ComparableOfString = dart.constFn(core.Comparable$(core.String)))();
  let List = () => (List = dart.constFn(core.List$()))();
  let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
  let MapOfString$Encoding = () => (MapOfString$Encoding = dart.constFn(core.Map$(core.String, convert.Encoding)))();
  let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
  let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
  let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
  let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
  let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.functionType(dart.void, [ListOfint()])))();
  let _ChunkedConversionCallback = () => (_ChunkedConversionCallback = dart.constFn(convert._ChunkedConversionCallback$()))();
  let ChunkedConverter = () => (ChunkedConverter = dart.constFn(convert.ChunkedConverter$()))();
  let _SimpleCallbackSink = () => (_SimpleCallbackSink = dart.constFn(convert._SimpleCallbackSink$()))();
  let _ConverterStreamEventSink = () => (_ConverterStreamEventSink = dart.constFn(convert._ConverterStreamEventSink$()))();
  let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
  let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
  let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
  let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
  let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
  let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
  let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
  let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
  let Comparator = () => (Comparator = dart.constFn(core.Comparator$()))();
  let Comparable = () => (Comparable = dart.constFn(core.Comparable$()))();
  let ComparableOfDateTime = () => (ComparableOfDateTime = dart.constFn(core.Comparable$(core.DateTime)))();
  let ComparableOfDuration = () => (ComparableOfDuration = dart.constFn(core.Comparable$(core.Duration)))();
  let Expando = () => (Expando = dart.constFn(core.Expando$()))();
  let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
  let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
  let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
  let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
  let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
  let Set = () => (Set = dart.constFn(core.Set$()))();
  let Sink = () => (Sink = dart.constFn(core.Sink$()))();
  let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
  let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
  let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
  let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
  let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
  let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
  let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
  let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
  let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
  let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
  let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
  let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
  let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
  let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
  let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
  let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
  let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
  let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
  let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
  let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
  let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
  let ListOfFileSystemEntityType = () => (ListOfFileSystemEntityType = dart.constFn(core.List$(io.FileSystemEntityType)))();
  let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
  let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
  let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
  let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
  let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
  let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
  let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
  let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
  let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
  let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
  let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
  let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
  let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
  let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
  let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
  let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
  let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
  let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
  let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
  let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
  let JSArrayOf_Credentials = () => (JSArrayOf_Credentials = dart.constFn(_interceptors.JSArray$(io._Credentials)))();
  let JSArrayOf_ProxyCredentials = () => (JSArrayOf_ProxyCredentials = dart.constFn(_interceptors.JSArray$(io._ProxyCredentials)))();
  let FutureOf_HttpClientRequest = () => (FutureOf_HttpClientRequest = dart.constFn(async.Future$(io._HttpClientRequest)))();
  let X509CertificateAndStringAndintTobool = () => (X509CertificateAndStringAndintTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate, core.String, core.int])))();
  let FutureOfbool = () => (FutureOfbool = dart.constFn(async.Future$(core.bool)))();
  let UriAndStringAndStringToFutureOfbool = () => (UriAndStringAndStringToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.Uri, core.String, core.String])))();
  let StringAndintAndString__ToFutureOfbool = () => (StringAndintAndString__ToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.String, core.int, core.String, core.String])))();
  let UriToString = () => (UriToString = dart.constFn(dart.functionType(core.String, [core.Uri])))();
  let MapOfString$_ConnectionTarget = () => (MapOfString$_ConnectionTarget = dart.constFn(core.Map$(core.String, io._ConnectionTarget)))();
  let ListOf_Credentials = () => (ListOf_Credentials = dart.constFn(core.List$(io._Credentials)))();
  let ListOf_ProxyCredentials = () => (ListOf_ProxyCredentials = dart.constFn(core.List$(io._ProxyCredentials)))();
  let MapOfint$_HttpConnection = () => (MapOfint$_HttpConnection = dart.constFn(core.Map$(core.int, io._HttpConnection)))();
  let HashMapOfint$_HttpConnection = () => (HashMapOfint$_HttpConnection = dart.constFn(collection.HashMap$(core.int, io._HttpConnection)))();
  let LinkedListOf_HttpConnection = () => (LinkedListOf_HttpConnection = dart.constFn(collection.LinkedList$(io._HttpConnection)))();
  let StreamControllerOfHttpRequest = () => (StreamControllerOfHttpRequest = dart.constFn(async.StreamController$(io.HttpRequest)))();
  let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
  let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
  let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
  let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
  let ListOfbool = () => (ListOfbool = dart.constFn(core.List$(core.bool)))();
  let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
  let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
  let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
  let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
  let ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(MapOfString$String())))();
  let FutureOfServiceExtensionResponse = () => (FutureOfServiceExtensionResponse = dart.constFn(async.Future$(developer.ServiceExtensionResponse)))();
  let MapOfint$_FileResourceInfo = () => (MapOfint$_FileResourceInfo = dart.constFn(core.Map$(core.int, io._FileResourceInfo)))();
  let MapOfint$_ProcessResourceInfo = () => (MapOfint$_ProcessResourceInfo = dart.constFn(core.Map$(core.int, io._ProcessResourceInfo)))();
  let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
  let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
  let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
  let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
  let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
  let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
  let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
  let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
  let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
  let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
  let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
  let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
  let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
  let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
  let X509CertificateTodynamic = () => (X509CertificateTodynamic = dart.constFn(dart.functionType(dart.dynamic, [io.X509Certificate])))();
  let intToListOfint = () => (intToListOfint = dart.constFn(dart.functionType(ListOfint(), [core.int])))();
  let StreamOfRawSocket = () => (StreamOfRawSocket = dart.constFn(async.Stream$(io.RawSocket)))();
  let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
  let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
  let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
  let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
  let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
  let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
  let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
  let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
  let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
  let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
  let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
  let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
  let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
  let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
  let Point$ = () => (Point$ = dart.constFn(math.Point$()))();
  let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
  let _RectangleBase = () => (_RectangleBase = dart.constFn(math._RectangleBase$()))();
  let Rectangle = () => (Rectangle = dart.constFn(math.Rectangle$()))();
  let MutableRectangle = () => (MutableRectangle = dart.constFn(math.MutableRectangle$()))();
  let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
  let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
  let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
  let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
  let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
  let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
  let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html$.Event])))();
  let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
  let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html$.EventTarget)))();
  let RectangleOfint = () => (RectangleOfint = dart.constFn(math.Rectangle$(core.int)))();
  let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
  let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
  let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
  let IterableOfMapOfString$dynamic = () => (IterableOfMapOfString$dynamic = dart.constFn(core.Iterable$(MapOfString$dynamic())))();
  let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
  let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html$.EventStreamProvider$(html$.TransitionEvent)))();
  let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
  let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
  let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
  let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
  let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
  let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
  let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
  let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
  let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaKeyEvent)))();
  let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
  let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
  let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
  let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
  let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
  let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
  let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
  let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
  let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
  let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
  let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
  let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
  let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
  let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
  let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
  let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
  let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
  let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html$.ImmutableListMixin$()))();
  let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html$.Element, html$.Element])))();
  let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html$.Element])))();
  let ElementList = () => (ElementList = dart.constFn(html$.ElementList$()))();
  let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html$._FrozenElementList$()))();
  let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
  let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
  let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
  let CompleterOfFile$ = () => (CompleterOfFile$ = dart.constFn(async.Completer$(html$.File)))();
  let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
  let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
  let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
  let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
  let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
  let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
  let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
  let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
  let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
  let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html$.SourceInfo)))();
  let CompleterOfListOfSourceInfo = () => (CompleterOfListOfSourceInfo = dart.constFn(async.Completer$(ListOfSourceInfo())))();
  let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
  let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
  let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html$.MutationRecord)))();
  let MapOfString$bool = () => (MapOfString$bool = dart.constFn(core.Map$(core.String, core.bool)))();
  let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
  let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html$.Node])))();
  let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html$.Node)))();
  let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
  let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
  let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
  let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html$.RtcSessionDescription)))();
  let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
  let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
  let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
  let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcIceCandidateEvent)))();
  let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html$.OptionElement)))();
  let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
  let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
  let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
  let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
  let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
  let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
  let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
  let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
  let VoidToString = () => (VoidToString = dart.constFn(dart.functionType(core.String, [])))();
  let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, core.String])))();
  let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
  let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
  let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
  let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
  let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
  let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
  let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
  let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html$.TrackDefault)))();
  let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
  let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
  let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
  let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
  let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
  let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
  let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
  let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
  let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
  let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
  let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
  let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
  let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
  let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
  let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
  let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.functionType(core.String, [core.String, core.String])))();
  let SetOfStringTodynamic = () => (SetOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [SetOfString()])))();
  let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html$.EventStreamProvider$()))();
  let ElementStream = () => (ElementStream = dart.constFn(html$.ElementStream$()))();
  let _EventStream = () => (_EventStream = dart.constFn(html$._EventStream$()))();
  let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html$._ElementEventStreamImpl$()))();
  let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html$._ElementListEventStreamImpl$()))();
  let _EventListener = () => (_EventListener = dart.constFn(html$._EventListener$()))();
  let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html$._wrapZoneCallback$(html$.Event, dart.dynamic)))();
  let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html$._EventStreamSubscription$()))();
  let CustomStream = () => (CustomStream = dart.constFn(html$.CustomStream$()))();
  let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html$._CustomEventStreamImpl$()))();
  let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyEvent)))();
  let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
  let _StreamPool = () => (_StreamPool = dart.constFn(html$._StreamPool$()))();
  let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html$._CustomEventStreamProvider$()))();
  let MapOfString$Function = () => (MapOfString$Function = dart.constFn(core.Map$(core.String, core.Function)))();
  let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
  let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
  let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
  let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
  let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
  let _WrappedList = () => (_WrappedList = dart.constFn(html$._WrappedList$()))();
  let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
  let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html$._WrappedIterator$()))();
  let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html$.HttpRequest])))();
  let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html$.FixedSizeListIterator$()))();
  let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html$._VariableSizeListIterator$()))();
  let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html$._wrapZoneCallback$()))();
  let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html$._wrapZoneBinaryCallback$()))();
  let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html$.Element])))();
  let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
  let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
  let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg$.PathSeg)))();
  let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
  let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
  let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
  let dynamicTodynamic$ = () => (dynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
  let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
  let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.definiteFunctionType(dart._MethodStats, [])))();
  let dynamicToString = () => (dynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic])))();
  let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
  let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
  let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
  let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
  let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
  let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
  let intAnddynamicTovoid = () => (intAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, dart.dynamic])))();
  let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
  let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
  let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
  let StringAndObjectTovoid = () => (StringAndObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Object])))();
  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
  let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
  let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
  let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
  let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
  let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
  let dynamicTovoid$ = () => (dynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
  let TypeTodynamic = () => (TypeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type])))();
  let VoidToString$ = () => (VoidToString$ = dart.constFn(dart.definiteFunctionType(core.String, [])))();
  let StringToString$ = () => (StringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
  let StringAndStringTodynamic = () => (StringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String])))();
  let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
  let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
  let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
  let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
  let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
  let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
  let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
  let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
  let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
  let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
  let ListTodynamic = () => (ListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.List])))();
  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
  let TimerTovoid$ = () => (TimerTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Timer])))();
  let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
  let boolTodynamic = () => (boolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.bool])))();
  let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
  let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
  let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicTodynamic = () => (dynamicAnddynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicToArgumentError = () => (dynamicToArgumentError = dart.constFn(dart.definiteFunctionType(core.ArgumentError, [dart.dynamic])))();
  let dynamicToStackTrace = () => (dynamicToStackTrace = dart.constFn(dart.definiteFunctionType(core.StackTrace, [dart.dynamic])))();
  let dynamicToint = () => (dynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic])))();
  let dynamicAndMapTodynamic = () => (dynamicAndMapTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Map])))();
  let dynamicAndStringTodynamic = () => (dynamicAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])))();
  let dynamicAndStringAnddynamicTovoid = () => (dynamicAndStringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, dart.dynamic])))();
  let FAndintToF = () => (FAndintToF = dart.constFn(dart.definiteFunctionType(F => [F, [F, core.int]])))();
  let JSSyntaxRegExpTodynamic = () => (JSSyntaxRegExpTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_js_helper.JSSyntaxRegExp])))();
  let JSSyntaxRegExpToint = () => (JSSyntaxRegExpToint = dart.constFn(dart.definiteFunctionType(core.int, [_js_helper.JSSyntaxRegExp])))();
  let JSSyntaxRegExpAndStringAndintToMatch = () => (JSSyntaxRegExpAndStringAndintToMatch = dart.constFn(dart.definiteFunctionType(core.Match, [_js_helper.JSSyntaxRegExp, core.String, core.int])))();
  let dynamicAnddynamicAnddynamicToint = () => (dynamicAnddynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicToString = () => (dynamicAnddynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicTobool = () => (dynamicAnddynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let StringAndStringAndintToIterableOfMatch = () => (StringAndStringAndintToIterableOfMatch = dart.constFn(dart.definiteFunctionType(IterableOfMatch(), [core.String, core.String, core.int])))();
  let StringAnddynamicAndintTobool = () => (StringAnddynamicAndintTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String, dart.dynamic, core.int])))();
  let StringAndJSSyntaxRegExpAndString__ToString = () => (StringAndJSSyntaxRegExpAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, _js_helper.JSSyntaxRegExp, core.String, core.int])))();
  let StringAndPatternAndStringToString = () => (StringAndPatternAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String])))();
  let MatchToString$ = () => (MatchToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
  let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), StringToString()])))();
  let StringAndFnAndFnToString = () => (StringAndFnAndFnToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, MatchToString(), StringToString()])))();
  let StringAndStringAndFn__ToString = () => (StringAndStringAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String, MatchToString(), StringToString()])))();
  let StringAndPatternAndString__ToString = () => (StringAndPatternAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String, core.int])))();
  let StringAndPatternAndFn__ToString$ = () => (StringAndPatternAndFn__ToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
  let StringAndintAndint__ToString = () => (StringAndintAndint__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.String])))();
  let dynamicToType = () => (dynamicToType = dart.constFn(dart.definiteFunctionType(core.Type, [dart.dynamic])))();
  let dynamicAndintTodynamic = () => (dynamicAndintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.int])))();
  let SymbolToString = () => (SymbolToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Symbol])))();
  let dynamicAnddynamicToSymbol = () => (dynamicAnddynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic, dart.dynamic])))();
  let dynamicToInstanceMirror = () => (dynamicToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [dart.dynamic])))();
  let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
  let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
  let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
  let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
  let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
  let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
  let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
  let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
  let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
  let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
  let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
  let intTobool = () => (intTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.int])))();
  let intAndListAndintTovoid = () => (intAndListAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.List, core.int])))();
  let intAndintAndintToint = () => (intAndintAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int, core.int])))();
  let FunctionAndObjectAndStackTraceTodynamic = () => (FunctionAndObjectAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.Object, core.StackTrace])))();
  let FunctionAndZoneToFunction = () => (FunctionAndZoneToFunction = dart.constFn(dart.definiteFunctionType(R => [core.Function, [core.Function, async.Zone]])))();
  let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
  let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
  let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [dart.dynamic])))();
  let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
  let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
  let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
  let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
  let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
  let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
  let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
  let _EventSinkAnddynamicAnddynamicTovoid = () => (_EventSinkAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._EventSink, dart.dynamic, dart.dynamic])))();
  let _ZoneToZoneDelegate = () => (_ZoneToZoneDelegate = dart.constFn(dart.definiteFunctionType(async.ZoneDelegate, [async._Zone])))();
  let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]])))();
  let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])))();
  let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
  let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
  let ZoneAndZoneDelegateAndZone__ToR$1 = () => (ZoneAndZoneDelegateAndZone__ToR$1 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
  let ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = () => (ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = dart.constFn(dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
  let ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = () => (ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = dart.constFn(dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]])))();
  let ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = () => (ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]])))();
  let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.definiteFunctionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
  let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTodynamic()])))();
  let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
  let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
  let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
  let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
  let ZoneAndZoneDelegateAndZone__Todynamic = () => (ZoneAndZoneDelegateAndZone__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
  let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [dart.functionType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
  let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object])))();
  let dynamicAnddynamicTobool = () => (dynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic])))();
  let IterableAndListTovoid = () => (IterableAndListTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Iterable, core.List])))();
  let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [collection._SplayTreeMapNode])))();
  let dynamicAndFnTodynamic = () => (dynamicAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dynamicAnddynamicTodynamic()])))();
  let Uint8ListAndintAndintTovoid$ = () => (Uint8ListAndintAndintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
  let StringAndFnTodynamic = () => (StringAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, dynamicAnddynamicTodynamic()])))();
  let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
  let intAndintToint = () => (intAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int])))();
  let dynamicAndintToint = () => (dynamicAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, core.int])))();
  let intAndintTovoid = () => (intAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int])))();
  let StringToint$ = () => (StringToint$ = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
  let intToString = () => (intToString = dart.constFn(dart.definiteFunctionType(core.String, [core.int])))();
  let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
  let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
  let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
  let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
  let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
  let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
  let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
  let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
  let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
  let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
  let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
  let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
  let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
  let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
  let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
  let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
  let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
  let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
  let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
  let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
  let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
  let dynamicTo_Directory = () => (dynamicTo_Directory = dart.constFn(dart.definiteFunctionType(io._Directory, [dart.dynamic])))();
  let dynamicToDirectory = () => (dynamicToDirectory = dart.constFn(dart.definiteFunctionType(io.Directory, [dart.dynamic])))();
  let ListOfintTodynamic = () => (ListOfintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [ListOfint()])))();
  let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
  let RandomAccessFileTodynamic = () => (RandomAccessFileTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.RandomAccessFile])))();
  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
  let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
  let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
  let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
  let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
  let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
  let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
  let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
  let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
  let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
  let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
  let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
  let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
  let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
  let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
  let StringAndListOfStringTovoid$ = () => (StringAndListOfStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, ListOfString()])))();
  let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
  let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
  let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
  let dynamicToFutureOfHttpClientResponse = () => (dynamicToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [dart.dynamic])))();
  let VoidToFutureOfHttpClientResponse = () => (VoidToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [])))();
  let VoidToListOfString = () => (VoidToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [])))();
  let _AuthenticationSchemeTo_Credentials = () => (_AuthenticationSchemeTo_Credentials = dart.constFn(dart.definiteFunctionType(io._Credentials, [io._AuthenticationScheme])))();
  let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
  let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
  let CookieTovoid = () => (CookieTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Cookie])))();
  let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
  let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
  let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
  let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
  let dynamic__Todynamic$ = () => (dynamic__Todynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.StackTrace])))();
  let _HttpIncomingTovoid$ = () => (_HttpIncomingTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpIncoming])))();
  let _HttpIncomingTodynamic = () => (_HttpIncomingTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io._HttpIncoming])))();
  let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
  let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
  let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
  let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
  let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection])))();
  let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io._ConnectionTarget])))();
  let _ConnectionInfoTo_HttpClientRequest = () => (_ConnectionInfoTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._ConnectionInfo])))();
  let _ConnectionInfoTodynamic = () => (_ConnectionInfoTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io._ConnectionInfo])))();
  let _HttpClientRequestTo_HttpClientRequest = () => (_HttpClientRequestTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._HttpClientRequest])))();
  let VoidTo_ConnectionTarget = () => (VoidTo_ConnectionTarget = dart.constFn(dart.definiteFunctionType(io._ConnectionTarget, [])))();
  let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
  let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
  let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
  let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
  let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
  let SocketTodynamic = () => (SocketTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.Socket])))();
  let _HttpConnectionTovoid = () => (_HttpConnectionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpConnection])))();
  let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
  let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
  let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
  let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
  let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
  let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
  let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
  let dynamicToLink = () => (dynamicToLink = dart.constFn(dart.definiteFunctionType(io.Link, [dart.dynamic])))();
  let DurationTovoid = () => (DurationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Duration])))();
  let RawSecureServerSocketToSecureServerSocket = () => (RawSecureServerSocketToSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])))();
  let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
  let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
  let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
  let RawSecureSocketTodynamic = () => (RawSecureSocketTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.RawSecureSocket])))();
  let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
  let _FilterStatusTodynamic = () => (_FilterStatusTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io._FilterStatus])))();
  let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
  let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
  let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
  let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
  let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
  let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
  let HttpRequestTovoid$ = () => (HttpRequestTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpRequest])))();
  let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
  let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
  let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
  let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
  let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
  let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
  let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
  let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
  let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
  let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
  let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
  let FunctionAndListTodynamic = () => (FunctionAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.List])))();
  let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
  let TAndTToT$ = () => (TAndTToT$ = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
  let numAndnumTodouble = () => (numAndnumTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num, core.num])))();
  let numAndnumTonum = () => (numAndnumTonum = dart.constFn(dart.definiteFunctionType(core.num, [core.num, core.num])))();
  let numTodouble = () => (numTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num])))();
  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T => [T, [T]])))();
  let LibraryMirrorTobool = () => (LibraryMirrorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [mirrors.LibraryMirror])))();
  let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
  let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
  let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
  let EventTovoid$ = () => (EventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Event])))();
  let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
  let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
  let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.Event])))();
  let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
  let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
  let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
  let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
  let FileSystemTovoid = () => (FileSystemTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileSystem])))();
  let FileErrorTovoid = () => (FileErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileError])))();
  let EntryTovoid = () => (EntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Entry])))();
  let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
  let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
  let MetadataTovoid = () => (MetadataTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Metadata])))();
  let ListOfEntryTovoid = () => (ListOfEntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfEntry()])))();
  let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
  let FileWriterTovoid = () => (FileWriterTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileWriter])))();
  let FileTovoid = () => (FileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.File])))();
  let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Geoposition])))();
  let PositionErrorTovoid = () => (PositionErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.PositionError])))();
  let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
  let ProgressEventTovoid$ = () => (ProgressEventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.ProgressEvent])))();
  let ListOfSourceInfoTovoid = () => (ListOfSourceInfoTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfSourceInfo()])))();
  let MediaStreamTovoid = () => (MediaStreamTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.MediaStream])))();
  let NavigatorUserMediaErrorTovoid = () => (NavigatorUserMediaErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.NavigatorUserMediaError])))();
  let RtcSessionDescriptionTovoid = () => (RtcSessionDescriptionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription])))();
  let RtcStatsResponseTovoid = () => (RtcStatsResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcStatsResponse])))();
  let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
  let numTovoid = () => (numTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.num])))();
  let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
  let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
  let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
  let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
  let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [SetOfString()])))();
  let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [SetOfString()])))();
  let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Event, core.String])))();
  let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.KeyEvent])))();
  let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.NodeValidator])))();
  let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html$.Node, html$.Node])))();
  let FromToTo = () => (FromToTo = dart.constFn(dart.definiteFunctionType((From, To) => [To, [From]])))();
  let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])))();
  let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html$.EventTarget, [dart.dynamic])))();
  let dynamicAnddynamicAnddynamic__Todynamic = () => (dynamicAnddynamicAnddynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAndString__Tovoid = () => (dynamicAnddynamicAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, core.String, core.Type, core.String])))();
  let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html$._wrapZoneCallback$(A, R), [html$._wrapZoneCallback$(A, R)]])))();
  let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html$._wrapZoneBinaryCallback$(A, B, R), [html$._wrapZoneBinaryCallback$(A, B, R)]])))();
  let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [core.String])))();
  let StringToElementListOfElement = () => (StringToElementListOfElement = dart.constFn(dart.definiteFunctionType(ElementListOfElement(), [core.String])))();
  let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
  let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
  let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
  let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
  let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
  let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
  let dynamic__Todynamic$0 = () => (dynamic__Todynamic$0 = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
  let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
  let AudioBufferTovoid = () => (AudioBufferTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [web_audio.AudioBuffer])))();
  dart.mixin = function(base, ...mixins) {
    class Mixin extends base {}
    for (let m of mixins) {
      dart.copyProperties(Mixin.prototype, m.prototype);
    }
    Mixin.prototype.new = function(...args) {
      for (let i = mixins.length - 1; i >= 0; i--) {
        mixins[i].prototype.new.call(this);
      }
      base.prototype.new.apply(this, args);
    };
    dart.setSignature(Mixin, {
      methods: () => {
        let s = {};
        for (let m of mixins) {
          dart.copyProperties(s, m[dart._methodSig]);
        }
        return s;
      }
    });
    Mixin[dart._mixins] = mixins;
    return Mixin;
  };
  dart.getMixins = function(clazz) {
    return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
  };
  dart.getImplements = function(clazz) {
    return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
  };
  dart.flattenFutures = function(builder) {
    function flatten(T) {
      if (!T) return builder(dart.dynamic);
      let futureClass = dart.getGenericClass(async.Future);
      if (dart.getGenericClass(T) == futureClass) {
        let args = dart.getGenericArgs(T);
        if (args) return builder(args[0]);
      }
      return builder(T);
    }
    return flatten;
  };
  dart.generic = function(typeConstructor, setBaseClass) {
    if (setBaseClass === void 0) setBaseClass = null;
    return (() => {
      let length = typeConstructor.length;
      if (length < 1) {
        dart.throwInternalError('must have at least one generic type argument');
      }
      let resultMap = new Map();
      function makeGenericType(...args) {
        if (args.length != length && args.length != 0) {
          dart.throwInternalError('requires ' + length + ' or 0 type arguments');
        }
        while (args.length < length)
          args.push(dart.dynamic);
        let value = resultMap;
        for (let i = 0; i < length; i++) {
          let arg = args[i];
          if (arg == null) {
            dart.throwInternalError('type arguments should not be null: ' + typeConstructor);
          }
          let map = value;
          value = map.get(arg);
          if (value === void 0) {
            if (i + 1 == length) {
              value = typeConstructor.apply(null, args);
              if (value) {
                value[dart._typeArguments] = args;
                value[dart._originalDeclaration] = makeGenericType;
              }
              map.set(arg, value);
              if (setBaseClass) setBaseClass(value);
            } else {
              value = new Map();
              map.set(arg, value);
            }
          }
        }
        return value;
      }
      makeGenericType[dart._genericTypeCtor] = typeConstructor;
      return makeGenericType;
    })();
  };
  dart.getGenericClass = function(type) {
    return dart.safeGetOwnProperty(type, dart._originalDeclaration);
  };
  dart.getGenericArgs = function(type) {
    return dart.safeGetOwnProperty(type, dart._typeArguments);
  };
  dart.getConstructorSig = function(value) {
    return value[dart._constructorSig];
  };
  dart.getMethodSig = function(value) {
    return value[dart._methodSig];
  };
  dart.getFieldSig = function(value) {
    return value[dart._fieldSig];
  };
  dart.getGetterSig = function(value) {
    return value[dart._getterSig];
  };
  dart.getSetterSig = function(value) {
    return value[dart._setterSig];
  };
  dart.getStaticSig = function(value) {
    return value[dart._staticSig];
  };
  dart.getStaticFieldSig = function(value) {
    return value[dart._staticFieldSig];
  };
  dart.getStaticGetterSig = function(value) {
    return value[dart._staticGetterSig];
  };
  dart.getStaticSetterSig = function(value) {
    return value[dart._staticSetterSig];
  };
  dart.getGenericTypeCtor = function(value) {
    return value[dart._genericTypeCtor];
  };
  dart.getMethodType = function(obj, name) {
    let type = obj == null ? core.Object : obj.__proto__.constructor;
    return dart.getMethodTypeFromType(type, name);
  };
  dart.getMethodTypeFromType = function(type, name) {
    let sigObj = type[dart._methodSig];
    if (sigObj === void 0) return void 0;
    return sigObj[name];
  };
  dart.classGetConstructorType = function(cls, name) {
    if (!name) name = 'new';
    if (cls === void 0) return void 0;
    if (cls == null) return void 0;
    let sigCtor = cls[dart._constructorSig];
    if (sigCtor === void 0) return void 0;
    return sigCtor[name];
  };
  dart.bind = function(obj, name, f) {
    if (f === void 0) f = obj[name];
    f = f.bind(obj);
    let sig = dart.getMethodType(obj, name);
    dart.assert(sig);
    dart.tag(f, sig);
    return f;
  };
  dart.gbind = function(f, ...typeArgs) {
    let result = f.apply(null, typeArgs);
    let sig = dart._getRuntimeType(f).apply(null, typeArgs);
    dart.tag(result, sig);
    return result;
  };
  dart._setInstanceSignature = function(f, sigF, kind) {
    dart.defineMemoizedGetter(f, kind, () => {
      let sigObj = sigF();
      sigObj.__proto__ = f.__proto__[kind];
      return sigObj;
    });
  };
  dart._setMethodSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._methodSig);
  };
  dart._setFieldSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._fieldSig);
  };
  dart._setGetterSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._getterSig);
  };
  dart._setSetterSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._setterSig);
  };
  dart._setConstructorSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._constructorSig, sigF);
  };
  dart._setStaticSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticSig, sigF);
  };
  dart._setStaticFieldSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticFieldSig, sigF);
  };
  dart._setStaticGetterSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticGetterSig, sigF);
  };
  dart._setStaticSetterSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticSetterSig, sigF);
  };
  dart._setStaticTypes = function(f, names) {
    for (let name of names) {
      if (!f[name]) continue;
      dart.tagLazy(f[name], function() {
        return f[dart._staticSig][name];
      });
    }
  };
  dart.setSignature = function(f, signature) {
    let constructors = 'constructors' in signature ? signature.constructors : () => ({});
    let methods = 'methods' in signature ? signature.methods : () => ({});
    let fields = 'fields' in signature ? signature.fields : () => ({});
    let getters = 'getters' in signature ? signature.getters : () => ({});
    let setters = 'setters' in signature ? signature.setters : () => ({});
    let statics = 'statics' in signature ? signature.statics : () => ({});
    let staticFields = 'sfields' in signature ? signature.sfields : () => ({});
    let staticGetters = 'sgetters' in signature ? signature.sgetters : () => ({});
    let staticSetters = 'ssetters' in signature ? signature.ssetters : () => ({});
    let names = 'names' in signature ? signature.names : [];
    dart._setConstructorSignature(f, constructors);
    dart._setMethodSignature(f, methods);
    dart._setFieldSignature(f, fields);
    dart._setGetterSignature(f, getters);
    dart._setSetterSignature(f, setters);
    dart._setStaticSignature(f, statics);
    dart._setStaticFieldSignature(f, staticFields);
    dart._setStaticGetterSignature(f, staticGetters);
    dart._setStaticSetterSignature(f, staticSetters);
    dart._setStaticTypes(f, names);
  };
  dart.hasMethod = function(obj, name) {
    return dart.getMethodType(obj, name) !== void 0;
  };
  dart.defineNamedConstructor = function(clazz, name) {
    let proto = clazz.prototype;
    let initMethod = proto[name];
    let ctor = function(...args) {
      initMethod.apply(this, args);
    };
    ctor[dart.isNamedConstructor] = true;
    ctor.prototype = proto;
    dart.defineProperty(clazz, name, {value: ctor, configurable: true});
  };
  dart.getExtensionType = function(obj) {
    return obj[dart._extensionType];
  };
  dart.getExtensionSymbol = function(name) {
    let sym = dartx[name];
    if (sym == null) {
      sym = Symbol("dartx." + name.toString());
      dartx[name] = sym;
    }
    return sym;
  };
  dart.defineExtensionNames = function(names) {
    return names.forEach(dart.getExtensionSymbol);
  };
  dart._installProperties = function(jsProto, extProto) {
    let coreObjProto = core.Object.prototype;
    let parentsExtension = jsProto.__proto__[dart._extensionType];
    let installedParent = parentsExtension && parentsExtension.prototype;
    dart._installProperties2(jsProto, extProto, coreObjProto, installedParent);
  };
  dart._installProperties2 = function(jsProto, extProto, coreObjProto, installedParent) {
    if (extProto === coreObjProto) {
      dart._installPropertiesForObject(jsProto, coreObjProto);
      return;
    }
    if (jsProto !== extProto) {
      let extParent = extProto.__proto__;
      if (installedParent !== extParent) {
        dart._installProperties2(jsProto, extParent, coreObjProto, installedParent);
      }
    }
    dart.copyTheseProperties(jsProto, extProto, dart.getOwnPropertySymbols(extProto));
  };
  dart._installPropertiesForObject = function(jsProto, coreObjProto) {
    let names = dart.getOwnPropertyNames(coreObjProto);
    for (let i = 0; i < names.length; ++i) {
      let name = names[i];
      let desc = dart.getOwnPropertyDescriptor(coreObjProto, name);
      dart.defineProperty(jsProto, dart.getExtensionSymbol(name), desc);
    }
    return;
  };
  dart.registerExtension = function(jsType, dartExtType) {
    if (!jsType) return;
    let extProto = dartExtType.prototype;
    let jsProto = jsType.prototype;
    if (!jsProto) return;
    jsProto[dart._extensionType] = dartExtType;
    dart._installProperties(jsProto, extProto);
    let originalSigFn = dart.getOwnPropertyDescriptor(dartExtType, dart._methodSig).get;
    dart.assert(originalSigFn);
    dart.defineMemoizedGetter(jsType, dart._methodSig, originalSigFn);
  };
  dart.defineExtensionMembers = function(type, methodNames) {
    let proto = type.prototype;
    for (let name of methodNames) {
      let method = dart.getOwnPropertyDescriptor(proto, name);
      dart.defineProperty(proto, dart.getExtensionSymbol(name), method);
    }
    let originalSigFn = dart.getOwnPropertyDescriptor(type, dart._methodSig).get;
    dart.defineMemoizedGetter(type, dart._methodSig, function() {
      let sig = originalSigFn();
      for (let name of methodNames) {
        sig[dart.getExtensionSymbol(name)] = sig[name];
      }
      return sig;
    });
  };
  dart.setType = function(obj, type) {
    obj.__proto__ = type.prototype;
    return obj;
  };
  dart.list = function(obj, elementType) {
    return dart.setType(obj, dart.getGenericClass(_interceptors.JSArray)(elementType));
  };
  dart.setBaseClass = function(derived, base) {
    derived.prototype.__proto__ = base.prototype;
    derived.__proto__ = base;
  };
  dart.setExtensionBaseClass = function(derived, base) {
    if (base) {
      derived.prototype[dart._extensionType] = derived;
      derived.prototype.__proto__ = base.prototype;
    }
  };
  dart.callableClass = function(callableCtor, classExpr) {
    callableCtor.prototype = classExpr.prototype;
    callableCtor.prototype.constructor = callableCtor;
    callableCtor.__proto__ = classExpr;
    return callableCtor;
  };
  dart.defineNamedConstructorCallable = function(clazz, name, ctor) {
    ctor.prototype = clazz.prototype;
    dart.defineProperty(clazz, name, {value: ctor, configurable: true});
  };
  dart.defineEnumValues = function(enumClass, names) {
    let values = [];
    for (var i = 0; i < names.length; i++) {
      let value = dart.const(new enumClass(i));
      values.push(value);
      Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
    }
    enumClass.values = dart.constList(values, enumClass);
  };
  dart.fn = function(closure, t) {
    if (t == null) {
      t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
    }
    dart.tag(closure, t);
    return closure;
  };
  dart.lazyFn = function(closure, computeType) {
    dart.tagLazy(closure, computeType);
    return closure;
  };
  dart._checkPrimitiveType = function(obj) {
    if (obj == null) return core.Null;
    if (typeof obj == "number") {
      if (Math.floor(obj) == obj) {
        return core.int;
      }
      return core.double;
    }
    if (typeof obj == "boolean") {
      return core.bool;
    }
    if (typeof obj == "string") {
      return core.String;
    }
    if (typeof obj == "symbol") {
      return dart.jsobject;
    }
    return null;
  };
  dart.getFunctionType = function(obj) {
    let args = Array(obj.length).fill(dart.dynamic);
    return dart.definiteFunctionType(dart.bottom, args, void 0);
  };
  dart.getReifiedType = function(obj) {
    let result = dart._checkPrimitiveType(obj);
    if (result != null) return result;
    return dart._nonPrimitiveRuntimeType(obj);
  };
  dart._nonPrimitiveRuntimeType = function(obj) {
    let result = dart._getRuntimeType(obj);
    if (result != null) return result;
    result = dart.getExtensionType(obj);
    if (result != null) return result;
    result = obj.constructor;
    if (result === Function) {
      return dart.jsobject;
    }
    if (result == null) {
      return dart.jsobject;
    }
    return result;
  };
  dart.wrapType = function(type) {
    if (type.hasOwnProperty(dart._typeObject)) {
      return type[dart._typeObject];
    }
    return type[dart._typeObject] = new dart.WrappedType(type);
  };
  dart.lazyJSType = function(getJSTypeCallback, name) {
    let key = getJSTypeCallback.toString();
    if (dart._lazyJSTypes.has(key)) {
      return dart._lazyJSTypes.get(key);
    }
    let ret = new dart.LazyJSType(getJSTypeCallback, name);
    dart._lazyJSTypes.set(key, ret);
    return ret;
  };
  dart.lazyAnonymousJSType = function(name) {
    if (dart._lazyJSTypes.has(name)) {
      return dart._lazyJSTypes.get(name);
    }
    let ret = new dart.LazyJSType(null, name);
    dart._lazyJSTypes.set(name, ret);
    return ret;
  };
  const _wrappedType = Symbol('_wrappedType');
  dart.unwrapType = function(obj) {
    return obj[_wrappedType];
  };
  dart._getRuntimeType = function(value) {
    return value[dart._runtimeType];
  };
  dart.getIsNamedConstructor = function(value) {
    return value[dart.isNamedConstructor];
  };
  dart.getDartLibraryName = function(value) {
    return value[dart_library.dartLibraryName];
  };
  dart.tag = function(value, t) {
    value[dart._runtimeType] = t;
  };
  dart.tagComputed = function(value, compute) {
    dart.defineProperty(value, dart._runtimeType, {get: compute});
  };
  dart.tagLazy = function(value, compute) {
    dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
  };
  dart._warn = function(arg) {
    console.warn(arg);
  };
  const _jsTypeCallback = Symbol('_jsTypeCallback');
  const _rawJSType = Symbol('_rawJSType');
  const _dartName = Symbol('_dartName');
  dart._isInstanceOfLazyJSType = function(o, t) {
    if (t[_jsTypeCallback] != null) {
      if (t[_rawJSType] == null) {
        let expected = t[_dartName];
        let actual = dart.typeName(dart.getReifiedType(o));
        dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
        return true;
      }
      return dart.is(o, t[_rawJSType]);
    }
    if (o == null) return false;
    return dart._isJSObject(o);
  };
  dart._asInstanceOfLazyJSType = function(o, t) {
    if (t[_jsTypeCallback] != null) {
      if (t[_rawJSType] == null) {
        let expected = t[_dartName];
        let actual = dart.typeName(dart.getReifiedType(o));
        dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
        return o;
      }
      return dart.as(o, t[_rawJSType]);
    }
    if (o == null) return null;
    if (!dart.test(dart._isJSObject(o))) dart._throwCastError(o, t, true);
    return o;
  };
  dart._isJSObject = function(o) {
    return !dart.getReifiedType(o)[dart._runtimeType];
  };
  dart._initialize2 = function() {
    dart.TypeRep.prototype.is = function is_T(object) {
      return dart.is(object, this);
    };
    dart.TypeRep.prototype.as = function as_T(object) {
      return dart.as(object, this);
    };
    dart.TypeRep.prototype._check = function check_T(object) {
      return dart.check(object, this);
    };
    dart.Dynamic.prototype.is = function is_Dynamic(object) {
      return true;
    };
    dart.Dynamic.prototype.as = function as_Dynamic(object) {
      return object;
    };
    dart.Dynamic.prototype._check = function check_Dynamic(object) {
      return object;
    };
    dart.LazyJSType.prototype.is = function is_T(object) {
      return dart._isInstanceOfLazyJSType(object, this);
    };
    dart.LazyJSType.prototype.as = function as_T(object) {
      return dart._asInstanceOfLazyJSType(object, this);
    };
    dart.LazyJSType.prototype._check = function check_T(object) {
      return dart._asInstanceOfLazyJSType(object, this);
    };
  };
  dart._functionType = function(definite, returnType, args, extra) {
    if (args === void 0 && extra === void 0) {
      const fnTypeParts = returnType;
      function makeGenericFnType(...types) {
        let parts = fnTypeParts.apply(null, types);
        return dart.FunctionType.create(definite, parts[0], parts[1], parts[2]);
      }
      makeGenericFnType[dart._typeFormalCount] = fnTypeParts.length;
      return makeGenericFnType;
    }
    return dart.FunctionType.create(definite, returnType, args, extra);
  };
  dart.functionType = function(returnType, args, extra) {
    return dart._functionType(false, returnType, args, extra);
  };
  dart.definiteFunctionType = function(returnType, args, extra) {
    return dart._functionType(true, returnType, args, extra);
  };
  dart.typedef = function(name, closure) {
    return new dart.Typedef(name, closure);
  };
  dart.typeName = function(type) {
    if (type === void 0) return "undefined type";
    if (type === null) return "null type";
    if (type instanceof dart.TypeRep) {
      if (type instanceof dart.Typedef) {
        return type.name + "(" + type.functionType.toString() + ")";
      }
      return type.toString();
    }
    if (type instanceof dart.WrappedType) {
      return "Wrapped(" + dart.unwrapType(type) + ")";
    }
    let tag = dart._getRuntimeType(type);
    if (tag === core.Type) {
      let name = type.name;
      let args = dart.getGenericArgs(type);
      if (!args) return name;
      let result = name;
      let allDynamic = true;
      result += '<';
      for (let i = 0; i < args.length; ++i) {
        if (i > 0) result += ', ';
        let argName = dart.typeName(args[i]);
        if (argName != 'dynamic') allDynamic = false;
        result += argName;
      }
      result += '>';
      if (allDynamic) return name;
      return result;
    }
    if (tag) return "Not a type: " + tag.name;
    return "JSObject<" + type.name + ">";
  };
  dart.getImplicitFunctionType = function(type) {
    if (dart.test(dart.isFunctionType(type))) return type;
    return dart.getMethodTypeFromType(type, 'call');
  };
  dart.isFunctionType = function(type) {
    return type instanceof dart.AbstractFunctionType || type === core.Function;
  };
  dart.isLazyJSSubtype = function(t1, t2, covariant) {
    if (dart.equals(t1, t2)) return true;
    if (t1[_jsTypeCallback] == null || t2[_jsTypeCallback] == null) return true;
    return dart.isClassSubType(t1[_rawJSType], t2[_rawJSType], covariant);
  };
  dart.isFunctionSubtype = function(ft1, ft2, covariant) {
    if (ft2 === core.Function) {
      return true;
    }
    if (ft1 === core.Function) {
      return false;
    }
    let ret1 = ft1.returnType;
    let ret2 = ft2.returnType;
    let args1 = ft1.args;
    let args2 = ft2.args;
    if (args1.length > args2.length) {
      return covariant ? false : null;
    }
    for (let i = 0; i < args1.length; ++i) {
      if (!dart._isSubtype(args2[i], args1[i], !covariant)) {
        return null;
      }
    }
    let optionals1 = ft1.optionals;
    let optionals2 = ft2.optionals;
    if (args1.length + optionals1.length < args2.length + optionals2.length) {
      return covariant ? false : null;
    }
    let j = 0;
    for (let i = args1.length; i < args2.length; ++i, ++j) {
      if (!dart._isSubtype(args2[i], optionals1[j], !covariant)) {
        return null;
      }
    }
    for (let i = 0; i < optionals2.length; ++i, ++j) {
      if (!dart._isSubtype(optionals2[i], optionals1[j], !covariant)) {
        return null;
      }
    }
    let named1 = ft1.named;
    let named2 = ft2.named;
    let names = dart.getOwnPropertyNames(named2);
    for (let i = 0; i < names.length; ++i) {
      let name = names[i];
      let n1 = named1[name];
      let n2 = named2[name];
      if (n1 === void 0) {
        return covariant ? false : null;
      }
      if (!dart._isSubtype(n2, n1, !covariant)) {
        return null;
      }
    }
    if (ret2 === dart.void) return true;
    if (ret1 === dart.void) return ret2 === dart.dynamic;
    if (!dart._isSubtype(ret1, ret2, covariant)) return null;
    return true;
  };
  dart._subtypeMemo = function(f) {
    let memo = new Map();
    return (t1, t2) => {
      let map = memo.get(t1);
      let result;
      if (map) {
        result = map.get(t2);
        if (result !== void 0) return result;
      } else {
        memo.set(t1, map = new Map());
      }
      result = f(t1, t2);
      map.set(t2, result);
      return result;
    };
  };
  dart._isBottom = function(type) {
    return type == dart.bottom;
  };
  dart._isTop = function(type) {
    return type == core.Object || type == dart.dynamic;
  };
  dart._isSubtype = function(t1, t2, covariant) {
    if (t1 === t2) return true;
    if (dart._isTop(t2) || dart._isBottom(t1)) {
      return true;
    }
    if (dart._isBottom(t2)) return null;
    if (dart._isTop(t1)) {
      if (t1 === dart.dynamic) return null;
      return false;
    }
    if (!(t1 instanceof dart.AbstractFunctionType) && !(t2 instanceof dart.AbstractFunctionType)) {
      let result = dart.isClassSubType(t1, t2, covariant);
      if (result === true || result === null) return result;
    }
    t1 = dart.getImplicitFunctionType(t1);
    if (!t1) return false;
    if (dart.isFunctionType(t1) && dart.isFunctionType(t2)) {
      return dart.isFunctionSubtype(t1, t2, covariant);
    }
    if (t1 instanceof dart.LazyJSType && t2 instanceof dart.LazyJSType) {
      return dart.isLazyJSSubtype(t1, t2, covariant);
    }
    return false;
  };
  dart.isClassSubType = function(t1, t2, covariant) {
    if (t1 == t2) return true;
    if (t1 == core.Object) return false;
    if (t1 == null) return t2 == core.Object || t2 == dart.dynamic;
    let raw1 = dart.getGenericClass(t1);
    let raw2 = dart.getGenericClass(t2);
    if (raw1 != null && raw1 == raw2) {
      let typeArguments1 = dart.getGenericArgs(t1);
      let typeArguments2 = dart.getGenericArgs(t2);
      let length = typeArguments1.length;
      if (typeArguments2.length == 0) {
        return true;
      } else if (length == 0) {
        if (typeArguments2.every(dart._isTop)) return true;
        return null;
      }
      dart.assert(length == typeArguments2.length);
      for (let i = 0; i < length; ++i) {
        let result = dart._isSubtype(typeArguments1[i], typeArguments2[i], covariant);
        if (!result) {
          return result;
        }
      }
      return true;
    }
    let indefinite = false;
    function definitive(t1, t2) {
      let result = dart.isClassSubType(t1, t2, covariant);
      if (result == null) {
        indefinite = true;
        return false;
      }
      return result;
    }
    if (definitive(t1.__proto__, t2)) return true;
    let mixins = dart.getMixins(t1);
    if (mixins) {
      for (let m1 of mixins) {
        if (m1 != null && definitive(m1, t2)) return true;
      }
    }
    let getInterfaces = dart.getImplements(t1);
    if (getInterfaces) {
      for (let i1 of getInterfaces()) {
        if (i1 != null && definitive(i1, t2)) return true;
      }
    }
    if (indefinite) return null;
    return false;
  };
  dart.isGroundType = function(type) {
    if (type instanceof dart.AbstractFunctionType) {
      if (!dart._isTop(type.returnType)) return false;
      for (let i = 0; i < type.args.length; ++i) {
        if (!dart._isBottom(type.args[i])) return false;
      }
      for (let i = 0; i < type.optionals.length; ++i) {
        if (!dart._isBottom(type.optionals[i])) return false;
      }
      let names = dart.getOwnPropertyNames(type.named);
      for (let i = 0; i < names.length; ++i) {
        if (!dart._isBottom(type.named[names[i]])) return false;
      }
      return true;
    }
    let typeArgs = dart.getGenericArgs(type);
    if (!typeArgs) return true;
    for (let t of typeArgs) {
      if (t != core.Object && t != dart.dynamic) return false;
    }
    return true;
  };
  dart.throwCastError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.CastErrorImplementation(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwTypeError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.TypeErrorImplementation(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwStrongModeCastError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.StrongModeCastError(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwStrongModeTypeError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.StrongModeTypeError(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwUnimplementedError = function(message) {
    debugger;
    dart.throw(new core.UnimplementedError(message));
  };
  dart.throwAssertionError = function(message) {
    if (message === void 0) message = null;
    return (() => {
      debugger;
      let error = message != null ? new _js_helper.AssertionErrorWithMessage(message()) : new core.AssertionError();
      dart.throw(error);
    })();
  };
  dart.throwNullValueError = function() {
    debugger;
    dart.throw(new core.NoSuchMethodError(null, new core.Symbol('<Unexpected Null Value>'), null, null, null));
  };
  dart.syncStar = function(gen, E, ...args) {
    const SyncIterable_E = dart.getGenericClass(_js_helper.SyncIterable)(E);
    return new SyncIterable_E(gen, args);
  };
  dart.async = function(gen, T, ...args) {
    let iter;
    function onValue(res) {
      if (res === void 0) res = null;
      return next(iter.next(res));
    }
    function onError(err) {
      return next(iter.throw(err));
    }
    function next(ret) {
      if (ret.done) return ret.value;
      let future = ret.value;
      if (!dart.is(future, dart.getGenericClass(async.Future))) {
        future = async.Future.value(future);
      }
      return future.then(dart.dynamic)(onValue, {onError: onError});
    }
    return dart.getGenericClass(async.Future)(T).new(function() {
      iter = gen.apply(null, args)[Symbol.iterator]();
      return onValue();
    });
  };
  dart.asyncStar = function(gen, T, ...args) {
    return new dart._AsyncStarStreamController(gen, T, args).controller.stream;
  };
  dart.dload = function(obj, field) {
    let f = dart._canonicalMember(obj, field);
    dart._trackCall(obj);
    if (f != null) {
      if (dart.test(dart.hasMethod(obj, f))) return dart.bind(obj, f, void 0);
      return obj[f];
    }
    return dart.noSuchMethod(obj, new dart.InvocationImpl(core.String._check(field), [], {isGetter: true}));
  };
  dart.dput = function(obj, field, value) {
    let f = dart._canonicalMember(obj, field);
    dart._trackCall(obj);
    if (f != null) {
      return obj[f] = value;
    }
    return dart.noSuchMethod(obj, new dart.InvocationImpl(core.String._check(field), [value], {isSetter: true}));
  };
  dart._checkApply = function(type, actuals) {
    if (actuals.length < type.args.length) return false;
    let index = 0;
    for (let i = 0; i < type.args.length; ++i) {
      if (!dart.instanceOfOrNull(actuals[i], type.args[i])) return false;
      ++index;
    }
    if (actuals.length == type.args.length) return true;
    let extras = actuals.length - type.args.length;
    if (type.optionals.length > 0) {
      if (extras > type.optionals.length) return false;
      for (let i = 0, j = index; i < extras; ++i, ++j) {
        if (!dart.instanceOfOrNull(actuals[j], type.optionals[i])) return false;
      }
      return true;
    }
    if (extras != 1) return false;
    if (dart.getOwnPropertyNames(type.named).length == 0) return false;
    let opts = actuals[index];
    let names = dart.getOwnPropertyNames(opts);
    if (names.length == 0) return false;
    for (var name of names) {
      if (!dart.hasOwnProperty.call(type.named, name)) {
        return false;
      }
      if (!dart.instanceOfOrNull(opts[name], type.named[name])) return false;
    }
    return true;
  };
  dart._dartSymbol = function(name) {
    return dart.const(core.Symbol.new(name.toString()));
  };
  dart.extractNamedArgs = function(args) {
    if (args.length > 0) {
      let last = args[args.length - 1];
      if (last != null && last.__proto__ === Object.prototype) {
        return args.pop();
      }
    }
    return null;
  };
  dart._checkAndCall = function(f, ftype, obj, typeArgs, args, name) {
    dart._trackCall(obj);
    let originalTarget = obj === void 0 ? f : obj;
    function callNSM() {
      return dart.noSuchMethod(originalTarget, new dart.InvocationImpl(name, args, {namedArguments: dart.extractNamedArgs(args), isMethod: true}));
    }
    if (!(f instanceof Function)) {
      if (f != null) {
        ftype = dart.getMethodType(f, 'call');
        f = f.call;
      }
      if (!(f instanceof Function)) {
        return callNSM();
      }
    }
    if (ftype === void 0) {
      ftype = dart._getRuntimeType(f);
    }
    if (!ftype) {
      if (typeArgs != null) {
        dart.throwStrongModeError('call to JS object `' + obj + '` with type arguments <' + typeArgs + '> is not supported.');
      }
      return f.apply(obj, args);
    }
    let formalCount = ftype[dart._typeFormalCount];
    if (formalCount != null) {
      if (typeArgs == null) {
        typeArgs = Array(formalCount).fill(dart.dynamic);
      } else if (typeArgs.length != formalCount) {
        dart.throwStrongModeError('incorrect number of arguments to generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected ' + formalCount + '.');
      }
      ftype = ftype.apply(null, typeArgs);
    } else if (typeArgs != null) {
      dart.throwStrongModeError('got type arguments to non-generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected none.');
    }
    if (dart._checkApply(ftype, args)) {
      if (typeArgs != null) {
        return f.apply(obj, typeArgs).apply(obj, args);
      }
      return f.apply(obj, args);
    }
    return callNSM();
  };
  dart.dcall = function(f, ...args) {
    return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, null, args, 'call');
  };
  dart.dgcall = function(f, typeArgs, ...args) {
    return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, typeArgs, args, 'call');
  };
  dart._dhelperRepl = function(object, field, callback) {
    let rawField = field;
    if (typeof field == 'symbol') {
      if (field in object) return callback(field);
      field = field.toString();
      field = field.substring('Symbol('.length, field.length - 1);
    } else if (field.charAt(0) != '_') {
      return callback(field);
    }
    if (field in object) return callback(field);
    let proto = object;
    while (proto !== null) {
      let symbols = Object.getOwnPropertySymbols(proto);
      let target = 'Symbol(' + field + ')';
      for (let s = 0; s < symbols.length; s++) {
        let sym = symbols[s];
        if (target == sym.toString()) return callback(sym);
      }
      proto = proto.__proto__;
    }
    return callback(rawField);
  };
  dart.dloadRepl = function(obj, field) {
    return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic$()));
  };
  dart.dputRepl = function(obj, field, value) {
    return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic$()));
  };
  dart._callMethodRepl = function(obj, method, typeArgs, args) {
    return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic$()));
  };
  dart.dsendRepl = function(obj, method, ...args) {
    return dart._callMethodRepl(obj, method, null, args);
  };
  dart.dgsendRepl = function(obj, typeArgs, method, ...args) {
    return dart._callMethodRepl(obj, method, typeArgs, args);
  };
  dart.getDynamicStats = function() {
    let ret = JSArrayOfListOfObject().of([]);
    let keys = dart._callMethodStats[dartx.keys][dartx.toList]();
    keys[dartx.sort](dart.fn((a, b) => dart._callMethodStats[dartx._get](b).count[dartx.compareTo](dart._callMethodStats[dartx._get](a).count), StringAndStringToint()));
    for (let key of keys) {
      let stats = dart._callMethodStats[dartx._get](key);
      ret[dartx.add](JSArrayOfObject().of([stats.typeName, stats.frame, stats.count]));
    }
    return ret;
  };
  dart.clearDynamicStats = function() {
    dart._callMethodStats[dartx.clear]();
  };
  dart._trackCall = function(obj) {
    if (!dart.trackProfile) return;
    let actual = dart.getReifiedType(obj);
    let stackStr = new Error().stack;
    let stack = stackStr[dartx.split]('\n    at ');
    let src = '';
    for (let i = 2; i < dart.notNull(stack[dartx.length]); ++i) {
      let frame = stack[dartx._get](i);
      if (!dart.test(frame[dartx.contains]('dart_sdk.js'))) {
        src = frame;
        break;
      }
    }
    let actualTypeName = dart.typeName(actual);
    let o = dart._callMethodStats[dartx.putIfAbsent](dart.str`${actualTypeName} <${src}>`, dart.fn(() => new dart._MethodStats(core.String._check(actualTypeName), src), VoidTo_MethodStats()));
    o.count = dart.notNull(o.count) + 1;
  };
  dart._callMethod = function(obj, name, typeArgs, args, displayName) {
    let symbol = dart._canonicalMember(obj, name);
    if (symbol == null) {
      return dart.noSuchMethod(obj, new dart.InvocationImpl(core.String._check(displayName), core.List._check(args), {isMethod: true}));
    }
    let f = obj != null ? obj[symbol] : null;
    let ftype = dart.getMethodType(obj, symbol);
    return dart._checkAndCall(f, ftype, obj, typeArgs, args, displayName);
  };
  dart.dsend = function(obj, method, ...args) {
    return dart._callMethod(obj, method, null, args, method);
  };
  dart.dgsend = function(obj, typeArgs, method, ...args) {
    return dart._callMethod(obj, method, typeArgs, args, method);
  };
  dart.dindex = function(obj, index) {
    return dart._callMethod(obj, '_get', null, [index], '[]');
  };
  dart.dsetindex = function(obj, index, value) {
    return dart._callMethod(obj, '_set', null, [index, value], '[]=');
  };
  dart._ignoreMemo = function(f) {
    let memo = new Map();
    return (t1, t2) => {
      let map = memo.get(t1);
      let result;
      if (map) {
        result = map.get(t2);
        if (result !== void 0) return result;
      } else {
        memo.set(t1, map = new Map());
      }
      result = f(t1, t2);
      map.set(t2, result);
      return result;
    };
  };
  dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) {
    let actual = dart.getReifiedType(obj);
    let result = dart.isSubtype(actual, type);
    if (result || actual == dart.jsobject || actual == core.int && type == core.double) return true;
    if (result === false) return false;
    if (ignoreFromWhiteList == void 0) return result;
    if (dart._ignoreTypeFailure(actual, type)) return true;
    return result;
  };
  dart.instanceOfOrNull = function(obj, type) {
    if (obj == null || dart.strongInstanceOf(obj, type, true)) return true;
    return false;
  };
  dart.is = function(obj, type) {
    let result = dart.strongInstanceOf(obj, type);
    if (result !== null) return result;
    let actual = dart.getReifiedType(obj);
    dart.throwStrongModeError('Strong mode is-check failure: ' + dart.typeName(actual) + ' does not soundly subtype ' + dart.typeName(type));
  };
  dart.as = function(obj, type) {
    if (type == dart.dynamic || obj == null) return obj;
    let result = dart.strongInstanceOf(obj, type, true);
    if (result) return obj;
    dart._throwCastError(obj, type, result);
  };
  dart.check = function(obj, type) {
    if (type == dart.dynamic || obj == null) return obj;
    let result = dart.strongInstanceOf(obj, type, true);
    if (result) return obj;
    dart._throwTypeError(obj, type, result);
  };
  dart.test = function(obj) {
    if (typeof obj == 'boolean') return obj;
    return dart.booleanConversionFailed(obj);
  };
  dart.booleanConversionFailed = function(obj) {
    if (obj == null) {
      dart.throw(new _js_helper.BooleanConversionAssertionError());
    }
    let actual = dart.getReifiedType(obj);
    let expected = core.bool;
    dart.throw(new _js_helper.TypeErrorImplementation.fromMessage(dart.str`type '${dart.typeName(actual)}' is not a subtype of ` + dart.str`type '${dart.typeName(expected)}' in boolean expression`));
  };
  dart._throwCastError = function(obj, type, result) {
    let actual = dart.getReifiedType(obj);
    if (result == false) dart.throwCastError(obj, actual, type);
    dart.throwStrongModeCastError(obj, actual, type);
  };
  dart._throwTypeError = function(obj, type, result) {
    let actual = dart.getReifiedType(obj);
    if (result == false) dart.throwTypeError(obj, actual, type);
    dart.throwStrongModeTypeError(obj, actual, type);
  };
  dart.asInt = function(obj) {
    if (obj == null) return null;
    if (Math.floor(obj) != obj) {
      dart.throwCastError(obj, dart.getReifiedType(obj), core.int);
    }
    return obj;
  };
  dart.addSimpleTypeTests = function(ctor) {
    ctor.is = function is_C(object) {
      if (object instanceof this) return true;
      return dart.is(object, this);
    };
    ctor.as = function as_C(object) {
      if (object instanceof this) return object;
      return dart.as(object, this);
    };
    ctor._check = function check_C(object) {
      if (object instanceof this) return object;
      return dart.check(object, this);
    };
  };
  dart.addTypeTests = function(ctor) {
    ctor.as = function as_G(object) {
      return dart.as(object, this);
    };
    ctor.is = function is_G(object) {
      return dart.is(object, this);
    };
    ctor._check = function check_G(object) {
      return dart.check(object, this);
    };
  };
  dart.equals = function(x, y) {
    if (x == null || y == null) return x == y;
    let eq = x['=='];
    return eq ? eq.call(x, y) : x === y;
  };
  dart.notNull = function(x) {
    if (x == null) dart.throwNullValueError();
    return x;
  };
  dart.map = function(values, K, V) {
    if (K === void 0) K = null;
    if (V === void 0) V = null;
    return (() => {
      if (K == null) K = dart.dynamic;
      if (V == null) V = dart.dynamic;
      let map = dart.getGenericClass(collection.LinkedHashMap)(K, V).new();
      if (Array.isArray(values)) {
        for (let i = 0, end = values.length - 1; i < end; i += 2) {
          let key = values[i];
          let value = values[i + 1];
          map._set(key, value);
        }
      } else if (typeof values === 'object') {
        for (let key of dart.getOwnPropertyNames(values)) {
          map._set(key, values[key]);
        }
      }
      return map;
    })();
  };
  dart.assert = function(condition, message) {
    if (message === void 0) message = null;
    return (() => {
      if (!condition) dart.throwAssertionError(message);
    })();
  };
  dart.throw = function(obj) {
    dart._stack = new Error();
    throw obj;
  };
  dart.getError = function(exception) {
    var stack = dart._stack;
    return stack !== null ? stack : exception;
  };
  dart.stackPrint = function(exception) {
    var error = dart.getError(exception);
    console.log(error.stack ? error.stack : 'No stack trace for: ' + error);
  };
  dart.stackTrace = function(exception) {
    var error = dart.getError(exception);
    return _js_helper.getTraceFromException(error);
  };
  dart.nullSafe = function(obj, ...callbacks) {
    if (obj == null) return obj;
    for (let callback of callbacks) {
      obj = callback(obj);
      if (obj == null) break;
    }
    return obj;
  };
  dart.multiKeyPutIfAbsent = function(map, keys, valueFn) {
    for (let k of keys) {
      let value = map.get(k);
      if (!value) {
        map.set(k, value = new Map());
      }
      map = value;
    }
    if (map.has(dart._value)) return map.get(dart._value);
    let value = valueFn();
    map.set(dart._value, value);
    return value;
  };
  dart.const = function(obj) {
    function lookupNonTerminal(map, key) {
      let result = map.get(key);
      if (result !== void 0) return result;
      map.set(key, result = new Map());
      return result;
    }
    let names = dart.getOwnNamesAndSymbols(obj);
    let count = names.length;
    let map = lookupNonTerminal(dart.constants, count);
    for (let i = 0; i < count; i++) {
      let name = names[i];
      map = lookupNonTerminal(map, name);
      map = lookupNonTerminal(map, obj[name]);
    }
    let type = dart.getReifiedType(obj);
    let value = map.get(type);
    if (value) return value;
    map.set(type, obj);
    return obj;
  };
  dart.constList = function(elements, elementType) {
    function lookupNonTerminal(map, key) {
      let result = map.get(key);
      if (result !== void 0) return result;
      map.set(key, result = new Map());
      return result;
    }
    let count = elements.length;
    let map = lookupNonTerminal(dart.constantLists, count);
    for (let i = 0; i < count; i++) {
      map = lookupNonTerminal(map, elements[i]);
    }
    let value = map.get(elementType);
    if (value) return value;
    value = dart.list(elements, elementType);
    map.set(elementType, value);
    return value;
  };
  dart.hashCode = function(obj) {
    if (obj == null) return 0;
    switch (typeof obj) {
      case "number":
      {
        return obj & 0x1FFFFFFF;
      }
      case "boolean":
      {
        return obj ? 2 * 3 * 23 * 3761 : 269 * 811;
      }
      case "function":
      {
        return _js_helper.Primitives.objectHashCode(obj);
      }
    }
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      return obj[dartx.hashCode];
    }
    return obj.hashCode;
  };
  dart.toString = function(obj) {
    if (obj == null) return "null";
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      return obj[dartx.toString]();
    }
    if (typeof obj == "function") {
      return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
    }
    return obj.toString();
  };
  dart.noSuchMethod = function(obj, invocation) {
    if (obj == null || typeof obj == "function") {
      dart.throw(new core.NoSuchMethodError(obj, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
    }
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      return obj[dartx.noSuchMethod](invocation);
    }
    return obj.noSuchMethod(invocation);
  };
  dart.constFn = function(x) {
    return () => x;
  };
  dart.runtimeType = function(obj) {
    let result = dart._checkPrimitiveType(obj);
    if (result != null) return dart.wrapType(result);
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      result = obj[dartx.runtimeType];
      return result != null ? result : dart.wrapType(extension);
    }
    if (typeof obj == "function") {
      return dart.wrapType(dart.getReifiedType(obj));
    }
    return obj.runtimeType;
  };
  dart.str = function(strings, ...values) {
    let s = strings[0];
    for (let i = 0, len = values.length; i < len;) {
      s += dart.notNull(dart.toString(values[i])) + strings[++i];
    }
    return s;
  };
  dart._canonicalMember = function(obj, name) {
    if (typeof name === "symbol") return name;
    if (obj != null && dart.getExtensionType(obj) != null) {
      return dartx[name];
    }
    if (dart.equals(name, 'constructor') || dart.equals(name, 'prototype')) {
      name = '+' + dart.notNull(core.String._check(name));
    }
    return name;
  };
  dart.loadLibrary = function() {
    return async.Future.value();
  };
  dart.defineProperty = function(obj, name, desc) {
    return Object.defineProperty(obj, name, desc);
  };
  dart.getOwnPropertyDescriptor = function(obj, name) {
    return Object.getOwnPropertyDescriptor(obj, name);
  };
  dart.getOwnPropertyNames = function(obj) {
    return Object.getOwnPropertyNames(obj);
  };
  dart.getOwnPropertySymbols = function(obj) {
    return Object.getOwnPropertySymbols(obj);
  };
  dart.throwStrongModeError = function(message) {
    debugger;
    throw new _js_helper.StrongModeErrorImplementation(message);
  };
  dart.throwInternalError = function(message) {
    debugger;
    throw Error(message);
  };
  dart.getOwnNamesAndSymbols = function(obj) {
    let names = dart.getOwnPropertyNames(obj);
    let symbols = dart.getOwnPropertySymbols(obj);
    return names.concat(symbols);
  };
  dart.safeGetOwnProperty = function(obj, name) {
    let desc = dart.getOwnPropertyDescriptor(obj, name);
    if (desc != null) return desc.value;
  };
  dart.defineLazyProperty = function(to, name, desc) {
    let init = desc.get;
    let value = null;
    function lazySetter(x) {
      init = null;
      value = x;
    }
    function circularInitError() {
      dart.throwInternalError('circular initialization for field ' + name);
    }
    function lazyGetter() {
      if (init == null) return value;
      let f = init;
      init = circularInitError;
      lazySetter(f());
      return value;
    }
    desc.get = lazyGetter;
    desc.configurable = true;
    if (desc.set) desc.set = lazySetter;
    return dart.defineProperty(to, name, desc);
  };
  dart.defineLazy = function(to, from) {
    for (let name of dart.getOwnNamesAndSymbols(from)) {
      dart.defineLazyProperty(to, name, dart.getOwnPropertyDescriptor(from, name));
    }
  };
  dart.defineMemoizedGetter = function(obj, name, getter) {
    return dart.defineLazyProperty(obj, name, {get: getter});
  };
  dart.copyTheseProperties = function(to, from, names) {
    for (let i = 0; i < names.length; ++i) {
      dart.copyProperty(to, from, names[i]);
    }
    return to;
  };
  dart.copyProperty = function(to, from, name) {
    let desc = dart.getOwnPropertyDescriptor(from, name);
    if (name == Symbol.iterator) {
      let existing = dart.getOwnPropertyDescriptor(to, name);
      if (existing != null) {
        if (existing.writable) {
          to[name] = desc.value;
        }
        return;
      }
    }
    dart.defineProperty(to, name, desc);
  };
  dart.export = function(to, from, name) {
    return dart.copyProperty(to, from, name);
  };
  dart.copyProperties = function(to, from) {
    return dart.copyTheseProperties(to, from, dart.getOwnNamesAndSymbols(from));
  };
  dart.global = typeof window == "undefined" ? global : window;
  dart.JsSymbol = Symbol;
  dart._mixins = Symbol("mixins");
  dart.implements = Symbol("implements");
  dart._typeArguments = Symbol("typeArguments");
  dart._originalDeclaration = Symbol("originalDeclaration");
  dart._constructorSig = Symbol("sigCtor");
  dart._methodSig = Symbol("sigMethod");
  dart._fieldSig = Symbol("sigField");
  dart._getterSig = Symbol("sigGetter");
  dart._setterSig = Symbol("sigSetter");
  dart._staticSig = Symbol("sigStaticMethod");
  dart._staticFieldSig = Symbol("sigStaticField");
  dart._staticGetterSig = Symbol("sigStaticGetter");
  dart._staticSetterSig = Symbol("sigStaticSetter");
  dart._genericTypeCtor = Symbol("genericType");
  dart._extensionType = Symbol("extensionType");
  dart.dartx = dartx;
  dart._runtimeType = Symbol("_runtimeType");
  dart.isNamedConstructor = Symbol("isNamedConstructor");
  dart.defineLazy(dart, {
    get _lazyJSTypes() {
      return new Map();
    },
    set _lazyJSTypes(_) {}
  });
  dart.metadata = Symbol("metadata");
  dart._typeObject = Symbol("typeObject");
  core.Object = class Object {
    constructor(...args) {
      return this.new.apply(this, args);
    }
    new() {
    }
    ['=='](other) {
      return core.identical(this, other);
    }
    get hashCode() {
      return _js_helper.Primitives.objectHashCode(this);
    }
    toString() {
      return _js_helper.Primitives.objectToString(this);
    }
    noSuchMethod(invocation) {
      dart.throw(new core.NoSuchMethodError(this, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
    }
    get runtimeType() {
      return dart.wrapType(dart.getReifiedType(this));
    }
  };
  core.Object.is = function is_Object(o) {
    if (o instanceof this) return true;
    return dart.is(o, this);
  };
  core.Object.as = function as_Object(o) {
    if (o == null || o instanceof this) return o;
    return dart.as(o, this);
  };
  core.Object._check = function check_Object(o) {
    if (o == null || o instanceof this) return o;
    return dart.check(o, this);
  };
  dart.setSignature(core.Object, {
    constructors: () => ({new: dart.definiteFunctionType(core.Object, [])}),
    getters: () => ({
      hashCode: dart.definiteFunctionType(core.int, []),
      runtimeType: dart.definiteFunctionType(core.Type, [])
    }),
    methods: () => ({
      '==': dart.definiteFunctionType(core.bool, [dart.dynamic]),
      toString: dart.definiteFunctionType(core.String, []),
      noSuchMethod: dart.definiteFunctionType(dart.dynamic, [core.Invocation])
    })
  });
  dart.tagComputed(core.Object, () => core.Type);
  dart.TypeRep = class TypeRep extends core.Object {
    new() {
      dart._initialize;
    }
    get name() {
      return this.toString();
    }
  };
  dart.TypeRep[dart.implements] = () => [core.Type];
  dart.setSignature(dart.TypeRep, {
    constructors: () => ({new: dart.definiteFunctionType(dart.TypeRep, [])}),
    getters: () => ({name: dart.definiteFunctionType(core.String, [])})
  });
  dart.Dynamic = class Dynamic extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'dynamic';
    }
  };
  dart.LazyJSType = class LazyJSType extends core.Object {
    new(jsTypeCallback, dartName) {
      this[_jsTypeCallback] = jsTypeCallback;
      this[_dartName] = dartName;
    }
    get [_rawJSType]() {
      return this[_jsTypeCallback]();
    }
    toString() {
      return core.String._check(this[_jsTypeCallback] != null ? dart.typeName(this[_rawJSType]) : this[_dartName]);
    }
  };
  dart.LazyJSType[dart.implements] = () => [core.Type];
  dart.setSignature(dart.LazyJSType, {
    constructors: () => ({new: dart.definiteFunctionType(dart.LazyJSType, [dart.dynamic, dart.dynamic])}),
    fields: () => ({
      [_jsTypeCallback]: dart.dynamic,
      [_dartName]: dart.dynamic
    }),
    getters: () => ({[_rawJSType]: dart.definiteFunctionType(dart.dynamic, [])})
  });
  dart.dynamic = new dart.Dynamic();
  dart._initialize = dart._initialize2();
  dart.Void = class Void extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'void';
    }
  };
  dart.void = new dart.Void();
  dart.Bottom = class Bottom extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'bottom';
    }
  };
  dart.bottom = new dart.Bottom();
  dart.JSObject = class JSObject extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'NativeJavaScriptObject';
    }
  };
  dart.jsobject = new dart.JSObject();
  core.Type = class Type extends core.Object {};
  dart.WrappedType = class WrappedType extends core.Type {
    new(wrappedType) {
      this[_wrappedType] = wrappedType;
    }
    toString() {
      return core.String._check(dart.typeName(this[_wrappedType]));
    }
  };
  dart.setSignature(dart.WrappedType, {
    constructors: () => ({new: dart.definiteFunctionType(dart.WrappedType, [dart.dynamic])}),
    fields: () => ({[_wrappedType]: dart.dynamic})
  });
  dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep {
    constructor() {
      super();
      this._stringValue = null;
    }
    toString() {
      return this.name;
    }
    get name() {
      if (this._stringValue) return this._stringValue;
      let buffer = '(';
      for (let i = 0; i < this.args.length; ++i) {
        if (i > 0) {
          buffer += ', ';
        }
        buffer += dart.typeName(this.args[i]);
      }
      if (this.optionals.length > 0) {
        if (this.args.length > 0) buffer += ', ';
        buffer += '[';
        for (let i = 0; i < this.optionals.length; ++i) {
          if (i > 0) {
            buffer += ', ';
          }
          buffer += dart.typeName(this.optionals[i]);
        }
        buffer += ']';
      } else if (Object.keys(this.named).length > 0) {
        if (this.args.length > 0) buffer += ', ';
        buffer += '{';
        let names = dart.getOwnPropertyNames(this.named).sort();
        for (let i = 0; i < names.length; ++i) {
          if (i > 0) {
            buffer += ', ';
          }
          buffer += names[i] + ': ' + dart.typeName(this.named[names[i]]);
        }
        buffer += '}';
      }
      buffer += ') -> ' + dart.typeName(this.returnType);
      this._stringValue = buffer;
      return buffer;
    }
  };
  dart._fnTypeNamedArgMap = new Map();
  dart._fnTypeArrayArgMap = new Map();
  dart._fnTypeTypeMap = new Map();
  dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
  dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
    static _memoizeArray(map, arr, create) {
      let len = arr.length;
      map = FunctionType._lookupNonTerminal(map, len);
      for (var i = 0; i < len - 1; ++i) {
        map = FunctionType._lookupNonTerminal(map, arr[i]);
      }
      let result = map.get(arr[len - 1]);
      if (result !== void 0) return result;
      map.set(arr[len - 1], result = create());
      return result;
    }
    static _normalizeParameter(a) {
      if (a instanceof Array) {
        let result = [];
        result.push(a[0] == dart.dynamic ? dart.bottom : a[0]);
        result.push(a.slice(1));
        return result;
      }
      return a == dart.dynamic ? dart.bottom : a;
    }
    static _canonicalizeArray(definite, array, map) {
      let arr = definite ? array : array.map(FunctionType._normalizeParameter);
      return FunctionType._memoizeArray(map, arr, () => arr);
    }
    static _canonicalizeNamed(definite, named, map) {
      let key = [];
      let names = dart.getOwnPropertyNames(named);
      let r = {};
      for (var i = 0; i < names.length; ++i) {
        let name = names[i];
        let type = named[name];
        if (!definite) r[name] = type = FunctionType._normalizeParameter(type);
        key.push(name);
        key.push(type);
      }
      if (!definite) named = r;
      return FunctionType._memoizeArray(map, key, () => named);
    }
    static _lookupNonTerminal(map, key) {
      let result = map.get(key);
      if (result !== void 0) return result;
      map.set(key, result = new Map());
      return result;
    }
    static _createSmall(count, definite, returnType, required) {
      let map = dart._fnTypeSmallMap[count];
      let args = definite ? required : required.map(FunctionType._normalizeParameter);
      for (var i = 0; i < count; ++i) {
        map = FunctionType._lookupNonTerminal(map, args[i]);
      }
      let result = map.get(returnType);
      if (result !== void 0) return result;
      result = new FunctionType(returnType, args, [], {});
      map.set(returnType, result);
      return result;
    }
    static create(definite, returnType, args, extra) {
      if (extra === void 0 && args.length < 3) {
        return FunctionType._createSmall(args.length, definite, returnType, args);
      }
      args = FunctionType._canonicalizeArray(definite, args, dart._fnTypeArrayArgMap);
      let keys;
      let create;
      if (extra === void 0) {
        keys = [returnType, args];
        create = () => new FunctionType(returnType, args, [], {});
      } else if (extra instanceof Array) {
        let optionals = FunctionType._canonicalizeArray(definite, extra, dart._fnTypeArrayArgMap);
        keys = [returnType, args, optionals];
        create = () => new FunctionType(returnType, args, optionals, {});
      } else {
        let named = FunctionType._canonicalizeNamed(definite, extra, dart._fnTypeNamedArgMap);
        keys = [returnType, args, named];
        create = () => new FunctionType(returnType, args, [], named);
      }
      return FunctionType._memoizeArray(dart._fnTypeTypeMap, keys, create);
    }
    constructor(returnType, args, optionals, named) {
      super();
      this.returnType = returnType;
      this.args = args;
      this.optionals = optionals;
      this.named = named;
      this.metadata = [];
      function process(array, metadata) {
        var result = [];
        for (var i = 0; i < array.length; ++i) {
          var arg = array[i];
          if (arg instanceof Array) {
            metadata.push(arg.slice(1));
            result.push(arg[0]);
          } else {
            metadata.push([]);
            result.push(arg);
          }
        }
        return result;
      }
      this.args = process(this.args, this.metadata);
      this.optionals = process(this.optionals, this.metadata);
    }
  };
  dart.Typedef = class Typedef extends dart.AbstractFunctionType {
    constructor(name, closure) {
      super();
      this._name = name;
      this._closure = closure;
      this._functionType = null;
    }
    get name() {
      return this._name;
    }
    get functionType() {
      if (!this._functionType) {
        this._functionType = this._closure();
      }
      return this._functionType;
    }
    get returnType() {
      return this.functionType.returnType;
    }
    get args() {
      return this.functionType.args;
    }
    get optionals() {
      return this.functionType.optionals;
    }
    get named() {
      return this.functionType.named;
    }
    get metadata() {
      return this.functionType.metadata;
    }
  };
  dart._typeFormalCount = Symbol("_typeFormalCount");
  dart.isSubtype = dart._subtypeMemo((t1, t2) => t1 === t2 || dart._isSubtype(t1, t2, true));
  dart._jsIterator = Symbol("_jsIterator");
  dart._current = Symbol("_current");
  dart._AsyncStarStreamController = class _AsyncStarStreamController {
    constructor(generator, T, args) {
      this.isAdding = false;
      this.isWaiting = false;
      this.isScheduled = false;
      this.isSuspendedAtYield = false;
      this.canceler = null;
      this.iterator = generator(this, ...args)[Symbol.iterator]();
      this.controller = dart.getGenericClass(async.StreamController)(T).new({
        onListen: () => this.scheduleGenerator(),
        onResume: () => this.onResume(),
        onCancel: () => this.onCancel()
      });
    }
    onResume() {
      if (this.isSuspendedAtYield) {
        this.scheduleGenerator();
      }
    }
    onCancel() {
      if (this.controller.isClosed) {
        return null;
      }
      if (this.canceler == null) {
        this.canceler = async.Completer.new();
        this.scheduleGenerator();
      }
      return this.canceler.future;
    }
    close() {
      if (this.canceler != null && !this.canceler.isCompleted) {
        this.canceler.complete();
      }
      this.controller.close();
    }
    scheduleGenerator() {
      if (this.isScheduled || this.controller.isPaused || this.isAdding || this.isWaiting) {
        return;
      }
      this.isScheduled = true;
      async.scheduleMicrotask(() => this.runBody());
    }
    runBody(opt_awaitValue) {
      this.isScheduled = false;
      this.isSuspendedAtYield = false;
      this.isWaiting = false;
      let iter;
      try {
        iter = this.iterator.next(opt_awaitValue);
      } catch (e) {
        this.addError(e, dart.stackTrace(e));
        this.close();
        return;
      }

      if (iter.done) {
        this.close();
        return;
      }
      if (this.isSuspendedAtYield || this.isAdding) return;
      this.isWaiting = true;
      let future = iter.value;
      if (!dart.is(future, dart.getGenericClass(async.Future))) {
        future = async.Future.value(future);
      }
      return future.then(dart.dynamic)(x => this.runBody(x), {
        onError: (e, s) => this.throwError(e, s)
      });
    }
    add(event) {
      if (!this.controller.hasListener) return true;
      this.controller.add(event);
      this.scheduleGenerator();
      this.isSuspendedAtYield = true;
      return false;
    }
    addStream(stream) {
      if (!this.controller.hasListener) return true;
      this.isAdding = true;
      this.controller.addStream(stream, {cancelOnError: false}).then(dart.dynamic)(() => {
        this.isAdding = false;
        this.scheduleGenerator();
      }, {
        onError: (e, s) => this.throwError(e, s)
      });
    }
    throwError(error, stackTrace) {
      try {
        this.iterator.throw(error);
      } catch (e) {
        this.addError(e, stackTrace);
      }

    }
    addError(error, stackTrace) {
      if (this.canceler != null && !this.canceler.isCompleted) {
        this.canceler.completeError(error, stackTrace);
        return;
      }
      if (!this.controller.hasListener) return;
      this.controller.addError(error, stackTrace);
    }
  };
  core.Invocation = class Invocation extends core.Object {
    get isAccessor() {
      return dart.test(this.isGetter) || dart.test(this.isSetter);
    }
  };
  dart.setSignature(core.Invocation, {
    getters: () => ({isAccessor: dart.definiteFunctionType(core.bool, [])})
  });
  dart.InvocationImpl = class InvocationImpl extends core.Invocation {
    new(memberName, positionalArguments, opts) {
      let namedArguments = opts && 'namedArguments' in opts ? opts.namedArguments : null;
      let isMethod = opts && 'isMethod' in opts ? opts.isMethod : false;
      let isGetter = opts && 'isGetter' in opts ? opts.isGetter : false;
      let isSetter = opts && 'isSetter' in opts ? opts.isSetter : false;
      this.positionalArguments = positionalArguments;
      this.isMethod = isMethod;
      this.isGetter = isGetter;
      this.isSetter = isSetter;
      this.memberName = dart._dartSymbol(memberName);
      this.namedArguments = dart.InvocationImpl._namedArgsToSymbols(namedArguments);
    }
    static _namedArgsToSymbols(namedArgs) {
      if (namedArgs == null) return dart.map({}, core.Symbol, dart.dynamic);
      return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic$())});
    }
  };
  dart.setSignature(dart.InvocationImpl, {
    constructors: () => ({new: dart.definiteFunctionType(dart.InvocationImpl, [core.String, core.List], {namedArguments: dart.dynamic, isMethod: core.bool, isGetter: core.bool, isSetter: core.bool})}),
    fields: () => ({
      memberName: core.Symbol,
      positionalArguments: core.List,
      namedArguments: MapOfSymbol$dynamic(),
      isMethod: core.bool,
      isGetter: core.bool,
      isSetter: core.bool
    }),
    statics: () => ({_namedArgsToSymbols: dart.definiteFunctionType(core.Map$(core.Symbol, dart.dynamic), [dart.dynamic])}),
    names: ['_namedArgsToSymbols']
  });
  dart._MethodStats = class _MethodStats extends core.Object {
    new(typeName, frame) {
      this.typeName = typeName;
      this.frame = frame;
      this.count = null;
      this.count = 0;
    }
  };
  dart.setSignature(dart._MethodStats, {
    constructors: () => ({new: dart.definiteFunctionType(dart._MethodStats, [core.String, core.String])}),
    fields: () => ({
      typeName: core.String,
      frame: core.String,
      count: core.int
    })
  });
  dart.defineLazy(dart, {
    get _callMethodStats() {
      return MapOfString$_MethodStats().new();
    },
    set _callMethodStats(_) {}
  });
  dart.defineLazy(dart, {
    get trackProfile() {
      return dart.global.trackDdcProfile;
    },
    set trackProfile(_) {}
  });
  dart._ignoreTypeFailure = (() => {
    return dart._ignoreMemo((actual, type) => {
      if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
        console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
        return true;
      }
      return false;
    });
  })();
  dart._stack = null;
  dart._value = Symbol("_value");
  dart.constants = new Map();
  dart.constantLists = new Map();
  dart.JsIterator = class JsIterator {
    constructor(dartIterator) {
      this.dartIterator = dartIterator;
    }
    next() {
      let i = this.dartIterator;
      let done = !i.moveNext();
      return {done: done, value: done ? void 0 : i.current};
    }
  };
  dart.hasOwnProperty = Object.prototype.hasOwnProperty;
  _debugger.JsonMLConfig = class JsonMLConfig extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_debugger.JsonMLConfig, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLConfig, [core.String])}),
    fields: () => ({name: core.String}),
    sfields: () => ({
      none: _debugger.JsonMLConfig,
      skipDart: _debugger.JsonMLConfig,
      keyToString: _debugger.JsonMLConfig,
      asClass: _debugger.JsonMLConfig
    })
  });
  dart.defineLazy(_debugger.JsonMLConfig, {
    get none() {
      return dart.const(new _debugger.JsonMLConfig("none"));
    },
    get skipDart() {
      return dart.const(new _debugger.JsonMLConfig("skipDart"));
    },
    get keyToString() {
      return dart.const(new _debugger.JsonMLConfig("keyToString"));
    },
    get asClass() {
      return dart.const(new _debugger.JsonMLConfig("asClass"));
    }
  });
  _debugger._maxSpanLength = 100;
  dart.defineLazy(_debugger, {
    get _devtoolsFormatter() {
      return new _debugger.JsonMLFormatter(new _debugger.DartFormatter());
    },
    set _devtoolsFormatter(_) {}
  });
  _debugger._typeof = function(object) {
    return typeof object;
  };
  dart.lazyFn(_debugger._typeof, () => dynamicToString());
  _debugger.getOwnPropertyNames = function(object) {
    return dart.list(Object.getOwnPropertyNames(object), core.String);
  };
  dart.lazyFn(_debugger.getOwnPropertyNames, () => dynamicToListOfString());
  _debugger.getOwnPropertySymbols = function(object) {
    return Object.getOwnPropertySymbols(object);
  };
  dart.lazyFn(_debugger.getOwnPropertySymbols, () => dynamicToList());
  _debugger.JSNative = class JSNative extends core.Object {
    static getProperty(object, name) {
      return object[name];
    }
    static setProperty(object, name, value) {
      return object[name] = value;
    }
  };
  dart.setSignature(_debugger.JSNative, {
    statics: () => ({
      getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['getProperty', 'setProperty']
  });
  _debugger.addMetadataChildren = function(object, ret) {
    ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
  };
  dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
  _debugger.getObjectTypeName = function(object) {
    let reifiedType = dart.getReifiedType(object);
    if (reifiedType == null) {
      if (_debugger._typeof(object) == 'function') {
        return '[[Raw JavaScript Function]]';
      }
      return '<Error getting type name>';
    }
    return _debugger.getTypeName(core.Type._check(reifiedType));
  };
  dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
  _debugger.getTypeName = function(type) {
    let name = dart.typeName(type);
    if (dart.equals(name, 'JSArray<dynamic>') || dart.equals(name, 'JSObject<Array>')) return 'List<dynamic>';
    return core.String._check(name);
  };
  dart.lazyFn(_debugger.getTypeName, () => TypeToString());
  _debugger._getType = function(object) {
    return core.Type.is(object) ? object : dart.getReifiedType(object);
  };
  dart.fn(_debugger._getType, dynamicToObject());
  const _simpleFormatter = Symbol('_simpleFormatter');
  _debugger.safePreview = function(object, config) {
    try {
      let preview = _debugger._devtoolsFormatter[_simpleFormatter].preview(object, config);
      if (preview != null) return preview;
      return dart.toString(object);
    } catch (e) {
      return dart.str`<Exception thrown> ${e}`;
    }

  };
  dart.lazyFn(_debugger.safePreview, () => dynamicAnddynamicToString());
  _debugger.symbolName = function(symbol) {
    let name = dart.toString(symbol);
    dart.assert(name[dartx.startsWith]('Symbol('));
    return name[dartx.substring]('Symbol('[dartx.length], dart.notNull(name[dartx.length]) - 1);
  };
  dart.lazyFn(_debugger.symbolName, () => dynamicToString());
  _debugger.hasMethod = function(object, name) {
    try {
      return core.bool._check(dart.hasMethod(object, name));
    } catch (e) {
      return false;
    }

  };
  dart.lazyFn(_debugger.hasMethod, () => dynamicAndStringTobool());
  _debugger.NameValuePair = class NameValuePair extends core.Object {
    new(opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let config = opts && 'config' in opts ? opts.config : _debugger.JsonMLConfig.none;
      let hideName = opts && 'hideName' in opts ? opts.hideName : false;
      this.name = name;
      this.value = value;
      this.config = config;
      this.hideName = hideName;
    }
    ['=='](other) {
      return _debugger.NameValuePair.is(other) && other.name == this.name;
    }
    get hashCode() {
      return dart.hashCode(this.name);
    }
    get displayName() {
      return dart.test(this.hideName) ? '' : this.name;
    }
  };
  dart.setSignature(_debugger.NameValuePair, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, config: _debugger.JsonMLConfig, hideName: core.bool})}),
    fields: () => ({
      name: core.String,
      value: core.Object,
      config: _debugger.JsonMLConfig,
      hideName: core.bool
    }),
    getters: () => ({displayName: dart.definiteFunctionType(core.String, [])})
  });
  _debugger.MapEntry = class MapEntry extends core.Object {
    new(opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      this.key = key;
      this.value = value;
    }
  };
  dart.setSignature(_debugger.MapEntry, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.Object, value: core.Object})}),
    fields: () => ({
      key: core.Object,
      value: core.Object
    })
  });
  _debugger.IterableSpan = class IterableSpan extends core.Object {
    new(start, end, iterable) {
      this.start = start;
      this.end = end;
      this.iterable = iterable;
    }
    get length() {
      return dart.notNull(this.end) - dart.notNull(this.start);
    }
    get maxPowerOfSubsetSize() {
      return (dart.notNull(math.log(dart.notNull(this.length) - 0.5)) / dart.notNull(math.log(_debugger._maxSpanLength)))[dartx.truncate]();
    }
    get subsetSize() {
      return dart.asInt(math.pow(_debugger._maxSpanLength, this.maxPowerOfSubsetSize));
    }
    asMap() {
      return this.iterable[dartx.skip](this.start)[dartx.take](this.length)[dartx.toList]()[dartx.asMap]();
    }
    children() {
      let children = JSArrayOfNameValuePair().of([]);
      if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
        this.asMap()[dartx.forEach](dart.fn((i, element) => {
          children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
        }, intAnddynamicTovoid()));
      } else {
        for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
          let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
          if (subSpan.length == 1) {
            children[dartx.add](new _debugger.NameValuePair({name: dart.toString(i), value: this.iterable[dartx.elementAt](i)}));
          } else {
            children[dartx.add](new _debugger.NameValuePair({name: dart.str`[${i}...${dart.notNull(subSpan.end) - 1}]`, value: subSpan, hideName: true}));
          }
        }
      }
      return children;
    }
  };
  dart.setSignature(_debugger.IterableSpan, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.IterableSpan, [core.int, core.int, core.Iterable])}),
    fields: () => ({
      start: core.int,
      end: core.int,
      iterable: core.Iterable
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      maxPowerOfSubsetSize: dart.definiteFunctionType(core.int, []),
      subsetSize: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      asMap: dart.definiteFunctionType(core.Map$(core.int, dart.dynamic), []),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [])
    })
  });
  _debugger.Library = class Library extends core.Object {
    new(name, object) {
      this.name = name;
      this.object = object;
    }
  };
  dart.setSignature(_debugger.Library, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.Library, [core.String, core.Object])}),
    fields: () => ({
      name: core.String,
      object: core.Object
    })
  });
  _debugger.NamedConstructor = class NamedConstructor extends core.Object {
    new(object) {
      this.object = object;
    }
  };
  dart.setSignature(_debugger.NamedConstructor, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.NamedConstructor, [core.Object])}),
    fields: () => ({object: core.Object})
  });
  _debugger.HeritageClause = class HeritageClause extends core.Object {
    new(name, types) {
      this.name = name;
      this.types = types;
    }
  };
  dart.setSignature(_debugger.HeritageClause, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.HeritageClause, [core.String, core.List])}),
    fields: () => ({
      name: core.String,
      types: core.List
    })
  });
  _debugger.safeGetProperty = function(protoChain, name) {
    try {
      return _debugger.JSNative.getProperty(protoChain, name);
    } catch (e) {
      return dart.str`<Exception thrown> ${e}`;
    }

  };
  dart.fn(_debugger.safeGetProperty, ObjectAndObjectToObject());
  _debugger.safeProperties = function(object) {
    return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool$())), {key: dart.fn(name => name, dynamicTodynamic$()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
  };
  dart.fn(_debugger.safeProperties, dynamicTodynamic$());
  const _attributes = Symbol('_attributes');
  const _jsonML = Symbol('_jsonML');
  _debugger.JsonMLElement = class JsonMLElement extends core.Object {
    new(tagName) {
      this[_attributes] = null;
      this[_jsonML] = null;
      this[_attributes] = {};
      this[_jsonML] = [tagName, this[_attributes]];
    }
    appendChild(element) {
      this[_jsonML][dartx.add](dart.dsend(element, 'toJsonML'));
    }
    createChild(tagName) {
      let c = new _debugger.JsonMLElement(tagName);
      this[_jsonML][dartx.add](c.toJsonML());
      return c;
    }
    createObjectTag(object) {
      return (() => {
        let _ = this.createChild('object');
        _.addAttribute('object', object);
        return _;
      })();
    }
    setStyle(style) {
      dart.dput(this[_attributes], 'style', style);
    }
    addStyle(style) {
      if (dart.dload(this[_attributes], 'style') == null) {
        dart.dput(this[_attributes], 'style', style);
      } else {
        let o = this[_attributes];
        dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', style));
      }
    }
    addAttribute(key, value) {
      _debugger.JSNative.setProperty(this[_attributes], key, value);
    }
    createTextChild(text) {
      this[_jsonML][dartx.add](text);
    }
    toJsonML() {
      return this[_jsonML];
    }
  };
  dart.setSignature(_debugger.JsonMLElement, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic])}),
    fields: () => ({
      [_attributes]: dart.dynamic,
      [_jsonML]: core.List
    }),
    methods: () => ({
      appendChild: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      createChild: dart.definiteFunctionType(_debugger.JsonMLElement, [core.String]),
      createObjectTag: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic]),
      setStyle: dart.definiteFunctionType(dart.void, [core.String]),
      addStyle: dart.definiteFunctionType(dart.dynamic, [core.String]),
      addAttribute: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      createTextChild: dart.definiteFunctionType(dart.dynamic, [core.String]),
      toJsonML: dart.definiteFunctionType(dart.dynamic, [])
    })
  });
  _debugger.isNativeJavaScriptObject = function(object) {
    let type = _debugger._typeof(object);
    return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
  };
  dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
  _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
    new(simpleFormatter) {
      this[_simpleFormatter] = simpleFormatter;
      this.customFormattersOn = false;
    }
    setMaxSpanLengthForTestingOnly(spanLength) {
      _debugger._maxSpanLength = spanLength;
    }
    header(object, config) {
      this.customFormattersOn = true;
      if (dart.equals(config, _debugger.JsonMLConfig.skipDart) || dart.test(_debugger.isNativeJavaScriptObject(object))) {
        return null;
      }
      let c = this[_simpleFormatter].preview(object, config);
      if (c == null) return null;
      if (dart.equals(config, _debugger.JsonMLConfig.keyToString)) {
        c = dart.toString(object);
      }
      let element = new _debugger.JsonMLElement('span');
      element.setStyle('background-color: #d9edf7;');
      element.createTextChild(c);
      return element.toJsonML();
    }
    hasBody(object, config) {
      return this[_simpleFormatter].hasChildren(object, config);
    }
    body(object, config) {
      let body = new _debugger.JsonMLElement('ol');
      body.setStyle('list-style-type: none;' + 'padding-left: 0px;' + 'margin-top: 0px;' + 'margin-bottom: 0px;' + 'margin-left: 12px;');
      if (core.StackTrace.is(object)) {
        body.addStyle('color: rgb(196, 26, 22);');
      }
      let children = this[_simpleFormatter].children(object, config);
      for (let child of children) {
        let li = body.createChild('li');
        let nameSpan = new _debugger.JsonMLElement('span');
        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
        nameSpan.setStyle('color: rgb(136, 19, 145);');
        if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
          nameSpan.addStyle("padding-left: 13px;");
          li.appendChild(nameSpan);
          let objectTag = li.createObjectTag(child.value);
          objectTag.addAttribute('config', child.config);
          if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
            li.setStyle("padding-left: 13px;");
          }
        } else {
          li.setStyle("padding-left: 13px;");
          let _ = li.createChild('span');
          _.appendChild(nameSpan);
          _.createTextChild(_debugger.safePreview(child.value, child.config));
        }
      }
      return body.toJsonML();
    }
  };
  dart.setSignature(_debugger.JsonMLFormatter, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLFormatter, [_debugger.DartFormatter])}),
    fields: () => ({
      [_simpleFormatter]: _debugger.DartFormatter,
      customFormattersOn: core.bool
    }),
    methods: () => ({
      setMaxSpanLengthForTestingOnly: dart.definiteFunctionType(dart.void, [core.int]),
      header: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      hasBody: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      body: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])
    })
  });
  _debugger.Formatter = class Formatter extends core.Object {};
  const _formatters = Symbol('_formatters');
  _debugger.DartFormatter = class DartFormatter extends core.Object {
    new() {
      this[_formatters] = null;
      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
    }
    preview(object, config) {
      try {
        if (object == null || typeof object == 'number' || typeof object == 'string' || dart.test(_debugger.isNativeJavaScriptObject(object))) {
          return dart.toString(object);
        }
        for (let formatter of this[_formatters]) {
          if (dart.test(formatter.accept(object, config))) return formatter.preview(object);
        }
      } catch (e) {
        let trace = dart.stackTrace(e);
        html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
      }

      return null;
    }
    hasChildren(object, config) {
      if (object == null) return false;
      try {
        for (let formatter of this[_formatters]) {
          if (dart.test(formatter.accept(object, config))) return formatter.hasChildren(object);
        }
      } catch (e) {
        let trace = dart.stackTrace(e);
        html$.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
      }

      return false;
    }
    children(object, config) {
      try {
        if (object != null) {
          for (let formatter of this[_formatters]) {
            if (dart.test(formatter.accept(object, config))) return formatter.children(object);
          }
        }
      } catch (e) {
        let trace = dart.stackTrace(e);
        html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
      }

      return JSArrayOfNameValuePair().of([]);
    }
  };
  dart.setSignature(_debugger.DartFormatter, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.DartFormatter, [])}),
    fields: () => ({[_formatters]: ListOfFormatter()}),
    methods: () => ({
      preview: dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic, dart.dynamic])
    })
  });
  _debugger.ObjectFormatter = class ObjectFormatter extends _debugger.Formatter {
    accept(object, config) {
      return !dart.test(_debugger.isNativeJavaScriptObject(object));
    }
    preview(object) {
      return _debugger.getObjectTypeName(object);
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let properties = LinkedHashSetOfNameValuePair().new();
      _debugger.addMetadataChildren(object, properties);
      let current = object;
      let protoChain = JSArrayOfObject().of([]);
      while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
        protoChain[dartx.add](current);
        current = _debugger.safeGetProperty(current, '__proto__');
      }
      for (/* Unimplemented unknown name */current of protoChain) {
        for (let symbol of _debugger.getOwnPropertySymbols(current)) {
          let dartName = _debugger.symbolName(symbol);
          if (dart.test(_debugger.hasMethod(object, dartName))) {
            continue;
          }
          let dartXPrefix = 'dartx.';
          if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
            dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
          } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
            continue;
          }
          let value = _debugger.safeGetProperty(object, symbol);
          properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
        }
      }
      for (/* Unimplemented unknown name */current of protoChain) {
        let className = dart.dload(dart.getReifiedType(current), 'name');
        for (let name of _debugger.getOwnPropertyNames(current)) {
          if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
          if (dart.test(_debugger.hasMethod(object, name))) {
            continue;
          }
          let value = _debugger.safeGetProperty(object, name);
          properties.add(new _debugger.NameValuePair({name: name, value: value}));
        }
      }
      return properties.toList();
    }
  };
  dart.setSignature(_debugger.ObjectFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    }),
    sfields: () => ({_customNames: SetOfString()})
  });
  dart.defineLazy(_debugger.ObjectFormatter, {
    get _customNames() {
      return (() => {
        let _ = SetOfString().new();
        _.add('constructor');
        _.add('prototype');
        _.add('__proto__');
        return _;
      })();
    },
    set _customNames(_) {}
  });
  _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
    accept(object, config) {
      return dart.getDartLibraryName(object) != null;
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
        dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
      }
      return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
    }
    children(object) {
      let children = LinkedHashSetOfNameValuePair().new();
      for (let name of _debugger.getOwnPropertyNames(object)) {
        let value = _debugger.safeGetProperty(object, name);
        name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
        children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
      }
      return children.toList();
    }
  };
  _debugger.LibraryModuleFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.LibraryModuleFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.LibraryFormatter = class LibraryFormatter extends core.Object {
    new() {
      this.genericParameters = HashMapOfString$String().new();
    }
    accept(object, config) {
      return _debugger.Library.is(object);
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      return core.String._check(dart.dload(object, 'name'));
    }
    children(object) {
      let children = LinkedHashSetOfNameValuePair().new();
      let nonGenericProperties = LinkedHashMapOfString$Object().new();
      let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
      dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
        let genericTypeConstructor = dart.getGenericTypeCtor(value);
        if (genericTypeConstructor != null) {
          this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
        } else {
          nonGenericProperties._set(core.String._check(name), value);
        }
      }, dynamicAnddynamicTodynamic$()));
      nonGenericProperties.forEach(dart.fn((name, value) => {
        if (core.Type.is(value)) {
          children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
        } else {
          children.add(new _debugger.NameValuePair({name: name, value: value}));
        }
      }, StringAndObjectTovoid()));
      return children.toList();
    }
    recordGenericParameters(name, genericTypeConstructor) {
      this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
    }
    classChild(name, child) {
      let typeName = _debugger.getTypeName(core.Type._check(child));
      let parameterName = dart.str`${name}\$`;
      if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
        typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
        _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
      }
      return new _debugger.NameValuePair({name: typeName, value: child});
    }
  };
  _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.LibraryFormatter, {
    fields: () => ({genericParameters: HashMapOfString$String()}),
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
      recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
      classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
    })
  });
  _debugger.FunctionFormatter = class FunctionFormatter extends core.Object {
    accept(object, config) {
      if (_debugger._typeof(object) != 'function') return false;
      return dart.getReifiedType(object) != null;
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      return core.String._check(dart.typeName(dart.getReifiedType(object)));
    }
    children(object) {
      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'signature', value: this.preview(object)}), new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
    }
  };
  _debugger.FunctionFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.FunctionFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.MapFormatter = class MapFormatter extends core.Object {
    accept(object, config) {
      return core.Map.is(object);
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      let map = core.Map._check(object);
      return dart.str`${_debugger.getObjectTypeName(map)} length ${map[dartx.length]}`;
    }
    children(object) {
      let map = core.Map._check(object);
      let entries = LinkedHashSetOfNameValuePair().new();
      map[dartx.forEach](dart.fn((key, value) => {
        let entryWrapper = new _debugger.MapEntry({key: key, value: value});
        entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
      }, dynamicAnddynamicTovoid$()));
      _debugger.addMetadataChildren(object, entries);
      return entries.toList();
    }
  };
  _debugger.MapFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.MapFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.IterableFormatter = class IterableFormatter extends core.Object {
    accept(object, config) {
      return core.Iterable.is(object);
    }
    preview(object) {
      let iterable = core.Iterable._check(object);
      try {
        let length = iterable[dartx.length];
        return dart.str`${_debugger.getObjectTypeName(iterable)} length ${length}`;
      } catch (_) {
        return dart.str`${_debugger.getObjectTypeName(iterable)}`;
      }

    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let children = LinkedHashSetOfNameValuePair().new();
      children.addAll(new _debugger.IterableSpan(0, core.int._check(dart.dload(object, 'length')), core.Iterable._check(object)).children());
      _debugger.addMetadataChildren(object, children);
      return children.toList();
    }
  };
  _debugger.IterableFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.IterableFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.NamedConstructorFormatter = class NamedConstructorFormatter extends core.Object {
    accept(object, config) {
      return _debugger.NamedConstructor.is(object);
    }
    preview(object) {
      return 'Named Constructor';
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
    }
  };
  _debugger.NamedConstructorFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.NamedConstructorFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.MapEntryFormatter = class MapEntryFormatter extends core.Object {
    accept(object, config) {
      return _debugger.MapEntry.is(object);
    }
    preview(object) {
      let entry = _debugger.MapEntry._check(object);
      return dart.str`${_debugger.safePreview(entry.key, _debugger.JsonMLConfig.none)} => ${_debugger.safePreview(entry.value, _debugger.JsonMLConfig.none)}`;
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key'), config: _debugger.JsonMLConfig.keyToString}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
    }
  };
  _debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.MapEntryFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.HeritageClauseFormatter = class HeritageClauseFormatter extends core.Object {
    accept(object, config) {
      return _debugger.HeritageClause.is(object);
    }
    preview(object) {
      let clause = _debugger.HeritageClause._check(object);
      let typeNames = clause.types[dartx.map](core.String)(_debugger.getTypeName);
      return dart.str`${clause.name} ${typeNames[dartx.join](", ")}`;
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let clause = _debugger.HeritageClause._check(object);
      let children = JSArrayOfNameValuePair().of([]);
      for (let type of clause.types) {
        children[dartx.add](new _debugger.NameValuePair({value: type, config: _debugger.JsonMLConfig.asClass}));
      }
      return children;
    }
  };
  _debugger.HeritageClauseFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.HeritageClauseFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.IterableSpanFormatter = class IterableSpanFormatter extends core.Object {
    accept(object, config) {
      return _debugger.IterableSpan.is(object);
    }
    preview(object) {
      return dart.str`[${dart.dload(object, 'start')}...${dart.dsend(dart.dload(object, 'end'), '-', 1)}]`;
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return ListOfNameValuePair()._check(dart.dsend(object, 'children'));
    }
  };
  _debugger.IterableSpanFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.IterableSpanFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.StackTraceFormatter = class StackTraceFormatter extends core.Object {
    accept(object, config) {
      return core.StackTrace.is(object);
    }
    preview(object) {
      return 'StackTrace';
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return dart.toString(object)[dartx.split]('\n')[dartx.map](_debugger.NameValuePair)(dart.fn(line => new _debugger.NameValuePair({value: line[dartx.replaceFirst](core.RegExp.new('^\\s+at\\s'), ''), hideName: true}), StringToNameValuePair()))[dartx.toList]();
    }
  };
  _debugger.StackTraceFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.StackTraceFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.ClassFormatter = class ClassFormatter extends core.Object {
    accept(object, config) {
      return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
    }
    preview(object) {
      let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
      if (typeName != null) return core.String._check(typeName);
      let type = _debugger._getType(object);
      let implements$ = dart.getImplements(type);
      typeName = _debugger.getTypeName(core.Type._check(type));
      if (implements$ != null) {
        let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
        return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
      } else {
        return core.String._check(typeName);
      }
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let type = _debugger._getType(object);
      let children = JSArrayOfNameValuePair().of([]);
      let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
      let mixins = dart.getMixins(type);
      if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
        children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
      }
      let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
      for (let name of _debugger.getOwnPropertyNames(object)) {
        if (dart.test(hiddenProperties[dartx.contains](name))) continue;
        let value = _debugger.safeGetProperty(object, name);
        if (value != null && dart.getIsNamedConstructor(value) != null) {
          value = new _debugger.NamedConstructor(value);
          name = dart.str`${typeName}.${name}`;
        }
        children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
      }
      let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
      let prototype = object.prototype;
      if (prototype != null) {
        for (let name of _debugger.getOwnPropertyNames(prototype)) {
          if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
          let func = _debugger.safeGetProperty(prototype, name);
          let constructor = _debugger.safeGetProperty(prototype, 'constructor');
          let sigObj = dart.getMethodSig(constructor);
          if (sigObj != null) {
            let value = _debugger.safeGetProperty(sigObj, name);
            if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
              dart.tag(func, value);
              children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
            }
          }
        }
      }
      return children;
    }
  };
  _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.ClassFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.registerDevtoolsFormatter = function() {
    let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
    dart.global.devtoolsFormatters = formatters;
  };
  dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
  _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
    if (arg0 === void 0) arg0 = null;
    if (arg1 === void 0) arg1 = null;
    if (arg2 === void 0) arg2 = null;
    if (arg3 === void 0) arg3 = null;
    if (arg4 === void 0) arg4 = null;
    if (arg5 === void 0) arg5 = null;
    if (arg6 === void 0) arg6 = null;
    if (arg7 === void 0) arg7 = null;
    if (arg8 === void 0) arg8 = null;
    if (arg9 === void 0) arg9 = null;
    if (arg10 === void 0) arg10 = null;
    if (arg11 === void 0) arg11 = null;
  };
  dart.lazyFn(_foreign_helper.JS, () => StringAndString__Todynamic());
  _foreign_helper.JSExportName = class JSExportName extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_foreign_helper.JSExportName, {
    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JSExportName, [core.String])}),
    fields: () => ({name: core.String})
  });
  _foreign_helper.JS_CURRENT_ISOLATE_CONTEXT = function() {
  };
  dart.lazyFn(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT, () => VoidToIsolateContext());
  _foreign_helper.IsolateContext = class IsolateContext extends core.Object {};
  _foreign_helper.JS_CALL_IN_ISOLATE = function(isolate, func) {
  };
  dart.lazyFn(_foreign_helper.JS_CALL_IN_ISOLATE, () => dynamicAndFunctionTodynamic());
  _foreign_helper.JS_SET_CURRENT_ISOLATE = function(isolate) {
  };
  dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid$());
  _foreign_helper.JS_CREATE_ISOLATE = function() {
  };
  dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic$());
  _foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
  };
  dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic$());
  _foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
  };
  dart.fn(_foreign_helper.JS_INTERCEPTOR_CONSTANT, TypeTodynamic());
  _foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
  };
  dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString$());
  _foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
  };
  dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString$());
  _foreign_helper.JS_OBJECT_CLASS_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString$());
  _foreign_helper.JS_NULL_CLASS_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString$());
  _foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString$());
  _foreign_helper.JS_CURRENT_ISOLATE = function() {
  };
  dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic$());
  _foreign_helper.JS_SIGNATURE_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString$());
  _foreign_helper.JS_TYPEDEF_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString$());
  _foreign_helper.JS_GET_NAME = function(name) {
  };
  dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString$());
  _foreign_helper.JS_EMBEDDED_GLOBAL = function(typeDescription, name) {
  };
  dart.lazyFn(_foreign_helper.JS_EMBEDDED_GLOBAL, () => StringAndStringTodynamic());
  _foreign_helper.JS_GET_FLAG = function(name) {
  };
  dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool$());
  _foreign_helper.JS_EFFECT = function(code) {
    dart.dcall(code, null);
  };
  dart.lazyFn(_foreign_helper.JS_EFFECT, () => FunctionTovoid());
  _foreign_helper.JS_CONST = class JS_CONST extends core.Object {
    new(code) {
      this.code = code;
    }
  };
  dart.setSignature(_foreign_helper.JS_CONST, {
    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JS_CONST, [core.String])}),
    fields: () => ({code: core.String})
  });
  _foreign_helper.JS_STRING_CONCAT = function(a, b) {
    return a + b;
  };
  dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString$());
  _foreign_helper._Rest = class _Rest extends core.Object {
    new() {
    }
  };
  dart.setSignature(_foreign_helper._Rest, {
    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper._Rest, [])})
  });
  _foreign_helper.rest = dart.const(new _foreign_helper._Rest());
  _foreign_helper.spread = function(args) {
    dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
  };
  dart.fn(_foreign_helper.spread, dynamicTodynamic$());
  _interceptors.Interceptor = class Interceptor extends core.Object {
    new() {
    }
  };
  dart.addTypeTests(_interceptors.Interceptor);
  dart.setSignature(_interceptors.Interceptor, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.Interceptor, [])})
  });
  _interceptors.getInterceptor = function(obj) {
    return obj;
  };
  dart.fn(_interceptors.getInterceptor, dynamicTodynamic$());
  dart.defineExtensionNames([
    'toString',
    'hashCode',
    'runtimeType'
  ]);
  _interceptors.JSBool = class JSBool extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    [dartx.toString]() {
      return String(this);
    }
    get [dartx.hashCode]() {
      return this ? 2 * 3 * 23 * 3761 : 269 * 811;
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(core.bool);
    }
  };
  _interceptors.JSBool[dart.implements] = () => [core.bool];
  dart.setSignature(_interceptors.JSBool, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSBool, [])})
  });
  dart.registerExtension(dart.global.Boolean, _interceptors.JSBool);
  _interceptors.JSIndexable$ = dart.generic(E => {
    class JSIndexable extends core.Object {}
    dart.addTypeTests(JSIndexable);
    return JSIndexable;
  });
  _interceptors.JSIndexable = JSIndexable();
  _interceptors.JSObject = class JSObject extends core.Object {};
  _interceptors.JavaScriptObject = class JavaScriptObject extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    get hashCode() {
      return 0;
    }
    get runtimeType() {
      return dart.wrapType(_interceptors.JSObject);
    }
  };
  _interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject];
  dart.setSignature(_interceptors.JavaScriptObject, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JavaScriptObject, [])})
  });
  _interceptors.PlainJavaScriptObject = class PlainJavaScriptObject extends _interceptors.JavaScriptObject {
    new() {
      super.new();
    }
  };
  dart.setSignature(_interceptors.PlainJavaScriptObject, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.PlainJavaScriptObject, [])})
  });
  _interceptors.UnknownJavaScriptObject = class UnknownJavaScriptObject extends _interceptors.JavaScriptObject {
    new() {
      super.new();
    }
    toString() {
      return String(this);
    }
  };
  dart.setSignature(_interceptors.UnknownJavaScriptObject, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.UnknownJavaScriptObject, [])})
  });
  _interceptors.findInterceptorConstructorForType = function(type) {
  };
  dart.fn(_interceptors.findInterceptorConstructorForType, TypeTodynamic());
  _interceptors.findConstructorForNativeSubclassType = function(type, name) {
  };
  dart.lazyFn(_interceptors.findConstructorForNativeSubclassType, () => TypeAndStringTodynamic());
  _interceptors.getNativeInterceptor = function(object) {
  };
  dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic$());
  _interceptors.setDispatchProperty = function(object, value) {
  };
  dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic$());
  const _removeWhere = Symbol('_removeWhere');
  _interceptors.JSArray$ = dart.generic(E => {
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ArrayIteratorOfE = () => (ArrayIteratorOfE = dart.constFn(_interceptors.ArrayIterator$(E)))();
    let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
    let JSIndexableOfE = () => (JSIndexableOfE = dart.constFn(_interceptors.JSIndexable$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    dart.defineExtensionNames([
      'checkMutable',
      'checkGrowable',
      'add',
      'removeAt',
      'insert',
      'insertAll',
      'setAll',
      'removeLast',
      'remove',
      'removeWhere',
      'retainWhere',
      'where',
      'expand',
      'addAll',
      'clear',
      'forEach',
      'map',
      'join',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'reduce',
      'fold',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'sublist',
      'getRange',
      'first',
      'last',
      'single',
      'removeRange',
      'setRange',
      'fillRange',
      'replaceRange',
      'any',
      'every',
      'reversed',
      'sort',
      'shuffle',
      'indexOf',
      'lastIndexOf',
      'contains',
      'isEmpty',
      'isNotEmpty',
      'toString',
      'toList',
      'toSet',
      'iterator',
      'hashCode',
      'length',
      'length',
      '_get',
      '_set',
      'asMap'
    ]);
    class JSArray extends core.Object {
      new() {
      }
      static typed(allocation) {
        return dart.list(allocation, E);
      }
      static of(allocation) {
        return dart.setType(allocation, JSArray);
      }
      static markFixed(allocation) {
        return JSArrayOfE().typed(_interceptors.JSArray.markFixedList(core.List._check(allocation)));
      }
      static markGrowable(allocation) {
        return JSArrayOfE().typed(allocation);
      }
      static markFixedList(list) {
        list.fixed$length = Array;
        return list;
      }
      static markUnmodifiableList(list) {
        list.fixed$length = Array;
        list.immutable$list = Array;
        return list;
      }
      [dartx.checkMutable](reason) {
        if (this.immutable$list) {
          dart.throw(new core.UnsupportedError(core.String._check(reason)));
        }
      }
      [dartx.checkGrowable](reason) {
        if (this.fixed$length) {
          dart.throw(new core.UnsupportedError(core.String._check(reason)));
        }
      }
      [dartx.add](value) {
        E._check(value);
        this[dartx.checkGrowable]('add');
        this.push(value);
      }
      [dartx.removeAt](index) {
        this[dartx.checkGrowable]('removeAt');
        if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
        if (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.value(index));
        }
        return this.splice(index, 1)[0];
      }
      [dartx.insert](index, value) {
        E._check(value);
        this[dartx.checkGrowable]('insert');
        if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
        if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.value(index));
        }
        this.splice(index, 0, value);
      }
      [dartx.insertAll](index, iterable) {
        IterableOfE()._check(iterable);
        this[dartx.checkGrowable]('insertAll');
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        if (!_internal.EfficientLength.is(iterable)) {
          iterable = iterable[dartx.toList]();
        }
        let insertionLength = iterable[dartx.length];
        this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
        let end = dart.notNull(index) + dart.notNull(insertionLength);
        this[dartx.setRange](end, this[dartx.length], this, index);
        this[dartx.setRange](index, end, iterable);
      }
      [dartx.setAll](index, iterable) {
        IterableOfE()._check(iterable);
        this[dartx.checkMutable]('setAll');
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        for (let element of iterable) {
          this[dartx._set]((() => {
            let x = index;
            index = dart.notNull(x) + 1;
            return x;
          })(), element);
        }
      }
      [dartx.removeLast]() {
        this[dartx.checkGrowable]('removeLast');
        if (this[dartx.length] == 0) dart.throw(_js_helper.diagnoseIndexError(this, -1));
        return this.pop();
      }
      [dartx.remove](element) {
        this[dartx.checkGrowable]('remove');
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), element)) {
            this.splice(i, 1);
            return true;
          }
        }
        return false;
      }
      [dartx.removeWhere](test) {
        this[dartx.checkGrowable]('removeWhere');
        this[_removeWhere](test, true);
      }
      [dartx.retainWhere](test) {
        this[dartx.checkGrowable]('retainWhere');
        this[_removeWhere](test, false);
      }
      [_removeWhere](test, removeMatching) {
        let retained = [];
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          if (!dart.test(test(E._check(element))) == removeMatching) {
            retained[dartx.add](element);
          }
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        if (retained[dartx.length] == end) return;
        this[dartx.length] = retained[dartx.length];
        for (let i = 0; i < dart.notNull(retained[dartx.length]); i++) {
          this[dartx._set](i, E._check(retained[dartx._get](i)));
        }
      }
      [dartx.where](f) {
        return new (WhereIterableOfE())(this, f);
      }
      [dartx.expand](T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      [dartx.addAll](collection) {
        IterableOfE()._check(collection);
        let i = this[dartx.length];
        this[dartx.checkGrowable]('addAll');
        for (let e of collection) {
          dart.assert(i == this[dartx.length] || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
          i = dart.notNull(i) + 1;
          this.push(e);
        }
      }
      [dartx.clear]() {
        this[dartx.length] = 0;
      }
      [dartx.forEach](f) {
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          f(element);
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      [dartx.map](T) {
        return f => {
          return new (_internal.MappedListIterable$(E, T))(this, f);
        };
      }
      [dartx.join](separator) {
        if (separator === void 0) separator = "";
        let list = core.List.new(this[dartx.length]);
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          list[dartx._set](i, dart.str`${this[dartx._get](i)}`);
        }
        return list.join(separator);
      }
      [dartx.take](n) {
        return new (SubListIterableOfE())(this, 0, n);
      }
      [dartx.takeWhile](test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      [dartx.skip](n) {
        return new (SubListIterableOfE())(this, n, null);
      }
      [dartx.skipWhile](test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      [dartx.reduce](combine) {
        EAndEToE()._check(combine);
        let length = this[dartx.length];
        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
        let value = this[dartx._get](0);
        for (let i = 1; i < dart.notNull(length); i++) {
          let element = this[i];
          value = combine(value, element);
          if (length != this[dartx.length]) dart.throw(new core.ConcurrentModificationError(this));
        }
        return value;
      }
      [dartx.fold](T) {
        return (initialValue, combine) => {
          let value = initialValue;
          let length = this[dartx.length];
          for (let i = 0; i < dart.notNull(length); i++) {
            let element = this[i];
            value = combine(value, element);
            if (this[dartx.length] != length) dart.throw(new core.ConcurrentModificationError(this));
          }
          return value;
        };
      }
      [dartx.firstWhere](test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); ++i) {
          let element = this[i];
          if (dart.test(test(element))) return element;
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      [dartx.lastWhere](test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this[dartx.length];
        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
          let element = this[i];
          if (dart.test(test(element))) return element;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      [dartx.singleWhere](test) {
        let length = this[dartx.length];
        let match = null;
        let matchFound = false;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[i];
          if (dart.test(test(E._check(element)))) {
            if (matchFound) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            matchFound = true;
            match = E._check(element);
          }
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (matchFound) return match;
        dart.throw(_internal.IterableElementError.noElement());
      }
      [dartx.elementAt](index) {
        return this[dartx._get](index);
      }
      [dartx.sublist](start, end) {
        if (end === void 0) end = null;
        _js_helper.checkNull(start);
        if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
        if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.range(start, 0, this[dartx.length], "start"));
        }
        if (end == null) {
          end = this[dartx.length];
        } else {
          if (!(typeof end == 'number')) dart.throw(_js_helper.argumentErrorValue(end));
          if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(this[dartx.length])) {
            dart.throw(new core.RangeError.range(end, start, this[dartx.length], "end"));
          }
        }
        if (start == end) return JSArrayOfE().of([]);
        return JSArrayOfE().typed(this.slice(start, end));
      }
      [dartx.getRange](start, end) {
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        return new (SubListIterableOfE())(this, start, end);
      }
      get [dartx.first]() {
        if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](0);
        dart.throw(_internal.IterableElementError.noElement());
      }
      get [dartx.last]() {
        if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
        dart.throw(_internal.IterableElementError.noElement());
      }
      get [dartx.single]() {
        if (this[dartx.length] == 1) return this[dartx._get](0);
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        dart.throw(_internal.IterableElementError.tooMany());
      }
      [dartx.removeRange](start, end) {
        this[dartx.checkGrowable]('removeRange');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let deleteCount = dart.notNull(end) - dart.notNull(start);
        this.splice(start, deleteCount);
      }
      [dartx.setRange](start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        this[dartx.checkMutable]('set range');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let length = dart.notNull(end) - dart.notNull(start);
        if (length == 0) return;
        core.RangeError.checkNotNegative(skipCount, "skipCount");
        let otherList = null;
        let otherStart = null;
        if (core.List.is(iterable)) {
          otherList = ListOfE()._check(iterable);
          otherStart = skipCount;
        } else {
          otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
          otherStart = 0;
        }
        if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
          dart.throw(_internal.IterableElementError.tooFew());
        }
        if (dart.notNull(otherStart) < dart.notNull(start)) {
          for (let i = length - 1; i >= 0; i--) {
            let element = otherList[dartx._get](dart.notNull(otherStart) + i);
            this[dart.notNull(start) + i] = element;
          }
        } else {
          for (let i = 0; i < length; i++) {
            let element = otherList[dartx._get](dart.notNull(otherStart) + i);
            this[dart.notNull(start) + i] = element;
          }
        }
      }
      [dartx.fillRange](start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        this[dartx.checkMutable]('fill range');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[i] = fillValue;
        }
      }
      [dartx.replaceRange](start, end, replacement) {
        IterableOfE()._check(replacement);
        this[dartx.checkGrowable]('replace range');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        if (!_internal.EfficientLength.is(replacement)) {
          replacement = replacement[dartx.toList]();
        }
        let removeLength = dart.notNull(end) - dart.notNull(start);
        let insertLength = replacement[dartx.length];
        if (removeLength >= dart.notNull(insertLength)) {
          let delta = removeLength - dart.notNull(insertLength);
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          let newLength = dart.notNull(this[dartx.length]) - delta;
          this[dartx.setRange](start, insertEnd, replacement);
          if (delta != 0) {
            this[dartx.setRange](insertEnd, newLength, this, end);
            this[dartx.length] = newLength;
          }
        } else {
          let delta = dart.notNull(insertLength) - removeLength;
          let newLength = dart.notNull(this[dartx.length]) + delta;
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          this[dartx.length] = newLength;
          this[dartx.setRange](insertEnd, newLength, this, end);
          this[dartx.setRange](start, insertEnd, replacement);
        }
      }
      [dartx.any](test) {
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          if (dart.test(test(element))) return true;
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        return false;
      }
      [dartx.every](test) {
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          if (!dart.test(test(element))) return false;
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        return true;
      }
      get [dartx.reversed]() {
        return new (ReversedListIterableOfE())(this);
      }
      [dartx.sort](compare) {
        if (compare === void 0) compare = null;
        this[dartx.checkMutable]('sort');
        if (compare == null) {
          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
        } else {
          _internal.Sort.sort(E)(this, compare);
        }
      }
      [dartx.shuffle](random) {
        if (random === void 0) random = null;
        this[dartx.checkMutable]('shuffle');
        if (random == null) random = math.Random.new();
        let length = this[dartx.length];
        while (dart.notNull(length) > 1) {
          let pos = random.nextInt(length);
          length = dart.notNull(length) - 1;
          let tmp = this[dartx._get](length);
          this[dartx._set](length, this[dartx._get](pos));
          this[dartx._set](pos, tmp);
        }
      }
      [dartx.indexOf](element, start) {
        if (start === void 0) start = 0;
        if (dart.notNull(start) >= dart.notNull(this[dartx.length])) {
          return -1;
        }
        if (dart.notNull(start) < 0) {
          start = 0;
        }
        for (let i = start; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      [dartx.lastIndexOf](element, startIndex) {
        if (startIndex === void 0) startIndex = null;
        if (startIndex == null) {
          startIndex = dart.notNull(this[dartx.length]) - 1;
        } else {
          if (dart.notNull(startIndex) < 0) {
            return -1;
          }
          if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
            startIndex = dart.notNull(this[dartx.length]) - 1;
          }
        }
        for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      [dartx.contains](other) {
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), other)) return true;
        }
        return false;
      }
      get [dartx.isEmpty]() {
        return this[dartx.length] == 0;
      }
      get [dartx.isNotEmpty]() {
        return !dart.test(this[dartx.isEmpty]);
      }
      [dartx.toString]() {
        return collection.ListBase.listToString(this);
      }
      [dartx.toList](opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let list = this.slice();
        if (!dart.test(growable)) _interceptors.JSArray.markFixedList(core.List._check(list));
        return JSArrayOfE().typed(list);
      }
      [dartx.toSet]() {
        return SetOfE().from(this);
      }
      get [dartx.iterator]() {
        return new (ArrayIteratorOfE())(this);
      }
      get [dartx.hashCode]() {
        return _js_helper.Primitives.objectHashCode(this);
      }
      get [dartx.length]() {
        return this.length;
      }
      set [dartx.length](newLength) {
        this[dartx.checkGrowable]('set length');
        if (!(typeof newLength == 'number')) {
          dart.throw(new core.ArgumentError.value(newLength, 'newLength'));
        }
        if (dart.notNull(newLength) < 0) {
          dart.throw(new core.RangeError.range(newLength, 0, null, 'newLength'));
        }
        this.length = newLength;
      }
      [dartx._get](index) {
        if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
        if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
        return this[index];
      }
      [dartx._set](index, value) {
        E._check(value);
        this[dartx.checkMutable]('indexed set');
        if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
        if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
        this[index] = value;
        return value;
      }
      [dartx.asMap]() {
        return new (ListMapViewOfE())(this);
      }
    }
    dart.setExtensionBaseClass(JSArray, dart.global.Array);
    dart.addTypeTests(JSArray);
    JSArray[dart.implements] = () => [ListOfE(), JSIndexableOfE()];
    dart.setSignature(JSArray, {
      constructors: () => ({
        new: dart.definiteFunctionType(_interceptors.JSArray$(E), []),
        typed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
        of: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
        markFixed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
        markGrowable: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic])
      }),
      getters: () => ({
        [dartx.first]: dart.definiteFunctionType(E, []),
        [dartx.last]: dart.definiteFunctionType(E, []),
        [dartx.single]: dart.definiteFunctionType(E, []),
        [dartx.reversed]: dart.definiteFunctionType(core.Iterable$(E), []),
        [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
        [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
        [dartx.iterator]: dart.definiteFunctionType(core.Iterator$(E), []),
        [dartx.length]: dart.definiteFunctionType(core.int, [])
      }),
      setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        [dartx.checkMutable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
        [dartx.checkGrowable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
        [dartx.add]: dart.definiteFunctionType(dart.void, [E]),
        [dartx.removeAt]: dart.definiteFunctionType(E, [core.int]),
        [dartx.insert]: dart.definiteFunctionType(dart.void, [core.int, E]),
        [dartx.insertAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        [dartx.setAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        [dartx.removeLast]: dart.definiteFunctionType(E, []),
        [dartx.remove]: dart.definiteFunctionType(core.bool, [core.Object]),
        [dartx.removeWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
        [dartx.retainWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
        [_removeWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        [dartx.where]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        [dartx.expand]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        [dartx.addAll]: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        [dartx.clear]: dart.definiteFunctionType(dart.void, []),
        [dartx.forEach]: dart.definiteFunctionType(dart.void, [ETovoid()]),
        [dartx.map]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        [dartx.join]: dart.definiteFunctionType(core.String, [], [core.String]),
        [dartx.take]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        [dartx.takeWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        [dartx.skip]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        [dartx.skipWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        [dartx.reduce]: dart.definiteFunctionType(E, [EAndEToE()]),
        [dartx.fold]: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        [dartx.firstWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        [dartx.lastWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        [dartx.singleWhere]: dart.definiteFunctionType(E, [ETobool()]),
        [dartx.elementAt]: dart.definiteFunctionType(E, [core.int]),
        [dartx.sublist]: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
        [dartx.getRange]: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
        [dartx.removeRange]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        [dartx.setRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        [dartx.fillRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
        [dartx.replaceRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        [dartx.any]: dart.definiteFunctionType(core.bool, [ETobool()]),
        [dartx.every]: dart.definiteFunctionType(core.bool, [ETobool()]),
        [dartx.sort]: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        [dartx.shuffle]: dart.definiteFunctionType(dart.void, [], [math.Random]),
        [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Object]),
        [dartx.toList]: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        [dartx.toSet]: dart.definiteFunctionType(core.Set$(E), []),
        [dartx._get]: dart.definiteFunctionType(E, [core.int]),
        [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, E]),
        [dartx.asMap]: dart.definiteFunctionType(core.Map$(core.int, E), [])
      }),
      statics: () => ({
        markFixedList: dart.definiteFunctionType(core.List, [core.List]),
        markUnmodifiableList: dart.definiteFunctionType(core.List, [core.List])
      }),
      names: ['markFixedList', 'markUnmodifiableList']
    });
    return JSArray;
  });
  _interceptors.JSArray = JSArray();
  dart.registerExtension(dart.global.Array, _interceptors.JSArray);
  _interceptors.JSMutableArray$ = dart.generic(E => {
    class JSMutableArray extends _interceptors.JSArray$(E) {
      new() {
        super.new();
      }
    }
    return JSMutableArray;
  });
  _interceptors.JSMutableArray = JSMutableArray();
  _interceptors.JSFixedArray$ = dart.generic(E => {
    class JSFixedArray extends _interceptors.JSMutableArray$(E) {
      new() {
        super.new();
      }
    }
    return JSFixedArray;
  });
  _interceptors.JSFixedArray = JSFixedArray();
  _interceptors.JSExtendableArray$ = dart.generic(E => {
    class JSExtendableArray extends _interceptors.JSMutableArray$(E) {
      new() {
        super.new();
      }
    }
    return JSExtendableArray;
  });
  _interceptors.JSExtendableArray = JSExtendableArray();
  _interceptors.JSUnmodifiableArray$ = dart.generic(E => {
    class JSUnmodifiableArray extends _interceptors.JSArray$(E) {
      new() {
        super.new();
      }
    }
    return JSUnmodifiableArray;
  });
  _interceptors.JSUnmodifiableArray = JSUnmodifiableArray();
  const _iterable = Symbol('_iterable');
  const _length = Symbol('_length');
  const _index = Symbol('_index');
  const _current = Symbol('_current');
  _interceptors.ArrayIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    class ArrayIterator extends core.Object {
      new(iterable) {
        this[_iterable] = iterable;
        this[_length] = iterable[dartx.length];
        this[_index] = 0;
        this[_current] = null;
      }
      get current() {
        return this[_current];
      }
      moveNext() {
        let length = this[_iterable][dartx.length];
        if (this[_length] != length) {
          dart.throw(_js_helper.throwConcurrentModificationError(this[_iterable]));
        }
        if (dart.notNull(this[_index]) >= dart.notNull(length)) {
          this[_current] = null;
          return false;
        }
        this[_current] = this[_iterable][dartx._get](this[_index]);
        this[_index] = dart.notNull(this[_index]) + 1;
        return true;
      }
    }
    dart.addTypeTests(ArrayIterator);
    ArrayIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(ArrayIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_interceptors.ArrayIterator$(E), [JSArrayOfE()])}),
      fields: () => ({
        [_iterable]: JSArrayOfE(),
        [_length]: core.int,
        [_index]: core.int,
        [_current]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return ArrayIterator;
  });
  _interceptors.ArrayIterator = ArrayIterator();
  const _isInt32 = Symbol('_isInt32');
  const _tdivSlow = Symbol('_tdivSlow');
  const _shlPositive = Symbol('_shlPositive');
  const _shrOtherPositive = Symbol('_shrOtherPositive');
  const _shrBothPositive = Symbol('_shrBothPositive');
  dart.defineExtensionNames([
    'compareTo',
    'isNegative',
    'isNaN',
    'isInfinite',
    'isFinite',
    'remainder',
    'abs',
    'sign',
    'toInt',
    'truncate',
    'ceil',
    'floor',
    'round',
    'ceilToDouble',
    'floorToDouble',
    'roundToDouble',
    'truncateToDouble',
    'clamp',
    'toDouble',
    'toStringAsFixed',
    'toStringAsExponential',
    'toStringAsPrecision',
    'toRadixString',
    'toString',
    'hashCode',
    '_negate',
    '+',
    '-',
    '/',
    '*',
    '%',
    '~/',
    '<<',
    '>>',
    '&',
    '|',
    '^',
    '<',
    '>',
    '<=',
    '>=',
    'isEven',
    'isOdd',
    'toUnsigned',
    'toSigned',
    'bitLength',
    'modPow',
    'modInverse',
    'gcd',
    '~'
  ]);
  _interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    [dartx.compareTo](b) {
      if (this < dart.notNull(b)) {
        return -1;
      } else if (this > dart.notNull(b)) {
        return 1;
      } else if (this == b) {
        if (this == 0) {
          let bIsNegative = b[dartx.isNegative];
          if (this[dartx.isNegative] == bIsNegative) return 0;
          if (dart.test(this[dartx.isNegative])) return -1;
          return 1;
        }
        return 0;
      } else if (dart.test(this[dartx.isNaN])) {
        if (dart.test(b[dartx.isNaN])) {
          return 0;
        }
        return 1;
      } else {
        return -1;
      }
    }
    get [dartx.isNegative]() {
      return this == 0 ? 1 / this < 0 : this < 0;
    }
    get [dartx.isNaN]() {
      return isNaN(this);
    }
    get [dartx.isInfinite]() {
      return this == 1 / 0 || this == -1 / 0;
    }
    get [dartx.isFinite]() {
      return isFinite(this);
    }
    [dartx.remainder](b) {
      if (!(typeof b == 'number')) dart.throw(_js_helper.argumentErrorValue(b));
      return this % b;
    }
    [dartx.abs]() {
      return Math.abs(this);
    }
    get [dartx.sign]() {
      return this > 0 ? 1 : this < 0 ? -1 : this;
    }
    [dartx.toInt]() {
      if (this >= _interceptors.JSNumber._MIN_INT32 && this <= _interceptors.JSNumber._MAX_INT32) {
        return this | 0;
      }
      if (isFinite(this)) {
        return this[dartx.truncateToDouble]() + 0;
      }
      dart.throw(new core.UnsupportedError("" + this));
    }
    [dartx.truncate]() {
      return this[dartx.toInt]();
    }
    [dartx.ceil]() {
      return this[dartx.ceilToDouble]()[dartx.toInt]();
    }
    [dartx.floor]() {
      return this[dartx.floorToDouble]()[dartx.toInt]();
    }
    [dartx.round]() {
      if (this > 0) {
        if (this !== 1 / 0) {
          return Math.round(this);
        }
      } else if (this > -1 / 0) {
        return 0 - Math.round(0 - this);
      }
      dart.throw(new core.UnsupportedError("" + this));
    }
    [dartx.ceilToDouble]() {
      return Math.ceil(this);
    }
    [dartx.floorToDouble]() {
      return Math.floor(this);
    }
    [dartx.roundToDouble]() {
      if (this < 0) {
        return -Math.round(-this);
      } else {
        return Math.round(this);
      }
    }
    [dartx.truncateToDouble]() {
      return this < 0 ? this[dartx.ceilToDouble]() : this[dartx.floorToDouble]();
    }
    [dartx.clamp](lowerLimit, upperLimit) {
      if (dart.notNull(lowerLimit[dartx.compareTo](upperLimit)) > 0) {
        dart.throw(_js_helper.argumentErrorValue(lowerLimit));
      }
      if (dart.notNull(this[dartx.compareTo](lowerLimit)) < 0) return lowerLimit;
      if (dart.notNull(this[dartx.compareTo](upperLimit)) > 0) return upperLimit;
      return this;
    }
    [dartx.toDouble]() {
      return this;
    }
    [dartx.toStringAsFixed](fractionDigits) {
      _js_helper.checkInt(fractionDigits);
      if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
        dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
      }
      let result = this.toFixed(fractionDigits);
      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
      return result;
    }
    [dartx.toStringAsExponential](fractionDigits) {
      if (fractionDigits === void 0) fractionDigits = null;
      let result = null;
      if (fractionDigits != null) {
        _js_helper.checkInt(fractionDigits);
        if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
          dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
        }
        result = this.toExponential(fractionDigits);
      } else {
        result = this.toExponential();
      }
      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
      return result;
    }
    [dartx.toStringAsPrecision](precision) {
      _js_helper.checkInt(precision);
      if (dart.notNull(precision) < 1 || dart.notNull(precision) > 21) {
        dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
      }
      let result = this.toPrecision(precision);
      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
      return result;
    }
    [dartx.toRadixString](radix) {
      _js_helper.checkInt(radix);
      if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
        dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
      }
      let result = this.toString(radix);
      let rightParenCode = 41;
      if (result[dartx.codeUnitAt](dart.notNull(result[dartx.length]) - 1) != rightParenCode) {
        return result;
      }
      return _interceptors.JSNumber._handleIEtoString(result);
    }
    static _handleIEtoString(result) {
      let match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null) {
        dart.throw(new core.UnsupportedError(dart.str`Unexpected toString result: ${result}`));
      }
      result = dart.dindex(match, 1);
      let exponent = +dart.dindex(match, 3);
      if (dart.dindex(match, 2) != null) {
        result = result + dart.dindex(match, 2);
        exponent = exponent - dart.dindex(match, 2).length;
      }
      return dart.notNull(result) + "0"[dartx['*']](exponent);
    }
    [dartx.toString]() {
      if (this == 0 && 1 / this < 0) {
        return '-0.0';
      } else {
        return "" + this;
      }
    }
    get [dartx.hashCode]() {
      return this & 0x1FFFFFFF;
    }
    [dartx._negate]() {
      return -this;
    }
    [dartx['+']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this + other;
    }
    [dartx['-']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this - other;
    }
    [dartx['/']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this / other;
    }
    [dartx['*']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this * other;
    }
    [dartx['%']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      let result = this % other;
      if (result == 0) return 0;
      if (result > 0) return result;
      if (other < 0) {
        return result - other;
      } else {
        return result + other;
      }
    }
    [_isInt32](value) {
      return (value | 0) === value;
    }
    [dartx['~/']](other) {
      if (dart.test(this[_isInt32](this)) && dart.test(this[_isInt32](other)) && 0 != other && -1 != other) {
        return this / other | 0;
      } else {
        return this[_tdivSlow](other);
      }
    }
    [_tdivSlow](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this / other)[dartx.toInt]();
    }
    [dartx['<<']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
      return this[_shlPositive](other);
    }
    [_shlPositive](other) {
      return other > 31 ? 0 : this << other >>> 0;
    }
    [dartx['>>']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
      return this[_shrOtherPositive](other);
    }
    [_shrOtherPositive](other) {
      return this > 0 ? this[_shrBothPositive](other) : this >> (dart.notNull(other) > 31 ? 31 : other) >>> 0;
    }
    [_shrBothPositive](other) {
      return other > 31 ? 0 : this >>> other;
    }
    [dartx['&']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this & other) >>> 0;
    }
    [dartx['|']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this | other) >>> 0;
    }
    [dartx['^']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this ^ other) >>> 0;
    }
    [dartx['<']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this < other;
    }
    [dartx['>']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this > other;
    }
    [dartx['<=']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this <= other;
    }
    [dartx['>=']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this >= other;
    }
    get [dartx.isEven]() {
      return (this & 1) == 0;
    }
    get [dartx.isOdd]() {
      return (this & 1) == 1;
    }
    [dartx.toUnsigned](width) {
      return (this & (1)[dartx['<<']](width) - 1) >>> 0;
    }
    [dartx.toSigned](width) {
      let signMask = (1)[dartx['<<']](dart.notNull(width) - 1);
      return ((this & signMask - 1) >>> 0) - ((this & signMask) >>> 0);
    }
    get [dartx.bitLength]() {
      let nonneg = this < 0 ? -this - 1 : this;
      if (nonneg >= 4294967296) {
        nonneg = (nonneg / 4294967296)[dartx.truncate]();
        return dart.notNull(_interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg))) + 32;
      }
      return _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg));
    }
    [dartx.modPow](e, m) {
      if (!(typeof e == 'number')) {
        dart.throw(new core.ArgumentError.value(e, "exponent", "not an integer"));
      }
      if (!(typeof m == 'number')) {
        dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
      }
      if (dart.notNull(e) < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
      if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
      if (e == 0) return 1;
      let b = this;
      if (dart.notNull(b) < 0 || dart.notNull(b) > dart.notNull(m)) {
        b = b[dartx['%']](m);
      }
      let r = 1;
      while (dart.notNull(e) > 0) {
        if (dart.test(e[dartx.isOdd])) {
          r = (r * dart.notNull(b))[dartx['%']](m);
        }
        e = (dart.notNull(e) / 2)[dartx.truncate]();
        b = (dart.notNull(b) * dart.notNull(b))[dartx['%']](m);
      }
      return r;
    }
    static _binaryGcd(x, y, inv) {
      let s = 1;
      if (!dart.test(inv)) {
        while (dart.test(x[dartx.isEven]) && dart.test(y[dartx.isEven])) {
          x = (dart.notNull(x) / 2)[dartx.truncate]();
          y = (dart.notNull(y) / 2)[dartx.truncate]();
          s = s * 2;
        }
        if (dart.test(y[dartx.isOdd])) {
          let t = x;
          x = y;
          y = t;
        }
      }
      let ac = x[dartx.isEven];
      let u = x;
      let v = y;
      let a = 1, b = 0, c = 0, d = 1;
      do {
        while (dart.test(u[dartx.isEven])) {
          u = (dart.notNull(u) / 2)[dartx.truncate]();
          if (dart.test(ac)) {
            if (!dart.test(a[dartx.isEven]) || !dart.test(b[dartx.isEven])) {
              a = dart.notNull(a) + dart.notNull(y);
              b = dart.notNull(b) - dart.notNull(x);
            }
            a = (dart.notNull(a) / 2)[dartx.truncate]();
          } else if (!dart.test(b[dartx.isEven])) {
            b = dart.notNull(b) - dart.notNull(x);
          }
          b = (dart.notNull(b) / 2)[dartx.truncate]();
        }
        while (dart.test(v[dartx.isEven])) {
          v = (dart.notNull(v) / 2)[dartx.truncate]();
          if (dart.test(ac)) {
            if (!dart.test(c[dartx.isEven]) || !dart.test(d[dartx.isEven])) {
              c = dart.notNull(c) + dart.notNull(y);
              d = dart.notNull(d) - dart.notNull(x);
            }
            c = (dart.notNull(c) / 2)[dartx.truncate]();
          } else if (!dart.test(d[dartx.isEven])) {
            d = dart.notNull(d) - dart.notNull(x);
          }
          d = (dart.notNull(d) / 2)[dartx.truncate]();
        }
        if (dart.notNull(u) >= dart.notNull(v)) {
          u = dart.notNull(u) - dart.notNull(v);
          if (dart.test(ac)) {
            a = dart.notNull(a) - dart.notNull(c);
          }
          b = dart.notNull(b) - dart.notNull(d);
        } else {
          v = dart.notNull(v) - dart.notNull(u);
          if (dart.test(ac)) {
            c = dart.notNull(c) - dart.notNull(a);
          }
          d = dart.notNull(d) - dart.notNull(b);
        }
      } while (u != 0);
      if (!dart.test(inv)) return s * dart.notNull(v);
      if (v != 1) dart.throw(core.Exception.new("Not coprime"));
      if (dart.notNull(d) < 0) {
        d = dart.notNull(d) + dart.notNull(x);
        if (dart.notNull(d) < 0) {
          d = dart.notNull(d) + dart.notNull(x);
        }
      } else if (dart.notNull(d) > dart.notNull(x)) {
        d = dart.notNull(d) - dart.notNull(x);
        if (dart.notNull(d) > dart.notNull(x)) {
          d = dart.notNull(d) - dart.notNull(x);
        }
      }
      return d;
    }
    [dartx.modInverse](m) {
      if (!(typeof m == 'number')) {
        dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
      }
      if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
      if (m == 1) return 0;
      let t = this;
      if (dart.notNull(t) < 0 || dart.notNull(t) >= dart.notNull(m)) {
        t = t[dartx['%']](m);
      }
      if (t == 1) return 1;
      if (t == 0 || dart.test(t[dartx.isEven]) && dart.test(m[dartx.isEven])) {
        dart.throw(core.Exception.new("Not coprime"));
      }
      return _interceptors.JSNumber._binaryGcd(m, t, true);
    }
    [dartx.gcd](other) {
      if (!(typeof other == 'number')) {
        dart.throw(new core.ArgumentError.value(other, "other", "not an integer"));
      }
      let x = this[dartx.abs]();
      let y = other[dartx.abs]();
      if (x == 0) return y;
      if (y == 0) return x;
      if (x == 1 || y == 1) return 1;
      return _interceptors.JSNumber._binaryGcd(x, y, false);
    }
    static _bitCount(i) {
      i = dart.notNull(_interceptors.JSNumber._shru(i, 0)) - (dart.notNull(_interceptors.JSNumber._shru(i, 1)) & 1431655765);
      i = (dart.notNull(i) & 858993459) + (dart.notNull(_interceptors.JSNumber._shru(i, 2)) & 858993459);
      i = 252645135 & dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 4));
      i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 8));
      i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 16));
      return dart.notNull(i) & 63;
    }
    static _shru(value, shift) {
      return value >>> shift;
    }
    static _shrs(value, shift) {
      return value >> shift;
    }
    static _ors(a, b) {
      return a | b;
    }
    static _spread(i) {
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 1));
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 2));
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 4));
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 8));
      i = _interceptors.JSNumber._shru(_interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 16)), 0);
      return i;
    }
    [dartx['~']]() {
      return ~this >>> 0;
    }
  };
  _interceptors.JSNumber[dart.implements] = () => [core.int, core.double];
  dart.setSignature(_interceptors.JSNumber, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSNumber, [])}),
    getters: () => ({
      [dartx.isNegative]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNaN]: dart.definiteFunctionType(core.bool, []),
      [dartx.isInfinite]: dart.definiteFunctionType(core.bool, []),
      [dartx.isFinite]: dart.definiteFunctionType(core.bool, []),
      [dartx.sign]: dart.definiteFunctionType(_interceptors.JSNumber, []),
      [dartx.isEven]: dart.definiteFunctionType(core.bool, []),
      [dartx.isOdd]: dart.definiteFunctionType(core.bool, []),
      [dartx.bitLength]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx.remainder]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx.abs]: dart.definiteFunctionType(_interceptors.JSNumber, []),
      [dartx.toInt]: dart.definiteFunctionType(core.int, []),
      [dartx.truncate]: dart.definiteFunctionType(core.int, []),
      [dartx.ceil]: dart.definiteFunctionType(core.int, []),
      [dartx.floor]: dart.definiteFunctionType(core.int, []),
      [dartx.round]: dart.definiteFunctionType(core.int, []),
      [dartx.ceilToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.floorToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.roundToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.truncateToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.clamp]: dart.definiteFunctionType(core.num, [core.num, core.num]),
      [dartx.toDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.toStringAsFixed]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.toStringAsExponential]: dart.definiteFunctionType(core.String, [], [core.int]),
      [dartx.toStringAsPrecision]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.toRadixString]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx._negate]: dart.definiteFunctionType(_interceptors.JSNumber, []),
      [dartx['+']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx['-']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx['/']]: dart.definiteFunctionType(core.double, [core.num]),
      [dartx['*']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx['%']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [_isInt32]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [dartx['~/']]: dart.definiteFunctionType(core.int, [core.num]),
      [_tdivSlow]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['<<']]: dart.definiteFunctionType(core.int, [core.num]),
      [_shlPositive]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['>>']]: dart.definiteFunctionType(core.int, [core.num]),
      [_shrOtherPositive]: dart.definiteFunctionType(core.int, [core.num]),
      [_shrBothPositive]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['&']]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['|']]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['^']]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['<']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx['>']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx['<=']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx['>=']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx.toUnsigned]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.toSigned]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.modPow]: dart.definiteFunctionType(core.int, [core.int, core.int]),
      [dartx.modInverse]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.gcd]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx['~']]: dart.definiteFunctionType(core.int, [])
    }),
    sfields: () => ({
      _MIN_INT32: core.int,
      _MAX_INT32: core.int
    }),
    statics: () => ({
      _handleIEtoString: dart.definiteFunctionType(core.String, [core.String]),
      _binaryGcd: dart.definiteFunctionType(core.int, [core.int, core.int, core.bool]),
      _bitCount: dart.definiteFunctionType(core.int, [core.int]),
      _shru: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _shrs: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _ors: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _spread: dart.definiteFunctionType(core.int, [core.int])
    }),
    names: ['_handleIEtoString', '_binaryGcd', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
  });
  _interceptors.JSNumber._MIN_INT32 = -2147483648;
  _interceptors.JSNumber._MAX_INT32 = 2147483647;
  dart.registerExtension(dart.global.Number, _interceptors.JSNumber);
  const _defaultSplit = Symbol('_defaultSplit');
  let const$;
  dart.defineExtensionNames([
    'codeUnitAt',
    'allMatches',
    'matchAsPrefix',
    '+',
    'endsWith',
    'replaceAll',
    'replaceAllMapped',
    'splitMapJoin',
    'replaceFirst',
    'replaceFirstMapped',
    'split',
    'replaceRange',
    'startsWith',
    'substring',
    'toLowerCase',
    'toUpperCase',
    'trim',
    'trimLeft',
    'trimRight',
    '*',
    'padLeft',
    'padRight',
    'codeUnits',
    'runes',
    'indexOf',
    'lastIndexOf',
    'contains',
    'isEmpty',
    'isNotEmpty',
    'compareTo',
    'toString',
    'hashCode',
    'runtimeType',
    'length',
    '_get'
  ]);
  _interceptors.JSString = class JSString extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    [dartx.codeUnitAt](index) {
      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) >= dart.notNull(this[dartx.length])) dart.throw(_js_helper.diagnoseIndexError(this, index));
      return this.charCodeAt(index);
    }
    [dartx.allMatches](string, start) {
      if (start === void 0) start = 0;
      _js_helper.checkString(string);
      _js_helper.checkInt(start);
      if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      return _js_helper.allMatchesInStringUnchecked(this, string, start);
    }
    [dartx.matchAsPrefix](string, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      if (dart.notNull(start) + dart.notNull(this[dartx.length]) > dart.notNull(string[dartx.length])) return null;
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        if (string[dartx.codeUnitAt](dart.notNull(start) + i) != this[dartx.codeUnitAt](i)) {
          return null;
        }
      }
      return new _js_helper.StringMatch(start, string, this);
    }
    [dartx['+']](other) {
      if (!(typeof other == 'string')) dart.throw(new core.ArgumentError.value(other));
      return this + other;
    }
    [dartx.endsWith](other) {
      _js_helper.checkString(other);
      let otherLength = other[dartx.length];
      if (dart.notNull(otherLength) > dart.notNull(this[dartx.length])) return false;
      return other == this[dartx.substring](dart.notNull(this[dartx.length]) - dart.notNull(otherLength));
    }
    [dartx.replaceAll](from, to) {
      _js_helper.checkString(to);
      return _js_helper.stringReplaceAllUnchecked(this, from, to);
    }
    [dartx.replaceAllMapped](from, convert) {
      return this[dartx.splitMapJoin](from, {onMatch: convert});
    }
    [dartx.splitMapJoin](from, opts) {
      let onMatch = opts && 'onMatch' in opts ? opts.onMatch : null;
      let onNonMatch = opts && 'onNonMatch' in opts ? opts.onNonMatch : null;
      return _js_helper.stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
    }
    [dartx.replaceFirst](from, to, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      _js_helper.checkString(to);
      _js_helper.checkInt(startIndex);
      core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
      return _js_helper.stringReplaceFirstUnchecked(this, from, to, startIndex);
    }
    [dartx.replaceFirstMapped](from, replace, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      _js_helper.checkNull(replace);
      _js_helper.checkInt(startIndex);
      core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
      return _js_helper.stringReplaceFirstMappedUnchecked(this, from, replace, startIndex);
    }
    [dartx.split](pattern) {
      _js_helper.checkNull(pattern);
      if (typeof pattern == 'string') {
        return this.split(pattern);
      } else if (_js_helper.JSSyntaxRegExp.is(pattern) && _js_helper.regExpCaptureCount(pattern) == 0) {
        let re = _js_helper.regExpGetNative(pattern);
        return this.split(re);
      } else {
        return this[_defaultSplit](pattern);
      }
    }
    [dartx.replaceRange](start, end, replacement) {
      _js_helper.checkString(replacement);
      _js_helper.checkInt(start);
      end = core.RangeError.checkValidRange(start, end, this[dartx.length]);
      _js_helper.checkInt(end);
      return _js_helper.stringReplaceRangeUnchecked(this, start, end, replacement);
    }
    [_defaultSplit](pattern) {
      let result = JSArrayOfString().of([]);
      let start = 0;
      let length = 1;
      for (let match of pattern[dartx.allMatches](this)) {
        let matchStart = match.start;
        let matchEnd = match.end;
        length = dart.notNull(matchEnd) - dart.notNull(matchStart);
        if (length == 0 && start == matchStart) {
          continue;
        }
        let end = matchStart;
        result[dartx.add](this[dartx.substring](start, end));
        start = matchEnd;
      }
      if (dart.notNull(start) < dart.notNull(this[dartx.length]) || length > 0) {
        result[dartx.add](this[dartx.substring](start));
      }
      return result;
    }
    [dartx.startsWith](pattern, index) {
      if (index === void 0) index = 0;
      _js_helper.checkInt(index);
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(index, 0, this[dartx.length]));
      }
      if (typeof pattern == 'string') {
        let other = pattern;
        let otherLength = other[dartx.length];
        let endIndex = dart.notNull(index) + dart.notNull(otherLength);
        if (endIndex > dart.notNull(this[dartx.length])) return false;
        return other == this.substring(index, endIndex);
      }
      return pattern[dartx.matchAsPrefix](this, index) != null;
    }
    [dartx.substring](startIndex, endIndex) {
      if (endIndex === void 0) endIndex = null;
      _js_helper.checkInt(startIndex);
      if (endIndex == null) endIndex = this[dartx.length];
      _js_helper.checkInt(endIndex);
      if (dart.notNull(startIndex) < 0) dart.throw(new core.RangeError.value(startIndex));
      if (dart.notNull(startIndex) > dart.notNull(endIndex)) dart.throw(new core.RangeError.value(startIndex));
      if (dart.notNull(endIndex) > dart.notNull(this[dartx.length])) dart.throw(new core.RangeError.value(endIndex));
      return this.substring(startIndex, endIndex);
    }
    [dartx.toLowerCase]() {
      return this.toLowerCase();
    }
    [dartx.toUpperCase]() {
      return this.toUpperCase();
    }
    static _isWhitespace(codeUnit) {
      if (dart.notNull(codeUnit) < 256) {
        switch (codeUnit) {
          case 9:
          case 10:
          case 11:
          case 12:
          case 13:
          case 32:
          case 133:
          case 160:
          {
            return true;
          }
          default:
          {
            return false;
          }
        }
      }
      switch (codeUnit) {
        case 5760:
        case 6158:
        case 8192:
        case 8193:
        case 8194:
        case 8195:
        case 8196:
        case 8197:
        case 8198:
        case 8199:
        case 8200:
        case 8201:
        case 8202:
        case 8232:
        case 8233:
        case 8239:
        case 8287:
        case 12288:
        case 65279:
        {
          return true;
        }
        default:
        {
          return false;
        }
      }
    }
    static _skipLeadingWhitespace(string, index) {
      let SPACE = 32;
      let CARRIAGE_RETURN = 13;
      while (dart.notNull(index) < dart.notNull(string[dartx.length])) {
        let codeUnit = string[dartx.codeUnitAt](index);
        if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
          break;
        }
        index = dart.notNull(index) + 1;
      }
      return index;
    }
    static _skipTrailingWhitespace(string, index) {
      let SPACE = 32;
      let CARRIAGE_RETURN = 13;
      while (dart.notNull(index) > 0) {
        let codeUnit = string[dartx.codeUnitAt](dart.notNull(index) - 1);
        if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
          break;
        }
        index = dart.notNull(index) - 1;
      }
      return index;
    }
    [dartx.trim]() {
      let NEL = 133;
      let result = this.trim();
      if (result[dartx.length] == 0) return result;
      let firstCode = result[dartx.codeUnitAt](0);
      let startIndex = 0;
      if (firstCode == NEL) {
        startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
        if (startIndex == result[dartx.length]) return "";
      }
      let endIndex = result[dartx.length];
      let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
      if (lastCode == NEL) {
        endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
      }
      if (startIndex == 0 && endIndex == result[dartx.length]) return result;
      return result.substring(startIndex, endIndex);
    }
    [dartx.trimLeft]() {
      let NEL = 133;
      let result = null;
      let startIndex = 0;
      if (typeof this.trimLeft != "undefined") {
        result = this.trimLeft();
        if (result[dartx.length] == 0) return result;
        let firstCode = result[dartx.codeUnitAt](0);
        if (firstCode == NEL) {
          startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
        }
      } else {
        result = this;
        startIndex = _interceptors.JSString._skipLeadingWhitespace(this, 0);
      }
      if (startIndex == 0) return result;
      if (startIndex == result[dartx.length]) return "";
      return result.substring(startIndex);
    }
    [dartx.trimRight]() {
      let NEL = 133;
      let result = null;
      let endIndex = null;
      if (typeof this.trimRight != "undefined") {
        result = this.trimRight();
        endIndex = result[dartx.length];
        if (endIndex == 0) return result;
        let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
        if (lastCode == NEL) {
          endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
        }
      } else {
        result = this;
        endIndex = _interceptors.JSString._skipTrailingWhitespace(this, this[dartx.length]);
      }
      if (endIndex == result[dartx.length]) return result;
      if (endIndex == 0) return "";
      return result.substring(0, endIndex);
    }
    [dartx['*']](times) {
      if (0 >= dart.notNull(times)) return '';
      if (times == 1 || this[dartx.length] == 0) return this;
      if (times != times >>> 0) {
        dart.throw(const$ || (const$ = dart.const(new core.OutOfMemoryError())));
      }
      let result = '';
      let s = this;
      while (true) {
        if ((dart.notNull(times) & 1) == 1) result = s + result;
        times = times >>> 1;
        if (times == 0) break;
        s = s + s;
      }
      return result;
    }
    [dartx.padLeft](width, padding) {
      if (padding === void 0) padding = ' ';
      let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
      if (delta <= 0) return this;
      return padding[dartx['*']](delta) + this;
    }
    [dartx.padRight](width, padding) {
      if (padding === void 0) padding = ' ';
      let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
      if (delta <= 0) return this;
      return this[dartx['+']](padding[dartx['*']](delta));
    }
    get [dartx.codeUnits]() {
      return new _internal.CodeUnits(this);
    }
    get [dartx.runes]() {
      return new core.Runes(this);
    }
    [dartx.indexOf](pattern, start) {
      if (start === void 0) start = 0;
      _js_helper.checkNull(pattern);
      if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
      }
      if (typeof pattern == 'string') {
        return _js_helper.stringIndexOfStringUnchecked(this, pattern, start);
      }
      if (_js_helper.JSSyntaxRegExp.is(pattern)) {
        let re = pattern;
        let match = _js_helper.firstMatchAfter(re, this, start);
        return match == null ? -1 : match.start;
      }
      for (let i = start; dart.notNull(i) <= dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
        if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
      }
      return -1;
    }
    [dartx.lastIndexOf](pattern, start) {
      if (start === void 0) start = null;
      _js_helper.checkNull(pattern);
      if (start == null) {
        start = this[dartx.length];
      } else if (!(typeof start == 'number')) {
        dart.throw(_js_helper.argumentErrorValue(start));
      } else if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
      }
      if (typeof pattern == 'string') {
        let other = pattern;
        if (dart.notNull(start) + dart.notNull(other[dartx.length]) > dart.notNull(this[dartx.length])) {
          start = dart.notNull(this[dartx.length]) - dart.notNull(other[dartx.length]);
        }
        return core.int._check(_js_helper.stringLastIndexOfUnchecked(this, other, start));
      }
      for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
      }
      return -1;
    }
    [dartx.contains](other, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      _js_helper.checkNull(other);
      if (dart.notNull(startIndex) < 0 || dart.notNull(startIndex) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(startIndex, 0, this[dartx.length]));
      }
      return _js_helper.stringContainsUnchecked(this, other, startIndex);
    }
    get [dartx.isEmpty]() {
      return this[dartx.length] == 0;
    }
    get [dartx.isNotEmpty]() {
      return !dart.test(this[dartx.isEmpty]);
    }
    [dartx.compareTo](other) {
      if (!(typeof other == 'string')) dart.throw(_js_helper.argumentErrorValue(other));
      return dart.equals(this, other) ? 0 : this < other ? -1 : 1;
    }
    [dartx.toString]() {
      return this;
    }
    get [dartx.hashCode]() {
      let hash = 0;
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        hash = 536870911 & hash + this.charCodeAt(i);
        hash = 536870911 & hash + ((524287 & hash) << 10);
        hash = hash ^ hash >> 6;
      }
      hash = 536870911 & hash + ((67108863 & hash) << 3);
      hash = hash ^ hash >> 11;
      return 536870911 & hash + ((16383 & hash) << 15);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(core.String);
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
      return this[index];
    }
  };
  _interceptors.JSString[dart.implements] = () => [core.String, JSIndexableOfString()];
  dart.setSignature(_interceptors.JSString, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSString, [])}),
    getters: () => ({
      [dartx.codeUnits]: dart.definiteFunctionType(core.List$(core.int), []),
      [dartx.runes]: dart.definiteFunctionType(core.Runes, []),
      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.length]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [dartx.codeUnitAt]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.allMatches]: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
      [dartx.matchAsPrefix]: dart.definiteFunctionType(core.Match, [core.String], [core.int]),
      [dartx['+']]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.endsWith]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.replaceAll]: dart.definiteFunctionType(core.String, [core.Pattern, core.String]),
      [dartx.replaceAllMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()]),
      [dartx.splitMapJoin]: dart.definiteFunctionType(core.String, [core.Pattern], {onMatch: MatchToString(), onNonMatch: StringToString()}),
      [dartx.replaceFirst]: dart.definiteFunctionType(core.String, [core.Pattern, core.String], [core.int]),
      [dartx.replaceFirstMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()], [core.int]),
      [dartx.split]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
      [dartx.replaceRange]: dart.definiteFunctionType(core.String, [core.int, core.int, core.String]),
      [_defaultSplit]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
      [dartx.startsWith]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
      [dartx.substring]: dart.definiteFunctionType(core.String, [core.int], [core.int]),
      [dartx.toLowerCase]: dart.definiteFunctionType(core.String, []),
      [dartx.toUpperCase]: dart.definiteFunctionType(core.String, []),
      [dartx.trim]: dart.definiteFunctionType(core.String, []),
      [dartx.trimLeft]: dart.definiteFunctionType(core.String, []),
      [dartx.trimRight]: dart.definiteFunctionType(core.String, []),
      [dartx['*']]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.padLeft]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
      [dartx.padRight]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
      [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
      [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
      [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.String]),
      [dartx._get]: dart.definiteFunctionType(core.String, [core.int])
    }),
    statics: () => ({
      _isWhitespace: dart.definiteFunctionType(core.bool, [core.int]),
      _skipLeadingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int]),
      _skipTrailingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int])
    }),
    names: ['_isWhitespace', '_skipLeadingWhitespace', '_skipTrailingWhitespace']
  });
  dart.registerExtension(dart.global.String, _interceptors.JSString);
  core.num = class num extends core.Object {
    static parse(input, onError) {
      if (onError === void 0) onError = null;
      let source = input[dartx.trim]();
      let result = core.int.parse(source, {onError: core.num._returnIntNull});
      if (result != null) return result;
      result = core.double.parse(source, core.num._returnDoubleNull);
      if (result != null) return result;
      if (onError == null) dart.throw(new core.FormatException(input));
      return onError(input);
    }
    static _returnIntNull(_) {
      return null;
    }
    static _returnDoubleNull(_) {
      return null;
    }
  };
  core.num.is = function is_num(o) {
    return typeof o == "number";
  };
  core.num.as = function as_num(o) {
    if (typeof o == "number" || o == null) return o;
    return dart.as(o, core.num);
  };
  core.num._check = function check_num(o) {
    if (typeof o == "number" || o == null) return o;
    return dart.check(o, core.num);
  };
  core.num[dart.implements] = () => [ComparableOfnum()];
  dart.setSignature(core.num, {
    statics: () => ({
      parse: dart.definiteFunctionType(core.num, [core.String], [StringTonum()]),
      _returnIntNull: dart.definiteFunctionType(core.int, [core.String]),
      _returnDoubleNull: dart.definiteFunctionType(core.double, [core.String])
    }),
    names: ['parse', '_returnIntNull', '_returnDoubleNull']
  });
  core.double = class double extends core.num {
    static parse(source, onError) {
      if (onError === void 0) onError = null;
      return _js_helper.Primitives.parseDouble(source, onError);
    }
  };
  dart.setSignature(core.double, {
    sfields: () => ({
      NAN: core.double,
      INFINITY: core.double,
      NEGATIVE_INFINITY: core.double,
      MIN_POSITIVE: core.double,
      MAX_FINITE: core.double
    }),
    statics: () => ({parse: dart.definiteFunctionType(core.double, [core.String], [StringTodouble()])}),
    names: ['parse']
  });
  core.double.NAN = 0.0 / 0.0;
  core.double.INFINITY = 1.0 / 0.0;
  core.double.MIN_POSITIVE = 5e-324;
  core.double.MAX_FINITE = 1.7976931348623157e+308;
  dart.defineLazy(core.double, {
    get NEGATIVE_INFINITY() {
      return -core.double.INFINITY;
    }
  });
  _internal.POWERS_OF_TEN = dart.constList([1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0, 1e+21, 1e+22], core.double);
  const _string = Symbol('_string');
  const _filter = Symbol('_filter');
  collection.ListMixin$ = dart.generic(E => {
    let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
    let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    dart.defineExtensionNames([
      'iterator',
      'elementAt',
      'forEach',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'expand',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'add',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeLast',
      'sort',
      'shuffle',
      'asMap',
      'sublist',
      'getRange',
      'removeRange',
      'fillRange',
      'setRange',
      'replaceRange',
      'indexOf',
      'lastIndexOf',
      'insert',
      'removeAt',
      'insertAll',
      'setAll',
      'reversed',
      'toString'
    ]);
    class ListMixin extends core.Object {
      get iterator() {
        return new (ListIteratorOfE())(this);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
      elementAt(index) {
        return this[dartx._get](index);
      }
      forEach(action) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          action(this[dartx._get](i));
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      get isEmpty() {
        return this[dartx.length] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this[dartx.isEmpty]);
      }
      get first() {
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[dartx._get](0);
      }
      get last() {
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
      }
      get single() {
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this[dartx.length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this[dartx._get](0);
      }
      contains(element) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), element)) return true;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      every(test) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          if (!dart.test(test(this[dartx._get](i)))) return false;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return true;
      }
      any(test) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          if (dart.test(test(this[dartx._get](i)))) return true;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[dartx._get](i);
          if (dart.test(test(element))) return element;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this[dartx.length];
        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
          let element = this[dartx._get](i);
          if (dart.test(test(element))) return element;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let length = this[dartx.length];
        let match = null;
        let matchFound = false;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[dartx._get](i);
          if (dart.test(test(element))) {
            if (matchFound) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            matchFound = true;
            match = element;
          }
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (matchFound) return match;
        dart.throw(_internal.IterableElementError.noElement());
      }
      join(separator) {
        if (separator === void 0) separator = "";
        if (this[dartx.length] == 0) return "";
        let buffer = new core.StringBuffer();
        buffer.writeAll(this, separator);
        return buffer.toString();
      }
      where(test) {
        return new (WhereIterableOfE())(this, test);
      }
      map(T) {
        return f => {
          return new (_internal.MappedListIterable$(E, T))(this, f);
        };
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let length = this[dartx.length];
        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
        let value = this[dartx._get](0);
        for (let i = 1; i < dart.notNull(length); i++) {
          value = combine(value, this[dartx._get](i));
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          let length = this[dartx.length];
          for (let i = 0; i < dart.notNull(length); i++) {
            value = combine(value, this[dartx._get](i));
            if (length != this[dartx.length]) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return value;
        };
      }
      skip(count) {
        return new (SubListIterableOfE())(this, count, null);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      take(count) {
        return new (SubListIterableOfE())(this, 0, count);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = null;
        if (dart.test(growable)) {
          result = ListOfE().new();
          result[dartx.length] = this[dartx.length];
        } else {
          result = ListOfE().new(this[dartx.length]);
        }
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          result[dartx._set](i, this[dartx._get](i));
        }
        return result;
      }
      toSet() {
        let result = SetOfE().new();
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          result.add(this[dartx._get](i));
        }
        return result;
      }
      add(element) {
        E._check(element);
        this[dartx._set]((() => {
          let x = this[dartx.length];
          this[dartx.length] = dart.notNull(x) + 1;
          return x;
        })(), element);
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        let i = this[dartx.length];
        for (let element of iterable) {
          dart.assert(this[dartx.length] == i || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
          this[dartx.length] = dart.notNull(i) + 1;
          this[dartx._set](i, element);
          i = dart.notNull(i) + 1;
        }
      }
      remove(element) {
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), element)) {
            this[dartx.setRange](i, dart.notNull(this[dartx.length]) - 1, this, i + 1);
            this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
            return true;
          }
        }
        return false;
      }
      removeWhere(test) {
        this[_filter](test, false);
      }
      retainWhere(test) {
        this[_filter](test, true);
      }
      [_filter](test, retainMatching) {
        let source = this;
        let retained = JSArrayOfE().of([]);
        let length = source[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = source[dartx._get](i);
          if (dart.dcall(test, element) == retainMatching) {
            retained[dartx.add](element);
          }
          if (length != source[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(source));
          }
        }
        if (retained[dartx.length] != source[dartx.length]) {
          source[dartx.setRange](0, retained[dartx.length], retained);
          source[dartx.length] = retained[dartx.length];
        }
      }
      clear() {
        this[dartx.length] = 0;
      }
      removeLast() {
        if (this[dartx.length] == 0) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = this[dartx._get](dart.notNull(this[dartx.length]) - 1);
        this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
        return result;
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        if (compare == null) {
          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
        } else {
          _internal.Sort.sort(E)(this, compare);
        }
      }
      shuffle(random) {
        if (random === void 0) random = null;
        if (random == null) random = math.Random.new();
        let length = this[dartx.length];
        while (dart.notNull(length) > 1) {
          let pos = random.nextInt(length);
          length = dart.notNull(length) - 1;
          let tmp = this[dartx._get](length);
          this[dartx._set](length, this[dartx._get](pos));
          this[dartx._set](pos, tmp);
        }
      }
      asMap() {
        return new (ListMapViewOfE())(this);
      }
      sublist(start, end) {
        if (end === void 0) end = null;
        let listLength = this[dartx.length];
        if (end == null) end = listLength;
        core.RangeError.checkValidRange(start, end, listLength);
        let length = dart.notNull(end) - dart.notNull(start);
        let result = ListOfE().new();
        result[dartx.length] = length;
        for (let i = 0; i < length; i++) {
          result[dartx._set](i, this[dartx._get](dart.notNull(start) + i));
        }
        return result;
      }
      getRange(start, end) {
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        return new (SubListIterableOfE())(this, start, end);
      }
      removeRange(start, end) {
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let length = dart.notNull(end) - dart.notNull(start);
        this[dartx.setRange](start, dart.notNull(this[dartx.length]) - length, this, end);
        this[dartx.length] = dart.notNull(this[dartx.length]) - length;
      }
      fillRange(start, end, fill) {
        if (fill === void 0) fill = null;
        E._check(fill);
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[dartx._set](i, fill);
        }
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let length = dart.notNull(end) - dart.notNull(start);
        if (length == 0) return;
        core.RangeError.checkNotNegative(skipCount, "skipCount");
        let otherList = null;
        let otherStart = null;
        if (ListOfE().is(iterable)) {
          otherList = iterable;
          otherStart = skipCount;
        } else {
          otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
          otherStart = 0;
        }
        if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
          dart.throw(_internal.IterableElementError.tooFew());
        }
        if (dart.notNull(otherStart) < dart.notNull(start)) {
          for (let i = length - 1; i >= 0; i--) {
            this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
          }
        } else {
          for (let i = 0; i < length; i++) {
            this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
          }
        }
      }
      replaceRange(start, end, newContents) {
        IterableOfE()._check(newContents);
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        if (!_internal.EfficientLength.is(newContents)) {
          newContents = newContents[dartx.toList]();
        }
        let removeLength = dart.notNull(end) - dart.notNull(start);
        let insertLength = newContents[dartx.length];
        if (removeLength >= dart.notNull(insertLength)) {
          let delta = removeLength - dart.notNull(insertLength);
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          let newLength = dart.notNull(this[dartx.length]) - delta;
          this[dartx.setRange](start, insertEnd, newContents);
          if (delta != 0) {
            this[dartx.setRange](insertEnd, newLength, this, end);
            this[dartx.length] = newLength;
          }
        } else {
          let delta = dart.notNull(insertLength) - removeLength;
          let newLength = dart.notNull(this[dartx.length]) + delta;
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          this[dartx.length] = newLength;
          this[dartx.setRange](insertEnd, newLength, this, end);
          this[dartx.setRange](start, insertEnd, newContents);
        }
      }
      indexOf(element, startIndex) {
        if (startIndex === void 0) startIndex = 0;
        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
          return -1;
        }
        if (dart.notNull(startIndex) < 0) {
          startIndex = 0;
        }
        for (let i = startIndex; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      lastIndexOf(element, startIndex) {
        if (startIndex === void 0) startIndex = null;
        if (startIndex == null) {
          startIndex = dart.notNull(this[dartx.length]) - 1;
        } else {
          if (dart.notNull(startIndex) < 0) {
            return -1;
          }
          if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
            startIndex = dart.notNull(this[dartx.length]) - 1;
          }
        }
        for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      insert(index, element) {
        E._check(element);
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        if (index == this[dartx.length]) {
          this[dartx.add](element);
          return;
        }
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError(index));
        this[dartx.length] = dart.notNull(this[dartx.length]) + 1;
        this[dartx.setRange](dart.notNull(index) + 1, this[dartx.length], this, index);
        this[dartx._set](index, element);
      }
      removeAt(index) {
        let result = this[dartx._get](index);
        this[dartx.setRange](index, dart.notNull(this[dartx.length]) - 1, this, dart.notNull(index) + 1);
        this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
        return result;
      }
      insertAll(index, iterable) {
        IterableOfE()._check(iterable);
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
          iterable = iterable[dartx.toList]();
        }
        let insertionLength = iterable[dartx.length];
        this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
        if (iterable[dartx.length] != insertionLength) {
          this[dartx.length] = dart.notNull(this[dartx.length]) - dart.notNull(insertionLength);
          dart.throw(new core.ConcurrentModificationError(iterable));
        }
        this[dartx.setRange](dart.notNull(index) + dart.notNull(insertionLength), this[dartx.length], this, index);
        this[dartx.setAll](index, iterable);
      }
      setAll(index, iterable) {
        IterableOfE()._check(iterable);
        if (core.List.is(iterable)) {
          this[dartx.setRange](index, dart.notNull(index) + dart.notNull(iterable[dartx.length]), iterable);
        } else {
          for (let element of iterable) {
            this[dartx._set]((() => {
              let x = index;
              index = dart.notNull(x) + 1;
              return x;
            })(), element);
          }
        }
      }
      get reversed() {
        return new (ReversedListIterableOfE())(this);
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '[', ']');
      }
    }
    dart.addTypeTests(ListMixin);
    ListMixin[dart.implements] = () => [ListOfE()];
    dart.setSignature(ListMixin, {
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, []),
        reversed: dart.definiteFunctionType(core.Iterable$(E), [])
      }),
      methods: () => ({
        elementAt: dart.definiteFunctionType(E, [core.int]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), []),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        [_filter]: dart.definiteFunctionType(dart.void, [dynamicTobool(), core.bool]),
        clear: dart.definiteFunctionType(dart.void, []),
        removeLast: dart.definiteFunctionType(E, []),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
        asMap: dart.definiteFunctionType(core.Map$(core.int, E), []),
        sublist: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
        getRange: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        indexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        lastIndexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
      })
    });
    dart.defineExtensionMembers(ListMixin, [
      'elementAt',
      'forEach',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'expand',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'add',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeLast',
      'sort',
      'shuffle',
      'asMap',
      'sublist',
      'getRange',
      'removeRange',
      'fillRange',
      'setRange',
      'replaceRange',
      'indexOf',
      'lastIndexOf',
      'insert',
      'removeAt',
      'insertAll',
      'setAll',
      'toString',
      'iterator',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single',
      'reversed'
    ]);
    return ListMixin;
  });
  collection.ListMixin = ListMixin();
  collection.ListBase$ = dart.generic(E => {
    class ListBase extends dart.mixin(core.Object, collection.ListMixin$(E)) {
      static listToString(list) {
        return collection.IterableBase.iterableToFullString(list, '[', ']');
      }
    }
    dart.addTypeTests(ListBase);
    dart.setSignature(ListBase, {
      statics: () => ({listToString: dart.definiteFunctionType(core.String, [core.List])}),
      names: ['listToString']
    });
    return ListBase;
  });
  collection.ListBase = ListBase();
  _internal.UnmodifiableListMixin$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
    class UnmodifiableListMixin extends core.Object {
      _set(index, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
        return value;
      }
      set length(newLength) {
        dart.throw(new core.UnsupportedError("Cannot change the length of an unmodifiable list"));
      }
      setAll(at, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      add(value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      insert(index, element) {
        E._check(element);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      insertAll(at, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      remove(element) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      removeWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      retainWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      shuffle(random) {
        if (random === void 0) random = null;
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot clear an unmodifiable list"));
      }
      removeAt(index) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      removeLast() {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      removeRange(start, end) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      fillRange(start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
    }
    dart.addTypeTests(UnmodifiableListMixin);
    UnmodifiableListMixin[dart.implements] = () => [ListOfE()];
    dart.setSignature(UnmodifiableListMixin, {
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        add: dart.definiteFunctionType(dart.void, [E]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()]),
        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
        clear: dart.definiteFunctionType(dart.void, []),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
      })
    });
    dart.defineExtensionMembers(UnmodifiableListMixin, [
      '_set',
      'setAll',
      'add',
      'insert',
      'insertAll',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'sort',
      'shuffle',
      'clear',
      'removeAt',
      'removeLast',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange',
      'length'
    ]);
    return UnmodifiableListMixin;
  });
  _internal.UnmodifiableListMixin = UnmodifiableListMixin();
  _internal.UnmodifiableListBase$ = dart.generic(E => {
    class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), _internal.UnmodifiableListMixin$(E)) {
      new() {
        super.new();
      }
    }
    return UnmodifiableListBase;
  });
  _internal.UnmodifiableListBase = UnmodifiableListBase();
  core.int = class int extends core.num {
    static fromEnvironment(name, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
      dart.throw(new core.UnsupportedError('int.fromEnvironment can only be used as a const constructor'));
    }
    static parse(source, opts) {
      let radix = opts && 'radix' in opts ? opts.radix : null;
      let onError = opts && 'onError' in opts ? opts.onError : null;
      return _js_helper.Primitives.parseInt(source, radix, onError);
    }
  };
  core.int.is = function is_int(o) {
    return typeof o == "number" && Math.floor(o) == o;
  };
  core.int.as = function as_int(o) {
    if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
    return dart.as(o, core.int);
  };
  core.int._check = function check_int(o) {
    if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
    return dart.check(o, core.int);
  };
  dart.setSignature(core.int, {
    constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.int, [core.String], {defaultValue: core.int})}),
    statics: () => ({parse: dart.definiteFunctionType(core.int, [core.String], {radix: core.int, onError: StringToint()})}),
    names: ['parse']
  });
  _internal.CodeUnits = class CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
    new(string) {
      this[_string] = string;
    }
    get length() {
      return this[_string][dartx.length];
    }
    set length(value) {
      super.length = value;
    }
    _get(i) {
      return this[_string][dartx.codeUnitAt](i);
    }
    static stringOf(u) {
      return u[_string];
    }
  };
  dart.addSimpleTypeTests(_internal.CodeUnits);
  dart.setSignature(_internal.CodeUnits, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.CodeUnits, [core.String])}),
    fields: () => ({[_string]: core.String}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({_get: dart.definiteFunctionType(core.int, [core.int])}),
    statics: () => ({stringOf: dart.definiteFunctionType(core.String, [_internal.CodeUnits])}),
    names: ['stringOf']
  });
  dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
  _internal.EfficientLength = class EfficientLength extends core.Object {};
  core.Iterable$ = dart.generic(E => {
    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
    dart.defineExtensionNames([
      'map',
      'where',
      'expand',
      'contains',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'toList',
      'toSet',
      'length',
      'isEmpty',
      'isNotEmpty',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'first',
      'last',
      'single',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'toString'
    ]);
    class Iterable extends core.Object {
      new() {
      }
      static generate(count, generator) {
        if (generator === void 0) generator = null;
        if (dart.notNull(count) <= 0) return new (EmptyIterableOfE())();
        return new (_GeneratorIterableOfE())(count, generator);
      }
      static empty() {
        return new (EmptyIterableOfE())();
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
      map(T) {
        return f => {
          return _internal.MappedIterable$(E, T).new(this, f);
        };
      }
      where(test) {
        return new (WhereIterableOfE())(this, test);
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      contains(element) {
        for (let e of this) {
          if (dart.equals(e, element)) return true;
        }
        return false;
      }
      forEach(f) {
        for (let element of this)
          f(element);
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let iterator = this[dartx.iterator];
        if (!dart.test(iterator.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let value = iterator.current;
        while (dart.test(iterator.moveNext())) {
          value = combine(value, iterator.current);
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          for (let element of this)
            value = combine(value, element);
          return value;
        };
      }
      every(f) {
        for (let element of this) {
          if (!dart.test(f(element))) return false;
        }
        return true;
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let iterator = this[dartx.iterator];
        if (!dart.test(iterator.moveNext())) return "";
        let buffer = new core.StringBuffer();
        if (separator == null || separator == "") {
          do {
            buffer.write(dart.str`${iterator.current}`);
          } while (dart.test(iterator.moveNext()));
        } else {
          buffer.write(dart.str`${iterator.current}`);
          while (dart.test(iterator.moveNext())) {
            buffer.write(separator);
            buffer.write(dart.str`${iterator.current}`);
          }
        }
        return buffer.toString();
      }
      any(f) {
        for (let element of this) {
          if (dart.test(f(element))) return true;
        }
        return false;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        return ListOfE().from(this, {growable: growable});
      }
      toSet() {
        return SetOfE().from(this);
      }
      get length() {
        dart.assert(!_internal.EfficientLength.is(this));
        let count = 0;
        let it = this[dartx.iterator];
        while (dart.test(it.moveNext())) {
          count++;
        }
        return count;
      }
      get isEmpty() {
        return !dart.test(this[dartx.iterator].moveNext());
      }
      get isNotEmpty() {
        return !dart.test(this[dartx.isEmpty]);
      }
      take(count) {
        return TakeIterableOfE().new(this, count);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      skip(count) {
        return SkipIterableOfE().new(this, count);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      get first() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        return it.current;
      }
      get last() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = null;
        do {
          result = it.current;
        } while (dart.test(it.moveNext()));
        return result;
      }
      get single() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
        let result = it.current;
        if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
        return result;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        for (let element of this) {
          if (dart.test(test(element))) return element;
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            if (foundMatching) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
        core.RangeError.checkNotNegative(index, "index");
        let elementIndex = 0;
        for (let element of this) {
          if (index == elementIndex) return element;
          elementIndex++;
        }
        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
      }
      toString() {
        return collection.IterableBase.iterableToShortString(this, '(', ')');
      }
    }
    dart.addTypeTests(Iterable);
    dart.setSignature(Iterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.Iterable$(E), []),
        generate: dart.definiteFunctionType(core.Iterable$(E), [core.int], [intToE()]),
        empty: dart.definiteFunctionType(core.Iterable$(E), [])
      }),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), []),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        elementAt: dart.definiteFunctionType(E, [core.int])
      })
    });
    dart.defineExtensionMembers(Iterable, [
      'map',
      'where',
      'expand',
      'contains',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'toList',
      'toSet',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'toString',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single'
    ]);
    return Iterable;
  });
  core.Iterable = Iterable();
  _internal.ListIterable$ = dart.generic(E => {
    let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let dynamicAndEToE = () => (dynamicAndEToE = dart.constFn(dart.functionType(E, [dart.dynamic, E])))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class ListIterable extends core.Iterable$(E) {
      new() {
        super.new();
      }
      get iterator() {
        return new (ListIteratorOfE())(this);
      }
      forEach(action) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          action(this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      get isEmpty() {
        return this.length == 0;
      }
      get first() {
        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
        return this.elementAt(0);
      }
      get last() {
        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
        return this.elementAt(dart.notNull(this.length) - 1);
      }
      get single() {
        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this.elementAt(0);
      }
      contains(element) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          if (dart.equals(this.elementAt(i), element)) return true;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      every(test) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          if (!dart.test(test(this.elementAt(i)))) return false;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return true;
      }
      any(test) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          if (dart.test(test(this.elementAt(i)))) return true;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this.elementAt(i);
          if (dart.test(test(element))) return element;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this.length;
        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
          let element = this.elementAt(i);
          if (dart.test(test(element))) return element;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let length = this.length;
        let match = null;
        let matchFound = false;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this.elementAt(i);
          if (dart.test(test(element))) {
            if (matchFound) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            matchFound = true;
            match = element;
          }
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (matchFound) return match;
        dart.throw(_internal.IterableElementError.noElement());
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let length = this.length;
        if (!dart.test(separator[dartx.isEmpty])) {
          if (length == 0) return "";
          let first = dart.str`${this.elementAt(0)}`;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          let buffer = new core.StringBuffer(first);
          for (let i = 1; i < dart.notNull(length); i++) {
            buffer.write(separator);
            buffer.write(this.elementAt(i));
            if (length != this.length) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return buffer.toString();
        } else {
          let buffer = new core.StringBuffer();
          for (let i = 0; i < dart.notNull(length); i++) {
            buffer.write(this.elementAt(i));
            if (length != this.length) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return buffer.toString();
        }
      }
      where(test) {
        return super.where(test);
      }
      map(T) {
        return f => {
          return new (_internal.MappedListIterable$(E, T))(this, f);
        };
      }
      reduce(combine) {
        dynamicAndEToE()._check(combine);
        let length = this.length;
        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
        let value = this.elementAt(0);
        for (let i = 1; i < dart.notNull(length); i++) {
          value = dart.dcall(combine, value, this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          let length = this.length;
          for (let i = 0; i < dart.notNull(length); i++) {
            value = combine(value, this.elementAt(i));
            if (length != this.length) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return value;
        };
      }
      skip(count) {
        return new (SubListIterableOfE())(this, count, null);
      }
      skipWhile(test) {
        return super.skipWhile(test);
      }
      take(count) {
        return new (SubListIterableOfE())(this, 0, count);
      }
      takeWhile(test) {
        return super.takeWhile(test);
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = null;
        if (dart.test(growable)) {
          result = ListOfE().new();
          result[dartx.length] = this.length;
        } else {
          result = ListOfE().new(this.length);
        }
        for (let i = 0; i < dart.notNull(this.length); i++) {
          result[dartx._set](i, this.elementAt(i));
        }
        return result;
      }
      toSet() {
        let result = SetOfE().new();
        for (let i = 0; i < dart.notNull(this.length); i++) {
          result.add(this.elementAt(i));
        }
        return result;
      }
    }
    ListIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(ListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterable$(E), [])}),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        reduce: dart.definiteFunctionType(E, [dynamicAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(ListIterable, [
      'forEach',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'iterator',
      'isEmpty',
      'first',
      'last',
      'single'
    ]);
    return ListIterable;
  });
  _internal.ListIterable = ListIterable();
  const _iterable$ = Symbol('_iterable');
  const _start = Symbol('_start');
  const _endOrLength = Symbol('_endOrLength');
  const _endIndex = Symbol('_endIndex');
  const _startIndex = Symbol('_startIndex');
  _internal.SubListIterable$ = dart.generic(E => {
    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class SubListIterable extends _internal.ListIterable$(E) {
      new(iterable, start, endOrLength) {
        this[_iterable$] = iterable;
        this[_start] = start;
        this[_endOrLength] = endOrLength;
        super.new();
        core.RangeError.checkNotNegative(this[_start], "start");
        if (this[_endOrLength] != null) {
          core.RangeError.checkNotNegative(this[_endOrLength], "end");
          if (dart.notNull(this[_start]) > dart.notNull(this[_endOrLength])) {
            dart.throw(new core.RangeError.range(this[_start], 0, this[_endOrLength], "start"));
          }
        }
      }
      get [_endIndex]() {
        let length = this[_iterable$][dartx.length];
        if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
        return this[_endOrLength];
      }
      get [_startIndex]() {
        let length = this[_iterable$][dartx.length];
        if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
        return this[_start];
      }
      get length() {
        let length = this[_iterable$][dartx.length];
        if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
        if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
          return dart.notNull(length) - dart.notNull(this[_start]);
        }
        return dart.notNull(this[_endOrLength]) - dart.notNull(this[_start]);
      }
      elementAt(index) {
        let realIndex = dart.notNull(this[_startIndex]) + dart.notNull(index);
        if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
          dart.throw(core.RangeError.index(index, this, "index"));
        }
        return this[_iterable$][dartx.elementAt](realIndex);
      }
      skip(count) {
        core.RangeError.checkNotNegative(count, "count");
        let newStart = dart.notNull(this[_start]) + dart.notNull(count);
        if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
          return new (EmptyIterableOfE())();
        }
        return new (SubListIterableOfE())(this[_iterable$], newStart, this[_endOrLength]);
      }
      take(count) {
        core.RangeError.checkNotNegative(count, "count");
        if (this[_endOrLength] == null) {
          return new (SubListIterableOfE())(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
        } else {
          let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
          if (dart.notNull(this[_endOrLength]) < newEnd) return this;
          return new (SubListIterableOfE())(this[_iterable$], this[_start], newEnd);
        }
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let start = this[_start];
        let end = this[_iterable$][dartx.length];
        if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
        let length = dart.notNull(end) - dart.notNull(start);
        if (length < 0) length = 0;
        let result = dart.test(growable) ? (() => {
          let _ = ListOfE().new();
          _[dartx.length] = length;
          return _;
        })() : ListOfE().new(length);
        for (let i = 0; i < length; i++) {
          result[dartx._set](i, this[_iterable$][dartx.elementAt](dart.notNull(start) + i));
          if (dart.notNull(this[_iterable$][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
        }
        return result;
      }
    }
    dart.setSignature(SubListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SubListIterable$(E), [IterableOfE(), core.int, core.int])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_start]: core.int,
        [_endOrLength]: core.int
      }),
      getters: () => ({
        [_endIndex]: dart.definiteFunctionType(core.int, []),
        [_startIndex]: dart.definiteFunctionType(core.int, [])
      }),
      methods: () => ({
        elementAt: dart.definiteFunctionType(E, [core.int]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool})
      })
    });
    dart.defineExtensionMembers(SubListIterable, [
      'elementAt',
      'skip',
      'take',
      'toList',
      'length'
    ]);
    return SubListIterable;
  });
  _internal.SubListIterable = SubListIterable();
  const _length$ = Symbol('_length');
  const _index$ = Symbol('_index');
  const _current$ = Symbol('_current');
  _internal.ListIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class ListIterator extends core.Object {
      new(iterable) {
        this[_iterable$] = iterable;
        this[_length$] = iterable[dartx.length];
        this[_index$] = 0;
        this[_current$] = null;
      }
      get current() {
        return this[_current$];
      }
      moveNext() {
        let length = this[_iterable$][dartx.length];
        if (this[_length$] != length) {
          dart.throw(new core.ConcurrentModificationError(this[_iterable$]));
        }
        if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
          this[_current$] = null;
          return false;
        }
        this[_current$] = this[_iterable$][dartx.elementAt](this[_index$]);
        this[_index$] = dart.notNull(this[_index$]) + 1;
        return true;
      }
    }
    dart.addTypeTests(ListIterator);
    ListIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(ListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterator$(E), [IterableOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_length$]: core.int,
        [_index$]: core.int,
        [_current$]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return ListIterator;
  });
  _internal.ListIterator = ListIterator();
  _internal._Transformation$ = dart.generic((S, T) => {
    const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
    return _Transformation;
  });
  _internal._Transformation = _Transformation();
  const _f = Symbol('_f');
  _internal.MappedIterable$ = dart.generic((S, T) => {
    let EfficientLengthMappedIterableOfS$T = () => (EfficientLengthMappedIterableOfS$T = dart.constFn(_internal.EfficientLengthMappedIterable$(S, T)))();
    let MappedIterableOfS$T = () => (MappedIterableOfS$T = dart.constFn(_internal.MappedIterable$(S, T)))();
    let MappedIteratorOfS$T = () => (MappedIteratorOfS$T = dart.constFn(_internal.MappedIterator$(S, T)))();
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
    class MappedIterable extends core.Iterable$(T) {
      static new(iterable, func) {
        if (_internal.EfficientLength.is(iterable)) {
          return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
        }
        return new (MappedIterableOfS$T())._(iterable, func);
      }
      _(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (MappedIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
      }
      get length() {
        return this[_iterable$][dartx.length];
      }
      get isEmpty() {
        return this[_iterable$][dartx.isEmpty];
      }
      get first() {
        return this[_f](this[_iterable$][dartx.first]);
      }
      get last() {
        return this[_f](this[_iterable$][dartx.last]);
      }
      get single() {
        return this[_f](this[_iterable$][dartx.single]);
      }
      elementAt(index) {
        return this[_f](this[_iterable$][dartx.elementAt](index));
      }
    }
    dart.defineNamedConstructor(MappedIterable, '_');
    dart.setSignature(MappedIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()]),
        _: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])
      }),
      fields: () => ({
        [_iterable$]: IterableOfS(),
        [_f]: _TransformationOfS$T()
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(T), []),
        first: dart.definiteFunctionType(T, []),
        last: dart.definiteFunctionType(T, []),
        single: dart.definiteFunctionType(T, [])
      }),
      methods: () => ({elementAt: dart.definiteFunctionType(T, [core.int])})
    });
    dart.defineExtensionMembers(MappedIterable, [
      'elementAt',
      'iterator',
      'length',
      'isEmpty',
      'first',
      'last',
      'single'
    ]);
    return MappedIterable;
  });
  _internal.MappedIterable = MappedIterable();
  _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let SToT = () => (SToT = dart.constFn(dart.functionType(T, [S])))();
    class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
      new(iterable, func) {
        super._(iterable, func);
      }
    }
    EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EfficientLengthMappedIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthMappedIterable$(S, T), [IterableOfS(), SToT()])})
    });
    return EfficientLengthMappedIterable;
  });
  _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
  const _iterator = Symbol('_iterator');
  core.Iterator$ = dart.generic(E => {
    class Iterator extends core.Object {}
    dart.addTypeTests(Iterator);
    return Iterator;
  });
  core.Iterator = Iterator();
  _internal.MappedIterator$ = dart.generic((S, T) => {
    let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
    class MappedIterator extends core.Iterator$(T) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_current$] = null;
      }
      moveNext() {
        if (dart.test(this[_iterator].moveNext())) {
          this[_current$] = this[_f](this[_iterator].current);
          return true;
        }
        this[_current$] = null;
        return false;
      }
      get current() {
        return this[_current$];
      }
    }
    dart.setSignature(MappedIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.MappedIterator$(S, T), [IteratorOfS(), _TransformationOfS$T()])}),
      fields: () => ({
        [_current$]: T,
        [_iterator]: IteratorOfS(),
        [_f]: _TransformationOfS$T()
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return MappedIterator;
  });
  _internal.MappedIterator = MappedIterator();
  const _source = Symbol('_source');
  _internal.MappedListIterable$ = dart.generic((S, T) => {
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
    class MappedListIterable extends _internal.ListIterable$(T) {
      new(source, f) {
        this[_source] = source;
        this[_f] = f;
        super.new();
      }
      get length() {
        return this[_source][dartx.length];
      }
      elementAt(index) {
        return this[_f](this[_source][dartx.elementAt](index));
      }
    }
    MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(MappedListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.MappedListIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])}),
      fields: () => ({
        [_source]: IterableOfS(),
        [_f]: _TransformationOfS$T()
      }),
      methods: () => ({elementAt: dart.definiteFunctionType(T, [core.int])})
    });
    dart.defineExtensionMembers(MappedListIterable, ['elementAt', 'length']);
    return MappedListIterable;
  });
  _internal.MappedListIterable = MappedListIterable();
  _internal._ElementPredicate$ = dart.generic(E => {
    const _ElementPredicate = dart.typedef('_ElementPredicate', () => dart.functionType(core.bool, [E]));
    return _ElementPredicate;
  });
  _internal._ElementPredicate = _ElementPredicate();
  _internal.WhereIterable$ = dart.generic(E => {
    let WhereIteratorOfE = () => (WhereIteratorOfE = dart.constFn(_internal.WhereIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class WhereIterable extends core.Iterable$(E) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(WhereIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(WhereIterable, ['iterator']);
    return WhereIterable;
  });
  _internal.WhereIterable = WhereIterable();
  _internal.WhereIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class WhereIterator extends core.Iterator$(E) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
      }
      moveNext() {
        while (dart.test(this[_iterator].moveNext())) {
          if (dart.test(this[_f](this[_iterator].current))) {
            return true;
          }
        }
        return false;
      }
      get current() {
        return this[_iterator].current;
      }
    }
    dart.setSignature(WhereIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return WhereIterator;
  });
  _internal.WhereIterator = WhereIterator();
  _internal._ExpandFunction$ = dart.generic((S, T) => {
    const _ExpandFunction = dart.typedef('_ExpandFunction', () => dart.functionType(core.Iterable$(T), [S]));
    return _ExpandFunction;
  });
  _internal._ExpandFunction = _ExpandFunction();
  _internal.ExpandIterable$ = dart.generic((S, T) => {
    let ExpandIteratorOfS$T = () => (ExpandIteratorOfS$T = dart.constFn(_internal.ExpandIterator$(S, T)))();
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class ExpandIterable extends core.Iterable$(T) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (ExpandIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(ExpandIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterable$(S, T), [IterableOfS(), _ExpandFunctionOfS$T()])}),
      fields: () => ({
        [_iterable$]: IterableOfS(),
        [_f]: _ExpandFunctionOfS$T()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
    });
    dart.defineExtensionMembers(ExpandIterable, ['iterator']);
    return ExpandIterable;
  });
  _internal.ExpandIterable = ExpandIterable();
  const _currentExpansion = Symbol('_currentExpansion');
  _internal.ExpandIterator$ = dart.generic((S, T) => {
    let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
    let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
    let EmptyIteratorOfT = () => (EmptyIteratorOfT = dart.constFn(_internal.EmptyIterator$(T)))();
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class ExpandIterator extends core.Object {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_currentExpansion] = dart.const(new (EmptyIteratorOfT())());
        this[_current$] = null;
      }
      get current() {
        return this[_current$];
      }
      moveNext() {
        if (this[_currentExpansion] == null) return false;
        while (!dart.test(this[_currentExpansion].moveNext())) {
          this[_current$] = null;
          if (dart.test(this[_iterator].moveNext())) {
            this[_currentExpansion] = null;
            this[_currentExpansion] = this[_f](this[_iterator].current)[dartx.iterator];
          } else {
            return false;
          }
        }
        this[_current$] = this[_currentExpansion].current;
        return true;
      }
    }
    dart.addTypeTests(ExpandIterator);
    ExpandIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(ExpandIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterator$(S, T), [IteratorOfS(), _ExpandFunctionOfS$T()])}),
      fields: () => ({
        [_iterator]: IteratorOfS(),
        [_f]: _ExpandFunctionOfS$T(),
        [_currentExpansion]: IteratorOfT(),
        [_current$]: T
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return ExpandIterator;
  });
  _internal.ExpandIterator = ExpandIterator();
  const _takeCount = Symbol('_takeCount');
  _internal.TakeIterable$ = dart.generic(E => {
    let EfficientLengthTakeIterableOfE = () => (EfficientLengthTakeIterableOfE = dart.constFn(_internal.EfficientLengthTakeIterable$(E)))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeIteratorOfE = () => (TakeIteratorOfE = dart.constFn(_internal.TakeIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class TakeIterable extends core.Iterable$(E) {
      static new(iterable, takeCount) {
        if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
          dart.throw(new core.ArgumentError(takeCount));
        }
        if (_internal.EfficientLength.is(iterable)) {
          return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
        }
        return new (TakeIterableOfE())._(iterable, takeCount);
      }
      _(iterable, takeCount) {
        this[_iterable$] = iterable;
        this[_takeCount] = takeCount;
        super.new();
      }
      get iterator() {
        return new (TakeIteratorOfE())(this[_iterable$][dartx.iterator], this[_takeCount]);
      }
    }
    dart.defineNamedConstructor(TakeIterable, '_');
    dart.setSignature(TakeIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int]),
        _: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int])
      }),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_takeCount]: core.int
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(TakeIterable, ['iterator']);
    return TakeIterable;
  });
  _internal.TakeIterable = TakeIterable();
  _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
      new(iterable, takeCount) {
        super._(iterable, takeCount);
      }
      get length() {
        let iterableLength = this[_iterable$][dartx.length];
        if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
        return iterableLength;
      }
    }
    EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EfficientLengthTakeIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthTakeIterable$(E), [IterableOfE(), core.int])})
    });
    dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
    return EfficientLengthTakeIterable;
  });
  _internal.EfficientLengthTakeIterable = EfficientLengthTakeIterable();
  const _remaining = Symbol('_remaining');
  _internal.TakeIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class TakeIterator extends core.Iterator$(E) {
      new(iterator, remaining) {
        this[_iterator] = iterator;
        this[_remaining] = remaining;
        dart.assert(typeof this[_remaining] == 'number' && dart.notNull(this[_remaining]) >= 0);
      }
      moveNext() {
        this[_remaining] = dart.notNull(this[_remaining]) - 1;
        if (dart.notNull(this[_remaining]) >= 0) {
          return this[_iterator].moveNext();
        }
        this[_remaining] = -1;
        return false;
      }
      get current() {
        if (dart.notNull(this[_remaining]) < 0) return null;
        return this[_iterator].current;
      }
    }
    dart.setSignature(TakeIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeIterator$(E), [IteratorOfE(), core.int])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_remaining]: core.int
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return TakeIterator;
  });
  _internal.TakeIterator = TakeIterator();
  _internal.TakeWhileIterable$ = dart.generic(E => {
    let TakeWhileIteratorOfE = () => (TakeWhileIteratorOfE = dart.constFn(_internal.TakeWhileIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class TakeWhileIterable extends core.Iterable$(E) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (TakeWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(TakeWhileIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(TakeWhileIterable, ['iterator']);
    return TakeWhileIterable;
  });
  _internal.TakeWhileIterable = TakeWhileIterable();
  const _isFinished = Symbol('_isFinished');
  _internal.TakeWhileIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class TakeWhileIterator extends core.Iterator$(E) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_isFinished] = false;
      }
      moveNext() {
        if (dart.test(this[_isFinished])) return false;
        if (!dart.test(this[_iterator].moveNext()) || !dart.test(this[_f](this[_iterator].current))) {
          this[_isFinished] = true;
          return false;
        }
        return true;
      }
      get current() {
        if (dart.test(this[_isFinished])) return null;
        return this[_iterator].current;
      }
    }
    dart.setSignature(TakeWhileIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_f]: _ElementPredicateOfE(),
        [_isFinished]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return TakeWhileIterator;
  });
  _internal.TakeWhileIterator = TakeWhileIterator();
  const _skipCount = Symbol('_skipCount');
  _internal.SkipIterable$ = dart.generic(E => {
    let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipIteratorOfE = () => (SkipIteratorOfE = dart.constFn(_internal.SkipIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class SkipIterable extends core.Iterable$(E) {
      static new(iterable, count) {
        if (_internal.EfficientLength.is(iterable)) {
          return new (EfficientLengthSkipIterableOfE())(iterable, count);
        }
        return new (SkipIterableOfE())._(iterable, count);
      }
      _(iterable, skipCount) {
        this[_iterable$] = iterable;
        this[_skipCount] = skipCount;
        super.new();
        if (!(typeof this[_skipCount] == 'number')) {
          dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
        }
        core.RangeError.checkNotNegative(this[_skipCount], "count");
      }
      skip(count) {
        if (!(typeof this[_skipCount] == 'number')) {
          dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
        }
        core.RangeError.checkNotNegative(this[_skipCount], "count");
        return new (SkipIterableOfE())._(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(count));
      }
      get iterator() {
        return new (SkipIteratorOfE())(this[_iterable$][dartx.iterator], this[_skipCount]);
      }
    }
    dart.defineNamedConstructor(SkipIterable, '_');
    dart.setSignature(SkipIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int]),
        _: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int])
      }),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_skipCount]: core.int
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({skip: dart.definiteFunctionType(core.Iterable$(E), [core.int])})
    });
    dart.defineExtensionMembers(SkipIterable, ['skip', 'iterator']);
    return SkipIterable;
  });
  _internal.SkipIterable = SkipIterable();
  _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
      new(iterable, skipCount) {
        super._(iterable, skipCount);
      }
      get length() {
        let length = dart.notNull(this[_iterable$][dartx.length]) - dart.notNull(this[_skipCount]);
        if (length >= 0) return length;
        return 0;
      }
    }
    EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EfficientLengthSkipIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthSkipIterable$(E), [IterableOfE(), core.int])})
    });
    dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
    return EfficientLengthSkipIterable;
  });
  _internal.EfficientLengthSkipIterable = EfficientLengthSkipIterable();
  _internal.SkipIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class SkipIterator extends core.Iterator$(E) {
      new(iterator, skipCount) {
        this[_iterator] = iterator;
        this[_skipCount] = skipCount;
        dart.assert(typeof this[_skipCount] == 'number' && dart.notNull(this[_skipCount]) >= 0);
      }
      moveNext() {
        for (let i = 0; i < dart.notNull(this[_skipCount]); i++)
          this[_iterator].moveNext();
        this[_skipCount] = 0;
        return this[_iterator].moveNext();
      }
      get current() {
        return this[_iterator].current;
      }
    }
    dart.setSignature(SkipIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipIterator$(E), [IteratorOfE(), core.int])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_skipCount]: core.int
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return SkipIterator;
  });
  _internal.SkipIterator = SkipIterator();
  _internal.SkipWhileIterable$ = dart.generic(E => {
    let SkipWhileIteratorOfE = () => (SkipWhileIteratorOfE = dart.constFn(_internal.SkipWhileIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class SkipWhileIterable extends core.Iterable$(E) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (SkipWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(SkipWhileIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(SkipWhileIterable, ['iterator']);
    return SkipWhileIterable;
  });
  _internal.SkipWhileIterable = SkipWhileIterable();
  const _hasSkipped = Symbol('_hasSkipped');
  _internal.SkipWhileIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class SkipWhileIterator extends core.Iterator$(E) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_hasSkipped] = false;
      }
      moveNext() {
        if (!dart.test(this[_hasSkipped])) {
          this[_hasSkipped] = true;
          while (dart.test(this[_iterator].moveNext())) {
            if (!dart.test(this[_f](this[_iterator].current))) return true;
          }
        }
        return this[_iterator].moveNext();
      }
      get current() {
        return this[_iterator].current;
      }
    }
    dart.setSignature(SkipWhileIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_f]: _ElementPredicateOfE(),
        [_hasSkipped]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return SkipWhileIterator;
  });
  _internal.SkipWhileIterator = SkipWhileIterator();
  _internal.EmptyIterable$ = dart.generic(E => {
    let EmptyIteratorOfE = () => (EmptyIteratorOfE = dart.constFn(_internal.EmptyIterator$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class EmptyIterable extends core.Iterable$(E) {
      new() {
        super.new();
      }
      get iterator() {
        return dart.const(new (EmptyIteratorOfE())());
      }
      forEach(action) {}
      get isEmpty() {
        return true;
      }
      get length() {
        return 0;
      }
      get first() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      get last() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      get single() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        dart.throw(new core.RangeError.range(index, 0, 0, "index"));
      }
      contains(element) {
        return false;
      }
      every(test) {
        return true;
      }
      any(test) {
        return false;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      join(separator) {
        if (separator === void 0) separator = "";
        return "";
      }
      where(test) {
        return this;
      }
      map(T) {
        return f => {
          return dart.const(new (_internal.EmptyIterable$(T))());
        };
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        dart.throw(_internal.IterableElementError.noElement());
      }
      fold(T) {
        return (initialValue, combine) => {
          return initialValue;
        };
      }
      skip(count) {
        core.RangeError.checkNotNegative(count, "count");
        return this;
      }
      skipWhile(test) {
        return this;
      }
      take(count) {
        core.RangeError.checkNotNegative(count, "count");
        return this;
      }
      takeWhile(test) {
        return this;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        return dart.test(growable) ? JSArrayOfE().of([]) : ListOfE().new(0);
      }
      toSet() {
        return SetOfE().new();
      }
    }
    EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EmptyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterable$(E), [])}),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        elementAt: dart.definiteFunctionType(E, [core.int]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(EmptyIterable, [
      'forEach',
      'elementAt',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'iterator',
      'isEmpty',
      'length',
      'first',
      'last',
      'single'
    ]);
    return EmptyIterable;
  });
  _internal.EmptyIterable = EmptyIterable();
  _internal.EmptyIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class EmptyIterator extends core.Object {
      new() {
      }
      moveNext() {
        return false;
      }
      get current() {
        return null;
      }
    }
    dart.addTypeTests(EmptyIterator);
    EmptyIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(EmptyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterator$(E), [])}),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return EmptyIterator;
  });
  _internal.EmptyIterator = EmptyIterator();
  _internal.IterableElementError = class IterableElementError extends core.Object {
    static noElement() {
      return new core.StateError("No element");
    }
    static tooMany() {
      return new core.StateError("Too many elements");
    }
    static tooFew() {
      return new core.StateError("Too few elements");
    }
  };
  dart.setSignature(_internal.IterableElementError, {
    statics: () => ({
      noElement: dart.definiteFunctionType(core.StateError, []),
      tooMany: dart.definiteFunctionType(core.StateError, []),
      tooFew: dart.definiteFunctionType(core.StateError, [])
    }),
    names: ['noElement', 'tooMany', 'tooFew']
  });
  _internal.FixedLengthListMixin$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    dart.defineExtensionNames([
      'length',
      'add',
      'insert',
      'insertAll',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeAt',
      'removeLast',
      'removeRange',
      'replaceRange'
    ]);
    class FixedLengthListMixin extends core.Object {
      set length(newLength) {
        dart.throw(new core.UnsupportedError("Cannot change the length of a fixed-length list"));
      }
      add(value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      insert(index, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      insertAll(at, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      remove(element) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      removeWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      retainWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot clear a fixed-length list"));
      }
      removeAt(index) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      removeLast() {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      removeRange(start, end) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
    }
    dart.addTypeTests(FixedLengthListMixin);
    dart.setSignature(FixedLengthListMixin, {
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [E]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        clear: dart.definiteFunctionType(dart.void, []),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()])
      })
    });
    dart.defineExtensionMembers(FixedLengthListMixin, [
      'add',
      'insert',
      'insertAll',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeAt',
      'removeLast',
      'removeRange',
      'replaceRange',
      'length'
    ]);
    return FixedLengthListMixin;
  });
  _internal.FixedLengthListMixin = FixedLengthListMixin();
  _internal.FixedLengthListBase$ = dart.generic(E => {
    class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), _internal.FixedLengthListMixin$(E)) {
      new() {
        super.new();
      }
    }
    return FixedLengthListBase;
  });
  _internal.FixedLengthListBase = FixedLengthListBase();
  const _backedList = Symbol('_backedList');
  _internal._ListIndicesIterable = class _ListIndicesIterable extends _internal.ListIterable$(core.int) {
    new(backedList) {
      this[_backedList] = backedList;
      super.new();
    }
    get length() {
      return this[_backedList][dartx.length];
    }
    elementAt(index) {
      core.RangeError.checkValidIndex(index, this);
      return index;
    }
  };
  dart.addSimpleTypeTests(_internal._ListIndicesIterable);
  dart.setSignature(_internal._ListIndicesIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal._ListIndicesIterable, [core.List])}),
    fields: () => ({[_backedList]: core.List}),
    methods: () => ({elementAt: dart.definiteFunctionType(core.int, [core.int])})
  });
  dart.defineExtensionMembers(_internal._ListIndicesIterable, ['elementAt', 'length']);
  const _values = Symbol('_values');
  _internal.ListMapView$ = dart.generic(E => {
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let MapOfint$E = () => (MapOfint$E = dart.constFn(core.Map$(core.int, E)))();
    let intAndETovoid = () => (intAndETovoid = dart.constFn(dart.functionType(dart.void, [core.int, E])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    class ListMapView extends core.Object {
      new(values) {
        this[_values] = values;
      }
      _get(key) {
        return dart.test(this.containsKey(key)) ? this[_values][dartx._get](core.int._check(key)) : null;
      }
      get length() {
        return this[_values][dartx.length];
      }
      get values() {
        return new (SubListIterableOfE())(this[_values], 0, null);
      }
      get keys() {
        return new _internal._ListIndicesIterable(this[_values]);
      }
      get isEmpty() {
        return this[_values][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_values][dartx.isNotEmpty];
      }
      containsValue(value) {
        return this[_values][dartx.contains](value);
      }
      containsKey(key) {
        return typeof key == 'number' && dart.notNull(key) >= 0 && dart.notNull(key) < dart.notNull(this.length);
      }
      forEach(f) {
        let length = this[_values][dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          f(i, this[_values][dartx._get](i));
          if (length != this[_values][dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this[_values]));
          }
        }
      }
      _set(key, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        VoidToE()._check(ifAbsent);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      remove(key) {
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      addAll(other) {
        MapOfint$E()._check(other);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    dart.addTypeTests(ListMapView);
    ListMapView[dart.implements] = () => [MapOfint$E()];
    dart.setSignature(ListMapView, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ListMapView$(E), [ListOfE()])}),
      fields: () => ({[_values]: ListOfE()}),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        values: dart.definiteFunctionType(core.Iterable$(E), []),
        keys: dart.definiteFunctionType(core.Iterable$(core.int), []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(E, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [intAndETovoid()]),
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        putIfAbsent: dart.definiteFunctionType(E, [core.int, VoidToE()]),
        remove: dart.definiteFunctionType(E, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        addAll: dart.definiteFunctionType(dart.void, [MapOfint$E()])
      })
    });
    dart.defineExtensionMembers(ListMapView, [
      '_get',
      'containsValue',
      'containsKey',
      'forEach',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'addAll',
      'length',
      'values',
      'keys',
      'isEmpty',
      'isNotEmpty'
    ]);
    return ListMapView;
  });
  _internal.ListMapView = ListMapView();
  _internal.ReversedListIterable$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class ReversedListIterable extends _internal.ListIterable$(E) {
      new(source) {
        this[_source] = source;
        super.new();
      }
      get length() {
        return this[_source][dartx.length];
      }
      elementAt(index) {
        return this[_source][dartx.elementAt](dart.notNull(this[_source][dartx.length]) - 1 - dart.notNull(index));
      }
    }
    dart.setSignature(ReversedListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ReversedListIterable$(E), [IterableOfE()])}),
      fields: () => ({[_source]: IterableOfE()}),
      methods: () => ({elementAt: dart.definiteFunctionType(E, [core.int])})
    });
    dart.defineExtensionMembers(ReversedListIterable, ['elementAt', 'length']);
    return ReversedListIterable;
  });
  _internal.ReversedListIterable = ReversedListIterable();
  _internal.UnmodifiableListError = class UnmodifiableListError extends core.Object {
    static add() {
      return new core.UnsupportedError("Cannot add to unmodifiable List");
    }
    static change() {
      return new core.UnsupportedError("Cannot change the content of an unmodifiable List");
    }
    static length() {
      return new core.UnsupportedError("Cannot change length of unmodifiable List");
    }
    static remove() {
      return new core.UnsupportedError("Cannot remove from unmodifiable List");
    }
  };
  dart.setSignature(_internal.UnmodifiableListError, {
    statics: () => ({
      add: dart.definiteFunctionType(core.UnsupportedError, []),
      change: dart.definiteFunctionType(core.UnsupportedError, []),
      length: dart.definiteFunctionType(core.UnsupportedError, []),
      remove: dart.definiteFunctionType(core.UnsupportedError, [])
    }),
    names: ['add', 'change', 'length', 'remove']
  });
  _internal.NonGrowableListError = class NonGrowableListError extends core.Object {
    static add() {
      return new core.UnsupportedError("Cannot add to non-growable List");
    }
    static length() {
      return new core.UnsupportedError("Cannot change length of non-growable List");
    }
    static remove() {
      return new core.UnsupportedError("Cannot remove from non-growable List");
    }
  };
  dart.setSignature(_internal.NonGrowableListError, {
    statics: () => ({
      add: dart.definiteFunctionType(core.UnsupportedError, []),
      length: dart.definiteFunctionType(core.UnsupportedError, []),
      remove: dart.definiteFunctionType(core.UnsupportedError, [])
    }),
    names: ['add', 'length', 'remove']
  });
  _internal.makeListFixedLength = function(E) {
    return growableList => {
      _interceptors.JSArray.markFixedList(growableList);
      return growableList;
    };
  };
  dart.lazyFn(_internal.makeListFixedLength, () => ListOfEToListOfE());
  _internal.makeFixedListUnmodifiable = function(E) {
    return fixedLengthList => {
      _interceptors.JSArray.markUnmodifiableList(fixedLengthList);
      return fixedLengthList;
    };
  };
  dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
  _internal.Lists = class Lists extends core.Object {
    static copy(src, srcStart, dst, dstStart, count) {
      if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
        for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
          dst[dartx._set](j, src[dartx._get](i));
        }
      } else {
        for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
          dst[dartx._set](j, src[dartx._get](i));
        }
      }
    }
    static areEqual(a, b) {
      if (core.identical(a, b)) return true;
      if (!core.List.is(b)) return false;
      let length = a[dartx.length];
      if (!dart.equals(length, dart.dload(b, 'length'))) return false;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
      }
      return true;
    }
    static indexOf(a, element, startIndex, endIndex) {
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        return -1;
      }
      if (dart.notNull(startIndex) < 0) {
        startIndex = 0;
      }
      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static lastIndexOf(a, element, startIndex) {
      if (dart.notNull(startIndex) < 0) {
        return -1;
      }
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        startIndex = dart.notNull(a[dartx.length]) - 1;
      }
      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static indicesCheck(a, start, end) {
      core.RangeError.checkValidRange(start, end, a[dartx.length]);
    }
    static rangeCheck(a, start, length) {
      core.RangeError.checkNotNegative(length);
      core.RangeError.checkNotNegative(start);
      if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
        let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
        dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
      }
    }
  };
  dart.setSignature(_internal.Lists, {
    statics: () => ({
      copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
      areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
      indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
      rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
    }),
    names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
  });
  _internal.printToZone = null;
  _internal.printToConsole = function(line) {
    _js_primitives.printString(dart.str`${line}`);
  };
  dart.lazyFn(_internal.printToConsole, () => StringTovoid$());
  _internal.Sort = class Sort extends core.Object {
    static sort(E) {
      return (a, compare) => {
        _internal.Sort._doSort(E)(a, 0, dart.notNull(a[dartx.length]) - 1, compare);
      };
    }
    static sortRange(E) {
      return (a, from, to, compare) => {
        if (dart.notNull(from) < 0 || dart.notNull(to) > dart.notNull(a[dartx.length]) || dart.notNull(to) < dart.notNull(from)) {
          dart.throw("OutOfRange");
        }
        _internal.Sort._doSort(E)(a, from, dart.notNull(to) - 1, compare);
      };
    }
    static _doSort(E) {
      return (a, left, right, compare) => {
        if (dart.notNull(right) - dart.notNull(left) <= _internal.Sort._INSERTION_SORT_THRESHOLD) {
          _internal.Sort._insertionSort(E)(a, left, right, compare);
        } else {
          _internal.Sort._dualPivotQuicksort(E)(a, left, right, compare);
        }
      };
    }
    static _insertionSort(E) {
      return (a, left, right, compare) => {
        for (let i = dart.notNull(left) + 1; i <= dart.notNull(right); i++) {
          let el = a[dartx._get](i);
          let j = i;
          while (j > dart.notNull(left) && dart.notNull(compare(a[dartx._get](j - 1), el)) > 0) {
            a[dartx._set](j, a[dartx._get](j - 1));
            j--;
          }
          a[dartx._set](j, el);
        }
      };
    }
    static _dualPivotQuicksort(E) {
      return (a, left, right, compare) => {
        dart.assert(dart.notNull(right) - dart.notNull(left) > _internal.Sort._INSERTION_SORT_THRESHOLD);
        let sixth = ((dart.notNull(right) - dart.notNull(left) + 1) / 6)[dartx.truncate]();
        let index1 = dart.notNull(left) + sixth;
        let index5 = dart.notNull(right) - sixth;
        let index3 = ((dart.notNull(left) + dart.notNull(right)) / 2)[dartx.truncate]();
        let index2 = index3 - sixth;
        let index4 = index3 + sixth;
        let el1 = a[dartx._get](index1);
        let el2 = a[dartx._get](index2);
        let el3 = a[dartx._get](index3);
        let el4 = a[dartx._get](index4);
        let el5 = a[dartx._get](index5);
        if (dart.notNull(compare(el1, el2)) > 0) {
          let t = el1;
          el1 = el2;
          el2 = t;
        }
        if (dart.notNull(compare(el4, el5)) > 0) {
          let t = el4;
          el4 = el5;
          el5 = t;
        }
        if (dart.notNull(compare(el1, el3)) > 0) {
          let t = el1;
          el1 = el3;
          el3 = t;
        }
        if (dart.notNull(compare(el2, el3)) > 0) {
          let t = el2;
          el2 = el3;
          el3 = t;
        }
        if (dart.notNull(compare(el1, el4)) > 0) {
          let t = el1;
          el1 = el4;
          el4 = t;
        }
        if (dart.notNull(compare(el3, el4)) > 0) {
          let t = el3;
          el3 = el4;
          el4 = t;
        }
        if (dart.notNull(compare(el2, el5)) > 0) {
          let t = el2;
          el2 = el5;
          el5 = t;
        }
        if (dart.notNull(compare(el2, el3)) > 0) {
          let t = el2;
          el2 = el3;
          el3 = t;
        }
        if (dart.notNull(compare(el4, el5)) > 0) {
          let t = el4;
          el4 = el5;
          el5 = t;
        }
        let pivot1 = el2;
        let pivot2 = el4;
        a[dartx._set](index1, el1);
        a[dartx._set](index3, el3);
        a[dartx._set](index5, el5);
        a[dartx._set](index2, a[dartx._get](left));
        a[dartx._set](index4, a[dartx._get](right));
        let less = dart.notNull(left) + 1;
        let great = dart.notNull(right) - 1;
        let pivots_are_equal = compare(pivot1, pivot2) == 0;
        if (pivots_are_equal) {
          let pivot = pivot1;
          for (let k = less; k <= great; k++) {
            let ak = a[dartx._get](k);
            let comp = compare(ak, pivot);
            if (comp == 0) continue;
            if (dart.notNull(comp) < 0) {
              if (k != less) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less, ak);
              }
              less++;
            } else {
              while (true) {
                comp = compare(a[dartx._get](great), pivot);
                if (dart.notNull(comp) > 0) {
                  great--;
                  continue;
                } else if (dart.notNull(comp) < 0) {
                  a[dartx._set](k, a[dartx._get](less));
                  a[dartx._set](less++, a[dartx._get](great));
                  a[dartx._set](great--, ak);
                  break;
                } else {
                  a[dartx._set](k, a[dartx._get](great));
                  a[dartx._set](great--, ak);
                  break;
                }
              }
            }
          }
        } else {
          for (let k = less; k <= great; k++) {
            let ak = a[dartx._get](k);
            let comp_pivot1 = compare(ak, pivot1);
            if (dart.notNull(comp_pivot1) < 0) {
              if (k != less) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less, ak);
              }
              less++;
            } else {
              let comp_pivot2 = compare(ak, pivot2);
              if (dart.notNull(comp_pivot2) > 0) {
                while (true) {
                  let comp = compare(a[dartx._get](great), pivot2);
                  if (dart.notNull(comp) > 0) {
                    great--;
                    if (great < k) break;
                    continue;
                  } else {
                    comp = compare(a[dartx._get](great), pivot1);
                    if (dart.notNull(comp) < 0) {
                      a[dartx._set](k, a[dartx._get](less));
                      a[dartx._set](less++, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    } else {
                      a[dartx._set](k, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    }
                    break;
                  }
                }
              }
            }
          }
        }
        a[dartx._set](left, a[dartx._get](less - 1));
        a[dartx._set](less - 1, pivot1);
        a[dartx._set](right, a[dartx._get](great + 1));
        a[dartx._set](great + 1, pivot2);
        _internal.Sort._doSort(E)(a, left, less - 2, compare);
        _internal.Sort._doSort(E)(a, great + 2, right, compare);
        if (pivots_are_equal) {
          return;
        }
        if (less < index1 && great > index5) {
          while (compare(a[dartx._get](less), pivot1) == 0) {
            less++;
          }
          while (compare(a[dartx._get](great), pivot2) == 0) {
            great--;
          }
          for (let k = less; k <= great; k++) {
            let ak = a[dartx._get](k);
            let comp_pivot1 = compare(ak, pivot1);
            if (comp_pivot1 == 0) {
              if (k != less) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less, ak);
              }
              less++;
            } else {
              let comp_pivot2 = compare(ak, pivot2);
              if (comp_pivot2 == 0) {
                while (true) {
                  let comp = compare(a[dartx._get](great), pivot2);
                  if (comp == 0) {
                    great--;
                    if (great < k) break;
                    continue;
                  } else {
                    comp = compare(a[dartx._get](great), pivot1);
                    if (dart.notNull(comp) < 0) {
                      a[dartx._set](k, a[dartx._get](less));
                      a[dartx._set](less++, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    } else {
                      a[dartx._set](k, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    }
                    break;
                  }
                }
              }
            }
          }
          _internal.Sort._doSort(E)(a, less, great, compare);
        } else {
          _internal.Sort._doSort(E)(a, less, great, compare);
        }
      };
    }
  };
  dart.setSignature(_internal.Sort, {
    sfields: () => ({_INSERTION_SORT_THRESHOLD: core.int}),
    statics: () => ({
      sort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), dart.functionType(core.int, [E, E])]]),
      sortRange: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
      _doSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
      _insertionSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
      _dualPivotQuicksort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]])
    }),
    names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
  });
  _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
  const _name = Symbol('_name');
  const _nativeSymbol = Symbol('_nativeSymbol');
  _internal.Symbol = class Symbol extends core.Object {
    new(name) {
      this[_name] = name;
      this[_nativeSymbol] = null;
    }
    es6(name, nativeSymbol) {
      this[_name] = name;
      this[_nativeSymbol] = nativeSymbol;
    }
    unvalidated(name) {
      this[_name] = name;
      this[_nativeSymbol] = null;
    }
    validated(name) {
      this[_name] = _internal.Symbol.validatePublicSymbol(name);
      this[_nativeSymbol] = null;
    }
    ['=='](other) {
      return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
    }
    get hashCode() {
      let hash = this._hashCode;
      if (hash != null) return hash;
      let arbitraryPrime = 664597;
      hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name]));
      this._hashCode = hash;
      return hash;
    }
    toString() {
      return dart.str`Symbol("${this[_name]}")`;
    }
    static getName(symbol) {
      return symbol[_name];
    }
    static getNativeSymbol(symbol) {
      return symbol[_nativeSymbol];
    }
    static validatePublicSymbol(name) {
      if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
      if (dart.test(name[dartx.startsWith]('_'))) {
        dart.throw(new core.ArgumentError(dart.str`"${name}" is a private identifier`));
      }
      dart.throw(new core.ArgumentError(dart.str`"${name}" is not a valid (qualified) symbol name`));
    }
    static isValidSymbol(name) {
      return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
    }
  };
  dart.defineNamedConstructor(_internal.Symbol, 'es6');
  dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
  dart.defineNamedConstructor(_internal.Symbol, 'validated');
  _internal.Symbol[dart.implements] = () => [core.Symbol];
  dart.setSignature(_internal.Symbol, {
    constructors: () => ({
      new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
      es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
      unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
      validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
    }),
    fields: () => ({
      [_name]: core.String,
      [_nativeSymbol]: dart.dynamic
    }),
    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
    sfields: () => ({
      reservedWordRE: core.String,
      publicIdentifierRE: core.String,
      identifierRE: core.String,
      operatorRE: core.String,
      publicSymbolPattern: core.RegExp,
      symbolPattern: core.RegExp
    }),
    statics: () => ({
      getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
      validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
      isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
    }),
    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
  });
  _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
  _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
  dart.defineLazy(_internal.Symbol, {
    get publicIdentifierRE() {
      return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$][\\w$]*';
    },
    get identifierRE() {
      return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$_][\\w$]*';
    },
    get publicSymbolPattern() {
      return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.publicIdentifierRE}(?:=?\$|[.](?!\$)))+?\$`);
    },
    get symbolPattern() {
      return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.identifierRE}(?:=?\$|[.](?!\$)))+?\$`);
    }
  });
  _isolate_helper._callInIsolate = function(isolate, func) {
    let result = isolate.eval(func);
    _isolate_helper._globalState.topEventLoop.run();
    return result;
  };
  dart.lazyFn(_isolate_helper._callInIsolate, () => _IsolateContextAndFunctionTodynamic());
  const _activeJsAsyncCount = Symbol('_activeJsAsyncCount');
  _isolate_helper.enterJsAsync = function() {
    let o = _isolate_helper._globalState.topEventLoop;
    o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1;
  };
  dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic$());
  _isolate_helper.leaveJsAsync = function() {
    let o = _isolate_helper._globalState.topEventLoop;
    o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1;
    dart.assert(dart.notNull(_isolate_helper._globalState.topEventLoop[_activeJsAsyncCount]) >= 0);
  };
  dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic$());
  _isolate_helper.isWorker = function() {
    return _isolate_helper._globalState.isWorker;
  };
  dart.lazyFn(_isolate_helper.isWorker, () => VoidTobool());
  _isolate_helper._currentIsolate = function() {
    return _isolate_helper._globalState.currentContext;
  };
  dart.lazyFn(_isolate_helper._currentIsolate, () => VoidTo_IsolateContext());
  _isolate_helper.startRootIsolate = function(entry, args) {
    args = args;
    if (args == null) args = [];
    if (!core.List.is(args)) {
      dart.throw(new core.ArgumentError(dart.str`Arguments to main must be a List: ${args}`));
    }
    _isolate_helper._globalState = new _isolate_helper._Manager(core.Function._check(entry));
    if (dart.test(_isolate_helper._globalState.isWorker)) return;
    let rootContext = new _isolate_helper._IsolateContext();
    _isolate_helper._globalState.rootContext = rootContext;
    _isolate_helper._globalState.currentContext = rootContext;
    if (_isolate_helper._MainFunctionArgs.is(entry)) {
      rootContext.eval(dart.fn(() => {
        dart.dcall(entry, args);
      }, VoidTodynamic$()));
    } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
      rootContext.eval(dart.fn(() => {
        dart.dcall(entry, args, null);
      }, VoidTodynamic$()));
    } else {
      rootContext.eval(core.Function._check(entry));
    }
    _isolate_helper._globalState.topEventLoop.run();
  };
  dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid$());
  dart.copyProperties(_isolate_helper, {
    get _globalState() {
      return dart.globalState;
    },
    set _globalState(val) {
      dart.globalState = val;
    }
  });
  const _nativeDetectEnvironment = Symbol('_nativeDetectEnvironment');
  const _nativeInitWorkerMessageHandler = Symbol('_nativeInitWorkerMessageHandler');
  _isolate_helper._Manager = class _Manager extends core.Object {
    get useWorkers() {
      return this.supportsWorkers;
    }
    new(entry) {
      this.entry = entry;
      this.nextIsolateId = 0;
      this.currentManagerId = 0;
      this.nextManagerId = 1;
      this.currentContext = null;
      this.rootContext = null;
      this.topEventLoop = null;
      this.fromCommandLine = null;
      this.isWorker = null;
      this.supportsWorkers = null;
      this.isolates = null;
      this.mainManager = null;
      this.managers = null;
      this[_nativeDetectEnvironment]();
      this.topEventLoop = new _isolate_helper._EventLoop();
      this.isolates = MapOfint$_IsolateContext().new();
      this.managers = MapOfint$dynamic().new();
      if (dart.test(this.isWorker)) {
        this.mainManager = new _isolate_helper._MainManagerStub();
        this[_nativeInitWorkerMessageHandler]();
      }
    }
    [_nativeDetectEnvironment]() {
      let isWindowDefined = _isolate_helper.globalWindow != null;
      let isWorkerDefined = _isolate_helper.globalWorker != null;
      this.isWorker = !isWindowDefined && dart.test(_isolate_helper.globalPostMessageDefined);
      this.supportsWorkers = dart.test(this.isWorker) || isWorkerDefined && _isolate_helper.IsolateNatives.thisScript != null;
      this.fromCommandLine = !isWindowDefined && !dart.test(this.isWorker);
    }
    [_nativeInitWorkerMessageHandler]() {
      let func = (function(f, a) {
        return function(e) {
          f(a, e);
        };
      })(_isolate_helper.IsolateNatives._processWorkerMessage, this.mainManager);
      _isolate_helper.global.onmessage = func;
      _isolate_helper.global.dartPrint = _isolate_helper.global.dartPrint || (function(serialize) {
        return function(object) {
          var _self = _isolate_helper.global;
          if (_self.console && _self.console.log) {
            _self.console.log(object);
          } else {
            _self.postMessage(serialize(object));
          }
        };
      })(_isolate_helper._Manager._serializePrintMessage);
    }
    static _serializePrintMessage(object) {
      return _isolate_helper._serializeMessage(dart.map({command: "print", msg: object}, core.String, dart.dynamic));
    }
    maybeCloseWorker() {
      if (dart.test(this.isWorker) && dart.test(this.isolates[dartx.isEmpty]) && this.topEventLoop[_activeJsAsyncCount] == 0) {
        this.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'close'}, core.String, core.String)));
      }
    }
  };
  dart.setSignature(_isolate_helper._Manager, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Manager, [core.Function])}),
    fields: () => ({
      nextIsolateId: core.int,
      currentManagerId: core.int,
      nextManagerId: core.int,
      currentContext: _isolate_helper._IsolateContext,
      rootContext: _isolate_helper._IsolateContext,
      topEventLoop: _isolate_helper._EventLoop,
      fromCommandLine: core.bool,
      isWorker: core.bool,
      supportsWorkers: core.bool,
      isolates: MapOfint$_IsolateContext(),
      mainManager: _isolate_helper._MainManagerStub,
      managers: MapOfint$dynamic(),
      entry: core.Function
    }),
    getters: () => ({useWorkers: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      [_nativeDetectEnvironment]: dart.definiteFunctionType(dart.void, []),
      [_nativeInitWorkerMessageHandler]: dart.definiteFunctionType(dart.void, []),
      maybeCloseWorker: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({_serializePrintMessage: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_serializePrintMessage']
  });
  const _scheduledControlEvents = Symbol('_scheduledControlEvents');
  const _isExecutingEvent = Symbol('_isExecutingEvent');
  const _id = Symbol('_id');
  const _updateGlobalState = Symbol('_updateGlobalState');
  const _setGlobals = Symbol('_setGlobals');
  const _addRegistration = Symbol('_addRegistration');
  const _close = Symbol('_close');
  _isolate_helper._IsolateContext = class _IsolateContext extends core.Object {
    new() {
      this.id = (() => {
        let o = _isolate_helper._globalState, x = o.nextIsolateId;
        o.nextIsolateId = dart.notNull(x) + 1;
        return x;
      })();
      this.ports = MapOfint$RawReceivePortImpl().new();
      this.weakPorts = SetOfint().new();
      this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
      this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
      this.pauseCapability = isolate.Capability.new();
      this.terminateCapability = isolate.Capability.new();
      this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
      this.pauseTokens = SetOfCapability().new();
      this.errorPorts = SetOfSendPort().new();
      this.initialized = false;
      this.isPaused = false;
      this.doneHandlers = null;
      this[_scheduledControlEvents] = null;
      this[_isExecutingEvent] = false;
      this.errorsAreFatal = true;
      this.registerWeak(this.controlPort[_id], this.controlPort);
    }
    addPause(authentification, resume) {
      if (!dart.equals(this.pauseCapability, authentification)) return;
      if (dart.test(this.pauseTokens.add(resume)) && !dart.test(this.isPaused)) {
        this.isPaused = true;
      }
      this[_updateGlobalState]();
    }
    removePause(resume) {
      if (!dart.test(this.isPaused)) return;
      this.pauseTokens.remove(resume);
      if (dart.test(this.pauseTokens.isEmpty)) {
        while (dart.test(this.delayedEvents[dartx.isNotEmpty])) {
          let event = this.delayedEvents[dartx.removeLast]();
          _isolate_helper._globalState.topEventLoop.prequeue(event);
        }
        this.isPaused = false;
      }
      this[_updateGlobalState]();
    }
    addDoneListener(responsePort) {
      if (this.doneHandlers == null) {
        this.doneHandlers = [];
      }
      if (dart.test(dart.dsend(this.doneHandlers, 'contains', responsePort))) return;
      dart.dsend(this.doneHandlers, 'add', responsePort);
    }
    removeDoneListener(responsePort) {
      if (this.doneHandlers == null) return;
      dart.dsend(this.doneHandlers, 'remove', responsePort);
    }
    setErrorsFatal(authentification, errorsAreFatal) {
      if (!dart.equals(this.terminateCapability, authentification)) return;
      this.errorsAreFatal = errorsAreFatal;
    }
    handlePing(responsePort, pingType) {
      if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
        responsePort.send(null);
        return;
      }
      function respond() {
        responsePort.send(null);
      }
      dart.fn(respond, VoidTovoid$());
      if (pingType == isolate.Isolate.AS_EVENT) {
        _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
        return;
      }
      dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
      if (this[_scheduledControlEvents] == null) {
        this[_scheduledControlEvents] = collection.Queue.new();
      }
      dart.dsend(this[_scheduledControlEvents], 'addLast', respond);
    }
    handleKill(authentification, priority) {
      if (!dart.equals(this.terminateCapability, authentification)) return;
      if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
        this.kill();
        return;
      }
      if (priority == isolate.Isolate.AS_EVENT) {
        _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
        return;
      }
      dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
      if (this[_scheduledControlEvents] == null) {
        this[_scheduledControlEvents] = collection.Queue.new();
      }
      dart.dsend(this[_scheduledControlEvents], 'addLast', dart.bind(this, 'kill'));
    }
    addErrorListener(port) {
      this.errorPorts.add(port);
    }
    removeErrorListener(port) {
      this.errorPorts.remove(port);
    }
    handleUncaughtError(error, stackTrace) {
      if (dart.test(this.errorPorts.isEmpty)) {
        if (dart.test(this.errorsAreFatal) && core.identical(this, _isolate_helper._globalState.rootContext)) {
          return;
        }
        if (_isolate_helper.global.console && _isolate_helper.global.console.error) {
          _isolate_helper.global.console.error(error, stackTrace);
        } else {
          core.print(error);
          if (stackTrace != null) core.print(stackTrace);
        }
        return;
      }
      let message = core.List.new(2);
      message[dartx._set](0, dart.toString(error));
      message[dartx._set](1, stackTrace == null ? null : dart.toString(stackTrace));
      for (let port of this.errorPorts)
        port.send(message);
    }
    eval(code) {
      let old = _isolate_helper._globalState.currentContext;
      _isolate_helper._globalState.currentContext = this;
      this[_setGlobals]();
      let result = null;
      this[_isExecutingEvent] = true;
      try {
        result = dart.dcall(code);
      } catch (e) {
        let s = dart.stackTrace(e);
        this.handleUncaughtError(e, s);
        if (dart.test(this.errorsAreFatal)) {
          this.kill();
          if (core.identical(this, _isolate_helper._globalState.rootContext)) {
            throw e;
          }
        }
      }
 finally {
        this[_isExecutingEvent] = false;
        _isolate_helper._globalState.currentContext = old;
        if (old != null) old[_setGlobals]();
        if (this[_scheduledControlEvents] != null) {
          while (dart.test(dart.dload(this[_scheduledControlEvents], 'isNotEmpty'))) {
            dart.dcall(dart.dsend(this[_scheduledControlEvents], 'removeFirst'));
          }
        }
      }
      return result;
    }
    [_setGlobals]() {
      _foreign_helper.JS_SET_CURRENT_ISOLATE(this.isolateStatics);
    }
    handleControlMessage(message) {
      switch (dart.dindex(message, 0)) {
        case "pause":
        {
          this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
          break;
        }
        case "resume":
        {
          this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
          break;
        }
        case 'add-ondone':
        {
          this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        case 'remove-ondone':
        {
          this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        case 'set-errors-fatal':
        {
          this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
          break;
        }
        case "ping":
        {
          this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
          break;
        }
        case "kill":
        {
          this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
          break;
        }
        case "getErrors":
        {
          this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        case "stopErrors":
        {
          this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        default:
      }
    }
    lookup(portId) {
      return this.ports[dartx._get](portId);
    }
    [_addRegistration](portId, port) {
      if (dart.test(this.ports[dartx.containsKey](portId))) {
        dart.throw(core.Exception.new("Registry: ports must be registered only once."));
      }
      this.ports[dartx._set](portId, port);
    }
    register(portId, port) {
      this[_addRegistration](portId, port);
      this[_updateGlobalState]();
    }
    registerWeak(portId, port) {
      this.weakPorts.add(portId);
      this[_addRegistration](portId, port);
    }
    [_updateGlobalState]() {
      if (dart.notNull(this.ports[dartx.length]) - dart.notNull(this.weakPorts.length) > 0 || dart.test(this.isPaused) || !dart.test(this.initialized)) {
        _isolate_helper._globalState.isolates[dartx._set](this.id, this);
      } else {
        this.kill();
      }
    }
    kill() {
      if (this[_scheduledControlEvents] != null) {
        dart.dsend(this[_scheduledControlEvents], 'clear');
      }
      for (let port of this.ports[dartx.values]) {
        port[_close]();
      }
      this.ports[dartx.clear]();
      this.weakPorts.clear();
      _isolate_helper._globalState.isolates[dartx.remove](this.id);
      this.errorPorts.clear();
      if (this.doneHandlers != null) {
        for (let port of core.Iterable._check(this.doneHandlers)) {
          isolate.SendPort._check(port);
          port.send(null);
        }
        this.doneHandlers = null;
      }
    }
    unregister(portId) {
      this.ports[dartx.remove](portId);
      this.weakPorts.remove(portId);
      this[_updateGlobalState]();
    }
  };
  _isolate_helper._IsolateContext[dart.implements] = () => [_foreign_helper.IsolateContext];
  dart.setSignature(_isolate_helper._IsolateContext, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateContext, [])}),
    fields: () => ({
      id: core.int,
      ports: MapOfint$RawReceivePortImpl(),
      weakPorts: SetOfint(),
      isolateStatics: dart.dynamic,
      controlPort: _isolate_helper.RawReceivePortImpl,
      pauseCapability: isolate.Capability,
      terminateCapability: isolate.Capability,
      initialized: core.bool,
      isPaused: core.bool,
      delayedEvents: ListOf_IsolateEvent(),
      pauseTokens: SetOfCapability(),
      doneHandlers: dart.dynamic,
      [_scheduledControlEvents]: dart.dynamic,
      [_isExecutingEvent]: core.bool,
      errorsAreFatal: core.bool,
      errorPorts: SetOfSendPort()
    }),
    methods: () => ({
      addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
      removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
      addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
      handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
      handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
      eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
      [_setGlobals]: dart.definiteFunctionType(dart.void, []),
      handleControlMessage: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      lookup: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.int]),
      [_addRegistration]: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
      register: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
      registerWeak: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
      [_updateGlobalState]: dart.definiteFunctionType(dart.void, []),
      kill: dart.definiteFunctionType(dart.void, []),
      unregister: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  const _runHelper = Symbol('_runHelper');
  _isolate_helper._EventLoop = class _EventLoop extends core.Object {
    new() {
      this.events = QueueOf_IsolateEvent().new();
      this[_activeJsAsyncCount] = 0;
    }
    enqueue(isolate, fn, msg) {
      this.events.addLast(new _isolate_helper._IsolateEvent(_isolate_helper._IsolateContext._check(isolate), core.Function._check(fn), core.String._check(msg)));
    }
    prequeue(event) {
      this.events.addFirst(event);
    }
    dequeue() {
      if (dart.test(this.events.isEmpty)) return null;
      return this.events.removeFirst();
    }
    checkOpenReceivePortsFromCommandLine() {
      if (_isolate_helper._globalState.rootContext != null && dart.test(_isolate_helper._globalState.isolates[dartx.containsKey](_isolate_helper._globalState.rootContext.id)) && dart.test(_isolate_helper._globalState.fromCommandLine) && dart.test(_isolate_helper._globalState.rootContext.ports[dartx.isEmpty])) {
        dart.throw(core.Exception.new("Program exited with open ReceivePorts."));
      }
    }
    runIteration() {
      let event = this.dequeue();
      if (event == null) {
        this.checkOpenReceivePortsFromCommandLine();
        _isolate_helper._globalState.maybeCloseWorker();
        return false;
      }
      event.process();
      return true;
    }
    [_runHelper]() {
      if (_isolate_helper.globalWindow != null) {
        const next = (function() {
          if (!dart.test(this.runIteration())) return;
          async.Timer.run(next);
        }).bind(this);
        dart.fn(next, VoidTodynamic$());
        next();
      } else {
        while (dart.test(this.runIteration())) {
        }
      }
    }
    run() {
      if (!dart.test(_isolate_helper._globalState.isWorker)) {
        this[_runHelper]();
      } else {
        try {
          this[_runHelper]();
        } catch (e) {
          let trace = dart.stackTrace(e);
          _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'error', msg: dart.str`${e}\n${trace}`}, core.String, core.String)));
        }

      }
    }
  };
  dart.setSignature(_isolate_helper._EventLoop, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._EventLoop, [])}),
    fields: () => ({
      events: QueueOf_IsolateEvent(),
      [_activeJsAsyncCount]: core.int
    }),
    methods: () => ({
      enqueue: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      prequeue: dart.definiteFunctionType(dart.void, [_isolate_helper._IsolateEvent]),
      dequeue: dart.definiteFunctionType(_isolate_helper._IsolateEvent, []),
      checkOpenReceivePortsFromCommandLine: dart.definiteFunctionType(dart.void, []),
      runIteration: dart.definiteFunctionType(core.bool, []),
      [_runHelper]: dart.definiteFunctionType(dart.void, []),
      run: dart.definiteFunctionType(dart.void, [])
    })
  });
  _isolate_helper._IsolateEvent = class _IsolateEvent extends core.Object {
    new(isolate, fn, message) {
      this.isolate = isolate;
      this.fn = fn;
      this.message = message;
    }
    process() {
      if (dart.test(this.isolate.isPaused)) {
        this.isolate.delayedEvents[dartx.add](this);
        return;
      }
      this.isolate.eval(this.fn);
    }
  };
  dart.setSignature(_isolate_helper._IsolateEvent, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateEvent, [_isolate_helper._IsolateContext, core.Function, core.String])}),
    fields: () => ({
      isolate: _isolate_helper._IsolateContext,
      fn: core.Function,
      message: core.String
    }),
    methods: () => ({process: dart.definiteFunctionType(dart.void, [])})
  });
  dart.defineLazy(_isolate_helper, {
    get global() {
      return typeof global == 'undefined' ? self : global;
    }
  });
  _isolate_helper._MainManagerStub = class _MainManagerStub extends core.Object {
    postMessage(msg) {
      _isolate_helper.global.postMessage(msg);
    }
  };
  dart.setSignature(_isolate_helper._MainManagerStub, {
    methods: () => ({postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  _isolate_helper._SPAWNED_SIGNAL = "spawned";
  _isolate_helper._SPAWN_FAILED_SIGNAL = "spawn failed";
  dart.copyProperties(_isolate_helper, {
    get globalWindow() {
      return _isolate_helper.global.window;
    }
  });
  dart.copyProperties(_isolate_helper, {
    get globalWorker() {
      return _isolate_helper.global.Worker;
    }
  });
  dart.copyProperties(_isolate_helper, {
    get globalPostMessageDefined() {
      return !!_isolate_helper.global.postMessage;
    }
  });
  _isolate_helper._MainFunction = dart.typedef('_MainFunction', () => dart.functionType(dart.dynamic, []));
  _isolate_helper._MainFunctionArgs = dart.typedef('_MainFunctionArgs', () => dart.functionType(dart.dynamic, [dart.dynamic]));
  _isolate_helper._MainFunctionArgsMessage = dart.typedef('_MainFunctionArgsMessage', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
  _isolate_helper.IsolateNatives = class IsolateNatives extends core.Object {
    static computeThisScript() {
      let currentScript = document.currentScript;
      if (currentScript != null) {
        return String(currentScript.src);
      }
      if (dart.test(_js_helper.Primitives.isD8)) return _isolate_helper.IsolateNatives.computeThisScriptD8();
      if (dart.test(_js_helper.Primitives.isJsshell)) return _isolate_helper.IsolateNatives.computeThisScriptJsshell();
      if (_isolate_helper._globalState != null && dart.test(_isolate_helper._globalState.isWorker)) {
        return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
      }
      return null;
    }
    static computeThisScriptJsshell() {
      return thisFilename();
    }
    static computeThisScriptD8() {
      return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
    }
    static computeThisScriptFromTrace() {
      let stack = new Error().stack;
      if (stack == null) {
        stack = (function() {
          try {
            throw new Error();
          } catch (e) {
            return e.stack;
          }

        })();
        if (stack == null) dart.throw(new core.UnsupportedError('No stack trace'));
      }
      let pattern = null, matches = null;
      pattern = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m");
      matches = stack.match(pattern);
      if (matches != null) return matches[1];
      pattern = new RegExp("^[^@]*@(.*):[0-9]*$", "m");
      matches = stack.match(pattern);
      if (matches != null) return matches[1];
      dart.throw(new core.UnsupportedError(dart.str`Cannot extract URI from "${stack}"`));
    }
    static _getEventData(e) {
      return e.data;
    }
    static _processWorkerMessage(sender, e) {
      let msg = _isolate_helper._deserializeMessage(_isolate_helper.IsolateNatives._getEventData(e));
      switch (dart.dindex(msg, 'command')) {
        case 'start':
        {
          _isolate_helper._globalState.currentManagerId = core.int._check(dart.dindex(msg, 'id'));
          let functionName = core.String._check(dart.dindex(msg, 'functionName'));
          let entryPoint = core.Function._check(functionName == null ? _isolate_helper._globalState.entry : _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName));
          let args = dart.dindex(msg, 'args');
          let message = _isolate_helper._deserializeMessage(dart.dindex(msg, 'msg'));
          let isSpawnUri = dart.dindex(msg, 'isSpawnUri');
          let startPaused = dart.dindex(msg, 'startPaused');
          let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
          let context = new _isolate_helper._IsolateContext();
          _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
          }, VoidTodynamic$()), 'worker-start');
          _isolate_helper._globalState.currentContext = context;
          _isolate_helper._globalState.topEventLoop.run();
          break;
        }
        case 'spawn-worker':
        {
          if (_isolate_helper.IsolateNatives.enableSpawnWorker != null) _isolate_helper.IsolateNatives.handleSpawnWorkerRequest(msg);
          break;
        }
        case 'message':
        {
          let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
          if (port != null) {
            dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
          }
          _isolate_helper._globalState.topEventLoop.run();
          break;
        }
        case 'close':
        {
          _isolate_helper._globalState.managers[dartx.remove](_isolate_helper.IsolateNatives.workerIds._get(sender));
          sender.terminate();
          _isolate_helper._globalState.topEventLoop.run();
          break;
        }
        case 'log':
        {
          _isolate_helper.IsolateNatives._log(dart.dindex(msg, 'msg'));
          break;
        }
        case 'print':
        {
          if (dart.test(_isolate_helper._globalState.isWorker)) {
            _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'print', msg: msg}, core.String, dart.dynamic)));
          } else {
            core.print(dart.dindex(msg, 'msg'));
          }
          break;
        }
        case 'error':
        {
          dart.throw(dart.dindex(msg, 'msg'));
        }
      }
    }
    static handleSpawnWorkerRequest(msg) {
      let replyPort = dart.dindex(msg, 'replyPort');
      _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
        dart.dsend(replyPort, 'send', msg);
      }, ListTodynamic()), {onError: dart.fn(errorMessage => {
          dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
        }, StringTodynamic())});
    }
    static _log(msg) {
      if (dart.test(_isolate_helper._globalState.isWorker)) {
        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'log', msg: msg}, core.String, dart.dynamic)));
      } else {
        try {
          _isolate_helper.IsolateNatives._consoleLog(msg);
        } catch (e) {
          let trace = dart.stackTrace(e);
          dart.throw(core.Exception.new(trace));
        }

      }
    }
    static _consoleLog(msg) {
      _isolate_helper.global.console.log(msg);
    }
    static _getJSFunctionFromName(functionName) {
      let globalFunctionsContainer = _foreign_helper.JS_EMBEDDED_GLOBAL("", _js_embedded_names.GLOBAL_FUNCTIONS);
      return globalFunctionsContainer[functionName]();
    }
    static _getJSFunctionName(f) {
      return f.$name;
    }
    static _allocate(ctor) {
      return new ctor();
    }
    static spawnFunction(topLevelFunction, message, startPaused) {
      _isolate_helper.IsolateNatives.enableSpawnWorker = true;
      let name = _isolate_helper.IsolateNatives._getJSFunctionName(topLevelFunction);
      if (name == null) {
        dart.throw(new core.UnsupportedError("only top-level functions can be spawned."));
      }
      let isLight = false;
      let isSpawnUri = false;
      return _isolate_helper.IsolateNatives.spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
    }
    static spawnUri(uri, args, message, startPaused) {
      _isolate_helper.IsolateNatives.enableSpawnWorker = true;
      let isLight = false;
      let isSpawnUri = true;
      return _isolate_helper.IsolateNatives.spawn(null, dart.toString(uri), args, message, isLight, isSpawnUri, startPaused);
    }
    static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
      if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
        uri = dart.notNull(uri) + ".js";
      }
      let port = isolate.ReceivePort.new();
      let completer = CompleterOfList().new();
      port.first.then(dart.dynamic)(dart.fn(msg => {
        if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
          completer.complete(msg);
        } else {
          dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
          completer.completeError(dart.dindex(msg, 1));
        }
      }, dynamicTodynamic$()));
      let signalReply = port.sendPort;
      if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
        _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
      } else {
        _isolate_helper.IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
      }
      return completer.future;
    }
    static _startWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
      if (args != null) args = ListOfString().from(args);
      if (dart.test(_isolate_helper._globalState.isWorker)) {
        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'spawn-worker', functionName: functionName, args: args, msg: message, uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort}, core.String, core.Object)));
      } else {
        _isolate_helper.IsolateNatives._spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError);
      }
    }
    static _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
      if (uri != null) {
        dart.throw(new core.UnsupportedError("Currently spawnUri is not supported without web workers."));
      }
      message = _isolate_helper._clone(message);
      if (args != null) args = ListOfString().from(args);
      _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
        let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
        _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
      }, VoidTodynamic$()), 'nonworker start');
    }
    static get currentIsolate() {
      let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
      return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
    }
    static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
      let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
      _js_helper.Primitives.initializeStatics(context.id);
      replyTo.send(JSArrayOfObject().of([_isolate_helper._SPAWNED_SIGNAL, context.controlPort.sendPort, context.pauseCapability, context.terminateCapability]));
      function runStartFunction() {
        context.initialized = true;
        if (!dart.test(isSpawnUri)) {
          dart.dcall(topLevel, message);
        } else if (_isolate_helper._MainFunctionArgsMessage.is(topLevel)) {
          dart.dcall(topLevel, args, message);
        } else if (_isolate_helper._MainFunctionArgs.is(topLevel)) {
          dart.dcall(topLevel, args);
        } else {
          dart.dcall(topLevel);
        }
      }
      dart.fn(runStartFunction, VoidTovoid$());
      if (dart.test(startPaused)) {
        context.addPause(context.pauseCapability, context.pauseCapability);
        _isolate_helper._globalState.topEventLoop.enqueue(context, runStartFunction, 'start isolate');
      } else {
        runStartFunction();
      }
    }
    static _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
      if (uri == null) uri = _isolate_helper.IsolateNatives.thisScript;
      let worker = new Worker(uri);
      let onerrorTrampoline = (function(f, u, c) {
        return function(e) {
          return f(e, u, c);
        };
      })(_isolate_helper.IsolateNatives.workerOnError, uri, onError);
      worker.onerror = onerrorTrampoline;
      let processWorkerMessageTrampoline = (function(f, a) {
        return function(e) {
          e.onerror = null;
          return f(a, e);
        };
      })(_isolate_helper.IsolateNatives._processWorkerMessage, worker);
      worker.onmessage = processWorkerMessageTrampoline;
      let o = _isolate_helper._globalState;
      let workerId = o.nextManagerId;
      o.nextManagerId = dart.notNull(workerId) + 1;
      _isolate_helper.IsolateNatives.workerIds._set(worker, workerId);
      _isolate_helper._globalState.managers[dartx._set](workerId, worker);
      worker.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'start', id: workerId, replyTo: _isolate_helper._serializeMessage(replyPort), args: args, msg: _isolate_helper._serializeMessage(message), isSpawnUri: isSpawnUri, startPaused: startPaused, functionName: functionName}, core.String, core.Object)));
    }
    static workerOnError(event, uri, onError) {
      event.preventDefault();
      let message = event.message;
      if (message == null) {
        message = dart.str`Error spawning worker for ${uri}`;
      } else {
        message = dart.str`Error spawning worker for ${uri} (${message})`;
      }
      onError(message);
      return true;
    }
  };
  dart.setSignature(_isolate_helper.IsolateNatives, {
    sfields: () => ({
      enableSpawnWorker: dart.dynamic,
      thisScript: core.String,
      workerIds: ExpandoOfint()
    }),
    sgetters: () => ({currentIsolate: dart.definiteFunctionType(isolate.Isolate, [])}),
    statics: () => ({
      computeThisScript: dart.definiteFunctionType(core.String, []),
      computeThisScriptJsshell: dart.definiteFunctionType(core.String, []),
      computeThisScriptD8: dart.definiteFunctionType(core.String, []),
      computeThisScriptFromTrace: dart.definiteFunctionType(core.String, []),
      _getEventData: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _processWorkerMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      handleSpawnWorkerRequest: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _log: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _consoleLog: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      _getJSFunctionFromName: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _getJSFunctionName: dart.definiteFunctionType(core.String, [core.Function]),
      _allocate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
      spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
      spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
      workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
    }),
    names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
  });
  _isolate_helper.IsolateNatives.enableSpawnWorker = null;
  dart.defineLazy(_isolate_helper.IsolateNatives, {
    get thisScript() {
      return _isolate_helper.IsolateNatives.computeThisScript();
    },
    set thisScript(_) {},
    get workerIds() {
      return new (ExpandoOfint())();
    }
  });
  const _isolateId = Symbol('_isolateId');
  const _checkReplyTo = Symbol('_checkReplyTo');
  _isolate_helper._BaseSendPort = class _BaseSendPort extends core.Object {
    new(isolateId) {
      this[_isolateId] = isolateId;
    }
    [_checkReplyTo](replyTo) {
      if (replyTo != null && !_isolate_helper._NativeJsSendPort.is(replyTo) && !_isolate_helper._WorkerSendPort.is(replyTo)) {
        dart.throw(core.Exception.new("SendPort.send: Illegal replyTo port type"));
      }
    }
  };
  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
  dart.setSignature(_isolate_helper._BaseSendPort, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._BaseSendPort, [core.int])}),
    fields: () => ({[_isolateId]: core.int}),
    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
  });
  const _receivePort = Symbol('_receivePort');
  const _isClosed = Symbol('_isClosed');
  const _add = Symbol('_add');
  _isolate_helper._NativeJsSendPort = class _NativeJsSendPort extends _isolate_helper._BaseSendPort {
    new(receivePort, isolateId) {
      this[_receivePort] = receivePort;
      super.new(isolateId);
    }
    send(message) {
      let isolate = _isolate_helper._globalState.isolates[dartx._get](this[_isolateId]);
      if (isolate == null) return;
      if (dart.test(this[_receivePort][_isClosed])) return;
      let msg = _isolate_helper._clone(message);
      if (dart.equals(isolate.controlPort, this[_receivePort])) {
        isolate.handleControlMessage(msg);
        return;
      }
      _isolate_helper._globalState.topEventLoop.enqueue(isolate, dart.fn(() => {
        if (!dart.test(this[_receivePort][_isClosed])) {
          this[_receivePort][_add](msg);
        }
      }, VoidTodynamic$()), dart.str`receive ${message}`);
    }
    ['=='](other) {
      return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
    }
    get hashCode() {
      return this[_receivePort][_id];
    }
  };
  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
  dart.setSignature(_isolate_helper._NativeJsSendPort, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._NativeJsSendPort, [_isolate_helper.RawReceivePortImpl, core.int])}),
    fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
    methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  const _workerId = Symbol('_workerId');
  const _receivePortId = Symbol('_receivePortId');
  _isolate_helper._WorkerSendPort = class _WorkerSendPort extends _isolate_helper._BaseSendPort {
    new(workerId, isolateId, receivePortId) {
      this[_workerId] = workerId;
      this[_receivePortId] = receivePortId;
      super.new(isolateId);
    }
    send(message) {
      let workerMessage = _isolate_helper._serializeMessage(dart.map({command: 'message', port: this, msg: message}, core.String, core.Object));
      if (dart.test(_isolate_helper._globalState.isWorker)) {
        _isolate_helper._globalState.mainManager.postMessage(workerMessage);
      } else {
        let manager = _isolate_helper._globalState.managers[dartx._get](this[_workerId]);
        if (manager != null) {
          manager.postMessage(workerMessage);
        }
      }
    }
    ['=='](other) {
      return _isolate_helper._WorkerSendPort.is(other) && this[_workerId] == other[_workerId] && this[_isolateId] == other[_isolateId] && this[_receivePortId] == other[_receivePortId];
    }
    get hashCode() {
      return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
    }
  };
  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
  dart.setSignature(_isolate_helper._WorkerSendPort, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._WorkerSendPort, [core.int, core.int, core.int])}),
    fields: () => ({
      [_workerId]: core.int,
      [_receivePortId]: core.int
    }),
    methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  const _handler = Symbol('_handler');
  _isolate_helper.RawReceivePortImpl = class RawReceivePortImpl extends core.Object {
    new(handler) {
      this[_handler] = handler;
      this[_id] = (() => {
        let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
        _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
        return x;
      })();
      this[_isClosed] = false;
      _isolate_helper._globalState.currentContext.register(this[_id], this);
    }
    weak(handler) {
      this[_handler] = handler;
      this[_id] = (() => {
        let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
        _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
        return x;
      })();
      this[_isClosed] = false;
      _isolate_helper._globalState.currentContext.registerWeak(this[_id], this);
    }
    _controlPort() {
      this[_handler] = null;
      this[_id] = 0;
      this[_isClosed] = false;
    }
    set handler(newHandler) {
      this[_handler] = newHandler;
    }
    [_close]() {
      this[_isClosed] = true;
      this[_handler] = null;
    }
    close() {
      if (dart.test(this[_isClosed])) return;
      this[_isClosed] = true;
      this[_handler] = null;
      _isolate_helper._globalState.currentContext.unregister(this[_id]);
    }
    [_add](dataEvent) {
      if (dart.test(this[_isClosed])) return;
      dart.dcall(this[_handler], dataEvent);
    }
    get sendPort() {
      return new _isolate_helper._NativeJsSendPort(this, _isolate_helper._globalState.currentContext.id);
    }
  };
  dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
  dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
  dart.setSignature(_isolate_helper.RawReceivePortImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
      weak: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
      _controlPort: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [])
    }),
    fields: () => ({
      [_id]: core.int,
      [_handler]: core.Function,
      [_isClosed]: core.bool
    }),
    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
    setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
    methods: () => ({
      [_close]: dart.definiteFunctionType(dart.void, []),
      close: dart.definiteFunctionType(dart.void, []),
      [_add]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({_nextFreeId: core.int})
  });
  _isolate_helper.RawReceivePortImpl._nextFreeId = 1;
  const _rawPort = Symbol('_rawPort');
  const _controller = Symbol('_controller');
  const _add$ = Symbol('_add');
  const _closeUnchecked = Symbol('_closeUnchecked');
  const _addError = Symbol('_addError');
  const _completeError = Symbol('_completeError');
  const _complete = Symbol('_complete');
  const _sink = Symbol('_sink');
  async.Stream$ = dart.generic(T => {
    let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
    let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
    let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
    let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
    let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
    let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
    let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
    let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    let _FutureOfListOfT = () => (_FutureOfListOfT = dart.constFn(async._Future$(ListOfT())))();
    let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
    let _FutureOfSetOfT = () => (_FutureOfSetOfT = dart.constFn(async._Future$(SetOfT())))();
    let _TakeStreamOfT = () => (_TakeStreamOfT = dart.constFn(async._TakeStream$(T)))();
    let _TakeWhileStreamOfT = () => (_TakeWhileStreamOfT = dart.constFn(async._TakeWhileStream$(T)))();
    let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
    let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
    let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
    let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
    let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
    let IterableOfFutureOfT = () => (IterableOfFutureOfT = dart.constFn(core.Iterable$(FutureOfT())))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
    let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
    let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
    let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
    class Stream extends core.Object {
      new() {
      }
      _internal() {
      }
      static empty() {
        return new (_EmptyStreamOfT())();
      }
      static fromFuture(future) {
        let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
        future.then(dart.dynamic)(dart.fn(value => {
          controller[_add$](value);
          controller[_closeUnchecked]();
        }, TTodynamic$()), {onError: dart.fn((error, stackTrace) => {
            controller[_addError](error, core.StackTrace._check(stackTrace));
            controller[_closeUnchecked]();
          }, dynamicAnddynamicTodynamic$())});
        return controller.stream;
      }
      static fromFutures(futures) {
        let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
        let count = 0;
        let onValue = dart.fn(value => {
          if (!dart.test(controller.isClosed)) {
            controller[_add$](value);
            if (--count == 0) controller[_closeUnchecked]();
          }
        }, TTodynamic$());
        let onError = dart.fn((error, stack) => {
          if (!dart.test(controller.isClosed)) {
            controller[_addError](error, core.StackTrace._check(stack));
            if (--count == 0) controller[_closeUnchecked]();
          }
        }, dynamicAnddynamicTodynamic$());
        for (let future of futures) {
          count++;
          future.then(dart.dynamic)(onValue, {onError: onError});
        }
        if (count == 0) async.scheduleMicrotask(dart.bind(controller, 'close'));
        return controller.stream;
      }
      static fromIterable(data) {
        return new (_GeneratedStreamImplOfT())(dart.fn(() => new (_IterablePendingEventsOfT())(data), VoidTo_IterablePendingEventsOfT()));
      }
      static periodic(period, computation) {
        if (computation === void 0) computation = null;
        let timer = null;
        let computationCount = 0;
        let controller = null;
        let watch = new core.Stopwatch();
        function sendEvent() {
          watch.reset();
          let data = null;
          if (computation != null) {
            try {
              data = computation(computationCount++);
            } catch (e) {
              let s = dart.stackTrace(e);
              controller.addError(e, s);
              return;
            }

          }
          controller.add(data);
        }
        dart.fn(sendEvent, VoidTovoid$());
        function startPeriodicTimer() {
          dart.assert(timer == null);
          timer = async.Timer.periodic(period, dart.fn(timer => {
            sendEvent();
          }, TimerTovoid$()));
        }
        dart.fn(startPeriodicTimer, VoidTovoid$());
        controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
            watch.start();
            startPeriodicTimer();
          }, VoidTovoid$()), onPause: dart.fn(() => {
            timer.cancel();
            timer = null;
            watch.stop();
          }, VoidTovoid$()), onResume: dart.fn(() => {
            dart.assert(timer == null);
            let elapsed = watch.elapsed;
            watch.start();
            timer = async.Timer.new(period['-'](elapsed), dart.fn(() => {
              timer = null;
              startPeriodicTimer();
              sendEvent();
            }, VoidTovoid$()));
          }, VoidTovoid$()), onCancel: dart.fn(() => {
            if (timer != null) timer.cancel();
            timer = null;
          }, VoidTodynamic$())});
        return controller.stream;
      }
      static eventTransformed(source, mapSink) {
        return new (_BoundSinkStreamOfdynamic$T())(source, mapSink);
      }
      get isBroadcast() {
        return false;
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return new (_AsBroadcastStreamOfT())(this, onListen, onCancel);
      }
      where(test) {
        return new (_WhereStreamOfT())(this, test);
      }
      map(S) {
        return convert => {
          return new (async._MapStream$(T, S))(this, convert);
        };
      }
      asyncMap(E) {
        return convert => {
          let controller = null;
          let subscription = null;
          const onListen = (function() {
            let add = dart.bind(controller, 'add');
            dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
            let eventSink = async._EventSink$(E).as(controller);
            let addError = dart.bind(eventSink, _addError);
            subscription = this.listen(dart.fn(event => {
              let newValue = null;
              try {
                newValue = convert(event);
              } catch (e) {
                let s = dart.stackTrace(e);
                controller.addError(e, s);
                return;
              }

              if (async.Future.is(newValue)) {
                subscription.pause();
                newValue.then(dart.dynamic)(add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
              } else {
                controller.add(E.as(newValue));
              }
            }, TTovoid$()), {onError: addError, onDone: dart.bind(controller, 'close')});
          }).bind(this);
          dart.fn(onListen, VoidTovoid$());
          if (dart.test(this.isBroadcast)) {
            controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTovoid$()), sync: true});
          } else {
            controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                subscription.pause();
              }, VoidTovoid$()), onResume: dart.fn(() => {
                subscription.resume();
              }, VoidTovoid$()), onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTodynamic$()), sync: true});
          }
          return controller.stream;
        };
      }
      asyncExpand(E) {
        return convert => {
          let controller = null;
          let subscription = null;
          const onListen = (function() {
            dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
            let eventSink = async._EventSink$(E).as(controller);
            subscription = this.listen(dart.fn(event => {
              let newStream = null;
              try {
                newStream = convert(event);
              } catch (e) {
                let s = dart.stackTrace(e);
                controller.addError(e, s);
                return;
              }

              if (newStream != null) {
                subscription.pause();
                controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
              }
            }, TTovoid$()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
          }).bind(this);
          dart.fn(onListen, VoidTovoid$());
          if (dart.test(this.isBroadcast)) {
            controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTovoid$()), sync: true});
          } else {
            controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                subscription.pause();
              }, VoidTovoid$()), onResume: dart.fn(() => {
                subscription.resume();
              }, VoidTovoid$()), onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTodynamic$()), sync: true});
          }
          return controller.stream;
        };
      }
      handleError(onError, opts) {
        let test = opts && 'test' in opts ? opts.test : null;
        return new (_HandleErrorStreamOfT())(this, onError, test);
      }
      expand(S) {
        return convert => {
          return new (async._ExpandStream$(T, S))(this, convert);
        };
      }
      pipe(streamConsumer) {
        StreamConsumerOfT()._check(streamConsumer);
        return streamConsumer.addStream(this).then(dart.dynamic)(dart.fn(_ => streamConsumer.close(), dynamicToFuture()));
      }
      transform(S) {
        return streamTransformer => {
          async.StreamTransformer$(T, S)._check(streamTransformer);
          return streamTransformer.bind(this);
        };
      }
      reduce(combine) {
        TAndTToT()._check(combine);
        let result = new (_FutureOfT())();
        let seenFirst = false;
        let value = null;
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          if (seenFirst) {
            async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
              value = newValue;
            }, TTodynamic$()), async._cancelAndErrorClosure(subscription, result));
          } else {
            value = element;
            seenFirst = true;
          }
        }, TTovoid$()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
            if (!seenFirst) {
              try {
                dart.throw(_internal.IterableElementError.noElement());
              } catch (e) {
                let s = dart.stackTrace(e);
                async._completeWithErrorCallback(result, e, s);
              }

            } else {
              result[_complete](value);
            }
          }, VoidTovoid$()), cancelOnError: true});
        return result;
      }
      fold(S) {
        return (initialValue, combine) => {
          let result = new (async._Future$(S))();
          let value = initialValue;
          let subscription = null;
          subscription = this.listen(dart.fn(element => {
            async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
              value = newValue;
            }, dart.definiteFunctionType(dart.dynamic, [S])), async._cancelAndErrorClosure(subscription, result));
          }, TTovoid$()), {onError: dart.fn((e, st) => {
              result[_completeError](e, core.StackTrace._check(st));
            }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
              result[_complete](value);
            }, VoidTovoid$()), cancelOnError: true});
          return result;
        };
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let result = new (_FutureOfString())();
        let buffer = new core.StringBuffer();
        let subscription = null;
        let first = true;
        subscription = this.listen(dart.fn(element => {
          if (!first) {
            buffer.write(separator);
          }
          first = false;
          try {
            buffer.write(element);
          } catch (e) {
            let s = dart.stackTrace(e);
            async._cancelAndErrorWithReplacement(subscription, result, e, s);
          }

        }, TTovoid$()), {onError: dart.fn(e => {
            result[_completeError](e);
          }, dynamicTodynamic$()), onDone: dart.fn(() => {
            result[_complete](buffer.toString());
          }, VoidTovoid$()), cancelOnError: true});
        return result;
      }
      contains(needle) {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => dart.equals(element, needle), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, true);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](false);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      forEach(action) {
        let future = new async._Future();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
          }, dynamicTodynamic$()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](null);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      every(test) {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
            if (!dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, false);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](true);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      any(test) {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, true);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](false);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get length() {
        let future = new (_FutureOfint())();
        let count = 0;
        this.listen(dart.fn(_ => {
          count++;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](count);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get isEmpty() {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(_ => {
          async._cancelAndValue(subscription, future, false);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](true);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      toList() {
        let result = JSArrayOfT().of([]);
        let future = new (_FutureOfListOfT())();
        this.listen(dart.fn(data => {
          result[dartx.add](data);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](result);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      toSet() {
        let result = SetOfT().new();
        let future = new (_FutureOfSetOfT())();
        this.listen(dart.fn(data => {
          result.add(data);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](result);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      drain(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          return this.listen(null, {cancelOnError: true}).asFuture(E)(futureValue);
        };
      }
      take(count) {
        return new (_TakeStreamOfT())(this, count);
      }
      takeWhile(test) {
        return new (_TakeWhileStreamOfT())(this, test);
      }
      skip(count) {
        return new (_SkipStreamOfT())(this, count);
      }
      skipWhile(test) {
        return new (_SkipWhileStreamOfT())(this, test);
      }
      distinct(equals) {
        if (equals === void 0) equals = null;
        return new (_DistinctStreamOfT())(this, equals);
      }
      get first() {
        let future = new (_FutureOfT())();
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._cancelAndValue(subscription, future, value);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get last() {
        let future = new (_FutureOfT())();
        let result = null;
        let foundResult = false;
        this.listen(dart.fn(value => {
          foundResult = true;
          result = value;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get single() {
        let future = new (_FutureOfT())();
        let result = null;
        let foundResult = false;
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          if (foundResult) {
            try {
              dart.throw(_internal.IterableElementError.tooMany());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._cancelAndErrorWithReplacement(subscription, future, e, s);
            }

            return;
          }
          foundResult = true;
          result = value;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      firstWhere(test, opts) {
        let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
        let future = new async._Future();
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._runUserCode(dart.fn(() => test(value), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, value);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (defaultValue != null) {
              async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      lastWhere(test, opts) {
        let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
        let future = new async._Future();
        let result = null;
        let foundResult = false;
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              foundResult = true;
              result = value;
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            if (defaultValue != null) {
              async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      singleWhere(test) {
        let future = new (_FutureOfT())();
        let result = null;
        let foundResult = false;
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              if (foundResult) {
                try {
                  dart.throw(_internal.IterableElementError.tooMany());
                } catch (e) {
                  let s = dart.stackTrace(e);
                  async._cancelAndErrorWithReplacement(subscription, future, e, s);
                }

                return;
              }
              foundResult = true;
              result = value;
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      elementAt(index) {
        if (!(typeof index == 'number') || dart.notNull(index) < 0) dart.throw(new core.ArgumentError(index));
        let future = new (_FutureOfT())();
        let subscription = null;
        let elementIndex = 0;
        subscription = this.listen(dart.fn(value => {
          if (index == elementIndex) {
            async._cancelAndValue(subscription, future, value);
            return;
          }
          elementIndex = elementIndex + 1;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      timeout(timeLimit, opts) {
        let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
        let controller = null;
        let subscription = null;
        let timer = null;
        let zone = null;
        let timeout = null;
        function onData(event) {
          timer.cancel();
          controller.add(event);
          timer = zone.createTimer(timeLimit, timeout);
        }
        dart.fn(onData, TTovoid$());
        function onError(error, stackTrace) {
          timer.cancel();
          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
          let eventSink = controller;
          dart.dsend(eventSink, _addError, error, stackTrace);
          timer = zone.createTimer(timeLimit, timeout);
        }
        dart.fn(onError, dynamicAndStackTraceTovoid());
        function onDone() {
          timer.cancel();
          controller.close();
        }
        dart.fn(onDone, VoidTovoid$());
        const onListen = (function() {
          zone = async.Zone.current;
          if (onTimeout == null) {
            timeout = dart.fn(() => {
              controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
            }, VoidTovoid$());
          } else {
            let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
            let wrapper = new async._ControllerEventSinkWrapper(null);
            timeout = dart.fn(() => {
              wrapper[_sink] = controller;
              zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
              wrapper[_sink] = null;
            }, VoidTovoid$());
          }
          subscription = this.listen(onData, {onError: onError, onDone: onDone});
          timer = zone.createTimer(timeLimit, timeout);
        }).bind(this);
        dart.fn(onListen, VoidTovoid$());
        function onCancel() {
          timer.cancel();
          let result = subscription.cancel();
          subscription = null;
          return result;
        }
        dart.fn(onCancel, VoidToFuture());
        controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
          timer.cancel();
          subscription.pause();
        }, VoidTovoid$()), dart.fn(() => {
          subscription.resume();
          timer = zone.createTimer(timeLimit, timeout);
        }, VoidTovoid$()), onCancel);
        return controller.stream;
      }
    }
    dart.addTypeTests(Stream);
    dart.defineNamedConstructor(Stream, '_internal');
    dart.setSignature(Stream, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.Stream$(T), []),
        _internal: dart.definiteFunctionType(async.Stream$(T), []),
        empty: dart.definiteFunctionType(async.Stream$(T), []),
        fromFuture: dart.definiteFunctionType(async.Stream$(T), [FutureOfT()]),
        fromFutures: dart.definiteFunctionType(async.Stream$(T), [IterableOfFutureOfT()]),
        fromIterable: dart.definiteFunctionType(async.Stream$(T), [IterableOfT()]),
        periodic: dart.definiteFunctionType(async.Stream$(T), [core.Duration], [intToT()]),
        eventTransformed: dart.definiteFunctionType(async.Stream$(T), [async.Stream, EventSinkOfTToEventSink()])
      }),
      getters: () => ({
        isBroadcast: dart.definiteFunctionType(core.bool, []),
        length: dart.definiteFunctionType(async.Future$(core.int), []),
        isEmpty: dart.definiteFunctionType(async.Future$(core.bool), []),
        first: dart.definiteFunctionType(async.Future$(T), []),
        last: dart.definiteFunctionType(async.Future$(T), []),
        single: dart.definiteFunctionType(async.Future$(T), [])
      }),
      methods: () => ({
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        where: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
        map: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(S, [T])]]),
        asyncMap: dart.definiteFunctionType(E => [async.Stream$(E), [TTodynamic()]]),
        asyncExpand: dart.definiteFunctionType(E => [async.Stream$(E), [dart.functionType(async.Stream$(E), [T])]]),
        handleError: dart.definiteFunctionType(async.Stream$(T), [core.Function], {test: dynamicTobool()}),
        expand: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(core.Iterable$(S), [T])]]),
        pipe: dart.definiteFunctionType(async.Future, [StreamConsumerOfT()]),
        transform: dart.definiteFunctionType(S => [async.Stream$(S), [async.StreamTransformer$(T, S)]]),
        reduce: dart.definiteFunctionType(async.Future$(T), [TAndTToT()]),
        fold: dart.definiteFunctionType(S => [async.Future$(S), [S, dart.functionType(S, [S, T])]]),
        join: dart.definiteFunctionType(async.Future$(core.String), [], [core.String]),
        contains: dart.definiteFunctionType(async.Future$(core.bool), [core.Object]),
        forEach: dart.definiteFunctionType(async.Future, [TTovoid()]),
        every: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
        any: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
        toList: dart.definiteFunctionType(async.Future$(core.List$(T)), []),
        toSet: dart.definiteFunctionType(async.Future$(core.Set$(T)), []),
        drain: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
        take: dart.definiteFunctionType(async.Stream$(T), [core.int]),
        takeWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
        skip: dart.definiteFunctionType(async.Stream$(T), [core.int]),
        skipWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
        distinct: dart.definiteFunctionType(async.Stream$(T), [], [TAndTTobool()]),
        firstWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
        lastWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
        singleWhere: dart.definiteFunctionType(async.Future$(T), [TTobool()]),
        elementAt: dart.definiteFunctionType(async.Future$(T), [core.int]),
        timeout: dart.definiteFunctionType(async.Stream$(T), [core.Duration], {onTimeout: EventSinkOfTTovoid()})
      })
    });
    return Stream;
  });
  async.Stream = Stream();
  _isolate_helper.ReceivePortImpl = class ReceivePortImpl extends async.Stream {
    new() {
      ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl(null));
    }
    weak() {
      ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl.weak(null));
    }
    fromRawReceivePort(rawPort) {
      this[_rawPort] = rawPort;
      this[_controller] = null;
      super.new();
      this[_controller] = async.StreamController.new({onCancel: dart.bind(this, 'close'), sync: true});
      this[_rawPort].handler = dart.bind(this[_controller], 'add');
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    close() {
      this[_rawPort].close();
      this[_controller].close();
    }
    get sendPort() {
      return this[_rawPort].sendPort;
    }
  };
  dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
  dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
  dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
  dart.setSignature(_isolate_helper.ReceivePortImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
      weak: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
      fromRawReceivePort: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, [isolate.RawReceivePort])
    }),
    fields: () => ({
      [_rawPort]: isolate.RawReceivePort,
      [_controller]: async.StreamController
    }),
    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _once = Symbol('_once');
  const _inEventLoop = Symbol('_inEventLoop');
  const _handle = Symbol('_handle');
  _isolate_helper.TimerImpl = class TimerImpl extends core.Object {
    new(milliseconds, callback) {
      this[_once] = true;
      this[_inEventLoop] = false;
      this[_handle] = null;
      if (milliseconds == 0 && (!dart.test(_isolate_helper.hasTimer()) || dart.test(_isolate_helper._globalState.isWorker))) {
        const internalCallback = (function() {
          this[_handle] = null;
          callback();
        }).bind(this);
        dart.fn(internalCallback, VoidTovoid$());
        this[_handle] = 1;
        _isolate_helper._globalState.topEventLoop.enqueue(_isolate_helper._globalState.currentContext, internalCallback, 'timer');
        this[_inEventLoop] = true;
      } else if (dart.test(_isolate_helper.hasTimer())) {
        const internalCallback = (function() {
          this[_handle] = null;
          _isolate_helper.leaveJsAsync();
          callback();
        }).bind(this);
        dart.fn(internalCallback, VoidTovoid$());
        _isolate_helper.enterJsAsync();
        this[_handle] = _isolate_helper.global.setTimeout(internalCallback, milliseconds);
      } else {
        dart.assert(dart.notNull(milliseconds) > 0);
        dart.throw(new core.UnsupportedError("Timer greater than 0."));
      }
    }
    periodic(milliseconds, callback) {
      this[_once] = false;
      this[_inEventLoop] = false;
      this[_handle] = null;
      if (dart.test(_isolate_helper.hasTimer())) {
        _isolate_helper.enterJsAsync();
        this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
          callback(this);
        }, VoidTodynamic$()), milliseconds);
      } else {
        dart.throw(new core.UnsupportedError("Periodic timer."));
      }
    }
    cancel() {
      if (dart.test(_isolate_helper.hasTimer())) {
        if (dart.test(this[_inEventLoop])) {
          dart.throw(new core.UnsupportedError("Timer in event loop cannot be canceled."));
        }
        if (this[_handle] == null) return;
        _isolate_helper.leaveJsAsync();
        if (dart.test(this[_once])) {
          _isolate_helper.global.clearTimeout(this[_handle]);
        } else {
          _isolate_helper.global.clearInterval(this[_handle]);
        }
        this[_handle] = null;
      } else {
        dart.throw(new core.UnsupportedError("Canceling a timer."));
      }
    }
    get isActive() {
      return this[_handle] != null;
    }
  };
  dart.defineNamedConstructor(_isolate_helper.TimerImpl, 'periodic');
  _isolate_helper.TimerImpl[dart.implements] = () => [async.Timer];
  dart.setSignature(_isolate_helper.TimerImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, VoidTovoid()]),
      periodic: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, TimerTovoid()])
    }),
    fields: () => ({
      [_once]: core.bool,
      [_inEventLoop]: core.bool,
      [_handle]: core.int
    }),
    getters: () => ({isActive: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({cancel: dart.definiteFunctionType(dart.void, [])})
  });
  _isolate_helper.hasTimer = function() {
    return _isolate_helper.global.setTimeout != null;
  };
  dart.lazyFn(_isolate_helper.hasTimer, () => VoidTobool());
  _isolate_helper.CapabilityImpl = class CapabilityImpl extends core.Object {
    new() {
      CapabilityImpl.prototype._internal.call(this, _js_helper.random64());
    }
    _internal(id) {
      this[_id] = id;
    }
    get hashCode() {
      let hash = this[_id];
      hash = (hash[dartx['>>']](0) ^ (dart.notNull(hash) / 4294967296)[dartx.truncate]()) >>> 0;
      hash = ((~dart.notNull(hash) >>> 0) + (dart.notNull(hash) << 15 >>> 0) & 4294967295) >>> 0;
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](12)) >>> 0;
      hash = (dart.notNull(hash) * 5 & 4294967295) >>> 0;
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](4)) >>> 0;
      hash = (dart.notNull(hash) * 2057 & 4294967295) >>> 0;
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](16)) >>> 0;
      return hash;
    }
    ['=='](other) {
      if (core.identical(other, this)) return true;
      if (_isolate_helper.CapabilityImpl.is(other)) {
        return core.identical(this[_id], other[_id]);
      }
      return false;
    }
  };
  dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
  dart.setSignature(_isolate_helper.CapabilityImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, []),
      _internal: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, [core.int])
    }),
    fields: () => ({[_id]: core.int}),
    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
  });
  _isolate_helper._serializeMessage = function(message) {
    return new _isolate_helper._Serializer().serialize(message);
  };
  dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic$());
  _isolate_helper._deserializeMessage = function(message) {
    return new _isolate_helper._Deserializer().deserialize(message);
  };
  dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic$());
  _isolate_helper._clone = function(message) {
    let serializer = new _isolate_helper._Serializer({serializeSendPorts: false});
    let deserializer = new _isolate_helper._Deserializer();
    return deserializer.deserialize(serializer.serialize(message));
  };
  dart.fn(_isolate_helper._clone, dynamicTodynamic$());
  const _serializeSendPorts = Symbol('_serializeSendPorts');
  _isolate_helper._Serializer = class _Serializer extends core.Object {
    new(opts) {
      let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.serializeSendPorts : true;
      this.serializedObjectIds = MapOfdynamic$int().identity();
      this[_serializeSendPorts] = core.bool._check(serializeSendPorts);
    }
    serialize(x) {
      if (dart.test(this.isPrimitive(x))) return this.serializePrimitive(x);
      let serializationId = this.serializedObjectIds[dartx._get](x);
      if (serializationId != null) return this.makeRef(serializationId);
      serializationId = this.serializedObjectIds[dartx.length];
      this.serializedObjectIds[dartx._set](x, serializationId);
      if (_native_typed_data.NativeByteBuffer.is(x)) return this.serializeByteBuffer(x);
      if (_native_typed_data.NativeTypedData.is(x)) return this.serializeTypedData(x);
      if (_interceptors.JSIndexable.is(x)) return this.serializeJSIndexable(x);
      if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
      if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
      if (_interceptors.Interceptor.is(x)) this.unsupported(x);
      if (isolate.RawReceivePort.is(x)) {
        this.unsupported(x, "RawReceivePorts can't be transmitted:");
      }
      if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
      if (_isolate_helper._WorkerSendPort.is(x)) return this.serializeWorkerSendPort(x);
      if (core.Function.is(x)) return this.serializeClosure(x);
      return this.serializeDartObject(x);
    }
    unsupported(x, message) {
      if (message === void 0) message = null;
      if (message == null) message = "Can't transmit:";
      dart.throw(new core.UnsupportedError(dart.str`${message} ${x}`));
    }
    makeRef(serializationId) {
      return JSArrayOfObject().of(["ref", serializationId]);
    }
    isPrimitive(x) {
      return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
    }
    serializePrimitive(primitive) {
      return primitive;
    }
    serializeByteBuffer(buffer) {
      return JSArrayOfObject().of(["buffer", buffer]);
    }
    serializeTypedData(data) {
      return JSArrayOfObject().of(["typed", data]);
    }
    serializeJSIndexable(indexable) {
      dart.assert(!(typeof indexable == 'string'));
      let serialized = core.List._check(this.serializeArray(_interceptors.JSArray._check(indexable)));
      if (_interceptors.JSFixedArray.is(indexable)) return JSArrayOfObject().of(["fixed", serialized]);
      if (_interceptors.JSExtendableArray.is(indexable)) return JSArrayOfObject().of(["extendable", serialized]);
      if (_interceptors.JSMutableArray.is(indexable)) return JSArrayOfObject().of(["mutable", serialized]);
      if (_interceptors.JSArray.is(indexable)) return JSArrayOfObject().of(["const", serialized]);
      this.unsupported(indexable, "Can't serialize indexable: ");
      return null;
    }
    serializeArray(x) {
      let serialized = [];
      serialized[dartx.length] = x[dartx.length];
      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
        serialized[dartx._set](i, this.serialize(x[dartx._get](i)));
      }
      return serialized;
    }
    serializeArrayInPlace(x) {
      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
        x[dartx._set](i, this.serialize(x[dartx._get](i)));
      }
      return x;
    }
    serializeMap(x) {
      let serializeTearOff = dart.bind(this, 'serialize');
      return JSArrayOfObject().of(['map', x.keys[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList](), x.values[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList]()]);
    }
    serializeJSObject(x) {
      if (!!x.constructor && x.constructor !== Object) {
        this.unsupported(x, "Only plain JS Objects are supported:");
      }
      let keys = Object.keys(x);
      let values = [];
      values[dartx.length] = keys[dartx.length];
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        values[dartx._set](i, this.serialize(x[keys[dartx._get](i)]));
      }
      return JSArrayOfObject().of(['js-object', keys, values]);
    }
    serializeWorkerSendPort(x) {
      if (dart.test(this[_serializeSendPorts])) {
        return JSArrayOfObject().of(['sendport', x[_workerId], x[_isolateId], x[_receivePortId]]);
      }
      return JSArrayOfObject().of(['raw sendport', x]);
    }
    serializeJsSendPort(x) {
      if (dart.test(this[_serializeSendPorts])) {
        let workerId = _isolate_helper._globalState.currentManagerId;
        return JSArrayOfObject().of(['sendport', workerId, x[_isolateId], x[_receivePort][_id]]);
      }
      return JSArrayOfObject().of(['raw sendport', x]);
    }
    serializeCapability(x) {
      return JSArrayOfObject().of(['capability', x[_id]]);
    }
    serializeClosure(x) {
      let name = _isolate_helper.IsolateNatives._getJSFunctionName(x);
      if (name == null) {
        this.unsupported(x, "Closures can't be transmitted:");
      }
      return JSArrayOfString().of(['function', name]);
    }
    serializeDartObject(x) {
      let classExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_ID_EXTRACTOR);
      let fieldsExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_FIELDS_EXTRACTOR);
      let classId = classExtractor(x);
      let fields = fieldsExtractor(x);
      return ['dart', classId, this.serializeArrayInPlace(_interceptors.JSArray._check(fields))];
    }
  };
  dart.setSignature(_isolate_helper._Serializer, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Serializer, [], {serializeSendPorts: dart.dynamic})}),
    fields: () => ({
      [_serializeSendPorts]: core.bool,
      serializedObjectIds: MapOfdynamic$int()
    }),
    methods: () => ({
      serialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      unsupported: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
      makeRef: dart.definiteFunctionType(dart.dynamic, [core.int]),
      isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      serializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      serializeByteBuffer: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeByteBuffer]),
      serializeTypedData: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeTypedData]),
      serializeJSIndexable: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSIndexable]),
      serializeArray: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
      serializeArrayInPlace: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
      serializeMap: dart.definiteFunctionType(dart.dynamic, [_js_helper.InternalMap]),
      serializeJSObject: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSObject]),
      serializeWorkerSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._WorkerSendPort]),
      serializeJsSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._NativeJsSendPort]),
      serializeCapability: dart.definiteFunctionType(dart.dynamic, [_isolate_helper.CapabilityImpl]),
      serializeClosure: dart.definiteFunctionType(dart.dynamic, [core.Function]),
      serializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  const _adjustSendPorts = Symbol('_adjustSendPorts');
  _isolate_helper._Deserializer = class _Deserializer extends core.Object {
    new(opts) {
      let adjustSendPorts = opts && 'adjustSendPorts' in opts ? opts.adjustSendPorts : true;
      this.deserializedObjects = core.List.new();
      this[_adjustSendPorts] = core.bool._check(adjustSendPorts);
    }
    deserialize(x) {
      if (dart.test(this.isPrimitive(x))) return this.deserializePrimitive(x);
      if (!_interceptors.JSArray.is(x)) dart.throw(new core.ArgumentError(dart.str`Bad serialized message: ${x}`));
      switch (dart.dload(x, 'first')) {
        case "ref":
        {
          return this.deserializeRef(x);
        }
        case "buffer":
        {
          return this.deserializeByteBuffer(x);
        }
        case "typed":
        {
          return this.deserializeTypedData(x);
        }
        case "fixed":
        {
          return this.deserializeFixed(x);
        }
        case "extendable":
        {
          return this.deserializeExtendable(x);
        }
        case "mutable":
        {
          return this.deserializeMutable(x);
        }
        case "const":
        {
          return this.deserializeConst(x);
        }
        case "map":
        {
          return this.deserializeMap(_js_helper.InternalMap._check(x));
        }
        case "sendport":
        {
          return this.deserializeSendPort(x);
        }
        case "raw sendport":
        {
          return this.deserializeRawSendPort(x);
        }
        case "js-object":
        {
          return this.deserializeJSObject(x);
        }
        case "function":
        {
          return this.deserializeClosure(x);
        }
        case "dart":
        {
          return this.deserializeDartObject(x);
        }
        default:
        {
          dart.throw(dart.str`couldn't deserialize: ${x}`);
        }
      }
    }
    isPrimitive(x) {
      return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
    }
    deserializePrimitive(x) {
      return x;
    }
    deserializeRef(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'ref'));
      let serializationId = core.int._check(dart.dindex(x, 1));
      return this.deserializedObjects[dartx._get](serializationId);
    }
    deserializeByteBuffer(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'buffer'));
      let result = _native_typed_data.NativeByteBuffer._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeTypedData(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'typed'));
      let result = _native_typed_data.NativeTypedData._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeArrayInPlace(x) {
      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
        x[dartx._set](i, this.deserialize(x[dartx._get](i)));
      }
      return x;
    }
    deserializeFixed(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'fixed'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
    }
    deserializeExtendable(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'extendable'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
    }
    deserializeMutable(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'mutable'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return this.deserializeArrayInPlace(_interceptors.JSArray._check(result));
    }
    deserializeConst(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'const'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
    }
    deserializeMap(x) {
      dart.assert(dart.equals(x._get(0), 'map'));
      let keys = core.List._check(x._get(1));
      let values = core.List._check(x._get(2));
      let result = dart.map();
      this.deserializedObjects[dartx.add](result);
      keys = keys[dartx.map](dart.dynamic)(dart.bind(this, 'deserialize'))[dartx.toList]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        result[dartx._set](keys[dartx._get](i), this.deserialize(values[dartx._get](i)));
      }
      return result;
    }
    deserializeSendPort(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'sendport'));
      let managerId = core.int._check(dart.dindex(x, 1));
      let isolateId = core.int._check(dart.dindex(x, 2));
      let receivePortId = core.int._check(dart.dindex(x, 3));
      let result = null;
      if (managerId == _isolate_helper._globalState.currentManagerId) {
        let isolate = _isolate_helper._globalState.isolates[dartx._get](isolateId);
        if (isolate == null) return null;
        let receivePort = isolate.lookup(receivePortId);
        if (receivePort == null) return null;
        result = new _isolate_helper._NativeJsSendPort(receivePort, isolateId);
      } else {
        result = new _isolate_helper._WorkerSendPort(managerId, isolateId, receivePortId);
      }
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeRawSendPort(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
      let result = isolate.SendPort._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeJSObject(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'js-object'));
      let keys = core.List._check(dart.dindex(x, 1));
      let values = core.List._check(dart.dindex(x, 2));
      let o = {};
      this.deserializedObjects[dartx.add](o);
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        o[keys[dartx._get](i)] = this.deserialize(values[dartx._get](i));
      }
      return o;
    }
    deserializeClosure(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'function'));
      let name = core.String._check(dart.dindex(x, 1));
      let result = core.Function._check(_isolate_helper.IsolateNatives._getJSFunctionFromName(name));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeDartObject(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'dart'));
      let classId = core.String._check(dart.dindex(x, 1));
      let fields = core.List._check(dart.dindex(x, 2));
      let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INSTANCE_FROM_CLASS_ID);
      let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INITIALIZE_EMPTY_INSTANCE);
      let emptyInstance = instanceFromClassId(classId);
      this.deserializedObjects[dartx.add](emptyInstance);
      this.deserializeArrayInPlace(_interceptors.JSArray._check(fields));
      return initializeObject(classId, emptyInstance, fields);
    }
  };
  dart.setSignature(_isolate_helper._Deserializer, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Deserializer, [], {adjustSendPorts: dart.dynamic})}),
    fields: () => ({
      [_adjustSendPorts]: core.bool,
      deserializedObjects: core.List
    }),
    methods: () => ({
      deserialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      deserializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      deserializeRef: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      deserializeByteBuffer: dart.definiteFunctionType(_native_typed_data.NativeByteBuffer, [dart.dynamic]),
      deserializeTypedData: dart.definiteFunctionType(_native_typed_data.NativeTypedData, [dart.dynamic]),
      deserializeArrayInPlace: dart.definiteFunctionType(core.List, [_interceptors.JSArray]),
      deserializeFixed: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeExtendable: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
      deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
      deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
      deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
      deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  _js_embedded_names.DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
  _js_embedded_names.TYPE_INFORMATION = 'typeInformation';
  _js_embedded_names.GLOBAL_FUNCTIONS = 'globalFunctions';
  _js_embedded_names.STATICS = 'statics';
  _js_embedded_names.INTERCEPTED_NAMES = 'interceptedNames';
  _js_embedded_names.MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
  _js_embedded_names.MANGLED_NAMES = 'mangledNames';
  _js_embedded_names.LIBRARIES = 'libraries';
  _js_embedded_names.FINISHED_CLASSES = 'finishedClasses';
  _js_embedded_names.ALL_CLASSES = 'allClasses';
  _js_embedded_names.METADATA = 'metadata';
  _js_embedded_names.INTERCEPTORS_BY_TAG = 'interceptorsByTag';
  _js_embedded_names.LEAF_TAGS = 'leafTags';
  _js_embedded_names.LAZIES = 'lazies';
  _js_embedded_names.GET_ISOLATE_TAG = 'getIsolateTag';
  _js_embedded_names.ISOLATE_TAG = 'isolateTag';
  _js_embedded_names.CURRENT_SCRIPT = 'currentScript';
  _js_embedded_names.DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
  _js_embedded_names.DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
  _js_embedded_names.INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
  _js_embedded_names.IS_HUNK_LOADED = 'isHunkLoaded';
  _js_embedded_names.IS_HUNK_INITIALIZED = 'isHunkInitialized';
  _js_embedded_names.DEFERRED_INITIALIZED = 'deferredInitialized';
  _js_embedded_names.CLASS_ID_EXTRACTOR = 'classIdExtractor';
  _js_embedded_names.CLASS_FIELDS_EXTRACTOR = 'classFieldsExtractor';
  _js_embedded_names.INSTANCE_FROM_CLASS_ID = "instanceFromClassId";
  _js_embedded_names.INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
  _js_embedded_names.TYPEDEF_TYPE_PROPERTY_NAME = "$typedefType";
  _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
  _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
  _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
  _js_helper._Patch = class _Patch extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper._Patch, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._Patch, [])})
  });
  _js_helper.patch = dart.const(new _js_helper._Patch());
  _js_helper.InternalMap$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    class InternalMap extends core.Object {}
    dart.addTypeTests(InternalMap);
    InternalMap[dart.implements] = () => [MapOfK$V()];
    return InternalMap;
  });
  _js_helper.InternalMap = InternalMap();
  _js_helper.Primitives = class Primitives extends core.Object {
    static initializeStatics(id) {
      _js_helper.Primitives.mirrorFunctionCacheName = dart.notNull(_js_helper.Primitives.mirrorFunctionCacheName) + dart.str`_${id}`;
      _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
    }
    static objectHashCode(object) {
      let hash = object.$identityHash;
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object.$identityHash = hash;
      }
      return hash;
    }
    static _parseIntError(source, handleError) {
      if (handleError == null) dart.throw(new core.FormatException(source));
      return handleError(source);
    }
    static parseInt(source, radix, handleError) {
      _js_helper.checkString(source);
      let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
      let match = re.exec(source);
      let digitsIndex = 1;
      let hexIndex = 2;
      let decimalIndex = 3;
      let nonDecimalHexIndex = 4;
      if (match == null) {
        return _js_helper.Primitives._parseIntError(source, handleError);
      }
      let decimalMatch = match[dartx._get](decimalIndex);
      if (radix == null) {
        if (decimalMatch != null) {
          return parseInt(source, 10);
        }
        if (match[dartx._get](hexIndex) != null) {
          return parseInt(source, 16);
        }
        return _js_helper.Primitives._parseIntError(source, handleError);
      }
      if (!(typeof radix == 'number')) {
        dart.throw(new core.ArgumentError.value(radix, 'radix', 'is not an integer'));
      }
      if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
        dart.throw(new core.RangeError.range(radix, 2, 36, 'radix'));
      }
      if (radix == 10 && decimalMatch != null) {
        return parseInt(source, 10);
      }
      if (dart.notNull(radix) < 10 || decimalMatch == null) {
        let maxCharCode = null;
        if (dart.notNull(radix) <= 10) {
          maxCharCode = 48 - 1 + dart.notNull(radix);
        } else {
          maxCharCode = 97 - 10 - 1 + dart.notNull(radix);
        }
        dart.assert(typeof match[dartx._get](digitsIndex) == 'string');
        let digitsPart = match[digitsIndex];
        for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
          let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](i)) | 32) >>> 0;
          if (characterCode > dart.notNull(maxCharCode)) {
            return _js_helper.Primitives._parseIntError(source, handleError);
          }
        }
      }
      return parseInt(source, radix);
    }
    static _parseDoubleError(source, handleError) {
      if (handleError == null) {
        dart.throw(new core.FormatException('Invalid double', source));
      }
      return handleError(source);
    }
    static parseDouble(source, handleError) {
      _js_helper.checkString(source);
      if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
        return _js_helper.Primitives._parseDoubleError(source, handleError);
      }
      let result = parseFloat(source);
      if (dart.test(result[dartx.isNaN])) {
        let trimmed = source[dartx.trim]();
        if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
          return result;
        }
        return _js_helper.Primitives._parseDoubleError(source, handleError);
      }
      return result;
    }
    static objectTypeName(object) {
      return dart.toString(_js_helper.getRuntimeType(object));
    }
    static objectToString(object) {
      let name = dart.typeName(dart.getReifiedType(object));
      return dart.str`Instance of '${name}'`;
    }
    static dateNow() {
      return Date.now();
    }
    static initTicker() {
      if (_js_helper.Primitives.timerFrequency != null) return;
      _js_helper.Primitives.timerFrequency = 1000;
      _js_helper.Primitives.timerTicks = _js_helper.Primitives.dateNow;
      if (typeof window == "undefined") return;
      let jsWindow = window;
      if (jsWindow == null) return;
      let performance = jsWindow.performance;
      if (performance == null) return;
      if (typeof performance.now != "function") return;
      _js_helper.Primitives.timerFrequency = 1000000;
      _js_helper.Primitives.timerTicks = dart.fn(() => (1000 * performance.now())[dartx.floor](), VoidToint());
    }
    static get isD8() {
      return typeof version == "function" && typeof os == "object" && "system" in os;
    }
    static get isJsshell() {
      return typeof version == "function" && typeof system == "function";
    }
    static currentUri() {
      if (!!self.location) {
        return self.location.href;
      }
      return null;
    }
    static _fromCharCodeApply(array) {
      let kMaxApply = 500;
      let end = array[dartx.length];
      if (dart.notNull(end) <= kMaxApply) {
        return String.fromCharCode.apply(null, array);
      }
      let result = '';
      for (let i = 0; i < dart.notNull(end); i = i + kMaxApply) {
        let chunkEnd = i + kMaxApply < dart.notNull(end) ? i + kMaxApply : end;
        result = result + String.fromCharCode.apply(null, array.slice(i, chunkEnd));
      }
      return result;
    }
    static stringFromCodePoints(codePoints) {
      let a = JSArrayOfint().of([]);
      for (let i of codePoints) {
        if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
        if (dart.notNull(i) <= 65535) {
          a[dartx.add](i);
        } else if (dart.notNull(i) <= 1114111) {
          a[dartx.add](55296 + (dart.notNull(i) - 65536 >> 10 & 1023));
          a[dartx.add](56320 + (dart.notNull(i) & 1023));
        } else {
          dart.throw(_js_helper.argumentErrorValue(i));
        }
      }
      return _js_helper.Primitives._fromCharCodeApply(a);
    }
    static stringFromCharCodes(charCodes) {
      for (let i of charCodes) {
        if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
        if (dart.notNull(i) < 0) dart.throw(_js_helper.argumentErrorValue(i));
        if (dart.notNull(i) > 65535) return _js_helper.Primitives.stringFromCodePoints(charCodes);
      }
      return _js_helper.Primitives._fromCharCodeApply(charCodes);
    }
    static stringFromNativeUint8List(charCodes, start, end) {
      let kMaxApply = 500;
      if (dart.notNull(end) <= kMaxApply && start == 0 && end == charCodes[dartx.length]) {
        return String.fromCharCode.apply(null, charCodes);
      }
      let result = '';
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + kMaxApply) {
        let chunkEnd = dart.notNull(i) + kMaxApply < dart.notNull(end) ? dart.notNull(i) + kMaxApply : end;
        result = result + String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
      }
      return result;
    }
    static stringFromCharCode(charCode) {
      if (0 <= dart.notNull(charCode)) {
        if (dart.notNull(charCode) <= 65535) {
          return String.fromCharCode(charCode);
        }
        if (dart.notNull(charCode) <= 1114111) {
          let bits = dart.notNull(charCode) - 65536;
          let low = 56320 | bits & 1023;
          let high = (55296 | bits[dartx['>>']](10)) >>> 0;
          return String.fromCharCode(high, low);
        }
      }
      dart.throw(new core.RangeError.range(charCode, 0, 1114111));
    }
    static stringConcatUnchecked(string1, string2) {
      return _foreign_helper.JS_STRING_CONCAT(string1, string2);
    }
    static flattenString(str) {
      return str.charCodeAt(0) == 0 ? str : str;
    }
    static getTimeZoneName(receiver) {
      let d = _js_helper.Primitives.lazyAsJsDate(receiver);
      let match = /\((.*)\)/.exec(d.toString());
      if (match != null) return core.String._check(match[dartx._get](1));
      match = /^[A-Z,a-z]{3}\s[A-Z,a-z]{3}\s\d+\s\d{2}:\d{2}:\d{2}\s([A-Z]{3,5})\s\d{4}$/.exec(d.toString());
      if (match != null) return core.String._check(match[dartx._get](1));
      match = /(?:GMT|UTC)[+-]\d{4}/.exec(d.toString());
      if (match != null) return core.String._check(match[dartx._get](0));
      return "";
    }
    static getTimeZoneOffsetInMinutes(receiver) {
      return -_js_helper.Primitives.lazyAsJsDate(receiver).getTimezoneOffset();
    }
    static valueFromDecomposedDate(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
      let MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
      _js_helper.checkInt(years);
      _js_helper.checkInt(month);
      _js_helper.checkInt(day);
      _js_helper.checkInt(hours);
      _js_helper.checkInt(minutes);
      _js_helper.checkInt(seconds);
      _js_helper.checkInt(milliseconds);
      _js_helper.checkBool(isUtc);
      let jsMonth = dart.notNull(month) - 1;
      let value = null;
      if (dart.test(isUtc)) {
        value = Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds);
      } else {
        value = new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
      }
      if (dart.test(value[dartx.isNaN]) || dart.notNull(value) < -MAX_MILLISECONDS_SINCE_EPOCH || dart.notNull(value) > MAX_MILLISECONDS_SINCE_EPOCH) {
        return null;
      }
      if (dart.notNull(years) <= 0 || dart.notNull(years) < 100) return core.num._check(_js_helper.Primitives.patchUpY2K(value, years, isUtc));
      return value;
    }
    static patchUpY2K(value, years, isUtc) {
      let date = new Date(value);
      if (dart.test(isUtc)) {
        date.setUTCFullYear(years);
      } else {
        date.setFullYear(years);
      }
      return date.valueOf();
    }
    static lazyAsJsDate(receiver) {
      if (receiver.date === void 0) {
        receiver.date = new Date(receiver.millisecondsSinceEpoch);
      }
      return receiver.date;
    }
    static getYear(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCFullYear() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getFullYear() + 0;
    }
    static getMonth(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMonth() + 1 : _js_helper.Primitives.lazyAsJsDate(receiver).getMonth() + 1;
    }
    static getDay(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDate() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDate() + 0;
    }
    static getHours(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCHours() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getHours() + 0;
    }
    static getMinutes(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMinutes() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMinutes() + 0;
    }
    static getSeconds(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCSeconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getSeconds() + 0;
    }
    static getMilliseconds(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMilliseconds() + 0;
    }
    static getWeekday(receiver) {
      let weekday = dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDay() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDay() + 0;
      return (weekday + 6)[dartx['%']](7) + 1;
    }
    static valueFromDateString(str) {
      if (!(typeof str == 'string')) dart.throw(_js_helper.argumentErrorValue(str));
      let value = Date.parse(str);
      if (dart.test(value[dartx.isNaN])) dart.throw(_js_helper.argumentErrorValue(str));
      return value;
    }
    static getProperty(object, key) {
      if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
        dart.throw(_js_helper.argumentErrorValue(object));
      }
      return object[key];
    }
    static setProperty(object, key, value) {
      if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
        dart.throw(_js_helper.argumentErrorValue(object));
      }
      object[key] = value;
    }
    static extractStackTrace(error) {
      return _js_helper.getTraceFromException(error.$thrownJsError);
    }
  };
  dart.setSignature(_js_helper.Primitives, {
    sfields: () => ({
      mirrorFunctionCacheName: core.String,
      mirrorInvokeCacheName: core.String,
      DOLLAR_CHAR_VALUE: core.int,
      timerFrequency: core.int,
      timerTicks: core.Function
    }),
    sgetters: () => ({
      isD8: dart.definiteFunctionType(core.bool, []),
      isJsshell: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      initializeStatics: dart.definiteFunctionType(dart.void, [core.int]),
      objectHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
      _parseIntError: dart.definiteFunctionType(core.int, [core.String, StringToint()]),
      parseInt: dart.definiteFunctionType(core.int, [core.String, core.int, StringToint()]),
      _parseDoubleError: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
      parseDouble: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
      objectTypeName: dart.definiteFunctionType(core.String, [core.Object]),
      objectToString: dart.definiteFunctionType(core.String, [core.Object]),
      dateNow: dart.definiteFunctionType(core.int, []),
      initTicker: dart.definiteFunctionType(dart.void, []),
      currentUri: dart.definiteFunctionType(core.String, []),
      _fromCharCodeApply: dart.definiteFunctionType(core.String, [ListOfint()]),
      stringFromCodePoints: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
      stringFromCharCodes: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
      stringFromNativeUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
      stringFromCharCode: dart.definiteFunctionType(core.String, [core.int]),
      stringConcatUnchecked: dart.definiteFunctionType(core.String, [core.String, core.String]),
      flattenString: dart.definiteFunctionType(core.String, [core.String]),
      getTimeZoneName: dart.definiteFunctionType(core.String, [core.DateTime]),
      getTimeZoneOffsetInMinutes: dart.definiteFunctionType(core.int, [core.DateTime]),
      valueFromDecomposedDate: dart.definiteFunctionType(core.num, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
      patchUpY2K: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic]),
      lazyAsJsDate: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getYear: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getMonth: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getDay: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getHours: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getMinutes: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getSeconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getMilliseconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getWeekday: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      valueFromDateString: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      setProperty: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      extractStackTrace: dart.definiteFunctionType(core.StackTrace, [core.Error])
    }),
    names: ['initializeStatics', 'objectHashCode', '_parseIntError', 'parseInt', '_parseDoubleError', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromNativeUint8List', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'extractStackTrace']
  });
  _js_helper.Primitives.mirrorFunctionCacheName = '$cachedFunction';
  _js_helper.Primitives.mirrorInvokeCacheName = '$cachedInvocation';
  _js_helper.Primitives.DOLLAR_CHAR_VALUE = 36;
  _js_helper.Primitives.timerFrequency = null;
  _js_helper.Primitives.timerTicks = null;
  _js_helper.diagnoseIndexError = function(indexable, index) {
    if (!(typeof index == 'number')) return new core.ArgumentError.value(index, 'index');
    let length = core.int._check(dart.dload(indexable, 'length'));
    if (dart.test(dart.dsend(index, '<', 0)) || dart.test(dart.dsend(index, '>=', length))) {
      return core.RangeError.index(core.int._check(index), indexable, 'index', null, length);
    }
    return new core.RangeError.value(core.num._check(index), 'index');
  };
  dart.lazyFn(_js_helper.diagnoseIndexError, () => dynamicAnddynamicToError());
  _js_helper.diagnoseRangeError = function(start, end, length) {
    if (!(typeof start == 'number')) {
      return new core.ArgumentError.value(start, 'start');
    }
    if (dart.test(dart.dsend(start, '<', 0)) || dart.test(dart.dsend(start, '>', length))) {
      return new core.RangeError.range(core.num._check(start), 0, core.int._check(length), 'start');
    }
    if (end != null) {
      if (!(typeof end == 'number')) {
        return new core.ArgumentError.value(end, 'end');
      }
      if (dart.test(dart.dsend(end, '<', start)) || dart.test(dart.dsend(end, '>', length))) {
        return new core.RangeError.range(core.num._check(end), core.int._check(start), core.int._check(length), 'end');
      }
    }
    return new core.ArgumentError.value(end, "end");
  };
  dart.lazyFn(_js_helper.diagnoseRangeError, () => dynamicAnddynamicAnddynamicToError());
  _js_helper.stringLastIndexOfUnchecked = function(receiver, element, start) {
    return receiver.lastIndexOf(element, start);
  };
  dart.fn(_js_helper.stringLastIndexOfUnchecked, dynamicAnddynamicAnddynamicTodynamic());
  _js_helper.argumentErrorValue = function(object) {
    return new core.ArgumentError.value(object);
  };
  dart.lazyFn(_js_helper.argumentErrorValue, () => dynamicToArgumentError());
  _js_helper.checkNull = function(object) {
    if (object == null) dart.throw(_js_helper.argumentErrorValue(object));
    return object;
  };
  dart.fn(_js_helper.checkNull, dynamicTodynamic$());
  _js_helper.checkNum = function(value) {
    if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkNum, dynamicTodynamic$());
  _js_helper.checkInt = function(value) {
    if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkInt, dynamicTodynamic$());
  _js_helper.checkBool = function(value) {
    if (!(typeof value == 'boolean')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkBool, dynamicTodynamic$());
  _js_helper.checkString = function(value) {
    if (!(typeof value == 'string')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkString, dynamicTodynamic$());
  _js_helper.throwRuntimeError = function(message) {
    dart.throw(new _js_helper.RuntimeError(message));
  };
  dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic$());
  _js_helper.throwAbstractClassInstantiationError = function(className) {
    dart.throw(new core.AbstractClassInstantiationError(core.String._check(className)));
  };
  dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic$());
  _js_helper.throwConcurrentModificationError = function(collection) {
    dart.throw(new core.ConcurrentModificationError(collection));
  };
  dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic$());
  const _message = Symbol('_message');
  const _method = Symbol('_method');
  core.Error = class Error extends core.Object {
    new() {
    }
    static safeToString(object) {
      if (typeof object == 'number' || typeof object == 'boolean' || null == object) {
        return dart.toString(object);
      }
      if (typeof object == 'string') {
        return core.Error._stringToSafeString(object);
      }
      return core.Error._objectToString(object);
    }
    static _stringToSafeString(string) {
      return _js_helper.jsonEncodeNative(string);
    }
    static _objectToString(object) {
      return _js_helper.Primitives.objectToString(object);
    }
    get stackTrace() {
      return _js_helper.Primitives.extractStackTrace(this);
    }
  };
  dart.setSignature(core.Error, {
    constructors: () => ({new: dart.definiteFunctionType(core.Error, [])}),
    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])}),
    statics: () => ({
      safeToString: dart.definiteFunctionType(core.String, [core.Object]),
      _stringToSafeString: dart.definiteFunctionType(core.String, [core.String]),
      _objectToString: dart.definiteFunctionType(core.String, [core.Object])
    }),
    names: ['safeToString', '_stringToSafeString', '_objectToString']
  });
  _js_helper.NullError = class NullError extends core.Error {
    new(message, match) {
      this[_message] = message;
      this[_method] = core.String._check(match == null ? null : match.method);
      super.new();
    }
    toString() {
      if (this[_method] == null) return dart.str`NullError: ${this[_message]}`;
      return dart.str`NullError: method not found: '${this[_method]}' on null`;
    }
  };
  _js_helper.NullError[dart.implements] = () => [core.NoSuchMethodError];
  dart.setSignature(_js_helper.NullError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NullError, [core.String, dart.dynamic])}),
    fields: () => ({
      [_message]: core.String,
      [_method]: core.String
    })
  });
  const _receiver = Symbol('_receiver');
  _js_helper.JsNoSuchMethodError = class JsNoSuchMethodError extends core.Error {
    new(message, match) {
      this[_message] = message;
      this[_method] = core.String._check(match == null ? null : match.method);
      this[_receiver] = core.String._check(match == null ? null : match.receiver);
      super.new();
    }
    toString() {
      if (this[_method] == null) return dart.str`NoSuchMethodError: ${this[_message]}`;
      if (this[_receiver] == null) {
        return dart.str`NoSuchMethodError: method not found: '${this[_method]}' (${this[_message]})`;
      }
      return "NoSuchMethodError: " + dart.str`method not found: '${this[_method]}' on '${this[_receiver]}' (${this[_message]})`;
    }
  };
  _js_helper.JsNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
  dart.setSignature(_js_helper.JsNoSuchMethodError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsNoSuchMethodError, [core.String, dart.dynamic])}),
    fields: () => ({
      [_message]: core.String,
      [_method]: core.String,
      [_receiver]: core.String
    })
  });
  _js_helper.UnknownJsTypeError = class UnknownJsTypeError extends core.Error {
    new(message) {
      this[_message] = message;
      super.new();
    }
    toString() {
      return dart.test(this[_message][dartx.isEmpty]) ? 'Error' : dart.str`Error: ${this[_message]}`;
    }
  };
  dart.setSignature(_js_helper.UnknownJsTypeError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.UnknownJsTypeError, [core.String])}),
    fields: () => ({[_message]: core.String})
  });
  _js_helper.getTraceFromException = function(exception) {
    return new _js_helper._StackTrace(exception);
  };
  dart.lazyFn(_js_helper.getTraceFromException, () => dynamicToStackTrace());
  const _exception = Symbol('_exception');
  const _trace = Symbol('_trace');
  _js_helper._StackTrace = class _StackTrace extends core.Object {
    new(exception) {
      this[_exception] = exception;
      this[_trace] = null;
    }
    toString() {
      if (this[_trace] != null) return this[_trace];
      let trace = null;
      if (this[_exception] !== null && typeof this[_exception] === "object") {
        trace = this[_exception].stack;
      }
      return this[_trace] = trace == null ? '' : trace;
    }
  };
  _js_helper._StackTrace[dart.implements] = () => [core.StackTrace];
  dart.setSignature(_js_helper._StackTrace, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StackTrace, [dart.dynamic])}),
    fields: () => ({
      [_exception]: dart.dynamic,
      [_trace]: core.String
    })
  });
  _js_helper.objectHashCode = function(object) {
    if (object == null || typeof object != 'object') {
      return dart.hashCode(object);
    } else {
      return _js_helper.Primitives.objectHashCode(object);
    }
  };
  dart.fn(_js_helper.objectHashCode, dynamicToint());
  _js_helper.fillLiteralMap = function(keyValuePairs, result) {
    let index = 0;
    let length = _js_helper.getLength(keyValuePairs);
    while (index < dart.notNull(length)) {
      let key = _js_helper.getIndex(keyValuePairs, index++);
      let value = _js_helper.getIndex(keyValuePairs, index++);
      result[dartx._set](key, value);
    }
    return result;
  };
  dart.lazyFn(_js_helper.fillLiteralMap, () => dynamicAndMapTodynamic());
  _js_helper.jsHasOwnProperty = function(jsObject, property) {
    return jsObject.hasOwnProperty(property);
  };
  dart.lazyFn(_js_helper.jsHasOwnProperty, () => dynamicAndStringTobool());
  _js_helper.jsPropertyAccess = function(jsObject, property) {
    return jsObject[property];
  };
  dart.lazyFn(_js_helper.jsPropertyAccess, () => dynamicAndStringTodynamic());
  _js_helper.getFallThroughError = function() {
    return new _js_helper.FallThroughErrorImplementation();
  };
  dart.fn(_js_helper.getFallThroughError, VoidTodynamic$());
  _js_helper.Creates = class Creates extends core.Object {
    new(types) {
      this.types = types;
    }
  };
  dart.setSignature(_js_helper.Creates, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Creates, [core.String])}),
    fields: () => ({types: core.String})
  });
  _js_helper.Returns = class Returns extends core.Object {
    new(types) {
      this.types = types;
    }
  };
  dart.setSignature(_js_helper.Returns, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Returns, [core.String])}),
    fields: () => ({types: core.String})
  });
  _js_helper.JSName = class JSName extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_js_helper.JSName, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSName, [core.String])}),
    fields: () => ({name: core.String})
  });
  _js_helper.JavaScriptIndexingBehavior = class JavaScriptIndexingBehavior extends core.Object {};
  _js_helper.TypeErrorImplementation = class TypeErrorImplementation extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}'`;
      super.new();
    }
    fromMessage(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  dart.defineNamedConstructor(_js_helper.TypeErrorImplementation, 'fromMessage');
  _js_helper.TypeErrorImplementation[dart.implements] = () => [core.TypeError];
  dart.setSignature(_js_helper.TypeErrorImplementation, {
    constructors: () => ({
      new: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.Object, core.Object, core.Object]),
      fromMessage: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.String])
    }),
    fields: () => ({message: core.String})
  });
  _js_helper.CastErrorImplementation = class CastErrorImplementation extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` incompatible type '${expectedType}'`;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.CastErrorImplementation[dart.implements] = () => [core.CastError];
  dart.setSignature(_js_helper.CastErrorImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.CastErrorImplementation, [core.Object, core.Object, core.Object])}),
    fields: () => ({message: core.String})
  });
  _js_helper.StrongModeTypeError = class StrongModeTypeError extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}' in strong mode`;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.StrongModeTypeError[dart.implements] = () => [core.TypeError, core.StrongModeError];
  dart.setSignature(_js_helper.StrongModeTypeError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeTypeError, [core.Object, core.Object, core.Object])}),
    fields: () => ({message: core.String})
  });
  _js_helper.StrongModeCastError = class StrongModeCastError extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` type '${expectedType}' which is incompatible in strong mode`;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.StrongModeCastError[dart.implements] = () => [core.CastError, core.StrongModeError];
  dart.setSignature(_js_helper.StrongModeCastError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeCastError, [core.Object, core.Object, core.Object])}),
    fields: () => ({message: core.String})
  });
  _js_helper.StrongModeErrorImplementation = class StrongModeErrorImplementation extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.StrongModeErrorImplementation[dart.implements] = () => [core.StrongModeError];
  dart.setSignature(_js_helper.StrongModeErrorImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeErrorImplementation, [core.String])}),
    fields: () => ({message: core.String})
  });
  core.FallThroughError = class FallThroughError extends core.Error {
    new() {
      super.new();
    }
  };
  dart.setSignature(core.FallThroughError, {
    constructors: () => ({new: dart.definiteFunctionType(core.FallThroughError, [])})
  });
  _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
    new() {
      super.new();
    }
    toString() {
      return "Switch case fall-through.";
    }
  };
  dart.setSignature(_js_helper.FallThroughErrorImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.FallThroughErrorImplementation, [])})
  });
  _js_helper.RuntimeError = class RuntimeError extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return dart.str`RuntimeError: ${this.message}`;
    }
  };
  dart.setSignature(_js_helper.RuntimeError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.RuntimeError, [dart.dynamic])}),
    fields: () => ({message: dart.dynamic})
  });
  core.AssertionError = class AssertionError extends core.Error {
    new() {
      super.new();
    }
    toString() {
      return "Assertion failed";
    }
  };
  dart.setSignature(core.AssertionError, {
    constructors: () => ({new: dart.definiteFunctionType(core.AssertionError, [])})
  });
  _js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
    new(message) {
      this[_message] = message;
      super.new();
    }
    toString() {
      return dart.str`Assertion failed: ${this[_message]}`;
    }
  };
  dart.setSignature(_js_helper.AssertionErrorWithMessage, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.AssertionErrorWithMessage, [core.Object])}),
    fields: () => ({[_message]: core.Object})
  });
  _js_helper.random64 = function() {
    let int32a = Math.random() * 0x100000000 >>> 0;
    let int32b = Math.random() * 0x100000000 >>> 0;
    return int32a + int32b * 4294967296;
  };
  dart.fn(_js_helper.random64, VoidToint());
  _js_helper.jsonEncodeNative = function(string) {
    return JSON.stringify(string);
  };
  dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString$());
  const _jsIterator = Symbol('_jsIterator');
  const _current$0 = Symbol('_current');
  _js_helper.SyncIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class SyncIterator extends core.Object {
      new(jsIterator) {
        this[_jsIterator] = jsIterator;
        this[_current$0] = null;
      }
      get current() {
        return this[_current$0];
      }
      moveNext() {
        let ret = this[_jsIterator].next();
        this[_current$0] = ret.value;
        return !ret.done;
      }
    }
    dart.addTypeTests(SyncIterator);
    SyncIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(SyncIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterator$(E), [dart.dynamic])}),
      fields: () => ({
        [_jsIterator]: dart.dynamic,
        [_current$0]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return SyncIterator;
  });
  _js_helper.SyncIterator = SyncIterator();
  const _generator = Symbol('_generator');
  const _args = Symbol('_args');
  collection.IterableBase$ = dart.generic(E => {
    class IterableBase extends core.Iterable$(E) {
      new() {
        super.new();
      }
      static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
        if (leftDelimiter === void 0) leftDelimiter = '(';
        if (rightDelimiter === void 0) rightDelimiter = ')';
        if (dart.test(collection._isToStringVisiting(iterable))) {
          if (leftDelimiter == "(" && rightDelimiter == ")") {
            return "(...)";
          }
          return dart.str`${leftDelimiter}...${rightDelimiter}`;
        }
        let parts = [];
        collection._toStringVisiting[dartx.add](iterable);
        try {
          collection._iterablePartsToStrings(iterable, parts);
        } finally {
          dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
          collection._toStringVisiting[dartx.removeLast]();
        }
        return (() => {
          let _ = new core.StringBuffer(leftDelimiter);
          _.writeAll(parts, ", ");
          _.write(rightDelimiter);
          return _;
        })().toString();
      }
      static iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
        if (leftDelimiter === void 0) leftDelimiter = '(';
        if (rightDelimiter === void 0) rightDelimiter = ')';
        if (dart.test(collection._isToStringVisiting(iterable))) {
          return dart.str`${leftDelimiter}...${rightDelimiter}`;
        }
        let buffer = new core.StringBuffer(leftDelimiter);
        collection._toStringVisiting[dartx.add](iterable);
        try {
          buffer.writeAll(iterable, ", ");
        } finally {
          dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
          collection._toStringVisiting[dartx.removeLast]();
        }
        buffer.write(rightDelimiter);
        return buffer.toString();
      }
    }
    dart.setSignature(IterableBase, {
      constructors: () => ({new: dart.definiteFunctionType(collection.IterableBase$(E), [])}),
      statics: () => ({
        iterableToShortString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String]),
        iterableToFullString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String])
      }),
      names: ['iterableToShortString', 'iterableToFullString']
    });
    return IterableBase;
  });
  collection.IterableBase = IterableBase();
  _js_helper.SyncIterable$ = dart.generic(E => {
    let SyncIteratorOfE = () => (SyncIteratorOfE = dart.constFn(_js_helper.SyncIterator$(E)))();
    class SyncIterable extends collection.IterableBase$(E) {
      new(generator, args) {
        this[_generator] = generator;
        this[_args] = args;
        super.new();
      }
      [_jsIterator]() {
        return this[_generator](...this[_args]);
      }
      get iterator() {
        return new (SyncIteratorOfE())(this[_jsIterator]());
      }
    }
    dart.setSignature(SyncIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterable$(E), [dart.dynamic, dart.dynamic])}),
      fields: () => ({
        [_generator]: dart.dynamic,
        [_args]: dart.dynamic
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({[_jsIterator]: dart.definiteFunctionType(dart.dynamic, [])})
    });
    dart.defineExtensionMembers(SyncIterable, ['iterator']);
    return SyncIterable;
  });
  _js_helper.SyncIterable = SyncIterable();
  _js_helper.BooleanConversionAssertionError = class BooleanConversionAssertionError extends core.AssertionError {
    new() {
      super.new();
    }
    toString() {
      return 'Failed assertion: boolean expression must not be null';
    }
  };
  _js_helper.NoThrows = class NoThrows extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper.NoThrows, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoThrows, [])})
  });
  _js_helper.NoInline = class NoInline extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper.NoInline, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoInline, [])})
  });
  _js_helper.Native = class Native extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_js_helper.Native, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Native, [core.String])}),
    fields: () => ({name: core.String})
  });
  _js_helper.JsPeerInterface = class JsPeerInterface extends core.Object {
    new(opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      this.name = name;
    }
  };
  dart.setSignature(_js_helper.JsPeerInterface, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsPeerInterface, [], {name: core.String})}),
    fields: () => ({name: core.String})
  });
  _js_helper.SupportJsExtensionMethods = class SupportJsExtensionMethods extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper.SupportJsExtensionMethods, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SupportJsExtensionMethods, [])})
  });
  const _length$0 = Symbol('_length');
  const _strings = Symbol('_strings');
  const _nums = Symbol('_nums');
  const _rest = Symbol('_rest');
  const _first = Symbol('_first');
  const _last = Symbol('_last');
  const _modifications = Symbol('_modifications');
  const _containsTableEntry = Symbol('_containsTableEntry');
  const _getBucket = Symbol('_getBucket');
  const _getTableCell = Symbol('_getTableCell');
  const _newHashTable = Symbol('_newHashTable');
  const _addHashTableEntry = Symbol('_addHashTableEntry');
  const _getTableBucket = Symbol('_getTableBucket');
  const _newLinkedCell = Symbol('_newLinkedCell');
  const _setTableEntry = Symbol('_setTableEntry');
  const _removeHashTableEntry = Symbol('_removeHashTableEntry');
  const _unlinkCell = Symbol('_unlinkCell');
  const _modified = Symbol('_modified');
  const _next = Symbol('_next');
  const _deleteTableEntry = Symbol('_deleteTableEntry');
  const _previous = Symbol('_previous');
  _js_helper.JsLinkedHashMap$ = dart.generic((K, V) => {
    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
    let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
    let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
    let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
    let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    class JsLinkedHashMap extends core.Object {
      new() {
        this[_length$0] = 0;
        this[_strings] = null;
        this[_nums] = null;
        this[_rest] = null;
        this[_first] = null;
        this[_last] = null;
        this[_modifications] = 0;
      }
      static es6() {
        return new (JsLinkedHashMapOfK$V())();
      }
      get length() {
        return this[_length$0];
      }
      get isEmpty() {
        return this[_length$0] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      get keys() {
        return new (LinkedHashMapKeyIterableOfK())(this);
      }
      get values() {
        return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
      }
      containsKey(key) {
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          let strings = this[_strings];
          if (strings == null) return false;
          return this[_containsTableEntry](strings, key);
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          let nums = this[_nums];
          if (nums == null) return false;
          return this[_containsTableEntry](nums, key);
        } else {
          return this.internalContainsKey(key);
        }
      }
      internalContainsKey(key) {
        let rest = this[_rest];
        if (rest == null) return false;
        let bucket = this[_getBucket](rest, key);
        return dart.notNull(this.internalFindBucketIndex(bucket, key)) >= 0;
      }
      containsValue(value) {
        return this.keys[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      _get(key) {
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          let strings = this[_strings];
          if (strings == null) return null;
          let cell = this[_getTableCell](strings, key);
          return cell == null ? null : cell.hashMapCellValue;
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          let nums = this[_nums];
          if (nums == null) return null;
          let cell = this[_getTableCell](nums, key);
          return cell == null ? null : cell.hashMapCellValue;
        } else {
          return this.internalGet(key);
        }
      }
      internalGet(key) {
        let rest = this[_rest];
        if (rest == null) return null;
        let bucket = this[_getBucket](rest, key);
        let index = this.internalFindBucketIndex(bucket, key);
        if (dart.notNull(index) < 0) return null;
        let cell = bucket[index];
        return cell.hashMapCellValue;
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          let strings = this[_strings];
          if (strings == null) this[_strings] = strings = this[_newHashTable]();
          this[_addHashTableEntry](strings, key, value);
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          let nums = this[_nums];
          if (nums == null) this[_nums] = nums = this[_newHashTable]();
          this[_addHashTableEntry](nums, key, value);
        } else {
          this.internalSet(key, value);
        }
        return value;
      }
      internalSet(key, value) {
        K._check(key);
        V._check(value);
        let rest = this[_rest];
        if (rest == null) this[_rest] = rest = this[_newHashTable]();
        let hash = this.internalComputeHashCode(key);
        let bucket = this[_getTableBucket](rest, hash);
        if (bucket == null) {
          let cell = this[_newLinkedCell](key, value);
          this[_setTableEntry](rest, hash, [cell]);
        } else {
          let index = this.internalFindBucketIndex(bucket, key);
          if (dart.notNull(index) >= 0) {
            let cell = bucket[index];
            cell.hashMapCellValue = value;
          } else {
            let cell = this[_newLinkedCell](key, value);
            bucket.push(cell);
          }
        }
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) return this._get(key);
        let value = ifAbsent();
        this._set(key, value);
        return value;
      }
      remove(key) {
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          return this[_removeHashTableEntry](this[_strings], key);
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          return this[_removeHashTableEntry](this[_nums], key);
        } else {
          return this.internalRemove(key);
        }
      }
      internalRemove(key) {
        let rest = this[_rest];
        if (rest == null) return null;
        let bucket = this[_getBucket](rest, key);
        let index = this.internalFindBucketIndex(bucket, key);
        if (dart.notNull(index) < 0) return null;
        let cell = bucket.splice(index, 1)[0];
        this[_unlinkCell](cell);
        return cell.hashMapCellValue;
      }
      clear() {
        if (dart.notNull(this[_length$0]) > 0) {
          this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
          this[_length$0] = 0;
          this[_modified]();
        }
      }
      forEach(action) {
        let cell = this[_first];
        let modifications = this[_modifications];
        while (cell != null) {
          action(cell.hashMapCellKey, cell.hashMapCellValue);
          if (modifications != this[_modifications]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          cell = cell[_next];
        }
      }
      [_addHashTableEntry](table, key, value) {
        K._check(key);
        V._check(value);
        let cell = this[_getTableCell](table, key);
        if (cell == null) {
          this[_setTableEntry](table, key, this[_newLinkedCell](key, value));
        } else {
          cell.hashMapCellValue = value;
        }
      }
      [_removeHashTableEntry](table, key) {
        if (table == null) return null;
        let cell = this[_getTableCell](table, key);
        if (cell == null) return null;
        this[_unlinkCell](cell);
        this[_deleteTableEntry](table, key);
        return cell.hashMapCellValue;
      }
      [_modified]() {
        this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
      }
      [_newLinkedCell](key, value) {
        K._check(key);
        V._check(value);
        let cell = new (LinkedHashMapCellOfK$V())(key, value);
        if (this[_first] == null) {
          this[_first] = this[_last] = cell;
        } else {
          let last = this[_last];
          cell[_previous] = last;
          this[_last] = last[_next] = cell;
        }
        this[_length$0] = dart.notNull(this[_length$0]) + 1;
        this[_modified]();
        return cell;
      }
      [_unlinkCell](cell) {
        LinkedHashMapCellOfK$V()._check(cell);
        let previous = cell[_previous];
        let next = cell[_next];
        if (previous == null) {
          dart.assert(dart.equals(cell, this[_first]));
          this[_first] = next;
        } else {
          previous[_next] = next;
        }
        if (next == null) {
          dart.assert(dart.equals(cell, this[_last]));
          this[_last] = previous;
        } else {
          next[_previous] = previous;
        }
        this[_length$0] = dart.notNull(this[_length$0]) - 1;
        this[_modified]();
      }
      static _isStringKey(key) {
        return typeof key == 'string';
      }
      static _isNumericKey(key) {
        return typeof key == 'number' && (key & 0x3ffffff) === key;
      }
      internalComputeHashCode(key) {
        return dart.hashCode(key) & 0x3ffffff;
      }
      [_getBucket](table, key) {
        let hash = this.internalComputeHashCode(key);
        return this[_getTableBucket](table, hash);
      }
      internalFindBucketIndex(bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.equals(cell.hashMapCellKey, key)) return i;
        }
        return -1;
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
      [_getTableCell](table, key) {
        return table[key];
      }
      [_getTableBucket](table, key) {
        return table[key];
      }
      [_setTableEntry](table, key, value) {
        dart.assert(value != null);
        table[key] = value;
      }
      [_deleteTableEntry](table, key) {
        delete table[key];
      }
      [_containsTableEntry](table, key) {
        let cell = this[_getTableCell](table, key);
        return cell != null;
      }
      [_newHashTable]() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        this[_setTableEntry](table, temporaryKey, table);
        this[_deleteTableEntry](table, temporaryKey);
        return table;
      }
    }
    dart.addTypeTests(JsLinkedHashMap);
    JsLinkedHashMap[dart.implements] = () => [LinkedHashMapOfK$V(), InternalMapOfK$V()];
    dart.setSignature(JsLinkedHashMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), []),
        es6: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), [])
      }),
      fields: () => ({
        [_length$0]: core.int,
        [_strings]: dart.dynamic,
        [_nums]: dart.dynamic,
        [_rest]: dart.dynamic,
        [_first]: LinkedHashMapCellOfK$V(),
        [_last]: LinkedHashMapCellOfK$V(),
        [_modifications]: core.int
      }),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        internalContainsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        internalGet: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        internalSet: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        internalRemove: dart.definiteFunctionType(V, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        [_addHashTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
        [_removeHashTableEntry]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
        [_modified]: dart.definiteFunctionType(dart.void, []),
        [_newLinkedCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V]),
        [_unlinkCell]: dart.definiteFunctionType(dart.void, [LinkedHashMapCellOfK$V()]),
        internalComputeHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
        internalFindBucketIndex: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
        [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
        [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
        [_setTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        [_deleteTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        [_containsTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
        [_newHashTable]: dart.definiteFunctionType(dart.dynamic, [])
      }),
      statics: () => ({
        _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic])
      }),
      names: ['_isStringKey', '_isNumericKey']
    });
    dart.defineExtensionMembers(JsLinkedHashMap, [
      'containsKey',
      'containsValue',
      'addAll',
      '_get',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'forEach',
      'length',
      'isEmpty',
      'isNotEmpty',
      'keys',
      'values'
    ]);
    return JsLinkedHashMap;
  });
  _js_helper.JsLinkedHashMap = JsLinkedHashMap();
  _js_helper.Es6LinkedHashMap$ = dart.generic((K, V) => {
    class Es6LinkedHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
      new() {
        super.new();
      }
      [_getTableCell](table, key) {
        return table.get(key);
      }
      [_getTableBucket](table, key) {
        return table.get(key);
      }
      [_setTableEntry](table, key, value) {
        table.set(key, value);
      }
      [_deleteTableEntry](table, key) {
        table.delete(key);
      }
      [_containsTableEntry](table, key) {
        return table.has(key);
      }
      [_newHashTable]() {
        return new Map();
      }
    }
    dart.setSignature(Es6LinkedHashMap, {
      methods: () => ({
        [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
        [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic])
      })
    });
    return Es6LinkedHashMap;
  });
  _js_helper.Es6LinkedHashMap = Es6LinkedHashMap();
  _js_helper.LinkedHashMapCell$ = dart.generic((K, V) => {
    let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
    class LinkedHashMapCell extends core.Object {
      new(hashMapCellKey, hashMapCellValue) {
        this.hashMapCellKey = hashMapCellKey;
        this.hashMapCellValue = hashMapCellValue;
        this[_next] = null;
        this[_previous] = null;
      }
    }
    dart.addTypeTests(LinkedHashMapCell);
    dart.setSignature(LinkedHashMapCell, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V])}),
      fields: () => ({
        hashMapCellKey: K,
        hashMapCellValue: V,
        [_next]: LinkedHashMapCellOfK$V(),
        [_previous]: LinkedHashMapCellOfK$V()
      })
    });
    return LinkedHashMapCell;
  });
  _js_helper.LinkedHashMapCell = LinkedHashMapCell();
  const _map = Symbol('_map');
  _js_helper.LinkedHashMapKeyIterable$ = dart.generic(E => {
    let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
    class LinkedHashMapKeyIterable extends core.Iterable$(E) {
      new(map) {
        this[_map] = map;
        super.new();
      }
      get length() {
        return this[_map][_length$0];
      }
      get isEmpty() {
        return this[_map][_length$0] == 0;
      }
      get iterator() {
        return new (LinkedHashMapKeyIteratorOfE())(this[_map], this[_map][_modifications]);
      }
      contains(element) {
        return this[_map].containsKey(element);
      }
      forEach(f) {
        let cell = this[_map][_first];
        let modifications = this[_map][_modifications];
        while (cell != null) {
          f(cell.hashMapCellKey);
          if (modifications != this[_map][_modifications]) {
            dart.throw(new core.ConcurrentModificationError(this[_map]));
          }
          cell = cell[_next];
        }
      }
    }
    LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(LinkedHashMapKeyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterable$(E), [JsLinkedHashMapOfE$dynamic()])}),
      fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({forEach: dart.definiteFunctionType(dart.void, [ETovoid()])})
    });
    dart.defineExtensionMembers(LinkedHashMapKeyIterable, [
      'contains',
      'forEach',
      'length',
      'isEmpty',
      'iterator'
    ]);
    return LinkedHashMapKeyIterable;
  });
  _js_helper.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable();
  const _cell = Symbol('_cell');
  _js_helper.LinkedHashMapKeyIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
    let LinkedHashMapCellOfE$dynamic = () => (LinkedHashMapCellOfE$dynamic = dart.constFn(_js_helper.LinkedHashMapCell$(E, dart.dynamic)))();
    class LinkedHashMapKeyIterator extends core.Object {
      new(map, modifications) {
        this[_map] = map;
        this[_modifications] = modifications;
        this[_cell] = null;
        this[_current$0] = null;
        this[_cell] = this[_map][_first];
      }
      get current() {
        return this[_current$0];
      }
      moveNext() {
        if (this[_modifications] != this[_map][_modifications]) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        } else if (this[_cell] == null) {
          this[_current$0] = null;
          return false;
        } else {
          this[_current$0] = this[_cell].hashMapCellKey;
          this[_cell] = this[_cell][_next];
          return true;
        }
      }
    }
    dart.addTypeTests(LinkedHashMapKeyIterator);
    LinkedHashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(LinkedHashMapKeyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterator$(E), [JsLinkedHashMapOfE$dynamic(), core.int])}),
      fields: () => ({
        [_map]: JsLinkedHashMapOfE$dynamic(),
        [_modifications]: core.int,
        [_cell]: LinkedHashMapCellOfE$dynamic(),
        [_current$0]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return LinkedHashMapKeyIterator;
  });
  _js_helper.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator();
  _js_helper.defineProperty = function(obj, property, value) {
    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
  };
  dart.lazyFn(_js_helper.defineProperty, () => dynamicAndStringAnddynamicTovoid());
  _js_helper.convertDartClosureToJS = function(F) {
    return (closure, arity) => {
      return closure;
    };
  };
  dart.fn(_js_helper.convertDartClosureToJS, FAndintToF());
  _js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
  };
  dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic$());
  _js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
  };
  dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic$());
  _js_helper.makeLeafDispatchRecord = function(interceptor) {
  };
  dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic$());
  const _nativeRegExp = Symbol('_nativeRegExp');
  _js_helper.regExpGetNative = function(regexp) {
    return regexp[_nativeRegExp];
  };
  dart.lazyFn(_js_helper.regExpGetNative, () => JSSyntaxRegExpTodynamic());
  const _nativeGlobalVersion = Symbol('_nativeGlobalVersion');
  _js_helper.regExpGetGlobalNative = function(regexp) {
    let nativeRegexp = regexp[_nativeGlobalVersion];
    nativeRegexp.lastIndex = 0;
    return nativeRegexp;
  };
  dart.lazyFn(_js_helper.regExpGetGlobalNative, () => JSSyntaxRegExpTodynamic());
  const _nativeAnchoredVersion = Symbol('_nativeAnchoredVersion');
  _js_helper.regExpCaptureCount = function(regexp) {
    let nativeAnchoredRegExp = regexp[_nativeAnchoredVersion];
    let match = nativeAnchoredRegExp.exec('');
    return core.int._check(dart.dsend(dart.dload(match, 'length'), '-', 2));
  };
  dart.lazyFn(_js_helper.regExpCaptureCount, () => JSSyntaxRegExpToint());
  const _nativeGlobalRegExp = Symbol('_nativeGlobalRegExp');
  const _nativeAnchoredRegExp = Symbol('_nativeAnchoredRegExp');
  const _isMultiLine = Symbol('_isMultiLine');
  const _isCaseSensitive = Symbol('_isCaseSensitive');
  const _execGlobal = Symbol('_execGlobal');
  const _execAnchored = Symbol('_execAnchored');
  _js_helper.JSSyntaxRegExp = class JSSyntaxRegExp extends core.Object {
    toString() {
      return dart.str`RegExp/${this.pattern}/`;
    }
    new(source, opts) {
      let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
      let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
      this.pattern = source;
      this[_nativeRegExp] = _js_helper.JSSyntaxRegExp.makeNative(source, multiLine, caseSensitive, false);
      this[_nativeGlobalRegExp] = null;
      this[_nativeAnchoredRegExp] = null;
    }
    get [_nativeGlobalVersion]() {
      if (this[_nativeGlobalRegExp] != null) return this[_nativeGlobalRegExp];
      return this[_nativeGlobalRegExp] = _js_helper.JSSyntaxRegExp.makeNative(this.pattern, this[_isMultiLine], this[_isCaseSensitive], true);
    }
    get [_nativeAnchoredVersion]() {
      if (this[_nativeAnchoredRegExp] != null) return this[_nativeAnchoredRegExp];
      return this[_nativeAnchoredRegExp] = _js_helper.JSSyntaxRegExp.makeNative(dart.str`${this.pattern}|()`, this[_isMultiLine], this[_isCaseSensitive], true);
    }
    get [_isMultiLine]() {
      return this[_nativeRegExp].multiline;
    }
    get [_isCaseSensitive]() {
      return !this[_nativeRegExp].ignoreCase;
    }
    static makeNative(source, multiLine, caseSensitive, global) {
      _js_helper.checkString(source);
      let m = dart.test(multiLine) ? 'm' : '';
      let i = dart.test(caseSensitive) ? '' : 'i';
      let g = dart.test(global) ? 'g' : '';
      let regexp = (function() {
        try {
          return new RegExp(source, m + i + g);
        } catch (e) {
          return e;
        }

      })();
      if (regexp instanceof RegExp) return regexp;
      let errorMessage = String(regexp);
      dart.throw(new core.FormatException(dart.str`Illegal RegExp pattern: ${source}, ${errorMessage}`));
    }
    firstMatch(string) {
      let m = this[_nativeRegExp].exec(_js_helper.checkString(string));
      if (m == null) return null;
      return new _js_helper._MatchImplementation(this, m);
    }
    hasMatch(string) {
      return this[_nativeRegExp].test(_js_helper.checkString(string));
    }
    stringMatch(string) {
      let match = this.firstMatch(string);
      if (match != null) return match.group(0);
      return null;
    }
    allMatches(string, start) {
      if (start === void 0) start = 0;
      _js_helper.checkString(string);
      _js_helper.checkInt(start);
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      return new _js_helper._AllMatchesIterable(this, string, start);
    }
    [_execGlobal](string, start) {
      let regexp = this[_nativeGlobalVersion];
      regexp.lastIndex = start;
      let match = regexp.exec(string);
      if (match == null) return null;
      return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
    }
    [_execAnchored](string, start) {
      let regexp = this[_nativeAnchoredVersion];
      regexp.lastIndex = start;
      let match = regexp.exec(string);
      if (match == null) return null;
      if (match[dartx._get](dart.notNull(match[dartx.length]) - 1) != null) return null;
      match[dartx.length] = dart.notNull(match[dartx.length]) - 1;
      return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
    }
    matchAsPrefix(string, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      return this[_execAnchored](string, start);
    }
    get isMultiLine() {
      return this[_isMultiLine];
    }
    get isCaseSensitive() {
      return this[_isCaseSensitive];
    }
  };
  _js_helper.JSSyntaxRegExp[dart.implements] = () => [core.RegExp];
  dart.setSignature(_js_helper.JSSyntaxRegExp, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSSyntaxRegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})}),
    fields: () => ({
      pattern: core.String,
      [_nativeRegExp]: dart.dynamic,
      [_nativeGlobalRegExp]: dart.dynamic,
      [_nativeAnchoredRegExp]: dart.dynamic
    }),
    getters: () => ({
      [_nativeGlobalVersion]: dart.definiteFunctionType(dart.dynamic, []),
      [_nativeAnchoredVersion]: dart.definiteFunctionType(dart.dynamic, []),
      [_isMultiLine]: dart.definiteFunctionType(core.bool, []),
      [_isCaseSensitive]: dart.definiteFunctionType(core.bool, []),
      isMultiLine: dart.definiteFunctionType(core.bool, []),
      isCaseSensitive: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      firstMatch: dart.definiteFunctionType(core.Match, [core.String]),
      hasMatch: dart.definiteFunctionType(core.bool, [core.String]),
      stringMatch: dart.definiteFunctionType(core.String, [core.String]),
      allMatches: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
      [_execGlobal]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
      [_execAnchored]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
      matchAsPrefix: dart.definiteFunctionType(core.Match, [core.String], [core.int])
    }),
    statics: () => ({makeNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool, core.bool, core.bool])}),
    names: ['makeNative']
  });
  dart.defineExtensionMembers(_js_helper.JSSyntaxRegExp, ['allMatches', 'matchAsPrefix']);
  const _match = Symbol('_match');
  _js_helper._MatchImplementation = class _MatchImplementation extends core.Object {
    new(pattern, match) {
      this.pattern = pattern;
      this[_match] = match;
      dart.assert(typeof this[_match].input == 'string');
      dart.assert(typeof this[_match].index == 'number');
    }
    get input() {
      return this[_match].input;
    }
    get start() {
      return this[_match].index;
    }
    get end() {
      return dart.notNull(this.start) + dart.notNull(this[_match][dartx._get](0)[dartx.length]);
    }
    group(index) {
      return this[_match][dartx._get](index);
    }
    _get(index) {
      return this.group(index);
    }
    get groupCount() {
      return dart.notNull(this[_match][dartx.length]) - 1;
    }
    groups(groups) {
      let out = JSArrayOfString().of([]);
      for (let i of groups) {
        out[dartx.add](this.group(i));
      }
      return out;
    }
  };
  _js_helper._MatchImplementation[dart.implements] = () => [core.Match];
  dart.setSignature(_js_helper._MatchImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._MatchImplementation, [core.Pattern, ListOfString()])}),
    fields: () => ({
      pattern: core.Pattern,
      [_match]: ListOfString()
    }),
    getters: () => ({
      input: dart.definiteFunctionType(core.String, []),
      start: dart.definiteFunctionType(core.int, []),
      end: dart.definiteFunctionType(core.int, []),
      groupCount: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      group: dart.definiteFunctionType(core.String, [core.int]),
      _get: dart.definiteFunctionType(core.String, [core.int]),
      groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
    })
  });
  const _re = Symbol('_re');
  const _string$ = Symbol('_string');
  const _start$ = Symbol('_start');
  core.Match = class Match extends core.Object {};
  _js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.Match) {
    new(re, string, start) {
      this[_re] = re;
      this[_string$] = string;
      this[_start$] = start;
      super.new();
    }
    get iterator() {
      return new _js_helper._AllMatchesIterator(this[_re], this[_string$], this[_start$]);
    }
  };
  dart.addSimpleTypeTests(_js_helper._AllMatchesIterable);
  dart.setSignature(_js_helper._AllMatchesIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterable, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
    fields: () => ({
      [_re]: _js_helper.JSSyntaxRegExp,
      [_string$]: core.String,
      [_start$]: core.int
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
  });
  dart.defineExtensionMembers(_js_helper._AllMatchesIterable, ['iterator']);
  const _regExp = Symbol('_regExp');
  const _nextIndex = Symbol('_nextIndex');
  _js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
    new(regExp, string, nextIndex) {
      this[_regExp] = regExp;
      this[_string$] = string;
      this[_nextIndex] = nextIndex;
      this[_current$0] = null;
    }
    get current() {
      return this[_current$0];
    }
    moveNext() {
      if (this[_string$] == null) return false;
      if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string$][dartx.length])) {
        let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
        if (match != null) {
          this[_current$0] = match;
          let nextIndex = match.end;
          if (match.start == nextIndex) {
            nextIndex = dart.notNull(nextIndex) + 1;
          }
          this[_nextIndex] = nextIndex;
          return true;
        }
      }
      this[_current$0] = null;
      this[_string$] = null;
      return false;
    }
  };
  _js_helper._AllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
  dart.setSignature(_js_helper._AllMatchesIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterator, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
    fields: () => ({
      [_regExp]: _js_helper.JSSyntaxRegExp,
      [_string$]: core.String,
      [_nextIndex]: core.int,
      [_current$0]: core.Match
    }),
    getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  _js_helper.firstMatchAfter = function(regExp, string, start) {
    return regExp[_execGlobal](string, start);
  };
  dart.lazyFn(_js_helper.firstMatchAfter, () => JSSyntaxRegExpAndStringAndintToMatch());
  _js_helper.stringIndexOfStringUnchecked = function(receiver, other, startIndex) {
    return receiver.indexOf(other, startIndex);
  };
  dart.fn(_js_helper.stringIndexOfStringUnchecked, dynamicAnddynamicAnddynamicToint());
  _js_helper.substring1Unchecked = function(receiver, startIndex) {
    return receiver.substring(startIndex);
  };
  dart.lazyFn(_js_helper.substring1Unchecked, () => dynamicAnddynamicToString());
  _js_helper.substring2Unchecked = function(receiver, startIndex, endIndex) {
    return receiver.substring(startIndex, endIndex);
  };
  dart.lazyFn(_js_helper.substring2Unchecked, () => dynamicAnddynamicAnddynamicToString());
  _js_helper.stringContainsStringUnchecked = function(receiver, other, startIndex) {
    return dart.notNull(_js_helper.stringIndexOfStringUnchecked(receiver, other, startIndex)) >= 0;
  };
  dart.lazyFn(_js_helper.stringContainsStringUnchecked, () => dynamicAnddynamicAnddynamicTobool());
  _js_helper.StringMatch = class StringMatch extends core.Object {
    new(start, input, pattern) {
      this.start = start;
      this.input = input;
      this.pattern = pattern;
    }
    get end() {
      return dart.notNull(this.start) + dart.notNull(this.pattern[dartx.length]);
    }
    _get(g) {
      return this.group(g);
    }
    get groupCount() {
      return 0;
    }
    group(group_) {
      if (group_ != 0) {
        dart.throw(new core.RangeError.value(group_));
      }
      return this.pattern;
    }
    groups(groups_) {
      let result = ListOfString().new();
      for (let g of groups_) {
        result[dartx.add](this.group(g));
      }
      return result;
    }
  };
  _js_helper.StringMatch[dart.implements] = () => [core.Match];
  dart.setSignature(_js_helper.StringMatch, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StringMatch, [core.int, core.String, core.String])}),
    fields: () => ({
      start: core.int,
      input: core.String,
      pattern: core.String
    }),
    getters: () => ({
      end: dart.definiteFunctionType(core.int, []),
      groupCount: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(core.String, [core.int]),
      group: dart.definiteFunctionType(core.String, [core.int]),
      groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
    })
  });
  _js_helper.allMatchesInStringUnchecked = function(pattern, string, startIndex) {
    return new _js_helper._StringAllMatchesIterable(string, pattern, startIndex);
  };
  dart.lazyFn(_js_helper.allMatchesInStringUnchecked, () => StringAndStringAndintToIterableOfMatch());
  const _input = Symbol('_input');
  const _pattern = Symbol('_pattern');
  const _index$0 = Symbol('_index');
  _js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
    new(input, pattern, index) {
      this[_input] = input;
      this[_pattern] = pattern;
      this[_index$0] = index;
      super.new();
    }
    get iterator() {
      return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index$0]);
    }
    get first() {
      let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
      if (dart.notNull(index) >= 0) {
        return new _js_helper.StringMatch(index, this[_input], this[_pattern]);
      }
      dart.throw(_internal.IterableElementError.noElement());
    }
  };
  dart.addSimpleTypeTests(_js_helper._StringAllMatchesIterable);
  dart.setSignature(_js_helper._StringAllMatchesIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterable, [core.String, core.String, core.int])}),
    fields: () => ({
      [_input]: core.String,
      [_pattern]: core.String,
      [_index$0]: core.int
    }),
    getters: () => ({
      iterator: dart.definiteFunctionType(core.Iterator$(core.Match), []),
      first: dart.definiteFunctionType(core.Match, [])
    })
  });
  dart.defineExtensionMembers(_js_helper._StringAllMatchesIterable, ['iterator', 'first']);
  _js_helper._StringAllMatchesIterator = class _StringAllMatchesIterator extends core.Object {
    new(input, pattern, index) {
      this[_input] = input;
      this[_pattern] = pattern;
      this[_index$0] = index;
      this[_current$0] = null;
    }
    moveNext() {
      if (dart.notNull(this[_index$0]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
        this[_current$0] = null;
        return false;
      }
      let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
      if (dart.notNull(index) < 0) {
        this[_index$0] = dart.notNull(this[_input][dartx.length]) + 1;
        this[_current$0] = null;
        return false;
      }
      let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
      this[_current$0] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
      if (end == this[_index$0]) end++;
      this[_index$0] = end;
      return true;
    }
    get current() {
      return this[_current$0];
    }
  };
  _js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
  dart.setSignature(_js_helper._StringAllMatchesIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterator, [core.String, core.String, core.int])}),
    fields: () => ({
      [_input]: core.String,
      [_pattern]: core.String,
      [_index$0]: core.int,
      [_current$0]: core.Match
    }),
    getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  _js_helper.stringContainsUnchecked = function(receiver, other, startIndex) {
    if (typeof other == 'string') {
      return _js_helper.stringContainsStringUnchecked(receiver, other, startIndex);
    } else if (_js_helper.JSSyntaxRegExp.is(other)) {
      return other.hasMatch(receiver[dartx.substring](startIndex));
    } else {
      let substr = receiver[dartx.substring](startIndex);
      return core.bool._check(dart.dload(dart.dsend(other, 'allMatches', substr), 'isNotEmpty'));
    }
  };
  dart.lazyFn(_js_helper.stringContainsUnchecked, () => StringAnddynamicAndintTobool());
  _js_helper.stringReplaceJS = function(receiver, replacer, replacement) {
    replacement = replacement.replace(/\$/g, "$$$$");
    return receiver.replace(replacer, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceJS, () => dynamicAnddynamicAnddynamicToString());
  _js_helper.stringReplaceFirstRE = function(receiver, regexp, replacement, startIndex) {
    let match = regexp[_execGlobal](receiver, startIndex);
    if (match == null) return receiver;
    let start = match.start;
    let end = match.end;
    return _js_helper.stringReplaceRangeUnchecked(receiver, start, end, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceFirstRE, () => StringAndJSSyntaxRegExpAndString__ToString());
  _js_helper.quoteStringForRegExp = function(string) {
    return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
  };
  dart.lazyFn(_js_helper.quoteStringForRegExp, () => dynamicToString());
  _js_helper.stringReplaceAllUnchecked = function(receiver, pattern, replacement) {
    _js_helper.checkString(replacement);
    if (typeof pattern == 'string') {
      if (pattern == "") {
        if (receiver == "") {
          return replacement;
        } else {
          let result = new core.StringBuffer();
          let length = receiver[dartx.length];
          result.write(replacement);
          for (let i = 0; i < dart.notNull(length); i++) {
            result.write(receiver[dartx._get](i));
            result.write(replacement);
          }
          return result.toString();
        }
      } else {
        let quoted = _js_helper.quoteStringForRegExp(pattern);
        let replacer = new RegExp(quoted, 'g');
        return _js_helper.stringReplaceJS(receiver, replacer, replacement);
      }
    } else if (_js_helper.JSSyntaxRegExp.is(pattern)) {
      let re = _js_helper.regExpGetGlobalNative(pattern);
      return _js_helper.stringReplaceJS(receiver, re, replacement);
    } else {
      _js_helper.checkNull(pattern);
      dart.throw("String.replaceAll(Pattern) UNIMPLEMENTED");
    }
  };
  dart.lazyFn(_js_helper.stringReplaceAllUnchecked, () => StringAndPatternAndStringToString());
  _js_helper._matchString = function(match) {
    return match._get(0);
  };
  dart.lazyFn(_js_helper._matchString, () => MatchToString$());
  _js_helper._stringIdentity = function(string) {
    return string;
  };
  dart.lazyFn(_js_helper._stringIdentity, () => StringToString$());
  _js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
    if (onMatch == null) onMatch = _js_helper._matchString;
    if (onNonMatch == null) onNonMatch = _js_helper._stringIdentity;
    if (typeof pattern == 'string') {
      return _js_helper.stringReplaceAllStringFuncUnchecked(receiver, pattern, onMatch, onNonMatch);
    }
    if (!core.Pattern.is(pattern)) {
      dart.throw(new core.ArgumentError.value(pattern, 'pattern', 'is not a Pattern'));
    }
    let buffer = new core.StringBuffer();
    let startIndex = 0;
    for (let match of pattern[dartx.allMatches](receiver)) {
      buffer.write(onNonMatch(receiver[dartx.substring](startIndex, match.start)));
      buffer.write(onMatch(match));
      startIndex = match.end;
    }
    buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
    return buffer.toString();
  };
  dart.lazyFn(_js_helper.stringReplaceAllFuncUnchecked, () => StringAndPatternAndFn__ToString());
  _js_helper.stringReplaceAllEmptyFuncUnchecked = function(receiver, onMatch, onNonMatch) {
    let buffer = new core.StringBuffer();
    let length = receiver[dartx.length];
    let i = 0;
    buffer.write(onNonMatch(""));
    while (i < dart.notNull(length)) {
      buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
      let code = receiver[dartx.codeUnitAt](i);
      if ((dart.notNull(code) & ~1023) == 55296 && dart.notNull(length) > i + 1) {
        code = receiver[dartx.codeUnitAt](i + 1);
        if ((dart.notNull(code) & ~1023) == 56320) {
          buffer.write(onNonMatch(receiver[dartx.substring](i, i + 2)));
          i = i + 2;
          continue;
        }
      }
      buffer.write(onNonMatch(receiver[dartx._get](i)));
      i++;
    }
    buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
    buffer.write(onNonMatch(""));
    return buffer.toString();
  };
  dart.lazyFn(_js_helper.stringReplaceAllEmptyFuncUnchecked, () => StringAndFnAndFnToString());
  _js_helper.stringReplaceAllStringFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
    let patternLength = pattern[dartx.length];
    if (patternLength == 0) {
      return _js_helper.stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
    }
    let length = receiver[dartx.length];
    let buffer = new core.StringBuffer();
    let startIndex = 0;
    while (startIndex < dart.notNull(length)) {
      let position = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
      if (position == -1) {
        break;
      }
      buffer.write(onNonMatch(receiver[dartx.substring](startIndex, position)));
      buffer.write(onMatch(new _js_helper.StringMatch(position, receiver, pattern)));
      startIndex = dart.notNull(position) + dart.notNull(patternLength);
    }
    buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
    return buffer.toString();
  };
  dart.lazyFn(_js_helper.stringReplaceAllStringFuncUnchecked, () => StringAndStringAndFn__ToString());
  _js_helper.stringReplaceFirstUnchecked = function(receiver, pattern, replacement, startIndex) {
    if (typeof pattern == 'string') {
      let index = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
      if (dart.notNull(index) < 0) return receiver;
      let end = dart.notNull(index) + dart.notNull(pattern[dartx.length]);
      return _js_helper.stringReplaceRangeUnchecked(receiver, index, end, replacement);
    }
    if (_js_helper.JSSyntaxRegExp.is(pattern)) {
      return startIndex == 0 ? _js_helper.stringReplaceJS(receiver, _js_helper.regExpGetNative(pattern), replacement) : _js_helper.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
    }
    _js_helper.checkNull(pattern);
    let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
    if (!dart.test(matches.moveNext())) return receiver;
    let match = matches.current;
    return receiver[dartx.replaceRange](match.start, match.end, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceFirstUnchecked, () => StringAndPatternAndString__ToString());
  _js_helper.stringReplaceFirstMappedUnchecked = function(receiver, pattern, replace, startIndex) {
    let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
    if (!dart.test(matches.moveNext())) return receiver;
    let match = matches.current;
    let replacement = dart.str`${replace(match)}`;
    return receiver[dartx.replaceRange](match.start, match.end, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString$());
  _js_helper.stringJoinUnchecked = function(array, separator) {
    return array.join(separator);
  };
  dart.lazyFn(_js_helper.stringJoinUnchecked, () => dynamicAnddynamicToString());
  _js_helper.stringReplaceRangeUnchecked = function(receiver, start, end, replacement) {
    let prefix = receiver.substring(0, start);
    let suffix = receiver.substring(end);
    return dart.str`${prefix}${replacement}${suffix}`;
  };
  dart.lazyFn(_js_helper.stringReplaceRangeUnchecked, () => StringAndintAndint__ToString());
  _js_helper.getRuntimeType = function(object) {
    return dart.getReifiedType(object);
  };
  dart.fn(_js_helper.getRuntimeType, dynamicToType());
  _js_helper.getIndex = function(array, index) {
    dart.assert(_js_helper.isJsArray(array));
    return array[index];
  };
  dart.fn(_js_helper.getIndex, dynamicAndintTodynamic());
  _js_helper.getLength = function(array) {
    dart.assert(_js_helper.isJsArray(array));
    return array.length;
  };
  dart.fn(_js_helper.getLength, dynamicToint());
  _js_helper.isJsArray = function(value) {
    return _interceptors.JSArray.is(value);
  };
  dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
  _js_mirrors.getName = function(symbol) {
    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
  };
  dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
  _js_mirrors.getSymbol = function(name, library) {
    return dart.throw(new core.UnimplementedError("MirrorSystem.getSymbol unimplemented"));
  };
  dart.lazyFn(_js_mirrors.getSymbol, () => dynamicAnddynamicToSymbol());
  dart.defineLazy(_js_mirrors, {
    get currentJsMirrorSystem() {
      return dart.throw(new core.UnimplementedError("MirrorSystem.currentJsMirrorSystem unimplemented"));
    }
  });
  dart.defineLazy(_js_mirrors, {
    get _typeMirror() {
      return Symbol("_typeMirror");
    }
  });
  _js_mirrors.reflect = function(reflectee) {
    if (core.Function.is(reflectee)) {
      return new _js_mirrors.JsClosureMirror._(reflectee);
    } else {
      return new _js_mirrors.JsInstanceMirror._(reflectee);
    }
  };
  dart.lazyFn(_js_mirrors.reflect, () => dynamicToInstanceMirror());
  _js_mirrors.reflectType = function(key) {
    let unwrapped = _js_mirrors._unwrap(key);
    let property = Object.getOwnPropertyDescriptor(unwrapped, _js_mirrors._typeMirror);
    if (property != null) {
      return property.value;
    }
    let mirror = new _js_mirrors.JsClassMirror._(key);
    unwrapped[_js_mirrors._typeMirror] = mirror;
    return mirror;
  };
  dart.lazyFn(_js_mirrors.reflectType, () => TypeToTypeMirror());
  dart.defineLazy(_js_mirrors, {
    get _dart() {
      return dart;
    }
  });
  _js_mirrors._dload = function(obj, name) {
    return _js_mirrors._dart.dload(obj, name);
  };
  dart.lazyFn(_js_mirrors._dload, () => dynamicAndStringTodynamic());
  _js_mirrors._dput = function(obj, name, val) {
    _js_mirrors._dart.dput(obj, name, val);
  };
  dart.lazyFn(_js_mirrors._dput, () => dynamicAndStringAnddynamicTovoid());
  _js_mirrors._dcall = function(obj, args) {
    return _js_mirrors._dart.dcall(obj, ...args);
  };
  dart.lazyFn(_js_mirrors._dcall, () => dynamicAndListTodynamic());
  _js_mirrors._dsend = function(obj, name, args) {
    return _js_mirrors._dart.dsend(obj, name, ...args);
  };
  dart.lazyFn(_js_mirrors._dsend, () => dynamicAndStringAndListTodynamic());
  _js_mirrors._getGenericClass = function(obj) {
    return _js_mirrors._dart.getGenericClass(obj);
  };
  dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic$());
  _js_mirrors._getGenericArgs = function(obj) {
    return _js_mirrors._dart.getGenericArgs(obj);
  };
  dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic$());
  _js_mirrors._defaultConstructorType = function(type) {
    return _js_mirrors._dart.definiteFunctionType(type, []);
  };
  dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
  _js_mirrors._getMixins = function(type) {
    return _js_mirrors._dart.getMixins(type, []);
  };
  dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
  _js_mirrors._Lazy$ = dart.generic(T => {
    const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
    return _Lazy;
  });
  _js_mirrors._Lazy = _Lazy();
  _js_mirrors._getESSymbol = function(symbol) {
    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
  };
  dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
  _js_mirrors._getMember = function(symbol) {
    let privateSymbol = _js_mirrors._getESSymbol(symbol);
    if (privateSymbol != null) {
      return privateSymbol;
    }
    return _js_mirrors.getName(symbol);
  };
  dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
  _js_mirrors._getNameForESSymbol = function(member) {
    dart.assert(typeof member == "symbol");
    let str = dart.toString(member);
    dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
    return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
  };
  dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
  _js_mirrors._getSymbolForESSymbol = function(member) {
    let name = _js_mirrors._getNameForESSymbol(member);
    return new _internal.Symbol.es6(name, member);
  };
  dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
  _js_mirrors._getSymbolForMember = function(member) {
    if (typeof member == 'string') {
      return core.Symbol.new(member);
    } else {
      let name = _js_mirrors._getNameForESSymbol(member);
      return new _internal.Symbol.es6(name, member);
    }
  };
  dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
  _js_mirrors._toDartMap = function(data) {
    if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
    let map = MapOfSymbol$dynamic().new();
    let publicMembers = Object.getOwnPropertyNames(data);
    for (let member of core.Iterable._check(publicMembers)) {
      let symbol = core.Symbol.new(core.String._check(member));
      map[dartx._set](symbol, data[member]);
    }
    let privateMembers = Object.getOwnPropertySymbols(data);
    for (let member of core.Iterable._check(privateMembers)) {
      let symbol = _js_mirrors._getSymbolForESSymbol(member);
      map[dartx._set](symbol, data[member]);
    }
    return map;
  };
  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getConstructors = function(obj) {
    let sig = _js_mirrors._dart.getConstructorSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getFields = function(obj) {
    let sig = _js_mirrors._dart.getFieldSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getMethods = function(obj) {
    let sig = _js_mirrors._dart.getMethodSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getGetters = function(obj) {
    let sig = _js_mirrors._dart.getGetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getSetters = function(obj) {
    let sig = _js_mirrors._dart.getSetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStaticFields = function(obj) {
    let sig = _js_mirrors._dart.getStaticFieldSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStatics = function(obj) {
    let sig = _js_mirrors._dart.getStaticSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStaticGetters = function(obj) {
    let sig = _js_mirrors._dart.getStaticGetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStaticSetters = function(obj) {
    let sig = _js_mirrors._dart.getStaticSetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._unwrap = function(obj) {
    return _js_mirrors._dart.unwrapType(obj);
  };
  dart.fn(_js_mirrors._unwrap, dynamicTodynamic$());
  _js_mirrors._wrap = function(obj) {
    return _js_mirrors._dart.wrapType(obj);
  };
  dart.fn(_js_mirrors._wrap, dynamicTodynamic$());
  _js_mirrors._runtimeType = function(obj) {
    return _js_mirrors._wrap(_js_mirrors._dart.getReifiedType(obj));
  };
  dart.fn(_js_mirrors._runtimeType, dynamicTodynamic$());
  _js_mirrors._unimplemented = function(t, i) {
    dart.throw(new core.UnimplementedError(dart.str`${t}.${_js_mirrors.getName(i.memberName)} unimplemented`));
  };
  dart.fn(_js_mirrors._unimplemented, TypeAndInvocationTodynamic());
  _js_mirrors._toJsMap = function(map) {
    let obj = {};
    map[dartx.forEach](dart.fn((key, value) => {
      obj[_js_mirrors.getName(key)] = value;
    }, SymbolAnddynamicTovoid()));
    return obj;
  };
  dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
  _js_mirrors.JsMirror = class JsMirror extends core.Object {
    noSuchMethod(i) {
      _js_mirrors._unimplemented(this.runtimeType, i);
    }
  };
  _js_mirrors.JsMirror[dart.implements] = () => [mirrors.Mirror];
  _js_mirrors.JsCombinatorMirror = class JsCombinatorMirror extends _js_mirrors.JsMirror {
    get identifiers() {
      return ListOfSymbol()._check(this.noSuchMethod(new dart.InvocationImpl('identifiers', [], {isGetter: true})));
    }
    get isShow() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isShow', [], {isGetter: true})));
    }
    get isHide() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isHide', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsCombinatorMirror[dart.implements] = () => [mirrors.CombinatorMirror];
  _js_mirrors.JsDeclarationMirror = class JsDeclarationMirror extends _js_mirrors.JsMirror {
    get simpleName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('simpleName', [], {isGetter: true})));
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get metadata() {
      return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsDeclarationMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  _js_mirrors.JsIsolateMirror = class JsIsolateMirror extends _js_mirrors.JsMirror {
    get debugName() {
      return core.String._check(this.noSuchMethod(new dart.InvocationImpl('debugName', [], {isGetter: true})));
    }
    get isCurrent() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isCurrent', [], {isGetter: true})));
    }
    get rootLibrary() {
      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('rootLibrary', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
  _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
    get isImport() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
    }
    get isExport() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
    }
    get sourceLibrary() {
      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
    }
    get targetLibrary() {
      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('targetLibrary', [], {isGetter: true})));
    }
    get prefix() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('prefix', [], {isGetter: true})));
    }
    get combinators() {
      return ListOfCombinatorMirror()._check(this.noSuchMethod(new dart.InvocationImpl('combinators', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get metadata() {
      return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsLibraryDependencyMirror[dart.implements] = () => [mirrors.LibraryDependencyMirror];
  _js_mirrors.JsObjectMirror = class JsObjectMirror extends _js_mirrors.JsMirror {
    invoke(...args) {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('invoke', args, {isMethod: true})));
    }
    getField(...args) {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('getField', args, {isMethod: true})));
    }
    setField(...args) {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
    }
  };
  _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
  const _getAccessor = Symbol('_getAccessor');
  _js_mirrors.JsInstanceMirror = class JsInstanceMirror extends _js_mirrors.JsObjectMirror {
    get hasReflectee() {
      return true;
    }
    get type() {
      if (this.reflectee == null) return mirrors.reflectClass(dart.wrapType(core.Null));
      return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._runtimeType(this.reflectee))));
    }
    _(reflectee) {
      this.reflectee = reflectee;
    }
    ['=='](other) {
      return _js_mirrors.JsInstanceMirror.is(other) && core.identical(this.reflectee, other.reflectee);
    }
    get hashCode() {
      return (dart.notNull(core.identityHashCode(this.reflectee)) ^ 909522486) >>> 0;
    }
    [_getAccessor](reflectee, symbol, args, namedArgs) {
      if (args === void 0) args = null;
      if (namedArgs === void 0) namedArgs = null;
      return _js_mirrors._getMember(symbol);
    }
    getField(symbol) {
      let name = this[_getAccessor](this.reflectee, symbol);
      let field = _js_mirrors._dload(this.reflectee, core.String._check(name));
      return _js_mirrors.reflect(field);
    }
    setField(symbol, value) {
      let name = this[_getAccessor](this.reflectee, symbol);
      _js_mirrors._dput(this.reflectee, core.String._check(name), value);
      return _js_mirrors.reflect(value);
    }
    invoke(symbol, args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      let name = this[_getAccessor](this.reflectee, symbol, args, namedArgs);
      if (namedArgs != null) {
        args = core.List.from(args);
        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
      }
      let result = _js_mirrors._dsend(this.reflectee, core.String._check(name), args);
      return _js_mirrors.reflect(result);
    }
    toString() {
      return dart.str`InstanceMirror on '${this.reflectee}'`;
    }
    delegate(...args) {
      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsInstanceMirror, '_');
  _js_mirrors.JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
  dart.setSignature(_js_mirrors.JsInstanceMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsInstanceMirror, [dart.dynamic])}),
    fields: () => ({reflectee: dart.dynamic}),
    getters: () => ({
      hasReflectee: dart.definiteFunctionType(core.bool, []),
      type: dart.definiteFunctionType(mirrors.ClassMirror, [])
    }),
    methods: () => ({
      '==': dart.definiteFunctionType(core.bool, [core.Object]),
      [_getAccessor]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Symbol], [core.List, MapOfSymbol$dynamic()]),
      getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
      setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
      invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
    })
  });
  _js_mirrors.JsClosureMirror = class JsClosureMirror extends _js_mirrors.JsInstanceMirror {
    _(reflectee) {
      super._(reflectee);
    }
    apply(args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      if (namedArgs != null) {
        args = core.List.from(args);
        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
      }
      let result = _js_mirrors._dcall(this.reflectee, args);
      return _js_mirrors.reflect(result);
    }
    delegate(...args) {
      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
    }
    get function() {
      return mirrors.MethodMirror._check(this.noSuchMethod(new dart.InvocationImpl('function', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsClosureMirror, '_');
  _js_mirrors.JsClosureMirror[dart.implements] = () => [mirrors.ClosureMirror];
  dart.setSignature(_js_mirrors.JsClosureMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClosureMirror, [dart.dynamic])}),
    methods: () => ({apply: dart.definiteFunctionType(mirrors.InstanceMirror, [core.List], [MapOfSymbol$dynamic()])})
  });
  const _metadata$ = Symbol('_metadata');
  const _cls = Symbol('_cls');
  let const$0;
  const _declarations = Symbol('_declarations');
  const _raw = Symbol('_raw');
  const _mixin = Symbol('_mixin');
  const _typeArguments = Symbol('_typeArguments');
  let const$1;
  _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
    get metadata() {
      if (this[_metadata$] == null) {
        let unwrapped = _js_mirrors._unwrap(this[_cls]);
        let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
        this[_metadata$] = fn == null ? const$0 || (const$0 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
      }
      return this[_metadata$];
    }
    get declarations() {
      if (this[_declarations] == null) {
        this[_declarations] = MapOfSymbol$DeclarationMirror().new();
        let unwrapped = _js_mirrors._unwrap(this[_cls]);
        let constructors = _js_mirrors._getConstructors(unwrapped);
        constructors[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        if (dart.test(constructors[dartx.isEmpty])) {
          let name = 'new';
          let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
          let symbol = core.Symbol.new(name);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
        }
        let fields = _js_mirrors._getFields(unwrapped);
        fields[dartx.forEach](dart.fn((symbol, t) => {
          let metadata = [];
          if (core.List.is(t)) {
            metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
            t = dart.dindex(t, 0);
          }
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
        }, SymbolAnddynamicTovoid()));
        let methods = _js_mirrors._getMethods(unwrapped);
        methods[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let getters = _js_mirrors._getGetters(unwrapped);
        getters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let setters = _js_mirrors._getSetters(unwrapped);
        setters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let staticFields = _js_mirrors._getStaticFields(unwrapped);
        staticFields[dartx.forEach](dart.fn((symbol, t) => {
          let name = _js_mirrors.getName(symbol);
          let metadata = [];
          if (core.List.is(t)) {
            metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
            t = dart.dindex(t, 0);
          }
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
        }, SymbolAnddynamicTovoid()));
        let statics = _js_mirrors._getStatics(unwrapped);
        statics[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
        staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
        staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
      }
      return this[_declarations];
    }
    _(cls) {
      this[_cls] = cls;
      this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
      this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
      this[_mixin] = null;
      this[_typeArguments] = null;
      this[_metadata$] = null;
      this[_declarations] = null;
      let typeArgs = _js_mirrors._getGenericArgs(_js_mirrors._unwrap(cls));
      if (typeArgs == null) {
        this[_typeArguments] = const$1 || (const$1 = dart.constList([], mirrors.TypeMirror));
      } else {
        this[_typeArguments] = ListOfTypeMirror().unmodifiable(core.Iterable._check(dart.dsend(typeArgs, 'map', dart.fn(t => _js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(t))), dynamicToTypeMirror()))));
      }
    }
    newInstance(constructorName, args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      let name = _js_mirrors.getName(constructorName);
      dart.assert(namedArgs == null || dart.test(namedArgs[dartx.isEmpty]));
      let instance = name == 'new' || name == '' ? new (_js_mirrors._unwrap(this[_cls]))(...args) : new (_js_mirrors._unwrap(this[_cls]))[name](...args);
      return _js_mirrors.reflect(instance);
    }
    getField(symbol) {
      let name = _js_mirrors.getName(symbol);
      return _js_mirrors.reflect(_js_mirrors._unwrap(this[_cls])[name]);
    }
    setField(symbol, value) {
      let name = _js_mirrors.getName(symbol);
      _js_mirrors._unwrap(this[_cls])[name] = value;
      return _js_mirrors.reflect(value);
    }
    invoke(symbol, args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      let name = _js_mirrors.getName(symbol);
      if (namedArgs != null) {
        args = core.List.from(args);
        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
      }
      let result = _js_mirrors._unwrap(this[_cls])[name](...args);
      return _js_mirrors.reflect(result);
    }
    get superinterfaces() {
      let interfaceThunk = _js_mirrors._unwrap(this[_cls])[dart.implements];
      if (interfaceThunk == null) {
        return JSArrayOfClassMirror().of([]);
      } else {
        let interfaces = interfaceThunk();
        return ListOfClassMirror()._check(interfaces[dartx.map](mirrors.TypeMirror)(dart.fn(t => _js_mirrors.reflectType(t), TypeToTypeMirror()))[dartx.toList]());
      }
    }
    get hasReflectedType() {
      return true;
    }
    get reflectedType() {
      return this[_cls];
    }
    get isOriginalDeclaration() {
      return this[_raw] == null;
    }
    get typeArguments() {
      return this[_typeArguments];
    }
    get originalDeclaration() {
      if (this[_raw] == null) {
        return this;
      }
      dart.throw(new core.UnimplementedError("ClassMirror.originalDeclaration unimplemented"));
    }
    get superclass() {
      if (dart.equals(this[_cls], dart.wrapType(core.Object))) {
        return null;
      } else {
        return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
      }
    }
    get mixin() {
      if (this[_mixin] != null) {
        return this[_mixin];
      }
      let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
      if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
        this[_mixin] = this;
        return this[_mixin];
      }
      if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
        dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
      }
      this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
      return this[_mixin];
    }
    toString() {
      return dart.str`ClassMirror on '${this[_cls]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    isSubtypeOf(...args) {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubtypeOf', args, {isMethod: true})));
    }
    isAssignableTo(...args) {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAssignableTo', args, {isMethod: true})));
    }
    get typeVariables() {
      return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
    }
    isSubclassOf(...args) {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
    }
    get isAbstract() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
    }
    get instanceMembers() {
      return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
    }
    get staticMembers() {
      return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('staticMembers', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsClassMirror, '_');
  _js_mirrors.JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
  dart.setSignature(_js_mirrors.JsClassMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClassMirror, [core.Type])}),
    fields: () => ({
      [_cls]: core.Type,
      simpleName: core.Symbol,
      [_raw]: dart.dynamic,
      [_mixin]: mirrors.ClassMirror,
      [_typeArguments]: ListOfTypeMirror(),
      [_metadata$]: ListOfInstanceMirror(),
      [_declarations]: MapOfSymbol$DeclarationMirror()
    }),
    getters: () => ({
      metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), []),
      declarations: dart.definiteFunctionType(core.Map$(core.Symbol, mirrors.DeclarationMirror), []),
      superinterfaces: dart.definiteFunctionType(core.List$(mirrors.ClassMirror), []),
      hasReflectedType: dart.definiteFunctionType(core.bool, []),
      reflectedType: dart.definiteFunctionType(core.Type, []),
      isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
      typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
      originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
      superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
      mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
    }),
    methods: () => ({
      newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
      getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
      setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
      invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
    })
  });
  const _symbol = Symbol('_symbol');
  const _name$ = Symbol('_name');
  _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
    get simpleName() {
      return this[_symbol];
    }
    _(symbol, t, annotations) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.type = _js_mirrors.reflectType(t);
      this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
      this.isStatic = false;
      this.isFinal = false;
    }
    toString() {
      return dart.str`VariableMirror on '${this[_name$]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get isConst() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
  _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
  dart.setSignature(_js_mirrors.JsVariableMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
    fields: () => ({
      [_symbol]: core.Symbol,
      [_name$]: core.String,
      type: mirrors.TypeMirror,
      metadata: ListOfInstanceMirror(),
      isStatic: core.bool,
      isFinal: core.bool
    }),
    getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
  });
  _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
    _(member, t, annotations) {
      super._(member, t, annotations);
    }
    toString() {
      return dart.str`ParameterMirror on '${this[_name$]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get isConst() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
    }
    get isOptional() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOptional', [], {isGetter: true})));
    }
    get isNamed() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isNamed', [], {isGetter: true})));
    }
    get hasDefaultValue() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('hasDefaultValue', [], {isGetter: true})));
    }
    get defaultValue() {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('defaultValue', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
  _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
  dart.setSignature(_js_mirrors.JsParameterMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
  });
  const _params = Symbol('_params');
  const _createParameterMirrorList = Symbol('_createParameterMirrorList');
  let const$2;
  let const$3;
  let const$4;
  _js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
    get isSetter() {
      return this[_name$][dartx.endsWith]('=');
    }
    get isPrivate() {
      return this[_name$][dartx.startsWith]('_');
    }
    get simpleName() {
      return this[_symbol];
    }
    _constructor(cls, symbol, ftype) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.isConstructor = true;
      this.isStatic = false;
      this[_params] = null;
      this[_metadata$] = null;
      this.isFinal = false;
      this[_createParameterMirrorList](ftype);
    }
    _instanceMethod(cls, symbol, ftype) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.isConstructor = false;
      this.isStatic = false;
      this[_params] = null;
      this[_metadata$] = null;
      this.isFinal = false;
      this[_createParameterMirrorList](ftype);
    }
    _staticMethod(cls, symbol, ftype) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.isConstructor = false;
      this.isStatic = true;
      this[_params] = null;
      this[_metadata$] = null;
      this.isFinal = false;
      this[_createParameterMirrorList](ftype);
    }
    get constructorName() {
      return dart.test(this.isConstructor) ? this[_symbol] : null;
    }
    get parameters() {
      return this[_params];
    }
    get metadata() {
      return this[_metadata$];
    }
    [_createParameterMirrorList](ftype) {
      if (ftype == null) {
        this[_params] = const$2 || (const$2 = dart.constList([], mirrors.ParameterMirror));
        this[_metadata$] = const$3 || (const$3 = dart.constList([], mirrors.InstanceMirror));
        return;
      }
      if (!core.Function.is(ftype) && core.List.is(ftype)) {
        this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
        ftype = dart.dindex(ftype, 0);
      } else {
        this[_metadata$] = const$4 || (const$4 = dart.constList([], mirrors.InstanceMirror));
      }
      if (typeof ftype == "function") {
        ftype = ftype.apply(null, JSArrayOfType().of([dart.dynamic, dart.dynamic, dart.dynamic]));
      }
      let args = core.List._check(dart.dload(ftype, 'args'));
      let opts = core.List._check(dart.dload(ftype, 'optionals'));
      let params = ListOfParameterMirror().new(dart.notNull(args[dartx.length]) + dart.notNull(opts[dartx.length]));
      for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
        let type = args[dartx._get](i);
        let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
        params[dartx._set](i, param);
      }
      for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
        let type = opts[dartx._get](i);
        let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
        params[dartx._set](i + dart.notNull(args[dartx.length]), param);
      }
      this[_params] = ListOfParameterMirror().unmodifiable(params);
    }
    toString() {
      return dart.str`MethodMirror on '${this[_name$]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get returnType() {
      return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl('returnType', [], {isGetter: true})));
    }
    get source() {
      return core.String._check(this.noSuchMethod(new dart.InvocationImpl('source', [], {isGetter: true})));
    }
    get isAbstract() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
    }
    get isSynthetic() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSynthetic', [], {isGetter: true})));
    }
    get isRegularMethod() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRegularMethod', [], {isGetter: true})));
    }
    get isOperator() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOperator', [], {isGetter: true})));
    }
    get isGetter() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGetter', [], {isGetter: true})));
    }
    get isConstConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConstConstructor', [], {isGetter: true})));
    }
    get isGenerativeConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGenerativeConstructor', [], {isGetter: true})));
    }
    get isRedirectingConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRedirectingConstructor', [], {isGetter: true})));
    }
    get isFactoryConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isFactoryConstructor', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_constructor');
  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_instanceMethod');
  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_staticMethod');
  _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
  dart.setSignature(_js_mirrors.JsMethodMirror, {
    constructors: () => ({
      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
    }),
    fields: () => ({
      [_symbol]: core.Symbol,
      [_name$]: core.String,
      [_params]: ListOfParameterMirror(),
      [_metadata$]: ListOfInstanceMirror(),
      isConstructor: core.bool,
      isStatic: core.bool,
      isFinal: core.bool
    }),
    getters: () => ({
      isSetter: dart.definiteFunctionType(core.bool, []),
      isPrivate: dart.definiteFunctionType(core.bool, []),
      simpleName: dart.definiteFunctionType(core.Symbol, []),
      constructorName: dart.definiteFunctionType(core.Symbol, []),
      parameters: dart.definiteFunctionType(core.List$(mirrors.ParameterMirror), []),
      metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), [])
    }),
    methods: () => ({[_createParameterMirrorList]: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  _js_primitives.printString = function(string) {
    if (typeof dartPrint == "function") {
      dartPrint(string);
      return;
    }
    if (typeof console == "object" && typeof console.log != "undefined") {
      console.log(string);
      return;
    }
    if (typeof window == "object") {
      return;
    }
    if (typeof print == "function") {
      print(string);
      return;
    }
    throw "Unable to print message: " + String(string);
  };
  dart.lazyFn(_js_primitives.printString, () => StringTovoid$());
  _metadata.SupportedBrowser = class SupportedBrowser extends core.Object {
    new(browserName, minimumVersion) {
      if (minimumVersion === void 0) minimumVersion = null;
      this.browserName = browserName;
      this.minimumVersion = minimumVersion;
    }
  };
  dart.setSignature(_metadata.SupportedBrowser, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.SupportedBrowser, [core.String], [core.String])}),
    fields: () => ({
      browserName: core.String,
      minimumVersion: core.String
    }),
    sfields: () => ({
      CHROME: core.String,
      FIREFOX: core.String,
      IE: core.String,
      OPERA: core.String,
      SAFARI: core.String
    })
  });
  _metadata.SupportedBrowser.CHROME = "Chrome";
  _metadata.SupportedBrowser.FIREFOX = "Firefox";
  _metadata.SupportedBrowser.IE = "Internet Explorer";
  _metadata.SupportedBrowser.OPERA = "Opera";
  _metadata.SupportedBrowser.SAFARI = "Safari";
  _metadata.Experimental = class Experimental extends core.Object {
    new() {
    }
  };
  dart.setSignature(_metadata.Experimental, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.Experimental, [])})
  });
  _metadata.DomName = class DomName extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_metadata.DomName, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.DomName, [core.String])}),
    fields: () => ({name: core.String})
  });
  _metadata.DocsEditable = class DocsEditable extends core.Object {
    new() {
    }
  };
  dart.setSignature(_metadata.DocsEditable, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.DocsEditable, [])})
  });
  _metadata.Unstable = class Unstable extends core.Object {
    new() {
    }
  };
  dart.setSignature(_metadata.Unstable, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.Unstable, [])})
  });
  dart.defineExtensionNames([
    'lengthInBytes',
    'runtimeType',
    'asUint8List',
    'asInt8List',
    'asUint8ClampedList',
    'asUint16List',
    'asInt16List',
    'asUint32List',
    'asInt32List',
    'asUint64List',
    'asInt64List',
    'asInt32x4List',
    'asFloat32List',
    'asFloat64List',
    'asFloat32x4List',
    'asFloat64x2List',
    'asByteData'
  ]);
  _native_typed_data.NativeByteBuffer = class NativeByteBuffer extends core.Object {
    get [dartx.lengthInBytes]() {
      return this.byteLength;
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.ByteBuffer);
    }
    [dartx.asUint8List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint8List.view(this, offsetInBytes, length);
    }
    [dartx.asInt8List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeInt8List.view(this, offsetInBytes, length);
    }
    [dartx.asUint8ClampedList](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint8ClampedList.view(this, offsetInBytes, length);
    }
    [dartx.asUint16List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint16List.view(this, offsetInBytes, length);
    }
    [dartx.asInt16List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeInt16List.view(this, offsetInBytes, length);
    }
    [dartx.asUint32List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint32List.view(this, offsetInBytes, length);
    }
    [dartx.asInt32List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeInt32List.view(this, offsetInBytes, length);
    }
    [dartx.asUint64List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
    }
    [dartx.asInt64List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
    }
    [dartx.asInt32x4List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      let storage = _native_typed_data.NativeInt32List._check(this[dartx.asInt32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
      return new _native_typed_data.NativeInt32x4List._externalStorage(storage);
    }
    [dartx.asFloat32List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeFloat32List.view(this, offsetInBytes, length);
    }
    [dartx.asFloat64List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeFloat64List.view(this, offsetInBytes, length);
    }
    [dartx.asFloat32x4List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      let storage = _native_typed_data.NativeFloat32List._check(this[dartx.asFloat32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
      return new _native_typed_data.NativeFloat32x4List._externalStorage(storage);
    }
    [dartx.asFloat64x2List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      let storage = _native_typed_data.NativeFloat64List._check(this[dartx.asFloat64List](offsetInBytes, length != null ? dart.notNull(length) * 2 : null));
      return new _native_typed_data.NativeFloat64x2List._externalStorage(storage);
    }
    [dartx.asByteData](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeByteData.view(this, offsetInBytes, length);
    }
  };
  _native_typed_data.NativeByteBuffer[dart.implements] = () => [typed_data.ByteBuffer];
  dart.setSignature(_native_typed_data.NativeByteBuffer, {
    getters: () => ({[dartx.lengthInBytes]: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      [dartx.asUint8List]: dart.definiteFunctionType(typed_data.Uint8List, [], [core.int, core.int]),
      [dartx.asInt8List]: dart.definiteFunctionType(typed_data.Int8List, [], [core.int, core.int]),
      [dartx.asUint8ClampedList]: dart.definiteFunctionType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
      [dartx.asUint16List]: dart.definiteFunctionType(typed_data.Uint16List, [], [core.int, core.int]),
      [dartx.asInt16List]: dart.definiteFunctionType(typed_data.Int16List, [], [core.int, core.int]),
      [dartx.asUint32List]: dart.definiteFunctionType(typed_data.Uint32List, [], [core.int, core.int]),
      [dartx.asInt32List]: dart.definiteFunctionType(typed_data.Int32List, [], [core.int, core.int]),
      [dartx.asUint64List]: dart.definiteFunctionType(typed_data.Uint64List, [], [core.int, core.int]),
      [dartx.asInt64List]: dart.definiteFunctionType(typed_data.Int64List, [], [core.int, core.int]),
      [dartx.asInt32x4List]: dart.definiteFunctionType(typed_data.Int32x4List, [], [core.int, core.int]),
      [dartx.asFloat32List]: dart.definiteFunctionType(typed_data.Float32List, [], [core.int, core.int]),
      [dartx.asFloat64List]: dart.definiteFunctionType(typed_data.Float64List, [], [core.int, core.int]),
      [dartx.asFloat32x4List]: dart.definiteFunctionType(typed_data.Float32x4List, [], [core.int, core.int]),
      [dartx.asFloat64x2List]: dart.definiteFunctionType(typed_data.Float64x2List, [], [core.int, core.int]),
      [dartx.asByteData]: dart.definiteFunctionType(typed_data.ByteData, [], [core.int, core.int])
    })
  });
  dart.registerExtension(dart.global.ArrayBuffer, _native_typed_data.NativeByteBuffer);
  const _storage = Symbol('_storage');
  typed_data.Float32x4 = class Float32x4 extends core.Object {
    static new(x, y, z, w) {
      return new _native_typed_data.NativeFloat32x4(x, y, z, w);
    }
    static splat(v) {
      return new _native_typed_data.NativeFloat32x4.splat(v);
    }
    static zero() {
      return new _native_typed_data.NativeFloat32x4.zero();
    }
    static fromInt32x4Bits(x) {
      return _native_typed_data.NativeFloat32x4.fromInt32x4Bits(x);
    }
    static fromFloat64x2(v) {
      return new _native_typed_data.NativeFloat32x4.fromFloat64x2(v);
    }
  };
  dart.setSignature(typed_data.Float32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float32x4, [core.double, core.double, core.double, core.double]),
      splat: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      zero: dart.definiteFunctionType(typed_data.Float32x4, []),
      fromInt32x4Bits: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Int32x4]),
      fromFloat64x2: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float64x2])
    }),
    sfields: () => ({
      XXXX: core.int,
      XXXY: core.int,
      XXXZ: core.int,
      XXXW: core.int,
      XXYX: core.int,
      XXYY: core.int,
      XXYZ: core.int,
      XXYW: core.int,
      XXZX: core.int,
      XXZY: core.int,
      XXZZ: core.int,
      XXZW: core.int,
      XXWX: core.int,
      XXWY: core.int,
      XXWZ: core.int,
      XXWW: core.int,
      XYXX: core.int,
      XYXY: core.int,
      XYXZ: core.int,
      XYXW: core.int,
      XYYX: core.int,
      XYYY: core.int,
      XYYZ: core.int,
      XYYW: core.int,
      XYZX: core.int,
      XYZY: core.int,
      XYZZ: core.int,
      XYZW: core.int,
      XYWX: core.int,
      XYWY: core.int,
      XYWZ: core.int,
      XYWW: core.int,
      XZXX: core.int,
      XZXY: core.int,
      XZXZ: core.int,
      XZXW: core.int,
      XZYX: core.int,
      XZYY: core.int,
      XZYZ: core.int,
      XZYW: core.int,
      XZZX: core.int,
      XZZY: core.int,
      XZZZ: core.int,
      XZZW: core.int,
      XZWX: core.int,
      XZWY: core.int,
      XZWZ: core.int,
      XZWW: core.int,
      XWXX: core.int,
      XWXY: core.int,
      XWXZ: core.int,
      XWXW: core.int,
      XWYX: core.int,
      XWYY: core.int,
      XWYZ: core.int,
      XWYW: core.int,
      XWZX: core.int,
      XWZY: core.int,
      XWZZ: core.int,
      XWZW: core.int,
      XWWX: core.int,
      XWWY: core.int,
      XWWZ: core.int,
      XWWW: core.int,
      YXXX: core.int,
      YXXY: core.int,
      YXXZ: core.int,
      YXXW: core.int,
      YXYX: core.int,
      YXYY: core.int,
      YXYZ: core.int,
      YXYW: core.int,
      YXZX: core.int,
      YXZY: core.int,
      YXZZ: core.int,
      YXZW: core.int,
      YXWX: core.int,
      YXWY: core.int,
      YXWZ: core.int,
      YXWW: core.int,
      YYXX: core.int,
      YYXY: core.int,
      YYXZ: core.int,
      YYXW: core.int,
      YYYX: core.int,
      YYYY: core.int,
      YYYZ: core.int,
      YYYW: core.int,
      YYZX: core.int,
      YYZY: core.int,
      YYZZ: core.int,
      YYZW: core.int,
      YYWX: core.int,
      YYWY: core.int,
      YYWZ: core.int,
      YYWW: core.int,
      YZXX: core.int,
      YZXY: core.int,
      YZXZ: core.int,
      YZXW: core.int,
      YZYX: core.int,
      YZYY: core.int,
      YZYZ: core.int,
      YZYW: core.int,
      YZZX: core.int,
      YZZY: core.int,
      YZZZ: core.int,
      YZZW: core.int,
      YZWX: core.int,
      YZWY: core.int,
      YZWZ: core.int,
      YZWW: core.int,
      YWXX: core.int,
      YWXY: core.int,
      YWXZ: core.int,
      YWXW: core.int,
      YWYX: core.int,
      YWYY: core.int,
      YWYZ: core.int,
      YWYW: core.int,
      YWZX: core.int,
      YWZY: core.int,
      YWZZ: core.int,
      YWZW: core.int,
      YWWX: core.int,
      YWWY: core.int,
      YWWZ: core.int,
      YWWW: core.int,
      ZXXX: core.int,
      ZXXY: core.int,
      ZXXZ: core.int,
      ZXXW: core.int,
      ZXYX: core.int,
      ZXYY: core.int,
      ZXYZ: core.int,
      ZXYW: core.int,
      ZXZX: core.int,
      ZXZY: core.int,
      ZXZZ: core.int,
      ZXZW: core.int,
      ZXWX: core.int,
      ZXWY: core.int,
      ZXWZ: core.int,
      ZXWW: core.int,
      ZYXX: core.int,
      ZYXY: core.int,
      ZYXZ: core.int,
      ZYXW: core.int,
      ZYYX: core.int,
      ZYYY: core.int,
      ZYYZ: core.int,
      ZYYW: core.int,
      ZYZX: core.int,
      ZYZY: core.int,
      ZYZZ: core.int,
      ZYZW: core.int,
      ZYWX: core.int,
      ZYWY: core.int,
      ZYWZ: core.int,
      ZYWW: core.int,
      ZZXX: core.int,
      ZZXY: core.int,
      ZZXZ: core.int,
      ZZXW: core.int,
      ZZYX: core.int,
      ZZYY: core.int,
      ZZYZ: core.int,
      ZZYW: core.int,
      ZZZX: core.int,
      ZZZY: core.int,
      ZZZZ: core.int,
      ZZZW: core.int,
      ZZWX: core.int,
      ZZWY: core.int,
      ZZWZ: core.int,
      ZZWW: core.int,
      ZWXX: core.int,
      ZWXY: core.int,
      ZWXZ: core.int,
      ZWXW: core.int,
      ZWYX: core.int,
      ZWYY: core.int,
      ZWYZ: core.int,
      ZWYW: core.int,
      ZWZX: core.int,
      ZWZY: core.int,
      ZWZZ: core.int,
      ZWZW: core.int,
      ZWWX: core.int,
      ZWWY: core.int,
      ZWWZ: core.int,
      ZWWW: core.int,
      WXXX: core.int,
      WXXY: core.int,
      WXXZ: core.int,
      WXXW: core.int,
      WXYX: core.int,
      WXYY: core.int,
      WXYZ: core.int,
      WXYW: core.int,
      WXZX: core.int,
      WXZY: core.int,
      WXZZ: core.int,
      WXZW: core.int,
      WXWX: core.int,
      WXWY: core.int,
      WXWZ: core.int,
      WXWW: core.int,
      WYXX: core.int,
      WYXY: core.int,
      WYXZ: core.int,
      WYXW: core.int,
      WYYX: core.int,
      WYYY: core.int,
      WYYZ: core.int,
      WYYW: core.int,
      WYZX: core.int,
      WYZY: core.int,
      WYZZ: core.int,
      WYZW: core.int,
      WYWX: core.int,
      WYWY: core.int,
      WYWZ: core.int,
      WYWW: core.int,
      WZXX: core.int,
      WZXY: core.int,
      WZXZ: core.int,
      WZXW: core.int,
      WZYX: core.int,
      WZYY: core.int,
      WZYZ: core.int,
      WZYW: core.int,
      WZZX: core.int,
      WZZY: core.int,
      WZZZ: core.int,
      WZZW: core.int,
      WZWX: core.int,
      WZWY: core.int,
      WZWZ: core.int,
      WZWW: core.int,
      WWXX: core.int,
      WWXY: core.int,
      WWXZ: core.int,
      WWXW: core.int,
      WWYX: core.int,
      WWYY: core.int,
      WWYZ: core.int,
      WWYW: core.int,
      WWZX: core.int,
      WWZY: core.int,
      WWZZ: core.int,
      WWZW: core.int,
      WWWX: core.int,
      WWWY: core.int,
      WWWZ: core.int,
      WWWW: core.int
    })
  });
  typed_data.Float32x4.XXXX = 0;
  typed_data.Float32x4.XXXY = 64;
  typed_data.Float32x4.XXXZ = 128;
  typed_data.Float32x4.XXXW = 192;
  typed_data.Float32x4.XXYX = 16;
  typed_data.Float32x4.XXYY = 80;
  typed_data.Float32x4.XXYZ = 144;
  typed_data.Float32x4.XXYW = 208;
  typed_data.Float32x4.XXZX = 32;
  typed_data.Float32x4.XXZY = 96;
  typed_data.Float32x4.XXZZ = 160;
  typed_data.Float32x4.XXZW = 224;
  typed_data.Float32x4.XXWX = 48;
  typed_data.Float32x4.XXWY = 112;
  typed_data.Float32x4.XXWZ = 176;
  typed_data.Float32x4.XXWW = 240;
  typed_data.Float32x4.XYXX = 4;
  typed_data.Float32x4.XYXY = 68;
  typed_data.Float32x4.XYXZ = 132;
  typed_data.Float32x4.XYXW = 196;
  typed_data.Float32x4.XYYX = 20;
  typed_data.Float32x4.XYYY = 84;
  typed_data.Float32x4.XYYZ = 148;
  typed_data.Float32x4.XYYW = 212;
  typed_data.Float32x4.XYZX = 36;
  typed_data.Float32x4.XYZY = 100;
  typed_data.Float32x4.XYZZ = 164;
  typed_data.Float32x4.XYZW = 228;
  typed_data.Float32x4.XYWX = 52;
  typed_data.Float32x4.XYWY = 116;
  typed_data.Float32x4.XYWZ = 180;
  typed_data.Float32x4.XYWW = 244;
  typed_data.Float32x4.XZXX = 8;
  typed_data.Float32x4.XZXY = 72;
  typed_data.Float32x4.XZXZ = 136;
  typed_data.Float32x4.XZXW = 200;
  typed_data.Float32x4.XZYX = 24;
  typed_data.Float32x4.XZYY = 88;
  typed_data.Float32x4.XZYZ = 152;
  typed_data.Float32x4.XZYW = 216;
  typed_data.Float32x4.XZZX = 40;
  typed_data.Float32x4.XZZY = 104;
  typed_data.Float32x4.XZZZ = 168;
  typed_data.Float32x4.XZZW = 232;
  typed_data.Float32x4.XZWX = 56;
  typed_data.Float32x4.XZWY = 120;
  typed_data.Float32x4.XZWZ = 184;
  typed_data.Float32x4.XZWW = 248;
  typed_data.Float32x4.XWXX = 12;
  typed_data.Float32x4.XWXY = 76;
  typed_data.Float32x4.XWXZ = 140;
  typed_data.Float32x4.XWXW = 204;
  typed_data.Float32x4.XWYX = 28;
  typed_data.Float32x4.XWYY = 92;
  typed_data.Float32x4.XWYZ = 156;
  typed_data.Float32x4.XWYW = 220;
  typed_data.Float32x4.XWZX = 44;
  typed_data.Float32x4.XWZY = 108;
  typed_data.Float32x4.XWZZ = 172;
  typed_data.Float32x4.XWZW = 236;
  typed_data.Float32x4.XWWX = 60;
  typed_data.Float32x4.XWWY = 124;
  typed_data.Float32x4.XWWZ = 188;
  typed_data.Float32x4.XWWW = 252;
  typed_data.Float32x4.YXXX = 1;
  typed_data.Float32x4.YXXY = 65;
  typed_data.Float32x4.YXXZ = 129;
  typed_data.Float32x4.YXXW = 193;
  typed_data.Float32x4.YXYX = 17;
  typed_data.Float32x4.YXYY = 81;
  typed_data.Float32x4.YXYZ = 145;
  typed_data.Float32x4.YXYW = 209;
  typed_data.Float32x4.YXZX = 33;
  typed_data.Float32x4.YXZY = 97;
  typed_data.Float32x4.YXZZ = 161;
  typed_data.Float32x4.YXZW = 225;
  typed_data.Float32x4.YXWX = 49;
  typed_data.Float32x4.YXWY = 113;
  typed_data.Float32x4.YXWZ = 177;
  typed_data.Float32x4.YXWW = 241;
  typed_data.Float32x4.YYXX = 5;
  typed_data.Float32x4.YYXY = 69;
  typed_data.Float32x4.YYXZ = 133;
  typed_data.Float32x4.YYXW = 197;
  typed_data.Float32x4.YYYX = 21;
  typed_data.Float32x4.YYYY = 85;
  typed_data.Float32x4.YYYZ = 149;
  typed_data.Float32x4.YYYW = 213;
  typed_data.Float32x4.YYZX = 37;
  typed_data.Float32x4.YYZY = 101;
  typed_data.Float32x4.YYZZ = 165;
  typed_data.Float32x4.YYZW = 229;
  typed_data.Float32x4.YYWX = 53;
  typed_data.Float32x4.YYWY = 117;
  typed_data.Float32x4.YYWZ = 181;
  typed_data.Float32x4.YYWW = 245;
  typed_data.Float32x4.YZXX = 9;
  typed_data.Float32x4.YZXY = 73;
  typed_data.Float32x4.YZXZ = 137;
  typed_data.Float32x4.YZXW = 201;
  typed_data.Float32x4.YZYX = 25;
  typed_data.Float32x4.YZYY = 89;
  typed_data.Float32x4.YZYZ = 153;
  typed_data.Float32x4.YZYW = 217;
  typed_data.Float32x4.YZZX = 41;
  typed_data.Float32x4.YZZY = 105;
  typed_data.Float32x4.YZZZ = 169;
  typed_data.Float32x4.YZZW = 233;
  typed_data.Float32x4.YZWX = 57;
  typed_data.Float32x4.YZWY = 121;
  typed_data.Float32x4.YZWZ = 185;
  typed_data.Float32x4.YZWW = 249;
  typed_data.Float32x4.YWXX = 13;
  typed_data.Float32x4.YWXY = 77;
  typed_data.Float32x4.YWXZ = 141;
  typed_data.Float32x4.YWXW = 205;
  typed_data.Float32x4.YWYX = 29;
  typed_data.Float32x4.YWYY = 93;
  typed_data.Float32x4.YWYZ = 157;
  typed_data.Float32x4.YWYW = 221;
  typed_data.Float32x4.YWZX = 45;
  typed_data.Float32x4.YWZY = 109;
  typed_data.Float32x4.YWZZ = 173;
  typed_data.Float32x4.YWZW = 237;
  typed_data.Float32x4.YWWX = 61;
  typed_data.Float32x4.YWWY = 125;
  typed_data.Float32x4.YWWZ = 189;
  typed_data.Float32x4.YWWW = 253;
  typed_data.Float32x4.ZXXX = 2;
  typed_data.Float32x4.ZXXY = 66;
  typed_data.Float32x4.ZXXZ = 130;
  typed_data.Float32x4.ZXXW = 194;
  typed_data.Float32x4.ZXYX = 18;
  typed_data.Float32x4.ZXYY = 82;
  typed_data.Float32x4.ZXYZ = 146;
  typed_data.Float32x4.ZXYW = 210;
  typed_data.Float32x4.ZXZX = 34;
  typed_data.Float32x4.ZXZY = 98;
  typed_data.Float32x4.ZXZZ = 162;
  typed_data.Float32x4.ZXZW = 226;
  typed_data.Float32x4.ZXWX = 50;
  typed_data.Float32x4.ZXWY = 114;
  typed_data.Float32x4.ZXWZ = 178;
  typed_data.Float32x4.ZXWW = 242;
  typed_data.Float32x4.ZYXX = 6;
  typed_data.Float32x4.ZYXY = 70;
  typed_data.Float32x4.ZYXZ = 134;
  typed_data.Float32x4.ZYXW = 198;
  typed_data.Float32x4.ZYYX = 22;
  typed_data.Float32x4.ZYYY = 86;
  typed_data.Float32x4.ZYYZ = 150;
  typed_data.Float32x4.ZYYW = 214;
  typed_data.Float32x4.ZYZX = 38;
  typed_data.Float32x4.ZYZY = 102;
  typed_data.Float32x4.ZYZZ = 166;
  typed_data.Float32x4.ZYZW = 230;
  typed_data.Float32x4.ZYWX = 54;
  typed_data.Float32x4.ZYWY = 118;
  typed_data.Float32x4.ZYWZ = 182;
  typed_data.Float32x4.ZYWW = 246;
  typed_data.Float32x4.ZZXX = 10;
  typed_data.Float32x4.ZZXY = 74;
  typed_data.Float32x4.ZZXZ = 138;
  typed_data.Float32x4.ZZXW = 202;
  typed_data.Float32x4.ZZYX = 26;
  typed_data.Float32x4.ZZYY = 90;
  typed_data.Float32x4.ZZYZ = 154;
  typed_data.Float32x4.ZZYW = 218;
  typed_data.Float32x4.ZZZX = 42;
  typed_data.Float32x4.ZZZY = 106;
  typed_data.Float32x4.ZZZZ = 170;
  typed_data.Float32x4.ZZZW = 234;
  typed_data.Float32x4.ZZWX = 58;
  typed_data.Float32x4.ZZWY = 122;
  typed_data.Float32x4.ZZWZ = 186;
  typed_data.Float32x4.ZZWW = 250;
  typed_data.Float32x4.ZWXX = 14;
  typed_data.Float32x4.ZWXY = 78;
  typed_data.Float32x4.ZWXZ = 142;
  typed_data.Float32x4.ZWXW = 206;
  typed_data.Float32x4.ZWYX = 30;
  typed_data.Float32x4.ZWYY = 94;
  typed_data.Float32x4.ZWYZ = 158;
  typed_data.Float32x4.ZWYW = 222;
  typed_data.Float32x4.ZWZX = 46;
  typed_data.Float32x4.ZWZY = 110;
  typed_data.Float32x4.ZWZZ = 174;
  typed_data.Float32x4.ZWZW = 238;
  typed_data.Float32x4.ZWWX = 62;
  typed_data.Float32x4.ZWWY = 126;
  typed_data.Float32x4.ZWWZ = 190;
  typed_data.Float32x4.ZWWW = 254;
  typed_data.Float32x4.WXXX = 3;
  typed_data.Float32x4.WXXY = 67;
  typed_data.Float32x4.WXXZ = 131;
  typed_data.Float32x4.WXXW = 195;
  typed_data.Float32x4.WXYX = 19;
  typed_data.Float32x4.WXYY = 83;
  typed_data.Float32x4.WXYZ = 147;
  typed_data.Float32x4.WXYW = 211;
  typed_data.Float32x4.WXZX = 35;
  typed_data.Float32x4.WXZY = 99;
  typed_data.Float32x4.WXZZ = 163;
  typed_data.Float32x4.WXZW = 227;
  typed_data.Float32x4.WXWX = 51;
  typed_data.Float32x4.WXWY = 115;
  typed_data.Float32x4.WXWZ = 179;
  typed_data.Float32x4.WXWW = 243;
  typed_data.Float32x4.WYXX = 7;
  typed_data.Float32x4.WYXY = 71;
  typed_data.Float32x4.WYXZ = 135;
  typed_data.Float32x4.WYXW = 199;
  typed_data.Float32x4.WYYX = 23;
  typed_data.Float32x4.WYYY = 87;
  typed_data.Float32x4.WYYZ = 151;
  typed_data.Float32x4.WYYW = 215;
  typed_data.Float32x4.WYZX = 39;
  typed_data.Float32x4.WYZY = 103;
  typed_data.Float32x4.WYZZ = 167;
  typed_data.Float32x4.WYZW = 231;
  typed_data.Float32x4.WYWX = 55;
  typed_data.Float32x4.WYWY = 119;
  typed_data.Float32x4.WYWZ = 183;
  typed_data.Float32x4.WYWW = 247;
  typed_data.Float32x4.WZXX = 11;
  typed_data.Float32x4.WZXY = 75;
  typed_data.Float32x4.WZXZ = 139;
  typed_data.Float32x4.WZXW = 203;
  typed_data.Float32x4.WZYX = 27;
  typed_data.Float32x4.WZYY = 91;
  typed_data.Float32x4.WZYZ = 155;
  typed_data.Float32x4.WZYW = 219;
  typed_data.Float32x4.WZZX = 43;
  typed_data.Float32x4.WZZY = 107;
  typed_data.Float32x4.WZZZ = 171;
  typed_data.Float32x4.WZZW = 235;
  typed_data.Float32x4.WZWX = 59;
  typed_data.Float32x4.WZWY = 123;
  typed_data.Float32x4.WZWZ = 187;
  typed_data.Float32x4.WZWW = 251;
  typed_data.Float32x4.WWXX = 15;
  typed_data.Float32x4.WWXY = 79;
  typed_data.Float32x4.WWXZ = 143;
  typed_data.Float32x4.WWXW = 207;
  typed_data.Float32x4.WWYX = 31;
  typed_data.Float32x4.WWYY = 95;
  typed_data.Float32x4.WWYZ = 159;
  typed_data.Float32x4.WWYW = 223;
  typed_data.Float32x4.WWZX = 47;
  typed_data.Float32x4.WWZY = 111;
  typed_data.Float32x4.WWZZ = 175;
  typed_data.Float32x4.WWZW = 239;
  typed_data.Float32x4.WWWX = 63;
  typed_data.Float32x4.WWWY = 127;
  typed_data.Float32x4.WWWZ = 191;
  typed_data.Float32x4.WWWW = 255;
  _native_typed_data.NativeFloat32x4List = class NativeFloat32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float32x4), _internal.FixedLengthListMixin$(typed_data.Float32x4)) {
    new(length) {
      this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(length) * 4);
    }
    _externalStorage(storage) {
      this[_storage] = storage;
    }
    _slowFromList(list) {
      this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(list[dartx.length]) * 4);
      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
        let e = list[dartx._get](i);
        this[_storage][dartx._set](i * 4 + 0, e.x);
        this[_storage][dartx._set](i * 4 + 1, e.y);
        this[_storage][dartx._set](i * 4 + 2, e.z);
        this[_storage][dartx._set](i * 4 + 3, e.w);
      }
    }
    get runtimeType() {
      return dart.wrapType(typed_data.Float32x4List);
    }
    static fromList(list) {
      if (_native_typed_data.NativeFloat32x4List.is(list)) {
        return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List.fromList(list[_storage]));
      } else {
        return new _native_typed_data.NativeFloat32x4List._slowFromList(list);
      }
    }
    get buffer() {
      return this[_storage][dartx.buffer];
    }
    get lengthInBytes() {
      return this[_storage][dartx.lengthInBytes];
    }
    get offsetInBytes() {
      return this[_storage][dartx.offsetInBytes];
    }
    get elementSizeInBytes() {
      return typed_data.Float32x4List.BYTES_PER_ELEMENT;
    }
    get length() {
      return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
      let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
      let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
      let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
      return value;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this.length);
      return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_externalStorage');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_slowFromList');
  _native_typed_data.NativeFloat32x4List[dart.implements] = () => [typed_data.Float32x4List];
  dart.setSignature(_native_typed_data.NativeFloat32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [core.int]),
      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [_native_typed_data.NativeFloat32List]),
      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()])
    }),
    fields: () => ({[_storage]: _native_typed_data.NativeFloat32List}),
    getters: () => ({
      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      lengthInBytes: dart.definiteFunctionType(core.int, []),
      offsetInBytes: dart.definiteFunctionType(core.int, []),
      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32x4]),
      sublist: dart.definiteFunctionType(core.List$(typed_data.Float32x4), [core.int], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeFloat32x4List, [
    '_get',
    '_set',
    'sublist',
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes',
    'length'
  ]);
  typed_data.Int32x4 = class Int32x4 extends core.Object {
    static new(x, y, z, w) {
      return new _native_typed_data.NativeInt32x4(x, y, z, w);
    }
    static bool(x, y, z, w) {
      return new _native_typed_data.NativeInt32x4.bool(x, y, z, w);
    }
    static fromFloat32x4Bits(x) {
      return _native_typed_data.NativeInt32x4.fromFloat32x4Bits(x);
    }
  };
  dart.setSignature(typed_data.Int32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int32x4, [core.int, core.int, core.int, core.int]),
      bool: dart.definiteFunctionType(typed_data.Int32x4, [core.bool, core.bool, core.bool, core.bool]),
      fromFloat32x4Bits: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4])
    }),
    sfields: () => ({
      XXXX: core.int,
      XXXY: core.int,
      XXXZ: core.int,
      XXXW: core.int,
      XXYX: core.int,
      XXYY: core.int,
      XXYZ: core.int,
      XXYW: core.int,
      XXZX: core.int,
      XXZY: core.int,
      XXZZ: core.int,
      XXZW: core.int,
      XXWX: core.int,
      XXWY: core.int,
      XXWZ: core.int,
      XXWW: core.int,
      XYXX: core.int,
      XYXY: core.int,
      XYXZ: core.int,
      XYXW: core.int,
      XYYX: core.int,
      XYYY: core.int,
      XYYZ: core.int,
      XYYW: core.int,
      XYZX: core.int,
      XYZY: core.int,
      XYZZ: core.int,
      XYZW: core.int,
      XYWX: core.int,
      XYWY: core.int,
      XYWZ: core.int,
      XYWW: core.int,
      XZXX: core.int,
      XZXY: core.int,
      XZXZ: core.int,
      XZXW: core.int,
      XZYX: core.int,
      XZYY: core.int,
      XZYZ: core.int,
      XZYW: core.int,
      XZZX: core.int,
      XZZY: core.int,
      XZZZ: core.int,
      XZZW: core.int,
      XZWX: core.int,
      XZWY: core.int,
      XZWZ: core.int,
      XZWW: core.int,
      XWXX: core.int,
      XWXY: core.int,
      XWXZ: core.int,
      XWXW: core.int,
      XWYX: core.int,
      XWYY: core.int,
      XWYZ: core.int,
      XWYW: core.int,
      XWZX: core.int,
      XWZY: core.int,
      XWZZ: core.int,
      XWZW: core.int,
      XWWX: core.int,
      XWWY: core.int,
      XWWZ: core.int,
      XWWW: core.int,
      YXXX: core.int,
      YXXY: core.int,
      YXXZ: core.int,
      YXXW: core.int,
      YXYX: core.int,
      YXYY: core.int,
      YXYZ: core.int,
      YXYW: core.int,
      YXZX: core.int,
      YXZY: core.int,
      YXZZ: core.int,
      YXZW: core.int,
      YXWX: core.int,
      YXWY: core.int,
      YXWZ: core.int,
      YXWW: core.int,
      YYXX: core.int,
      YYXY: core.int,
      YYXZ: core.int,
      YYXW: core.int,
      YYYX: core.int,
      YYYY: core.int,
      YYYZ: core.int,
      YYYW: core.int,
      YYZX: core.int,
      YYZY: core.int,
      YYZZ: core.int,
      YYZW: core.int,
      YYWX: core.int,
      YYWY: core.int,
      YYWZ: core.int,
      YYWW: core.int,
      YZXX: core.int,
      YZXY: core.int,
      YZXZ: core.int,
      YZXW: core.int,
      YZYX: core.int,
      YZYY: core.int,
      YZYZ: core.int,
      YZYW: core.int,
      YZZX: core.int,
      YZZY: core.int,
      YZZZ: core.int,
      YZZW: core.int,
      YZWX: core.int,
      YZWY: core.int,
      YZWZ: core.int,
      YZWW: core.int,
      YWXX: core.int,
      YWXY: core.int,
      YWXZ: core.int,
      YWXW: core.int,
      YWYX: core.int,
      YWYY: core.int,
      YWYZ: core.int,
      YWYW: core.int,
      YWZX: core.int,
      YWZY: core.int,
      YWZZ: core.int,
      YWZW: core.int,
      YWWX: core.int,
      YWWY: core.int,
      YWWZ: core.int,
      YWWW: core.int,
      ZXXX: core.int,
      ZXXY: core.int,
      ZXXZ: core.int,
      ZXXW: core.int,
      ZXYX: core.int,
      ZXYY: core.int,
      ZXYZ: core.int,
      ZXYW: core.int,
      ZXZX: core.int,
      ZXZY: core.int,
      ZXZZ: core.int,
      ZXZW: core.int,
      ZXWX: core.int,
      ZXWY: core.int,
      ZXWZ: core.int,
      ZXWW: core.int,
      ZYXX: core.int,
      ZYXY: core.int,
      ZYXZ: core.int,
      ZYXW: core.int,
      ZYYX: core.int,
      ZYYY: core.int,
      ZYYZ: core.int,
      ZYYW: core.int,
      ZYZX: core.int,
      ZYZY: core.int,
      ZYZZ: core.int,
      ZYZW: core.int,
      ZYWX: core.int,
      ZYWY: core.int,
      ZYWZ: core.int,
      ZYWW: core.int,
      ZZXX: core.int,
      ZZXY: core.int,
      ZZXZ: core.int,
      ZZXW: core.int,
      ZZYX: core.int,
      ZZYY: core.int,
      ZZYZ: core.int,
      ZZYW: core.int,
      ZZZX: core.int,
      ZZZY: core.int,
      ZZZZ: core.int,
      ZZZW: core.int,
      ZZWX: core.int,
      ZZWY: core.int,
      ZZWZ: core.int,
      ZZWW: core.int,
      ZWXX: core.int,
      ZWXY: core.int,
      ZWXZ: core.int,
      ZWXW: core.int,
      ZWYX: core.int,
      ZWYY: core.int,
      ZWYZ: core.int,
      ZWYW: core.int,
      ZWZX: core.int,
      ZWZY: core.int,
      ZWZZ: core.int,
      ZWZW: core.int,
      ZWWX: core.int,
      ZWWY: core.int,
      ZWWZ: core.int,
      ZWWW: core.int,
      WXXX: core.int,
      WXXY: core.int,
      WXXZ: core.int,
      WXXW: core.int,
      WXYX: core.int,
      WXYY: core.int,
      WXYZ: core.int,
      WXYW: core.int,
      WXZX: core.int,
      WXZY: core.int,
      WXZZ: core.int,
      WXZW: core.int,
      WXWX: core.int,
      WXWY: core.int,
      WXWZ: core.int,
      WXWW: core.int,
      WYXX: core.int,
      WYXY: core.int,
      WYXZ: core.int,
      WYXW: core.int,
      WYYX: core.int,
      WYYY: core.int,
      WYYZ: core.int,
      WYYW: core.int,
      WYZX: core.int,
      WYZY: core.int,
      WYZZ: core.int,
      WYZW: core.int,
      WYWX: core.int,
      WYWY: core.int,
      WYWZ: core.int,
      WYWW: core.int,
      WZXX: core.int,
      WZXY: core.int,
      WZXZ: core.int,
      WZXW: core.int,
      WZYX: core.int,
      WZYY: core.int,
      WZYZ: core.int,
      WZYW: core.int,
      WZZX: core.int,
      WZZY: core.int,
      WZZZ: core.int,
      WZZW: core.int,
      WZWX: core.int,
      WZWY: core.int,
      WZWZ: core.int,
      WZWW: core.int,
      WWXX: core.int,
      WWXY: core.int,
      WWXZ: core.int,
      WWXW: core.int,
      WWYX: core.int,
      WWYY: core.int,
      WWYZ: core.int,
      WWYW: core.int,
      WWZX: core.int,
      WWZY: core.int,
      WWZZ: core.int,
      WWZW: core.int,
      WWWX: core.int,
      WWWY: core.int,
      WWWZ: core.int,
      WWWW: core.int
    })
  });
  typed_data.Int32x4.XXXX = 0;
  typed_data.Int32x4.XXXY = 64;
  typed_data.Int32x4.XXXZ = 128;
  typed_data.Int32x4.XXXW = 192;
  typed_data.Int32x4.XXYX = 16;
  typed_data.Int32x4.XXYY = 80;
  typed_data.Int32x4.XXYZ = 144;
  typed_data.Int32x4.XXYW = 208;
  typed_data.Int32x4.XXZX = 32;
  typed_data.Int32x4.XXZY = 96;
  typed_data.Int32x4.XXZZ = 160;
  typed_data.Int32x4.XXZW = 224;
  typed_data.Int32x4.XXWX = 48;
  typed_data.Int32x4.XXWY = 112;
  typed_data.Int32x4.XXWZ = 176;
  typed_data.Int32x4.XXWW = 240;
  typed_data.Int32x4.XYXX = 4;
  typed_data.Int32x4.XYXY = 68;
  typed_data.Int32x4.XYXZ = 132;
  typed_data.Int32x4.XYXW = 196;
  typed_data.Int32x4.XYYX = 20;
  typed_data.Int32x4.XYYY = 84;
  typed_data.Int32x4.XYYZ = 148;
  typed_data.Int32x4.XYYW = 212;
  typed_data.Int32x4.XYZX = 36;
  typed_data.Int32x4.XYZY = 100;
  typed_data.Int32x4.XYZZ = 164;
  typed_data.Int32x4.XYZW = 228;
  typed_data.Int32x4.XYWX = 52;
  typed_data.Int32x4.XYWY = 116;
  typed_data.Int32x4.XYWZ = 180;
  typed_data.Int32x4.XYWW = 244;
  typed_data.Int32x4.XZXX = 8;
  typed_data.Int32x4.XZXY = 72;
  typed_data.Int32x4.XZXZ = 136;
  typed_data.Int32x4.XZXW = 200;
  typed_data.Int32x4.XZYX = 24;
  typed_data.Int32x4.XZYY = 88;
  typed_data.Int32x4.XZYZ = 152;
  typed_data.Int32x4.XZYW = 216;
  typed_data.Int32x4.XZZX = 40;
  typed_data.Int32x4.XZZY = 104;
  typed_data.Int32x4.XZZZ = 168;
  typed_data.Int32x4.XZZW = 232;
  typed_data.Int32x4.XZWX = 56;
  typed_data.Int32x4.XZWY = 120;
  typed_data.Int32x4.XZWZ = 184;
  typed_data.Int32x4.XZWW = 248;
  typed_data.Int32x4.XWXX = 12;
  typed_data.Int32x4.XWXY = 76;
  typed_data.Int32x4.XWXZ = 140;
  typed_data.Int32x4.XWXW = 204;
  typed_data.Int32x4.XWYX = 28;
  typed_data.Int32x4.XWYY = 92;
  typed_data.Int32x4.XWYZ = 156;
  typed_data.Int32x4.XWYW = 220;
  typed_data.Int32x4.XWZX = 44;
  typed_data.Int32x4.XWZY = 108;
  typed_data.Int32x4.XWZZ = 172;
  typed_data.Int32x4.XWZW = 236;
  typed_data.Int32x4.XWWX = 60;
  typed_data.Int32x4.XWWY = 124;
  typed_data.Int32x4.XWWZ = 188;
  typed_data.Int32x4.XWWW = 252;
  typed_data.Int32x4.YXXX = 1;
  typed_data.Int32x4.YXXY = 65;
  typed_data.Int32x4.YXXZ = 129;
  typed_data.Int32x4.YXXW = 193;
  typed_data.Int32x4.YXYX = 17;
  typed_data.Int32x4.YXYY = 81;
  typed_data.Int32x4.YXYZ = 145;
  typed_data.Int32x4.YXYW = 209;
  typed_data.Int32x4.YXZX = 33;
  typed_data.Int32x4.YXZY = 97;
  typed_data.Int32x4.YXZZ = 161;
  typed_data.Int32x4.YXZW = 225;
  typed_data.Int32x4.YXWX = 49;
  typed_data.Int32x4.YXWY = 113;
  typed_data.Int32x4.YXWZ = 177;
  typed_data.Int32x4.YXWW = 241;
  typed_data.Int32x4.YYXX = 5;
  typed_data.Int32x4.YYXY = 69;
  typed_data.Int32x4.YYXZ = 133;
  typed_data.Int32x4.YYXW = 197;
  typed_data.Int32x4.YYYX = 21;
  typed_data.Int32x4.YYYY = 85;
  typed_data.Int32x4.YYYZ = 149;
  typed_data.Int32x4.YYYW = 213;
  typed_data.Int32x4.YYZX = 37;
  typed_data.Int32x4.YYZY = 101;
  typed_data.Int32x4.YYZZ = 165;
  typed_data.Int32x4.YYZW = 229;
  typed_data.Int32x4.YYWX = 53;
  typed_data.Int32x4.YYWY = 117;
  typed_data.Int32x4.YYWZ = 181;
  typed_data.Int32x4.YYWW = 245;
  typed_data.Int32x4.YZXX = 9;
  typed_data.Int32x4.YZXY = 73;
  typed_data.Int32x4.YZXZ = 137;
  typed_data.Int32x4.YZXW = 201;
  typed_data.Int32x4.YZYX = 25;
  typed_data.Int32x4.YZYY = 89;
  typed_data.Int32x4.YZYZ = 153;
  typed_data.Int32x4.YZYW = 217;
  typed_data.Int32x4.YZZX = 41;
  typed_data.Int32x4.YZZY = 105;
  typed_data.Int32x4.YZZZ = 169;
  typed_data.Int32x4.YZZW = 233;
  typed_data.Int32x4.YZWX = 57;
  typed_data.Int32x4.YZWY = 121;
  typed_data.Int32x4.YZWZ = 185;
  typed_data.Int32x4.YZWW = 249;
  typed_data.Int32x4.YWXX = 13;
  typed_data.Int32x4.YWXY = 77;
  typed_data.Int32x4.YWXZ = 141;
  typed_data.Int32x4.YWXW = 205;
  typed_data.Int32x4.YWYX = 29;
  typed_data.Int32x4.YWYY = 93;
  typed_data.Int32x4.YWYZ = 157;
  typed_data.Int32x4.YWYW = 221;
  typed_data.Int32x4.YWZX = 45;
  typed_data.Int32x4.YWZY = 109;
  typed_data.Int32x4.YWZZ = 173;
  typed_data.Int32x4.YWZW = 237;
  typed_data.Int32x4.YWWX = 61;
  typed_data.Int32x4.YWWY = 125;
  typed_data.Int32x4.YWWZ = 189;
  typed_data.Int32x4.YWWW = 253;
  typed_data.Int32x4.ZXXX = 2;
  typed_data.Int32x4.ZXXY = 66;
  typed_data.Int32x4.ZXXZ = 130;
  typed_data.Int32x4.ZXXW = 194;
  typed_data.Int32x4.ZXYX = 18;
  typed_data.Int32x4.ZXYY = 82;
  typed_data.Int32x4.ZXYZ = 146;
  typed_data.Int32x4.ZXYW = 210;
  typed_data.Int32x4.ZXZX = 34;
  typed_data.Int32x4.ZXZY = 98;
  typed_data.Int32x4.ZXZZ = 162;
  typed_data.Int32x4.ZXZW = 226;
  typed_data.Int32x4.ZXWX = 50;
  typed_data.Int32x4.ZXWY = 114;
  typed_data.Int32x4.ZXWZ = 178;
  typed_data.Int32x4.ZXWW = 242;
  typed_data.Int32x4.ZYXX = 6;
  typed_data.Int32x4.ZYXY = 70;
  typed_data.Int32x4.ZYXZ = 134;
  typed_data.Int32x4.ZYXW = 198;
  typed_data.Int32x4.ZYYX = 22;
  typed_data.Int32x4.ZYYY = 86;
  typed_data.Int32x4.ZYYZ = 150;
  typed_data.Int32x4.ZYYW = 214;
  typed_data.Int32x4.ZYZX = 38;
  typed_data.Int32x4.ZYZY = 102;
  typed_data.Int32x4.ZYZZ = 166;
  typed_data.Int32x4.ZYZW = 230;
  typed_data.Int32x4.ZYWX = 54;
  typed_data.Int32x4.ZYWY = 118;
  typed_data.Int32x4.ZYWZ = 182;
  typed_data.Int32x4.ZYWW = 246;
  typed_data.Int32x4.ZZXX = 10;
  typed_data.Int32x4.ZZXY = 74;
  typed_data.Int32x4.ZZXZ = 138;
  typed_data.Int32x4.ZZXW = 202;
  typed_data.Int32x4.ZZYX = 26;
  typed_data.Int32x4.ZZYY = 90;
  typed_data.Int32x4.ZZYZ = 154;
  typed_data.Int32x4.ZZYW = 218;
  typed_data.Int32x4.ZZZX = 42;
  typed_data.Int32x4.ZZZY = 106;
  typed_data.Int32x4.ZZZZ = 170;
  typed_data.Int32x4.ZZZW = 234;
  typed_data.Int32x4.ZZWX = 58;
  typed_data.Int32x4.ZZWY = 122;
  typed_data.Int32x4.ZZWZ = 186;
  typed_data.Int32x4.ZZWW = 250;
  typed_data.Int32x4.ZWXX = 14;
  typed_data.Int32x4.ZWXY = 78;
  typed_data.Int32x4.ZWXZ = 142;
  typed_data.Int32x4.ZWXW = 206;
  typed_data.Int32x4.ZWYX = 30;
  typed_data.Int32x4.ZWYY = 94;
  typed_data.Int32x4.ZWYZ = 158;
  typed_data.Int32x4.ZWYW = 222;
  typed_data.Int32x4.ZWZX = 46;
  typed_data.Int32x4.ZWZY = 110;
  typed_data.Int32x4.ZWZZ = 174;
  typed_data.Int32x4.ZWZW = 238;
  typed_data.Int32x4.ZWWX = 62;
  typed_data.Int32x4.ZWWY = 126;
  typed_data.Int32x4.ZWWZ = 190;
  typed_data.Int32x4.ZWWW = 254;
  typed_data.Int32x4.WXXX = 3;
  typed_data.Int32x4.WXXY = 67;
  typed_data.Int32x4.WXXZ = 131;
  typed_data.Int32x4.WXXW = 195;
  typed_data.Int32x4.WXYX = 19;
  typed_data.Int32x4.WXYY = 83;
  typed_data.Int32x4.WXYZ = 147;
  typed_data.Int32x4.WXYW = 211;
  typed_data.Int32x4.WXZX = 35;
  typed_data.Int32x4.WXZY = 99;
  typed_data.Int32x4.WXZZ = 163;
  typed_data.Int32x4.WXZW = 227;
  typed_data.Int32x4.WXWX = 51;
  typed_data.Int32x4.WXWY = 115;
  typed_data.Int32x4.WXWZ = 179;
  typed_data.Int32x4.WXWW = 243;
  typed_data.Int32x4.WYXX = 7;
  typed_data.Int32x4.WYXY = 71;
  typed_data.Int32x4.WYXZ = 135;
  typed_data.Int32x4.WYXW = 199;
  typed_data.Int32x4.WYYX = 23;
  typed_data.Int32x4.WYYY = 87;
  typed_data.Int32x4.WYYZ = 151;
  typed_data.Int32x4.WYYW = 215;
  typed_data.Int32x4.WYZX = 39;
  typed_data.Int32x4.WYZY = 103;
  typed_data.Int32x4.WYZZ = 167;
  typed_data.Int32x4.WYZW = 231;
  typed_data.Int32x4.WYWX = 55;
  typed_data.Int32x4.WYWY = 119;
  typed_data.Int32x4.WYWZ = 183;
  typed_data.Int32x4.WYWW = 247;
  typed_data.Int32x4.WZXX = 11;
  typed_data.Int32x4.WZXY = 75;
  typed_data.Int32x4.WZXZ = 139;
  typed_data.Int32x4.WZXW = 203;
  typed_data.Int32x4.WZYX = 27;
  typed_data.Int32x4.WZYY = 91;
  typed_data.Int32x4.WZYZ = 155;
  typed_data.Int32x4.WZYW = 219;
  typed_data.Int32x4.WZZX = 43;
  typed_data.Int32x4.WZZY = 107;
  typed_data.Int32x4.WZZZ = 171;
  typed_data.Int32x4.WZZW = 235;
  typed_data.Int32x4.WZWX = 59;
  typed_data.Int32x4.WZWY = 123;
  typed_data.Int32x4.WZWZ = 187;
  typed_data.Int32x4.WZWW = 251;
  typed_data.Int32x4.WWXX = 15;
  typed_data.Int32x4.WWXY = 79;
  typed_data.Int32x4.WWXZ = 143;
  typed_data.Int32x4.WWXW = 207;
  typed_data.Int32x4.WWYX = 31;
  typed_data.Int32x4.WWYY = 95;
  typed_data.Int32x4.WWYZ = 159;
  typed_data.Int32x4.WWYW = 223;
  typed_data.Int32x4.WWZX = 47;
  typed_data.Int32x4.WWZY = 111;
  typed_data.Int32x4.WWZZ = 175;
  typed_data.Int32x4.WWZW = 239;
  typed_data.Int32x4.WWWX = 63;
  typed_data.Int32x4.WWWY = 127;
  typed_data.Int32x4.WWWZ = 191;
  typed_data.Int32x4.WWWW = 255;
  _native_typed_data.NativeInt32x4List = class NativeInt32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Int32x4), _internal.FixedLengthListMixin$(typed_data.Int32x4)) {
    new(length) {
      this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(length) * 4);
    }
    _externalStorage(storage) {
      this[_storage] = storage;
    }
    _slowFromList(list) {
      this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(list[dartx.length]) * 4);
      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
        let e = list[dartx._get](i);
        this[_storage][dartx._set](i * 4 + 0, e.x);
        this[_storage][dartx._set](i * 4 + 1, e.y);
        this[_storage][dartx._set](i * 4 + 2, e.z);
        this[_storage][dartx._set](i * 4 + 3, e.w);
      }
    }
    get runtimeType() {
      return dart.wrapType(typed_data.Int32x4List);
    }
    static fromList(list) {
      if (_native_typed_data.NativeInt32x4List.is(list)) {
        return new _native_typed_data.NativeInt32x4List._externalStorage(_native_typed_data.NativeInt32List.fromList(list[_storage]));
      } else {
        return new _native_typed_data.NativeInt32x4List._slowFromList(list);
      }
    }
    get buffer() {
      return this[_storage][dartx.buffer];
    }
    get lengthInBytes() {
      return this[_storage][dartx.lengthInBytes];
    }
    get offsetInBytes() {
      return this[_storage][dartx.offsetInBytes];
    }
    get elementSizeInBytes() {
      return typed_data.Int32x4List.BYTES_PER_ELEMENT;
    }
    get length() {
      return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
      let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
      let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
      let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
      return value;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this.length);
      return new _native_typed_data.NativeInt32x4List._externalStorage(typed_data.Int32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_externalStorage');
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_slowFromList');
  _native_typed_data.NativeInt32x4List[dart.implements] = () => [typed_data.Int32x4List];
  dart.setSignature(_native_typed_data.NativeInt32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [core.int]),
      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [typed_data.Int32List]),
      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()])
    }),
    fields: () => ({[_storage]: typed_data.Int32List}),
    getters: () => ({
      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      lengthInBytes: dart.definiteFunctionType(core.int, []),
      offsetInBytes: dart.definiteFunctionType(core.int, []),
      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Int32x4]),
      sublist: dart.definiteFunctionType(core.List$(typed_data.Int32x4), [core.int], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeInt32x4List, [
    '_get',
    '_set',
    'sublist',
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes',
    'length'
  ]);
  typed_data.Float64x2 = class Float64x2 extends core.Object {
    static new(x, y) {
      return new _native_typed_data.NativeFloat64x2(x, y);
    }
    static splat(v) {
      return new _native_typed_data.NativeFloat64x2.splat(v);
    }
    static zero() {
      return new _native_typed_data.NativeFloat64x2.zero();
    }
    static fromFloat32x4(v) {
      return new _native_typed_data.NativeFloat64x2.fromFloat32x4(v);
    }
  };
  dart.setSignature(typed_data.Float64x2, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float64x2, [core.double, core.double]),
      splat: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      zero: dart.definiteFunctionType(typed_data.Float64x2, []),
      fromFloat32x4: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float32x4])
    })
  });
  _native_typed_data.NativeFloat64x2List = class NativeFloat64x2List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float64x2), _internal.FixedLengthListMixin$(typed_data.Float64x2)) {
    new(length) {
      this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(length) * 2);
    }
    _externalStorage(storage) {
      this[_storage] = storage;
    }
    _slowFromList(list) {
      this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(list[dartx.length]) * 2);
      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
        let e = list[dartx._get](i);
        this[_storage][dartx._set](i * 2 + 0, e.x);
        this[_storage][dartx._set](i * 2 + 1, e.y);
      }
    }
    static fromList(list) {
      if (_native_typed_data.NativeFloat64x2List.is(list)) {
        return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List.fromList(list[_storage]));
      } else {
        return new _native_typed_data.NativeFloat64x2List._slowFromList(list);
      }
    }
    get runtimeType() {
      return dart.wrapType(typed_data.Float64x2List);
    }
    get buffer() {
      return this[_storage][dartx.buffer];
    }
    get lengthInBytes() {
      return this[_storage][dartx.lengthInBytes];
    }
    get offsetInBytes() {
      return this[_storage][dartx.offsetInBytes];
    }
    get elementSizeInBytes() {
      return typed_data.Float64x2List.BYTES_PER_ELEMENT;
    }
    get length() {
      return (dart.notNull(this[_storage][dartx.length]) / 2)[dartx.truncate]();
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      let _x = this[_storage][dartx._get](dart.notNull(index) * 2 + 0);
      let _y = this[_storage][dartx._get](dart.notNull(index) * 2 + 1);
      return typed_data.Float64x2.new(_x, _y);
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      this[_storage][dartx._set](dart.notNull(index) * 2 + 0, value.x);
      this[_storage][dartx._set](dart.notNull(index) * 2 + 1, value.y);
      return value;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this.length);
      return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List._check(this[_storage][dartx.sublist](dart.notNull(start) * 2, dart.notNull(end) * 2)));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_externalStorage');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_slowFromList');
  _native_typed_data.NativeFloat64x2List[dart.implements] = () => [typed_data.Float64x2List];
  dart.setSignature(_native_typed_data.NativeFloat64x2List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [core.int]),
      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [_native_typed_data.NativeFloat64List]),
      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()])
    }),
    fields: () => ({[_storage]: _native_typed_data.NativeFloat64List}),
    getters: () => ({
      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      lengthInBytes: dart.definiteFunctionType(core.int, []),
      offsetInBytes: dart.definiteFunctionType(core.int, []),
      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(typed_data.Float64x2, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float64x2]),
      sublist: dart.definiteFunctionType(core.List$(typed_data.Float64x2), [core.int], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeFloat64x2List, [
    '_get',
    '_set',
    'sublist',
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes',
    'length'
  ]);
  const _invalidPosition = Symbol('_invalidPosition');
  const _checkPosition = Symbol('_checkPosition');
  dart.defineExtensionNames([
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes'
  ]);
  _native_typed_data.NativeTypedData = class NativeTypedData extends core.Object {
    get [dartx.buffer]() {
      return this.buffer;
    }
    get [dartx.lengthInBytes]() {
      return this.byteLength;
    }
    get [dartx.offsetInBytes]() {
      return this.byteOffset;
    }
    get [dartx.elementSizeInBytes]() {
      return this.BYTES_PER_ELEMENT;
    }
    [_invalidPosition](position, length, name) {
      if (!(typeof position == 'number')) {
        dart.throw(new core.ArgumentError.value(position, name, 'Invalid list position'));
      } else {
        dart.throw(new core.RangeError.range(position, 0, length, name));
      }
    }
    [_checkPosition](position, length, name) {
      if (position >>> 0 !== position || position > dart.notNull(length)) {
        this[_invalidPosition](position, length, name);
      }
    }
  };
  _native_typed_data.NativeTypedData[dart.implements] = () => [typed_data.TypedData];
  dart.setSignature(_native_typed_data.NativeTypedData, {
    getters: () => ({
      [dartx.buffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      [dartx.lengthInBytes]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetInBytes]: dart.definiteFunctionType(core.int, []),
      [dartx.elementSizeInBytes]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [_invalidPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
      [_checkPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String])
    })
  });
  dart.registerExtension(dart.global.ArrayBufferView, _native_typed_data.NativeTypedData);
  _native_typed_data._checkLength = function(length) {
    if (!(typeof length == 'number')) dart.throw(new core.ArgumentError(dart.str`Invalid length ${length}`));
    return core.int._check(length);
  };
  dart.fn(_native_typed_data._checkLength, dynamicToint());
  _native_typed_data._checkViewArguments = function(buffer, offsetInBytes, length) {
    if (!_native_typed_data.NativeByteBuffer.is(buffer)) {
      dart.throw(new core.ArgumentError('Invalid view buffer'));
    }
    if (!(typeof offsetInBytes == 'number')) {
      dart.throw(new core.ArgumentError(dart.str`Invalid view offsetInBytes ${offsetInBytes}`));
    }
    if (length != null && !(typeof length == 'number')) {
      dart.throw(new core.ArgumentError(dart.str`Invalid view length ${length}`));
    }
  };
  dart.fn(_native_typed_data._checkViewArguments, dynamicAnddynamicAnddynamicTovoid());
  _native_typed_data._ensureNativeList = function(list) {
    if (_interceptors.JSIndexable.is(list)) return list;
    let result = core.List.new(list[dartx.length]);
    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
      result[dartx._set](i, list[dartx._get](i));
    }
    return result;
  };
  dart.lazyFn(_native_typed_data._ensureNativeList, () => ListToList());
  const _getFloat32 = Symbol('_getFloat32');
  const _getFloat64 = Symbol('_getFloat64');
  const _getInt16 = Symbol('_getInt16');
  const _getInt32 = Symbol('_getInt32');
  const _getUint16 = Symbol('_getUint16');
  const _getUint32 = Symbol('_getUint32');
  const _setFloat32 = Symbol('_setFloat32');
  const _setFloat64 = Symbol('_setFloat64');
  const _setInt16 = Symbol('_setInt16');
  const _setInt32 = Symbol('_setInt32');
  const _setUint16 = Symbol('_setUint16');
  const _setUint32 = Symbol('_setUint32');
  dart.defineExtensionNames([
    'runtimeType',
    'elementSizeInBytes',
    'getFloat32',
    'getFloat64',
    'getInt16',
    'getInt32',
    'getInt64',
    'getInt8',
    'getUint16',
    'getUint32',
    'getUint64',
    'getUint8',
    'setFloat32',
    'setFloat64',
    'setInt16',
    'setInt32',
    'setInt64',
    'setInt8',
    'setUint16',
    'setUint32',
    'setUint64',
    'setUint8'
  ]);
  _native_typed_data.NativeByteData = class NativeByteData extends _native_typed_data.NativeTypedData {
    static new(length) {
      return _native_typed_data.NativeByteData._create1(_native_typed_data._checkLength(length));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.ByteData);
    }
    get [dartx.elementSizeInBytes]() {
      return 1;
    }
    [dartx.getFloat32](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getFloat32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getFloat32](...args) {
      return this.getFloat32.apply(this, args);
    }
    [dartx.getFloat64](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getFloat64](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getFloat64](...args) {
      return this.getFloat64.apply(this, args);
    }
    [dartx.getInt16](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getInt16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getInt16](...args) {
      return this.getInt16.apply(this, args);
    }
    [dartx.getInt32](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getInt32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getInt32](...args) {
      return this.getInt32.apply(this, args);
    }
    [dartx.getInt64](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
    }
    [dartx.getInt8](...args) {
      return this.getInt8.apply(this, args);
    }
    [dartx.getUint16](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getUint16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getUint16](...args) {
      return this.getUint16.apply(this, args);
    }
    [dartx.getUint32](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getUint32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getUint32](...args) {
      return this.getUint32.apply(this, args);
    }
    [dartx.getUint64](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
    }
    [dartx.getUint8](...args) {
      return this.getUint8.apply(this, args);
    }
    [dartx.setFloat32](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setFloat32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setFloat32](...args) {
      return this.setFloat32.apply(this, args);
    }
    [dartx.setFloat64](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setFloat64](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setFloat64](...args) {
      return this.setFloat64.apply(this, args);
    }
    [dartx.setInt16](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setInt16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setInt16](...args) {
      return this.setInt16.apply(this, args);
    }
    [dartx.setInt32](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setInt32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setInt32](...args) {
      return this.setInt32.apply(this, args);
    }
    [dartx.setInt64](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
    }
    [dartx.setInt8](...args) {
      return this.setInt8.apply(this, args);
    }
    [dartx.setUint16](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setUint16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setUint16](...args) {
      return this.setUint16.apply(this, args);
    }
    [dartx.setUint32](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setUint32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setUint32](...args) {
      return this.setUint32.apply(this, args);
    }
    [dartx.setUint64](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
    }
    [dartx.setUint8](...args) {
      return this.setUint8.apply(this, args);
    }
    static _create1(arg) {
      return new DataView(new ArrayBuffer(arg));
    }
    static _create2(arg1, arg2) {
      return new DataView(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new DataView(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeByteData[dart.implements] = () => [typed_data.ByteData];
  dart.setSignature(_native_typed_data.NativeByteData, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeByteData, [core.int]),
      view: dart.definiteFunctionType(_native_typed_data.NativeByteData, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx.getFloat32]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
      [_getFloat32]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
      [dartx.getFloat64]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
      [_getFloat64]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
      [dartx.getInt16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getInt16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getInt32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getInt32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getInt64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [dartx.getInt8]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.getUint16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getUint16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getUint32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getUint32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getUint64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [dartx.getUint8]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
      [_setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
      [dartx.setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
      [_setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
      [dartx.setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setInt64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [dartx.setInt8]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setUint64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [dartx.setUint8]: dart.definiteFunctionType(dart.void, [core.int, core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.DataView, _native_typed_data.NativeByteData);
  const _setRangeFast = Symbol('_setRangeFast');
  _native_typed_data.NativeTypedArray = class NativeTypedArray extends _native_typed_data.NativeTypedData {
    [_setRangeFast](start, end, source, skipCount) {
      let targetLength = this[dartx.length];
      this[_checkPosition](start, targetLength, "start");
      this[_checkPosition](end, targetLength, "end");
      if (dart.notNull(start) > dart.notNull(end)) dart.throw(new core.RangeError.range(start, 0, end));
      let count = dart.notNull(end) - dart.notNull(start);
      if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
      let sourceLength = source[dartx.length];
      if (dart.notNull(sourceLength) - dart.notNull(skipCount) < count) {
        dart.throw(new core.StateError('Not enough elements'));
      }
      if (skipCount != 0 || sourceLength != count) {
        source = source.subarray(skipCount, dart.notNull(skipCount) + count);
      }
      this.set(source, start);
    }
  };
  _native_typed_data.NativeTypedArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior];
  dart.setSignature(_native_typed_data.NativeTypedArray, {
    methods: () => ({[_setRangeFast]: dart.definiteFunctionType(dart.void, [core.int, core.int, _native_typed_data.NativeTypedArray, core.int])})
  });
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'setRange'
  ]);
  _native_typed_data.NativeTypedArrayOfDouble = class NativeTypedArrayOfDouble extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.double), _internal.FixedLengthListMixin$(core.double)) {
    get length() {
      return this.length;
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      this[index] = value;
      return value;
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      if (_native_typed_data.NativeTypedArrayOfDouble.is(iterable)) {
        this[_setRangeFast](start, end, iterable, skipCount);
        return;
      }
      super[dartx.setRange](start, end, iterable, skipCount);
    }
  };
  dart.setSignature(_native_typed_data.NativeTypedArrayOfDouble, {
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      _get: dart.definiteFunctionType(core.double, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, core.num]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfdouble()], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfDouble, ['_get', '_set', 'setRange', 'length']);
  dart.defineExtensionNames([
    'length',
    '_set',
    'setRange'
  ]);
  _native_typed_data.NativeTypedArrayOfInt = class NativeTypedArrayOfInt extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.int), _internal.FixedLengthListMixin$(core.int)) {
    get length() {
      return this.length;
    }
    set length(value) {
      super.length = value;
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      this[index] = value;
      return value;
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      if (_native_typed_data.NativeTypedArrayOfInt.is(iterable)) {
        this[_setRangeFast](start, end, iterable, skipCount);
        return;
      }
      super[dartx.setRange](start, end, iterable, skipCount);
    }
  };
  _native_typed_data.NativeTypedArrayOfInt[dart.implements] = () => [ListOfint()];
  dart.setSignature(_native_typed_data.NativeTypedArrayOfInt, {
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      _set: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfint()], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfInt, ['_set', 'setRange', 'length']);
  dart.defineExtensionNames([
    'runtimeType',
    'sublist'
  ]);
  _native_typed_data.NativeFloat32List = class NativeFloat32List extends _native_typed_data.NativeTypedArrayOfDouble {
    static new(length) {
      return _native_typed_data.NativeFloat32List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat32List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Float32List);
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeFloat32List._create1(source);
    }
    static _create1(arg) {
      return new Float32Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Float32Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Float32Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeFloat32List[dart.implements] = () => [typed_data.Float32List];
  dart.setSignature(_native_typed_data.NativeFloat32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [ListOfdouble()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({[dartx.sublist]: dart.definiteFunctionType(core.List$(core.double), [core.int], [core.int])}),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Float32Array, _native_typed_data.NativeFloat32List);
  dart.defineExtensionNames([
    'runtimeType',
    'sublist'
  ]);
  _native_typed_data.NativeFloat64List = class NativeFloat64List extends _native_typed_data.NativeTypedArrayOfDouble {
    static new(length) {
      return _native_typed_data.NativeFloat64List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat64List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Float64List);
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeFloat64List._create1(source);
    }
    static _create1(arg) {
      return new Float64Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Float64Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Float64Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeFloat64List[dart.implements] = () => [typed_data.Float64List];
  dart.setSignature(_native_typed_data.NativeFloat64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [ListOfdouble()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({[dartx.sublist]: dart.definiteFunctionType(core.List$(core.double), [core.int], [core.int])}),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Float64Array, _native_typed_data.NativeFloat64List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeInt16List = class NativeInt16List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeInt16List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt16List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Int16List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeInt16List._create1(source);
    }
    static _create1(arg) {
      return new Int16Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Int16Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Int16Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeInt16List[dart.implements] = () => [typed_data.Int16List];
  dart.setSignature(_native_typed_data.NativeInt16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [_native_typed_data.NativeByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Int16Array, _native_typed_data.NativeInt16List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeInt32List = class NativeInt32List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeInt32List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt32List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Int32List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeInt32List._create1(source);
    }
    static _create1(arg) {
      return new Int32Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Int32Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Int32Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeInt32List[dart.implements] = () => [typed_data.Int32List];
  dart.setSignature(_native_typed_data.NativeInt32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Int32Array, _native_typed_data.NativeInt32List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeInt8List = class NativeInt8List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeInt8List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt8List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return _native_typed_data.NativeInt8List._check(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length));
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Int8List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeInt8List._create1(source);
    }
    static _create1(arg) {
      return new Int8Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Int8Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Int8Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeInt8List[dart.implements] = () => [typed_data.Int8List];
  dart.setSignature(_native_typed_data.NativeInt8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(typed_data.Int8List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Int8Array, _native_typed_data.NativeInt8List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint16List = class NativeUint16List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint16List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(list) {
      return _native_typed_data.NativeUint16List._create1(_native_typed_data._ensureNativeList(list));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint16List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint16List._create1(source);
    }
    static _create1(arg) {
      return new Uint16Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint16Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint16Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint16List[dart.implements] = () => [typed_data.Uint16List];
  dart.setSignature(_native_typed_data.NativeUint16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint16Array, _native_typed_data.NativeUint16List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint32List = class NativeUint32List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint32List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint32List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint32List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint32List._create1(source);
    }
    static _create1(arg) {
      return new Uint32Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint32Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint32Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint32List[dart.implements] = () => [typed_data.Uint32List];
  dart.setSignature(_native_typed_data.NativeUint32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint32Array, _native_typed_data.NativeUint32List);
  dart.defineExtensionNames([
    'runtimeType',
    'length',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint8ClampedList = class NativeUint8ClampedList extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint8ClampedList);
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](value) {
      super[dartx.length] = value;
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint8ClampedList._create1(source);
    }
    static _create1(arg) {
      return new Uint8ClampedArray(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint8ClampedArray(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint8ClampedArray(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint8ClampedList[dart.implements] = () => [typed_data.Uint8ClampedList];
  dart.setSignature(_native_typed_data.NativeUint8ClampedList, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint8ClampedArray, _native_typed_data.NativeUint8ClampedList);
  dart.registerExtension(dart.global.CanvasPixelArray, _native_typed_data.NativeUint8ClampedList);
  dart.defineExtensionNames([
    'runtimeType',
    'length',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint8List = class NativeUint8List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint8List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint8List);
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](value) {
      super[dartx.length] = value;
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint8List._create1(source);
    }
    static _create1(arg) {
      return new Uint8Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint8Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint8Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint8List[dart.implements] = () => [typed_data.Uint8List];
  dart.setSignature(_native_typed_data.NativeUint8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint8Array, _native_typed_data.NativeUint8List);
  _native_typed_data.NativeFloat32x4 = class NativeFloat32x4 extends core.Object {
    static _truncate(x) {
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, core.num._check(x));
      return _native_typed_data.NativeFloat32x4._list[dartx._get](0);
    }
    new(x, y, z, w) {
      this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
      this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
      this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
      this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
      if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
      if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
      if (!(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
      if (!(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
    }
    splat(v) {
      NativeFloat32x4.prototype.new.call(this, v, v, v, v);
    }
    zero() {
      NativeFloat32x4.prototype._truncated.call(this, 0.0, 0.0, 0.0, 0.0);
    }
    static fromInt32x4Bits(i) {
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](0, i.x);
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](1, i.y);
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](2, i.z);
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](3, i.w);
      return new _native_typed_data.NativeFloat32x4._truncated(_native_typed_data.NativeFloat32x4._list[dartx._get](0), _native_typed_data.NativeFloat32x4._list[dartx._get](1), _native_typed_data.NativeFloat32x4._list[dartx._get](2), _native_typed_data.NativeFloat32x4._list[dartx._get](3));
    }
    fromFloat64x2(v) {
      NativeFloat32x4.prototype._truncated.call(this, core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.x)), core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.y)), 0.0, 0.0);
    }
    _doubles(x, y, z, w) {
      this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
      this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
      this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
      this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
    }
    _truncated(x, y, z, w) {
      this.x = x;
      this.y = y;
      this.z = z;
      this.w = w;
    }
    toString() {
      return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
    }
    ['+'](other) {
      let _x = dart.notNull(this.x) + dart.notNull(other.x);
      let _y = dart.notNull(this.y) + dart.notNull(other.y);
      let _z = dart.notNull(this.z) + dart.notNull(other.z);
      let _w = dart.notNull(this.w) + dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    _negate() {
      return new _native_typed_data.NativeFloat32x4._truncated(-dart.notNull(this.x), -dart.notNull(this.y), -dart.notNull(this.z), -dart.notNull(this.w));
    }
    ['-'](other) {
      let _x = dart.notNull(this.x) - dart.notNull(other.x);
      let _y = dart.notNull(this.y) - dart.notNull(other.y);
      let _z = dart.notNull(this.z) - dart.notNull(other.z);
      let _w = dart.notNull(this.w) - dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    ['*'](other) {
      let _x = dart.notNull(this.x) * dart.notNull(other.x);
      let _y = dart.notNull(this.y) * dart.notNull(other.y);
      let _z = dart.notNull(this.z) * dart.notNull(other.z);
      let _w = dart.notNull(this.w) * dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    ['/'](other) {
      let _x = dart.notNull(this.x) / dart.notNull(other.x);
      let _y = dart.notNull(this.y) / dart.notNull(other.y);
      let _z = dart.notNull(this.z) / dart.notNull(other.z);
      let _w = dart.notNull(this.w) / dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    lessThan(other) {
      let _cx = dart.notNull(this.x) < dart.notNull(other.x);
      let _cy = dart.notNull(this.y) < dart.notNull(other.y);
      let _cz = dart.notNull(this.z) < dart.notNull(other.z);
      let _cw = dart.notNull(this.w) < dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    lessThanOrEqual(other) {
      let _cx = dart.notNull(this.x) <= dart.notNull(other.x);
      let _cy = dart.notNull(this.y) <= dart.notNull(other.y);
      let _cz = dart.notNull(this.z) <= dart.notNull(other.z);
      let _cw = dart.notNull(this.w) <= dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    greaterThan(other) {
      let _cx = dart.notNull(this.x) > dart.notNull(other.x);
      let _cy = dart.notNull(this.y) > dart.notNull(other.y);
      let _cz = dart.notNull(this.z) > dart.notNull(other.z);
      let _cw = dart.notNull(this.w) > dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    greaterThanOrEqual(other) {
      let _cx = dart.notNull(this.x) >= dart.notNull(other.x);
      let _cy = dart.notNull(this.y) >= dart.notNull(other.y);
      let _cz = dart.notNull(this.z) >= dart.notNull(other.z);
      let _cw = dart.notNull(this.w) >= dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    equal(other) {
      let _cx = this.x == other.x;
      let _cy = this.y == other.y;
      let _cz = this.z == other.z;
      let _cw = this.w == other.w;
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    notEqual(other) {
      let _cx = this.x != other.x;
      let _cy = this.y != other.y;
      let _cz = this.z != other.z;
      let _cw = this.w != other.w;
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    scale(s) {
      let _x = dart.notNull(s) * dart.notNull(this.x);
      let _y = dart.notNull(s) * dart.notNull(this.y);
      let _z = dart.notNull(s) * dart.notNull(this.z);
      let _w = dart.notNull(s) * dart.notNull(this.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    abs() {
      let _x = this.x[dartx.abs]();
      let _y = this.y[dartx.abs]();
      let _z = this.z[dartx.abs]();
      let _w = this.w[dartx.abs]();
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    clamp(lowerLimit, upperLimit) {
      let _lx = lowerLimit.x;
      let _ly = lowerLimit.y;
      let _lz = lowerLimit.z;
      let _lw = lowerLimit.w;
      let _ux = upperLimit.x;
      let _uy = upperLimit.y;
      let _uz = upperLimit.z;
      let _uw = upperLimit.w;
      let _x = this.x;
      let _y = this.y;
      let _z = this.z;
      let _w = this.w;
      _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
      _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
      _z = dart.notNull(_z) > dart.notNull(_uz) ? _uz : _z;
      _w = dart.notNull(_w) > dart.notNull(_uw) ? _uw : _w;
      _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
      _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
      _z = dart.notNull(_z) < dart.notNull(_lz) ? _lz : _z;
      _w = dart.notNull(_w) < dart.notNull(_lw) ? _lw : _w;
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    get signMask() {
      let view = _native_typed_data.NativeFloat32x4._uint32view;
      let mx = null, my = null, mz = null, mw = null;
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
      mx = (dart.notNull(view[dartx._get](0)) & 2147483648) >>> 31;
      my = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 30;
      mz = (dart.notNull(view[dartx._get](2)) & 2147483648) >>> 29;
      mw = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 28;
      return core.int._check(dart.dsend(dart.dsend(dart.dsend(mx, '|', my), '|', mz), '|', mw));
    }
    shuffle(mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    shuffleMix(other, mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, other.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, other.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, other.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, other.w);
      let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    withX(newX) {
      return new _native_typed_data.NativeFloat32x4._truncated(core.double._check(_native_typed_data.NativeFloat32x4._truncate(newX)), this.y, this.z, this.w);
    }
    withY(newY) {
      return new _native_typed_data.NativeFloat32x4._truncated(this.x, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newY)), this.z, this.w);
    }
    withZ(newZ) {
      return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newZ)), this.w);
    }
    withW(newW) {
      return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, this.z, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newW)));
    }
    min(other) {
      let _x = dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x;
      let _y = dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y;
      let _z = dart.notNull(this.z) < dart.notNull(other.z) ? this.z : other.z;
      let _w = dart.notNull(this.w) < dart.notNull(other.w) ? this.w : other.w;
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    max(other) {
      let _x = dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x;
      let _y = dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y;
      let _z = dart.notNull(this.z) > dart.notNull(other.z) ? this.z : other.z;
      let _w = dart.notNull(this.w) > dart.notNull(other.w) ? this.w : other.w;
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    sqrt() {
      let _x = math.sqrt(this.x);
      let _y = math.sqrt(this.y);
      let _z = math.sqrt(this.z);
      let _w = math.sqrt(this.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    reciprocal() {
      let _x = 1.0 / dart.notNull(this.x);
      let _y = 1.0 / dart.notNull(this.y);
      let _z = 1.0 / dart.notNull(this.z);
      let _w = 1.0 / dart.notNull(this.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    reciprocalSqrt() {
      let _x = math.sqrt(1.0 / dart.notNull(this.x));
      let _y = math.sqrt(1.0 / dart.notNull(this.y));
      let _z = math.sqrt(1.0 / dart.notNull(this.z));
      let _w = math.sqrt(1.0 / dart.notNull(this.w));
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'splat');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'zero');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'fromFloat64x2');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_doubles');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_truncated');
  _native_typed_data.NativeFloat32x4[dart.implements] = () => [typed_data.Float32x4];
  dart.setSignature(_native_typed_data.NativeFloat32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
      splat: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double]),
      zero: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, []),
      fromInt32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Int32x4]),
      fromFloat64x2: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Float64x2]),
      _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
      _truncated: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double])
    }),
    fields: () => ({
      x: core.double,
      y: core.double,
      z: core.double,
      w: core.double
    }),
    getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      '+': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      _negate: dart.definiteFunctionType(typed_data.Float32x4, []),
      '-': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      '*': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      '/': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      lessThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      lessThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      greaterThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      greaterThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      equal: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      notEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      scale: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      abs: dart.definiteFunctionType(typed_data.Float32x4, []),
      clamp: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4]),
      shuffle: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
      shuffleMix: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, core.int]),
      withX: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      withY: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      withZ: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      withW: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      min: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      max: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      sqrt: dart.definiteFunctionType(typed_data.Float32x4, []),
      reciprocal: dart.definiteFunctionType(typed_data.Float32x4, []),
      reciprocalSqrt: dart.definiteFunctionType(typed_data.Float32x4, [])
    }),
    sfields: () => ({
      _list: _native_typed_data.NativeFloat32List,
      _uint32view: typed_data.Uint32List
    }),
    statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_truncate']
  });
  dart.defineLazy(_native_typed_data.NativeFloat32x4, {
    get _list() {
      return _native_typed_data.NativeFloat32List.new(4);
    },
    get _uint32view() {
      return _native_typed_data.NativeFloat32x4._list[dartx.buffer][dartx.asUint32List]();
    }
  });
  _native_typed_data.NativeInt32x4 = class NativeInt32x4 extends core.Object {
    static _truncate(x) {
      _native_typed_data.NativeInt32x4._list[dartx._set](0, core.int._check(x));
      return _native_typed_data.NativeInt32x4._list[dartx._get](0);
    }
    new(x, y, z, w) {
      this.x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
      this.y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
      this.z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
      this.w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
      if (x != this.x && !(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
      if (y != this.y && !(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
      if (z != this.z && !(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
      if (w != this.w && !(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
    }
    bool(x, y, z, w) {
      this.x = dart.test(x) ? -1 : 0;
      this.y = dart.test(y) ? -1 : 0;
      this.z = dart.test(z) ? -1 : 0;
      this.w = dart.test(w) ? -1 : 0;
    }
    static fromFloat32x4Bits(f) {
      let floatList = _native_typed_data.NativeFloat32x4._list;
      floatList[dartx._set](0, f.x);
      floatList[dartx._set](1, f.y);
      floatList[dartx._set](2, f.z);
      floatList[dartx._set](3, f.w);
      let view = _native_typed_data.NativeInt32List._check(floatList[dartx.buffer][dartx.asInt32List]());
      return new _native_typed_data.NativeInt32x4._truncated(view[dartx._get](0), view[dartx._get](1), view[dartx._get](2), view[dartx._get](3));
    }
    _truncated(x, y, z, w) {
      this.x = x;
      this.y = y;
      this.z = z;
      this.w = w;
    }
    toString() {
      return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
    }
    ['|'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x | other.x, this.y | other.y, this.z | other.z, this.w | other.w);
    }
    ['&'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x & other.x, this.y & other.y, this.z & other.z, this.w & other.w);
    }
    ['^'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x ^ other.x, this.y ^ other.y, this.z ^ other.z, this.w ^ other.w);
    }
    ['+'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x + other.x | 0, this.y + other.y | 0, this.z + other.z | 0, this.w + other.w | 0);
    }
    ['-'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x - other.x | 0, this.y - other.y | 0, this.z - other.z | 0, this.w - other.w | 0);
    }
    _negate() {
      return new _native_typed_data.NativeInt32x4._truncated(-this.x | 0, -this.y | 0, -this.z | 0, -this.w | 0);
    }
    get signMask() {
      let mx = (dart.notNull(this.x) & 2147483648) >>> 31;
      let my = (dart.notNull(this.y) & 2147483648) >>> 31;
      let mz = (dart.notNull(this.z) & 2147483648) >>> 31;
      let mw = (dart.notNull(this.w) & 2147483648) >>> 31;
      return (mx | my << 1 | mz << 2 | mw << 3) >>> 0;
    }
    shuffle(mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
    }
    shuffleMix(other, mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      _native_typed_data.NativeInt32x4._list[dartx._set](0, other.x);
      _native_typed_data.NativeInt32x4._list[dartx._set](1, other.y);
      _native_typed_data.NativeInt32x4._list[dartx._set](2, other.z);
      _native_typed_data.NativeInt32x4._list[dartx._set](3, other.w);
      let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
    }
    withX(x) {
      let _x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
      return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
    }
    withY(y) {
      let _y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
      return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
    }
    withZ(z) {
      let _z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
    }
    withW(w) {
      let _w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
    }
    get flagX() {
      return this.x != 0;
    }
    get flagY() {
      return this.y != 0;
    }
    get flagZ() {
      return this.z != 0;
    }
    get flagW() {
      return this.w != 0;
    }
    withFlagX(flagX) {
      let _x = dart.test(flagX) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
    }
    withFlagY(flagY) {
      let _y = dart.test(flagY) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
    }
    withFlagZ(flagZ) {
      let _z = dart.test(flagZ) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
    }
    withFlagW(flagW) {
      let _w = dart.test(flagW) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
    }
    select(trueValue, falseValue) {
      let floatList = _native_typed_data.NativeFloat32x4._list;
      let intView = _native_typed_data.NativeFloat32x4._uint32view;
      floatList[dartx._set](0, trueValue.x);
      floatList[dartx._set](1, trueValue.y);
      floatList[dartx._set](2, trueValue.z);
      floatList[dartx._set](3, trueValue.w);
      let stx = intView[dartx._get](0);
      let sty = intView[dartx._get](1);
      let stz = intView[dartx._get](2);
      let stw = intView[dartx._get](3);
      floatList[dartx._set](0, falseValue.x);
      floatList[dartx._set](1, falseValue.y);
      floatList[dartx._set](2, falseValue.z);
      floatList[dartx._set](3, falseValue.w);
      let sfx = intView[dartx._get](0);
      let sfy = intView[dartx._get](1);
      let sfz = intView[dartx._get](2);
      let sfw = intView[dartx._get](3);
      let _x = (dart.notNull(this.x) & dart.notNull(stx) | ~dart.notNull(this.x) & dart.notNull(sfx)) >>> 0;
      let _y = (dart.notNull(this.y) & dart.notNull(sty) | ~dart.notNull(this.y) & dart.notNull(sfy)) >>> 0;
      let _z = (dart.notNull(this.z) & dart.notNull(stz) | ~dart.notNull(this.z) & dart.notNull(sfz)) >>> 0;
      let _w = (dart.notNull(this.w) & dart.notNull(stw) | ~dart.notNull(this.w) & dart.notNull(sfw)) >>> 0;
      intView[dartx._set](0, _x);
      intView[dartx._set](1, _y);
      intView[dartx._set](2, _z);
      intView[dartx._set](3, _w);
      return new _native_typed_data.NativeFloat32x4._truncated(floatList[dartx._get](0), floatList[dartx._get](1), floatList[dartx._get](2), floatList[dartx._get](3));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, 'bool');
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, '_truncated');
  _native_typed_data.NativeInt32x4[dart.implements] = () => [typed_data.Int32x4];
  dart.setSignature(_native_typed_data.NativeInt32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int]),
      bool: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.bool, core.bool, core.bool, core.bool]),
      fromFloat32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [typed_data.Float32x4]),
      _truncated: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int])
    }),
    fields: () => ({
      x: core.int,
      y: core.int,
      z: core.int,
      w: core.int
    }),
    getters: () => ({
      signMask: dart.definiteFunctionType(core.int, []),
      flagX: dart.definiteFunctionType(core.bool, []),
      flagY: dart.definiteFunctionType(core.bool, []),
      flagZ: dart.definiteFunctionType(core.bool, []),
      flagW: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      '|': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '&': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '^': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '+': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '-': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      _negate: dart.definiteFunctionType(typed_data.Int32x4, []),
      shuffle: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      shuffleMix: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4, core.int]),
      withX: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withY: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withZ: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withW: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withFlagX: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      withFlagY: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      withFlagZ: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      withFlagW: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      select: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4])
    }),
    sfields: () => ({_list: _native_typed_data.NativeInt32List}),
    statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_truncate']
  });
  dart.defineLazy(_native_typed_data.NativeInt32x4, {
    get _list() {
      return _native_typed_data.NativeInt32List.new(4);
    }
  });
  _native_typed_data.NativeFloat64x2 = class NativeFloat64x2 extends core.Object {
    new(x, y) {
      this.x = x;
      this.y = y;
      if (!(typeof this.x == 'number')) dart.throw(new core.ArgumentError(this.x));
      if (!(typeof this.y == 'number')) dart.throw(new core.ArgumentError(this.y));
    }
    splat(v) {
      NativeFloat64x2.prototype.new.call(this, v, v);
    }
    zero() {
      NativeFloat64x2.prototype.splat.call(this, 0.0);
    }
    fromFloat32x4(v) {
      NativeFloat64x2.prototype.new.call(this, v.x, v.y);
    }
    _doubles(x, y) {
      this.x = x;
      this.y = y;
    }
    toString() {
      return dart.str`[${this.x}, ${this.y}]`;
    }
    ['+'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
    }
    _negate() {
      return new _native_typed_data.NativeFloat64x2._doubles(-dart.notNull(this.x), -dart.notNull(this.y));
    }
    ['-'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
    }
    ['*'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(other.x), dart.notNull(this.y) * dart.notNull(other.y));
    }
    ['/'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) / dart.notNull(other.x), dart.notNull(this.y) / dart.notNull(other.y));
    }
    scale(s) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(s), dart.notNull(this.y) * dart.notNull(s));
    }
    abs() {
      return new _native_typed_data.NativeFloat64x2._doubles(this.x[dartx.abs](), this.y[dartx.abs]());
    }
    clamp(lowerLimit, upperLimit) {
      let _lx = lowerLimit.x;
      let _ly = lowerLimit.y;
      let _ux = upperLimit.x;
      let _uy = upperLimit.y;
      let _x = this.x;
      let _y = this.y;
      _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
      _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
      _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
      _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
      return new _native_typed_data.NativeFloat64x2._doubles(_x, _y);
    }
    get signMask() {
      let view = _native_typed_data.NativeFloat64x2._uint32View;
      _native_typed_data.NativeFloat64x2._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat64x2._list[dartx._set](1, this.y);
      let mx = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 31;
      let my = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 31;
      return (mx | my << 1) >>> 0;
    }
    withX(x) {
      if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
      return new _native_typed_data.NativeFloat64x2._doubles(x, this.y);
    }
    withY(y) {
      if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
      return new _native_typed_data.NativeFloat64x2._doubles(this.x, y);
    }
    min(other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y);
    }
    max(other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y);
    }
    sqrt() {
      return new _native_typed_data.NativeFloat64x2._doubles(math.sqrt(this.x), math.sqrt(this.y));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'splat');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'zero');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'fromFloat32x4');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, '_doubles');
  _native_typed_data.NativeFloat64x2[dart.implements] = () => [typed_data.Float64x2];
  dart.setSignature(_native_typed_data.NativeFloat64x2, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double]),
      splat: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double]),
      zero: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, []),
      fromFloat32x4: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [typed_data.Float32x4]),
      _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double])
    }),
    fields: () => ({
      x: core.double,
      y: core.double
    }),
    getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      '+': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      _negate: dart.definiteFunctionType(typed_data.Float64x2, []),
      '-': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      '*': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      '/': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      scale: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      abs: dart.definiteFunctionType(typed_data.Float64x2, []),
      clamp: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2, typed_data.Float64x2]),
      withX: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      withY: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      min: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      max: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      sqrt: dart.definiteFunctionType(typed_data.Float64x2, [])
    }),
    sfields: () => ({
      _list: _native_typed_data.NativeFloat64List,
      _uint32View: _native_typed_data.NativeUint32List
    })
  });
  dart.defineLazy(_native_typed_data.NativeFloat64x2, {
    get _list() {
      return _native_typed_data.NativeFloat64List.new(2);
    },
    set _list(_) {},
    get _uint32View() {
      return _native_typed_data.NativeUint32List._check(_native_typed_data.NativeFloat64x2._list[dartx.buffer][dartx.asUint32List]());
    },
    set _uint32View(_) {}
  });
  _native_typed_data._isInvalidArrayIndex = function(index) {
    return index >>> 0 !== index;
  };
  dart.lazyFn(_native_typed_data._isInvalidArrayIndex, () => intTobool());
  _native_typed_data._checkValidIndex = function(index, list, length) {
    if (dart.test(_native_typed_data._isInvalidArrayIndex(index)) || index >= dart.notNull(length)) {
      dart.throw(_js_helper.diagnoseIndexError(list, index));
    }
  };
  dart.lazyFn(_native_typed_data._checkValidIndex, () => intAndListAndintTovoid());
  _native_typed_data._checkValidRange = function(start, end, length) {
    if (dart.test(_native_typed_data._isInvalidArrayIndex(start)) || (end == null ? dart.notNull(start) > dart.notNull(length) : dart.test(_native_typed_data._isInvalidArrayIndex(end)) || dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length))) {
      dart.throw(_js_helper.diagnoseRangeError(start, end, length));
    }
    if (end == null) return length;
    return end;
  };
  dart.fn(_native_typed_data._checkValidRange, intAndintAndintToint());
  async._Callback = dart.typedef('_Callback', () => dart.functionType(dart.void, []));
  async._TakeCallback = dart.typedef('_TakeCallback', () => dart.functionType(dart.void, [async._Callback]));
  async._invokeErrorHandler = function(errorHandler, error, stackTrace) {
    if (async.ZoneBinaryCallback.is(errorHandler)) {
      return dart.dcall(errorHandler, error, stackTrace);
    } else {
      let unaryErrorHandler = async.ZoneUnaryCallback._check(errorHandler);
      return dart.dcall(unaryErrorHandler, error);
    }
  };
  dart.lazyFn(async._invokeErrorHandler, () => FunctionAndObjectAndStackTraceTodynamic());
  async._registerErrorHandler = function(R) {
    return (errorHandler, zone) => {
      if (async.ZoneBinaryCallback.is(errorHandler)) {
        return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
      } else {
        return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
      }
    };
  };
  dart.lazyFn(async._registerErrorHandler, () => FunctionAndZoneToFunction());
  async.AsyncError = class AsyncError extends core.Object {
    new(error, stackTrace) {
      this.error = error;
      this.stackTrace = stackTrace;
    }
    toString() {
      return dart.str`${this.error}`;
    }
  };
  async.AsyncError[dart.implements] = () => [core.Error];
  dart.setSignature(async.AsyncError, {
    constructors: () => ({new: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace])}),
    fields: () => ({
      error: core.Object,
      stackTrace: core.StackTrace
    })
  });
  async._UncaughtAsyncError = class _UncaughtAsyncError extends async.AsyncError {
    new(error, stackTrace) {
      super.new(error, async._UncaughtAsyncError._getBestStackTrace(error, stackTrace));
    }
    static _getBestStackTrace(error, stackTrace) {
      if (stackTrace != null) return stackTrace;
      if (core.Error.is(error)) {
        return error.stackTrace;
      }
      return null;
    }
    toString() {
      let result = dart.str`Uncaught Error: ${this.error}`;
      if (this.stackTrace != null) {
        result = result + dart.str`\nStack Trace:\n${this.stackTrace}`;
      }
      return result;
    }
  };
  dart.setSignature(async._UncaughtAsyncError, {
    constructors: () => ({new: dart.definiteFunctionType(async._UncaughtAsyncError, [dart.dynamic, core.StackTrace])}),
    statics: () => ({_getBestStackTrace: dart.definiteFunctionType(core.StackTrace, [dart.dynamic, core.StackTrace])}),
    names: ['_getBestStackTrace']
  });
  const _controller$ = Symbol('_controller');
  const _subscribe = Symbol('_subscribe');
  const _createSubscription = Symbol('_createSubscription');
  const _onListen = Symbol('_onListen');
  async._StreamImpl$ = dart.generic(T => {
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _StreamImpl extends async.Stream$(T) {
      new() {
        super.new();
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        let subscription = this[_createSubscription](onData, onError, onDone, cancelOnError);
        this[_onListen](subscription);
        return subscription;
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
      }
      [_onListen](subscription) {}
    }
    dart.setSignature(_StreamImpl, {
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_onListen]: dart.definiteFunctionType(dart.void, [async.StreamSubscription])
      })
    });
    return _StreamImpl;
  });
  async._StreamImpl = _StreamImpl();
  async._ControllerStream$ = dart.generic(T => {
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    class _ControllerStream extends async._StreamImpl$(T) {
      new(controller) {
        this[_controller$] = controller;
        super.new();
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
      }
      get hashCode() {
        return (dart.notNull(dart.hashCode(this[_controller$])) ^ 892482866) >>> 0;
      }
      ['=='](other) {
        if (core.identical(this, other)) return true;
        if (!async._ControllerStream.is(other)) return false;
        let otherStream = async._ControllerStream._check(other);
        return core.identical(otherStream[_controller$], this[_controller$]);
      }
    }
    dart.setSignature(_ControllerStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._ControllerStream$(T), [_StreamControllerLifecycleOfT()])}),
      fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        '==': dart.definiteFunctionType(core.bool, [core.Object])
      })
    });
    return _ControllerStream;
  });
  async._ControllerStream = _ControllerStream();
  async._BroadcastStream$ = dart.generic(T => {
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    class _BroadcastStream extends async._ControllerStream$(T) {
      new(controller) {
        super.new(controller);
      }
      get isBroadcast() {
        return true;
      }
    }
    dart.setSignature(_BroadcastStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStream$(T), [_StreamControllerLifecycleOfT()])})
    });
    return _BroadcastStream;
  });
  async._BroadcastStream = _BroadcastStream();
  const _eventState = Symbol('_eventState');
  const _next$ = Symbol('_next');
  const _previous$ = Symbol('_previous');
  const _expectsEvent = Symbol('_expectsEvent');
  const _toggleEventId = Symbol('_toggleEventId');
  const _isFiring = Symbol('_isFiring');
  const _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring');
  const _removeAfterFiring = Symbol('_removeAfterFiring');
  const _onPause = Symbol('_onPause');
  const _onResume = Symbol('_onResume');
  const _recordCancel = Symbol('_recordCancel');
  const _onCancel = Symbol('_onCancel');
  const _recordPause = Symbol('_recordPause');
  const _recordResume = Symbol('_recordResume');
  const _zone = Symbol('_zone');
  const _state = Symbol('_state');
  const _onData = Symbol('_onData');
  const _onError = Symbol('_onError');
  const _onDone = Symbol('_onDone');
  const _cancelFuture = Symbol('_cancelFuture');
  const _pending = Symbol('_pending');
  const _setPendingEvents = Symbol('_setPendingEvents');
  const _isCanceled = Symbol('_isCanceled');
  const _isPaused = Symbol('_isPaused');
  const _isInputPaused = Symbol('_isInputPaused');
  const _inCallback = Symbol('_inCallback');
  const _guardCallback = Symbol('_guardCallback');
  const _decrementPauseCount = Symbol('_decrementPauseCount');
  const _hasPending = Symbol('_hasPending');
  const _mayResumeInput = Symbol('_mayResumeInput');
  const _cancel = Symbol('_cancel');
  const _isClosed$ = Symbol('_isClosed');
  const _waitsForCancel = Symbol('_waitsForCancel');
  const _canFire = Symbol('_canFire');
  const _cancelOnError = Symbol('_cancelOnError');
  const _incrementPauseCount = Symbol('_incrementPauseCount');
  const _sendData = Symbol('_sendData');
  const _addPending = Symbol('_addPending');
  const _sendError = Symbol('_sendError');
  const _sendDone = Symbol('_sendDone');
  let const$5;
  const _close$ = Symbol('_close');
  const _checkState = Symbol('_checkState');
  async._BufferingStreamSubscription$ = dart.generic(T => {
    let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BufferingStreamSubscription extends core.Object {
      new(onData, onError, onDone, cancelOnError) {
        this[_zone] = async.Zone.current;
        this[_state] = dart.test(cancelOnError) ? async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR : 0;
        this[_onData] = null;
        this[_onError] = null;
        this[_onDone] = null;
        this[_cancelFuture] = null;
        this[_pending] = null;
        this.onData(onData);
        this.onError(onError);
        this.onDone(onDone);
      }
      [_setPendingEvents](pendingEvents) {
        _PendingEventsOfT()._check(pendingEvents);
        dart.assert(this[_pending] == null);
        if (pendingEvents == null) return;
        this[_pending] = pendingEvents;
        if (!dart.test(pendingEvents.isEmpty)) {
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
          this[_pending].schedule(this);
        }
      }
      onData(handleData) {
        if (handleData == null) handleData = async._nullDataHandler;
        this[_onData] = this[_zone].registerUnaryCallback(dart.dynamic, T)(handleData);
      }
      onError(handleError) {
        if (handleError == null) handleError = async._nullErrorHandler;
        this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
      }
      onDone(handleDone) {
        if (handleDone == null) handleDone = async._nullDoneHandler;
        this[_onDone] = this[_zone].registerCallback(dart.dynamic)(handleDone);
      }
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        if (dart.test(this[_isCanceled])) return;
        let wasPaused = this[_isPaused];
        let wasInputPaused = this[_isInputPaused];
        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
        if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
        if (!dart.test(wasPaused) && this[_pending] != null) this[_pending].cancelSchedule();
        if (!dart.test(wasInputPaused) && !dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onPause));
      }
      resume() {
        if (dart.test(this[_isCanceled])) return;
        if (dart.test(this[_isPaused])) {
          this[_decrementPauseCount]();
          if (!dart.test(this[_isPaused])) {
            if (dart.test(this[_hasPending]) && !dart.test(this[_pending].isEmpty)) {
              this[_pending].schedule(this);
            } else {
              dart.assert(this[_mayResumeInput]);
              this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
              if (!dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onResume));
            }
          }
        }
      }
      cancel() {
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
        if (dart.test(this[_isCanceled])) return this[_cancelFuture];
        this[_cancel]();
        return this[_cancelFuture];
      }
      asFuture(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          let result = new (async._Future$(E))();
          this[_onDone] = dart.fn(() => {
            result[_complete](futureValue);
          }, VoidTovoid$());
          this[_onError] = dart.fn((error, stackTrace) => {
            this.cancel();
            result[_completeError](error, core.StackTrace._check(stackTrace));
          }, dynamicAnddynamicTodynamic$());
          return result;
        };
      }
      get [_isInputPaused]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_INPUT_PAUSED) != 0;
      }
      get [_isClosed$]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CLOSED) != 0;
      }
      get [_isCanceled]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCELED) != 0;
      }
      get [_waitsForCancel]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) != 0;
      }
      get [_inCallback]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_IN_CALLBACK) != 0;
      }
      get [_hasPending]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_HAS_PENDING) != 0;
      }
      get [_isPaused]() {
        return dart.notNull(this[_state]) >= async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
      }
      get [_canFire]() {
        return dart.notNull(this[_state]) < async._BufferingStreamSubscription._STATE_IN_CALLBACK;
      }
      get [_mayResumeInput]() {
        return !dart.test(this[_isPaused]) && (this[_pending] == null || dart.test(this[_pending].isEmpty));
      }
      get [_cancelOnError]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR) != 0;
      }
      get isPaused() {
        return this[_isPaused];
      }
      [_cancel]() {
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED) >>> 0;
        if (dart.test(this[_hasPending])) {
          this[_pending].cancelSchedule();
        }
        if (!dart.test(this[_inCallback])) this[_pending] = null;
        this[_cancelFuture] = this[_onCancel]();
      }
      [_incrementPauseCount]() {
        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
      }
      [_decrementPauseCount]() {
        dart.assert(this[_isPaused]);
        this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
      }
      [_add$](data) {
        T._check(data);
        dart.assert(!dart.test(this[_isClosed$]));
        if (dart.test(this[_isCanceled])) return;
        if (dart.test(this[_canFire])) {
          this[_sendData](data);
        } else {
          this[_addPending](new (_DelayedDataOfT())(data));
        }
      }
      [_addError](error, stackTrace) {
        if (dart.test(this[_isCanceled])) return;
        if (dart.test(this[_canFire])) {
          this[_sendError](error, stackTrace);
        } else {
          this[_addPending](new async._DelayedError(error, stackTrace));
        }
      }
      [_close$]() {
        dart.assert(!dart.test(this[_isClosed$]));
        if (dart.test(this[_isCanceled])) return;
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CLOSED) >>> 0;
        if (dart.test(this[_canFire])) {
          this[_sendDone]();
        } else {
          this[_addPending](const$5 || (const$5 = dart.const(new async._DelayedDone())));
        }
      }
      [_onPause]() {
        dart.assert(this[_isInputPaused]);
      }
      [_onResume]() {
        dart.assert(!dart.test(this[_isInputPaused]));
      }
      [_onCancel]() {
        dart.assert(this[_isCanceled]);
        return null;
      }
      [_addPending](event) {
        let pending = _StreamImplEventsOfT()._check(this[_pending]);
        if (this[_pending] == null) {
          pending = this[_pending] = new (_StreamImplEventsOfT())();
        }
        pending.add(event);
        if (!dart.test(this[_hasPending])) {
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
          if (!dart.test(this[_isPaused])) {
            this[_pending].schedule(this);
          }
        }
      }
      [_sendData](data) {
        T._check(data);
        dart.assert(!dart.test(this[_isCanceled]));
        dart.assert(!dart.test(this[_isPaused]));
        dart.assert(!dart.test(this[_inCallback]));
        let wasInputPaused = this[_isInputPaused];
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_zone].runUnaryGuarded(dart.dynamic, T)(this[_onData], data);
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_checkState](wasInputPaused);
      }
      [_sendError](error, stackTrace) {
        dart.assert(!dart.test(this[_isCanceled]));
        dart.assert(!dart.test(this[_isPaused]));
        dart.assert(!dart.test(this[_inCallback]));
        let wasInputPaused = this[_isInputPaused];
        const sendError = (function() {
          if (dart.test(this[_isCanceled]) && !dart.test(this[_waitsForCancel])) return;
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          if (ZoneBinaryCallbackOfdynamic$Object$StackTrace().is(this[_onError])) {
            let errorCallback = ZoneBinaryCallbackOfdynamic$Object$StackTrace().as(this[_onError]);
            this[_zone].runBinaryGuarded(dart.dynamic, core.Object, core.StackTrace)(errorCallback, error, stackTrace);
          } else {
            this[_zone].runUnaryGuarded(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(this[_onError]), error);
          }
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        }).bind(this);
        dart.fn(sendError, VoidTovoid$());
        if (dart.test(this[_cancelOnError])) {
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
          this[_cancel]();
          if (async.Future.is(this[_cancelFuture])) {
            this[_cancelFuture].whenComplete(sendError);
          } else {
            sendError();
          }
        } else {
          sendError();
          this[_checkState](wasInputPaused);
        }
      }
      [_sendDone]() {
        dart.assert(!dart.test(this[_isCanceled]));
        dart.assert(!dart.test(this[_isPaused]));
        dart.assert(!dart.test(this[_inCallback]));
        const sendDone = (function() {
          if (!dart.test(this[_waitsForCancel])) return;
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED | async._BufferingStreamSubscription._STATE_CLOSED | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          this[_zone].runGuarded(dart.dynamic)(this[_onDone]);
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        }).bind(this);
        dart.fn(sendDone, VoidTovoid$());
        this[_cancel]();
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
        if (async.Future.is(this[_cancelFuture])) {
          this[_cancelFuture].whenComplete(sendDone);
        } else {
          sendDone();
        }
      }
      [_guardCallback](callback) {
        dart.assert(!dart.test(this[_inCallback]));
        let wasInputPaused = this[_isInputPaused];
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        callback();
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_checkState](wasInputPaused);
      }
      [_checkState](wasInputPaused) {
        dart.assert(!dart.test(this[_inCallback]));
        if (dart.test(this[_hasPending]) && dart.test(this[_pending].isEmpty)) {
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
          if (dart.test(this[_isInputPaused]) && dart.test(this[_mayResumeInput])) {
            this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
          }
        }
        while (true) {
          if (dart.test(this[_isCanceled])) {
            this[_pending] = null;
            return;
          }
          let isInputPaused = this[_isInputPaused];
          if (wasInputPaused == isInputPaused) break;
          this[_state] = (dart.notNull(this[_state]) ^ async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          if (dart.test(isInputPaused)) {
            this[_onPause]();
          } else {
            this[_onResume]();
          }
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          wasInputPaused = isInputPaused;
        }
        if (dart.test(this[_hasPending]) && !dart.test(this[_isPaused])) {
          this[_pending].schedule(this);
        }
      }
    }
    dart.addTypeTests(_BufferingStreamSubscription);
    _BufferingStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT(), _EventSinkOfT(), _EventDispatchOfT()];
    dart.setSignature(_BufferingStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._BufferingStreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_onData]: TTovoid(),
        [_onError]: core.Function,
        [_onDone]: async._DoneHandler,
        [_zone]: async.Zone,
        [_state]: core.int,
        [_cancelFuture]: async.Future,
        [_pending]: _PendingEventsOfT()
      }),
      getters: () => ({
        [_isInputPaused]: dart.definiteFunctionType(core.bool, []),
        [_isClosed$]: dart.definiteFunctionType(core.bool, []),
        [_isCanceled]: dart.definiteFunctionType(core.bool, []),
        [_waitsForCancel]: dart.definiteFunctionType(core.bool, []),
        [_inCallback]: dart.definiteFunctionType(core.bool, []),
        [_hasPending]: dart.definiteFunctionType(core.bool, []),
        [_isPaused]: dart.definiteFunctionType(core.bool, []),
        [_canFire]: dart.definiteFunctionType(core.bool, []),
        [_mayResumeInput]: dart.definiteFunctionType(core.bool, []),
        [_cancelOnError]: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        [_setPendingEvents]: dart.definiteFunctionType(dart.void, [_PendingEventsOfT()]),
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
        [_cancel]: dart.definiteFunctionType(dart.void, []),
        [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
        [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_close$]: dart.definiteFunctionType(dart.void, []),
        [_onPause]: dart.definiteFunctionType(dart.void, []),
        [_onResume]: dart.definiteFunctionType(dart.void, []),
        [_onCancel]: dart.definiteFunctionType(async.Future, []),
        [_addPending]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, []),
        [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
      }),
      sfields: () => ({
        _STATE_CANCEL_ON_ERROR: core.int,
        _STATE_CLOSED: core.int,
        _STATE_INPUT_PAUSED: core.int,
        _STATE_CANCELED: core.int,
        _STATE_WAIT_FOR_CANCEL: core.int,
        _STATE_IN_CALLBACK: core.int,
        _STATE_HAS_PENDING: core.int,
        _STATE_PAUSE_COUNT: core.int,
        _STATE_PAUSE_COUNT_SHIFT: core.int
      })
    });
    return _BufferingStreamSubscription;
  });
  async._BufferingStreamSubscription = _BufferingStreamSubscription();
  async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR = 1;
  async._BufferingStreamSubscription._STATE_CLOSED = 2;
  async._BufferingStreamSubscription._STATE_INPUT_PAUSED = 4;
  async._BufferingStreamSubscription._STATE_CANCELED = 8;
  async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL = 16;
  async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
  async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
  async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
  async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
  async._ControllerSubscription$ = dart.generic(T => {
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
      new(controller, onData, onError, onDone, cancelOnError) {
        this[_controller$] = controller;
        super.new(onData, onError, onDone, cancelOnError);
      }
      [_onCancel]() {
        return this[_controller$][_recordCancel](this);
      }
      [_onPause]() {
        this[_controller$][_recordPause](this);
      }
      [_onResume]() {
        this[_controller$][_recordResume](this);
      }
    }
    dart.setSignature(_ControllerSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._ControllerSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()})
    });
    return _ControllerSubscription;
  });
  async._ControllerSubscription = _ControllerSubscription();
  async._BroadcastSubscription$ = dart.generic(T => {
    let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BroadcastSubscription extends async._ControllerSubscription$(T) {
      new(controller, onData, onError, onDone, cancelOnError) {
        this[_eventState] = 0;
        this[_next$] = null;
        this[_previous$] = null;
        super.new(controller, onData, onError, onDone, cancelOnError);
        this[_next$] = this[_previous$] = this;
      }
      [_expectsEvent](eventId) {
        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_EVENT_ID) == eventId;
      }
      [_toggleEventId]() {
        this[_eventState] = (dart.notNull(this[_eventState]) ^ async._BroadcastSubscription._STATE_EVENT_ID) >>> 0;
      }
      get [_isFiring]() {
        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_FIRING) != 0;
      }
      [_setRemoveAfterFiring]() {
        dart.assert(this[_isFiring]);
        this[_eventState] = (dart.notNull(this[_eventState]) | async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) >>> 0;
      }
      get [_removeAfterFiring]() {
        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) != 0;
      }
      [_onPause]() {}
      [_onResume]() {}
    }
    dart.setSignature(_BroadcastSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_eventState]: core.int,
        [_next$]: _BroadcastSubscriptionOfT(),
        [_previous$]: _BroadcastSubscriptionOfT()
      }),
      getters: () => ({
        [_isFiring]: dart.definiteFunctionType(core.bool, []),
        [_removeAfterFiring]: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        [_expectsEvent]: dart.definiteFunctionType(core.bool, [core.int]),
        [_toggleEventId]: dart.definiteFunctionType(dart.void, []),
        [_setRemoveAfterFiring]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_EVENT_ID: core.int,
        _STATE_FIRING: core.int,
        _STATE_REMOVE_AFTER_FIRING: core.int
      })
    });
    return _BroadcastSubscription;
  });
  async._BroadcastSubscription = _BroadcastSubscription();
  async._BroadcastSubscription._STATE_EVENT_ID = 1;
  async._BroadcastSubscription._STATE_FIRING = 2;
  async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING = 4;
  const _firstSubscription = Symbol('_firstSubscription');
  const _lastSubscription = Symbol('_lastSubscription');
  const _addStreamState = Symbol('_addStreamState');
  const _doneFuture = Symbol('_doneFuture');
  const _isEmpty = Symbol('_isEmpty');
  const _hasOneListener = Symbol('_hasOneListener');
  const _isAddingStream = Symbol('_isAddingStream');
  const _mayAddEvent = Symbol('_mayAddEvent');
  const _ensureDoneFuture = Symbol('_ensureDoneFuture');
  const _addListener = Symbol('_addListener');
  const _removeListener = Symbol('_removeListener');
  const _callOnCancel = Symbol('_callOnCancel');
  const _addEventError = Symbol('_addEventError');
  const _forEachListener = Symbol('_forEachListener');
  const _mayComplete = Symbol('_mayComplete');
  const _asyncComplete = Symbol('_asyncComplete');
  async._BroadcastStreamController$ = dart.generic(T => {
    let _BroadcastStreamOfT = () => (_BroadcastStreamOfT = dart.constFn(async._BroadcastStream$(T)))();
    let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
    let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let _AddStreamStateOfT = () => (_AddStreamStateOfT = dart.constFn(async._AddStreamState$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
    class _BroadcastStreamController extends core.Object {
      new(onListen, onCancel) {
        this.onListen = onListen;
        this.onCancel = onCancel;
        this[_state] = async._BroadcastStreamController._STATE_INITIAL;
        this[_firstSubscription] = null;
        this[_lastSubscription] = null;
        this[_addStreamState] = null;
        this[_doneFuture] = null;
      }
      get onPause() {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      set onPause(onPauseHandler) {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      get onResume() {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      set onResume(onResumeHandler) {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      get stream() {
        return new (_BroadcastStreamOfT())(this);
      }
      get sink() {
        return new (_StreamSinkWrapperOfT())(this);
      }
      get isClosed() {
        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_CLOSED) != 0;
      }
      get isPaused() {
        return false;
      }
      get hasListener() {
        return !dart.test(this[_isEmpty]);
      }
      get [_hasOneListener]() {
        dart.assert(!dart.test(this[_isEmpty]));
        return core.identical(this[_firstSubscription], this[_lastSubscription]);
      }
      get [_isFiring]() {
        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_FIRING) != 0;
      }
      get [_isAddingStream]() {
        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_ADDSTREAM) != 0;
      }
      get [_mayAddEvent]() {
        return dart.notNull(this[_state]) < async._BroadcastStreamController._STATE_CLOSED;
      }
      [_ensureDoneFuture]() {
        if (this[_doneFuture] != null) return this[_doneFuture];
        return this[_doneFuture] = new async._Future();
      }
      get [_isEmpty]() {
        return this[_firstSubscription] == null;
      }
      [_addListener](subscription) {
        _BroadcastSubscriptionOfT()._check(subscription);
        dart.assert(core.identical(subscription[_next$], subscription));
        subscription[_eventState] = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
        let oldLast = this[_lastSubscription];
        this[_lastSubscription] = subscription;
        subscription[_next$] = null;
        subscription[_previous$] = oldLast;
        if (oldLast == null) {
          this[_firstSubscription] = subscription;
        } else {
          oldLast[_next$] = subscription;
        }
      }
      [_removeListener](subscription) {
        _BroadcastSubscriptionOfT()._check(subscription);
        dart.assert(core.identical(subscription[_controller$], this));
        dart.assert(!core.identical(subscription[_next$], subscription));
        let previous = subscription[_previous$];
        let next = subscription[_next$];
        if (previous == null) {
          this[_firstSubscription] = next;
        } else {
          previous[_next$] = next;
        }
        if (next == null) {
          this[_lastSubscription] = previous;
        } else {
          next[_previous$] = previous;
        }
        subscription[_next$] = subscription[_previous$] = subscription;
      }
      [_subscribe](onData, onError, onDone, cancelOnError) {
        if (dart.test(this.isClosed)) {
          if (onDone == null) onDone = async._nullDoneHandler;
          return new (_DoneStreamSubscriptionOfT())(onDone);
        }
        let subscription = new (_BroadcastSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
        this[_addListener](_BroadcastSubscriptionOfT()._check(subscription));
        if (core.identical(this[_firstSubscription], this[_lastSubscription])) {
          async._runGuarded(this.onListen);
        }
        return subscription;
      }
      [_recordCancel](sub) {
        StreamSubscriptionOfT()._check(sub);
        let subscription = _BroadcastSubscriptionOfT()._check(sub);
        if (core.identical(subscription[_next$], subscription)) return null;
        if (dart.test(subscription[_isFiring])) {
          subscription[_setRemoveAfterFiring]();
        } else {
          this[_removeListener](subscription);
          if (!dart.test(this[_isFiring]) && dart.test(this[_isEmpty])) {
            this[_callOnCancel]();
          }
        }
        return null;
      }
      [_recordPause](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_recordResume](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_addEventError]() {
        if (dart.test(this.isClosed)) {
          return new core.StateError("Cannot add new events after calling close");
        }
        dart.assert(this[_isAddingStream]);
        return new core.StateError("Cannot add new events while doing an addStream");
      }
      add(data) {
        T._check(data);
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_sendData](data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        error = async._nonNullError(error);
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
        this[_sendError](error, stackTrace);
      }
      close() {
        if (dart.test(this.isClosed)) {
          dart.assert(this[_doneFuture] != null);
          return this[_doneFuture];
        }
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
        let doneFuture = this[_ensureDoneFuture]();
        this[_sendDone]();
        return doneFuture;
      }
      get done() {
        return this[_ensureDoneFuture]();
      }
      addStream(stream, opts) {
        StreamOfT()._check(stream);
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
        this[_addStreamState] = new (_AddStreamStateOfT())(this, stream, cancelOnError);
        return this[_addStreamState].addStreamFuture;
      }
      [_add$](data) {
        T._check(data);
        this[_sendData](data);
      }
      [_addError](error, stackTrace) {
        this[_sendError](error, stackTrace);
      }
      [_close$]() {
        dart.assert(this[_isAddingStream]);
        let addState = this[_addStreamState];
        this[_addStreamState] = null;
        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
        addState.complete();
      }
      [_forEachListener](action) {
        if (dart.test(this[_isFiring])) {
          dart.throw(new core.StateError("Cannot fire new event. Controller is already firing an event"));
        }
        if (dart.test(this[_isEmpty])) return;
        let id = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
        this[_state] = (dart.notNull(this[_state]) ^ (async._BroadcastStreamController._STATE_EVENT_ID | async._BroadcastStreamController._STATE_FIRING)) >>> 0;
        let subscription = this[_firstSubscription];
        while (subscription != null) {
          if (dart.test(subscription[_expectsEvent](id))) {
            subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
            action(subscription);
            subscription[_toggleEventId]();
            let next = subscription[_next$];
            if (dart.test(subscription[_removeAfterFiring])) {
              this[_removeListener](subscription);
            }
            subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
            subscription = next;
          } else {
            subscription = subscription[_next$];
          }
        }
        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
        if (dart.test(this[_isEmpty])) {
          this[_callOnCancel]();
        }
      }
      [_callOnCancel]() {
        dart.assert(this[_isEmpty]);
        if (dart.test(this.isClosed) && dart.test(this[_doneFuture][_mayComplete])) {
          this[_doneFuture][_asyncComplete](null);
        }
        async._runGuarded(this.onCancel);
      }
    }
    dart.addTypeTests(_BroadcastStreamController);
    _BroadcastStreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
    dart.setSignature(_BroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStreamController$(T), [async.ControllerCallback, async.ControllerCancelCallback])}),
      fields: () => ({
        onListen: async.ControllerCallback,
        onCancel: async.ControllerCancelCallback,
        [_state]: core.int,
        [_firstSubscription]: _BroadcastSubscriptionOfT(),
        [_lastSubscription]: _BroadcastSubscriptionOfT(),
        [_addStreamState]: _AddStreamStateOfT(),
        [_doneFuture]: async._Future
      }),
      getters: () => ({
        onPause: dart.definiteFunctionType(async.ControllerCallback, []),
        onResume: dart.definiteFunctionType(async.ControllerCallback, []),
        stream: dart.definiteFunctionType(async.Stream$(T), []),
        sink: dart.definiteFunctionType(async.StreamSink$(T), []),
        isClosed: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, []),
        hasListener: dart.definiteFunctionType(core.bool, []),
        [_hasOneListener]: dart.definiteFunctionType(core.bool, []),
        [_isFiring]: dart.definiteFunctionType(core.bool, []),
        [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
        [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
        [_isEmpty]: dart.definiteFunctionType(core.bool, []),
        done: dart.definiteFunctionType(async.Future, [])
      }),
      setters: () => ({
        onPause: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        onResume: dart.definiteFunctionType(dart.void, [VoidTovoid()])
      }),
      methods: () => ({
        [_ensureDoneFuture]: dart.definiteFunctionType(async._Future, []),
        [_addListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
        [_removeListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
        [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_addEventError]: dart.definiteFunctionType(core.Error, []),
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(async.Future, []),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_close$]: dart.definiteFunctionType(dart.void, []),
        [_forEachListener]: dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfTTovoid()]),
        [_callOnCancel]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_INITIAL: core.int,
        _STATE_EVENT_ID: core.int,
        _STATE_FIRING: core.int,
        _STATE_CLOSED: core.int,
        _STATE_ADDSTREAM: core.int
      })
    });
    return _BroadcastStreamController;
  });
  async._BroadcastStreamController = _BroadcastStreamController();
  async._BroadcastStreamController._STATE_INITIAL = 0;
  async._BroadcastStreamController._STATE_EVENT_ID = 1;
  async._BroadcastStreamController._STATE_FIRING = 2;
  async._BroadcastStreamController._STATE_CLOSED = 4;
  async._BroadcastStreamController._STATE_ADDSTREAM = 8;
  async._SyncBroadcastStreamController$ = dart.generic(T => {
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
    class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
      new(onListen, onCancel) {
        super.new(onListen, onCancel);
      }
      get [_mayAddEvent]() {
        return dart.test(super[_mayAddEvent]) && !dart.test(this[_isFiring]);
      }
      [_addEventError]() {
        if (dart.test(this[_isFiring])) {
          return new core.StateError("Cannot fire new event. Controller is already firing an event");
        }
        return super[_addEventError]();
      }
      [_sendData](data) {
        T._check(data);
        if (dart.test(this[_isEmpty])) return;
        if (dart.test(this[_hasOneListener])) {
          this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
          let subscription = this[_firstSubscription];
          subscription[_add$](data);
          this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
          if (dart.test(this[_isEmpty])) {
            this[_callOnCancel]();
          }
          return;
        }
        this[_forEachListener](dart.fn(subscription => {
          subscription[_add$](data);
        }, _BufferingStreamSubscriptionOfTTovoid()));
      }
      [_sendError](error, stackTrace) {
        if (dart.test(this[_isEmpty])) return;
        this[_forEachListener](dart.fn(subscription => {
          subscription[_addError](error, stackTrace);
        }, _BufferingStreamSubscriptionOfTTovoid()));
      }
      [_sendDone]() {
        if (!dart.test(this[_isEmpty])) {
          this[_forEachListener](dart.fn(subscription => {
            subscription[_close$]();
          }, _BufferingStreamSubscriptionOfTTovoid()));
        } else {
          dart.assert(this[_doneFuture] != null);
          dart.assert(this[_doneFuture][_mayComplete]);
          this[_doneFuture][_asyncComplete](null);
        }
      }
    }
    _SyncBroadcastStreamController[dart.implements] = () => [SynchronousStreamControllerOfT()];
    dart.setSignature(_SyncBroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._SyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SyncBroadcastStreamController;
  });
  async._SyncBroadcastStreamController = _SyncBroadcastStreamController();
  let const$6;
  async._AsyncBroadcastStreamController$ = dart.generic(T => {
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
      new(onListen, onCancel) {
        super.new(onListen, onCancel);
      }
      [_sendData](data) {
        T._check(data);
        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
          subscription[_addPending](new (_DelayedDataOfT())(data));
        }
      }
      [_sendError](error, stackTrace) {
        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
          subscription[_addPending](new async._DelayedError(error, stackTrace));
        }
      }
      [_sendDone]() {
        if (!dart.test(this[_isEmpty])) {
          for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
            subscription[_addPending](const$6 || (const$6 = dart.const(new async._DelayedDone())));
          }
        } else {
          dart.assert(this[_doneFuture] != null);
          dart.assert(this[_doneFuture][_mayComplete]);
          this[_doneFuture][_asyncComplete](null);
        }
      }
    }
    dart.setSignature(_AsyncBroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._AsyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _AsyncBroadcastStreamController;
  });
  async._AsyncBroadcastStreamController = _AsyncBroadcastStreamController();
  const _addPendingEvent = Symbol('_addPendingEvent');
  let const$7;
  async._AsBroadcastStreamController$ = dart.generic(T => {
    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _AsBroadcastStreamController extends async._SyncBroadcastStreamController$(T) {
      new(onListen, onCancel) {
        this[_pending] = null;
        super.new(onListen, onCancel);
      }
      get [_hasPending]() {
        return this[_pending] != null && !dart.test(this[_pending].isEmpty);
      }
      [_addPendingEvent](event) {
        if (this[_pending] == null) {
          this[_pending] = new (_StreamImplEventsOfT())();
        }
        this[_pending].add(event);
      }
      add(data) {
        T._check(data);
        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
          this[_addPendingEvent](new (_DelayedDataOfT())(data));
          return;
        }
        super.add(data);
        while (dart.test(this[_hasPending])) {
          this[_pending].handleNext(this);
        }
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
          this[_addPendingEvent](new async._DelayedError(error, stackTrace));
          return;
        }
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_sendError](error, stackTrace);
        while (dart.test(this[_hasPending])) {
          this[_pending].handleNext(this);
        }
      }
      close() {
        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
          this[_addPendingEvent](const$7 || (const$7 = dart.const(new async._DelayedDone())));
          this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
          return super.done;
        }
        let result = super.close();
        dart.assert(!dart.test(this[_hasPending]));
        return result;
      }
      [_callOnCancel]() {
        if (dart.test(this[_hasPending])) {
          this[_pending].clear();
          this[_pending] = null;
        }
        super[_callOnCancel]();
      }
    }
    _AsBroadcastStreamController[dart.implements] = () => [_EventDispatchOfT()];
    dart.setSignature(_AsBroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
      fields: () => ({[_pending]: _StreamImplEventsOfT()}),
      getters: () => ({[_hasPending]: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        [_addPendingEvent]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
        add: dart.definiteFunctionType(dart.void, [T])
      })
    });
    return _AsBroadcastStreamController;
  });
  async._AsBroadcastStreamController = _AsBroadcastStreamController();
  const _pauseCount = Symbol('_pauseCount');
  const _resume = Symbol('_resume');
  async._DoneSubscription$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _DoneSubscription extends core.Object {
      new() {
        this[_pauseCount] = 0;
      }
      onData(handleData) {}
      onError(handleError) {}
      onDone(handleDone) {}
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        if (resumeSignal != null) resumeSignal.then(dart.dynamic)(dart.bind(this, _resume));
        this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
      }
      resume() {
        this[_resume](null);
      }
      [_resume](_) {
        if (dart.notNull(this[_pauseCount]) > 0) {
          this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
        }
      }
      cancel() {
        return new async._Future.immediate(null);
      }
      get isPaused() {
        return dart.notNull(this[_pauseCount]) > 0;
      }
      asFuture(E) {
        return value => {
          if (value === void 0) value = null;
          return new (async._Future$(E))();
        };
      }
    }
    dart.addTypeTests(_DoneSubscription);
    _DoneSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
    dart.setSignature(_DoneSubscription, {
      fields: () => ({[_pauseCount]: core.int}),
      getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        [_resume]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
      })
    });
    return _DoneSubscription;
  });
  async._DoneSubscription = _DoneSubscription();
  async.DeferredLibrary = class DeferredLibrary extends core.Object {
    new(libraryName, opts) {
      let uri = opts && 'uri' in opts ? opts.uri : null;
      this.libraryName = libraryName;
      this.uri = uri;
    }
    load() {
      dart.throw('DeferredLibrary not supported. ' + 'please use the `import "lib.dart" deferred as lib` syntax.');
    }
  };
  dart.setSignature(async.DeferredLibrary, {
    constructors: () => ({new: dart.definiteFunctionType(async.DeferredLibrary, [core.String], {uri: core.String})}),
    fields: () => ({
      libraryName: core.String,
      uri: core.String
    }),
    methods: () => ({load: dart.definiteFunctionType(async.Future$(core.Null), [])})
  });
  const _s = Symbol('_s');
  async.DeferredLoadException = class DeferredLoadException extends core.Object {
    new(s) {
      this[_s] = s;
    }
    toString() {
      return dart.str`DeferredLoadException: '${this[_s]}'`;
    }
  };
  async.DeferredLoadException[dart.implements] = () => [core.Exception];
  dart.setSignature(async.DeferredLoadException, {
    constructors: () => ({new: dart.definiteFunctionType(async.DeferredLoadException, [core.String])}),
    fields: () => ({[_s]: core.String})
  });
  const _completeWithValue = Symbol('_completeWithValue');
  let const$8;
  async.Future$ = dart.flattenFutures(dart.generic(T => {
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
    class Future extends core.Object {
      static new(computation) {
        let result = new (_FutureOfT())();
        async.Timer.run(dart.fn(() => {
          try {
            result[_complete](computation());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(result, e, s);
          }

        }, VoidTovoid$()));
        return result;
      }
      static microtask(computation) {
        let result = new (_FutureOfT())();
        async.scheduleMicrotask(dart.fn(() => {
          try {
            result[_complete](computation());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(result, e, s);
          }

        }, VoidTovoid$()));
        return result;
      }
      static sync(computation) {
        try {
          let result = computation();
          return FutureOfT().value(result);
        } catch (error) {
          let stackTrace = dart.stackTrace(error);
          return FutureOfT().error(error, stackTrace);
        }

      }
      static value(value) {
        if (value === void 0) value = null;
        return new (_FutureOfT()).immediate(value);
      }
      static error(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        error = async._nonNullError(error);
        if (!core.identical(async.Zone.current, async._ROOT_ZONE)) {
          let replacement = async.Zone.current.errorCallback(error, stackTrace);
          if (replacement != null) {
            error = async._nonNullError(replacement.error);
            stackTrace = replacement.stackTrace;
          }
        }
        return new (_FutureOfT()).immediateError(error, stackTrace);
      }
      static delayed(duration, computation) {
        if (computation === void 0) computation = null;
        let result = new (_FutureOfT())();
        async.Timer.new(duration, dart.fn(() => {
          try {
            result[_complete](computation == null ? null : computation());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(result, e, s);
          }

        }, VoidTovoid$()));
        return result;
      }
      static wait(T) {
        return (futures, opts) => {
          let eagerError = opts && 'eagerError' in opts ? opts.eagerError : false;
          let cleanUp = opts && 'cleanUp' in opts ? opts.cleanUp : null;
          let result = new (async._Future$(core.List$(T)))();
          let values = null;
          let remaining = 0;
          let error = null;
          let stackTrace = null;
          function handleError(theError, theStackTrace) {
            remaining--;
            if (values != null) {
              if (cleanUp != null) {
                for (let value of values) {
                  if (value != null) {
                    async.Future.sync(dart.fn(() => {
                      cleanUp(value);
                    }, VoidTodynamic$()));
                  }
                }
              }
              values = null;
              if (remaining == 0 || dart.test(eagerError)) {
                result[_completeError](theError, core.StackTrace._check(theStackTrace));
              } else {
                error = theError;
                stackTrace = core.StackTrace._check(theStackTrace);
              }
            } else if (remaining == 0 && !dart.test(eagerError)) {
              result[_completeError](error, stackTrace);
            }
          }
          dart.fn(handleError, dynamicAnddynamicTovoid$());
          for (let future of futures) {
            let pos = remaining++;
            future.then(dart.dynamic)(dart.fn(value => {
              remaining--;
              if (values != null) {
                values[dartx._set](pos, value);
                if (remaining == 0) {
                  result[_completeWithValue](values);
                }
              } else {
                if (cleanUp != null && value != null) {
                  async.Future.sync(dart.fn(() => {
                    cleanUp(value);
                  }, VoidTodynamic$()));
                }
                if (remaining == 0 && !dart.test(eagerError)) {
                  result[_completeError](error, stackTrace);
                }
              }
            }, dart.definiteFunctionType(dart.dynamic, [T])), {onError: handleError});
          }
          if (remaining == 0) {
            return async.Future$(core.List$(T)).value(const$8 || (const$8 = dart.constList([], dart.dynamic)));
          }
          values = core.List$(T).new(remaining);
          return result;
        };
      }
      static any(T) {
        return futures => {
          let completer = async.Completer$(T).sync();
          let onValue = dart.fn(value => {
            if (!dart.test(completer.isCompleted)) completer.complete(value);
          }, dart.definiteFunctionType(dart.dynamic, [T]));
          let onError = dart.fn((error, stack) => {
            if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
          }, dynamicAnddynamicTodynamic$());
          for (let future of futures) {
            future.then(dart.dynamic)(onValue, {onError: onError});
          }
          return completer.future;
        };
      }
      static forEach(input, f) {
        let iterator = input[dartx.iterator];
        return async.Future.doWhile(dart.fn(() => {
          if (!dart.test(iterator.moveNext())) return false;
          return async.Future.sync(dart.fn(() => dart.dcall(f, iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
        }, VoidToObject$()));
      }
      static doWhile(f) {
        let doneSignal = new async._Future();
        let nextIteration = null;
        nextIteration = async.Zone.current.bindUnaryCallback(dart.dynamic, core.bool)(dart.fn(keepGoing => {
          if (dart.test(keepGoing)) {
            async.Future.sync(f).then(dart.dynamic)(dynamicTodynamic()._check(nextIteration), {onError: dart.bind(doneSignal, _completeError)});
          } else {
            doneSignal[_complete](null);
          }
        }, boolTodynamic()), {runGuarded: true});
        dart.dcall(nextIteration, true);
        return doneSignal;
      }
    }
    dart.addTypeTests(Future);
    dart.setSignature(Future, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        microtask: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        sync: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        value: dart.definiteFunctionType(async.Future$(T), [], [dart.dynamic]),
        error: dart.definiteFunctionType(async.Future$(T), [core.Object], [core.StackTrace]),
        delayed: dart.definiteFunctionType(async.Future$(T), [core.Duration], [VoidTodynamic()])
      }),
      sfields: () => ({_nullFuture: async._Future}),
      statics: () => ({
        wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
        any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
        forEach: dart.definiteFunctionType(async.Future, [core.Iterable, dynamicTodynamic()]),
        doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
      }),
      names: ['wait', 'any', 'forEach', 'doWhile']
    });
    return Future;
  }));
  async.Future = Future();
  dart.defineLazy(async.Future, {
    get _nullFuture() {
      return async._Future._check(async.Future.value(null));
    }
  });
  async.TimeoutException = class TimeoutException extends core.Object {
    new(message, duration) {
      if (duration === void 0) duration = null;
      this.message = message;
      this.duration = duration;
    }
    toString() {
      let result = "TimeoutException";
      if (this.duration != null) result = dart.str`TimeoutException after ${this.duration}`;
      if (this.message != null) result = dart.str`${result}: ${this.message}`;
      return result;
    }
  };
  async.TimeoutException[dart.implements] = () => [core.Exception];
  dart.setSignature(async.TimeoutException, {
    constructors: () => ({new: dart.definiteFunctionType(async.TimeoutException, [core.String], [core.Duration])}),
    fields: () => ({
      message: core.String,
      duration: core.Duration
    })
  });
  async.Completer$ = dart.generic(T => {
    let _AsyncCompleterOfT = () => (_AsyncCompleterOfT = dart.constFn(async._AsyncCompleter$(T)))();
    let _SyncCompleterOfT = () => (_SyncCompleterOfT = dart.constFn(async._SyncCompleter$(T)))();
    class Completer extends core.Object {
      static new() {
        return new (_AsyncCompleterOfT())();
      }
      static sync() {
        return new (_SyncCompleterOfT())();
      }
    }
    dart.addTypeTests(Completer);
    dart.setSignature(Completer, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.Completer$(T), []),
        sync: dart.definiteFunctionType(async.Completer$(T), [])
      })
    });
    return Completer;
  });
  async.Completer = Completer();
  async._completeWithErrorCallback = function(result, error, stackTrace) {
    let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
    if (replacement != null) {
      error = async._nonNullError(replacement.error);
      stackTrace = replacement.stackTrace;
    }
    result[_completeError](error, core.StackTrace._check(stackTrace));
  };
  dart.lazyFn(async._completeWithErrorCallback, () => _FutureAnddynamicAnddynamicTovoid());
  async._nonNullError = function(error) {
    return error != null ? error : new core.NullThrownError();
  };
  dart.fn(async._nonNullError, ObjectToObject());
  async._FutureOnValue$ = dart.generic((S, T) => {
    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
    return _FutureOnValue;
  });
  async._FutureOnValue = _FutureOnValue();
  async._FutureErrorTest = dart.typedef('_FutureErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
  async._FutureAction = dart.typedef('_FutureAction', () => dart.functionType(dart.dynamic, []));
  async._Completer$ = dart.generic(T => {
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let CompleterOfT = () => (CompleterOfT = dart.constFn(async.Completer$(T)))();
    class _Completer extends core.Object {
      new() {
        this.future = new (_FutureOfT())();
      }
      completeError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        error = async._nonNullError(error);
        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
        this[_completeError](error, stackTrace);
      }
      get isCompleted() {
        return !dart.test(this.future[_mayComplete]);
      }
    }
    dart.addTypeTests(_Completer);
    _Completer[dart.implements] = () => [CompleterOfT()];
    dart.setSignature(_Completer, {
      fields: () => ({future: _FutureOfT()}),
      getters: () => ({isCompleted: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({completeError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
    });
    return _Completer;
  });
  async._Completer = _Completer();
  const _asyncCompleteError = Symbol('_asyncCompleteError');
  async._AsyncCompleter$ = dart.generic(T => {
    class _AsyncCompleter extends async._Completer$(T) {
      new() {
        super.new();
      }
      complete(value) {
        if (value === void 0) value = null;
        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
        this.future[_asyncComplete](value);
      }
      [_completeError](error, stackTrace) {
        this.future[_asyncCompleteError](error, stackTrace);
      }
    }
    dart.setSignature(_AsyncCompleter, {
      methods: () => ({
        complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
        [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
      })
    });
    return _AsyncCompleter;
  });
  async._AsyncCompleter = _AsyncCompleter();
  async._SyncCompleter$ = dart.generic(T => {
    class _SyncCompleter extends async._Completer$(T) {
      new() {
        super.new();
      }
      complete(value) {
        if (value === void 0) value = null;
        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
        this.future[_complete](value);
      }
      [_completeError](error, stackTrace) {
        this.future[_completeError](error, stackTrace);
      }
    }
    dart.setSignature(_SyncCompleter, {
      methods: () => ({
        complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
        [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
      })
    });
    return _SyncCompleter;
  });
  async._SyncCompleter = _SyncCompleter();
  const _nextListener = Symbol('_nextListener');
  const _onValue = Symbol('_onValue');
  const _errorTest = Symbol('_errorTest');
  const _whenCompleteAction = Symbol('_whenCompleteAction');
  async._FutureListener$ = dart.generic((S, T) => {
    let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    class _FutureListener extends core.Object {
      then(result, onValue, errorCallback) {
        this.result = result;
        this.callback = onValue;
        this.errorCallback = errorCallback;
        this.state = errorCallback == null ? async._FutureListener.STATE_THEN : async._FutureListener.STATE_THEN_ONERROR;
        this[_nextListener] = null;
      }
      catchError(result, errorCallback, test) {
        this.result = result;
        this.errorCallback = errorCallback;
        this.callback = test;
        this.state = test == null ? async._FutureListener.STATE_CATCHERROR : async._FutureListener.STATE_CATCHERROR_TEST;
        this[_nextListener] = null;
      }
      whenComplete(result, onComplete) {
        this.result = result;
        this.callback = onComplete;
        this.errorCallback = null;
        this.state = async._FutureListener.STATE_WHENCOMPLETE;
        this[_nextListener] = null;
      }
      get [_zone]() {
        return this.result[_zone];
      }
      get handlesValue() {
        return (dart.notNull(this.state) & async._FutureListener.MASK_VALUE) != 0;
      }
      get handlesError() {
        return (dart.notNull(this.state) & async._FutureListener.MASK_ERROR) != 0;
      }
      get hasErrorTest() {
        return this.state == async._FutureListener.STATE_CATCHERROR_TEST;
      }
      get handlesComplete() {
        return this.state == async._FutureListener.STATE_WHENCOMPLETE;
      }
      get [_onValue]() {
        dart.assert(this.handlesValue);
        return _FutureOnValueOfS$T().as(this.callback);
      }
      get [_onError]() {
        return this.errorCallback;
      }
      get [_errorTest]() {
        dart.assert(this.hasErrorTest);
        return async._FutureErrorTest.as(this.callback);
      }
      get [_whenCompleteAction]() {
        dart.assert(this.handlesComplete);
        return async._FutureAction.as(this.callback);
      }
      get hasErrorCallback() {
        dart.assert(this.handlesError);
        return this[_onError] != null;
      }
      handleValue(sourceResult) {
        S._check(sourceResult);
        return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
      }
      matchesErrorTest(asyncError) {
        if (!dart.test(this.hasErrorTest)) return true;
        let test = this[_errorTest];
        return this[_zone].runUnary(core.bool, dart.dynamic)(this[_errorTest], asyncError.error);
      }
      handleError(asyncError) {
        dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
        if (async.ZoneBinaryCallback.is(this.errorCallback)) {
          let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
          return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
        } else {
          return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
        }
      }
      handleWhenComplete() {
        dart.assert(!dart.test(this.handlesError));
        return this[_zone].run(dart.dynamic)(this[_whenCompleteAction]);
      }
    }
    dart.addTypeTests(_FutureListener);
    dart.defineNamedConstructor(_FutureListener, 'then');
    dart.defineNamedConstructor(_FutureListener, 'catchError');
    dart.defineNamedConstructor(_FutureListener, 'whenComplete');
    dart.setSignature(_FutureListener, {
      constructors: () => ({
        then: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), _FutureOnValueOfS$T(), core.Function]),
        catchError: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), core.Function, async._FutureErrorTest]),
        whenComplete: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), async._FutureAction])
      }),
      fields: () => ({
        [_nextListener]: async._FutureListener,
        result: _FutureOfT(),
        state: core.int,
        callback: core.Function,
        errorCallback: core.Function
      }),
      getters: () => ({
        [_zone]: dart.definiteFunctionType(async.Zone, []),
        handlesValue: dart.definiteFunctionType(core.bool, []),
        handlesError: dart.definiteFunctionType(core.bool, []),
        hasErrorTest: dart.definiteFunctionType(core.bool, []),
        handlesComplete: dart.definiteFunctionType(core.bool, []),
        [_onValue]: dart.definiteFunctionType(async._FutureOnValue$(S, T), []),
        [_onError]: dart.definiteFunctionType(core.Function, []),
        [_errorTest]: dart.definiteFunctionType(async._FutureErrorTest, []),
        [_whenCompleteAction]: dart.definiteFunctionType(async._FutureAction, []),
        hasErrorCallback: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
        matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
        handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
        handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
      }),
      sfields: () => ({
        MASK_VALUE: core.int,
        MASK_ERROR: core.int,
        MASK_TEST_ERROR: core.int,
        MASK_WHENCOMPLETE: core.int,
        STATE_CHAIN: core.int,
        STATE_THEN: core.int,
        STATE_THEN_ONERROR: core.int,
        STATE_CATCHERROR: core.int,
        STATE_CATCHERROR_TEST: core.int,
        STATE_WHENCOMPLETE: core.int
      })
    });
    return _FutureListener;
  });
  async._FutureListener = _FutureListener();
  async._FutureListener.MASK_VALUE = 1;
  async._FutureListener.MASK_ERROR = 2;
  async._FutureListener.MASK_TEST_ERROR = 4;
  async._FutureListener.MASK_WHENCOMPLETE = 8;
  async._FutureListener.STATE_CHAIN = 0;
  async._FutureListener.STATE_THEN_ONERROR = 3;
  async._FutureListener.STATE_CATCHERROR_TEST = 6;
  dart.defineLazy(async._FutureListener, {
    get STATE_THEN() {
      return async._FutureListener.MASK_VALUE;
    },
    get STATE_CATCHERROR() {
      return async._FutureListener.MASK_ERROR;
    },
    get STATE_WHENCOMPLETE() {
      return async._FutureListener.MASK_WHENCOMPLETE;
    }
  });
  const _resultOrListeners = Symbol('_resultOrListeners');
  const _isPendingComplete = Symbol('_isPendingComplete');
  const _mayAddListener = Symbol('_mayAddListener');
  const _isChained = Symbol('_isChained');
  const _isComplete = Symbol('_isComplete');
  const _hasError = Symbol('_hasError');
  const _setChained = Symbol('_setChained');
  const _thenNoZoneRegistration = Symbol('_thenNoZoneRegistration');
  const _setPendingComplete = Symbol('_setPendingComplete');
  const _error = Symbol('_error');
  const _chainSource = Symbol('_chainSource');
  const _setValue = Symbol('_setValue');
  const _setErrorObject = Symbol('_setErrorObject');
  const _setError = Symbol('_setError');
  const _cloneResult = Symbol('_cloneResult');
  const _prependListeners = Symbol('_prependListeners');
  const _reverseListeners = Symbol('_reverseListeners');
  const _removeListeners = Symbol('_removeListeners');
  async._Future$ = dart.flattenFutures(dart.generic(T => {
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let _FutureListenerOfT$T = () => (_FutureListenerOfT$T = dart.constFn(async._FutureListener$(T, T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
    class _Future extends core.Object {
      new() {
        this[_zone] = async.Zone.current;
        this[_state] = async._Future._INCOMPLETE;
        this[_resultOrListeners] = null;
      }
      immediate(value) {
        this[_zone] = async.Zone.current;
        this[_state] = async._Future._INCOMPLETE;
        this[_resultOrListeners] = null;
        this[_asyncComplete](value);
      }
      immediateError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_zone] = async.Zone.current;
        this[_state] = async._Future._INCOMPLETE;
        this[_resultOrListeners] = null;
        this[_asyncCompleteError](error, stackTrace);
      }
      get [_mayComplete]() {
        return this[_state] == async._Future._INCOMPLETE;
      }
      get [_isPendingComplete]() {
        return this[_state] == async._Future._PENDING_COMPLETE;
      }
      get [_mayAddListener]() {
        return dart.notNull(this[_state]) <= async._Future._PENDING_COMPLETE;
      }
      get [_isChained]() {
        return this[_state] == async._Future._CHAINED;
      }
      get [_isComplete]() {
        return dart.notNull(this[_state]) >= async._Future._VALUE;
      }
      get [_hasError]() {
        return this[_state] == async._Future._ERROR;
      }
      [_setChained](source) {
        dart.assert(this[_mayAddListener]);
        this[_state] = async._Future._CHAINED;
        this[_resultOrListeners] = source;
      }
      then(E) {
        return (f, opts) => {
          let onError = opts && 'onError' in opts ? opts.onError : null;
          let currentZone = async.Zone.current;
          let registered = null;
          if (!core.identical(currentZone, async._ROOT_ZONE)) {
            f = currentZone.registerUnaryCallback(dart.dynamic, T)(f);
            if (onError != null) {
              onError = async._registerErrorHandler(T)(onError, currentZone);
            }
          }
          return this[_thenNoZoneRegistration](E)(f, onError);
        };
      }
      [_thenNoZoneRegistration](E) {
        return (f, onError) => {
          let result = new (async._Future$(E))();
          this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
          return result;
        };
      }
      catchError(onError, opts) {
        let test = opts && 'test' in opts ? opts.test : null;
        let result = new (_FutureOfT())();
        if (!core.identical(result[_zone], async._ROOT_ZONE)) {
          onError = async._registerErrorHandler(T)(onError, result[_zone]);
          if (test != null) test = result[_zone].registerUnaryCallback(core.bool, dart.dynamic)(test);
        }
        this[_addListener](new (_FutureListenerOfT$T()).catchError(result, onError, test));
        return result;
      }
      whenComplete(action) {
        let result = new (_FutureOfT())();
        if (!core.identical(result[_zone], async._ROOT_ZONE)) {
          action = result[_zone].registerCallback(dart.dynamic)(action);
        }
        this[_addListener](new (_FutureListenerOfT$T()).whenComplete(result, action));
        return result;
      }
      asStream() {
        return StreamOfT().fromFuture(this);
      }
      [_setPendingComplete]() {
        dart.assert(this[_mayComplete]);
        this[_state] = async._Future._PENDING_COMPLETE;
      }
      get [_error]() {
        dart.assert(this[_hasError]);
        return async.AsyncError._check(this[_resultOrListeners]);
      }
      get [_chainSource]() {
        dart.assert(this[_isChained]);
        return async._Future._check(this[_resultOrListeners]);
      }
      [_setValue](value) {
        T._check(value);
        dart.assert(!dart.test(this[_isComplete]));
        this[_state] = async._Future._VALUE;
        this[_resultOrListeners] = value;
      }
      [_setErrorObject](error) {
        dart.assert(!dart.test(this[_isComplete]));
        this[_state] = async._Future._ERROR;
        this[_resultOrListeners] = error;
      }
      [_setError](error, stackTrace) {
        this[_setErrorObject](new async.AsyncError(error, stackTrace));
      }
      [_cloneResult](source) {
        dart.assert(!dart.test(this[_isComplete]));
        dart.assert(source[_isComplete]);
        this[_state] = source[_state];
        this[_resultOrListeners] = source[_resultOrListeners];
      }
      [_addListener](listener) {
        dart.assert(listener[_nextListener] == null);
        if (dart.test(this[_mayAddListener])) {
          listener[_nextListener] = async._FutureListener._check(this[_resultOrListeners]);
          this[_resultOrListeners] = listener;
        } else {
          if (dart.test(this[_isChained])) {
            let source = this[_chainSource];
            if (!dart.test(source[_isComplete])) {
              source[_addListener](listener);
              return;
            }
            this[_cloneResult](source);
          }
          dart.assert(this[_isComplete]);
          this[_zone].scheduleMicrotask(dart.fn(() => {
            async._Future._propagateToListeners(this, listener);
          }, VoidTovoid$()));
        }
      }
      [_prependListeners](listeners) {
        if (listeners == null) return;
        if (dart.test(this[_mayAddListener])) {
          let existingListeners = async._FutureListener._check(this[_resultOrListeners]);
          this[_resultOrListeners] = listeners;
          if (existingListeners != null) {
            let cursor = listeners;
            while (cursor[_nextListener] != null) {
              cursor = cursor[_nextListener];
            }
            cursor[_nextListener] = existingListeners;
          }
        } else {
          if (dart.test(this[_isChained])) {
            let source = this[_chainSource];
            if (!dart.test(source[_isComplete])) {
              source[_prependListeners](listeners);
              return;
            }
            this[_cloneResult](source);
          }
          dart.assert(this[_isComplete]);
          listeners = this[_reverseListeners](listeners);
          this[_zone].scheduleMicrotask(dart.fn(() => {
            async._Future._propagateToListeners(this, listeners);
          }, VoidTovoid$()));
        }
      }
      [_removeListeners]() {
        dart.assert(!dart.test(this[_isComplete]));
        let current = async._FutureListener._check(this[_resultOrListeners]);
        this[_resultOrListeners] = null;
        return this[_reverseListeners](current);
      }
      [_reverseListeners](listeners) {
        let prev = null;
        let current = listeners;
        while (current != null) {
          let next = current[_nextListener];
          current[_nextListener] = prev;
          prev = current;
          current = next;
        }
        return prev;
      }
      static _chainForeignFuture(source, target) {
        dart.assert(!dart.test(target[_isComplete]));
        dart.assert(!async._Future.is(source));
        target[_setPendingComplete]();
        try {
          source.then(dart.dynamic)(dart.fn(value => {
            dart.assert(target[_isPendingComplete]);
            target[_completeWithValue](value);
          }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
              if (stackTrace === void 0) stackTrace = null;
              dart.assert(target[_isPendingComplete]);
              target[_completeError](error, core.StackTrace._check(stackTrace));
            }, dynamic__Todynamic())});
        } catch (e) {
          let s = dart.stackTrace(e);
          async.scheduleMicrotask(dart.fn(() => {
            target[_completeError](e, s);
          }, VoidTovoid$()));
        }

      }
      static _chainCoreFuture(source, target) {
        dart.assert(target[_mayAddListener]);
        while (dart.test(source[_isChained])) {
          source = source[_chainSource];
        }
        if (dart.test(source[_isComplete])) {
          let listeners = target[_removeListeners]();
          target[_cloneResult](source);
          async._Future._propagateToListeners(target, listeners);
        } else {
          let listeners = async._FutureListener._check(target[_resultOrListeners]);
          target[_setChained](source);
          source[_prependListeners](listeners);
        }
      }
      [_complete](value) {
        dart.assert(!dart.test(this[_isComplete]));
        if (async.Future.is(value)) {
          if (async._Future.is(value)) {
            async._Future._chainCoreFuture(value, this);
          } else {
            async._Future._chainForeignFuture(value, this);
          }
        } else {
          let listeners = this[_removeListeners]();
          this[_setValue](T.as(value));
          async._Future._propagateToListeners(this, listeners);
        }
      }
      [_completeWithValue](value) {
        T._check(value);
        dart.assert(!dart.test(this[_isComplete]));
        dart.assert(!async.Future.is(value));
        let listeners = this[_removeListeners]();
        this[_setValue](value);
        async._Future._propagateToListeners(this, listeners);
      }
      [_completeError](error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        dart.assert(!dart.test(this[_isComplete]));
        let listeners = this[_removeListeners]();
        this[_setError](error, stackTrace);
        async._Future._propagateToListeners(this, listeners);
      }
      [_asyncComplete](value) {
        dart.assert(!dart.test(this[_isComplete]));
        if (async.Future.is(value)) {
          let typedFuture = FutureOfT().as(value);
          if (async._Future.is(typedFuture)) {
            let coreFuture = _FutureOfT()._check(typedFuture);
            if (dart.test(coreFuture[_hasError])) {
              this[_setPendingComplete]();
              this[_zone].scheduleMicrotask(dart.fn(() => {
                async._Future._chainCoreFuture(coreFuture, this);
              }, VoidTovoid$()));
            } else {
              async._Future._chainCoreFuture(coreFuture, this);
            }
          } else {
            async._Future._chainForeignFuture(typedFuture, this);
          }
          return;
        }
        let typedValue = T.as(value);
        this[_setPendingComplete]();
        this[_zone].scheduleMicrotask(dart.fn(() => {
          this[_completeWithValue](typedValue);
        }, VoidTovoid$()));
      }
      [_asyncCompleteError](error, stackTrace) {
        dart.assert(!dart.test(this[_isComplete]));
        this[_setPendingComplete]();
        this[_zone].scheduleMicrotask(dart.fn(() => {
          this[_completeError](error, stackTrace);
        }, VoidTovoid$()));
      }
      static _propagateToListeners(source, listeners) {
        while (true) {
          dart.assert(source[_isComplete]);
          let hasError = source[_hasError];
          if (listeners == null) {
            if (dart.test(hasError)) {
              let asyncError = source[_error];
              source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
            }
            return;
          }
          while (listeners[_nextListener] != null) {
            let listener = listeners;
            listeners = listener[_nextListener];
            listener[_nextListener] = null;
            async._Future._propagateToListeners(source, listener);
          }
          let listener = listeners;
          let sourceResult = source[_resultOrListeners];
          let listenerHasError = hasError;
          let listenerValueOrError = sourceResult;
          if (dart.test(hasError) || dart.test(listener.handlesValue) || dart.test(listener.handlesComplete)) {
            let zone = listener[_zone];
            if (dart.test(hasError) && !dart.test(source[_zone].inSameErrorZone(zone))) {
              let asyncError = source[_error];
              source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
              return;
            }
            let oldZone = null;
            if (!core.identical(async.Zone.current, zone)) {
              oldZone = async.Zone._enter(zone);
            }
            function handleWhenCompleteCallback() {
              dart.assert(!dart.test(listener.handlesValue));
              dart.assert(!dart.test(listener.handlesError));
              let completeResult = null;
              try {
                completeResult = listener.handleWhenComplete();
              } catch (e) {
                let s = dart.stackTrace(e);
                if (dart.test(hasError) && core.identical(source[_error].error, e)) {
                  listenerValueOrError = source[_error];
                } else {
                  listenerValueOrError = new async.AsyncError(e, s);
                }
                listenerHasError = true;
                return;
              }

              if (async.Future.is(completeResult)) {
                if (async._Future.is(completeResult) && dart.test(completeResult[_isComplete])) {
                  if (dart.test(completeResult[_hasError])) {
                    listenerValueOrError = completeResult[_error];
                    listenerHasError = true;
                  }
                  return;
                }
                let originalSource = source;
                listenerValueOrError = completeResult.then(dart.dynamic)(dart.fn(_ => originalSource, dynamicTo_Future()));
                listenerHasError = false;
              }
            }
            dart.fn(handleWhenCompleteCallback, VoidTovoid$());
            function handleValueCallback() {
              try {
                listenerValueOrError = listener.handleValue(sourceResult);
              } catch (e) {
                let s = dart.stackTrace(e);
                listenerValueOrError = new async.AsyncError(e, s);
                listenerHasError = true;
              }

            }
            dart.fn(handleValueCallback, VoidTovoid$());
            function handleError() {
              try {
                let asyncError = source[_error];
                if (dart.test(listener.matchesErrorTest(asyncError)) && dart.test(listener.hasErrorCallback)) {
                  listenerValueOrError = listener.handleError(asyncError);
                  listenerHasError = false;
                }
              } catch (e) {
                let s = dart.stackTrace(e);
                if (core.identical(source[_error].error, e)) {
                  listenerValueOrError = source[_error];
                } else {
                  listenerValueOrError = new async.AsyncError(e, s);
                }
                listenerHasError = true;
              }

            }
            dart.fn(handleError, VoidTovoid$());
            if (dart.test(listener.handlesComplete)) {
              handleWhenCompleteCallback();
            } else if (!dart.test(hasError)) {
              if (dart.test(listener.handlesValue)) {
                handleValueCallback();
              }
            } else {
              if (dart.test(listener.handlesError)) {
                handleError();
              }
            }
            if (oldZone != null) async.Zone._leave(oldZone);
            if (async.Future.is(listenerValueOrError)) {
              let chainSource = async.Future._check(listenerValueOrError);
              let result = listener.result;
              if (async._Future.is(chainSource)) {
                if (dart.test(chainSource[_isComplete])) {
                  listeners = result[_removeListeners]();
                  result[_cloneResult](chainSource);
                  source = chainSource;
                  continue;
                } else {
                  async._Future._chainCoreFuture(chainSource, result);
                }
              } else {
                async._Future._chainForeignFuture(chainSource, result);
              }
              return;
            }
          }
          let result = listener.result;
          listeners = result[_removeListeners]();
          if (!dart.test(listenerHasError)) {
            result[_setValue](listenerValueOrError);
          } else {
            let asyncError = async.AsyncError._check(listenerValueOrError);
            result[_setErrorObject](asyncError);
          }
          source = result;
        }
      }
      timeout(timeLimit, opts) {
        let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
        if (dart.test(this[_isComplete])) return new (_FutureOfT()).immediate(this);
        let result = new (_FutureOfT())();
        let timer = null;
        if (onTimeout == null) {
          timer = async.Timer.new(timeLimit, dart.fn(() => {
            result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
          }, VoidTovoid$()));
        } else {
          let zone = async.Zone.current;
          onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
          timer = async.Timer.new(timeLimit, dart.fn(() => {
            try {
              result[_complete](zone.run(dart.dynamic)(onTimeout));
            } catch (e) {
              let s = dart.stackTrace(e);
              result[_completeError](e, s);
            }

          }, VoidTovoid$()));
        }
        this.then(dart.dynamic)(dart.fn(v => {
          if (dart.test(timer.isActive)) {
            timer.cancel();
            result[_completeWithValue](v);
          }
        }, TTodynamic$()), {onError: dart.fn((e, s) => {
            if (dart.test(timer.isActive)) {
              timer.cancel();
              result[_completeError](e, core.StackTrace._check(s));
            }
          }, dynamicAnddynamicTodynamic$())});
        return result;
      }
    }
    dart.addTypeTests(_Future);
    dart.defineNamedConstructor(_Future, 'immediate');
    dart.defineNamedConstructor(_Future, 'immediateError');
    _Future[dart.implements] = () => [FutureOfT()];
    dart.setSignature(_Future, {
      constructors: () => ({
        new: dart.definiteFunctionType(async._Future$(T), []),
        immediate: dart.definiteFunctionType(async._Future$(T), [dart.dynamic]),
        immediateError: dart.definiteFunctionType(async._Future$(T), [dart.dynamic], [core.StackTrace])
      }),
      fields: () => ({
        [_state]: core.int,
        [_zone]: async.Zone,
        [_resultOrListeners]: dart.dynamic
      }),
      getters: () => ({
        [_mayComplete]: dart.definiteFunctionType(core.bool, []),
        [_isPendingComplete]: dart.definiteFunctionType(core.bool, []),
        [_mayAddListener]: dart.definiteFunctionType(core.bool, []),
        [_isChained]: dart.definiteFunctionType(core.bool, []),
        [_isComplete]: dart.definiteFunctionType(core.bool, []),
        [_hasError]: dart.definiteFunctionType(core.bool, []),
        [_error]: dart.definiteFunctionType(async.AsyncError, []),
        [_chainSource]: dart.definiteFunctionType(async._Future, [])
      }),
      methods: () => ({
        [_setChained]: dart.definiteFunctionType(dart.void, [async._Future]),
        then: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic()], {onError: core.Function}]),
        [_thenNoZoneRegistration]: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic(), core.Function]]),
        catchError: dart.definiteFunctionType(async.Future$(T), [core.Function], {test: dynamicTobool()}),
        whenComplete: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        asStream: dart.definiteFunctionType(async.Stream$(T), []),
        [_setPendingComplete]: dart.definiteFunctionType(dart.void, []),
        [_setValue]: dart.definiteFunctionType(dart.void, [T]),
        [_setErrorObject]: dart.definiteFunctionType(dart.void, [async.AsyncError]),
        [_setError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_cloneResult]: dart.definiteFunctionType(dart.void, [async._Future]),
        [_addListener]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
        [_prependListeners]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
        [_removeListeners]: dart.definiteFunctionType(async._FutureListener, []),
        [_reverseListeners]: dart.definiteFunctionType(async._FutureListener, [async._FutureListener]),
        [_complete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        [_completeWithValue]: dart.definiteFunctionType(dart.void, [T]),
        [_completeError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        [_asyncComplete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        [_asyncCompleteError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
        timeout: dart.definiteFunctionType(async.Future$(T), [core.Duration], {onTimeout: VoidTodynamic()})
      }),
      sfields: () => ({
        _INCOMPLETE: core.int,
        _PENDING_COMPLETE: core.int,
        _CHAINED: core.int,
        _VALUE: core.int,
        _ERROR: core.int
      }),
      statics: () => ({
        _chainForeignFuture: dart.definiteFunctionType(dart.void, [async.Future, async._Future]),
        _chainCoreFuture: dart.definiteFunctionType(dart.void, [async._Future, async._Future]),
        _propagateToListeners: dart.definiteFunctionType(dart.void, [async._Future, async._FutureListener])
      }),
      names: ['_chainForeignFuture', '_chainCoreFuture', '_propagateToListeners']
    });
    return _Future;
  }));
  async._Future = _Future();
  async._Future._INCOMPLETE = 0;
  async._Future._PENDING_COMPLETE = 1;
  async._Future._CHAINED = 2;
  async._Future._VALUE = 4;
  async._Future._ERROR = 8;
  async._AsyncCallback = dart.typedef('_AsyncCallback', () => dart.functionType(dart.void, []));
  async._AsyncCallbackEntry = class _AsyncCallbackEntry extends core.Object {
    new(callback) {
      this.callback = callback;
      this.next = null;
    }
  };
  dart.setSignature(async._AsyncCallbackEntry, {
    constructors: () => ({new: dart.definiteFunctionType(async._AsyncCallbackEntry, [async._AsyncCallback])}),
    fields: () => ({
      callback: async._AsyncCallback,
      next: async._AsyncCallbackEntry
    })
  });
  async._nextCallback = null;
  async._lastCallback = null;
  async._lastPriorityCallback = null;
  async._isInCallbackLoop = false;
  async._microtaskLoop = function() {
    while (async._nextCallback != null) {
      async._lastPriorityCallback = null;
      let entry = async._nextCallback;
      async._nextCallback = entry.next;
      if (async._nextCallback == null) async._lastCallback = null;
      entry.callback();
    }
  };
  dart.fn(async._microtaskLoop, VoidTovoid$());
  async._startMicrotaskLoop = function() {
    async._isInCallbackLoop = true;
    try {
      async._microtaskLoop();
    } finally {
      async._lastPriorityCallback = null;
      async._isInCallbackLoop = false;
      if (async._nextCallback != null) {
        async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
      }
    }
  };
  dart.fn(async._startMicrotaskLoop, VoidTovoid$());
  async._scheduleAsyncCallback = function(callback) {
    let newEntry = new async._AsyncCallbackEntry(callback);
    if (async._nextCallback == null) {
      async._nextCallback = async._lastCallback = newEntry;
      if (!dart.test(async._isInCallbackLoop)) {
        async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
      }
    } else {
      async._lastCallback.next = newEntry;
      async._lastCallback = newEntry;
    }
  };
  dart.fn(async._scheduleAsyncCallback, _AsyncCallbackTovoid());
  async._schedulePriorityAsyncCallback = function(callback) {
    if (async._nextCallback == null) {
      async._scheduleAsyncCallback(callback);
      async._lastPriorityCallback = async._lastCallback;
      return;
    }
    let entry = new async._AsyncCallbackEntry(callback);
    if (async._lastPriorityCallback == null) {
      entry.next = async._nextCallback;
      async._nextCallback = async._lastPriorityCallback = entry;
    } else {
      entry.next = async._lastPriorityCallback.next;
      async._lastPriorityCallback.next = entry;
      async._lastPriorityCallback = entry;
      if (entry.next == null) {
        async._lastCallback = entry;
      }
    }
  };
  dart.fn(async._schedulePriorityAsyncCallback, _AsyncCallbackTovoid());
  const _scheduleMicrotask = Symbol('_scheduleMicrotask');
  async.scheduleMicrotask = function(callback) {
    let currentZone = async._Zone._check(async.Zone.current);
    if (core.identical(async._ROOT_ZONE, currentZone)) {
      async._rootScheduleMicrotask(null, null, async._ROOT_ZONE, callback);
      return;
    }
    let implementation = currentZone[_scheduleMicrotask];
    if (core.identical(async._ROOT_ZONE, implementation.zone) && dart.test(async._ROOT_ZONE.inSameErrorZone(currentZone))) {
      async._rootScheduleMicrotask(null, null, currentZone, currentZone.registerCallback(dart.dynamic)(callback));
      return;
    }
    async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallback(dart.dynamic)(callback, {runGuarded: true}));
  };
  dart.fn(async.scheduleMicrotask, _AsyncCallbackTovoid());
  async._AsyncRun = class _AsyncRun extends core.Object {
    static _scheduleImmediate(callback) {
      async._AsyncRun._scheduleImmediateClosure(callback);
    }
    static _initializeScheduleImmediate() {
      if (_isolate_helper.global.scheduleImmediate != null) {
        return async._AsyncRun._scheduleImmediateJsOverride;
      }
      if (_isolate_helper.global.MutationObserver != null && _isolate_helper.global.document != null) {
        let div = _isolate_helper.global.document.createElement("div");
        let span = _isolate_helper.global.document.createElement("span");
        let storedCallback = null;
        function internalCallback(_) {
          _isolate_helper.leaveJsAsync();
          let f = storedCallback;
          storedCallback = null;
          f();
        }
        dart.fn(internalCallback, dynamicTodynamic$());
        ;
        let observer = new _isolate_helper.global.MutationObserver(internalCallback);
        observer.observe(div, {childList: true});
        return dart.fn(callback => {
          dart.assert(storedCallback == null);
          _isolate_helper.enterJsAsync();
          storedCallback = callback;
          div.firstChild ? div.removeChild(span) : div.appendChild(span);
        }, _AsyncCallbackTovoid());
      } else if (_isolate_helper.global.setImmediate != null) {
        return async._AsyncRun._scheduleImmediateWithSetImmediate;
      }
      return async._AsyncRun._scheduleImmediateWithTimer;
    }
    static _scheduleImmediateJsOverride(callback) {
      function internalCallback() {
        _isolate_helper.leaveJsAsync();
        callback();
      }
      dart.fn(internalCallback, VoidTodynamic$());
      ;
      _isolate_helper.enterJsAsync();
      _isolate_helper.global.scheduleImmediate(internalCallback);
    }
    static _scheduleImmediateWithSetImmediate(callback) {
      function internalCallback() {
        _isolate_helper.leaveJsAsync();
        callback();
      }
      dart.fn(internalCallback, VoidTodynamic$());
      ;
      _isolate_helper.enterJsAsync();
      _isolate_helper.global.setImmediate(internalCallback);
    }
    static _scheduleImmediateWithTimer(callback) {
      async.Timer._createTimer(core.Duration.ZERO, callback);
    }
  };
  dart.setSignature(async._AsyncRun, {
    sfields: () => ({_scheduleImmediateClosure: async._TakeCallback}),
    statics: () => ({
      _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _initializeScheduleImmediate: dart.definiteFunctionType(async._TakeCallback, []),
      _scheduleImmediateJsOverride: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _scheduleImmediateWithSetImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _scheduleImmediateWithTimer: dart.definiteFunctionType(dart.void, [VoidTovoid()])
    }),
    names: ['_scheduleImmediate', '_initializeScheduleImmediate', '_scheduleImmediateJsOverride', '_scheduleImmediateWithSetImmediate', '_scheduleImmediateWithTimer']
  });
  dart.defineLazy(async._AsyncRun, {
    get _scheduleImmediateClosure() {
      return async._AsyncRun._initializeScheduleImmediate();
    }
  });
  async._TimerCallback = dart.typedef('_TimerCallback', () => dart.functionType(dart.void, []));
  async.StreamSubscription$ = dart.generic(T => {
    class StreamSubscription extends core.Object {}
    dart.addTypeTests(StreamSubscription);
    return StreamSubscription;
  });
  async.StreamSubscription = StreamSubscription();
  async.EventSink$ = dart.generic(T => {
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    class EventSink extends core.Object {}
    dart.addTypeTests(EventSink);
    EventSink[dart.implements] = () => [SinkOfT()];
    return EventSink;
  });
  async.EventSink = EventSink();
  const _stream = Symbol('_stream');
  async.StreamView$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class StreamView extends async.Stream$(T) {
      new(stream) {
        this[_stream] = stream;
        super._internal();
      }
      get isBroadcast() {
        return this[_stream].isBroadcast;
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this[_stream].asBroadcastStream({onListen: onListen, onCancel: onCancel});
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
    }
    dart.setSignature(StreamView, {
      constructors: () => ({new: dart.definiteFunctionType(async.StreamView$(T), [StreamOfT()])}),
      fields: () => ({[_stream]: StreamOfT()}),
      methods: () => ({
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})
      })
    });
    return StreamView;
  });
  async.StreamView = StreamView();
  async.StreamConsumer$ = dart.generic(S => {
    class StreamConsumer extends core.Object {}
    dart.addTypeTests(StreamConsumer);
    return StreamConsumer;
  });
  async.StreamConsumer = StreamConsumer();
  async.StreamSink$ = dart.generic(S => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let StreamConsumerOfS = () => (StreamConsumerOfS = dart.constFn(async.StreamConsumer$(S)))();
    class StreamSink extends core.Object {}
    dart.addTypeTests(StreamSink);
    StreamSink[dart.implements] = () => [EventSinkOfS(), StreamConsumerOfS()];
    return StreamSink;
  });
  async.StreamSink = StreamSink();
  async.StreamTransformer$ = dart.generic((S, T) => {
    let _StreamSubscriptionTransformerOfS$T = () => (_StreamSubscriptionTransformerOfS$T = dart.constFn(async._StreamSubscriptionTransformer$(S, T)))();
    let _StreamHandlerTransformerOfS$T = () => (_StreamHandlerTransformerOfS$T = dart.constFn(async._StreamHandlerTransformer$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.functionType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
    let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
    class StreamTransformer extends core.Object {
      static new(transformer) {
        return new (_StreamSubscriptionTransformerOfS$T())(transformer);
      }
      static fromHandlers(opts) {
        return new (_StreamHandlerTransformerOfS$T())(opts);
      }
    }
    dart.addTypeTests(StreamTransformer);
    dart.setSignature(StreamTransformer, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.StreamTransformer$(S, T), [StreamOfSAndboolToStreamSubscriptionOfT()]),
        fromHandlers: dart.definiteFunctionType(async.StreamTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})
      })
    });
    return StreamTransformer;
  });
  async.StreamTransformer = StreamTransformer();
  async.StreamIterator$ = dart.generic(T => {
    let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class StreamIterator extends core.Object {
      static new(stream) {
        return new (_StreamIteratorImplOfT())(stream);
      }
    }
    dart.addTypeTests(StreamIterator);
    dart.setSignature(StreamIterator, {
      constructors: () => ({new: dart.definiteFunctionType(async.StreamIterator$(T), [StreamOfT()])})
    });
    return StreamIterator;
  });
  async.StreamIterator = StreamIterator();
  async._ControllerEventSinkWrapper$ = dart.generic(T => {
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _ControllerEventSinkWrapper extends core.Object {
      new(sink) {
        this[_sink] = sink;
      }
      add(data) {
        T._check(data);
        this[_sink].add(data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_sink].addError(error, stackTrace);
      }
      close() {
        this[_sink].close();
      }
    }
    dart.addTypeTests(_ControllerEventSinkWrapper);
    _ControllerEventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
    dart.setSignature(_ControllerEventSinkWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._ControllerEventSinkWrapper$(T), [async.EventSink])}),
      fields: () => ({[_sink]: async.EventSink}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _ControllerEventSinkWrapper;
  });
  async._ControllerEventSinkWrapper = _ControllerEventSinkWrapper();
  async.ControllerCallback = dart.typedef('ControllerCallback', () => dart.functionType(dart.void, []));
  async.ControllerCancelCallback = dart.typedef('ControllerCancelCallback', () => dart.functionType(dart.dynamic, []));
  async.StreamController$ = dart.generic(T => {
    let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
    let _AsyncStreamControllerOfT = () => (_AsyncStreamControllerOfT = dart.constFn(async._AsyncStreamController$(T)))();
    let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
    let _AsyncBroadcastStreamControllerOfT = () => (_AsyncBroadcastStreamControllerOfT = dart.constFn(async._AsyncBroadcastStreamController$(T)))();
    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
    class StreamController extends core.Object {
      static new(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onPause = opts && 'onPause' in opts ? opts.onPause : null;
        let onResume = opts && 'onResume' in opts ? opts.onResume : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        let sync = opts && 'sync' in opts ? opts.sync : false;
        return dart.test(sync) ? new (_SyncStreamControllerOfT())(onListen, onPause, onResume, onCancel) : new (_AsyncStreamControllerOfT())(onListen, onPause, onResume, onCancel);
      }
      static broadcast(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        let sync = opts && 'sync' in opts ? opts.sync : false;
        return dart.test(sync) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_AsyncBroadcastStreamControllerOfT())(onListen, onCancel);
      }
    }
    dart.addTypeTests(StreamController);
    StreamController[dart.implements] = () => [StreamSinkOfT()];
    dart.setSignature(StreamController, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onPause: VoidTovoid(), onResume: VoidTovoid(), onCancel: VoidTodynamic(), sync: core.bool}),
        broadcast: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onCancel: VoidTovoid(), sync: core.bool})
      })
    });
    return StreamController;
  });
  async.StreamController = StreamController();
  async.SynchronousStreamController$ = dart.generic(T => {
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    class SynchronousStreamController extends core.Object {}
    dart.addTypeTests(SynchronousStreamController);
    SynchronousStreamController[dart.implements] = () => [StreamControllerOfT()];
    return SynchronousStreamController;
  });
  async.SynchronousStreamController = SynchronousStreamController();
  async._StreamControllerLifecycle$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    class _StreamControllerLifecycle extends core.Object {
      [_recordPause](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_recordResume](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_recordCancel](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        return null;
      }
    }
    dart.addTypeTests(_StreamControllerLifecycle);
    dart.setSignature(_StreamControllerLifecycle, {
      methods: () => ({
        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()])
      })
    });
    return _StreamControllerLifecycle;
  });
  async._StreamControllerLifecycle = _StreamControllerLifecycle();
  const _varData = Symbol('_varData');
  const _isInitialState = Symbol('_isInitialState');
  const _subscription = Symbol('_subscription');
  const _pendingEvents = Symbol('_pendingEvents');
  const _ensurePendingEvents = Symbol('_ensurePendingEvents');
  const _badEventState = Symbol('_badEventState');
  let const$9;
  async._StreamController$ = dart.generic(T => {
    let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
    let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
    let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
    let _StreamControllerAddStreamStateOfT = () => (_StreamControllerAddStreamStateOfT = dart.constFn(async._StreamControllerAddStreamState$(T)))();
    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
    let _ControllerSubscriptionOfT = () => (_ControllerSubscriptionOfT = dart.constFn(async._ControllerSubscription$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _StreamController extends core.Object {
      new(onListen, onPause, onResume, onCancel) {
        this.onListen = onListen;
        this.onPause = onPause;
        this.onResume = onResume;
        this.onCancel = onCancel;
        this[_varData] = null;
        this[_state] = async._StreamController._STATE_INITIAL;
        this[_doneFuture] = null;
      }
      get stream() {
        return new (_ControllerStreamOfT())(this);
      }
      get sink() {
        return new (_StreamSinkWrapperOfT())(this);
      }
      get [_isCanceled]() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_CANCELED) != 0;
      }
      get hasListener() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIBED) != 0;
      }
      get [_isInitialState]() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIPTION_MASK) == async._StreamController._STATE_INITIAL;
      }
      get isClosed() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_CLOSED) != 0;
      }
      get isPaused() {
        return dart.test(this.hasListener) ? this[_subscription][_isInputPaused] : !dart.test(this[_isCanceled]);
      }
      get [_isAddingStream]() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_ADDSTREAM) != 0;
      }
      get [_mayAddEvent]() {
        return dart.notNull(this[_state]) < async._StreamController._STATE_CLOSED;
      }
      get [_pendingEvents]() {
        dart.assert(this[_isInitialState]);
        if (!dart.test(this[_isAddingStream])) {
          return _PendingEventsOfT().as(this[_varData]);
        }
        let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        return _PendingEventsOfT().as(state.varData);
      }
      [_ensurePendingEvents]() {
        dart.assert(this[_isInitialState]);
        if (!dart.test(this[_isAddingStream])) {
          if (this[_varData] == null) this[_varData] = new (_StreamImplEventsOfT())();
          return _StreamImplEventsOfT().as(this[_varData]);
        }
        let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        if (state.varData == null) state.varData = new (_StreamImplEventsOfT())();
        return _StreamImplEventsOfT().as(state.varData);
      }
      get [_subscription]() {
        dart.assert(this.hasListener);
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          return _ControllerSubscriptionOfT().as(addState.varData);
        }
        return _ControllerSubscriptionOfT().as(this[_varData]);
      }
      [_badEventState]() {
        if (dart.test(this.isClosed)) {
          return new core.StateError("Cannot add event after closing");
        }
        dart.assert(this[_isAddingStream]);
        return new core.StateError("Cannot add event while adding a stream");
      }
      addStream(source, opts) {
        StreamOfT()._check(source);
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        if (dart.test(this[_isCanceled])) return new async._Future.immediate(null);
        let addState = new (_StreamControllerAddStreamStateOfT())(this, this[_varData], source, cancelOnError);
        this[_varData] = addState;
        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_ADDSTREAM) >>> 0;
        return addState.addStreamFuture;
      }
      get done() {
        return this[_ensureDoneFuture]();
      }
      [_ensureDoneFuture]() {
        if (this[_doneFuture] == null) {
          this[_doneFuture] = dart.test(this[_isCanceled]) ? async.Future._nullFuture : new async._Future();
        }
        return this[_doneFuture];
      }
      add(value) {
        T._check(value);
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        this[_add$](value);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        error = async._nonNullError(error);
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
        this[_addError](error, stackTrace);
      }
      close() {
        if (dart.test(this.isClosed)) {
          return this[_ensureDoneFuture]();
        }
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        this[_closeUnchecked]();
        return this[_ensureDoneFuture]();
      }
      [_closeUnchecked]() {
        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_CLOSED) >>> 0;
        if (dart.test(this.hasListener)) {
          this[_sendDone]();
        } else if (dart.test(this[_isInitialState])) {
          this[_ensurePendingEvents]().add(const$9 || (const$9 = dart.const(new async._DelayedDone())));
        }
      }
      [_add$](value) {
        T._check(value);
        if (dart.test(this.hasListener)) {
          this[_sendData](value);
        } else if (dart.test(this[_isInitialState])) {
          this[_ensurePendingEvents]().add(new (_DelayedDataOfT())(value));
        }
      }
      [_addError](error, stackTrace) {
        if (dart.test(this.hasListener)) {
          this[_sendError](error, stackTrace);
        } else if (dart.test(this[_isInitialState])) {
          this[_ensurePendingEvents]().add(new async._DelayedError(error, stackTrace));
        }
      }
      [_close$]() {
        dart.assert(this[_isAddingStream]);
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        this[_varData] = addState.varData;
        this[_state] = (dart.notNull(this[_state]) & ~async._StreamController._STATE_ADDSTREAM) >>> 0;
        addState.complete();
      }
      [_subscribe](onData, onError, onDone, cancelOnError) {
        if (!dart.test(this[_isInitialState])) {
          dart.throw(new core.StateError("Stream has already been listened to."));
        }
        let subscription = new (_ControllerSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
        let pendingEvents = this[_pendingEvents];
        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_SUBSCRIBED) >>> 0;
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          addState.varData = subscription;
          addState.resume();
        } else {
          this[_varData] = subscription;
        }
        subscription[_setPendingEvents](pendingEvents);
        subscription[_guardCallback](dart.fn(() => {
          async._runGuarded(this.onListen);
        }, VoidTovoid$()));
        return subscription;
      }
      [_recordCancel](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        let result = null;
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          result = addState.cancel();
        }
        this[_varData] = null;
        this[_state] = (dart.notNull(this[_state]) & ~(async._StreamController._STATE_SUBSCRIBED | async._StreamController._STATE_ADDSTREAM) | async._StreamController._STATE_CANCELED) >>> 0;
        if (this.onCancel != null) {
          if (result == null) {
            try {
              result = async.Future._check(this.onCancel());
            } catch (e) {
              let s = dart.stackTrace(e);
              result = new async._Future();
              result[_asyncCompleteError](e, s);
            }

          } else {
            result = result.whenComplete(this.onCancel);
          }
        }
        const complete = (function() {
          if (this[_doneFuture] != null && dart.test(this[_doneFuture][_mayComplete])) {
            this[_doneFuture][_asyncComplete](null);
          }
        }).bind(this);
        dart.fn(complete, VoidTovoid$());
        if (result != null) {
          result = result.whenComplete(complete);
        } else {
          complete();
        }
        return result;
      }
      [_recordPause](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          addState.pause();
        }
        async._runGuarded(this.onPause);
      }
      [_recordResume](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          addState.resume();
        }
        async._runGuarded(this.onResume);
      }
    }
    dart.addTypeTests(_StreamController);
    _StreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
    dart.setSignature(_StreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamController$(T), [async.ControllerCallback, async.ControllerCallback, async.ControllerCallback, async.ControllerCancelCallback])}),
      fields: () => ({
        [_varData]: dart.dynamic,
        [_state]: core.int,
        [_doneFuture]: async._Future,
        onListen: async.ControllerCallback,
        onPause: async.ControllerCallback,
        onResume: async.ControllerCallback,
        onCancel: async.ControllerCancelCallback
      }),
      getters: () => ({
        stream: dart.definiteFunctionType(async.Stream$(T), []),
        sink: dart.definiteFunctionType(async.StreamSink$(T), []),
        [_isCanceled]: dart.definiteFunctionType(core.bool, []),
        hasListener: dart.definiteFunctionType(core.bool, []),
        [_isInitialState]: dart.definiteFunctionType(core.bool, []),
        isClosed: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, []),
        [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
        [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
        [_pendingEvents]: dart.definiteFunctionType(async._PendingEvents$(T), []),
        [_subscription]: dart.definiteFunctionType(async._ControllerSubscription$(T), []),
        done: dart.definiteFunctionType(async.Future, [])
      }),
      methods: () => ({
        [_ensurePendingEvents]: dart.definiteFunctionType(async._StreamImplEvents$(T), []),
        [_badEventState]: dart.definiteFunctionType(core.Error, []),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
        [_ensureDoneFuture]: dart.definiteFunctionType(async.Future, []),
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(async.Future, []),
        [_closeUnchecked]: dart.definiteFunctionType(dart.void, []),
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_close$]: dart.definiteFunctionType(dart.void, []),
        [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()])
      }),
      sfields: () => ({
        _STATE_INITIAL: core.int,
        _STATE_SUBSCRIBED: core.int,
        _STATE_CANCELED: core.int,
        _STATE_SUBSCRIPTION_MASK: core.int,
        _STATE_CLOSED: core.int,
        _STATE_ADDSTREAM: core.int
      })
    });
    return _StreamController;
  });
  async._StreamController = _StreamController();
  async._StreamController._STATE_INITIAL = 0;
  async._StreamController._STATE_SUBSCRIBED = 1;
  async._StreamController._STATE_CANCELED = 2;
  async._StreamController._STATE_SUBSCRIPTION_MASK = 3;
  async._StreamController._STATE_CLOSED = 4;
  async._StreamController._STATE_ADDSTREAM = 8;
  async._SyncStreamControllerDispatch$ = dart.generic(T => {
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
    class _SyncStreamControllerDispatch extends core.Object {
      [_sendData](data) {
        T._check(data);
        this[_subscription][_add$](data);
      }
      [_sendError](error, stackTrace) {
        this[_subscription][_addError](error, stackTrace);
      }
      [_sendDone]() {
        this[_subscription][_close$]();
      }
    }
    dart.addTypeTests(_SyncStreamControllerDispatch);
    _SyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT(), SynchronousStreamControllerOfT()];
    dart.setSignature(_SyncStreamControllerDispatch, {
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SyncStreamControllerDispatch;
  });
  async._SyncStreamControllerDispatch = _SyncStreamControllerDispatch();
  let const$10;
  async._AsyncStreamControllerDispatch$ = dart.generic(T => {
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    class _AsyncStreamControllerDispatch extends core.Object {
      [_sendData](data) {
        T._check(data);
        this[_subscription][_addPending](new (_DelayedDataOfT())(data));
      }
      [_sendError](error, stackTrace) {
        this[_subscription][_addPending](new async._DelayedError(error, stackTrace));
      }
      [_sendDone]() {
        this[_subscription][_addPending](const$10 || (const$10 = dart.const(new async._DelayedDone())));
      }
    }
    dart.addTypeTests(_AsyncStreamControllerDispatch);
    _AsyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT()];
    dart.setSignature(_AsyncStreamControllerDispatch, {
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _AsyncStreamControllerDispatch;
  });
  async._AsyncStreamControllerDispatch = _AsyncStreamControllerDispatch();
  async._AsyncStreamController$ = dart.generic(T => {
    class _AsyncStreamController extends dart.mixin(async._StreamController$(T), async._AsyncStreamControllerDispatch$(T)) {
      new(onListen, onPause, onResume, onCancel) {
        super.new(onListen, onPause, onResume, onCancel);
      }
    }
    return _AsyncStreamController;
  });
  async._AsyncStreamController = _AsyncStreamController();
  async._SyncStreamController$ = dart.generic(T => {
    class _SyncStreamController extends dart.mixin(async._StreamController$(T), async._SyncStreamControllerDispatch$(T)) {
      new(onListen, onPause, onResume, onCancel) {
        super.new(onListen, onPause, onResume, onCancel);
      }
    }
    return _SyncStreamController;
  });
  async._SyncStreamController = _SyncStreamController();
  async._NotificationHandler = dart.typedef('_NotificationHandler', () => dart.functionType(dart.dynamic, []));
  async._runGuarded = function(notificationHandler) {
    if (notificationHandler == null) return null;
    try {
      let result = notificationHandler();
      if (async.Future.is(result)) return result;
      return null;
    } catch (e) {
      let s = dart.stackTrace(e);
      async.Zone.current.handleUncaughtError(dart.dynamic)(e, s);
    }

  };
  dart.fn(async._runGuarded, _NotificationHandlerToFuture());
  const _target = Symbol('_target');
  async._StreamSinkWrapper$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
    class _StreamSinkWrapper extends core.Object {
      new(target) {
        this[_target] = target;
      }
      add(data) {
        T._check(data);
        this[_target].add(data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_target].addError(error, stackTrace);
      }
      close() {
        return this[_target].close();
      }
      addStream(source, opts) {
        StreamOfT()._check(source);
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
        return this[_target].addStream(source, {cancelOnError: cancelOnError});
      }
      get done() {
        return this[_target].done;
      }
    }
    dart.addTypeTests(_StreamSinkWrapper);
    _StreamSinkWrapper[dart.implements] = () => [StreamSinkOfT()];
    dart.setSignature(_StreamSinkWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkWrapper$(T), [async.StreamController])}),
      fields: () => ({[_target]: async.StreamController}),
      getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(async.Future, []),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool})
      })
    });
    return _StreamSinkWrapper;
  });
  async._StreamSinkWrapper = _StreamSinkWrapper();
  async._AddStreamState$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    class _AddStreamState extends core.Object {
      new(controller, source, cancelOnError) {
        this.addStreamFuture = new async._Future();
        this.addSubscription = source.listen(dart.bind(controller, _add$), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close$), cancelOnError: cancelOnError});
      }
      static makeErrorHandler(controller) {
        return dart.fn((e, s) => {
          controller[_addError](e, s);
          controller[_close$]();
        }, dynamicAndStackTraceTodynamic());
      }
      pause() {
        this.addSubscription.pause();
      }
      resume() {
        this.addSubscription.resume();
      }
      cancel() {
        let cancel = this.addSubscription.cancel();
        if (cancel == null) {
          this.addStreamFuture[_asyncComplete](null);
          return null;
        }
        return cancel.whenComplete(dart.fn(() => {
          this.addStreamFuture[_asyncComplete](null);
        }, VoidTodynamic$()));
      }
      complete() {
        this.addStreamFuture[_asyncComplete](null);
      }
    }
    dart.addTypeTests(_AddStreamState);
    dart.setSignature(_AddStreamState, {
      constructors: () => ({new: dart.definiteFunctionType(async._AddStreamState$(T), [_EventSinkOfT(), async.Stream, core.bool])}),
      fields: () => ({
        addStreamFuture: async._Future,
        addSubscription: async.StreamSubscription
      }),
      methods: () => ({
        pause: dart.definiteFunctionType(dart.void, []),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        complete: dart.definiteFunctionType(dart.void, [])
      }),
      statics: () => ({makeErrorHandler: dart.definiteFunctionType(dart.dynamic, [async._EventSink])}),
      names: ['makeErrorHandler']
    });
    return _AddStreamState;
  });
  async._AddStreamState = _AddStreamState();
  async._StreamControllerAddStreamState$ = dart.generic(T => {
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    class _StreamControllerAddStreamState extends async._AddStreamState$(T) {
      new(controller, varData, source, cancelOnError) {
        this.varData = varData;
        super.new(controller, source, cancelOnError);
        if (dart.test(controller.isPaused)) {
          this.addSubscription.pause();
        }
      }
    }
    dart.setSignature(_StreamControllerAddStreamState, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamControllerAddStreamState$(T), [_StreamControllerOfT(), dart.dynamic, async.Stream, core.bool])}),
      fields: () => ({varData: dart.dynamic})
    });
    return _StreamControllerAddStreamState;
  });
  async._StreamControllerAddStreamState = _StreamControllerAddStreamState();
  async._EventSink$ = dart.generic(T => {
    class _EventSink extends core.Object {}
    dart.addTypeTests(_EventSink);
    return _EventSink;
  });
  async._EventSink = _EventSink();
  async._EventDispatch$ = dart.generic(T => {
    class _EventDispatch extends core.Object {}
    dart.addTypeTests(_EventDispatch);
    return _EventDispatch;
  });
  async._EventDispatch = _EventDispatch();
  async._EventGenerator$ = dart.generic(T => {
    const _EventGenerator = dart.typedef('_EventGenerator', () => dart.functionType(async._PendingEvents$(T), []));
    return _EventGenerator;
  });
  async._EventGenerator = _EventGenerator();
  const _isUsed = Symbol('_isUsed');
  async._GeneratedStreamImpl$ = dart.generic(T => {
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _EventGeneratorOfT = () => (_EventGeneratorOfT = dart.constFn(async._EventGenerator$(T)))();
    class _GeneratedStreamImpl extends async._StreamImpl$(T) {
      new(pending) {
        this[_pending] = pending;
        this[_isUsed] = false;
        super.new();
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        if (dart.test(this[_isUsed])) dart.throw(new core.StateError("Stream has already been listened to."));
        this[_isUsed] = true;
        let _ = new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
        _[_setPendingEvents](this[_pending]());
        return _;
      }
    }
    dart.setSignature(_GeneratedStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(async._GeneratedStreamImpl$(T), [_EventGeneratorOfT()])}),
      fields: () => ({
        [_pending]: _EventGeneratorOfT(),
        [_isUsed]: core.bool
      }),
      methods: () => ({[_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])})
    });
    return _GeneratedStreamImpl;
  });
  async._GeneratedStreamImpl = _GeneratedStreamImpl();
  const _iterator$ = Symbol('_iterator');
  const _eventScheduled = Symbol('_eventScheduled');
  async._PendingEvents$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _PendingEvents extends core.Object {
      new() {
        this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
      }
      get isScheduled() {
        return this[_state] == async._PendingEvents._STATE_SCHEDULED;
      }
      get [_eventScheduled]() {
        return dart.notNull(this[_state]) >= async._PendingEvents._STATE_SCHEDULED;
      }
      schedule(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        if (dart.test(this.isScheduled)) return;
        dart.assert(!dart.test(this.isEmpty));
        if (dart.test(this[_eventScheduled])) {
          dart.assert(this[_state] == async._PendingEvents._STATE_CANCELED);
          this[_state] = async._PendingEvents._STATE_SCHEDULED;
          return;
        }
        async.scheduleMicrotask(dart.fn(() => {
          let oldState = this[_state];
          this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
          if (oldState == async._PendingEvents._STATE_CANCELED) return;
          this.handleNext(dispatch);
        }, VoidTovoid$()));
        this[_state] = async._PendingEvents._STATE_SCHEDULED;
      }
      cancelSchedule() {
        if (dart.test(this.isScheduled)) this[_state] = async._PendingEvents._STATE_CANCELED;
      }
    }
    dart.addTypeTests(_PendingEvents);
    dart.setSignature(_PendingEvents, {
      fields: () => ({[_state]: core.int}),
      getters: () => ({
        isScheduled: dart.definiteFunctionType(core.bool, []),
        [_eventScheduled]: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        schedule: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
        cancelSchedule: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_UNSCHEDULED: core.int,
        _STATE_SCHEDULED: core.int,
        _STATE_CANCELED: core.int
      })
    });
    return _PendingEvents;
  });
  async._PendingEvents = _PendingEvents();
  async._PendingEvents._STATE_UNSCHEDULED = 0;
  async._PendingEvents._STATE_SCHEDULED = 1;
  async._PendingEvents._STATE_CANCELED = 3;
  async._IterablePendingEvents$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class _IterablePendingEvents extends async._PendingEvents$(T) {
      new(data) {
        this[_iterator$] = data[dartx.iterator];
        super.new();
      }
      get isEmpty() {
        return this[_iterator$] == null;
      }
      handleNext(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        if (this[_iterator$] == null) {
          dart.throw(new core.StateError("No events pending."));
        }
        let isDone = null;
        try {
          isDone = !dart.test(this[_iterator$].moveNext());
        } catch (e) {
          let s = dart.stackTrace(e);
          this[_iterator$] = null;
          dispatch[_sendError](e, s);
          return;
        }

        if (!dart.test(isDone)) {
          dispatch[_sendData](this[_iterator$].current);
        } else {
          this[_iterator$] = null;
          dispatch[_sendDone]();
        }
      }
      clear() {
        if (dart.test(this.isScheduled)) this.cancelSchedule();
        this[_iterator$] = null;
      }
    }
    dart.setSignature(_IterablePendingEvents, {
      constructors: () => ({new: dart.definiteFunctionType(async._IterablePendingEvents$(T), [IterableOfT()])}),
      fields: () => ({[_iterator$]: IteratorOfT()}),
      getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
        clear: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _IterablePendingEvents;
  });
  async._IterablePendingEvents = _IterablePendingEvents();
  async._DataHandler$ = dart.generic(T => {
    const _DataHandler = dart.typedef('_DataHandler', () => dart.functionType(dart.void, [T]));
    return _DataHandler;
  });
  async._DataHandler = _DataHandler();
  async._DoneHandler = dart.typedef('_DoneHandler', () => dart.functionType(dart.void, []));
  async._nullDataHandler = function(value) {
  };
  dart.fn(async._nullDataHandler, dynamicTovoid$());
  async._nullErrorHandler = function(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    async.Zone.current.handleUncaughtError(dart.dynamic)(error, stackTrace);
  };
  dart.lazyFn(async._nullErrorHandler, () => dynamic__Tovoid());
  async._nullDoneHandler = function() {
  };
  dart.fn(async._nullDoneHandler, VoidTovoid$());
  async._DelayedEvent$ = dart.generic(T => {
    class _DelayedEvent extends core.Object {
      new() {
        this.next = null;
      }
    }
    dart.addTypeTests(_DelayedEvent);
    dart.setSignature(_DelayedEvent, {
      fields: () => ({next: async._DelayedEvent})
    });
    return _DelayedEvent;
  });
  async._DelayedEvent = _DelayedEvent();
  async._DelayedData$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _DelayedData extends async._DelayedEvent$(T) {
      new(value) {
        this.value = value;
        super.new();
      }
      perform(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        dispatch[_sendData](this.value);
      }
    }
    dart.setSignature(_DelayedData, {
      constructors: () => ({new: dart.definiteFunctionType(async._DelayedData$(T), [T])}),
      fields: () => ({value: T}),
      methods: () => ({perform: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()])})
    });
    return _DelayedData;
  });
  async._DelayedData = _DelayedData();
  async._DelayedError = class _DelayedError extends async._DelayedEvent {
    new(error, stackTrace) {
      this.error = error;
      this.stackTrace = stackTrace;
      super.new();
    }
    perform(dispatch) {
      dispatch[_sendError](this.error, this.stackTrace);
    }
  };
  dart.addSimpleTypeTests(async._DelayedError);
  dart.setSignature(async._DelayedError, {
    constructors: () => ({new: dart.definiteFunctionType(async._DelayedError, [dart.dynamic, core.StackTrace])}),
    fields: () => ({
      error: dart.dynamic,
      stackTrace: core.StackTrace
    }),
    methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
  });
  async._DelayedDone = class _DelayedDone extends core.Object {
    new() {
    }
    perform(dispatch) {
      dispatch[_sendDone]();
    }
    get next() {
      return null;
    }
    set next(_) {
      dart.throw(new core.StateError("No events after a done."));
    }
  };
  async._DelayedDone[dart.implements] = () => [async._DelayedEvent];
  dart.setSignature(async._DelayedDone, {
    constructors: () => ({new: dart.definiteFunctionType(async._DelayedDone, [])}),
    getters: () => ({next: dart.definiteFunctionType(async._DelayedEvent, [])}),
    setters: () => ({next: dart.definiteFunctionType(dart.void, [async._DelayedEvent])}),
    methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
  });
  async._StreamImplEvents$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _StreamImplEvents extends async._PendingEvents$(T) {
      new() {
        this.firstPendingEvent = null;
        this.lastPendingEvent = null;
        super.new();
      }
      get isEmpty() {
        return this.lastPendingEvent == null;
      }
      add(event) {
        if (this.lastPendingEvent == null) {
          this.firstPendingEvent = this.lastPendingEvent = event;
        } else {
          this.lastPendingEvent = this.lastPendingEvent.next = event;
        }
      }
      handleNext(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        dart.assert(!dart.test(this.isScheduled));
        let event = this.firstPendingEvent;
        this.firstPendingEvent = event.next;
        if (this.firstPendingEvent == null) {
          this.lastPendingEvent = null;
        }
        event.perform(dispatch);
      }
      clear() {
        if (dart.test(this.isScheduled)) this.cancelSchedule();
        this.firstPendingEvent = this.lastPendingEvent = null;
      }
    }
    dart.setSignature(_StreamImplEvents, {
      fields: () => ({
        firstPendingEvent: async._DelayedEvent,
        lastPendingEvent: async._DelayedEvent
      }),
      getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
        handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
        clear: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _StreamImplEvents;
  });
  async._StreamImplEvents = _StreamImplEvents();
  const _unlink = Symbol('_unlink');
  const _insertBefore = Symbol('_insertBefore');
  async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
    new() {
      this[_next$] = null;
      this[_previous$] = null;
    }
    [_unlink]() {
      this[_previous$][_next$] = this[_next$];
      this[_next$][_previous$] = this[_previous$];
      this[_next$] = this[_previous$] = this;
    }
    [_insertBefore](newNext) {
      let newPrevious = newNext[_previous$];
      newPrevious[_next$] = this;
      newNext[_previous$] = this[_previous$];
      this[_previous$][_next$] = newNext;
      this[_previous$] = newPrevious;
    }
  };
  dart.setSignature(async._BroadcastLinkedList, {
    fields: () => ({
      [_next$]: async._BroadcastLinkedList,
      [_previous$]: async._BroadcastLinkedList
    }),
    methods: () => ({
      [_unlink]: dart.definiteFunctionType(dart.void, []),
      [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
    })
  });
  async._BroadcastCallback$ = dart.generic(T => {
    const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
    return _BroadcastCallback;
  });
  async._BroadcastCallback = _BroadcastCallback();
  const _schedule = Symbol('_schedule');
  const _isSent = Symbol('_isSent');
  const _isScheduled = Symbol('_isScheduled');
  async._DoneStreamSubscription$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _DoneStreamSubscription extends core.Object {
      new(onDone) {
        this[_onDone] = onDone;
        this[_zone] = async.Zone.current;
        this[_state] = 0;
        this[_schedule]();
      }
      get [_isSent]() {
        return (dart.notNull(this[_state]) & async._DoneStreamSubscription._DONE_SENT) != 0;
      }
      get [_isScheduled]() {
        return (dart.notNull(this[_state]) & async._DoneStreamSubscription._SCHEDULED) != 0;
      }
      get isPaused() {
        return dart.notNull(this[_state]) >= async._DoneStreamSubscription._PAUSED;
      }
      [_schedule]() {
        if (dart.test(this[_isScheduled])) return;
        this[_zone].scheduleMicrotask(dart.bind(this, _sendDone));
        this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._SCHEDULED) >>> 0;
      }
      onData(handleData) {}
      onError(handleError) {}
      onDone(handleDone) {
        this[_onDone] = handleDone;
      }
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        this[_state] = dart.notNull(this[_state]) + async._DoneStreamSubscription._PAUSED;
        if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
      resume() {
        if (dart.test(this.isPaused)) {
          this[_state] = dart.notNull(this[_state]) - async._DoneStreamSubscription._PAUSED;
          if (!dart.test(this.isPaused) && !dart.test(this[_isSent])) {
            this[_schedule]();
          }
        }
      }
      cancel() {
        return null;
      }
      asFuture(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          let result = new (async._Future$(E))();
          this[_onDone] = dart.fn(() => {
            result[_completeWithValue](null);
          }, VoidTovoid$());
          return result;
        };
      }
      [_sendDone]() {
        this[_state] = (dart.notNull(this[_state]) & ~async._DoneStreamSubscription._SCHEDULED) >>> 0;
        if (dart.test(this.isPaused)) return;
        this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._DONE_SENT) >>> 0;
        if (this[_onDone] != null) this[_zone].runGuarded(dart.dynamic)(this[_onDone]);
      }
    }
    dart.addTypeTests(_DoneStreamSubscription);
    _DoneStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
    dart.setSignature(_DoneStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._DoneStreamSubscription$(T), [async._DoneHandler])}),
      fields: () => ({
        [_zone]: async.Zone,
        [_state]: core.int,
        [_onDone]: async._DoneHandler
      }),
      getters: () => ({
        [_isSent]: dart.definiteFunctionType(core.bool, []),
        [_isScheduled]: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        [_schedule]: dart.definiteFunctionType(dart.void, []),
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _DONE_SENT: core.int,
        _SCHEDULED: core.int,
        _PAUSED: core.int
      })
    });
    return _DoneStreamSubscription;
  });
  async._DoneStreamSubscription = _DoneStreamSubscription();
  async._DoneStreamSubscription._DONE_SENT = 1;
  async._DoneStreamSubscription._SCHEDULED = 2;
  async._DoneStreamSubscription._PAUSED = 4;
  const _source$ = Symbol('_source');
  const _onListenHandler = Symbol('_onListenHandler');
  const _onCancelHandler = Symbol('_onCancelHandler');
  const _cancelSubscription = Symbol('_cancelSubscription');
  const _pauseSubscription = Symbol('_pauseSubscription');
  const _resumeSubscription = Symbol('_resumeSubscription');
  const _isSubscriptionPaused = Symbol('_isSubscriptionPaused');
  async._AsBroadcastStream$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let _AsBroadcastStreamControllerOfT = () => (_AsBroadcastStreamControllerOfT = dart.constFn(async._AsBroadcastStreamController$(T)))();
    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
    let _BroadcastSubscriptionWrapperOfT = () => (_BroadcastSubscriptionWrapperOfT = dart.constFn(async._BroadcastSubscriptionWrapper$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let _BroadcastCallbackOfT = () => (_BroadcastCallbackOfT = dart.constFn(async._BroadcastCallback$(T)))();
    class _AsBroadcastStream extends async.Stream$(T) {
      new(source, onListenHandler, onCancelHandler) {
        this[_source$] = source;
        this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onListenHandler);
        this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onCancelHandler);
        this[_zone] = async.Zone.current;
        this[_controller$] = null;
        this[_subscription] = null;
        super.new();
        this[_controller$] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
      }
      get isBroadcast() {
        return true;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        if (this[_controller$] == null || dart.test(this[_controller$].isClosed)) {
          return new (_DoneStreamSubscriptionOfT())(onDone);
        }
        if (this[_subscription] == null) {
          this[_subscription] = this[_source$].listen(dart.bind(this[_controller$], 'add'), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
        }
        cancelOnError = core.identical(true, cancelOnError);
        return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
      }
      [_onCancel]() {
        let shutdown = this[_controller$] == null || dart.test(this[_controller$].isClosed);
        if (this[_onCancelHandler] != null) {
          this[_zone].runUnary(dart.dynamic, _BroadcastSubscriptionWrapperOfT())(this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
        }
        if (shutdown) {
          if (this[_subscription] != null) {
            this[_subscription].cancel();
            this[_subscription] = null;
          }
        }
      }
      [_onListen]() {
        if (this[_onListenHandler] != null) {
          this[_zone].runUnary(dart.dynamic, _BroadcastSubscriptionWrapperOfT())(this[_onListenHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
        }
      }
      [_cancelSubscription]() {
        if (this[_subscription] == null) return;
        let subscription = this[_subscription];
        this[_subscription] = null;
        this[_controller$] = null;
        subscription.cancel();
      }
      [_pauseSubscription](resumeSignal) {
        if (this[_subscription] == null) return;
        this[_subscription].pause(resumeSignal);
      }
      [_resumeSubscription]() {
        if (this[_subscription] == null) return;
        this[_subscription].resume();
      }
      get [_isSubscriptionPaused]() {
        if (this[_subscription] == null) return false;
        return this[_subscription].isPaused;
      }
    }
    dart.setSignature(_AsBroadcastStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStream$(T), [StreamOfT(), _BroadcastCallbackOfT(), _BroadcastCallbackOfT()])}),
      fields: () => ({
        [_source$]: StreamOfT(),
        [_onListenHandler]: _BroadcastCallbackOfT(),
        [_onCancelHandler]: _BroadcastCallbackOfT(),
        [_zone]: async.Zone,
        [_controller$]: _AsBroadcastStreamControllerOfT(),
        [_subscription]: StreamSubscriptionOfT()
      }),
      getters: () => ({[_isSubscriptionPaused]: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        [_onCancel]: dart.definiteFunctionType(dart.void, []),
        [_onListen]: dart.definiteFunctionType(dart.void, []),
        [_cancelSubscription]: dart.definiteFunctionType(dart.void, []),
        [_pauseSubscription]: dart.definiteFunctionType(dart.void, [async.Future]),
        [_resumeSubscription]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _AsBroadcastStream;
  });
  async._AsBroadcastStream = _AsBroadcastStream();
  async._BroadcastSubscriptionWrapper$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BroadcastSubscriptionWrapper extends core.Object {
      new(stream) {
        this[_stream] = stream;
      }
      onData(handleData) {
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      }
      onError(handleError) {
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      }
      onDone(handleDone) {
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      }
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        this[_stream][_pauseSubscription](resumeSignal);
      }
      resume() {
        this[_stream][_resumeSubscription]();
      }
      cancel() {
        this[_stream][_cancelSubscription]();
        return null;
      }
      get isPaused() {
        return this[_stream][_isSubscriptionPaused];
      }
      asFuture(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
        };
      }
    }
    dart.addTypeTests(_BroadcastSubscriptionWrapper);
    _BroadcastSubscriptionWrapper[dart.implements] = () => [StreamSubscriptionOfT()];
    dart.setSignature(_BroadcastSubscriptionWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscriptionWrapper$(T), [async._AsBroadcastStream])}),
      fields: () => ({[_stream]: async._AsBroadcastStream}),
      getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
      })
    });
    return _BroadcastSubscriptionWrapper;
  });
  async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
  const _current$1 = Symbol('_current');
  const _futureOrPrefetch = Symbol('_futureOrPrefetch');
  const _clear = Symbol('_clear');
  async._StreamIteratorImpl$ = dart.generic(T => {
    let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _StreamIteratorImpl extends core.Object {
      new(stream) {
        this[_subscription] = null;
        this[_current$1] = null;
        this[_futureOrPrefetch] = null;
        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
      }
      get current() {
        return this[_current$1];
      }
      moveNext() {
        if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
          return new (_FutureOfbool()).immediate(false);
        }
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          dart.throw(new core.StateError("Already waiting for next."));
        }
        if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
          this[_state] = async._StreamIteratorImpl._STATE_MOVING;
          this[_current$1] = null;
          let result = new (_FutureOfbool())();
          this[_futureOrPrefetch] = result;
          return result;
        } else {
          dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
          switch (this[_state]) {
            case async._StreamIteratorImpl._STATE_EXTRA_DATA:
            {
              this[_state] = async._StreamIteratorImpl._STATE_FOUND;
              this[_current$1] = T.as(this[_futureOrPrefetch]);
              this[_futureOrPrefetch] = null;
              this[_subscription].resume();
              return new (_FutureOfbool()).immediate(true);
            }
            case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
            {
              let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
              this[_clear]();
              return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
            }
            case async._StreamIteratorImpl._STATE_EXTRA_DONE:
            {
              this[_clear]();
              return new (_FutureOfbool()).immediate(false);
            }
          }
        }
      }
      [_clear]() {
        this[_subscription] = null;
        this[_futureOrPrefetch] = null;
        this[_current$1] = null;
        this[_state] = async._StreamIteratorImpl._STATE_DONE;
      }
      cancel() {
        let subscription = this[_subscription];
        if (subscription == null) return null;
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_clear]();
          hasNext[_complete](false);
        } else {
          this[_clear]();
        }
        return subscription.cancel();
      }
      [_onData](data) {
        T._check(data);
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          this[_current$1] = data;
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_futureOrPrefetch] = null;
          this[_state] = async._StreamIteratorImpl._STATE_FOUND;
          hasNext[_complete](true);
          return;
        }
        this[_subscription].pause();
        dart.assert(this[_futureOrPrefetch] == null);
        this[_futureOrPrefetch] = data;
        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
      }
      [_onError](error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_clear]();
          hasNext[_completeError](error, stackTrace);
          return;
        }
        this[_subscription].pause();
        dart.assert(this[_futureOrPrefetch] == null);
        this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
      }
      [_onDone]() {
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_clear]();
          hasNext[_complete](false);
          return;
        }
        this[_subscription].pause();
        this[_futureOrPrefetch] = null;
        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
      }
    }
    dart.addTypeTests(_StreamIteratorImpl);
    _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
    dart.setSignature(_StreamIteratorImpl, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamIteratorImpl$(T), [StreamOfT()])}),
      fields: () => ({
        [_subscription]: async.StreamSubscription,
        [_current$1]: T,
        [_futureOrPrefetch]: dart.dynamic,
        [_state]: core.int
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({
        moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
        [_clear]: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        [_onData]: dart.definiteFunctionType(dart.void, [T]),
        [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        [_onDone]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_FOUND: core.int,
        _STATE_DONE: core.int,
        _STATE_MOVING: core.int,
        _STATE_EXTRA_DATA: core.int,
        _STATE_EXTRA_ERROR: core.int,
        _STATE_EXTRA_DONE: core.int
      })
    });
    return _StreamIteratorImpl;
  });
  async._StreamIteratorImpl = _StreamIteratorImpl();
  async._StreamIteratorImpl._STATE_FOUND = 0;
  async._StreamIteratorImpl._STATE_DONE = 1;
  async._StreamIteratorImpl._STATE_MOVING = 2;
  async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
  async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
  async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
  async._EmptyStream$ = dart.generic(T => {
    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _EmptyStream extends async.Stream$(T) {
      new() {
        super._internal();
      }
      get isBroadcast() {
        return true;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return new (_DoneStreamSubscriptionOfT())(onDone);
      }
    }
    dart.setSignature(_EmptyStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._EmptyStream$(T), [])}),
      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
    });
    return _EmptyStream;
  });
  async._EmptyStream = _EmptyStream();
  async._runUserCode = function(userCode, onSuccess, onError) {
    try {
      dart.dcall(onSuccess, userCode());
    } catch (e) {
      let s = dart.stackTrace(e);
      let replacement = async.Zone.current.errorCallback(e, s);
      if (replacement == null) {
        dart.dcall(onError, e, s);
      } else {
        let error = async._nonNullError(replacement.error);
        let stackTrace = replacement.stackTrace;
        dart.dcall(onError, error, stackTrace);
      }
    }

  };
  dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
  async._cancelAndError = function(subscription, future, error, stackTrace) {
    let cancelFuture = subscription.cancel();
    if (async.Future.is(cancelFuture)) {
      cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
    } else {
      future[_completeError](error, stackTrace);
    }
  };
  dart.lazyFn(async._cancelAndError, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
  async._cancelAndErrorWithReplacement = function(subscription, future, error, stackTrace) {
    let replacement = async.Zone.current.errorCallback(error, stackTrace);
    if (replacement != null) {
      error = async._nonNullError(replacement.error);
      stackTrace = replacement.stackTrace;
    }
    async._cancelAndError(subscription, future, error, stackTrace);
  };
  dart.lazyFn(async._cancelAndErrorWithReplacement, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
  async._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [dart.dynamic, core.StackTrace]));
  async._cancelAndErrorClosure = function(subscription, future) {
    return dart.fn((error, stackTrace) => {
      async._cancelAndError(subscription, future, error, stackTrace);
    }, dynamicAndStackTraceTovoid());
  };
  dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
  async._cancelAndValue = function(subscription, future, value) {
    let cancelFuture = subscription.cancel();
    if (async.Future.is(cancelFuture)) {
      cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
    } else {
      future[_complete](value);
    }
  };
  dart.fn(async._cancelAndValue, StreamSubscriptionAnd_FutureAnddynamicTovoid());
  const _handleData = Symbol('_handleData');
  const _handleError = Symbol('_handleError');
  const _handleDone = Symbol('_handleDone');
  async._ForwardingStream$ = dart.generic((S, T) => {
    let _ForwardingStreamSubscriptionOfS$T = () => (_ForwardingStreamSubscriptionOfS$T = dart.constFn(async._ForwardingStreamSubscription$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _ForwardingStream extends async.Stream$(T) {
      new(source) {
        this[_source$] = source;
        super.new();
      }
      get isBroadcast() {
        return this[_source$].isBroadcast;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        return this[_createSubscription](onData, onError, onDone, cancelOnError);
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_ForwardingStreamSubscriptionOfS$T())(this, onData, onError, onDone, cancelOnError);
      }
      [_handleData](data, sink) {
        S._check(data);
        _EventSinkOfT()._check(sink);
        sink[_add$](T.as(data));
      }
      [_handleError](error, stackTrace, sink) {
        _EventSinkOfT()._check(sink);
        sink[_addError](error, stackTrace);
      }
      [_handleDone](sink) {
        _EventSinkOfT()._check(sink);
        sink[_close$]();
      }
    }
    dart.setSignature(_ForwardingStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStream$(S, T), [StreamOfS()])}),
      fields: () => ({[_source$]: StreamOfS()}),
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()]),
        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, _EventSinkOfT()]),
        [_handleDone]: dart.definiteFunctionType(dart.void, [_EventSinkOfT()])
      })
    });
    return _ForwardingStream;
  });
  async._ForwardingStream = _ForwardingStream();
  async._ForwardingStreamSubscription$ = dart.generic((S, T) => {
    let _ForwardingStreamOfS$T = () => (_ForwardingStreamOfS$T = dart.constFn(async._ForwardingStream$(S, T)))();
    let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _ForwardingStreamSubscription extends async._BufferingStreamSubscription$(T) {
      new(stream, onData, onError, onDone, cancelOnError) {
        this[_stream] = stream;
        this[_subscription] = null;
        super.new(onData, onError, onDone, cancelOnError);
        this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
      }
      [_add$](data) {
        T._check(data);
        if (dart.test(this[_isClosed$])) return;
        super[_add$](data);
      }
      [_addError](error, stackTrace) {
        if (dart.test(this[_isClosed$])) return;
        super[_addError](error, stackTrace);
      }
      [_onPause]() {
        if (this[_subscription] == null) return;
        this[_subscription].pause();
      }
      [_onResume]() {
        if (this[_subscription] == null) return;
        this[_subscription].resume();
      }
      [_onCancel]() {
        if (this[_subscription] != null) {
          let subscription = this[_subscription];
          this[_subscription] = null;
          return subscription.cancel();
        }
        return null;
      }
      [_handleData](data) {
        S._check(data);
        this[_stream][_handleData](data, this);
      }
      [_handleError](error, stackTrace) {
        this[_stream][_handleError](error, stackTrace, this);
      }
      [_handleDone]() {
        this[_stream][_handleDone](this);
      }
    }
    dart.setSignature(_ForwardingStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStreamSubscription$(S, T), [_ForwardingStreamOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_stream]: _ForwardingStreamOfS$T(),
        [_subscription]: StreamSubscriptionOfS()
      }),
      methods: () => ({
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_handleData]: dart.definiteFunctionType(dart.void, [S]),
        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
        [_handleDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _ForwardingStreamSubscription;
  });
  async._ForwardingStreamSubscription = _ForwardingStreamSubscription();
  async._Predicate$ = dart.generic(T => {
    const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
    return _Predicate;
  });
  async._Predicate = _Predicate();
  async._addErrorWithReplacement = function(sink, error, stackTrace) {
    let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
    if (replacement != null) {
      error = async._nonNullError(replacement.error);
      stackTrace = replacement.stackTrace;
    }
    sink[_addError](error, core.StackTrace._check(stackTrace));
  };
  dart.fn(async._addErrorWithReplacement, _EventSinkAnddynamicAnddynamicTovoid());
  const _test = Symbol('_test');
  async._WhereStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _WhereStream extends async._ForwardingStream$(T, T) {
      new(source, test) {
        this[_test] = test;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let satisfies = null;
        try {
          satisfies = this[_test](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }

        if (dart.test(satisfies)) {
          sink[_add$](inputEvent);
        }
      }
    }
    dart.setSignature(_WhereStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._WhereStream$(T), [StreamOfT(), _PredicateOfT()])}),
      fields: () => ({[_test]: _PredicateOfT()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])})
    });
    return _WhereStream;
  });
  async._WhereStream = _WhereStream();
  async._Transformation$ = dart.generic((S, T) => {
    const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
    return _Transformation;
  });
  async._Transformation = _Transformation$();
  const _transform = Symbol('_transform');
  async._MapStream$ = dart.generic((S, T) => {
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(async._Transformation$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    class _MapStream extends async._ForwardingStream$(S, T) {
      new(source, transform) {
        this[_transform] = transform;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        S._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let outputEvent = null;
        try {
          outputEvent = this[_transform](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }

        sink[_add$](outputEvent);
      }
    }
    dart.setSignature(_MapStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._MapStream$(S, T), [StreamOfS(), _TransformationOfS$T()])}),
      fields: () => ({[_transform]: _TransformationOfS$T()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()])})
    });
    return _MapStream;
  });
  async._MapStream = _MapStream();
  const _expand = Symbol('_expand');
  async._ExpandStream$ = dart.generic((S, T) => {
    let _TransformationOfS$IterableOfT = () => (_TransformationOfS$IterableOfT = dart.constFn(async._Transformation$(S, IterableOfT())))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class _ExpandStream extends async._ForwardingStream$(S, T) {
      new(source, expand) {
        this[_expand] = expand;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        S._check(inputEvent);
        _EventSinkOfT()._check(sink);
        try {
          for (let value of this[_expand](inputEvent)) {
            sink[_add$](value);
          }
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
        }

      }
    }
    dart.setSignature(_ExpandStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._ExpandStream$(S, T), [StreamOfS(), _TransformationOfS$IterableOfT()])}),
      fields: () => ({[_expand]: _TransformationOfS$IterableOfT()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()])})
    });
    return _ExpandStream;
  });
  async._ExpandStream = _ExpandStream();
  async._ErrorTest = dart.typedef('_ErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
  async._HandleErrorStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _HandleErrorStream extends async._ForwardingStream$(T, T) {
      new(source, onError, test) {
        this[_transform] = onError;
        this[_test] = test;
        super.new(source);
      }
      [_handleError](error, stackTrace, sink) {
        _EventSinkOfT()._check(sink);
        let matches = true;
        if (this[_test] != null) {
          try {
            matches = dart.dcall(this[_test], error);
          } catch (e) {
            let s = dart.stackTrace(e);
            async._addErrorWithReplacement(sink, e, s);
            return;
          }

        }
        if (dart.test(matches)) {
          try {
            async._invokeErrorHandler(this[_transform], error, stackTrace);
          } catch (e) {
            let s = dart.stackTrace(e);
            if (core.identical(e, error)) {
              sink[_addError](error, stackTrace);
            } else {
              async._addErrorWithReplacement(sink, e, s);
            }
            return;
          }

        } else {
          sink[_addError](error, stackTrace);
        }
      }
    }
    dart.setSignature(_HandleErrorStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._HandleErrorStream$(T), [StreamOfT(), core.Function, dynamicTobool()])}),
      fields: () => ({
        [_transform]: core.Function,
        [_test]: async._ErrorTest
      }),
      methods: () => ({[_handleError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace, _EventSinkOfT()])})
    });
    return _HandleErrorStream;
  });
  async._HandleErrorStream = _HandleErrorStream();
  const _count = Symbol('_count');
  async._TakeStream$ = dart.generic(T => {
    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _TakeStream extends async._ForwardingStream$(T, T) {
      new(source, count) {
        this[_count] = count;
        super.new(source);
        if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let subscription = _StateStreamSubscriptionOfT()._check(sink);
        let count = subscription[_count];
        if (dart.notNull(count) > 0) {
          sink[_add$](inputEvent);
          count = dart.notNull(count) - 1;
          subscription[_count] = count;
          if (count == 0) {
            sink[_close$]();
          }
        }
      }
    }
    dart.setSignature(_TakeStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._TakeStream$(T), [StreamOfT(), core.int])}),
      fields: () => ({[_count]: core.int}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])
      })
    });
    return _TakeStream;
  });
  async._TakeStream = _TakeStream();
  const _sharedState = Symbol('_sharedState');
  const _flag = Symbol('_flag');
  async._StateStreamSubscription$ = dart.generic(T => {
    let _ForwardingStreamOfT$T = () => (_ForwardingStreamOfT$T = dart.constFn(async._ForwardingStream$(T, T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _StateStreamSubscription extends async._ForwardingStreamSubscription$(T, T) {
      new(stream, onData, onError, onDone, cancelOnError, sharedState) {
        this[_sharedState] = sharedState;
        super.new(stream, onData, onError, onDone, cancelOnError);
      }
      get [_flag]() {
        return core.bool._check(this[_sharedState]);
      }
      set [_flag](flag) {
        this[_sharedState] = flag;
      }
      get [_count]() {
        return core.int._check(this[_sharedState]);
      }
      set [_count](count) {
        this[_sharedState] = count;
      }
    }
    dart.setSignature(_StateStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._StateStreamSubscription$(T), [_ForwardingStreamOfT$T(), TTovoid(), core.Function, VoidTovoid(), core.bool, dart.dynamic])}),
      fields: () => ({[_sharedState]: dart.dynamic}),
      getters: () => ({
        [_flag]: dart.definiteFunctionType(core.bool, []),
        [_count]: dart.definiteFunctionType(core.int, [])
      }),
      setters: () => ({
        [_flag]: dart.definiteFunctionType(dart.void, [core.bool]),
        [_count]: dart.definiteFunctionType(dart.void, [core.int])
      })
    });
    return _StateStreamSubscription;
  });
  async._StateStreamSubscription = _StateStreamSubscription();
  async._TakeWhileStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _TakeWhileStream extends async._ForwardingStream$(T, T) {
      new(source, test) {
        this[_test] = test;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let satisfies = null;
        try {
          satisfies = this[_test](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          sink[_close$]();
          return;
        }

        if (dart.test(satisfies)) {
          sink[_add$](inputEvent);
        } else {
          sink[_close$]();
        }
      }
    }
    dart.setSignature(_TakeWhileStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._TakeWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
      fields: () => ({[_test]: _PredicateOfT()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])})
    });
    return _TakeWhileStream;
  });
  async._TakeWhileStream = _TakeWhileStream();
  async._SkipStream$ = dart.generic(T => {
    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _SkipStream extends async._ForwardingStream$(T, T) {
      new(source, count) {
        this[_count] = count;
        super.new(source);
        if (!(typeof count == 'number') || dart.notNull(count) < 0) dart.throw(new core.ArgumentError(count));
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let subscription = _StateStreamSubscriptionOfT()._check(sink);
        let count = subscription[_count];
        if (dart.notNull(count) > 0) {
          subscription[_count] = dart.notNull(count) - 1;
          return;
        }
        sink[_add$](inputEvent);
      }
    }
    dart.setSignature(_SkipStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._SkipStream$(T), [StreamOfT(), core.int])}),
      fields: () => ({[_count]: core.int}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])
      })
    });
    return _SkipStream;
  });
  async._SkipStream = _SkipStream();
  async._SkipWhileStream$ = dart.generic(T => {
    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _SkipWhileStream extends async._ForwardingStream$(T, T) {
      new(source, test) {
        this[_test] = test;
        super.new(source);
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, false);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let subscription = _StateStreamSubscriptionOfT()._check(sink);
        let hasFailed = subscription[_flag];
        if (dart.test(hasFailed)) {
          sink[_add$](inputEvent);
          return;
        }
        let satisfies = null;
        try {
          satisfies = this[_test](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          subscription[_flag] = true;
          return;
        }

        if (!dart.test(satisfies)) {
          subscription[_flag] = true;
          sink[_add$](inputEvent);
        }
      }
    }
    dart.setSignature(_SkipWhileStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._SkipWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
      fields: () => ({[_test]: _PredicateOfT()}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])
      })
    });
    return _SkipWhileStream;
  });
  async._SkipWhileStream = _SkipWhileStream();
  async._Equality$ = dart.generic(T => {
    const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [T, T]));
    return _Equality;
  });
  async._Equality = _Equality();
  const _equals = Symbol('_equals');
  async._DistinctStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EqualityOfT = () => (_EqualityOfT = dart.constFn(async._Equality$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _DistinctStream extends async._ForwardingStream$(T, T) {
      new(source, equals) {
        this[_previous$] = async._DistinctStream._SENTINEL;
        this[_equals] = equals;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        if (core.identical(this[_previous$], async._DistinctStream._SENTINEL)) {
          this[_previous$] = inputEvent;
          return sink[_add$](inputEvent);
        } else {
          let isEqual = null;
          try {
            if (this[_equals] == null) {
              isEqual = dart.equals(this[_previous$], inputEvent);
            } else {
              isEqual = this[_equals](T.as(this[_previous$]), inputEvent);
            }
          } catch (e) {
            let s = dart.stackTrace(e);
            async._addErrorWithReplacement(sink, e, s);
            return null;
          }

          if (!dart.test(isEqual)) {
            sink[_add$](inputEvent);
            this[_previous$] = inputEvent;
          }
        }
      }
    }
    dart.setSignature(_DistinctStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._DistinctStream$(T), [StreamOfT(), _EqualityOfT()])}),
      fields: () => ({
        [_equals]: _EqualityOfT(),
        [_previous$]: core.Object
      }),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])}),
      sfields: () => ({_SENTINEL: core.Object})
    });
    return _DistinctStream;
  });
  async._DistinctStream = _DistinctStream();
  dart.defineLazy(async._DistinctStream, {
    get _SENTINEL() {
      return new core.Object();
    },
    set _SENTINEL(_) {}
  });
  async._EventSinkWrapper$ = dart.generic(T => {
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _EventSinkWrapper extends core.Object {
      new(sink) {
        this[_sink] = sink;
      }
      add(data) {
        T._check(data);
        this[_sink][_add$](data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_sink][_addError](error, stackTrace);
      }
      close() {
        this[_sink][_close$]();
      }
    }
    dart.addTypeTests(_EventSinkWrapper);
    _EventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
    dart.setSignature(_EventSinkWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._EventSinkWrapper$(T), [async._EventSink])}),
      fields: () => ({[_sink]: async._EventSink}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _EventSinkWrapper;
  });
  async._EventSinkWrapper = _EventSinkWrapper();
  const _transformerSink = Symbol('_transformerSink');
  const _isSubscribed = Symbol('_isSubscribed');
  async._SinkTransformerStreamSubscription$ = dart.generic((S, T) => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
    let _EventSinkWrapperOfT = () => (_EventSinkWrapperOfT = dart.constFn(async._EventSinkWrapper$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _SinkTransformerStreamSubscription extends async._BufferingStreamSubscription$(T) {
      new(source, mapper, onData, onError, onDone, cancelOnError) {
        this[_transformerSink] = null;
        this[_subscription] = null;
        super.new(onData, onError, onDone, cancelOnError);
        let eventSink = new (_EventSinkWrapperOfT())(this);
        this[_transformerSink] = mapper(eventSink);
        this[_subscription] = source.listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
      }
      get [_isSubscribed]() {
        return this[_subscription] != null;
      }
      [_add$](data) {
        T._check(data);
        if (dart.test(this[_isClosed$])) {
          dart.throw(new core.StateError("Stream is already closed"));
        }
        super[_add$](data);
      }
      [_addError](error, stackTrace) {
        if (dart.test(this[_isClosed$])) {
          dart.throw(new core.StateError("Stream is already closed"));
        }
        super[_addError](error, stackTrace);
      }
      [_close$]() {
        if (dart.test(this[_isClosed$])) {
          dart.throw(new core.StateError("Stream is already closed"));
        }
        super[_close$]();
      }
      [_onPause]() {
        if (dart.test(this[_isSubscribed])) this[_subscription].pause();
      }
      [_onResume]() {
        if (dart.test(this[_isSubscribed])) this[_subscription].resume();
      }
      [_onCancel]() {
        if (dart.test(this[_isSubscribed])) {
          let subscription = this[_subscription];
          this[_subscription] = null;
          subscription.cancel();
        }
        return null;
      }
      [_handleData](data) {
        S._check(data);
        try {
          this[_transformerSink].add(data);
        } catch (e) {
          let s = dart.stackTrace(e);
          this[_addError](e, s);
        }

      }
      [_handleError](error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        try {
          this[_transformerSink].addError(error, core.StackTrace._check(stackTrace));
        } catch (e) {
          let s = dart.stackTrace(e);
          if (core.identical(e, error)) {
            this[_addError](error, core.StackTrace._check(stackTrace));
          } else {
            this[_addError](e, s);
          }
        }

      }
      [_handleDone]() {
        try {
          this[_subscription] = null;
          this[_transformerSink].close();
        } catch (e) {
          let s = dart.stackTrace(e);
          this[_addError](e, s);
        }

      }
    }
    dart.setSignature(_SinkTransformerStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._SinkTransformerStreamSubscription$(S, T), [StreamOfS(), _SinkMapperOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_transformerSink]: EventSinkOfS(),
        [_subscription]: StreamSubscriptionOfS()
      }),
      getters: () => ({[_isSubscribed]: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_handleData]: dart.definiteFunctionType(dart.void, [S]),
        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic]),
        [_handleDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SinkTransformerStreamSubscription;
  });
  async._SinkTransformerStreamSubscription = _SinkTransformerStreamSubscription();
  async._SinkMapper$ = dart.generic((S, T) => {
    const _SinkMapper = dart.typedef('_SinkMapper', () => dart.functionType(async.EventSink$(S), [async.EventSink$(T)]));
    return _SinkMapper;
  });
  async._SinkMapper = _SinkMapper();
  const _sinkMapper = Symbol('_sinkMapper');
  async._StreamSinkTransformer$ = dart.generic((S, T) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _BoundSinkStreamOfS$T = () => (_BoundSinkStreamOfS$T = dart.constFn(async._BoundSinkStream$(S, T)))();
    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
    class _StreamSinkTransformer extends core.Object {
      new(sinkMapper) {
        this[_sinkMapper] = sinkMapper;
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return new (_BoundSinkStreamOfS$T())(stream, this[_sinkMapper]);
      }
    }
    dart.addTypeTests(_StreamSinkTransformer);
    _StreamSinkTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
    dart.setSignature(_StreamSinkTransformer, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkTransformer$(S, T), [_SinkMapperOfS$T()])}),
      fields: () => ({[_sinkMapper]: _SinkMapperOfS$T()}),
      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
    });
    return _StreamSinkTransformer;
  });
  async._StreamSinkTransformer = _StreamSinkTransformer();
  async._BoundSinkStream$ = dart.generic((S, T) => {
    let _SinkTransformerStreamSubscriptionOfS$T = () => (_SinkTransformerStreamSubscriptionOfS$T = dart.constFn(async._SinkTransformerStreamSubscription$(S, T)))();
    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BoundSinkStream extends async.Stream$(T) {
      get isBroadcast() {
        return this[_stream].isBroadcast;
      }
      new(stream, sinkMapper) {
        this[_stream] = stream;
        this[_sinkMapper] = sinkMapper;
        super.new();
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        let subscription = new (_SinkTransformerStreamSubscriptionOfS$T())(this[_stream], this[_sinkMapper], onData, onError, onDone, cancelOnError);
        return subscription;
      }
    }
    dart.setSignature(_BoundSinkStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._BoundSinkStream$(S, T), [StreamOfS(), _SinkMapperOfS$T()])}),
      fields: () => ({
        [_sinkMapper]: _SinkMapperOfS$T(),
        [_stream]: StreamOfS()
      }),
      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
    });
    return _BoundSinkStream;
  });
  async._BoundSinkStream = _BoundSinkStream();
  async._TransformDataHandler$ = dart.generic((S, T) => {
    const _TransformDataHandler = dart.typedef('_TransformDataHandler', () => dart.functionType(dart.void, [S, async.EventSink$(T)]));
    return _TransformDataHandler;
  });
  async._TransformDataHandler = _TransformDataHandler();
  async._TransformErrorHandler$ = dart.generic(T => {
    const _TransformErrorHandler = dart.typedef('_TransformErrorHandler', () => dart.functionType(dart.void, [core.Object, core.StackTrace, async.EventSink$(T)]));
    return _TransformErrorHandler;
  });
  async._TransformErrorHandler = _TransformErrorHandler();
  async._TransformDoneHandler$ = dart.generic(T => {
    const _TransformDoneHandler = dart.typedef('_TransformDoneHandler', () => dart.functionType(dart.void, [async.EventSink$(T)]));
    return _TransformDoneHandler;
  });
  async._TransformDoneHandler = _TransformDoneHandler();
  async._HandlerEventSink$ = dart.generic((S, T) => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let _TransformDataHandlerOfS$T = () => (_TransformDataHandlerOfS$T = dart.constFn(async._TransformDataHandler$(S, T)))();
    let _TransformErrorHandlerOfT = () => (_TransformErrorHandlerOfT = dart.constFn(async._TransformErrorHandler$(T)))();
    let _TransformDoneHandlerOfT = () => (_TransformDoneHandlerOfT = dart.constFn(async._TransformDoneHandler$(T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _HandlerEventSink extends core.Object {
      new(handleData, handleError, handleDone, sink) {
        this[_handleData] = handleData;
        this[_handleError] = handleError;
        this[_handleDone] = handleDone;
        this[_sink] = sink;
      }
      add(data) {
        S._check(data);
        this[_handleData](data, this[_sink]);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_handleError](error, stackTrace, this[_sink]);
      }
      close() {
        this[_handleDone](this[_sink]);
      }
    }
    dart.addTypeTests(_HandlerEventSink);
    _HandlerEventSink[dart.implements] = () => [EventSinkOfS()];
    dart.setSignature(_HandlerEventSink, {
      constructors: () => ({new: dart.definiteFunctionType(async._HandlerEventSink$(S, T), [_TransformDataHandlerOfS$T(), _TransformErrorHandlerOfT(), _TransformDoneHandlerOfT(), EventSinkOfT()])}),
      fields: () => ({
        [_handleData]: _TransformDataHandlerOfS$T(),
        [_handleError]: _TransformErrorHandlerOfT(),
        [_handleDone]: _TransformDoneHandlerOfT(),
        [_sink]: EventSinkOfT()
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [S]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _HandlerEventSink;
  });
  async._HandlerEventSink = _HandlerEventSink();
  async._StreamHandlerTransformer$ = dart.generic((S, T) => {
    let _HandlerEventSinkOfS$T = () => (_HandlerEventSinkOfS$T = dart.constFn(async._HandlerEventSink$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
    let EventSinkOfTTo_HandlerEventSinkOfS$T = () => (EventSinkOfTTo_HandlerEventSinkOfS$T = dart.constFn(dart.definiteFunctionType(_HandlerEventSinkOfS$T(), [EventSinkOfT()])))();
    class _StreamHandlerTransformer extends async._StreamSinkTransformer$(S, T) {
      new(opts) {
        let handleData = opts && 'handleData' in opts ? opts.handleData : null;
        let handleError = opts && 'handleError' in opts ? opts.handleError : null;
        let handleDone = opts && 'handleDone' in opts ? opts.handleDone : null;
        super.new(dart.fn(outputSink => {
          if (handleData == null) handleData = async._StreamHandlerTransformer._defaultHandleData;
          if (handleError == null) handleError = async._StreamHandlerTransformer._defaultHandleError;
          if (handleDone == null) handleDone = async._StreamHandlerTransformer._defaultHandleDone;
          return new (_HandlerEventSinkOfS$T())(handleData, handleError, handleDone, outputSink);
        }, EventSinkOfTTo_HandlerEventSinkOfS$T()));
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return super.bind(stream);
      }
      static _defaultHandleData(data, sink) {
        sink.add(data);
      }
      static _defaultHandleError(error, stackTrace, sink) {
        sink.addError(error, stackTrace);
      }
      static _defaultHandleDone(sink) {
        sink.close();
      }
    }
    dart.setSignature(_StreamHandlerTransformer, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamHandlerTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})}),
      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])}),
      statics: () => ({
        _defaultHandleData: dart.definiteFunctionType(dart.void, [dart.dynamic, async.EventSink]),
        _defaultHandleError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, async.EventSink]),
        _defaultHandleDone: dart.definiteFunctionType(dart.void, [async.EventSink])
      }),
      names: ['_defaultHandleData', '_defaultHandleError', '_defaultHandleDone']
    });
    return _StreamHandlerTransformer;
  });
  async._StreamHandlerTransformer = _StreamHandlerTransformer();
  async._SubscriptionTransformer$ = dart.generic((S, T) => {
    const _SubscriptionTransformer = dart.typedef('_SubscriptionTransformer', () => dart.functionType(async.StreamSubscription$(T), [async.Stream$(S), core.bool]));
    return _SubscriptionTransformer;
  });
  async._SubscriptionTransformer = _SubscriptionTransformer();
  const _transformer = Symbol('_transformer');
  async._StreamSubscriptionTransformer$ = dart.generic((S, T) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _BoundSubscriptionStreamOfS$T = () => (_BoundSubscriptionStreamOfS$T = dart.constFn(async._BoundSubscriptionStream$(S, T)))();
    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
    let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
    class _StreamSubscriptionTransformer extends core.Object {
      new(transformer) {
        this[_transformer] = transformer;
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return new (_BoundSubscriptionStreamOfS$T())(stream, this[_transformer]);
      }
    }
    dart.addTypeTests(_StreamSubscriptionTransformer);
    _StreamSubscriptionTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
    dart.setSignature(_StreamSubscriptionTransformer, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamSubscriptionTransformer$(S, T), [_SubscriptionTransformerOfS$T()])}),
      fields: () => ({[_transformer]: _SubscriptionTransformerOfS$T()}),
      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
    });
    return _StreamSubscriptionTransformer;
  });
  async._StreamSubscriptionTransformer = _StreamSubscriptionTransformer();
  async._BoundSubscriptionStream$ = dart.generic((S, T) => {
    let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BoundSubscriptionStream extends async.Stream$(T) {
      new(stream, transformer) {
        this[_stream] = stream;
        this[_transformer] = transformer;
        super.new();
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        let result = this[_transformer](this[_stream], cancelOnError);
        result.onData(onData);
        result.onError(onError);
        result.onDone(onDone);
        return result;
      }
    }
    dart.setSignature(_BoundSubscriptionStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._BoundSubscriptionStream$(S, T), [StreamOfS(), _SubscriptionTransformerOfS$T()])}),
      fields: () => ({
        [_transformer]: _SubscriptionTransformerOfS$T(),
        [_stream]: StreamOfS()
      }),
      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
    });
    return _BoundSubscriptionStream;
  });
  async._BoundSubscriptionStream = _BoundSubscriptionStream();
  async.Timer = class Timer extends core.Object {
    static new(duration, callback) {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
        return async.Zone.current.createTimer(duration, callback);
      }
      return async.Zone.current.createTimer(duration, async.Zone.current.bindCallback(dart.dynamic)(callback, {runGuarded: true}));
    }
    static periodic(duration, callback) {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
        return async.Zone.current.createPeriodicTimer(duration, callback);
      }
      let boundCallback = async.Zone.current.bindUnaryCallback(dart.dynamic, async.Timer)(callback, {runGuarded: true});
      return async.Zone.current.createPeriodicTimer(duration, boundCallback);
    }
    static run(callback) {
      async.Timer.new(core.Duration.ZERO, callback);
    }
    static _createTimer(duration, callback) {
      let milliseconds = duration.inMilliseconds;
      if (dart.notNull(milliseconds) < 0) milliseconds = 0;
      return new _isolate_helper.TimerImpl(milliseconds, callback);
    }
    static _createPeriodicTimer(duration, callback) {
      let milliseconds = duration.inMilliseconds;
      if (dart.notNull(milliseconds) < 0) milliseconds = 0;
      return new _isolate_helper.TimerImpl.periodic(milliseconds, callback);
    }
  };
  dart.setSignature(async.Timer, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      periodic: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
    }),
    statics: () => ({
      run: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      _createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
    }),
    names: ['run', '_createTimer', '_createPeriodicTimer']
  });
  async.ZoneCallback$ = dart.generic(R => {
    const ZoneCallback = dart.typedef('ZoneCallback', () => dart.functionType(R, []));
    return ZoneCallback;
  });
  async.ZoneCallback = ZoneCallback();
  async.ZoneUnaryCallback$ = dart.generic((R, T) => {
    const ZoneUnaryCallback = dart.typedef('ZoneUnaryCallback', () => dart.functionType(R, [T]));
    return ZoneUnaryCallback;
  });
  async.ZoneUnaryCallback = ZoneUnaryCallback();
  async.ZoneBinaryCallback$ = dart.generic((R, T1, T2) => {
    const ZoneBinaryCallback = dart.typedef('ZoneBinaryCallback', () => dart.functionType(R, [T1, T2]));
    return ZoneBinaryCallback;
  });
  async.ZoneBinaryCallback = ZoneBinaryCallback();
  async.HandleUncaughtErrorHandler$ = dart.generic(R => {
    const HandleUncaughtErrorHandler = dart.typedef('HandleUncaughtErrorHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]));
    return HandleUncaughtErrorHandler;
  });
  async.HandleUncaughtErrorHandler = HandleUncaughtErrorHandler();
  async.RunHandler$ = dart.generic(R => {
    const RunHandler = dart.typedef('RunHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
    return RunHandler;
  });
  async.RunHandler = RunHandler();
  async.RunUnaryHandler$ = dart.generic((R, T) => {
    const RunUnaryHandler = dart.typedef('RunUnaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]));
    return RunUnaryHandler;
  });
  async.RunUnaryHandler = RunUnaryHandler();
  async.RunBinaryHandler$ = dart.generic((R, T1, T2) => {
    const RunBinaryHandler = dart.typedef('RunBinaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]));
    return RunBinaryHandler;
  });
  async.RunBinaryHandler = RunBinaryHandler();
  async.RegisterCallbackHandler$ = dart.generic(R => {
    const RegisterCallbackHandler = dart.typedef('RegisterCallbackHandler', () => dart.functionType(async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
    return RegisterCallbackHandler;
  });
  async.RegisterCallbackHandler = RegisterCallbackHandler();
  async.RegisterUnaryCallbackHandler$ = dart.generic((R, T) => {
    const RegisterUnaryCallbackHandler = dart.typedef('RegisterUnaryCallbackHandler', () => dart.functionType(async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]));
    return RegisterUnaryCallbackHandler;
  });
  async.RegisterUnaryCallbackHandler = RegisterUnaryCallbackHandler();
  async.RegisterBinaryCallbackHandler$ = dart.generic((R, T1, T2) => {
    const RegisterBinaryCallbackHandler = dart.typedef('RegisterBinaryCallbackHandler', () => dart.functionType(async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]));
    return RegisterBinaryCallbackHandler;
  });
  async.RegisterBinaryCallbackHandler = RegisterBinaryCallbackHandler();
  async.ErrorCallbackHandler = dart.typedef('ErrorCallbackHandler', () => dart.functionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace]));
  async.ScheduleMicrotaskHandler = dart.typedef('ScheduleMicrotaskHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTovoid()]));
  async.CreateTimerHandler = dart.typedef('CreateTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()]));
  async.CreatePeriodicTimerHandler = dart.typedef('CreatePeriodicTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()]));
  async.PrintHandler = dart.typedef('PrintHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String]));
  async.ForkHandler = dart.typedef('ForkHandler', () => dart.functionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map]));
  async._ZoneFunction$ = dart.generic(T => {
    class _ZoneFunction extends core.Object {
      new(zone, func) {
        this.zone = zone;
        this.function = func;
      }
    }
    dart.addTypeTests(_ZoneFunction);
    dart.setSignature(_ZoneFunction, {
      constructors: () => ({new: dart.definiteFunctionType(async._ZoneFunction$(T), [async._Zone, T])}),
      fields: () => ({
        zone: async._Zone,
        function: T
      })
    });
    return _ZoneFunction;
  });
  async._ZoneFunction = _ZoneFunction();
  async.ZoneSpecification = class ZoneSpecification extends core.Object {
    static new(opts) {
      return new async._ZoneSpecification(opts);
    }
    static from(other, opts) {
      let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
      let run = opts && 'run' in opts ? opts.run : null;
      let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
      let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
      let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
      let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
      let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
      let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
      let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
      let print = opts && 'print' in opts ? opts.print : null;
      let fork = opts && 'fork' in opts ? opts.fork : null;
      return async.ZoneSpecification.new({handleUncaughtError: (handleUncaughtError != null ? handleUncaughtError : other.handleUncaughtError), run: (run != null ? run : other.run), runUnary: (runUnary != null ? runUnary : other.runUnary), runBinary: (runBinary != null ? runBinary : other.runBinary), registerCallback: (registerCallback != null ? registerCallback : other.registerCallback), registerUnaryCallback: (registerUnaryCallback != null ? registerUnaryCallback : other.registerUnaryCallback), registerBinaryCallback: (registerBinaryCallback != null ? registerBinaryCallback : other.registerBinaryCallback), errorCallback: (errorCallback != null ? errorCallback : other.errorCallback), scheduleMicrotask: (scheduleMicrotask != null ? scheduleMicrotask : other.scheduleMicrotask), createTimer: (createTimer != null ? createTimer : other.createTimer), createPeriodicTimer: (createPeriodicTimer != null ? createPeriodicTimer : other.createPeriodicTimer), print: (print != null ? print : other.print), fork: (fork != null ? fork : other.fork)});
    }
  };
  dart.setSignature(async.ZoneSpecification, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler}),
      from: dart.definiteFunctionType(async.ZoneSpecification, [async.ZoneSpecification], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})
    })
  });
  async._ZoneSpecification = class _ZoneSpecification extends core.Object {
    new(opts) {
      let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
      let run = opts && 'run' in opts ? opts.run : null;
      let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
      let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
      let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
      let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
      let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
      let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
      let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
      let print = opts && 'print' in opts ? opts.print : null;
      let fork = opts && 'fork' in opts ? opts.fork : null;
      this.handleUncaughtError = handleUncaughtError;
      this.run = run;
      this.runUnary = runUnary;
      this.runBinary = runBinary;
      this.registerCallback = registerCallback;
      this.registerUnaryCallback = registerUnaryCallback;
      this.registerBinaryCallback = registerBinaryCallback;
      this.errorCallback = errorCallback;
      this.scheduleMicrotask = scheduleMicrotask;
      this.createTimer = createTimer;
      this.createPeriodicTimer = createPeriodicTimer;
      this.print = print;
      this.fork = fork;
    }
  };
  async._ZoneSpecification[dart.implements] = () => [async.ZoneSpecification];
  dart.setSignature(async._ZoneSpecification, {
    constructors: () => ({new: dart.definiteFunctionType(async._ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})}),
    fields: () => ({
      handleUncaughtError: async.HandleUncaughtErrorHandler,
      run: async.RunHandler,
      runUnary: async.RunUnaryHandler,
      runBinary: async.RunBinaryHandler,
      registerCallback: async.RegisterCallbackHandler,
      registerUnaryCallback: async.RegisterUnaryCallbackHandler,
      registerBinaryCallback: async.RegisterBinaryCallbackHandler,
      errorCallback: async.ErrorCallbackHandler,
      scheduleMicrotask: async.ScheduleMicrotaskHandler,
      createTimer: async.CreateTimerHandler,
      createPeriodicTimer: async.CreatePeriodicTimerHandler,
      print: async.PrintHandler,
      fork: async.ForkHandler
    })
  });
  async.ZoneDelegate = class ZoneDelegate extends core.Object {};
  async.Zone = class Zone extends core.Object {
    _() {
    }
    static get current() {
      return async.Zone._current;
    }
    static _enter(zone) {
      dart.assert(zone != null);
      dart.assert(!core.identical(zone, async.Zone._current));
      let previous = async.Zone._current;
      async.Zone._current = zone;
      return previous;
    }
    static _leave(previous) {
      dart.assert(previous != null);
      async.Zone._current = previous;
    }
  };
  dart.defineNamedConstructor(async.Zone, '_');
  dart.setSignature(async.Zone, {
    constructors: () => ({_: dart.definiteFunctionType(async.Zone, [])}),
    sfields: () => ({
      ROOT: async.Zone,
      _current: async.Zone
    }),
    sgetters: () => ({current: dart.definiteFunctionType(async.Zone, [])}),
    statics: () => ({
      _enter: dart.definiteFunctionType(async.Zone, [async.Zone]),
      _leave: dart.definiteFunctionType(dart.void, [async.Zone])
    }),
    names: ['_enter', '_leave']
  });
  dart.defineLazy(async.Zone, {
    get ROOT() {
      return async._ROOT_ZONE;
    },
    get _current() {
      return async._ROOT_ZONE;
    },
    set _current(_) {}
  });
  const _delegate = Symbol('_delegate');
  async._parentDelegate = function(zone) {
    if (zone.parent == null) return null;
    return zone.parent[_delegate];
  };
  dart.lazyFn(async._parentDelegate, () => _ZoneToZoneDelegate());
  const _delegationTarget = Symbol('_delegationTarget');
  const _handleUncaughtError = Symbol('_handleUncaughtError');
  const _run = Symbol('_run');
  const _runUnary = Symbol('_runUnary');
  const _runBinary = Symbol('_runBinary');
  const _registerCallback = Symbol('_registerCallback');
  const _registerUnaryCallback = Symbol('_registerUnaryCallback');
  const _registerBinaryCallback = Symbol('_registerBinaryCallback');
  const _errorCallback = Symbol('_errorCallback');
  const _createTimer = Symbol('_createTimer');
  const _createPeriodicTimer = Symbol('_createPeriodicTimer');
  const _print = Symbol('_print');
  const _fork = Symbol('_fork');
  async._ZoneDelegate = class _ZoneDelegate extends core.Object {
    new(delegationTarget) {
      this[_delegationTarget] = delegationTarget;
    }
    handleUncaughtError(R) {
      return (zone, error, stackTrace) => {
        let implementation = this[_delegationTarget][_handleUncaughtError];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, error, stackTrace));
      };
    }
    run(R) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_run];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    runUnary(R, T) {
      return (zone, f, arg) => {
        let implementation = this[_delegationTarget][_runUnary];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg));
      };
    }
    runBinary(R, T1, T2) {
      return (zone, f, arg1, arg2) => {
        let implementation = this[_delegationTarget][_runBinary];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg1, arg2));
      };
    }
    registerCallback(R) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_registerCallback];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return async.ZoneCallback$(R).as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    registerUnaryCallback(R, T) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_registerUnaryCallback];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return async.ZoneUnaryCallback$(R, T).as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    registerBinaryCallback(R, T1, T2) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_registerBinaryCallback];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    errorCallback(zone, error, stackTrace) {
      let implementation = this[_delegationTarget][_errorCallback];
      let implZone = implementation.zone;
      if (core.identical(implZone, async._ROOT_ZONE)) return null;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
    }
    scheduleMicrotask(zone, f) {
      let implementation = this[_delegationTarget][_scheduleMicrotask];
      let implZone = implementation.zone;
      let handler = implementation.function;
      handler(implZone, async._parentDelegate(implZone), zone, f);
    }
    createTimer(zone, duration, f) {
      let implementation = this[_delegationTarget][_createTimer];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, duration, f);
    }
    createPeriodicTimer(zone, period, f) {
      let implementation = this[_delegationTarget][_createPeriodicTimer];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, period, f);
    }
    print(zone, line) {
      let implementation = this[_delegationTarget][_print];
      let implZone = implementation.zone;
      let handler = implementation.function;
      handler(implZone, async._parentDelegate(implZone), zone, line);
    }
    fork(zone, specification, zoneValues) {
      let implementation = this[_delegationTarget][_fork];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, specification, zoneValues);
    }
  };
  async._ZoneDelegate[dart.implements] = () => [async.ZoneDelegate];
  dart.setSignature(async._ZoneDelegate, {
    constructors: () => ({new: dart.definiteFunctionType(async._ZoneDelegate, [async._Zone])}),
    fields: () => ({[_delegationTarget]: async._Zone}),
    methods: () => ({
      handleUncaughtError: dart.definiteFunctionType(R => [R, [async.Zone, dart.dynamic, core.StackTrace]]),
      run: dart.definiteFunctionType(R => [R, [async.Zone, dart.functionType(R, [])]]),
      runUnary: dart.definiteFunctionType((R, T) => [R, [async.Zone, dart.functionType(R, [T]), T]]),
      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, dart.functionType(R, [T1, T2]), T1, T2]]),
      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, dart.functionType(R, [])]]),
      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, dart.functionType(R, [T])]]),
      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, dart.functionType(R, [T1, T2])]]),
      errorCallback: dart.definiteFunctionType(async.AsyncError, [async.Zone, core.Object, core.StackTrace]),
      scheduleMicrotask: dart.definiteFunctionType(dart.void, [async.Zone, VoidTodynamic()]),
      createTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, VoidTovoid()]),
      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, TimerTovoid()]),
      print: dart.definiteFunctionType(dart.void, [async.Zone, core.String]),
      fork: dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
    })
  });
  const _map$ = Symbol('_map');
  async._Zone = class _Zone extends core.Object {
    new() {
    }
    inSameErrorZone(otherZone) {
      return core.identical(this, otherZone) || core.identical(this.errorZone, otherZone.errorZone);
    }
  };
  async._Zone[dart.implements] = () => [async.Zone];
  dart.setSignature(async._Zone, {
    constructors: () => ({new: dart.definiteFunctionType(async._Zone, [])}),
    methods: () => ({inSameErrorZone: dart.definiteFunctionType(core.bool, [async.Zone])})
  });
  const _delegateCache = Symbol('_delegateCache');
  async._CustomZone = class _CustomZone extends async._Zone {
    get [_delegate]() {
      if (this[_delegateCache] != null) return this[_delegateCache];
      this[_delegateCache] = new async._ZoneDelegate(this);
      return this[_delegateCache];
    }
    new(parent, specification, map) {
      this.parent = parent;
      this[_map$] = map;
      this[_run] = null;
      this[_runUnary] = null;
      this[_runBinary] = null;
      this[_registerCallback] = null;
      this[_registerUnaryCallback] = null;
      this[_registerBinaryCallback] = null;
      this[_errorCallback] = null;
      this[_scheduleMicrotask] = null;
      this[_createTimer] = null;
      this[_createPeriodicTimer] = null;
      this[_print] = null;
      this[_fork] = null;
      this[_handleUncaughtError] = null;
      this[_delegateCache] = null;
      super.new();
      this[_run] = specification.run != null ? new (_ZoneFunctionOfRunHandler())(this, specification.run) : this.parent[_run];
      this[_runUnary] = specification.runUnary != null ? new (_ZoneFunctionOfRunUnaryHandler())(this, specification.runUnary) : this.parent[_runUnary];
      this[_runBinary] = specification.runBinary != null ? new (_ZoneFunctionOfRunBinaryHandler())(this, specification.runBinary) : this.parent[_runBinary];
      this[_registerCallback] = specification.registerCallback != null ? new (_ZoneFunctionOfRegisterCallbackHandler())(this, specification.registerCallback) : this.parent[_registerCallback];
      this[_registerUnaryCallback] = specification.registerUnaryCallback != null ? new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(this, specification.registerUnaryCallback) : this.parent[_registerUnaryCallback];
      this[_registerBinaryCallback] = specification.registerBinaryCallback != null ? new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(this, specification.registerBinaryCallback) : this.parent[_registerBinaryCallback];
      this[_errorCallback] = specification.errorCallback != null ? new (_ZoneFunctionOfErrorCallbackHandler())(this, specification.errorCallback) : this.parent[_errorCallback];
      this[_scheduleMicrotask] = specification.scheduleMicrotask != null ? new (_ZoneFunctionOfScheduleMicrotaskHandler())(this, specification.scheduleMicrotask) : this.parent[_scheduleMicrotask];
      this[_createTimer] = specification.createTimer != null ? new (_ZoneFunctionOfCreateTimerHandler())(this, specification.createTimer) : this.parent[_createTimer];
      this[_createPeriodicTimer] = specification.createPeriodicTimer != null ? new (_ZoneFunctionOfCreatePeriodicTimerHandler())(this, specification.createPeriodicTimer) : this.parent[_createPeriodicTimer];
      this[_print] = specification.print != null ? new (_ZoneFunctionOfPrintHandler())(this, specification.print) : this.parent[_print];
      this[_fork] = specification.fork != null ? new (_ZoneFunctionOfForkHandler())(this, specification.fork) : this.parent[_fork];
      this[_handleUncaughtError] = specification.handleUncaughtError != null ? new (_ZoneFunctionOfHandleUncaughtErrorHandler())(this, specification.handleUncaughtError) : this.parent[_handleUncaughtError];
    }
    get errorZone() {
      return this[_handleUncaughtError].zone;
    }
    runGuarded(R) {
      return f => {
        try {
          return this.run(R)(f);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runUnaryGuarded(R, T) {
      return (f, arg) => {
        try {
          return this.runUnary(R, T)(f, arg);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runBinaryGuarded(R, T1, T2) {
      return (f, arg1, arg2) => {
        try {
          return this.runBinary(R, T1, T2)(f, arg1, arg2);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    bindCallback(R) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        let registered = this.registerCallback(R)(f);
        if (dart.test(runGuarded)) {
          return dart.fn(() => this.runGuarded(R)(registered), dart.definiteFunctionType(R, []));
        } else {
          return dart.fn(() => this.run(R)(registered), dart.definiteFunctionType(R, []));
        }
      };
    }
    bindUnaryCallback(R, T) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        let registered = this.registerUnaryCallback(R, T)(f);
        if (dart.test(runGuarded)) {
          return dart.fn(arg => this.runUnaryGuarded(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
        } else {
          return dart.fn(arg => this.runUnary(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
        }
      };
    }
    bindBinaryCallback(R, T1, T2) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        let registered = this.registerBinaryCallback(R, T1, T2)(f);
        if (dart.test(runGuarded)) {
          return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        } else {
          return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        }
      };
    }
    _get(key) {
      let result = this[_map$][dartx._get](key);
      if (result != null || dart.test(this[_map$][dartx.containsKey](key))) return result;
      if (this.parent != null) {
        let value = this.parent._get(key);
        if (value != null) {
          this[_map$][dartx._set](key, value);
        }
        return value;
      }
      dart.assert(dart.equals(this, async._ROOT_ZONE));
      return null;
    }
    handleUncaughtError(R) {
      return (error, stackTrace) => {
        let implementation = this[_handleUncaughtError];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, error, stackTrace));
      };
    }
    fork(opts) {
      let specification = opts && 'specification' in opts ? opts.specification : null;
      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
      let implementation = this[_fork];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, specification, zoneValues);
    }
    run(R) {
      return f => {
        let implementation = this[_run];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(handler(implementation.zone, parentDelegate, this, f));
      };
    }
    runUnary(R, T) {
      return (f, arg) => {
        let implementation = this[_runUnary];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg));
      };
    }
    runBinary(R, T1, T2) {
      return (f, arg1, arg2) => {
        let implementation = this[_runBinary];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg1, arg2));
      };
    }
    registerCallback(R) {
      return callback => {
        let implementation = this[_registerCallback];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return async.ZoneCallback$(R).as(handler(implementation.zone, parentDelegate, this, callback));
      };
    }
    registerUnaryCallback(R, T) {
      return callback => {
        let implementation = this[_registerUnaryCallback];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return async.ZoneUnaryCallback$(R, T).as(handler(implementation.zone, parentDelegate, this, callback));
      };
    }
    registerBinaryCallback(R, T1, T2) {
      return callback => {
        let implementation = this[_registerBinaryCallback];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implementation.zone, parentDelegate, this, callback));
      };
    }
    errorCallback(error, stackTrace) {
      let implementation = this[_errorCallback];
      dart.assert(implementation != null);
      let implementationZone = implementation.zone;
      if (core.identical(implementationZone, async._ROOT_ZONE)) return null;
      let parentDelegate = async._parentDelegate(async._Zone._check(implementationZone));
      let handler = implementation.function;
      return handler(implementationZone, parentDelegate, this, error, stackTrace);
    }
    scheduleMicrotask(f) {
      let implementation = this[_scheduleMicrotask];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, f);
    }
    createTimer(duration, f) {
      let implementation = this[_createTimer];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, duration, f);
    }
    createPeriodicTimer(duration, f) {
      let implementation = this[_createPeriodicTimer];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, duration, f);
    }
    print(line) {
      let implementation = this[_print];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, line);
    }
  };
  dart.setSignature(async._CustomZone, {
    constructors: () => ({new: dart.definiteFunctionType(async._CustomZone, [async._Zone, async.ZoneSpecification, core.Map])}),
    fields: () => ({
      [_run]: _ZoneFunctionOfRunHandler(),
      [_runUnary]: _ZoneFunctionOfRunUnaryHandler(),
      [_runBinary]: _ZoneFunctionOfRunBinaryHandler(),
      [_registerCallback]: _ZoneFunctionOfRegisterCallbackHandler(),
      [_registerUnaryCallback]: _ZoneFunctionOfRegisterUnaryCallbackHandler(),
      [_registerBinaryCallback]: _ZoneFunctionOfRegisterBinaryCallbackHandler(),
      [_errorCallback]: _ZoneFunctionOfErrorCallbackHandler(),
      [_scheduleMicrotask]: _ZoneFunctionOfScheduleMicrotaskHandler(),
      [_createTimer]: _ZoneFunctionOfCreateTimerHandler(),
      [_createPeriodicTimer]: _ZoneFunctionOfCreatePeriodicTimerHandler(),
      [_print]: _ZoneFunctionOfPrintHandler(),
      [_fork]: _ZoneFunctionOfForkHandler(),
      [_handleUncaughtError]: _ZoneFunctionOfHandleUncaughtErrorHandler(),
      [_delegateCache]: async.ZoneDelegate,
      parent: async._Zone,
      [_map$]: core.Map
    }),
    getters: () => ({
      [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
      errorZone: dart.definiteFunctionType(async.Zone, [])
    }),
    methods: () => ({
      runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
      bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
      bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
      fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
      run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
      errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
      scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
      print: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  async._rootHandleUncaughtError = function(R) {
    return (self, parent, zone, error, stackTrace) => {
      async._schedulePriorityAsyncCallback(dart.fn(() => {
        if (error == null) error = new core.NullThrownError();
        if (stackTrace == null) dart.throw(error);
        async._rethrow(error, stackTrace);
      }, VoidTovoid$()));
    };
  };
  dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
  async._rethrow = function(error, stackTrace) {
    error.stack = dart.toString(stackTrace);
    throw error;
  };
  dart.lazyFn(async._rethrow, () => ObjectAndStackTraceTovoid());
  async._rootRun = function(R) {
    return (self, parent, zone, f) => {
      if (dart.equals(async.Zone._current, zone)) return f();
      let old = async.Zone._enter(zone);
      try {
        return f();
      } finally {
        async.Zone._leave(old);
      }
    };
  };
  dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR$());
  async._rootRunUnary = function(R, T) {
    return (self, parent, zone, f, arg) => {
      if (dart.equals(async.Zone._current, zone)) return f(arg);
      let old = async.Zone._enter(zone);
      try {
        return f(arg);
      } finally {
        async.Zone._leave(old);
      }
    };
  };
  dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$0());
  async._rootRunBinary = function(R, T1, T2) {
    return (self, parent, zone, f, arg1, arg2) => {
      if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
      let old = async.Zone._enter(zone);
      try {
        return f(arg1, arg2);
      } finally {
        async.Zone._leave(old);
      }
    };
  };
  dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$1());
  async._rootRegisterCallback = function(R) {
    return (self, parent, zone, f) => {
      return f;
    };
  };
  dart.fn(async._rootRegisterCallback, ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR());
  async._rootRegisterUnaryCallback = function(R, T) {
    return (self, parent, zone, f) => {
      return f;
    };
  };
  dart.fn(async._rootRegisterUnaryCallback, ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T());
  async._rootRegisterBinaryCallback = function(R, T1, T2) {
    return (self, parent, zone, f) => {
      return f;
    };
  };
  dart.fn(async._rootRegisterBinaryCallback, ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2());
  async._rootErrorCallback = function(self, parent, zone, error, stackTrace) {
    return null;
  };
  dart.lazyFn(async._rootErrorCallback, () => ZoneAndZoneDelegateAndZone__ToAsyncError());
  async._rootScheduleMicrotask = function(self, parent, zone, f) {
    if (!core.identical(async._ROOT_ZONE, zone)) {
      let hasErrorHandler = !dart.test(async._ROOT_ZONE.inSameErrorZone(zone));
      f = zone.bindCallback(dart.dynamic)(f, {runGuarded: hasErrorHandler});
      zone = async._ROOT_ZONE;
    }
    async._scheduleAsyncCallback(f);
  };
  dart.fn(async._rootScheduleMicrotask, ZoneAndZoneDelegateAndZone__Tovoid());
  async._rootCreateTimer = function(self, parent, zone, duration, callback) {
    if (!core.identical(async._ROOT_ZONE, zone)) {
      callback = zone.bindCallback(dart.dynamic)(callback);
    }
    return async.Timer._createTimer(duration, callback);
  };
  dart.lazyFn(async._rootCreateTimer, () => ZoneAndZoneDelegateAndZone__ToTimer());
  async._rootCreatePeriodicTimer = function(self, parent, zone, duration, callback) {
    if (!core.identical(async._ROOT_ZONE, zone)) {
      callback = zone.bindUnaryCallback(dart.dynamic, async.Timer)(callback);
    }
    return async.Timer._createPeriodicTimer(duration, callback);
  };
  dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer$());
  async._rootPrint = function(self, parent, zone, line) {
    _internal.printToConsole(line);
  };
  dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid$());
  async._printToZone = function(line) {
    async.Zone.current.print(line);
  };
  dart.lazyFn(async._printToZone, () => StringTovoid$());
  let const$11;
  async._rootFork = function(self, parent, zone, specification, zoneValues) {
    _internal.printToZone = async._printToZone;
    if (specification == null) {
      specification = const$11 || (const$11 = dart.const(async.ZoneSpecification.new()));
    } else if (!async._ZoneSpecification.is(specification)) {
      dart.throw(new core.ArgumentError("ZoneSpecifications must be instantiated" + " with the provided constructor."));
    }
    let valueMap = null;
    if (zoneValues == null) {
      if (async._Zone.is(zone)) {
        valueMap = zone[_map$];
      } else {
        valueMap = collection.HashMap.new();
      }
    } else {
      valueMap = collection.HashMap.from(zoneValues);
    }
    return new async._CustomZone(async._Zone._check(zone), specification, valueMap);
  };
  dart.lazyFn(async._rootFork, () => ZoneAndZoneDelegateAndZone__ToZone());
  let const$12;
  let const$13;
  let const$14;
  let const$15;
  let const$16;
  let const$17;
  let const$18;
  let const$19;
  let const$20;
  let const$21;
  let const$22;
  let const$23;
  let const$24;
  async._RootZone = class _RootZone extends async._Zone {
    new() {
      super.new();
    }
    get [_run]() {
      return const$12 || (const$12 = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
    }
    get [_runUnary]() {
      return const$13 || (const$13 = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
    }
    get [_runBinary]() {
      return const$14 || (const$14 = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
    }
    get [_registerCallback]() {
      return const$15 || (const$15 = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
    }
    get [_registerUnaryCallback]() {
      return const$16 || (const$16 = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
    }
    get [_registerBinaryCallback]() {
      return const$17 || (const$17 = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
    }
    get [_errorCallback]() {
      return const$18 || (const$18 = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
    }
    get [_scheduleMicrotask]() {
      return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
    }
    get [_createTimer]() {
      return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
    }
    get [_createPeriodicTimer]() {
      return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
    }
    get [_print]() {
      return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
    }
    get [_fork]() {
      return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
    }
    get [_handleUncaughtError]() {
      return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
    }
    get parent() {
      return null;
    }
    get [_map$]() {
      return async._RootZone._rootMap;
    }
    get [_delegate]() {
      if (async._RootZone._rootDelegate != null) return async._RootZone._rootDelegate;
      return async._RootZone._rootDelegate = new async._ZoneDelegate(this);
    }
    get errorZone() {
      return this;
    }
    runGuarded(R) {
      return f => {
        try {
          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
            return f();
          }
          return async._rootRun(R)(null, null, this, f);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runUnaryGuarded(R, T) {
      return (f, arg) => {
        try {
          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
            return f(arg);
          }
          return async._rootRunUnary(R, T)(null, null, this, f, arg);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runBinaryGuarded(R, T1, T2) {
      return (f, arg1, arg2) => {
        try {
          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
            return f(arg1, arg2);
          }
          return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    bindCallback(R) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        if (dart.test(runGuarded)) {
          return dart.fn(() => this.runGuarded(R)(f), dart.definiteFunctionType(R, []));
        } else {
          return dart.fn(() => this.run(R)(f), dart.definiteFunctionType(R, []));
        }
      };
    }
    bindUnaryCallback(R, T) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        if (dart.test(runGuarded)) {
          return dart.fn(arg => this.runUnaryGuarded(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
        } else {
          return dart.fn(arg => this.runUnary(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
        }
      };
    }
    bindBinaryCallback(R, T1, T2) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        if (dart.test(runGuarded)) {
          return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        } else {
          return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        }
      };
    }
    _get(key) {
      return null;
    }
    handleUncaughtError(R) {
      return (error, stackTrace) => {
        return async._rootHandleUncaughtError(R)(null, null, this, error, stackTrace);
      };
    }
    fork(opts) {
      let specification = opts && 'specification' in opts ? opts.specification : null;
      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
      return async._rootFork(null, null, this, specification, zoneValues);
    }
    run(R) {
      return f => {
        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f();
        return async._rootRun(R)(null, null, this, f);
      };
    }
    runUnary(R, T) {
      return (f, arg) => {
        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg);
        return async._rootRunUnary(R, T)(null, null, this, f, arg);
      };
    }
    runBinary(R, T1, T2) {
      return (f, arg1, arg2) => {
        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg1, arg2);
        return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
      };
    }
    registerCallback(R) {
      return f => {
        return f;
      };
    }
    registerUnaryCallback(R, T) {
      return f => {
        return f;
      };
    }
    registerBinaryCallback(R, T1, T2) {
      return f => {
        return f;
      };
    }
    errorCallback(error, stackTrace) {
      return null;
    }
    scheduleMicrotask(f) {
      async._rootScheduleMicrotask(null, null, this, f);
    }
    createTimer(duration, f) {
      return async.Timer._createTimer(duration, f);
    }
    createPeriodicTimer(duration, f) {
      return async.Timer._createPeriodicTimer(duration, f);
    }
    print(line) {
      _internal.printToConsole(line);
    }
  };
  dart.setSignature(async._RootZone, {
    constructors: () => ({new: dart.definiteFunctionType(async._RootZone, [])}),
    getters: () => ({
      [_run]: dart.definiteFunctionType(async._ZoneFunction$(async.RunHandler), []),
      [_runUnary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunUnaryHandler), []),
      [_runBinary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunBinaryHandler), []),
      [_registerCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterCallbackHandler), []),
      [_registerUnaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterUnaryCallbackHandler), []),
      [_registerBinaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterBinaryCallbackHandler), []),
      [_errorCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.ErrorCallbackHandler), []),
      [_scheduleMicrotask]: dart.definiteFunctionType(async._ZoneFunction$(async.ScheduleMicrotaskHandler), []),
      [_createTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreateTimerHandler), []),
      [_createPeriodicTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreatePeriodicTimerHandler), []),
      [_print]: dart.definiteFunctionType(async._ZoneFunction$(async.PrintHandler), []),
      [_fork]: dart.definiteFunctionType(async._ZoneFunction$(async.ForkHandler), []),
      [_handleUncaughtError]: dart.definiteFunctionType(async._ZoneFunction$(async.HandleUncaughtErrorHandler), []),
      parent: dart.definiteFunctionType(async._Zone, []),
      [_map$]: dart.definiteFunctionType(core.Map, []),
      [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
      errorZone: dart.definiteFunctionType(async.Zone, [])
    }),
    methods: () => ({
      runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
      bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
      bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
      fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
      run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
      errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
      scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
      print: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sfields: () => ({
      _rootMap: core.Map,
      _rootDelegate: async.ZoneDelegate
    })
  });
  async._RootZone._rootDelegate = null;
  dart.defineLazy(async._RootZone, {
    get _rootMap() {
      return collection.HashMap.new();
    },
    set _rootMap(_) {}
  });
  async._ROOT_ZONE = dart.const(new async._RootZone());
  async.runZoned = function(R) {
    return (body, opts) => {
      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
      let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let errorHandler = null;
      if (onError != null) {
        errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
          try {
            if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
              return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
            }
            return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
          } catch (e) {
            let s = dart.stackTrace(e);
            if (core.identical(e, error)) {
              return parent.handleUncaughtError(dart.dynamic)(zone, error, stackTrace);
            } else {
              return parent.handleUncaughtError(dart.dynamic)(zone, e, s);
            }
          }

        }, ZoneAndZoneDelegateAndZone__Todynamic());
      }
      if (zoneSpecification == null) {
        zoneSpecification = async.ZoneSpecification.new({handleUncaughtError: errorHandler});
      } else if (errorHandler != null) {
        zoneSpecification = async.ZoneSpecification.from(zoneSpecification, {handleUncaughtError: errorHandler});
      }
      let zone = async.Zone.current.fork({specification: zoneSpecification, zoneValues: zoneValues});
      if (onError != null) {
        return zone.runGuarded(R)(body);
      } else {
        return zone.run(R)(body);
      }
    };
  };
  dart.lazyFn(async.runZoned, () => Fn__ToR());
  collection._USE_ES6_MAPS = true;
  const _length$1 = Symbol('_length');
  const _strings$ = Symbol('_strings');
  const _nums$ = Symbol('_nums');
  const _rest$ = Symbol('_rest');
  const _keys = Symbol('_keys');
  const _containsKey = Symbol('_containsKey');
  const _getBucket$ = Symbol('_getBucket');
  const _findBucketIndex = Symbol('_findBucketIndex');
  const _computeKeys = Symbol('_computeKeys');
  const _get = Symbol('_get');
  const _addHashTableEntry$ = Symbol('_addHashTableEntry');
  const _set = Symbol('_set');
  const _computeHashCode = Symbol('_computeHashCode');
  const _removeHashTableEntry$ = Symbol('_removeHashTableEntry');
  const _remove = Symbol('_remove');
  collection._HashMap$ = dart.generic((K, V) => {
    let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
    let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
    let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    class _HashMap extends core.Object {
      new() {
        this[_length$1] = 0;
        this[_strings$] = null;
        this[_nums$] = null;
        this[_rest$] = null;
        this[_keys] = null;
      }
      get length() {
        return this[_length$1];
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      get keys() {
        return new (_HashMapKeyIterableOfK())(this);
      }
      get values() {
        return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
      }
      containsKey(key) {
        if (dart.test(collection._HashMap._isStringKey(key))) {
          let strings = this[_strings$];
          return strings == null ? false : collection._HashMap._hasTableEntry(strings, key);
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          let nums = this[_nums$];
          return nums == null ? false : collection._HashMap._hasTableEntry(nums, key);
        } else {
          return this[_containsKey](key);
        }
      }
      [_containsKey](key) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, key);
        return dart.notNull(this[_findBucketIndex](bucket, key)) >= 0;
      }
      containsValue(value) {
        return this[_computeKeys]()[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      _get(key) {
        if (dart.test(collection._HashMap._isStringKey(key))) {
          let strings = this[_strings$];
          return V._check(strings == null ? null : collection._HashMap._getTableEntry(strings, key));
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          let nums = this[_nums$];
          return V._check(nums == null ? null : collection._HashMap._getTableEntry(nums, key));
        } else {
          return this[_get](key);
        }
      }
      [_get](key) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, key);
        let index = this[_findBucketIndex](bucket, key);
        return V._check(dart.notNull(index) < 0 ? null : bucket[dart.notNull(index) + 1]);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        if (dart.test(collection._HashMap._isStringKey(key))) {
          let strings = this[_strings$];
          if (strings == null) this[_strings$] = strings = collection._HashMap._newHashTable();
          this[_addHashTableEntry$](strings, key, value);
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          let nums = this[_nums$];
          if (nums == null) this[_nums$] = nums = collection._HashMap._newHashTable();
          this[_addHashTableEntry$](nums, key, value);
        } else {
          this[_set](key, value);
        }
        return value;
      }
      [_set](key, value) {
        K._check(key);
        V._check(value);
        let rest = this[_rest$];
        if (rest == null) this[_rest$] = rest = collection._HashMap._newHashTable();
        let hash = this[_computeHashCode](key);
        let bucket = rest[hash];
        if (bucket == null) {
          collection._HashMap._setTableEntry(rest, hash, [key, value]);
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          this[_keys] = null;
        } else {
          let index = this[_findBucketIndex](bucket, key);
          if (dart.notNull(index) >= 0) {
            bucket[dart.notNull(index) + 1] = value;
          } else {
            bucket.push(key, value);
            this[_length$1] = dart.notNull(this[_length$1]) + 1;
            this[_keys] = null;
          }
        }
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) return this._get(key);
        let value = ifAbsent();
        this._set(key, value);
        return value;
      }
      remove(key) {
        if (dart.test(collection._HashMap._isStringKey(key))) {
          return this[_removeHashTableEntry$](this[_strings$], key);
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          return this[_removeHashTableEntry$](this[_nums$], key);
        } else {
          return this[_remove](key);
        }
      }
      [_remove](key) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, key);
        let index = this[_findBucketIndex](bucket, key);
        if (dart.notNull(index) < 0) return null;
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_keys] = null;
        return bucket.splice(index, 2)[1];
      }
      clear() {
        if (dart.notNull(this[_length$1]) > 0) {
          this[_strings$] = this[_nums$] = this[_rest$] = this[_keys] = null;
          this[_length$1] = 0;
        }
      }
      forEach(action) {
        let keys = this[_computeKeys]();
        for (let i = 0, length = keys[dartx.length]; i < dart.notNull(length); i++) {
          let key = keys[i];
          action(K._check(key), this._get(key));
          if (keys !== this[_keys]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      [_computeKeys]() {
        if (this[_keys] != null) return this[_keys];
        let result = ListOfK().new(this[_length$1]);
        let index = 0;
        let strings = this[_strings$];
        if (strings != null) {
          let names = Object.getOwnPropertyNames(strings);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let key = names[i];
            result[index] = key;
            index++;
          }
        }
        let nums = this[_nums$];
        if (nums != null) {
          let names = Object.getOwnPropertyNames(nums);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let key = +names[i];
            result[index] = key;
            index++;
          }
        }
        let rest = this[_rest$];
        if (rest != null) {
          let names = Object.getOwnPropertyNames(rest);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let key = names[i];
            let bucket = rest[key];
            let length = bucket.length;
            for (let i = 0; i < length; i = i + 2) {
              let key = bucket[i];
              result[index] = key;
              index++;
            }
          }
        }
        dart.assert(index == this[_length$1]);
        return this[_keys] = result;
      }
      [_addHashTableEntry$](table, key, value) {
        K._check(key);
        V._check(value);
        if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          this[_keys] = null;
        }
        collection._HashMap._setTableEntry(table, key, value);
      }
      [_removeHashTableEntry$](table, key) {
        if (table != null && dart.test(collection._HashMap._hasTableEntry(table, key))) {
          let value = V._check(collection._HashMap._getTableEntry(table, key));
          collection._HashMap._deleteTableEntry(table, key);
          this[_length$1] = dart.notNull(this[_length$1]) - 1;
          this[_keys] = null;
          return value;
        } else {
          return null;
        }
      }
      static _isStringKey(key) {
        return typeof key == 'string' && key != '__proto__';
      }
      static _isNumericKey(key) {
        return typeof key == 'number' && (key & 0x3ffffff) === key;
      }
      [_computeHashCode](key) {
        return dart.hashCode(key) & 0x3ffffff;
      }
      static _hasTableEntry(table, key) {
        let entry = table[key];
        return entry != null;
      }
      static _getTableEntry(table, key) {
        let entry = table[key];
        return entry === table ? null : entry;
      }
      static _setTableEntry(table, key, value) {
        if (value == null) {
          table[key] = table;
        } else {
          table[key] = value;
        }
      }
      static _deleteTableEntry(table, key) {
        delete table[key];
      }
      [_getBucket$](table, key) {
        let hash = this[_computeHashCode](key);
        return table[hash];
      }
      [_findBucketIndex](bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i = i + 2) {
          if (dart.equals(bucket[i], key)) return i;
        }
        return -1;
      }
      static _newHashTable() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        collection._HashMap._setTableEntry(table, temporaryKey, table);
        collection._HashMap._deleteTableEntry(table, temporaryKey);
        return table;
      }
    }
    dart.addTypeTests(_HashMap);
    _HashMap[dart.implements] = () => [HashMapOfK$V()];
    dart.setSignature(_HashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashMap$(K, V), [])}),
      fields: () => ({
        [_length$1]: core.int,
        [_strings$]: dart.dynamic,
        [_nums$]: dart.dynamic,
        [_rest$]: dart.dynamic,
        [_keys]: ListOfK()
      }),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        [_containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        [_get]: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        [_set]: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        [_remove]: dart.definiteFunctionType(V, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        [_computeKeys]: dart.definiteFunctionType(core.List$(K), []),
        [_addHashTableEntry$]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
        [_removeHashTableEntry$]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getBucket$]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, core.Object])
      }),
      statics: () => ({
        _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
        _getTableEntry: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
      }),
      names: ['_isStringKey', '_isNumericKey', '_hasTableEntry', '_getTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
    });
    dart.defineExtensionMembers(_HashMap, [
      'containsKey',
      'containsValue',
      'addAll',
      '_get',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'forEach',
      'length',
      'isEmpty',
      'isNotEmpty',
      'keys',
      'values'
    ]);
    return _HashMap;
  });
  collection._HashMap = _HashMap();
  collection._IdentityHashMap$ = dart.generic((K, V) => {
    class _IdentityHashMap extends collection._HashMap$(K, V) {
      new() {
        super.new();
      }
      [_computeHashCode](key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i = i + 2) {
          if (core.identical(bucket[i], key)) return i;
        }
        return -1;
      }
    }
    return _IdentityHashMap;
  });
  collection._IdentityHashMap = _IdentityHashMap();
  const _equals$ = Symbol('_equals');
  const _hashCode = Symbol('_hashCode');
  const _validKey = Symbol('_validKey');
  collection._CustomHashMap$ = dart.generic((K, V) => {
    let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
    let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
    class _CustomHashMap extends collection._HashMap$(K, V) {
      new(equals, hashCode, validKey) {
        this[_equals$] = equals;
        this[_hashCode] = hashCode;
        this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
        super.new();
      }
      _get(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super[_get](key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        super[_set](key, value);
        return value;
      }
      containsKey(key) {
        if (!dart.test(this[_validKey](key))) return false;
        return super[_containsKey](key);
      }
      remove(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super[_remove](key);
      }
      [_computeHashCode](key) {
        return this[_hashCode](K._check(key)) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i = i + 2) {
          if (dart.test(this[_equals$](bucket[i], K._check(key)))) return i;
        }
        return -1;
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    dart.setSignature(_CustomHashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
      fields: () => ({
        [_equals$]: _EqualityOfK(),
        [_hashCode]: _HasherOfK(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        remove: dart.definiteFunctionType(V, [core.Object])
      })
    });
    dart.defineExtensionMembers(_CustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
    return _CustomHashMap;
  });
  collection._CustomHashMap = _CustomHashMap();
  const _map$0 = Symbol('_map');
  collection._HashMapKeyIterable$ = dart.generic(E => {
    let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
    class _HashMapKeyIterable extends core.Iterable$(E) {
      new(map) {
        this[_map$0] = map;
        super.new();
      }
      get length() {
        return this[_map$0][_length$1];
      }
      get isEmpty() {
        return this[_map$0][_length$1] == 0;
      }
      get iterator() {
        return new (_HashMapKeyIteratorOfE())(this[_map$0], this[_map$0][_computeKeys]());
      }
      contains(element) {
        return this[_map$0].containsKey(element);
      }
      forEach(f) {
        let keys = this[_map$0][_computeKeys]();
        for (let i = 0, length = keys.length; i < length; i++) {
          f(keys[i]);
          if (keys !== this[_map$0][_keys]) {
            dart.throw(new core.ConcurrentModificationError(this[_map$0]));
          }
        }
      }
    }
    _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_HashMapKeyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
      fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({forEach: dart.definiteFunctionType(dart.void, [ETovoid()])})
    });
    dart.defineExtensionMembers(_HashMapKeyIterable, [
      'contains',
      'forEach',
      'length',
      'isEmpty',
      'iterator'
    ]);
    return _HashMapKeyIterable;
  });
  collection._HashMapKeyIterable = _HashMapKeyIterable();
  const _offset = Symbol('_offset');
  const _current$2 = Symbol('_current');
  collection._HashMapKeyIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    class _HashMapKeyIterator extends core.Object {
      new(map, keys) {
        this[_map$0] = map;
        this[_keys] = keys;
        this[_offset] = 0;
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        let keys = this[_keys];
        let offset = this[_offset];
        if (keys !== this[_map$0][_keys]) {
          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
        } else if (dart.notNull(offset) >= keys.length) {
          this[_current$2] = null;
          return false;
        } else {
          this[_current$2] = keys[offset];
          this[_offset] = dart.notNull(offset) + 1;
          return true;
        }
      }
    }
    dart.addTypeTests(_HashMapKeyIterator);
    _HashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_HashMapKeyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterator$(E), [_HashMapOfE$dynamic(), ListOfE()])}),
      fields: () => ({
        [_map$0]: _HashMapOfE$dynamic(),
        [_keys]: ListOfE(),
        [_offset]: core.int,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _HashMapKeyIterator;
  });
  collection._HashMapKeyIterator = _HashMapKeyIterator();
  collection._LinkedIdentityHashMap$ = dart.generic((K, V) => {
    let _Es6LinkedIdentityHashMapOfK$V = () => (_Es6LinkedIdentityHashMapOfK$V = dart.constFn(collection._Es6LinkedIdentityHashMap$(K, V)))();
    let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
    class _LinkedIdentityHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
      static get _supportsEs6Maps() {
        return true;
      }
      static es6() {
        return collection._USE_ES6_MAPS && dart.test(collection._LinkedIdentityHashMap._supportsEs6Maps) ? new (_Es6LinkedIdentityHashMapOfK$V())() : new (_LinkedIdentityHashMapOfK$V())();
      }
      new() {
        super.new();
      }
      internalComputeHashCode(key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      internalFindBucketIndex(bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (core.identical(cell.hashMapCellKey, key)) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_LinkedIdentityHashMap, {
      constructors: () => ({
        es6: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), []),
        new: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), [])
      }),
      sgetters: () => ({_supportsEs6Maps: dart.definiteFunctionType(core.bool, [])})
    });
    return _LinkedIdentityHashMap;
  });
  collection._LinkedIdentityHashMap = _LinkedIdentityHashMap();
  const _modifications$ = Symbol('_modifications');
  const _modified$ = Symbol('_modified');
  collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
    let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
    let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
    class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
      new() {
        this[_map$0] = new Map();
        this[_modifications$] = 0;
        super.new();
      }
      get length() {
        return this[_map$0].size;
      }
      get isEmpty() {
        return this.length == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      get keys() {
        return new (_Es6MapIterableOfK())(this, true);
      }
      get values() {
        return new (_Es6MapIterableOfV())(this, false);
      }
      containsKey(key) {
        return this[_map$0].has(key);
      }
      containsValue(value) {
        return this.values[dartx.any](dart.fn(each => dart.equals(each, value), VTobool()));
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      _get(key) {
        return this[_map$0].get(key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        this[_map$0].set(key, value);
        this[_modified$]();
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) return this._get(key);
        let value = ifAbsent();
        this._set(key, value);
        return value;
      }
      remove(key) {
        let value = this._get(key);
        this[_map$0].delete(key);
        this[_modified$]();
        return value;
      }
      clear() {
        this[_map$0].clear();
        this[_modified$]();
      }
      forEach(action) {
        let jsEntries = this[_map$0].entries();
        let modifications = this[_modifications$];
        while (true) {
          let next = jsEntries.next();
          let done = next.done;
          if (done) break;
          let entry = next.value;
          let key = entry[0];
          let value = entry[1];
          action(K._check(key), V._check(value));
          if (modifications != this[_modifications$]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      [_modified$]() {
        this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    _Es6LinkedIdentityHashMap[dart.implements] = () => [InternalMapOfK$V()];
    dart.setSignature(_Es6LinkedIdentityHashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._Es6LinkedIdentityHashMap$(K, V), [])}),
      fields: () => ({
        [_map$0]: dart.dynamic,
        [_modifications$]: core.int
      }),
      getters: () => ({
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        [_modified$]: dart.definiteFunctionType(dart.void, [])
      })
    });
    dart.defineExtensionMembers(_Es6LinkedIdentityHashMap, [
      'containsKey',
      'containsValue',
      'addAll',
      '_get',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'forEach',
      'length',
      'isEmpty',
      'isNotEmpty',
      'keys',
      'values'
    ]);
    return _Es6LinkedIdentityHashMap;
  });
  collection._Es6LinkedIdentityHashMap = _Es6LinkedIdentityHashMap();
  const _isKeys = Symbol('_isKeys');
  collection._Es6MapIterable$ = dart.generic(E => {
    let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class _Es6MapIterable extends core.Iterable$(E) {
      new(map, isKeys) {
        this[_map$0] = map;
        this[_isKeys] = isKeys;
        super.new();
      }
      get length() {
        return core.int._check(dart.dload(this[_map$0], 'length'));
      }
      get isEmpty() {
        return core.bool._check(dart.dload(this[_map$0], 'isEmpty'));
      }
      get iterator() {
        return new (_Es6MapIteratorOfE())(this[_map$0], core.int._check(dart.dload(this[_map$0], _modifications$)), this[_isKeys]);
      }
      contains(element) {
        return core.bool._check(dart.dsend(this[_map$0], 'containsKey', element));
      }
      forEach(f) {
        let jsIterator = null;
        if (dart.test(this[_isKeys])) {
          jsIterator = dart.dload(this[_map$0], _map$0).keys();
        } else {
          jsIterator = dart.dload(this[_map$0], _map$0).values();
        }
        let modifications = core.int._check(dart.dload(this[_map$0], _modifications$));
        while (true) {
          let next = jsIterator.next();
          let done = next.done;
          if (done) break;
          let value = next.value;
          f(E._check(value));
          if (!dart.equals(modifications, dart.dload(this[_map$0], _modifications$))) {
            dart.throw(new core.ConcurrentModificationError(this[_map$0]));
          }
        }
      }
    }
    _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_Es6MapIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
      fields: () => ({
        [_map$0]: dart.dynamic,
        [_isKeys]: core.bool
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({forEach: dart.definiteFunctionType(dart.void, [ETovoid()])})
    });
    dart.defineExtensionMembers(_Es6MapIterable, [
      'contains',
      'forEach',
      'length',
      'isEmpty',
      'iterator'
    ]);
    return _Es6MapIterable;
  });
  collection._Es6MapIterable = _Es6MapIterable();
  const _jsIterator$ = Symbol('_jsIterator');
  const _next$0 = Symbol('_next');
  const _done = Symbol('_done');
  collection._Es6MapIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class _Es6MapIterator extends core.Object {
      new(map, modifications, isKeys) {
        this[_map$0] = map;
        this[_modifications$] = modifications;
        this[_isKeys] = isKeys;
        this[_jsIterator$] = null;
        this[_next$0] = null;
        this[_current$2] = null;
        this[_done] = null;
        if (dart.test(this[_isKeys])) {
          this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
        } else {
          this[_jsIterator$] = dart.dload(this[_map$0], _map$0).values();
        }
        this[_done] = false;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
        }
        if (dart.test(this[_done])) return false;
        this[_next$0] = this[_jsIterator$].next();
        let done = this[_next$0].done;
        if (done) {
          this[_current$2] = null;
          this[_done] = true;
          return false;
        } else {
          this[_current$2] = this[_next$0].value;
          return true;
        }
      }
    }
    dart.addTypeTests(_Es6MapIterator);
    _Es6MapIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_Es6MapIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterator$(E), [dart.dynamic, core.int, core.bool])}),
      fields: () => ({
        [_map$0]: dart.dynamic,
        [_modifications$]: core.int,
        [_isKeys]: core.bool,
        [_jsIterator$]: dart.dynamic,
        [_next$0]: dart.dynamic,
        [_current$2]: E,
        [_done]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _Es6MapIterator;
  });
  collection._Es6MapIterator = _Es6MapIterator();
  collection._LinkedCustomHashMap$ = dart.generic((K, V) => {
    let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
    let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
    class _LinkedCustomHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
      new(equals, hashCode, validKey) {
        this[_equals$] = equals;
        this[_hashCode] = hashCode;
        this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
        super.new();
      }
      _get(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super.internalGet(key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        super.internalSet(key, value);
        return value;
      }
      containsKey(key) {
        if (!dart.test(this[_validKey](key))) return false;
        return super.internalContainsKey(key);
      }
      remove(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super.internalRemove(key);
      }
      internalComputeHashCode(key) {
        return this[_hashCode](K._check(key)) & 0x3ffffff;
      }
      internalFindBucketIndex(bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.test(this[_equals$](cell.hashMapCellKey, K._check(key)))) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_LinkedCustomHashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
      fields: () => ({
        [_equals$]: _EqualityOfK(),
        [_hashCode]: _HasherOfK(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        remove: dart.definiteFunctionType(V, [core.Object])
      })
    });
    dart.defineExtensionMembers(_LinkedCustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
    return _LinkedCustomHashMap;
  });
  collection._LinkedCustomHashMap = _LinkedCustomHashMap();
  const _elements = Symbol('_elements');
  const _newSet = Symbol('_newSet');
  const _computeElements = Symbol('_computeElements');
  const _contains = Symbol('_contains');
  const _lookup = Symbol('_lookup');
  const _add$0 = Symbol('_add');
  collection.SetMixin$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class SetMixin extends core.Object {
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
      get isEmpty() {
        return this.length == 0;
      }
      get isNotEmpty() {
        return this.length != 0;
      }
      clear() {
        this.removeAll(this.toList());
      }
      addAll(elements) {
        IterableOfE()._check(elements);
        for (let element of elements)
          this.add(element);
      }
      removeAll(elements) {
        for (let element of elements)
          this.remove(element);
      }
      retainAll(elements) {
        let toRemove = this.toSet();
        for (let o of elements) {
          toRemove.remove(o);
        }
        this.removeAll(toRemove);
      }
      removeWhere(test) {
        let toRemove = [];
        for (let element of this) {
          if (dart.test(test(element))) toRemove[dartx.add](element);
        }
        this.removeAll(toRemove);
      }
      retainWhere(test) {
        let toRemove = [];
        for (let element of this) {
          if (!dart.test(test(element))) toRemove[dartx.add](element);
        }
        this.removeAll(toRemove);
      }
      containsAll(other) {
        for (let o of other) {
          if (!dart.test(this.contains(o))) return false;
        }
        return true;
      }
      union(other) {
        SetOfE()._check(other);
        let _ = this.toSet();
        _.addAll(other);
        return _;
      }
      intersection(other) {
        let result = this.toSet();
        for (let element of this) {
          if (!dart.test(other.contains(element))) result.remove(element);
        }
        return result;
      }
      difference(other) {
        let result = this.toSet();
        for (let element of this) {
          if (dart.test(other.contains(element))) result.remove(element);
        }
        return result;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = dart.test(growable) ? (() => {
          let _ = ListOfE().new();
          _[dartx.length] = this.length;
          return _;
        })() : ListOfE().new(this.length);
        let i = 0;
        for (let element of this)
          result[dartx._set](i++, element);
        return result;
      }
      map(T) {
        return f => {
          return new (_internal.EfficientLengthMappedIterable$(E, T))(this, f);
        };
      }
      get single() {
        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
        let it = this.iterator;
        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
        let result = it.current;
        return result;
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '{', '}');
      }
      where(f) {
        return new (WhereIterableOfE())(this, f);
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      forEach(f) {
        for (let element of this)
          f(element);
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let value = iterator.current;
        while (dart.test(iterator.moveNext())) {
          value = combine(value, iterator.current);
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          for (let element of this)
            value = combine(value, element);
          return value;
        };
      }
      every(f) {
        for (let element of this) {
          if (!dart.test(f(element))) return false;
        }
        return true;
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) return "";
        let buffer = new core.StringBuffer();
        if (separator == null || separator == "") {
          do {
            buffer.write(dart.str`${iterator.current}`);
          } while (dart.test(iterator.moveNext()));
        } else {
          buffer.write(dart.str`${iterator.current}`);
          while (dart.test(iterator.moveNext())) {
            buffer.write(separator);
            buffer.write(dart.str`${iterator.current}`);
          }
        }
        return buffer.toString();
      }
      any(test) {
        for (let element of this) {
          if (dart.test(test(element))) return true;
        }
        return false;
      }
      take(n) {
        return TakeIterableOfE().new(this, n);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      skip(n) {
        return SkipIterableOfE().new(this, n);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      get first() {
        let it = this.iterator;
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        return it.current;
      }
      get last() {
        let it = this.iterator;
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = null;
        do {
          result = it.current;
        } while (dart.test(it.moveNext()));
        return result;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        for (let element of this) {
          if (dart.test(test(element))) return element;
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            if (foundMatching) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
        core.RangeError.checkNotNegative(index, "index");
        let elementIndex = 0;
        for (let element of this) {
          if (index == elementIndex) return element;
          elementIndex++;
        }
        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
      }
    }
    dart.addTypeTests(SetMixin);
    SetMixin[dart.implements] = () => [SetOfE()];
    dart.setSignature(SetMixin, {
      getters: () => ({
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        single: dart.definiteFunctionType(E, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        clear: dart.definiteFunctionType(dart.void, []),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
        retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
        union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        elementAt: dart.definiteFunctionType(E, [core.int])
      })
    });
    dart.defineExtensionMembers(SetMixin, [
      'toList',
      'map',
      'toString',
      'where',
      'expand',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'isEmpty',
      'isNotEmpty',
      'single',
      'first',
      'last'
    ]);
    return SetMixin;
  });
  collection.SetMixin = SetMixin();
  collection.SetBase$ = dart.generic(E => {
    class SetBase extends collection.SetMixin$(E) {
      static setToString(set) {
        return collection.IterableBase.iterableToFullString(set, '{', '}');
      }
    }
    dart.setSignature(SetBase, {
      statics: () => ({setToString: dart.definiteFunctionType(core.String, [core.Set])}),
      names: ['setToString']
    });
    return SetBase;
  });
  collection.SetBase = SetBase();
  collection._HashSetBase$ = dart.generic(E => {
    class _HashSetBase extends collection.SetBase$(E) {
      difference(other) {
        let result = this[_newSet]();
        for (let element of this) {
          if (!dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      intersection(other) {
        let result = this[_newSet]();
        for (let element of this) {
          if (dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      toSet() {
        return (() => {
          let _ = this[_newSet]();
          _.addAll(this);
          return _;
        })();
      }
    }
    dart.setSignature(_HashSetBase, {
      methods: () => ({
        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(_HashSetBase, ['toSet']);
    return _HashSetBase;
  });
  collection._HashSetBase = _HashSetBase();
  collection._HashSet$ = dart.generic(E => {
    let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
    let _HashSetIteratorOfE = () => (_HashSetIteratorOfE = dart.constFn(collection._HashSetIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
    class _HashSet extends collection._HashSetBase$(E) {
      new() {
        this[_length$1] = 0;
        this[_strings$] = null;
        this[_nums$] = null;
        this[_rest$] = null;
        this[_elements] = null;
      }
      [_newSet]() {
        return new (_HashSetOfE())();
      }
      get iterator() {
        return new (_HashSetIteratorOfE())(this, this[_computeElements]());
      }
      get length() {
        return this[_length$1];
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      contains(object) {
        if (dart.test(collection._HashSet._isStringElement(object))) {
          let strings = this[_strings$];
          return strings == null ? false : collection._HashSet._hasTableEntry(strings, object);
        } else if (dart.test(collection._HashSet._isNumericElement(object))) {
          let nums = this[_nums$];
          return nums == null ? false : collection._HashSet._hasTableEntry(nums, object);
        } else {
          return this[_contains](object);
        }
      }
      [_contains](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
      }
      lookup(object) {
        if (dart.test(collection._HashSet._isStringElement(object)) || dart.test(collection._HashSet._isNumericElement(object))) {
          return E._check(dart.test(this.contains(object)) ? object : null);
        }
        return this[_lookup](object);
      }
      [_lookup](object) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return null;
        return bucket[dartx._get](index);
      }
      add(element) {
        E._check(element);
        if (dart.test(collection._HashSet._isStringElement(element))) {
          let strings = this[_strings$];
          if (strings == null) this[_strings$] = strings = collection._HashSet._newHashTable();
          return this[_addHashTableEntry$](strings, element);
        } else if (dart.test(collection._HashSet._isNumericElement(element))) {
          let nums = this[_nums$];
          if (nums == null) this[_nums$] = nums = collection._HashSet._newHashTable();
          return this[_addHashTableEntry$](nums, element);
        } else {
          return this[_add$0](element);
        }
      }
      [_add$0](element) {
        E._check(element);
        let rest = this[_rest$];
        if (rest == null) this[_rest$] = rest = collection._HashSet._newHashTable();
        let hash = this[_computeHashCode](element);
        let bucket = rest[hash];
        if (bucket == null) {
          collection._HashSet._setTableEntry(rest, hash, [element]);
        } else {
          let index = this[_findBucketIndex](bucket, element);
          if (dart.notNull(index) >= 0) return false;
          bucket.push(element);
        }
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_elements] = null;
        return true;
      }
      addAll(objects) {
        IterableOfE()._check(objects);
        for (let each of objects) {
          this.add(each);
        }
      }
      remove(object) {
        if (dart.test(collection._HashSet._isStringElement(object))) {
          return this[_removeHashTableEntry$](this[_strings$], object);
        } else if (dart.test(collection._HashSet._isNumericElement(object))) {
          return this[_removeHashTableEntry$](this[_nums$], object);
        } else {
          return this[_remove](object);
        }
      }
      [_remove](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return false;
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_elements] = null;
        bucket.splice(index, 1);
        return true;
      }
      clear() {
        if (dart.notNull(this[_length$1]) > 0) {
          this[_strings$] = this[_nums$] = this[_rest$] = this[_elements] = null;
          this[_length$1] = 0;
        }
      }
      [_computeElements]() {
        if (this[_elements] != null) return this[_elements];
        let result = ListOfE().new(this[_length$1]);
        let index = 0;
        let strings = this[_strings$];
        if (strings != null) {
          let names = Object.getOwnPropertyNames(strings);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let element = names[i];
            result[index] = element;
            index++;
          }
        }
        let nums = this[_nums$];
        if (nums != null) {
          let names = Object.getOwnPropertyNames(nums);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let element = +names[i];
            result[index] = element;
            index++;
          }
        }
        let rest = this[_rest$];
        if (rest != null) {
          let names = Object.getOwnPropertyNames(rest);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let entry = names[i];
            let bucket = rest[entry];
            let length = bucket.length;
            for (let i = 0; i < length; i++) {
              result[index] = bucket[i];
              index++;
            }
          }
        }
        dart.assert(index == this[_length$1]);
        return this[_elements] = result;
      }
      [_addHashTableEntry$](table, element) {
        E._check(element);
        if (dart.test(collection._HashSet._hasTableEntry(table, element))) return false;
        collection._HashSet._setTableEntry(table, element, 0);
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_elements] = null;
        return true;
      }
      [_removeHashTableEntry$](table, element) {
        if (table != null && dart.test(collection._HashSet._hasTableEntry(table, element))) {
          collection._HashSet._deleteTableEntry(table, element);
          this[_length$1] = dart.notNull(this[_length$1]) - 1;
          this[_elements] = null;
          return true;
        } else {
          return false;
        }
      }
      static _isStringElement(element) {
        return typeof element == 'string' && element != '__proto__';
      }
      static _isNumericElement(element) {
        return typeof element == 'number' && (element & 0x3ffffff) === element;
      }
      [_computeHashCode](element) {
        return dart.hashCode(element) & 0x3ffffff;
      }
      static _hasTableEntry(table, key) {
        let entry = table[key];
        return entry != null;
      }
      static _setTableEntry(table, key, value) {
        dart.assert(value != null);
        table[key] = value;
      }
      static _deleteTableEntry(table, key) {
        delete table[key];
      }
      [_getBucket$](table, element) {
        let hash = this[_computeHashCode](element);
        return table[hash];
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          if (dart.equals(bucket[i], element)) return i;
        }
        return -1;
      }
      static _newHashTable() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        collection._HashSet._setTableEntry(table, temporaryKey, table);
        collection._HashSet._deleteTableEntry(table, temporaryKey);
        return table;
      }
    }
    _HashSet[dart.implements] = () => [HashSetOfE()];
    dart.setSignature(_HashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashSet$(E), [])}),
      fields: () => ({
        [_length$1]: core.int,
        [_strings$]: dart.dynamic,
        [_nums$]: dart.dynamic,
        [_rest$]: dart.dynamic,
        [_elements]: ListOfE()
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        length: dart.definiteFunctionType(core.int, [])
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
        lookup: dart.definiteFunctionType(E, [core.Object]),
        [_lookup]: dart.definiteFunctionType(E, [core.Object]),
        add: dart.definiteFunctionType(core.bool, [E]),
        [_add$0]: dart.definiteFunctionType(core.bool, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
        [_computeElements]: dart.definiteFunctionType(core.List$(E), []),
        [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
        [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getBucket$]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
      }),
      statics: () => ({
        _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
      }),
      names: ['_isStringElement', '_isNumericElement', '_hasTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
    });
    dart.defineExtensionMembers(_HashSet, [
      'contains',
      'iterator',
      'length',
      'isEmpty',
      'isNotEmpty'
    ]);
    return _HashSet;
  });
  collection._HashSet = _HashSet();
  collection._IdentityHashSet$ = dart.generic(E => {
    let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
    class _IdentityHashSet extends collection._HashSet$(E) {
      new() {
        super.new();
      }
      [_newSet]() {
        return new (_IdentityHashSetOfE())();
      }
      [_computeHashCode](key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          if (core.identical(bucket[i], element)) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_IdentityHashSet, {
      methods: () => ({[_newSet]: dart.definiteFunctionType(core.Set$(E), [])})
    });
    return _IdentityHashSet;
  });
  collection._IdentityHashSet = _IdentityHashSet();
  const _equality = Symbol('_equality');
  const _hasher = Symbol('_hasher');
  collection._CustomHashSet$ = dart.generic(E => {
    let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
    let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
    let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
    class _CustomHashSet extends collection._HashSet$(E) {
      new(equality, hasher, validKey) {
        this[_equality] = equality;
        this[_hasher] = hasher;
        this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
        super.new();
      }
      [_newSet]() {
        return new (_CustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          if (dart.test(this[_equality](bucket[i], E._check(element)))) return i;
        }
        return -1;
      }
      [_computeHashCode](element) {
        return this[_hasher](E._check(element)) & 0x3ffffff;
      }
      add(object) {
        E._check(object);
        return super[_add$0](object);
      }
      contains(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_contains](object);
      }
      lookup(object) {
        if (!dart.test(this[_validKey](object))) return null;
        return super[_lookup](object);
      }
      remove(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_remove](object);
      }
    }
    dart.setSignature(_CustomHashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
      fields: () => ({
        [_equality]: _EqualityOfE(),
        [_hasher]: _HasherOfE(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        add: dart.definiteFunctionType(core.bool, [E]),
        lookup: dart.definiteFunctionType(E, [core.Object])
      })
    });
    dart.defineExtensionMembers(_CustomHashSet, ['contains']);
    return _CustomHashSet;
  });
  collection._CustomHashSet = _CustomHashSet();
  collection._HashSetIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    class _HashSetIterator extends core.Object {
      new(set, elements) {
        this[_set] = set;
        this[_elements] = elements;
        this[_offset] = 0;
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        let elements = this[_elements];
        let offset = this[_offset];
        if (elements !== dart.dload(this[_set], _elements)) {
          dart.throw(new core.ConcurrentModificationError(this[_set]));
        } else if (dart.notNull(offset) >= elements.length) {
          this[_current$2] = null;
          return false;
        } else {
          this[_current$2] = elements[offset];
          this[_offset] = dart.notNull(offset) + 1;
          return true;
        }
      }
    }
    dart.addTypeTests(_HashSetIterator);
    _HashSetIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_HashSetIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashSetIterator$(E), [dart.dynamic, ListOfE()])}),
      fields: () => ({
        [_set]: dart.dynamic,
        [_elements]: ListOfE(),
        [_offset]: core.int,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _HashSetIterator;
  });
  collection._HashSetIterator = _HashSetIterator();
  const _first$ = Symbol('_first');
  const _last$ = Symbol('_last');
  const _unsupported = Symbol('_unsupported');
  const _getTableEntry = Symbol('_getTableEntry');
  const _element = Symbol('_element');
  const _newLinkedCell$ = Symbol('_newLinkedCell');
  const _unlinkCell$ = Symbol('_unlinkCell');
  const _filterWhere = Symbol('_filterWhere');
  const _previous$0 = Symbol('_previous');
  collection._LinkedHashSet$ = dart.generic(E => {
    let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
    let _LinkedHashSetIteratorOfE = () => (_LinkedHashSetIteratorOfE = dart.constFn(collection._LinkedHashSetIterator$(E)))();
    let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class _LinkedHashSet extends collection._HashSetBase$(E) {
      new() {
        this[_length$1] = 0;
        this[_strings$] = null;
        this[_nums$] = null;
        this[_rest$] = null;
        this[_first$] = null;
        this[_last$] = null;
        this[_modifications$] = 0;
      }
      [_newSet]() {
        return new (_LinkedHashSetOfE())();
      }
      [_unsupported](operation) {
        dart.throw(dart.str`LinkedHashSet: unsupported ${operation}`);
      }
      get iterator() {
        return new (_LinkedHashSetIteratorOfE())(this, this[_modifications$]);
      }
      get length() {
        return this[_length$1];
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      contains(object) {
        if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
          let strings = this[_strings$];
          if (strings == null) return false;
          let cell = this[_getTableEntry](strings, object);
          return cell != null;
        } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
          let nums = this[_nums$];
          if (nums == null) return false;
          let cell = this[_getTableEntry](nums, object);
          return cell != null;
        } else {
          return this[_contains](object);
        }
      }
      [_contains](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
      }
      lookup(object) {
        if (dart.test(collection._LinkedHashSet._isStringElement(object)) || dart.test(collection._LinkedHashSet._isNumericElement(object))) {
          return E._check(dart.test(this.contains(object)) ? object : null);
        } else {
          return this[_lookup](object);
        }
      }
      [_lookup](object) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return null;
        return bucket[dartx._get](index)[_element];
      }
      forEach(action) {
        let cell = this[_first$];
        let modifications = this[_modifications$];
        while (cell != null) {
          action(cell[_element]);
          if (modifications != this[_modifications$]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          cell = cell[_next$0];
        }
      }
      get first() {
        if (this[_first$] == null) dart.throw(new core.StateError("No elements"));
        return this[_first$][_element];
      }
      get last() {
        if (this[_last$] == null) dart.throw(new core.StateError("No elements"));
        return this[_last$][_element];
      }
      add(element) {
        E._check(element);
        if (dart.test(collection._LinkedHashSet._isStringElement(element))) {
          let strings = this[_strings$];
          if (strings == null) this[_strings$] = strings = collection._LinkedHashSet._newHashTable();
          return this[_addHashTableEntry$](strings, element);
        } else if (dart.test(collection._LinkedHashSet._isNumericElement(element))) {
          let nums = this[_nums$];
          if (nums == null) this[_nums$] = nums = collection._LinkedHashSet._newHashTable();
          return this[_addHashTableEntry$](nums, element);
        } else {
          return this[_add$0](element);
        }
      }
      [_add$0](element) {
        E._check(element);
        let rest = this[_rest$];
        if (rest == null) this[_rest$] = rest = collection._LinkedHashSet._newHashTable();
        let hash = this[_computeHashCode](element);
        let bucket = rest[hash];
        if (bucket == null) {
          let cell = this[_newLinkedCell$](element);
          collection._LinkedHashSet._setTableEntry(rest, hash, [cell]);
        } else {
          let index = this[_findBucketIndex](bucket, element);
          if (dart.notNull(index) >= 0) return false;
          let cell = this[_newLinkedCell$](element);
          bucket.push(cell);
        }
        return true;
      }
      remove(object) {
        if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
          return this[_removeHashTableEntry$](this[_strings$], object);
        } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
          return this[_removeHashTableEntry$](this[_nums$], object);
        } else {
          return this[_remove](object);
        }
      }
      [_remove](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return false;
        let cell = bucket.splice(index, 1)[0];
        this[_unlinkCell$](cell);
        return true;
      }
      removeWhere(test) {
        this[_filterWhere](test, true);
      }
      retainWhere(test) {
        this[_filterWhere](test, false);
      }
      [_filterWhere](test, removeMatching) {
        let cell = this[_first$];
        while (cell != null) {
          let element = cell[_element];
          let next = cell[_next$0];
          let modifications = this[_modifications$];
          let shouldRemove = removeMatching == test(element);
          if (modifications != this[_modifications$]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          if (shouldRemove) this.remove(element);
          cell = next;
        }
      }
      clear() {
        if (dart.notNull(this[_length$1]) > 0) {
          this[_strings$] = this[_nums$] = this[_rest$] = this[_first$] = this[_last$] = null;
          this[_length$1] = 0;
          this[_modified$]();
        }
      }
      [_addHashTableEntry$](table, element) {
        E._check(element);
        let cell = this[_getTableEntry](table, element);
        if (cell != null) return false;
        collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell$](element));
        return true;
      }
      [_removeHashTableEntry$](table, element) {
        if (table == null) return false;
        let cell = this[_getTableEntry](table, element);
        if (cell == null) return false;
        this[_unlinkCell$](cell);
        collection._LinkedHashSet._deleteTableEntry(table, element);
        return true;
      }
      [_modified$]() {
        this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
      }
      [_newLinkedCell$](element) {
        E._check(element);
        let cell = new (_LinkedHashSetCellOfE())(element);
        if (this[_first$] == null) {
          this[_first$] = this[_last$] = cell;
        } else {
          let last = this[_last$];
          cell[_previous$0] = last;
          this[_last$] = last[_next$0] = cell;
        }
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_modified$]();
        return cell;
      }
      [_unlinkCell$](cell) {
        _LinkedHashSetCellOfE()._check(cell);
        let previous = cell[_previous$0];
        let next = cell[_next$0];
        if (previous == null) {
          dart.assert(dart.equals(cell, this[_first$]));
          this[_first$] = next;
        } else {
          previous[_next$0] = next;
        }
        if (next == null) {
          dart.assert(dart.equals(cell, this[_last$]));
          this[_last$] = previous;
        } else {
          next[_previous$0] = previous;
        }
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_modified$]();
      }
      static _isStringElement(element) {
        return typeof element == 'string' && element != '__proto__';
      }
      static _isNumericElement(element) {
        return typeof element == 'number' && (element & 0x3ffffff) === element;
      }
      [_computeHashCode](element) {
        return dart.hashCode(element) & 0x3ffffff;
      }
      [_getTableEntry](table, key) {
        return table[key];
      }
      static _setTableEntry(table, key, value) {
        dart.assert(value != null);
        table[key] = value;
      }
      static _deleteTableEntry(table, key) {
        delete table[key];
      }
      [_getBucket$](table, element) {
        let hash = this[_computeHashCode](element);
        return table[hash];
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.equals(cell[_element], element)) return i;
        }
        return -1;
      }
      static _newHashTable() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        collection._LinkedHashSet._setTableEntry(table, temporaryKey, table);
        collection._LinkedHashSet._deleteTableEntry(table, temporaryKey);
        return table;
      }
    }
    _LinkedHashSet[dart.implements] = () => [LinkedHashSetOfE()];
    dart.setSignature(_LinkedHashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSet$(E), [])}),
      fields: () => ({
        [_length$1]: core.int,
        [_strings$]: dart.dynamic,
        [_nums$]: dart.dynamic,
        [_rest$]: dart.dynamic,
        [_first$]: _LinkedHashSetCellOfE(),
        [_last$]: _LinkedHashSetCellOfE(),
        [_modifications$]: core.int
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        length: dart.definiteFunctionType(core.int, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        [_unsupported]: dart.definiteFunctionType(dart.void, [core.String]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
        lookup: dart.definiteFunctionType(E, [core.Object]),
        [_lookup]: dart.definiteFunctionType(E, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        add: dart.definiteFunctionType(core.bool, [E]),
        [_add$0]: dart.definiteFunctionType(core.bool, [E]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
        [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
        [_modified$]: dart.definiteFunctionType(dart.void, []),
        [_newLinkedCell$]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
        [_unlinkCell$]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getTableEntry]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [dart.dynamic, dart.dynamic]),
        [_getBucket$]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
      }),
      statics: () => ({
        _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
      }),
      names: ['_isStringElement', '_isNumericElement', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
    });
    dart.defineExtensionMembers(_LinkedHashSet, [
      'contains',
      'forEach',
      'iterator',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last'
    ]);
    return _LinkedHashSet;
  });
  collection._LinkedHashSet = _LinkedHashSet();
  collection._LinkedIdentityHashSet$ = dart.generic(E => {
    let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
    class _LinkedIdentityHashSet extends collection._LinkedHashSet$(E) {
      new() {
        super.new();
      }
      [_newSet]() {
        return new (_LinkedIdentityHashSetOfE())();
      }
      [_computeHashCode](key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (core.identical(cell[_element], element)) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_LinkedIdentityHashSet, {
      methods: () => ({[_newSet]: dart.definiteFunctionType(core.Set$(E), [])})
    });
    return _LinkedIdentityHashSet;
  });
  collection._LinkedIdentityHashSet = _LinkedIdentityHashSet();
  collection._LinkedCustomHashSet$ = dart.generic(E => {
    let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
    let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
    let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
    class _LinkedCustomHashSet extends collection._LinkedHashSet$(E) {
      new(equality, hasher, validKey) {
        this[_equality] = equality;
        this[_hasher] = hasher;
        this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
        super.new();
      }
      [_newSet]() {
        return new (_LinkedCustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.test(this[_equality](cell[_element], E._check(element)))) return i;
        }
        return -1;
      }
      [_computeHashCode](element) {
        return this[_hasher](E._check(element)) & 0x3ffffff;
      }
      add(element) {
        E._check(element);
        return super[_add$0](element);
      }
      contains(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_contains](object);
      }
      lookup(object) {
        if (!dart.test(this[_validKey](object))) return null;
        return super[_lookup](object);
      }
      remove(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_remove](object);
      }
      containsAll(elements) {
        for (let element of elements) {
          if (!dart.test(this[_validKey](element)) || !dart.test(this.contains(element))) return false;
        }
        return true;
      }
      removeAll(elements) {
        for (let element of elements) {
          if (dart.test(this[_validKey](element))) {
            super[_remove](element);
          }
        }
      }
    }
    dart.setSignature(_LinkedCustomHashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
      fields: () => ({
        [_equality]: _EqualityOfE(),
        [_hasher]: _HasherOfE(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        add: dart.definiteFunctionType(core.bool, [E]),
        lookup: dart.definiteFunctionType(E, [core.Object])
      })
    });
    dart.defineExtensionMembers(_LinkedCustomHashSet, ['contains']);
    return _LinkedCustomHashSet;
  });
  collection._LinkedCustomHashSet = _LinkedCustomHashSet();
  collection._LinkedHashSetCell$ = dart.generic(E => {
    let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
    class _LinkedHashSetCell extends core.Object {
      new(element) {
        this[_element] = element;
        this[_next$0] = null;
        this[_previous$0] = null;
      }
    }
    dart.addTypeTests(_LinkedHashSetCell);
    dart.setSignature(_LinkedHashSetCell, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
      fields: () => ({
        [_element]: E,
        [_next$0]: _LinkedHashSetCellOfE(),
        [_previous$0]: _LinkedHashSetCellOfE()
      })
    });
    return _LinkedHashSetCell;
  });
  collection._LinkedHashSetCell = _LinkedHashSetCell();
  const _cell$ = Symbol('_cell');
  collection._LinkedHashSetIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class _LinkedHashSetIterator extends core.Object {
      new(set, modifications) {
        this[_set] = set;
        this[_modifications$] = modifications;
        this[_cell$] = null;
        this[_current$2] = null;
        this[_cell$] = collection._LinkedHashSetCell._check(dart.dload(this[_set], _first$));
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        if (!dart.equals(this[_modifications$], dart.dload(this[_set], _modifications$))) {
          dart.throw(new core.ConcurrentModificationError(this[_set]));
        } else if (this[_cell$] == null) {
          this[_current$2] = null;
          return false;
        } else {
          this[_current$2] = E._check(this[_cell$][_element]);
          this[_cell$] = this[_cell$][_next$0];
          return true;
        }
      }
    }
    dart.addTypeTests(_LinkedHashSetIterator);
    _LinkedHashSetIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_LinkedHashSetIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [dart.dynamic, core.int])}),
      fields: () => ({
        [_set]: dart.dynamic,
        [_modifications$]: core.int,
        [_cell$]: collection._LinkedHashSetCell,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _LinkedHashSetIterator;
  });
  collection._LinkedHashSetIterator = _LinkedHashSetIterator();
  const _source$0 = Symbol('_source');
  collection.UnmodifiableListView$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
      new(source) {
        this[_source$0] = source;
      }
      get length() {
        return this[_source$0][dartx.length];
      }
      set length(value) {
        super.length = value;
      }
      _get(index) {
        return this[_source$0][dartx.elementAt](index);
      }
    }
    dart.setSignature(UnmodifiableListView, {
      constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
      fields: () => ({[_source$0]: IterableOfE()}),
      getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
      methods: () => ({_get: dart.definiteFunctionType(E, [core.int])})
    });
    dart.defineExtensionMembers(UnmodifiableListView, ['_get', 'length']);
    return UnmodifiableListView;
  });
  collection.UnmodifiableListView = UnmodifiableListView();
  collection._defaultEquals = function(a, b) {
    return dart.equals(a, b);
  };
  dart.lazyFn(collection._defaultEquals, () => dynamicAnddynamicTobool());
  collection._defaultHashCode = function(a) {
    return dart.hashCode(a);
  };
  dart.fn(collection._defaultHashCode, dynamicToint());
  collection._Equality$ = dart.generic(K => {
    const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [K, K]));
    return _Equality;
  });
  collection._Equality = _Equality$();
  collection._Hasher$ = dart.generic(K => {
    const _Hasher = dart.typedef('_Hasher', () => dart.functionType(core.int, [K]));
    return _Hasher;
  });
  collection._Hasher = _Hasher();
  collection.HashMap$ = dart.generic((K, V) => {
    let _HashMapOfK$V = () => (_HashMapOfK$V = dart.constFn(collection._HashMap$(K, V)))();
    let _IdentityHashMapOfK$V = () => (_IdentityHashMapOfK$V = dart.constFn(collection._IdentityHashMap$(K, V)))();
    let _CustomHashMapOfK$V = () => (_CustomHashMapOfK$V = dart.constFn(collection._CustomHashMap$(K, V)))();
    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
    let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    class HashMap extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return new (_HashMapOfK$V())();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return new (_IdentityHashMapOfK$V())();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_CustomHashMapOfK$V())(equals, hashCode, isValidKey);
      }
      static identity() {
        return new (_IdentityHashMapOfK$V())();
      }
      static from(other) {
        let result = HashMapOfK$V().new();
        other[dartx.forEach](dart.fn((k, v) => {
          result._set(K.as(k), V.as(v));
        }, dynamicAnddynamicTovoid$()));
        return result;
      }
      static fromIterable(iterable, opts) {
        let key = opts && 'key' in opts ? opts.key : null;
        let value = opts && 'value' in opts ? opts.value : null;
        let map = HashMapOfK$V().new();
        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
        return map;
      }
      static fromIterables(keys, values) {
        let map = HashMapOfK$V().new();
        collection.Maps._fillMapWithIterables(map, keys, values);
        return map;
      }
    }
    dart.addTypeTests(HashMap);
    HashMap[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(HashMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.HashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.HashMap$(K, V), []),
        from: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Map]),
        fromIterable: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
        fromIterables: dart.definiteFunctionType(collection.HashMap$(K, V), [IterableOfK(), IterableOfV()])
      })
    });
    return HashMap;
  });
  collection.HashMap = HashMap();
  collection.HashSet$ = dart.generic(E => {
    let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
    let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
    let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
    let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
    class HashSet extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return new (_HashSetOfE())();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return new (_IdentityHashSetOfE())();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_CustomHashSetOfE())(equals, hashCode, isValidKey);
      }
      static identity() {
        return new (_IdentityHashSetOfE())();
      }
      static from(elements) {
        let result = HashSetOfE().new();
        for (let e of elements) {
          let element = E.as(e);
          result.add(element);
        }
        return result;
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(HashSet);
    HashSet[dart.implements] = () => [SetOfE()];
    dart.setSignature(HashSet, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.HashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.HashSet$(E), []),
        from: dart.definiteFunctionType(collection.HashSet$(E), [core.Iterable])
      })
    });
    return HashSet;
  });
  collection.HashSet = HashSet();
  collection.IterableMixin$ = dart.generic(E => {
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class IterableMixin extends core.Object {
      map(T) {
        return f => {
          return _internal.MappedIterable$(E, T).new(this, f);
        };
      }
      where(f) {
        return new (WhereIterableOfE())(this, f);
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      contains(element) {
        for (let e of this) {
          if (dart.equals(e, element)) return true;
        }
        return false;
      }
      forEach(f) {
        for (let element of this)
          f(element);
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let value = iterator.current;
        while (dart.test(iterator.moveNext())) {
          value = combine(value, iterator.current);
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          for (let element of this)
            value = combine(value, element);
          return value;
        };
      }
      every(f) {
        for (let element of this) {
          if (!dart.test(f(element))) return false;
        }
        return true;
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) return "";
        let buffer = new core.StringBuffer();
        if (separator == null || separator == "") {
          do {
            buffer.write(dart.str`${iterator.current}`);
          } while (dart.test(iterator.moveNext()));
        } else {
          buffer.write(dart.str`${iterator.current}`);
          while (dart.test(iterator.moveNext())) {
            buffer.write(separator);
            buffer.write(dart.str`${iterator.current}`);
          }
        }
        return buffer.toString();
      }
      any(f) {
        for (let element of this) {
          if (dart.test(f(element))) return true;
        }
        return false;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        return ListOfE().from(this, {growable: growable});
      }
      toSet() {
        return SetOfE().from(this);
      }
      get length() {
        dart.assert(!_internal.EfficientLength.is(this));
        let count = 0;
        let it = this[dartx.iterator];
        while (dart.test(it.moveNext())) {
          count++;
        }
        return count;
      }
      get isEmpty() {
        return !dart.test(this[dartx.iterator].moveNext());
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      take(count) {
        return TakeIterableOfE().new(this, count);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      skip(count) {
        return SkipIterableOfE().new(this, count);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      get first() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        return it.current;
      }
      get last() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = null;
        do {
          result = it.current;
        } while (dart.test(it.moveNext()));
        return result;
      }
      get single() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
        let result = it.current;
        if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
        return result;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        for (let element of this) {
          if (dart.test(test(element))) return element;
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            if (foundMatching) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
        core.RangeError.checkNotNegative(index, "index");
        let elementIndex = 0;
        for (let element of this) {
          if (index == elementIndex) return element;
          elementIndex++;
        }
        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
      }
      toString() {
        return collection.IterableBase.iterableToShortString(this, '(', ')');
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(IterableMixin);
    IterableMixin[dart.implements] = () => [IterableOfE()];
    dart.setSignature(IterableMixin, {
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), []),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        elementAt: dart.definiteFunctionType(E, [core.int])
      })
    });
    dart.defineExtensionMembers(IterableMixin, [
      'map',
      'where',
      'expand',
      'contains',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'toList',
      'toSet',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'toString',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single'
    ]);
    return IterableMixin;
  });
  collection.IterableMixin = IterableMixin();
  dart.defineLazy(collection, {
    get _toStringVisiting() {
      return [];
    }
  });
  collection._isToStringVisiting = function(o) {
    for (let i = 0; i < dart.notNull(collection._toStringVisiting[dartx.length]); i++) {
      if (core.identical(o, collection._toStringVisiting[dartx._get](i))) return true;
    }
    return false;
  };
  dart.lazyFn(collection._isToStringVisiting, () => ObjectTobool());
  collection._iterablePartsToStrings = function(iterable, parts) {
    let LENGTH_LIMIT = 80;
    let HEAD_COUNT = 3;
    let TAIL_COUNT = 2;
    let MAX_COUNT = 100;
    let OVERHEAD = 2;
    let ELLIPSIS_SIZE = 3;
    let length = 0;
    let count = 0;
    let it = iterable[dartx.iterator];
    while (dart.notNull(length) < LENGTH_LIMIT || count < HEAD_COUNT) {
      if (!dart.test(it.moveNext())) return;
      let next = dart.str`${it.current}`;
      parts[dartx.add](next);
      length = dart.notNull(length) + (dart.notNull(next[dartx.length]) + OVERHEAD);
      count++;
    }
    let penultimateString = null;
    let ultimateString = null;
    let penultimate = null;
    let ultimate = null;
    if (!dart.test(it.moveNext())) {
      if (count <= HEAD_COUNT + TAIL_COUNT) return;
      ultimateString = core.String._check(parts[dartx.removeLast]());
      penultimateString = core.String._check(parts[dartx.removeLast]());
    } else {
      penultimate = it.current;
      count++;
      if (!dart.test(it.moveNext())) {
        if (count <= HEAD_COUNT + 1) {
          parts[dartx.add](dart.str`${penultimate}`);
          return;
        }
        ultimateString = dart.str`${penultimate}`;
        penultimateString = core.String._check(parts[dartx.removeLast]());
        length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + OVERHEAD);
      } else {
        ultimate = it.current;
        count++;
        dart.assert(count < MAX_COUNT);
        while (dart.test(it.moveNext())) {
          penultimate = ultimate;
          ultimate = it.current;
          count++;
          if (count > MAX_COUNT) {
            while (dart.notNull(length) > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD && count > HEAD_COUNT) {
              length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
              count--;
            }
            parts[dartx.add]("...");
            return;
          }
        }
        penultimateString = dart.str`${penultimate}`;
        ultimateString = dart.str`${ultimate}`;
        length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + dart.notNull(penultimateString[dartx.length]) + 2 * OVERHEAD);
      }
    }
    let elision = null;
    if (count > dart.notNull(parts[dartx.length]) + TAIL_COUNT) {
      elision = "...";
      length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
    }
    while (dart.notNull(length) > LENGTH_LIMIT && dart.notNull(parts[dartx.length]) > HEAD_COUNT) {
      length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
      if (elision == null) {
        elision = "...";
        length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
      }
    }
    if (elision != null) {
      parts[dartx.add](elision);
    }
    parts[dartx.add](penultimateString);
    parts[dartx.add](ultimateString);
  };
  dart.lazyFn(collection._iterablePartsToStrings, () => IterableAndListTovoid());
  const _iterator$0 = Symbol('_iterator');
  const _state$ = Symbol('_state');
  const _move = Symbol('_move');
  collection.HasNextIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class HasNextIterator extends core.Object {
      new(iterator) {
        this[_iterator$0] = iterator;
        this[_state$] = collection.HasNextIterator._NOT_MOVED_YET;
      }
      get hasNext() {
        if (this[_state$] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
        return this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
      }
      next() {
        if (!dart.test(this.hasNext)) dart.throw(new core.StateError("No more elements"));
        dart.assert(this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
        let result = this[_iterator$0].current;
        this[_move]();
        return result;
      }
      [_move]() {
        if (dart.test(this[_iterator$0].moveNext())) {
          this[_state$] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
        } else {
          this[_state$] = collection.HasNextIterator._NO_NEXT;
        }
      }
    }
    dart.addTypeTests(HasNextIterator);
    dart.setSignature(HasNextIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection.HasNextIterator$(E), [IteratorOfE()])}),
      fields: () => ({
        [_iterator$0]: IteratorOfE(),
        [_state$]: core.int
      }),
      getters: () => ({hasNext: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        next: dart.definiteFunctionType(E, []),
        [_move]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _HAS_NEXT_AND_NEXT_IN_CURRENT: core.int,
        _NO_NEXT: core.int,
        _NOT_MOVED_YET: core.int
      })
    });
    return HasNextIterator;
  });
  collection.HasNextIterator = HasNextIterator();
  collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT = 0;
  collection.HasNextIterator._NO_NEXT = 1;
  collection.HasNextIterator._NOT_MOVED_YET = 2;
  collection.LinkedHashMap$ = dart.generic((K, V) => {
    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
    let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
    let _LinkedCustomHashMapOfK$V = () => (_LinkedCustomHashMapOfK$V = dart.constFn(collection._LinkedCustomHashMap$(K, V)))();
    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
    let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
    let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    class LinkedHashMap extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return JsLinkedHashMapOfK$V().es6();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return _LinkedIdentityHashMapOfK$V().es6();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_LinkedCustomHashMapOfK$V())(equals, hashCode, isValidKey);
      }
      static identity() {
        return _LinkedIdentityHashMapOfK$V().es6();
      }
      static from(other) {
        let result = LinkedHashMapOfK$V().new();
        other[dartx.forEach](dart.fn((k, v) => {
          result._set(K.as(k), V.as(v));
        }, dynamicAnddynamicTovoid$()));
        return result;
      }
      static fromIterable(iterable, opts) {
        let key = opts && 'key' in opts ? opts.key : null;
        let value = opts && 'value' in opts ? opts.value : null;
        let map = LinkedHashMapOfK$V().new();
        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
        return map;
      }
      static fromIterables(keys, values) {
        let map = LinkedHashMapOfK$V().new();
        collection.Maps._fillMapWithIterables(map, keys, values);
        return map;
      }
    }
    dart.addTypeTests(LinkedHashMap);
    LinkedHashMap[dart.implements] = () => [HashMapOfK$V()];
    dart.setSignature(LinkedHashMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), []),
        from: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Map]),
        fromIterable: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
        fromIterables: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [IterableOfK(), IterableOfV()])
      })
    });
    return LinkedHashMap;
  });
  collection.LinkedHashMap = LinkedHashMap();
  collection.LinkedHashSet$ = dart.generic(E => {
    let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
    let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
    let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
    let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
    let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
    class LinkedHashSet extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return new (_LinkedHashSetOfE())();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return new (_LinkedIdentityHashSetOfE())();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_LinkedCustomHashSetOfE())(equals, hashCode, isValidKey);
      }
      static identity() {
        return new (_LinkedIdentityHashSetOfE())();
      }
      static from(elements) {
        let result = LinkedHashSetOfE().new();
        for (let element of elements) {
          let e = E.as(element);
          result.add(e);
        }
        return result;
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(LinkedHashSet);
    LinkedHashSet[dart.implements] = () => [HashSetOfE()];
    dart.setSignature(LinkedHashSet, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.LinkedHashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.LinkedHashSet$(E), []),
        from: dart.definiteFunctionType(collection.LinkedHashSet$(E), [core.Iterable])
      })
    });
    return LinkedHashSet;
  });
  collection.LinkedHashSet = LinkedHashSet();
  const _modificationCount = Symbol('_modificationCount');
  const _insertBefore$ = Symbol('_insertBefore');
  const _list = Symbol('_list');
  const _unlink$ = Symbol('_unlink');
  collection.LinkedList$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class LinkedList extends core.Iterable$(E) {
      new() {
        this[_modificationCount] = 0;
        this[_length$1] = 0;
        this[_first$] = null;
        super.new();
      }
      addFirst(entry) {
        E._check(entry);
        this[_insertBefore$](this[_first$], entry, {updateFirst: true});
        this[_first$] = entry;
      }
      add(entry) {
        E._check(entry);
        this[_insertBefore$](this[_first$], entry, {updateFirst: false});
      }
      addAll(entries) {
        IterableOfE()._check(entries);
        entries[dartx.forEach](dart.bind(this, 'add'));
      }
      remove(entry) {
        E._check(entry);
        if (!dart.equals(entry[_list], this)) return false;
        this[_unlink$](entry);
        return true;
      }
      get iterator() {
        return new (_LinkedListIteratorOfE())(this);
      }
      get length() {
        return this[_length$1];
      }
      clear() {
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        if (dart.test(this.isEmpty)) return;
        let next = this[_first$];
        do {
          let entry = next;
          next = entry[_next$0];
          entry[_next$0] = entry[_previous$0] = entry[_list] = null;
        } while (!core.identical(next, this[_first$]));
        this[_first$] = null;
        this[_length$1] = 0;
      }
      get first() {
        if (dart.test(this.isEmpty)) {
          dart.throw(new core.StateError('No such element'));
        }
        return this[_first$];
      }
      get last() {
        if (dart.test(this.isEmpty)) {
          dart.throw(new core.StateError('No such element'));
        }
        return this[_first$][_previous$0];
      }
      get single() {
        if (dart.test(this.isEmpty)) {
          dart.throw(new core.StateError('No such element'));
        }
        if (dart.notNull(this[_length$1]) > 1) {
          dart.throw(new core.StateError('Too many elements'));
        }
        return this[_first$];
      }
      forEach(action) {
        let modificationCount = this[_modificationCount];
        if (dart.test(this.isEmpty)) return;
        let current = this[_first$];
        do {
          action(current);
          if (modificationCount != this[_modificationCount]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          current = current[_next$0];
        } while (!core.identical(current, this[_first$]));
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      [_insertBefore$](entry, newEntry, opts) {
        E._check(entry);
        E._check(newEntry);
        let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
        if (newEntry.list != null) {
          dart.throw(new core.StateError('LinkedListEntry is already in a LinkedList'));
        }
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        newEntry[_list] = this;
        if (dart.test(this.isEmpty)) {
          dart.assert(entry == null);
          newEntry[_previous$0] = newEntry[_next$0] = newEntry;
          this[_first$] = newEntry;
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          return;
        }
        let predecessor = entry[_previous$0];
        let successor = entry;
        newEntry[_previous$0] = predecessor;
        newEntry[_next$0] = successor;
        predecessor[_next$0] = newEntry;
        successor[_previous$0] = newEntry;
        if (dart.test(updateFirst) && core.identical(entry, this[_first$])) {
          this[_first$] = newEntry;
        }
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
      }
      [_unlink$](entry) {
        E._check(entry);
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        entry[_next$0][_previous$0] = entry[_previous$0];
        let next = entry[_previous$0][_next$0] = entry[_next$0];
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        entry[_list] = entry[_next$0] = entry[_previous$0] = null;
        if (dart.test(this.isEmpty)) {
          this[_first$] = null;
        } else if (core.identical(entry, this[_first$])) {
          this[_first$] = next;
        }
      }
    }
    dart.setSignature(LinkedList, {
      constructors: () => ({new: dart.definiteFunctionType(collection.LinkedList$(E), [])}),
      fields: () => ({
        [_modificationCount]: core.int,
        [_length$1]: core.int,
        [_first$]: E
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        addFirst: dart.definiteFunctionType(dart.void, [E]),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [E]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
        [_unlink$]: dart.definiteFunctionType(dart.void, [E])
      })
    });
    dart.defineExtensionMembers(LinkedList, [
      'forEach',
      'iterator',
      'length',
      'first',
      'last',
      'single',
      'isEmpty'
    ]);
    return LinkedList;
  });
  collection.LinkedList = LinkedList();
  const _visitedFirst = Symbol('_visitedFirst');
  collection._LinkedListIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
    let LinkedListEntryOfE = () => (LinkedListEntryOfE = dart.constFn(collection.LinkedListEntry$(E)))();
    class _LinkedListIterator extends core.Object {
      new(list) {
        this[_list] = list;
        this[_modificationCount] = list[_modificationCount];
        this[_next$0] = list[_first$];
        this[_visitedFirst] = false;
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        if (this[_modificationCount] != this[_list][_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
          this[_current$2] = null;
          return false;
        }
        this[_visitedFirst] = true;
        this[_current$2] = E._check(this[_next$0]);
        this[_next$0] = this[_next$0][_next$0];
        return true;
      }
    }
    dart.addTypeTests(_LinkedListIterator);
    _LinkedListIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_LinkedListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedListIterator$(E), [LinkedListOfE()])}),
      fields: () => ({
        [_list]: LinkedListOfE(),
        [_modificationCount]: core.int,
        [_current$2]: E,
        [_next$0]: LinkedListEntryOfE(),
        [_visitedFirst]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _LinkedListIterator;
  });
  collection._LinkedListIterator = _LinkedListIterator();
  collection.LinkedListEntry$ = dart.generic(E => {
    let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
    class LinkedListEntry extends core.Object {
      new() {
        this[_list] = null;
        this[_next$0] = null;
        this[_previous$0] = null;
      }
      get list() {
        return this[_list];
      }
      unlink() {
        this[_list][_unlink$](E._check(this));
      }
      get next() {
        if (core.identical(this, this[_next$0])) return null;
        return this[_next$0];
      }
      get previous() {
        if (core.identical(this, this[_previous$0])) return null;
        return this[_previous$0];
      }
      insertAfter(entry) {
        E._check(entry);
        this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
      }
      insertBefore(entry) {
        E._check(entry);
        this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
      }
    }
    dart.addTypeTests(LinkedListEntry);
    dart.setSignature(LinkedListEntry, {
      fields: () => ({
        [_list]: LinkedListOfE(),
        [_next$0]: E,
        [_previous$0]: E
      }),
      getters: () => ({
        list: dart.definiteFunctionType(collection.LinkedList$(E), []),
        next: dart.definiteFunctionType(E, []),
        previous: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        unlink: dart.definiteFunctionType(dart.void, []),
        insertAfter: dart.definiteFunctionType(dart.void, [E]),
        insertBefore: dart.definiteFunctionType(dart.void, [E])
      })
    });
    return LinkedListEntry;
  });
  collection.LinkedListEntry = LinkedListEntry();
  collection.MapMixin$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let _MapBaseValueIterableOfK$V = () => (_MapBaseValueIterableOfK$V = dart.constFn(collection._MapBaseValueIterable$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    class MapMixin extends core.Object {
      forEach(action) {
        for (let key of this.keys) {
          action(key, this._get(key));
        }
      }
      addAll(other) {
        MapOfK$V()._check(other);
        for (let key of other[dartx.keys]) {
          this._set(key, other[dartx._get](key));
        }
      }
      containsValue(value) {
        for (let key of this.keys) {
          if (dart.equals(this._get(key), value)) return true;
        }
        return false;
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) {
          return this._get(key);
        }
        return this._set(key, ifAbsent());
      }
      containsKey(key) {
        return this.keys[dartx.contains](key);
      }
      get length() {
        return this.keys[dartx.length];
      }
      get isEmpty() {
        return this.keys[dartx.isEmpty];
      }
      get isNotEmpty() {
        return this.keys[dartx.isNotEmpty];
      }
      get values() {
        return new (_MapBaseValueIterableOfK$V())(this);
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    dart.addTypeTests(MapMixin);
    MapMixin[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(MapMixin, {
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object])
      })
    });
    dart.defineExtensionMembers(MapMixin, [
      'forEach',
      'addAll',
      'containsValue',
      'putIfAbsent',
      'containsKey',
      'length',
      'isEmpty',
      'isNotEmpty',
      'values'
    ]);
    return MapMixin;
  });
  collection.MapMixin = MapMixin();
  collection.MapBase$ = dart.generic((K, V) => {
    class MapBase extends dart.mixin(core.Object, collection.MapMixin$(K, V)) {}
    return MapBase;
  });
  collection.MapBase = MapBase();
  collection._UnmodifiableMapMixin$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    class _UnmodifiableMapMixin extends core.Object {
      _set(key, value) {
        K._check(key);
        V._check(value);
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
        return value;
      }
      addAll(other) {
        MapOfK$V()._check(other);
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
      remove(key) {
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
    }
    dart.addTypeTests(_UnmodifiableMapMixin);
    _UnmodifiableMapMixin[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(_UnmodifiableMapMixin, {
      methods: () => ({
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        clear: dart.definiteFunctionType(dart.void, []),
        remove: dart.definiteFunctionType(V, [core.Object]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()])
      })
    });
    dart.defineExtensionMembers(_UnmodifiableMapMixin, [
      '_set',
      'addAll',
      'clear',
      'remove',
      'putIfAbsent'
    ]);
    return _UnmodifiableMapMixin;
  });
  collection._UnmodifiableMapMixin = _UnmodifiableMapMixin();
  collection.UnmodifiableMapBase$ = dart.generic((K, V) => {
    class UnmodifiableMapBase extends dart.mixin(collection.MapBase$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
      new() {
        super.new();
      }
    }
    return UnmodifiableMapBase;
  });
  collection.UnmodifiableMapBase = UnmodifiableMapBase();
  collection._MapBaseValueIterable$ = dart.generic((K, V) => {
    let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    class _MapBaseValueIterable extends core.Iterable$(V) {
      new(map) {
        this[_map$0] = map;
        super.new();
      }
      get length() {
        return this[_map$0][dartx.length];
      }
      get isEmpty() {
        return this[_map$0][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_map$0][dartx.isNotEmpty];
      }
      get first() {
        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.first]);
      }
      get single() {
        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.single]);
      }
      get last() {
        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.last]);
      }
      get iterator() {
        return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
      }
    }
    _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_MapBaseValueIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
      fields: () => ({[_map$0]: MapOfK$V()}),
      getters: () => ({
        first: dart.definiteFunctionType(V, []),
        single: dart.definiteFunctionType(V, []),
        last: dart.definiteFunctionType(V, []),
        iterator: dart.definiteFunctionType(core.Iterator$(V), [])
      })
    });
    dart.defineExtensionMembers(_MapBaseValueIterable, [
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'single',
      'last',
      'iterator'
    ]);
    return _MapBaseValueIterable;
  });
  collection._MapBaseValueIterable = _MapBaseValueIterable();
  collection._MapBaseValueIterator$ = dart.generic((K, V) => {
    let IteratorOfK = () => (IteratorOfK = dart.constFn(core.Iterator$(K)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
    class _MapBaseValueIterator extends core.Object {
      new(map) {
        this[_map$0] = map;
        this[_keys] = map[dartx.keys][dartx.iterator];
        this[_current$2] = null;
      }
      moveNext() {
        if (dart.test(this[_keys].moveNext())) {
          this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
          return true;
        }
        this[_current$2] = null;
        return false;
      }
      get current() {
        return this[_current$2];
      }
    }
    dart.addTypeTests(_MapBaseValueIterator);
    _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
    dart.setSignature(_MapBaseValueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
      fields: () => ({
        [_keys]: IteratorOfK(),
        [_map$0]: MapOfK$V(),
        [_current$2]: V
      }),
      getters: () => ({current: dart.definiteFunctionType(V, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _MapBaseValueIterator;
  });
  collection._MapBaseValueIterator = _MapBaseValueIterator();
  collection.MapView$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    class MapView extends core.Object {
      new(map) {
        this[_map$0] = map;
      }
      _get(key) {
        return this[_map$0][dartx._get](key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        this[_map$0][dartx._set](key, value);
        return value;
      }
      addAll(other) {
        MapOfK$V()._check(other);
        this[_map$0][dartx.addAll](other);
      }
      clear() {
        this[_map$0][dartx.clear]();
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        return this[_map$0][dartx.putIfAbsent](key, ifAbsent);
      }
      containsKey(key) {
        return this[_map$0][dartx.containsKey](key);
      }
      containsValue(value) {
        return this[_map$0][dartx.containsValue](value);
      }
      forEach(action) {
        this[_map$0][dartx.forEach](action);
      }
      get isEmpty() {
        return this[_map$0][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_map$0][dartx.isNotEmpty];
      }
      get length() {
        return this[_map$0][dartx.length];
      }
      get keys() {
        return this[_map$0][dartx.keys];
      }
      remove(key) {
        return this[_map$0][dartx.remove](key);
      }
      toString() {
        return dart.toString(this[_map$0]);
      }
      get values() {
        return this[_map$0][dartx.values];
      }
    }
    dart.addTypeTests(MapView);
    MapView[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(MapView, {
      constructors: () => ({new: dart.definiteFunctionType(collection.MapView$(K, V), [MapOfK$V()])}),
      fields: () => ({[_map$0]: MapOfK$V()}),
      getters: () => ({
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        length: dart.definiteFunctionType(core.int, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        clear: dart.definiteFunctionType(dart.void, []),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        remove: dart.definiteFunctionType(V, [core.Object])
      })
    });
    dart.defineExtensionMembers(MapView, [
      '_get',
      '_set',
      'addAll',
      'clear',
      'putIfAbsent',
      'containsKey',
      'containsValue',
      'forEach',
      'remove',
      'isEmpty',
      'isNotEmpty',
      'length',
      'keys',
      'values'
    ]);
    return MapView;
  });
  collection.MapView = MapView();
  collection.UnmodifiableMapView$ = dart.generic((K, V) => {
    class UnmodifiableMapView extends dart.mixin(collection.MapView$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
      new(map) {
        super.new(map);
      }
    }
    return UnmodifiableMapView;
  });
  collection.UnmodifiableMapView = UnmodifiableMapView();
  collection.Maps = class Maps extends core.Object {
    static containsValue(map, value) {
      for (let v of map[dartx.values]) {
        if (dart.equals(v, value)) {
          return true;
        }
      }
      return false;
    }
    static containsKey(map, key) {
      for (let k of map[dartx.keys]) {
        if (dart.equals(k, key)) {
          return true;
        }
      }
      return false;
    }
    static putIfAbsent(map, key, ifAbsent) {
      if (dart.test(map[dartx.containsKey](key))) {
        return map[dartx._get](key);
      }
      let v = ifAbsent();
      map[dartx._set](key, v);
      return v;
    }
    static clear(map) {
      for (let k of map[dartx.keys][dartx.toList]()) {
        map[dartx.remove](k);
      }
    }
    static forEach(map, f) {
      for (let k of map[dartx.keys]) {
        dart.dcall(f, k, map[dartx._get](k));
      }
    }
    static getValues(map) {
      return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic$()));
    }
    static length(map) {
      return map[dartx.keys][dartx.length];
    }
    static isEmpty(map) {
      return map[dartx.keys][dartx.isEmpty];
    }
    static isNotEmpty(map) {
      return map[dartx.keys][dartx.isNotEmpty];
    }
    static mapToString(m) {
      if (dart.test(collection._isToStringVisiting(m))) {
        return '{...}';
      }
      let result = new core.StringBuffer();
      try {
        collection._toStringVisiting[dartx.add](m);
        result.write('{');
        let first = true;
        m[dartx.forEach](dart.fn((k, v) => {
          if (!first) {
            result.write(', ');
          }
          first = false;
          result.write(k);
          result.write(': ');
          result.write(v);
        }, dynamicAnddynamicTovoid$()));
        result.write('}');
      } finally {
        dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
        collection._toStringVisiting[dartx.removeLast]();
      }
      return result.toString();
    }
    static _id(x) {
      return x;
    }
    static _fillMapWithMappedIterable(map, iterable, key, value) {
      if (key == null) key = collection.Maps._id;
      if (value == null) value = collection.Maps._id;
      for (let element of iterable) {
        map[dartx._set](dart.dcall(key, element), dart.dcall(value, element));
      }
    }
    static _fillMapWithIterables(map, keys, values) {
      let keyIterator = keys[dartx.iterator];
      let valueIterator = values[dartx.iterator];
      let hasNextKey = keyIterator.moveNext();
      let hasNextValue = valueIterator.moveNext();
      while (dart.test(hasNextKey) && dart.test(hasNextValue)) {
        map[dartx._set](keyIterator.current, valueIterator.current);
        hasNextKey = keyIterator.moveNext();
        hasNextValue = valueIterator.moveNext();
      }
      if (dart.test(hasNextKey) || dart.test(hasNextValue)) {
        dart.throw(new core.ArgumentError("Iterables do not have same length."));
      }
    }
  };
  dart.setSignature(collection.Maps, {
    statics: () => ({
      containsValue: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [core.Map, dart.dynamic, VoidTodynamic()]),
      clear: dart.definiteFunctionType(dart.dynamic, [core.Map]),
      forEach: dart.definiteFunctionType(dart.dynamic, [core.Map, dynamicAnddynamicTovoid()]),
      getValues: dart.definiteFunctionType(core.Iterable, [core.Map]),
      length: dart.definiteFunctionType(core.int, [core.Map]),
      isEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
      isNotEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
      mapToString: dart.definiteFunctionType(core.String, [core.Map]),
      _id: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _fillMapWithMappedIterable: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, dynamicTodynamic(), dynamicTodynamic()]),
      _fillMapWithIterables: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, core.Iterable])
    }),
    names: ['containsValue', 'containsKey', 'putIfAbsent', 'clear', 'forEach', 'getValues', 'length', 'isEmpty', 'isNotEmpty', 'mapToString', '_id', '_fillMapWithMappedIterable', '_fillMapWithIterables']
  });
  collection.Queue$ = dart.generic(E => {
    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class Queue extends core.Object {
      static new() {
        return new (ListQueueOfE())();
      }
      static from(elements) {
        return ListQueueOfE().from(elements);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(Queue);
    Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
    dart.setSignature(Queue, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.Queue$(E), []),
        from: dart.definiteFunctionType(collection.Queue$(E), [core.Iterable])
      })
    });
    return Queue;
  });
  collection.Queue = Queue();
  const _previousLink = Symbol('_previousLink');
  const _nextLink = Symbol('_nextLink');
  const _link = Symbol('_link');
  collection._DoubleLink$ = dart.generic(E => {
    class _DoubleLink extends core.Object {
      new() {
        this[_previousLink] = null;
        this[_nextLink] = null;
      }
      [_link](previous, next) {
        E._check(previous);
        E._check(next);
        this[_nextLink] = next;
        this[_previousLink] = previous;
        if (previous != null) previous[_nextLink] = this;
        if (next != null) next[_previousLink] = this;
      }
      [_unlink$]() {
        if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
        if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
        this[_nextLink] = null;
        this[_previousLink] = null;
      }
    }
    dart.addTypeTests(_DoubleLink);
    dart.setSignature(_DoubleLink, {
      fields: () => ({
        [_previousLink]: E,
        [_nextLink]: E
      }),
      methods: () => ({
        [_link]: dart.definiteFunctionType(dart.void, [E, E]),
        [_unlink$]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _DoubleLink;
  });
  collection._DoubleLink = _DoubleLink();
  collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
    class DoubleLinkedQueueEntry extends core.Object {
      static new(element) {
        return new (_UserDoubleLinkedQueueEntryOfE())(element);
      }
    }
    dart.addTypeTests(DoubleLinkedQueueEntry);
    dart.setSignature(DoubleLinkedQueueEntry, {
      constructors: () => ({new: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [E])})
    });
    return DoubleLinkedQueueEntry;
  });
  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
  collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
    class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
      new(element) {
        this.element = element;
        super.new();
      }
      append(e) {
        E._check(e);
        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
      }
      prepend(e) {
        E._check(e);
        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
      }
      remove() {
        this[_unlink$]();
        return this.element;
      }
      previousEntry() {
        return this[_previousLink];
      }
      nextEntry() {
        return this[_nextLink];
      }
    }
    _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
    dart.setSignature(_UserDoubleLinkedQueueEntry, {
      constructors: () => ({new: dart.definiteFunctionType(collection._UserDoubleLinkedQueueEntry$(E), [E])}),
      fields: () => ({element: E}),
      methods: () => ({
        append: dart.definiteFunctionType(dart.void, [E]),
        prepend: dart.definiteFunctionType(dart.void, [E]),
        remove: dart.definiteFunctionType(E, []),
        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
      })
    });
    return _UserDoubleLinkedQueueEntry;
  }, _UserDoubleLinkedQueueEntry => {
    dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
  });
  collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
  const _queue = Symbol('_queue');
  const _append = Symbol('_append');
  const _prepend = Symbol('_prepend');
  const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
  collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    class _DoubleLinkedQueueEntry extends collection._DoubleLink {
      new(queue) {
        this[_queue] = queue;
        super.new();
      }
      [_append](e) {
        E._check(e);
        new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this, this[_nextLink]);
      }
      [_prepend](e) {
        E._check(e);
        new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
      }
      nextEntry() {
        return this[_nextLink][_asNonSentinelEntry]();
      }
      previousEntry() {
        return this[_previousLink][_asNonSentinelEntry]();
      }
    }
    dart.setSignature(_DoubleLinkedQueueEntry, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueEntry$(E), [DoubleLinkedQueueOfE()])}),
      fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
      methods: () => ({
        [_append]: dart.definiteFunctionType(dart.void, [E]),
        [_prepend]: dart.definiteFunctionType(dart.void, [E]),
        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
      })
    });
    return _DoubleLinkedQueueEntry;
  }, _DoubleLinkedQueueEntry => {
    dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
  });
  collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
  const _elementCount = Symbol('_elementCount');
  collection._DoubleLinkedQueueElement$ = dart.generic(E => {
    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
      new(element, queue) {
        this.element = element;
        super.new(queue);
      }
      append(e) {
        E._check(e);
        this[_append](e);
        if (this[_queue] != null) {
          let o = this[_queue];
          o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
        }
      }
      prepend(e) {
        E._check(e);
        this[_prepend](e);
        if (this[_queue] != null) {
          let o = this[_queue];
          o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
        }
      }
      [_remove]() {
        this[_queue] = null;
        this[_unlink$]();
        return this.element;
      }
      remove() {
        if (this[_queue] != null) {
          let o = this[_queue];
          o[_elementCount] = dart.notNull(o[_elementCount]) - 1;
        }
        return this[_remove]();
      }
      [_asNonSentinelEntry]() {
        return this;
      }
    }
    _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
    dart.setSignature(_DoubleLinkedQueueElement, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [E, DoubleLinkedQueueOfE()])}),
      fields: () => ({element: E}),
      methods: () => ({
        append: dart.definiteFunctionType(dart.void, [E]),
        prepend: dart.definiteFunctionType(dart.void, [E]),
        [_remove]: dart.definiteFunctionType(E, []),
        remove: dart.definiteFunctionType(E, []),
        [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
      })
    });
    return _DoubleLinkedQueueElement;
  });
  collection._DoubleLinkedQueueElement = _DoubleLinkedQueueElement();
  collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
      new(queue) {
        super.new(queue);
        this[_previousLink] = this;
        this[_nextLink] = this;
      }
      [_asNonSentinelEntry]() {
        return null;
      }
      [_remove]() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      get element() {
        dart.throw(_internal.IterableElementError.noElement());
      }
    }
    dart.setSignature(_DoubleLinkedQueueSentinel, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueSentinel$(E), [DoubleLinkedQueueOfE()])}),
      getters: () => ({element: dart.definiteFunctionType(E, [])}),
      methods: () => ({
        [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        [_remove]: dart.definiteFunctionType(E, [])
      })
    });
    return _DoubleLinkedQueueSentinel;
  });
  collection._DoubleLinkedQueueSentinel = _DoubleLinkedQueueSentinel();
  const _sentinel = Symbol('_sentinel');
  collection.DoubleLinkedQueue$ = dart.generic(E => {
    let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
    let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
    let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
    let DoubleLinkedQueueEntryOfETovoid = () => (DoubleLinkedQueueEntryOfETovoid = dart.constFn(dart.functionType(dart.void, [DoubleLinkedQueueEntryOfE()])))();
    class DoubleLinkedQueue extends core.Iterable$(E) {
      new() {
        this[_sentinel] = null;
        this[_elementCount] = 0;
        super.new();
        this[_sentinel] = new (_DoubleLinkedQueueSentinelOfE())(this);
      }
      static from(elements) {
        let list = new (DoubleLinkedQueueOfE())();
        for (let e of elements) {
          let element = E.as(e);
          list.addLast(element);
        }
        return DoubleLinkedQueueOfE()._check(list);
      }
      get length() {
        return this[_elementCount];
      }
      addLast(value) {
        E._check(value);
        this[_sentinel][_prepend](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
      addFirst(value) {
        E._check(value);
        this[_sentinel][_append](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
      add(value) {
        E._check(value);
        this[_sentinel][_prepend](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        for (let value of iterable) {
          this[_sentinel][_prepend](value);
          this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
        }
      }
      removeLast() {
        let lastEntry = this[_sentinel][_previousLink];
        let result = lastEntry[_remove]();
        this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
        return result;
      }
      removeFirst() {
        let firstEntry = this[_sentinel][_nextLink];
        let result = firstEntry[_remove]();
        this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
        return result;
      }
      remove(o) {
        let entry = this[_sentinel][_nextLink];
        while (!core.identical(entry, this[_sentinel])) {
          if (dart.equals(entry.element, o)) {
            entry[_remove]();
            this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
            return true;
          }
          entry = entry[_nextLink];
        }
        return false;
      }
      [_filter](test, removeMatching) {
        let entry = this[_sentinel][_nextLink];
        while (!core.identical(entry, this[_sentinel])) {
          let next = entry[_nextLink];
          if (core.identical(removeMatching, test(entry.element))) {
            entry[_remove]();
            this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
          }
          entry = next;
        }
      }
      removeWhere(test) {
        this[_filter](test, true);
      }
      retainWhere(test) {
        this[_filter](test, false);
      }
      get first() {
        let firstEntry = this[_sentinel][_nextLink];
        return firstEntry.element;
      }
      get last() {
        let lastEntry = this[_sentinel][_previousLink];
        return lastEntry.element;
      }
      get single() {
        if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
          let entry = this[_sentinel][_nextLink];
          return entry.element;
        }
        dart.throw(_internal.IterableElementError.tooMany());
      }
      lastEntry() {
        return this[_sentinel].previousEntry();
      }
      firstEntry() {
        return this[_sentinel].nextEntry();
      }
      get isEmpty() {
        return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
      }
      clear() {
        this[_sentinel][_nextLink] = this[_sentinel];
        this[_sentinel][_previousLink] = this[_sentinel];
        this[_elementCount] = 0;
      }
      forEachEntry(f) {
        let entry = this[_sentinel][_nextLink];
        while (!core.identical(entry, this[_sentinel])) {
          let nextEntry = entry[_nextLink];
          let element = _DoubleLinkedQueueElementOfE()._check(entry);
          f(element);
          entry = nextEntry;
        }
      }
      get iterator() {
        return new (_DoubleLinkedQueueIteratorOfE())(this[_sentinel]);
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '{', '}');
      }
    }
    DoubleLinkedQueue[dart.implements] = () => [QueueOfE()];
    dart.setSignature(DoubleLinkedQueue, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), []),
        from: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), [core.Iterable])
      }),
      fields: () => ({
        [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
        [_elementCount]: core.int
      }),
      getters: () => ({
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, []),
        iterator: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [])
      }),
      methods: () => ({
        addLast: dart.definiteFunctionType(dart.void, [E]),
        addFirst: dart.definiteFunctionType(dart.void, [E]),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        removeLast: dart.definiteFunctionType(E, []),
        removeFirst: dart.definiteFunctionType(E, []),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        clear: dart.definiteFunctionType(dart.void, []),
        forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
      })
    });
    dart.defineExtensionMembers(DoubleLinkedQueue, [
      'toString',
      'length',
      'first',
      'last',
      'single',
      'isEmpty',
      'iterator'
    ]);
    return DoubleLinkedQueue;
  });
  collection.DoubleLinkedQueue = DoubleLinkedQueue();
  const _nextEntry = Symbol('_nextEntry');
  collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
    class _DoubleLinkedQueueIterator extends core.Object {
      new(sentinel) {
        this[_sentinel] = sentinel;
        this[_nextEntry] = sentinel[_nextLink];
        this[_current$2] = null;
      }
      moveNext() {
        if (core.identical(this[_nextEntry], this[_sentinel])) {
          this[_current$2] = null;
          this[_nextEntry] = null;
          this[_sentinel] = null;
          return false;
        }
        let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
        if (elementEntry[_queue] == null) {
          dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
        }
        this[_current$2] = elementEntry.element;
        this[_nextEntry] = elementEntry[_nextLink];
        return true;
      }
      get current() {
        return this[_current$2];
      }
    }
    dart.addTypeTests(_DoubleLinkedQueueIterator);
    _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_DoubleLinkedQueueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
      fields: () => ({
        [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
        [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _DoubleLinkedQueueIterator;
  });
  collection._DoubleLinkedQueueIterator = _DoubleLinkedQueueIterator();
  const _head = Symbol('_head');
  const _tail = Symbol('_tail');
  const _table = Symbol('_table');
  const _checkModification = Symbol('_checkModification');
  const _writeToList = Symbol('_writeToList');
  const _preGrow = Symbol('_preGrow');
  const _grow = Symbol('_grow');
  collection.ListQueue$ = dart.generic(E => {
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
    let _ListQueueIteratorOfE = () => (_ListQueueIteratorOfE = dart.constFn(collection._ListQueueIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class ListQueue extends core.Iterable$(E) {
      new(initialCapacity) {
        if (initialCapacity === void 0) initialCapacity = null;
        this[_head] = 0;
        this[_tail] = 0;
        this[_table] = null;
        this[_modificationCount] = 0;
        super.new();
        if (initialCapacity == null || dart.notNull(initialCapacity) < collection.ListQueue._INITIAL_CAPACITY) {
          initialCapacity = collection.ListQueue._INITIAL_CAPACITY;
        } else if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) {
          initialCapacity = collection.ListQueue._nextPowerOf2(initialCapacity);
        }
        dart.assert(collection.ListQueue._isPowerOf2(initialCapacity));
        this[_table] = ListOfE().new(initialCapacity);
      }
      static from(elements) {
        if (core.List.is(elements)) {
          let length = elements[dartx.length];
          let queue = new (ListQueueOfE())(dart.notNull(length) + 1);
          dart.assert(dart.notNull(queue[_table][dartx.length]) > dart.notNull(length));
          for (let i = 0; i < dart.notNull(length); i++) {
            queue[_table][dartx._set](i, E.as(elements[dartx._get](i)));
          }
          queue[_tail] = length;
          return queue;
        } else {
          let capacity = collection.ListQueue._INITIAL_CAPACITY;
          if (_internal.EfficientLength.is(elements)) {
            capacity = elements[dartx.length];
          }
          let result = new (ListQueueOfE())(capacity);
          for (let element of elements) {
            result.addLast(E.as(element));
          }
          return result;
        }
      }
      get iterator() {
        return new (_ListQueueIteratorOfE())(this);
      }
      forEach(action) {
        let modificationCount = this[_modificationCount];
        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
          action(this[_table][dartx._get](i));
          this[_checkModification](modificationCount);
        }
      }
      get isEmpty() {
        return this[_head] == this[_tail];
      }
      get length() {
        return (dart.notNull(this[_tail]) - dart.notNull(this[_head]) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
      }
      get first() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        return this[_table][dartx._get](this[_head]);
      }
      get last() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        return this[_table][dartx._get]((dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
      }
      get single() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this[_table][dartx._get](this[_head]);
      }
      elementAt(index) {
        core.RangeError.checkValidIndex(index, this);
        return this[_table][dartx._get]((dart.notNull(this[_head]) + dart.notNull(index) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let list = null;
        if (dart.test(growable)) {
          list = ListOfE().new();
          list[dartx.length] = this.length;
        } else {
          list = ListOfE().new(this.length);
        }
        this[_writeToList](list);
        return list;
      }
      add(value) {
        E._check(value);
        this[_add$0](value);
      }
      addAll(elements) {
        IterableOfE()._check(elements);
        if (ListOfE().is(elements)) {
          let list = elements;
          let addCount = list[dartx.length];
          let length = this.length;
          if (dart.notNull(length) + dart.notNull(addCount) >= dart.notNull(this[_table][dartx.length])) {
            this[_preGrow](dart.notNull(length) + dart.notNull(addCount));
            this[_table][dartx.setRange](length, dart.notNull(length) + dart.notNull(addCount), list, 0);
            this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
          } else {
            let endSpace = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_tail]);
            if (dart.notNull(addCount) < endSpace) {
              this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + dart.notNull(addCount), list, 0);
              this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
            } else {
              let preSpace = dart.notNull(addCount) - endSpace;
              this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + endSpace, list, 0);
              this[_table][dartx.setRange](0, preSpace, list, endSpace);
              this[_tail] = preSpace;
            }
          }
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        } else {
          for (let element of elements)
            this[_add$0](element);
        }
      }
      remove(value) {
        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
          let element = this[_table][dartx._get](i);
          if (dart.equals(element, value)) {
            this[_remove](i);
            this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
            return true;
          }
        }
        return false;
      }
      [_filterWhere](test, removeMatching) {
        let modificationCount = this[_modificationCount];
        let i = this[_head];
        while (i != this[_tail]) {
          let element = this[_table][dartx._get](i);
          let remove = core.identical(removeMatching, test(element));
          this[_checkModification](modificationCount);
          if (remove) {
            i = this[_remove](i);
            modificationCount = this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
          } else {
            i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
          }
        }
      }
      removeWhere(test) {
        this[_filterWhere](test, true);
      }
      retainWhere(test) {
        this[_filterWhere](test, false);
      }
      clear() {
        if (this[_head] != this[_tail]) {
          for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
            this[_table][dartx._set](i, null);
          }
          this[_head] = this[_tail] = 0;
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        }
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, "{", "}");
      }
      addLast(value) {
        E._check(value);
        this[_add$0](value);
      }
      addFirst(value) {
        E._check(value);
        this[_head] = (dart.notNull(this[_head]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        this[_table][dartx._set](this[_head], value);
        if (this[_head] == this[_tail]) this[_grow]();
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
      removeFirst() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        let result = this[_table][dartx._get](this[_head]);
        this[_table][dartx._set](this[_head], null);
        this[_head] = (dart.notNull(this[_head]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        return result;
      }
      removeLast() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        this[_tail] = (dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        let result = this[_table][dartx._get](this[_tail]);
        this[_table][dartx._set](this[_tail], null);
        return result;
      }
      static _isPowerOf2(number) {
        return (dart.notNull(number) & dart.notNull(number) - 1) == 0;
      }
      static _nextPowerOf2(number) {
        dart.assert(dart.notNull(number) > 0);
        number = (dart.notNull(number) << 1 >>> 0) - 1;
        for (;;) {
          let nextNumber = (dart.notNull(number) & dart.notNull(number) - 1) >>> 0;
          if (nextNumber == 0) return number;
          number = nextNumber;
        }
      }
      [_checkModification](expectedModificationCount) {
        if (expectedModificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      [_add$0](element) {
        E._check(element);
        this[_table][dartx._set](this[_tail], element);
        this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        if (this[_head] == this[_tail]) this[_grow]();
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
      [_remove](offset) {
        let mask = dart.notNull(this[_table][dartx.length]) - 1;
        let startDistance = (dart.notNull(offset) - dart.notNull(this[_head]) & mask) >>> 0;
        let endDistance = (dart.notNull(this[_tail]) - dart.notNull(offset) & mask) >>> 0;
        if (startDistance < endDistance) {
          let i = offset;
          while (i != this[_head]) {
            let prevOffset = (dart.notNull(i) - 1 & mask) >>> 0;
            this[_table][dartx._set](i, this[_table][dartx._get](prevOffset));
            i = prevOffset;
          }
          this[_table][dartx._set](this[_head], null);
          this[_head] = (dart.notNull(this[_head]) + 1 & mask) >>> 0;
          return (dart.notNull(offset) + 1 & mask) >>> 0;
        } else {
          this[_tail] = (dart.notNull(this[_tail]) - 1 & mask) >>> 0;
          let i = offset;
          while (i != this[_tail]) {
            let nextOffset = (dart.notNull(i) + 1 & mask) >>> 0;
            this[_table][dartx._set](i, this[_table][dartx._get](nextOffset));
            i = nextOffset;
          }
          this[_table][dartx._set](this[_tail], null);
          return offset;
        }
      }
      [_grow]() {
        let newTable = ListOfE().new(dart.notNull(this[_table][dartx.length]) * 2);
        let split = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
        newTable[dartx.setRange](0, split, this[_table], this[_head]);
        newTable[dartx.setRange](split, split + dart.notNull(this[_head]), this[_table], 0);
        this[_head] = 0;
        this[_tail] = this[_table][dartx.length];
        this[_table] = newTable;
      }
      [_writeToList](target) {
        ListOfE()._check(target);
        dart.assert(dart.notNull(target[dartx.length]) >= dart.notNull(this.length));
        if (dart.notNull(this[_head]) <= dart.notNull(this[_tail])) {
          let length = dart.notNull(this[_tail]) - dart.notNull(this[_head]);
          target[dartx.setRange](0, length, this[_table], this[_head]);
          return length;
        } else {
          let firstPartSize = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
          target[dartx.setRange](0, firstPartSize, this[_table], this[_head]);
          target[dartx.setRange](firstPartSize, firstPartSize + dart.notNull(this[_tail]), this[_table], 0);
          return dart.notNull(this[_tail]) + firstPartSize;
        }
      }
      [_preGrow](newElementCount) {
        dart.assert(dart.notNull(newElementCount) >= dart.notNull(this.length));
        newElementCount = dart.notNull(newElementCount) + newElementCount[dartx['>>']](1);
        let newCapacity = collection.ListQueue._nextPowerOf2(newElementCount);
        let newTable = ListOfE().new(newCapacity);
        this[_tail] = this[_writeToList](newTable);
        this[_table] = newTable;
        this[_head] = 0;
      }
    }
    ListQueue[dart.implements] = () => [QueueOfE()];
    dart.setSignature(ListQueue, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.ListQueue$(E), [], [core.int]),
        from: dart.definiteFunctionType(collection.ListQueue$(E), [core.Iterable])
      }),
      fields: () => ({
        [_table]: ListOfE(),
        [_head]: core.int,
        [_tail]: core.int,
        [_modificationCount]: core.int
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        elementAt: dart.definiteFunctionType(E, [core.int]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        clear: dart.definiteFunctionType(dart.void, []),
        addLast: dart.definiteFunctionType(dart.void, [E]),
        addFirst: dart.definiteFunctionType(dart.void, [E]),
        removeFirst: dart.definiteFunctionType(E, []),
        removeLast: dart.definiteFunctionType(E, []),
        [_checkModification]: dart.definiteFunctionType(dart.void, [core.int]),
        [_add$0]: dart.definiteFunctionType(dart.void, [E]),
        [_remove]: dart.definiteFunctionType(core.int, [core.int]),
        [_grow]: dart.definiteFunctionType(dart.void, []),
        [_writeToList]: dart.definiteFunctionType(core.int, [ListOfE()]),
        [_preGrow]: dart.definiteFunctionType(dart.void, [core.int])
      }),
      sfields: () => ({_INITIAL_CAPACITY: core.int}),
      statics: () => ({
        _isPowerOf2: dart.definiteFunctionType(core.bool, [core.int]),
        _nextPowerOf2: dart.definiteFunctionType(core.int, [core.int])
      }),
      names: ['_isPowerOf2', '_nextPowerOf2']
    });
    dart.defineExtensionMembers(ListQueue, [
      'forEach',
      'elementAt',
      'toList',
      'toString',
      'iterator',
      'isEmpty',
      'length',
      'first',
      'last',
      'single'
    ]);
    return ListQueue;
  });
  collection.ListQueue = ListQueue();
  collection.ListQueue._INITIAL_CAPACITY = 8;
  const _end = Symbol('_end');
  const _position = Symbol('_position');
  collection._ListQueueIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
    class _ListQueueIterator extends core.Object {
      new(queue) {
        this[_queue] = queue;
        this[_end] = queue[_tail];
        this[_modificationCount] = queue[_modificationCount];
        this[_position] = queue[_head];
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        this[_queue][_checkModification](this[_modificationCount]);
        if (this[_position] == this[_end]) {
          this[_current$2] = null;
          return false;
        }
        this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
        this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
        return true;
      }
    }
    dart.addTypeTests(_ListQueueIterator);
    _ListQueueIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_ListQueueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._ListQueueIterator$(E), [ListQueueOfE()])}),
      fields: () => ({
        [_queue]: ListQueueOfE(),
        [_end]: core.int,
        [_modificationCount]: core.int,
        [_position]: core.int,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _ListQueueIterator;
  });
  collection._ListQueueIterator = _ListQueueIterator();
  collection._Predicate$ = dart.generic(T => {
    const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
    return _Predicate;
  });
  collection._Predicate = _Predicate$();
  collection._SplayTreeNode$ = dart.generic(K => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    class _SplayTreeNode extends core.Object {
      new(key) {
        this.key = key;
        this.left = null;
        this.right = null;
      }
    }
    dart.addTypeTests(_SplayTreeNode);
    dart.setSignature(_SplayTreeNode, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeNode$(K), [K])}),
      fields: () => ({
        key: K,
        left: _SplayTreeNodeOfK(),
        right: _SplayTreeNodeOfK()
      })
    });
    return _SplayTreeNode;
  });
  collection._SplayTreeNode = _SplayTreeNode();
  collection._SplayTreeMapNode$ = dart.generic((K, V) => {
    class _SplayTreeMapNode extends collection._SplayTreeNode$(K) {
      new(key, value) {
        this.value = value;
        super.new(key);
      }
    }
    dart.setSignature(_SplayTreeMapNode, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeMapNode$(K, V), [K, V])}),
      fields: () => ({value: V})
    });
    return _SplayTreeMapNode;
  });
  collection._SplayTreeMapNode = _SplayTreeMapNode();
  const _count$ = Symbol('_count');
  const _splayCount = Symbol('_splayCount');
  const _root = Symbol('_root');
  const _dummy = Symbol('_dummy');
  const _comparator = Symbol('_comparator');
  const _compare = Symbol('_compare');
  const _splay = Symbol('_splay');
  const _splayMin = Symbol('_splayMin');
  const _splayMax = Symbol('_splayMax');
  const _addNewRoot = Symbol('_addNewRoot');
  const _clear$ = Symbol('_clear');
  collection._SplayTree$ = dart.generic((K, Node) => {
    class _SplayTree extends core.Object {
      new() {
        this[_count$] = 0;
        this[_modificationCount] = 0;
        this[_splayCount] = 0;
      }
      [_splay](key) {
        K._check(key);
        if (this[_root] == null) return -1;
        let left = this[_dummy];
        let right = this[_dummy];
        let current = this[_root];
        let comp = null;
        while (true) {
          comp = this[_compare](current.key, key);
          if (dart.notNull(comp) > 0) {
            if (current.left == null) break;
            comp = this[_compare](current.left.key, key);
            if (dart.notNull(comp) > 0) {
              let tmp = current.left;
              current.left = tmp.right;
              tmp.right = current;
              current = Node._check(tmp);
              if (current.left == null) break;
            }
            right.left = current;
            right = current;
            current = Node._check(current.left);
          } else if (dart.notNull(comp) < 0) {
            if (current.right == null) break;
            comp = this[_compare](current.right.key, key);
            if (dart.notNull(comp) < 0) {
              let tmp = Node._check(current.right);
              current.right = tmp.left;
              tmp.left = current;
              current = tmp;
              if (current.right == null) break;
            }
            left.right = current;
            left = current;
            current = Node._check(current.right);
          } else {
            break;
          }
        }
        left.right = current.left;
        right.left = current.right;
        current.left = this[_dummy].right;
        current.right = this[_dummy].left;
        this[_root] = current;
        this[_dummy].right = null;
        this[_dummy].left = null;
        this[_splayCount] = dart.notNull(this[_splayCount]) + 1;
        return comp;
      }
      [_splayMin](node) {
        Node._check(node);
        let current = node;
        while (current.left != null) {
          let left = Node._check(current.left);
          current.left = left.right;
          left.right = current;
          current = left;
        }
        return current;
      }
      [_splayMax](node) {
        Node._check(node);
        let current = node;
        while (current.right != null) {
          let right = Node._check(current.right);
          current.right = right.left;
          right.left = current;
          current = right;
        }
        return current;
      }
      [_remove](key) {
        K._check(key);
        if (this[_root] == null) return null;
        let comp = this[_splay](key);
        if (comp != 0) return null;
        let result = this[_root];
        this[_count$] = dart.notNull(this[_count$]) - 1;
        if (this[_root].left == null) {
          this[_root] = Node._check(this[_root].right);
        } else {
          let right = Node._check(this[_root].right);
          this[_root] = this[_splayMax](Node._check(this[_root].left));
          this[_root].right = right;
        }
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        return result;
      }
      [_addNewRoot](node, comp) {
        Node._check(node);
        this[_count$] = dart.notNull(this[_count$]) + 1;
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        if (this[_root] == null) {
          this[_root] = node;
          return;
        }
        if (dart.notNull(comp) < 0) {
          node.left = this[_root];
          node.right = this[_root].right;
          this[_root].right = null;
        } else {
          node.right = this[_root];
          node.left = this[_root].left;
          this[_root].left = null;
        }
        this[_root] = node;
      }
      get [_first$]() {
        if (this[_root] == null) return null;
        this[_root] = this[_splayMin](this[_root]);
        return this[_root];
      }
      get [_last$]() {
        if (this[_root] == null) return null;
        this[_root] = this[_splayMax](this[_root]);
        return this[_root];
      }
      [_clear$]() {
        this[_root] = null;
        this[_count$] = 0;
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
    }
    dart.addTypeTests(_SplayTree);
    dart.setSignature(_SplayTree, {
      fields: () => ({
        [_count$]: core.int,
        [_modificationCount]: core.int,
        [_splayCount]: core.int
      }),
      getters: () => ({
        [_first$]: dart.definiteFunctionType(Node, []),
        [_last$]: dart.definiteFunctionType(Node, [])
      }),
      methods: () => ({
        [_splay]: dart.definiteFunctionType(core.int, [K]),
        [_splayMin]: dart.definiteFunctionType(Node, [Node]),
        [_splayMax]: dart.definiteFunctionType(Node, [Node]),
        [_remove]: dart.definiteFunctionType(Node, [K]),
        [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
        [_clear$]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SplayTree;
  });
  collection._SplayTree = _SplayTree();
  collection._TypeTest$ = dart.generic(T => {
    class _TypeTest extends core.Object {
      test(v) {
        return T.is(v);
      }
    }
    dart.addTypeTests(_TypeTest);
    dart.setSignature(_TypeTest, {
      methods: () => ({test: dart.definiteFunctionType(core.bool, [dart.dynamic])})
    });
    return _TypeTest;
  });
  collection._TypeTest = _TypeTest();
  collection.SplayTreeMap$ = dart.generic((K, V) => {
    let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
    let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
    let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
    let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
      new(compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
        this[_comparator] = (() => {
          let l = compare;
          return l != null ? l : ComparatorOfK().as(core.Comparable.compare);
        })();
        this[_validKey] = (() => {
          let l = isValidKey;
          return l != null ? l : dart.fn(v => K.is(v), dynamicTobool$());
        })();
        this[_root] = null;
        super.new();
      }
      static from(other, compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
        other[dartx.forEach](dart.fn((k, v) => {
          result._set(K.as(k), V.as(v));
        }, dynamicAnddynamicTovoid$()));
        return result;
      }
      static fromIterable(iterable, opts) {
        let key = opts && 'key' in opts ? opts.key : null;
        let value = opts && 'value' in opts ? opts.value : null;
        let compare = opts && 'compare' in opts ? opts.compare : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
        return map;
      }
      static fromIterables(keys, values, compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
        collection.Maps._fillMapWithIterables(map, keys, values);
        return map;
      }
      [_compare](key1, key2) {
        K._check(key1);
        K._check(key2);
        return this[_comparator](key1, key2);
      }
      _internal() {
        this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
        this[_root] = null;
        this[_comparator] = null;
        this[_validKey] = null;
        super.new();
      }
      _get(key) {
        if (!dart.test(dart.dcall(this[_validKey], key))) return null;
        if (this[_root] != null) {
          let comp = this[_splay](K.as(key));
          if (comp == 0) {
            return this[_root].value;
          }
        }
        return null;
      }
      remove(key) {
        if (!dart.test(dart.dcall(this[_validKey], key))) return null;
        let mapRoot = this[_remove](K.as(key));
        if (mapRoot != null) return mapRoot.value;
        return null;
      }
      _set(key, value) {
        (() => {
          K._check(key);
          V._check(value);
          if (key == null) dart.throw(new core.ArgumentError(key));
          let comp = this[_splay](key);
          if (comp == 0) {
            this[_root].value = value;
            return;
          }
          this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
        })();
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (key == null) dart.throw(new core.ArgumentError(key));
        let comp = this[_splay](key);
        if (comp == 0) {
          return this[_root].value;
        }
        let modificationCount = this[_modificationCount];
        let splayCount = this[_splayCount];
        let value = ifAbsent();
        if (modificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        if (splayCount != this[_splayCount]) {
          comp = this[_splay](key);
          dart.assert(comp != 0);
        }
        this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
        return value;
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      get isEmpty() {
        return this[_root] == null;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      forEach(f) {
        let nodes = new (_SplayTreeNodeIteratorOfK())(this);
        while (dart.test(nodes.moveNext())) {
          let node = _SplayTreeMapNodeOfK$V()._check(nodes.current);
          f(node.key, node.value);
        }
      }
      get length() {
        return this[_count$];
      }
      clear() {
        this[_clear$]();
      }
      containsKey(key) {
        return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
      }
      containsValue(value) {
        let found = false;
        let initialSplayCount = this[_splayCount];
        const visit = (function(node) {
          while (node != null) {
            if (dart.equals(node.value, value)) return true;
            if (initialSplayCount != this[_splayCount]) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
            if (node.right != null && dart.test(visit(collection._SplayTreeMapNode._check(node.right)))) return true;
            node = collection._SplayTreeMapNode._check(node.left);
          }
          return false;
        }).bind(this);
        dart.fn(visit, _SplayTreeMapNodeTobool());
        return visit(this[_root]);
      }
      get keys() {
        return new (_SplayTreeKeyIterableOfK())(this);
      }
      get values() {
        return new (_SplayTreeValueIterableOfK$V())(this);
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
      firstKey() {
        if (this[_root] == null) return null;
        return this[_first$].key;
      }
      lastKey() {
        if (this[_root] == null) return null;
        return this[_last$].key;
      }
      lastKeyBefore(key) {
        K._check(key);
        if (key == null) dart.throw(new core.ArgumentError(key));
        if (this[_root] == null) return null;
        let comp = this[_splay](key);
        if (dart.notNull(comp) < 0) return this[_root].key;
        let node = this[_root].left;
        if (node == null) return null;
        while (node.right != null) {
          node = node.right;
        }
        return node.key;
      }
      firstKeyAfter(key) {
        K._check(key);
        if (key == null) dart.throw(new core.ArgumentError(key));
        if (this[_root] == null) return null;
        let comp = this[_splay](key);
        if (dart.notNull(comp) > 0) return this[_root].key;
        let node = this[_root].right;
        if (node == null) return null;
        while (node.left != null) {
          node = node.left;
        }
        return node.key;
      }
    }
    dart.defineNamedConstructor(SplayTreeMap, '_internal');
    SplayTreeMap[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(SplayTreeMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [], [ComparatorOfK(), dynamicTobool()]),
        from: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Map], [ComparatorOfK(), dynamicTobool()]),
        fromIterable: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV(), compare: ComparatorOfK(), isValidKey: dynamicTobool()}),
        fromIterables: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [IterableOfK(), IterableOfV()], [ComparatorOfK(), dynamicTobool()]),
        _internal: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [])
      }),
      fields: () => ({
        [_root]: _SplayTreeMapNodeOfK$V(),
        [_dummy]: _SplayTreeMapNodeOfK$V(),
        [_comparator]: ComparatorOfK(),
        [_validKey]: collection._Predicate
      }),
      getters: () => ({
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        length: dart.definiteFunctionType(core.int, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        [_compare]: dart.definiteFunctionType(core.int, [K, K]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        clear: dart.definiteFunctionType(dart.void, []),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        firstKey: dart.definiteFunctionType(K, []),
        lastKey: dart.definiteFunctionType(K, []),
        lastKeyBefore: dart.definiteFunctionType(K, [K]),
        firstKeyAfter: dart.definiteFunctionType(K, [K])
      })
    });
    dart.defineExtensionMembers(SplayTreeMap, [
      '_get',
      'remove',
      '_set',
      'putIfAbsent',
      'addAll',
      'forEach',
      'clear',
      'containsKey',
      'containsValue',
      'isEmpty',
      'isNotEmpty',
      'length',
      'keys',
      'values'
    ]);
    return SplayTreeMap;
  });
  collection.SplayTreeMap = SplayTreeMap();
  const _workList = Symbol('_workList');
  const _tree = Symbol('_tree');
  const _currentNode = Symbol('_currentNode');
  const _findLeftMostDescendent = Symbol('_findLeftMostDescendent');
  const _getValue = Symbol('_getValue');
  const _rebuildWorkList = Symbol('_rebuildWorkList');
  collection._SplayTreeIterator$ = dart.generic((K, T) => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let JSArrayOf_SplayTreeNodeOfK = () => (JSArrayOf_SplayTreeNodeOfK = dart.constFn(_interceptors.JSArray$(_SplayTreeNodeOfK())))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    let ListOf_SplayTreeNodeOfK = () => (ListOf_SplayTreeNodeOfK = dart.constFn(core.List$(_SplayTreeNodeOfK())))();
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    class _SplayTreeIterator extends core.Object {
      new(tree) {
        this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
        this[_tree] = tree;
        this[_modificationCount] = tree[_modificationCount];
        this[_splayCount] = tree[_splayCount];
        this[_currentNode] = null;
        this[_findLeftMostDescendent](tree[_root]);
      }
      startAt(tree, startKey) {
        this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
        this[_tree] = tree;
        this[_modificationCount] = tree[_modificationCount];
        this[_splayCount] = null;
        this[_currentNode] = null;
        if (tree[_root] == null) return;
        let compare = tree[_splay](startKey);
        this[_splayCount] = tree[_splayCount];
        if (dart.notNull(compare) < 0) {
          this[_findLeftMostDescendent](tree[_root].right);
        } else {
          this[_workList][dartx.add](tree[_root]);
        }
      }
      get current() {
        if (this[_currentNode] == null) return null;
        return this[_getValue](this[_currentNode]);
      }
      [_findLeftMostDescendent](node) {
        _SplayTreeNodeOfK()._check(node);
        while (node != null) {
          this[_workList][dartx.add](node);
          node = node.left;
        }
      }
      [_rebuildWorkList](currentNode) {
        _SplayTreeNodeOfK()._check(currentNode);
        dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
        this[_workList][dartx.clear]();
        if (currentNode == null) {
          this[_findLeftMostDescendent](this[_tree][_root]);
        } else {
          this[_tree][_splay](currentNode.key);
          this[_findLeftMostDescendent](this[_tree][_root].right);
          dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
        }
      }
      moveNext() {
        if (this[_modificationCount] != this[_tree][_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this[_tree]));
        }
        if (dart.test(this[_workList][dartx.isEmpty])) {
          this[_currentNode] = null;
          return false;
        }
        if (this[_tree][_splayCount] != this[_splayCount] && this[_currentNode] != null) {
          this[_rebuildWorkList](this[_currentNode]);
        }
        this[_currentNode] = this[_workList][dartx.removeLast]();
        this[_findLeftMostDescendent](this[_currentNode].right);
        return true;
      }
    }
    dart.addTypeTests(_SplayTreeIterator);
    dart.defineNamedConstructor(_SplayTreeIterator, 'startAt');
    _SplayTreeIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(_SplayTreeIterator, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
        startAt: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
      }),
      fields: () => ({
        [_tree]: _SplayTreeOfK$_SplayTreeNodeOfK(),
        [_workList]: ListOf_SplayTreeNodeOfK(),
        [_modificationCount]: core.int,
        [_splayCount]: core.int,
        [_currentNode]: _SplayTreeNodeOfK()
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({
        [_findLeftMostDescendent]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
        [_rebuildWorkList]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
        moveNext: dart.definiteFunctionType(core.bool, [])
      })
    });
    return _SplayTreeIterator;
  });
  collection._SplayTreeIterator = _SplayTreeIterator();
  const _copyNode = Symbol('_copyNode');
  collection._SplayTreeKeyIterable$ = dart.generic(K => {
    let _SplayTreeKeyIteratorOfK = () => (_SplayTreeKeyIteratorOfK = dart.constFn(collection._SplayTreeKeyIterator$(K)))();
    let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    class _SplayTreeKeyIterable extends core.Iterable$(K) {
      new(tree) {
        this[_tree] = tree;
        super.new();
      }
      get length() {
        return this[_tree][_count$];
      }
      get isEmpty() {
        return this[_tree][_count$] == 0;
      }
      get iterator() {
        return new (_SplayTreeKeyIteratorOfK())(this[_tree]);
      }
      toSet() {
        let set = new (SplayTreeSetOfK())(this[_tree][_comparator], this[_tree][_validKey]);
        set[_count$] = this[_tree][_count$];
        set[_root] = set[_copyNode](this[_tree][_root]);
        return set;
      }
    }
    _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_SplayTreeKeyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterable$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
      fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])}),
      methods: () => ({toSet: dart.definiteFunctionType(core.Set$(K), [])})
    });
    dart.defineExtensionMembers(_SplayTreeKeyIterable, ['toSet', 'length', 'isEmpty', 'iterator']);
    return _SplayTreeKeyIterable;
  });
  collection._SplayTreeKeyIterable = _SplayTreeKeyIterable();
  collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
    let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
    class _SplayTreeValueIterable extends core.Iterable$(V) {
      new(map) {
        this[_map$0] = map;
        super.new();
      }
      get length() {
        return this[_map$0][_count$];
      }
      get isEmpty() {
        return this[_map$0][_count$] == 0;
      }
      get iterator() {
        return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
      }
    }
    _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_SplayTreeValueIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
      fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
    });
    dart.defineExtensionMembers(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
    return _SplayTreeValueIterable;
  });
  collection._SplayTreeValueIterable = _SplayTreeValueIterable();
  collection._SplayTreeKeyIterator$ = dart.generic(K => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    class _SplayTreeKeyIterator extends collection._SplayTreeIterator$(K, K) {
      new(map) {
        super.new(map);
      }
      [_getValue](node) {
        _SplayTreeNodeOfK()._check(node);
        return node.key;
      }
    }
    dart.setSignature(_SplayTreeKeyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
      methods: () => ({[_getValue]: dart.definiteFunctionType(K, [_SplayTreeNodeOfK()])})
    });
    return _SplayTreeKeyIterator;
  });
  collection._SplayTreeKeyIterator = _SplayTreeKeyIterator();
  collection._SplayTreeValueIterator$ = dart.generic((K, V) => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
    class _SplayTreeValueIterator extends collection._SplayTreeIterator$(K, V) {
      new(map) {
        super.new(map);
      }
      [_getValue](node) {
        _SplayTreeNodeOfK()._check(node);
        let mapNode = _SplayTreeMapNodeOfK$V().as(node);
        return mapNode.value;
      }
    }
    dart.setSignature(_SplayTreeValueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterator$(K, V), [SplayTreeMapOfK$V()])}),
      methods: () => ({[_getValue]: dart.definiteFunctionType(V, [_SplayTreeNodeOfK()])})
    });
    return _SplayTreeValueIterator;
  });
  collection._SplayTreeValueIterator = _SplayTreeValueIterator();
  collection._SplayTreeNodeIterator$ = dart.generic(K => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    class _SplayTreeNodeIterator extends collection._SplayTreeIterator$(K, collection._SplayTreeNode$(K)) {
      new(tree) {
        super.new(tree);
      }
      startAt(tree, startKey) {
        super.startAt(tree, startKey);
      }
      [_getValue](node) {
        _SplayTreeNodeOfK()._check(node);
        return node;
      }
    }
    dart.defineNamedConstructor(_SplayTreeNodeIterator, 'startAt');
    dart.setSignature(_SplayTreeNodeIterator, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
        startAt: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
      }),
      methods: () => ({[_getValue]: dart.definiteFunctionType(collection._SplayTreeNode$(K), [_SplayTreeNodeOfK()])})
    });
    return _SplayTreeNodeIterator;
  });
  collection._SplayTreeNodeIterator = _SplayTreeNodeIterator();
  const _clone = Symbol('_clone');
  collection.SplayTreeSet$ = dart.generic(E => {
    let _SplayTreeNodeOfE = () => (_SplayTreeNodeOfE = dart.constFn(collection._SplayTreeNode$(E)))();
    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
    let SplayTreeSetOfE = () => (SplayTreeSetOfE = dart.constFn(collection.SplayTreeSet$(E)))();
    let _SplayTreeKeyIteratorOfE = () => (_SplayTreeKeyIteratorOfE = dart.constFn(collection._SplayTreeKeyIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    class SplayTreeSet extends dart.mixin(collection._SplayTree$(E, collection._SplayTreeNode$(E)), collection.IterableMixin$(E), collection.SetMixin$(E)) {
      new(compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        this[_dummy] = new (_SplayTreeNodeOfE())(null);
        this[_comparator] = (() => {
          let l = compare;
          return l != null ? l : ComparatorOfE().as(core.Comparable.compare);
        })();
        this[_validKey] = (() => {
          let l = isValidKey;
          return l != null ? l : dart.fn(v => E.is(v), dynamicTobool$());
        })();
        this[_root] = null;
        super.new();
      }
      static from(elements, compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        let result = new (SplayTreeSetOfE())(compare, isValidKey);
        for (let element of elements) {
          let e = E.as(element);
          result.add(e);
        }
        return result;
      }
      [_compare](e1, e2) {
        E._check(e1);
        E._check(e2);
        return this[_comparator](e1, e2);
      }
      get iterator() {
        return new (_SplayTreeKeyIteratorOfE())(this);
      }
      get length() {
        return this[_count$];
      }
      get isEmpty() {
        return this[_root] == null;
      }
      get isNotEmpty() {
        return this[_root] != null;
      }
      get first() {
        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[_first$].key;
      }
      get last() {
        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[_last$].key;
      }
      get single() {
        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this[_root].key;
      }
      contains(object) {
        return dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0;
      }
      add(element) {
        E._check(element);
        let compare = this[_splay](element);
        if (compare == 0) return false;
        this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
        return true;
      }
      remove(object) {
        if (!dart.test(dart.dcall(this[_validKey], object))) return false;
        return this[_remove](E.as(object)) != null;
      }
      addAll(elements) {
        IterableOfE()._check(elements);
        for (let element of elements) {
          let compare = this[_splay](element);
          if (compare != 0) {
            this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
          }
        }
      }
      removeAll(elements) {
        for (let element of elements) {
          if (dart.test(dart.dcall(this[_validKey], element))) this[_remove](E.as(element));
        }
      }
      retainAll(elements) {
        let retainSet = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        let modificationCount = this[_modificationCount];
        for (let object of elements) {
          if (modificationCount != this[_modificationCount]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          if (dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0) {
            retainSet.add(this[_root].key);
          }
        }
        if (retainSet[_count$] != this[_count$]) {
          this[_root] = retainSet[_root];
          this[_count$] = retainSet[_count$];
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        }
      }
      lookup(object) {
        if (!dart.test(dart.dcall(this[_validKey], object))) return null;
        let comp = this[_splay](E.as(object));
        if (comp != 0) return null;
        return this[_root].key;
      }
      intersection(other) {
        let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        for (let element of this) {
          if (dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      difference(other) {
        let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        for (let element of this) {
          if (!dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      union(other) {
        SetOfE()._check(other);
        let _ = this[_clone]();
        _.addAll(other);
        return _;
      }
      [_clone]() {
        let set = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        set[_count$] = this[_count$];
        set[_root] = this[_copyNode](this[_root]);
        return set;
      }
      [_copyNode](node) {
        _SplayTreeNodeOfE()._check(node);
        if (node == null) return null;
        let _ = new (_SplayTreeNodeOfE())(node.key);
        _.left = this[_copyNode](node.left);
        _.right = this[_copyNode](node.right);
        return _;
      }
      clear() {
        this[_clear$]();
      }
      toSet() {
        return this[_clone]();
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '{', '}');
      }
    }
    dart.setSignature(SplayTreeSet, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.SplayTreeSet$(E), [], [ComparatorOfE(), dynamicTobool()]),
        from: dart.definiteFunctionType(collection.SplayTreeSet$(E), [core.Iterable], [ComparatorOfE(), dynamicTobool()])
      }),
      fields: () => ({
        [_root]: _SplayTreeNodeOfE(),
        [_dummy]: _SplayTreeNodeOfE(),
        [_comparator]: ComparatorOfE(),
        [_validKey]: collection._Predicate
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        [_compare]: dart.definiteFunctionType(core.int, [E, E]),
        add: dart.definiteFunctionType(core.bool, [E]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        lookup: dart.definiteFunctionType(E, [core.Object]),
        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
        [_clone]: dart.definiteFunctionType(collection.SplayTreeSet$(E), []),
        [_copyNode]: dart.definiteFunctionType(collection._SplayTreeNode$(E), [_SplayTreeNodeOfE()]),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(SplayTreeSet, [
      'contains',
      'toSet',
      'toString',
      'iterator',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single'
    ]);
    return SplayTreeSet;
  });
  collection.SplayTreeSet = SplayTreeSet();
  const _processed = Symbol('_processed');
  const _computeKeys$ = Symbol('_computeKeys');
  const _original = Symbol('_original');
  convert._convertJsonToDart = function(json, reviver) {
    dart.assert(reviver != null);
    function walk(e) {
      if (e == null || typeof e != "object") {
        return e;
      }
      if (Object.getPrototypeOf(e) === Array.prototype) {
        for (let i = 0; i < e.length; i++) {
          let item = e[i];
          e[i] = dart.dcall(reviver, i, walk(item));
        }
        return e;
      }
      let map = new convert._JsonMap(e);
      let processed = map[_processed];
      let keys = map[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        let revived = dart.dcall(reviver, key, walk(e[key]));
        processed[key] = revived;
      }
      map[_original] = processed;
      return map;
    }
    dart.fn(walk, dynamicTodynamic$());
    return dart.dcall(reviver, null, walk(json));
  };
  dart.fn(convert._convertJsonToDart, dynamicAndFnTodynamic());
  convert._convertJsonToDartLazy = function(object) {
    if (object == null) return null;
    if (typeof object != "object") {
      return object;
    }
    if (Object.getPrototypeOf(object) !== Array.prototype) {
      return new convert._JsonMap(object);
    }
    for (let i = 0; i < object.length; i++) {
      let item = object[i];
      object[i] = convert._convertJsonToDartLazy(item);
    }
    return object;
  };
  dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic$());
  const _data = Symbol('_data');
  const _isUpgraded = Symbol('_isUpgraded');
  const _upgradedMap = Symbol('_upgradedMap');
  const _process = Symbol('_process');
  const _upgrade = Symbol('_upgrade');
  convert._JsonMap = class _JsonMap extends core.Object {
    new(original) {
      this[_processed] = convert._JsonMap._newJavaScriptObject();
      this[_original] = original;
      this[_data] = null;
    }
    _get(key) {
      if (dart.test(this[_isUpgraded])) {
        return this[_upgradedMap][dartx._get](key);
      } else if (!(typeof key == 'string')) {
        return null;
      } else {
        let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
        if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process](core.String._check(key));
        return result;
      }
    }
    get length() {
      return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys$]()[dartx.length];
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return dart.notNull(this.length) > 0;
    }
    get keys() {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.keys];
      return new convert._JsonMapKeyIterable(this);
    }
    get values() {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.values];
      return MappedIterableOfString$dynamic().new(this[_computeKeys$](), dart.fn(each => this._get(each), dynamicTodynamic$()));
    }
    _set(key, value) {
      if (dart.test(this[_isUpgraded])) {
        this[_upgradedMap][dartx._set](key, value);
      } else if (dart.test(this.containsKey(key))) {
        let processed = this[_processed];
        convert._JsonMap._setProperty(processed, core.String._check(key), value);
        let original = this[_original];
        if (!core.identical(original, processed)) {
          convert._JsonMap._setProperty(original, core.String._check(key), null);
        }
      } else {
        this[_upgrade]()[dartx._set](key, value);
      }
      return value;
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, dynamicAnddynamicTovoid$()));
    }
    containsValue(value) {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
      let keys = this[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        if (dart.equals(this._get(key), value)) return true;
      }
      return false;
    }
    containsKey(key) {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsKey](key);
      if (!(typeof key == 'string')) return false;
      return convert._JsonMap._hasProperty(this[_original], core.String._check(key));
    }
    putIfAbsent(key, ifAbsent) {
      if (dart.test(this.containsKey(key))) return this._get(key);
      let value = ifAbsent();
      this._set(key, value);
      return value;
    }
    remove(key) {
      if (!dart.test(this[_isUpgraded]) && !dart.test(this.containsKey(key))) return null;
      return this[_upgrade]()[dartx.remove](key);
    }
    clear() {
      if (dart.test(this[_isUpgraded])) {
        this[_upgradedMap][dartx.clear]();
      } else {
        if (this[_data] != null) {
          dart.dsend(this[_data], 'clear');
        }
        this[_original] = this[_processed] = null;
        this[_data] = dart.map();
      }
    }
    forEach(f) {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.forEach](f);
      let keys = this[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        let value = convert._JsonMap._getProperty(this[_processed], key);
        if (dart.test(convert._JsonMap._isUnprocessed(value))) {
          value = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
          convert._JsonMap._setProperty(this[_processed], key, value);
        }
        dart.dcall(f, key, value);
        if (!core.identical(keys, this[_data])) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
    get [_isUpgraded]() {
      return this[_processed] == null;
    }
    get [_upgradedMap]() {
      dart.assert(this[_isUpgraded]);
      return this[_data];
    }
    [_computeKeys$]() {
      dart.assert(!dart.test(this[_isUpgraded]));
      let keys = core.List._check(this[_data]);
      if (keys == null) {
        keys = this[_data] = convert._JsonMap._getPropertyNames(this[_original]);
      }
      return keys;
    }
    [_upgrade]() {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
      let result = dart.map();
      let keys = this[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        result[dartx._set](key, this._get(key));
      }
      if (dart.test(keys[dartx.isEmpty])) {
        keys[dartx.add](null);
      } else {
        keys[dartx.clear]();
      }
      this[_original] = this[_processed] = null;
      this[_data] = result;
      dart.assert(this[_isUpgraded]);
      return result;
    }
    [_process](key) {
      if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
      let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
      return convert._JsonMap._setProperty(this[_processed], key, result);
    }
    static _hasProperty(object, key) {
      return Object.prototype.hasOwnProperty.call(object, key);
    }
    static _getProperty(object, key) {
      return object[key];
    }
    static _setProperty(object, key, value) {
      return object[key] = value;
    }
    static _getPropertyNames(object) {
      return Object.keys(object);
    }
    static _isUnprocessed(object) {
      return typeof object == "undefined";
    }
    static _newJavaScriptObject() {
      return Object.create(null);
    }
  };
  convert._JsonMap[dart.implements] = () => [collection.LinkedHashMap];
  dart.setSignature(convert._JsonMap, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonMap, [dart.dynamic])}),
    fields: () => ({
      [_original]: dart.dynamic,
      [_processed]: dart.dynamic,
      [_data]: dart.dynamic
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      keys: dart.definiteFunctionType(core.Iterable, []),
      values: dart.definiteFunctionType(core.Iterable, []),
      [_isUpgraded]: dart.definiteFunctionType(core.bool, []),
      [_upgradedMap]: dart.definiteFunctionType(core.Map, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
      remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()]),
      [_computeKeys$]: dart.definiteFunctionType(core.List$(core.String), []),
      [_upgrade]: dart.definiteFunctionType(core.Map, []),
      [_process]: dart.definiteFunctionType(dart.dynamic, [core.String])
    }),
    statics: () => ({
      _hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String]),
      _getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String]),
      _setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
      _getPropertyNames: dart.definiteFunctionType(core.List, [dart.dynamic]),
      _isUnprocessed: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _newJavaScriptObject: dart.definiteFunctionType(dart.dynamic, [])
    }),
    names: ['_hasProperty', '_getProperty', '_setProperty', '_getPropertyNames', '_isUnprocessed', '_newJavaScriptObject']
  });
  dart.defineExtensionMembers(convert._JsonMap, [
    '_get',
    '_set',
    'addAll',
    'containsValue',
    'containsKey',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  const _parent = Symbol('_parent');
  convert._JsonMapKeyIterable = class _JsonMapKeyIterable extends _internal.ListIterable {
    new(parent) {
      this[_parent] = parent;
      super.new();
    }
    get length() {
      return this[_parent].length;
    }
    elementAt(index) {
      return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys$]()[dartx._get](index));
    }
    get iterator() {
      return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys$]()[dartx.iterator];
    }
    contains(key) {
      return this[_parent].containsKey(key);
    }
  };
  dart.addSimpleTypeTests(convert._JsonMapKeyIterable);
  dart.setSignature(convert._JsonMapKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonMapKeyIterable, [convert._JsonMap])}),
    fields: () => ({[_parent]: convert._JsonMap}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator, [])}),
    methods: () => ({elementAt: dart.definiteFunctionType(core.String, [core.int])})
  });
  dart.defineExtensionMembers(convert._JsonMapKeyIterable, ['elementAt', 'contains', 'length', 'iterator']);
  const _reviver = Symbol('_reviver');
  const _sink$ = Symbol('_sink');
  const _stringSink = Symbol('_stringSink');
  convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
    add(str) {
      this.addSlice(str, 0, str[dartx.length], false);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8ConversionSink(this, allowMalformed);
    }
    asStringSink() {
      return new convert._StringConversionSinkAsStringSinkAdapter(this);
    }
  };
  convert.StringConversionSinkMixin[dart.implements] = () => [convert.StringConversionSink];
  dart.setSignature(convert.StringConversionSinkMixin, {
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [core.String]),
      asUtf8Sink: dart.definiteFunctionType(convert.ByteConversionSink, [core.bool]),
      asStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [])
    })
  });
  convert.StringConversionSinkBase = class StringConversionSinkBase extends convert.StringConversionSinkMixin {};
  convert._StringSinkConversionSink = class _StringSinkConversionSink extends convert.StringConversionSinkBase {
    new(stringSink) {
      this[_stringSink] = stringSink;
    }
    close() {}
    addSlice(str, start, end, isLast) {
      if (start != 0 || end != str[dartx.length]) {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[_stringSink].writeCharCode(str[dartx.codeUnitAt](i));
        }
      } else {
        this[_stringSink].write(str);
      }
      if (dart.test(isLast)) this.close();
    }
    add(str) {
      this[_stringSink].write(str);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
    }
    asStringSink() {
      return convert.ClosableStringSink.fromStringSink(this[_stringSink], dart.bind(this, 'close'));
    }
  };
  dart.setSignature(convert._StringSinkConversionSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringSinkConversionSink, [core.StringSink])}),
    fields: () => ({[_stringSink]: core.StringSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink {
    new(reviver, sink) {
      this[_reviver] = reviver;
      this[_sink$] = sink;
      super.new(new core.StringBuffer());
    }
    close() {
      super.close();
      let buffer = core.StringBuffer._check(this[_stringSink]);
      let accumulated = dart.toString(buffer);
      buffer.clear();
      let decoded = convert._parseJson(accumulated, this[_reviver]);
      this[_sink$].add(decoded);
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._JsonDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonDecoderSink, [convert._Reviver, SinkOfObject()])}),
    fields: () => ({
      [_reviver]: convert._Reviver,
      [_sink$]: SinkOfObject()
    })
  });
  const _allowInvalid = Symbol('_allowInvalid');
  let const$25;
  let const$26;
  let const$27;
  let const$28;
  let const$29;
  convert.Codec$ = dart.generic((S, T) => {
    let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
    class Codec extends core.Object {
      new() {
      }
      encode(input) {
        S._check(input);
        return this.encoder.convert(input);
      }
      decode(encoded) {
        T._check(encoded);
        return this.decoder.convert(encoded);
      }
      fuse(R) {
        return other => {
          convert.Codec$(T, R)._check(other);
          return new (convert._FusedCodec$(S, T, R))(this, other);
        };
      }
      get inverted() {
        return new (_InvertedCodecOfT$S())(this);
      }
    }
    dart.addTypeTests(Codec);
    dart.setSignature(Codec, {
      constructors: () => ({new: dart.definiteFunctionType(convert.Codec$(S, T), [])}),
      getters: () => ({inverted: dart.definiteFunctionType(convert.Codec$(T, S), [])}),
      methods: () => ({
        encode: dart.definiteFunctionType(T, [S]),
        decode: dart.definiteFunctionType(S, [T]),
        fuse: dart.definiteFunctionType(R => [convert.Codec$(S, R), [convert.Codec$(T, R)]])
      })
    });
    return Codec;
  });
  convert.Codec = Codec();
  core.String = class String extends core.Object {
    static fromCharCodes(charCodes, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      if (_interceptors.JSArray.is(charCodes)) {
        return core.String._stringFromJSArray(JSArrayOfint()._check(charCodes), start, end);
      }
      if (_native_typed_data.NativeUint8List.is(charCodes)) {
        return core.String._stringFromUint8List(charCodes, start, end);
      }
      return core.String._stringFromIterable(charCodes, start, end);
    }
    static fromCharCode(charCode) {
      return _js_helper.Primitives.stringFromCharCode(charCode);
    }
    static fromEnvironment(name, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
      dart.throw(new core.UnsupportedError('String.fromEnvironment can only be used as a const constructor'));
    }
    static _stringFromJSArray(list, start, endOrNull) {
      let len = list[dartx.length];
      let end = core.RangeError.checkValidRange(start, endOrNull, len);
      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(len)) {
        list = JSArrayOfint()._check(list[dartx.sublist](start, end));
      }
      return _js_helper.Primitives.stringFromCharCodes(list);
    }
    static _stringFromUint8List(charCodes, start, endOrNull) {
      let len = charCodes[dartx.length];
      let end = core.RangeError.checkValidRange(start, endOrNull, len);
      return _js_helper.Primitives.stringFromNativeUint8List(charCodes, start, end);
    }
    static _stringFromIterable(charCodes, start, end) {
      if (dart.notNull(start) < 0) dart.throw(new core.RangeError.range(start, 0, charCodes[dartx.length]));
      if (end != null && dart.notNull(end) < dart.notNull(start)) {
        dart.throw(new core.RangeError.range(end, start, charCodes[dartx.length]));
      }
      let it = charCodes[dartx.iterator];
      for (let i = 0; i < dart.notNull(start); i++) {
        if (!dart.test(it.moveNext())) {
          dart.throw(new core.RangeError.range(start, 0, i));
        }
      }
      let list = JSArrayOfint().of([]);
      if (end == null) {
        while (dart.test(it.moveNext()))
          list[dartx.add](it.current);
      } else {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          if (!dart.test(it.moveNext())) {
            dart.throw(new core.RangeError.range(end, start, i));
          }
          list[dartx.add](it.current);
        }
      }
      return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
    }
  };
  core.String.is = function is_String(o) {
    return typeof o == "string";
  };
  core.String.as = function as_String(o) {
    if (typeof o == "string" || o == null) return o;
    return dart.as(o, core.String);
  };
  core.String._check = function check_String(o) {
    if (typeof o == "string" || o == null) return o;
    return dart.check(o, core.String);
  };
  core.String[dart.implements] = () => [ComparableOfString(), core.Pattern];
  dart.setSignature(core.String, {
    constructors: () => ({
      fromCharCodes: dart.definiteFunctionType(core.String, [IterableOfint()], [core.int, core.int]),
      fromCharCode: dart.definiteFunctionType(core.String, [core.int]),
      fromEnvironment: dart.definiteFunctionType(core.String, [core.String], {defaultValue: core.String})
    }),
    statics: () => ({
      _stringFromJSArray: dart.definiteFunctionType(core.String, [JSArrayOfint(), core.int, core.int]),
      _stringFromUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
      _stringFromIterable: dart.definiteFunctionType(core.String, [IterableOfint(), core.int, core.int])
    }),
    names: ['_stringFromJSArray', '_stringFromUint8List', '_stringFromIterable']
  });
  core.List$ = dart.generic(E => {
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
    class List extends core.Object {
      static new(length) {
        if (length === void 0) length = null;
        let list = null;
        if (length == null) {
          list = [];
        } else {
          if (!(typeof length == 'number') || dart.notNull(length) < 0) {
            dart.throw(new core.ArgumentError(dart.str`Length must be a non-negative integer: ${length}`));
          }
          list = _interceptors.JSArray.markFixedList(new Array(length));
        }
        return JSArrayOfE().typed(list);
      }
      static filled(length, fill) {
        let result = ListOfE().new(length);
        if (length != 0 && fill != null) {
          for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
            result[dartx._set](i, fill);
          }
        }
        return result;
      }
      static from(elements, opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let list = ListOfE().new();
        for (let e of elements) {
          list[dartx.add](E._check(e));
        }
        if (dart.test(growable)) return list;
        return _internal.makeListFixedLength(E)(list);
      }
      static generate(length, generator, opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = null;
        if (dart.test(growable)) {
          result = JSArrayOfE().of([]);
          result[dartx.length] = length;
        } else {
          result = ListOfE().new(length);
        }
        for (let i = 0; i < dart.notNull(length); i++) {
          result[dartx._set](i, generator(i));
        }
        return result;
      }
      static unmodifiable(elements) {
        let result = ListOfE().from(elements, {growable: false});
        return _internal.makeFixedListUnmodifiable(E)(result);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
    }
    dart.addTypeTests(List);
    List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
    dart.setSignature(List, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.List$(E), [], [core.int]),
        filled: dart.definiteFunctionType(core.List$(E), [core.int, E]),
        from: dart.definiteFunctionType(core.List$(E), [core.Iterable], {growable: core.bool}),
        generate: dart.definiteFunctionType(core.List$(E), [core.int, intToE()], {growable: core.bool}),
        unmodifiable: dart.definiteFunctionType(core.List$(E), [core.Iterable])
      })
    });
    return List;
  });
  core.List = List();
  convert.Encoding = class Encoding extends convert.Codec$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    decodeStream(byteStream) {
      return byteStream.transform(core.String)(this.decoder).fold(dart.dynamic)(new core.StringBuffer(), dart.fn((buffer, string) => ((() => {
        dart.dsend(buffer, 'write', string);
        return buffer;
      })()), dynamicAndStringTodynamic())).then(core.String)(dart.fn(buffer => dart.toString(buffer), dynamicToString()));
    }
    static getByName(name) {
      if (name == null) return null;
      name = name[dartx.toLowerCase]();
      return convert.Encoding._nameToEncoding[dartx._get](name);
    }
  };
  dart.addSimpleTypeTests(convert.Encoding);
  dart.setSignature(convert.Encoding, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Encoding, [])}),
    methods: () => ({decodeStream: dart.definiteFunctionType(async.Future$(core.String), [StreamOfListOfint()])}),
    sfields: () => ({_nameToEncoding: MapOfString$Encoding()}),
    statics: () => ({getByName: dart.definiteFunctionType(convert.Encoding, [core.String])}),
    names: ['getByName']
  });
  dart.defineLazy(convert.Encoding, {
    get _nameToEncoding() {
      return dart.map({"iso_8859-1:1987": convert.LATIN1, "iso-ir-100": convert.LATIN1, "iso_8859-1": convert.LATIN1, "iso-8859-1": convert.LATIN1, latin1: convert.LATIN1, l1: convert.LATIN1, ibm819: convert.LATIN1, cp819: convert.LATIN1, csisolatin1: convert.LATIN1, "iso-ir-6": convert.ASCII, "ansi_x3.4-1968": convert.ASCII, "ansi_x3.4-1986": convert.ASCII, "iso_646.irv:1991": convert.ASCII, "iso646-us": convert.ASCII, "us-ascii": convert.ASCII, us: convert.ASCII, ibm367: convert.ASCII, cp367: convert.ASCII, csascii: convert.ASCII, ascii: convert.ASCII, csutf8: convert.UTF8, "utf-8": convert.UTF8}, core.String, convert.Encoding);
    },
    set _nameToEncoding(_) {}
  });
  convert.AsciiCodec = class AsciiCodec extends convert.Encoding {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      this[_allowInvalid] = allowInvalid;
      super.new();
    }
    get name() {
      return "us-ascii";
    }
    decode(bytes, opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
      if (allowInvalid == null) allowInvalid = this[_allowInvalid];
      if (dart.test(allowInvalid)) {
        return (const$25 || (const$25 = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
      } else {
        return (const$26 || (const$26 = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
      }
    }
    get encoder() {
      return const$27 || (const$27 = dart.const(new convert.AsciiEncoder()));
    }
    get decoder() {
      return dart.test(this[_allowInvalid]) ? const$28 || (const$28 = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const$29 || (const$29 = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
    }
  };
  dart.setSignature(convert.AsciiCodec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiCodec, [], {allowInvalid: core.bool})}),
    fields: () => ({[_allowInvalid]: core.bool}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.AsciiEncoder, []),
      decoder: dart.definiteFunctionType(convert.AsciiDecoder, [])
    }),
    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
  });
  convert.ASCII = dart.const(new convert.AsciiCodec());
  convert._ASCII_MASK = 127;
  const _subsetMask = Symbol('_subsetMask');
  convert.Converter$ = dart.generic((S, T) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _ConverterStreamEventSinkOfS$dynamic = () => (_ConverterStreamEventSinkOfS$dynamic = dart.constFn(convert._ConverterStreamEventSink$(S, dart.dynamic)))();
    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let EventSinkTo_ConverterStreamEventSinkOfS$dynamic = () => (EventSinkTo_ConverterStreamEventSinkOfS$dynamic = dart.constFn(dart.definiteFunctionType(_ConverterStreamEventSinkOfS$dynamic(), [async.EventSink])))();
    class Converter extends core.Object {
      new() {
      }
      fuse(TT) {
        return other => {
          convert.Converter$(T, TT)._check(other);
          return new (convert._FusedConverter$(S, T, TT))(this, other);
        };
      }
      startChunkedConversion(sink) {
        SinkOfT()._check(sink);
        dart.throw(new core.UnsupportedError(dart.str`This converter does not support chunked conversions: ${this}`));
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return StreamOfT().eventTransformed(stream, dart.fn(sink => new (_ConverterStreamEventSinkOfS$dynamic())(this, sink), EventSinkTo_ConverterStreamEventSinkOfS$dynamic()));
      }
    }
    dart.addTypeTests(Converter);
    Converter[dart.implements] = () => [StreamTransformerOfS$T()];
    dart.setSignature(Converter, {
      constructors: () => ({new: dart.definiteFunctionType(convert.Converter$(S, T), [])}),
      methods: () => ({
        fuse: dart.definiteFunctionType(TT => [convert.Converter$(S, TT), [convert.Converter$(T, TT)]]),
        startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()]),
        bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])
      })
    });
    return Converter;
  });
  convert.Converter = Converter();
  convert._UnicodeSubsetEncoder = class _UnicodeSubsetEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new(subsetMask) {
      this[_subsetMask] = subsetMask;
      super.new();
    }
    convert(string, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let stringLength = string[dartx.length];
      core.RangeError.checkValidRange(start, end, stringLength);
      if (end == null) end = stringLength;
      let length = dart.notNull(end) - dart.notNull(start);
      let result = typed_data.Uint8List.new(length);
      for (let i = 0; i < length; i++) {
        let codeUnit = string[dartx.codeUnitAt](dart.notNull(start) + i);
        if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
          dart.throw(new core.ArgumentError("String contains invalid characters."));
        }
        result[dartx._set](i, codeUnit);
      }
      return result;
    }
    startChunkedConversion(sink) {
      if (!convert.ByteConversionSink.is(sink)) {
        sink = convert.ByteConversionSink.from(sink);
      }
      return new convert._UnicodeSubsetEncoderSink(this[_subsetMask], convert.ByteConversionSink._check(sink));
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
  dart.setSignature(convert._UnicodeSubsetEncoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoder, [core.int])}),
    fields: () => ({[_subsetMask]: core.int}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()]),
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [StreamOfString()])
    })
  });
  convert.AsciiEncoder = class AsciiEncoder extends convert._UnicodeSubsetEncoder {
    new() {
      super.new(convert._ASCII_MASK);
    }
  };
  dart.setSignature(convert.AsciiEncoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiEncoder, [])})
  });
  convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
    new(subsetMask, sink) {
      this[_subsetMask] = subsetMask;
      this[_sink$] = sink;
    }
    close() {
      this[_sink$].close();
    }
    addSlice(source, start, end, isLast) {
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = source[dartx.codeUnitAt](i);
        if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
          dart.throw(new core.ArgumentError(dart.str`Source contains invalid character with code point: ${codeUnit}.`));
        }
      }
      this[_sink$].add(source[dartx.codeUnits][dartx.sublist](start, end));
      if (dart.test(isLast)) {
        this.close();
      }
    }
  };
  dart.setSignature(convert._UnicodeSubsetEncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoderSink, [core.int, convert.ByteConversionSink])}),
    fields: () => ({
      [_sink$]: convert.ByteConversionSink,
      [_subsetMask]: core.int
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  const _convertInvalid = Symbol('_convertInvalid');
  convert._UnicodeSubsetDecoder = class _UnicodeSubsetDecoder extends convert.Converter$(core.List$(core.int), core.String) {
    new(allowInvalid, subsetMask) {
      this[_allowInvalid] = allowInvalid;
      this[_subsetMask] = subsetMask;
      super.new();
    }
    convert(bytes, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let byteCount = bytes[dartx.length];
      core.RangeError.checkValidRange(start, end, byteCount);
      if (end == null) end = byteCount;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let byte = bytes[dartx._get](i);
        if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) != 0) {
          if (!dart.test(this[_allowInvalid])) {
            dart.throw(new core.FormatException(dart.str`Invalid value in input: ${byte}`));
          }
          return this[_convertInvalid](bytes, start, end);
        }
      }
      return core.String.fromCharCodes(bytes, start, end);
    }
    [_convertInvalid](bytes, start, end) {
      let buffer = new core.StringBuffer();
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let value = bytes[dartx._get](i);
        if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) != 0) value = 65533;
        buffer.writeCharCode(value);
      }
      return buffer.toString();
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
  dart.setSignature(convert._UnicodeSubsetDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetDecoder, [core.bool, core.int])}),
    fields: () => ({
      [_allowInvalid]: core.bool,
      [_subsetMask]: core.int
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
      [_convertInvalid]: dart.definiteFunctionType(core.String, [ListOfint(), core.int, core.int]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfListOfint()])
    })
  });
  convert.AsciiDecoder = class AsciiDecoder extends convert._UnicodeSubsetDecoder {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      super.new(allowInvalid, convert._ASCII_MASK);
    }
    startChunkedConversion(sink) {
      let stringSink = null;
      if (convert.StringConversionSink.is(sink)) {
        stringSink = sink;
      } else {
        stringSink = convert.StringConversionSink.from(sink);
      }
      if (dart.test(this[_allowInvalid])) {
        return new convert._ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
      } else {
        return new convert._SimpleAsciiDecoderSink(stringSink);
      }
    }
  };
  dart.setSignature(convert.AsciiDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiDecoder, [], {allowInvalid: core.bool})}),
    methods: () => ({startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])})
  });
  const _utf8Sink = Symbol('_utf8Sink');
  let const$30;
  convert.ChunkedConversionSink$ = dart.generic(T => {
    let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    let ListOfTTovoid = () => (ListOfTTovoid = dart.constFn(dart.functionType(dart.void, [ListOfT()])))();
    class ChunkedConversionSink extends core.Object {
      new() {
      }
      static withCallback(callback) {
        return new (_SimpleCallbackSinkOfT())(callback);
      }
    }
    dart.addTypeTests(ChunkedConversionSink);
    ChunkedConversionSink[dart.implements] = () => [SinkOfT()];
    dart.setSignature(ChunkedConversionSink, {
      constructors: () => ({
        new: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), []),
        withCallback: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), [ListOfTTovoid()])
      })
    });
    return ChunkedConversionSink;
  });
  convert.ChunkedConversionSink = ChunkedConversionSink();
  convert.ByteConversionSink = class ByteConversionSink extends convert.ChunkedConversionSink$(core.List$(core.int)) {
    new() {
      super.new();
    }
    static withCallback(callback) {
      return new convert._ByteCallbackSink(callback);
    }
    static from(sink) {
      return new convert._ByteAdapterSink(sink);
    }
  };
  dart.addSimpleTypeTests(convert.ByteConversionSink);
  dart.setSignature(convert.ByteConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.ByteConversionSink, []),
      withCallback: dart.definiteFunctionType(convert.ByteConversionSink, [ListOfintTovoid()]),
      from: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
    })
  });
  convert.ByteConversionSinkBase = class ByteConversionSinkBase extends convert.ByteConversionSink {
    new() {
      super.new();
    }
    addSlice(chunk, start, end, isLast) {
      this.add(chunk[dartx.sublist](start, end));
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert.ByteConversionSinkBase, {
    methods: () => ({addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
  });
  convert._ErrorHandlingAsciiDecoderSink = class _ErrorHandlingAsciiDecoderSink extends convert.ByteConversionSinkBase {
    new(utf8Sink) {
      this[_utf8Sink] = utf8Sink;
      super.new();
    }
    close() {
      this[_utf8Sink].close();
    }
    add(source) {
      this.addSlice(source, 0, source[dartx.length], false);
    }
    addSlice(source, start, end, isLast) {
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
          if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
          this[_utf8Sink].add(const$30 || (const$30 = dart.constList([239, 191, 189], core.int)));
          start = dart.notNull(i) + 1;
        }
      }
      if (dart.notNull(start) < dart.notNull(end)) {
        this[_utf8Sink].addSlice(source, start, end, isLast);
      } else if (dart.test(isLast)) {
        this.close();
      }
    }
  };
  dart.setSignature(convert._ErrorHandlingAsciiDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ErrorHandlingAsciiDecoderSink, [convert.ByteConversionSink])}),
    fields: () => ({[_utf8Sink]: convert.ByteConversionSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()])
    })
  });
  convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    close() {
      this[_sink$].close();
    }
    add(source) {
      for (let i = 0; i < dart.notNull(source[dartx.length]); i++) {
        if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
          dart.throw(new core.FormatException("Source contains non-ASCII bytes."));
        }
      }
      this[_sink$].add(core.String.fromCharCodes(source));
    }
    addSlice(source, start, end, isLast) {
      let length = source[dartx.length];
      core.RangeError.checkValidRange(start, end, length);
      if (dart.notNull(start) < dart.notNull(end)) {
        if (start != 0 || end != length) {
          source = source[dartx.sublist](start, end);
        }
        this.add(source);
      }
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert._SimpleAsciiDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._SimpleAsciiDecoderSink, [core.Sink])}),
    fields: () => ({[_sink$]: core.Sink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()])
    })
  });
  const _urlSafe = Symbol('_urlSafe');
  convert.Base64Encoder = class Base64Encoder extends convert.Converter$(core.List$(core.int), core.String) {
    new() {
      this[_urlSafe] = false;
      super.new();
    }
    urlSafe() {
      this[_urlSafe] = true;
      super.new();
    }
    convert(input) {
      if (dart.test(input[dartx.isEmpty])) return "";
      let encoder = new convert._Base64Encoder(this[_urlSafe]);
      let buffer = encoder.encode(input, 0, input[dartx.length], true);
      return core.String.fromCharCodes(buffer);
    }
    startChunkedConversion(sink) {
      if (convert.StringConversionSink.is(sink)) {
        return new convert._Utf8Base64EncoderSink(sink.asUtf8Sink(false), this[_urlSafe]);
      }
      return new convert._AsciiBase64EncoderSink(sink, this[_urlSafe]);
    }
  };
  dart.addSimpleTypeTests(convert.Base64Encoder);
  dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
  dart.setSignature(convert.Base64Encoder, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.Base64Encoder, []),
      urlSafe: dart.definiteFunctionType(convert.Base64Encoder, [])
    }),
    fields: () => ({[_urlSafe]: core.bool}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
    })
  });
  let const$31;
  const _encoder = Symbol('_encoder');
  let const$32;
  let const$33;
  convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
    new() {
      this[_encoder] = const$31 || (const$31 = dart.const(new convert.Base64Encoder()));
      super.new();
    }
    urlSafe() {
      this[_encoder] = const$32 || (const$32 = dart.const(new convert.Base64Encoder.urlSafe()));
      super.new();
    }
    get encoder() {
      return this[_encoder];
    }
    get decoder() {
      return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
    }
  };
  dart.addSimpleTypeTests(convert.Base64Codec);
  dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
  dart.setSignature(convert.Base64Codec, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.Base64Codec, []),
      urlSafe: dart.definiteFunctionType(convert.Base64Codec, [])
    }),
    fields: () => ({[_encoder]: convert.Base64Encoder}),
    getters: () => ({
      encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
      decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
    })
  });
  convert.BASE64 = dart.const(new convert.Base64Codec());
  convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
  convert._paddingChar = 61;
  const _alphabet = Symbol('_alphabet');
  const _state$0 = Symbol('_state');
  convert._Base64Encoder = class _Base64Encoder extends core.Object {
    new(urlSafe) {
      this[_alphabet] = dart.test(urlSafe) ? convert._Base64Encoder._base64urlAlphabet : convert._Base64Encoder._base64Alphabet;
      this[_state$0] = 0;
    }
    static _encodeState(count, bits) {
      dart.assert(dart.notNull(count) <= convert._Base64Encoder._countMask);
      return (dart.notNull(bits) << convert._Base64Encoder._valueShift | dart.notNull(count)) >>> 0;
    }
    static _stateBits(state) {
      return state[dartx['>>']](convert._Base64Encoder._valueShift);
    }
    static _stateCount(state) {
      return dart.notNull(state) & convert._Base64Encoder._countMask;
    }
    createBuffer(bufferLength) {
      return typed_data.Uint8List.new(bufferLength);
    }
    encode(bytes, start, end, isLast) {
      dart.assert(0 <= dart.notNull(start));
      dart.assert(dart.notNull(start) <= dart.notNull(end));
      dart.assert(bytes == null || dart.notNull(end) <= dart.notNull(bytes[dartx.length]));
      let length = dart.notNull(end) - dart.notNull(start);
      let count = convert._Base64Encoder._stateCount(this[_state$0]);
      let byteCount = dart.notNull(count) + length;
      let fullChunks = (byteCount / 3)[dartx.truncate]();
      let partialChunkLength = byteCount - fullChunks * 3;
      let bufferLength = fullChunks * 4;
      if (dart.test(isLast) && partialChunkLength > 0) {
        bufferLength = bufferLength + 4;
      }
      let output = this.createBuffer(bufferLength);
      this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
      if (bufferLength > 0) return output;
      return null;
    }
    static encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
      let bits = convert._Base64Encoder._stateBits(state);
      let expectedChars = 3 - dart.notNull(convert._Base64Encoder._stateCount(state));
      let byteOr = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let byte = bytes[dartx._get](i);
        byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
        bits = (dart.notNull(bits) << 8 | dart.notNull(byte)) & 16777215;
        expectedChars--;
        if (expectedChars == 0) {
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 18 & convert._Base64Encoder._sixBitMask));
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 12 & convert._Base64Encoder._sixBitMask));
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 6 & convert._Base64Encoder._sixBitMask));
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) & convert._Base64Encoder._sixBitMask));
          expectedChars = 3;
          bits = 0;
        }
      }
      if (dart.notNull(byteOr) >= 0 && dart.notNull(byteOr) <= 255) {
        if (dart.test(isLast) && expectedChars < 3) {
          convert._Base64Encoder.writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
          return 0;
        }
        return convert._Base64Encoder._encodeState(3 - expectedChars, bits);
      }
      let i = start;
      while (dart.notNull(i) < dart.notNull(end)) {
        let byte = bytes[dartx._get](i);
        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) break;
        i = dart.notNull(i) + 1;
      }
      dart.throw(new core.ArgumentError.value(bytes, dart.str`Not a byte value at index ${i}: 0x${bytes[dartx._get](i)[dartx.toRadixString](16)}`));
    }
    static writeFinalChunk(alphabet, output, outputIndex, count, bits) {
      dart.assert(dart.notNull(count) > 0);
      if (count == 1) {
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 2 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 4 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), convert._paddingChar);
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), convert._paddingChar);
      } else {
        dart.assert(count == 2);
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 10 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 4 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 2 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), convert._paddingChar);
      }
    }
  };
  dart.setSignature(convert._Base64Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Base64Encoder, [core.bool])}),
    fields: () => ({
      [_state$0]: core.int,
      [_alphabet]: core.String
    }),
    methods: () => ({
      createBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
      encode: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint(), core.int, core.int, core.bool])
    }),
    sfields: () => ({
      _base64Alphabet: core.String,
      _base64urlAlphabet: core.String,
      _valueShift: core.int,
      _countMask: core.int,
      _sixBitMask: core.int
    }),
    statics: () => ({
      _encodeState: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _stateBits: dart.definiteFunctionType(core.int, [core.int]),
      _stateCount: dart.definiteFunctionType(core.int, [core.int]),
      encodeChunk: dart.definiteFunctionType(core.int, [core.String, ListOfint(), core.int, core.int, core.bool, typed_data.Uint8List, core.int, core.int]),
      writeFinalChunk: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List, core.int, core.int, core.int])
    }),
    names: ['_encodeState', '_stateBits', '_stateCount', 'encodeChunk', 'writeFinalChunk']
  });
  convert._Base64Encoder._base64Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  convert._Base64Encoder._base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  convert._Base64Encoder._valueShift = 2;
  convert._Base64Encoder._countMask = 3;
  convert._Base64Encoder._sixBitMask = 63;
  convert._BufferCachingBase64Encoder = class _BufferCachingBase64Encoder extends convert._Base64Encoder {
    new(urlSafe) {
      this.bufferCache = null;
      super.new(urlSafe);
    }
    createBuffer(bufferLength) {
      if (this.bufferCache == null || dart.notNull(this.bufferCache[dartx.length]) < dart.notNull(bufferLength)) {
        this.bufferCache = typed_data.Uint8List.new(bufferLength);
      }
      return typed_data.Uint8List.view(this.bufferCache[dartx.buffer], 0, bufferLength);
    }
  };
  dart.setSignature(convert._BufferCachingBase64Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._BufferCachingBase64Encoder, [core.bool])}),
    fields: () => ({bufferCache: typed_data.Uint8List})
  });
  const _add$1 = Symbol('_add');
  convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
    new() {
      super.new();
    }
    add(source) {
      this[_add$1](source, 0, source[dartx.length], false);
    }
    close() {
      this[_add$1](null, 0, 0, true);
    }
    addSlice(source, start, end, isLast) {
      if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      this[_add$1](source, start, end, isLast);
    }
  };
  dart.setSignature(convert._Base64EncoderSink, {
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
    new(sink, urlSafe) {
      this[_sink$] = sink;
      this[_encoder] = new convert._BufferCachingBase64Encoder(urlSafe);
      super.new();
    }
    [_add$1](source, start, end, isLast) {
      let buffer = this[_encoder].encode(source, start, end, isLast);
      if (buffer != null) {
        let string = core.String.fromCharCodes(buffer);
        this[_sink$].add(string);
      }
      if (dart.test(isLast)) {
        this[_sink$].close();
      }
    }
  };
  dart.setSignature(convert._AsciiBase64EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._AsciiBase64EncoderSink, [SinkOfString(), core.bool])}),
    fields: () => ({
      [_sink$]: SinkOfString(),
      [_encoder]: convert._Base64Encoder
    }),
    methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
  });
  convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
    new(sink, urlSafe) {
      this[_sink$] = sink;
      this[_encoder] = new convert._Base64Encoder(urlSafe);
      super.new();
    }
    [_add$1](source, start, end, isLast) {
      let buffer = this[_encoder].encode(source, start, end, isLast);
      if (buffer != null) {
        this[_sink$].addSlice(buffer, 0, buffer[dartx.length], isLast);
      }
    }
  };
  dart.setSignature(convert._Utf8Base64EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Base64EncoderSink, [convert.ByteConversionSink, core.bool])}),
    fields: () => ({
      [_sink$]: convert.ByteConversionSink,
      [_encoder]: convert._Base64Encoder
    }),
    methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
  });
  convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    convert(input, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      end = core.RangeError.checkValidRange(start, end, input[dartx.length]);
      if (start == end) return typed_data.Uint8List.new(0);
      let decoder = new convert._Base64Decoder();
      let buffer = decoder.decode(input, start, end);
      decoder.close(input, end);
      return buffer;
    }
    startChunkedConversion(sink) {
      return new convert._Base64DecoderSink(sink);
    }
  };
  dart.addSimpleTypeTests(convert.Base64Decoder);
  dart.setSignature(convert.Base64Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Base64Decoder, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
    })
  });
  convert._Base64Decoder = class _Base64Decoder extends core.Object {
    new() {
      this[_state$0] = 0;
    }
    static _encodeCharacterState(count, bits) {
      dart.assert(count == (dart.notNull(count) & convert._Base64Decoder._countMask));
      return (dart.notNull(bits) << convert._Base64Decoder._valueShift | dart.notNull(count)) >>> 0;
    }
    static _stateCount(state) {
      dart.assert(dart.notNull(state) >= 0);
      return dart.notNull(state) & convert._Base64Decoder._countMask;
    }
    static _stateBits(state) {
      dart.assert(dart.notNull(state) >= 0);
      return state[dartx['>>']](convert._Base64Decoder._valueShift);
    }
    static _encodePaddingState(expectedPadding) {
      dart.assert(dart.notNull(expectedPadding) >= 0);
      dart.assert(dart.notNull(expectedPadding) <= 5);
      return -dart.notNull(expectedPadding) - 1;
    }
    static _statePadding(state) {
      dart.assert(dart.notNull(state) < 0);
      return -dart.notNull(state) - 1;
    }
    static _hasSeenPadding(state) {
      return dart.notNull(state) < 0;
    }
    decode(input, start, end) {
      dart.assert(0 <= dart.notNull(start));
      dart.assert(dart.notNull(start) <= dart.notNull(end));
      dart.assert(dart.notNull(end) <= dart.notNull(input[dartx.length]));
      if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
        this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
        return null;
      }
      if (start == end) return typed_data.Uint8List.new(0);
      let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
      this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
      return buffer;
    }
    close(input, end) {
      if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
        dart.throw(new core.FormatException("Missing padding character", input, end));
      }
      if (dart.notNull(this[_state$0]) > 0) {
        dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
      }
      this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
    }
    static decodeChunk(input, start, end, output, outIndex, state) {
      dart.assert(!dart.test(convert._Base64Decoder._hasSeenPadding(state)));
      let asciiMask = 127;
      let asciiMax = 127;
      let eightBitMask = 255;
      let bitsPerCharacter = 6;
      let bits = convert._Base64Decoder._stateBits(state);
      let count = convert._Base64Decoder._stateCount(state);
      let charOr = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = input[dartx.codeUnitAt](i);
        charOr = (dart.notNull(charOr) | dart.notNull(char)) >>> 0;
        let code = convert._Base64Decoder._inverseAlphabet[dartx._get]((dart.notNull(char) & asciiMask) >>> 0);
        if (dart.notNull(code) >= 0) {
          bits = (bits[dartx['<<']](bitsPerCharacter) | dart.notNull(code)) & 16777215;
          count = dart.notNull(count) + 1 & 3;
          if (count == 0) {
            dart.assert(dart.notNull(outIndex) + 3 <= dart.notNull(output[dartx.length]));
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), (bits[dartx['>>']](16) & eightBitMask) >>> 0);
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), (bits[dartx['>>']](8) & eightBitMask) >>> 0);
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), (dart.notNull(bits) & eightBitMask) >>> 0);
            bits = 0;
          }
          continue;
        } else if (code == convert._Base64Decoder._padding && dart.notNull(count) > 1) {
          if (dart.notNull(charOr) < 0 || dart.notNull(charOr) > asciiMax) break;
          if (count == 3) {
            if ((dart.notNull(bits) & 3) != 0) {
              dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
            }
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), bits[dartx['>>']](10));
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), bits[dartx['>>']](2));
          } else {
            if ((dart.notNull(bits) & 15) != 0) {
              dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
            }
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), bits[dartx['>>']](4));
          }
          let expectedPadding = (3 - dart.notNull(count)) * 3;
          if (char == convert._Base64Decoder._char_percent) {
            expectedPadding = expectedPadding + 2;
          }
          state = convert._Base64Decoder._encodePaddingState(expectedPadding);
          return convert._Base64Decoder._checkPadding(input, dart.notNull(i) + 1, end, state);
        }
        dart.throw(new core.FormatException("Invalid character", input, i));
      }
      if (dart.notNull(charOr) >= 0 && dart.notNull(charOr) <= asciiMax) {
        return convert._Base64Decoder._encodeCharacterState(count, bits);
      }
      let i = null;
      for (i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = input[dartx.codeUnitAt](i);
        if (dart.notNull(char) < 0 || dart.notNull(char) > asciiMax) break;
      }
      dart.throw(new core.FormatException("Invalid character", input, i));
    }
    static _allocateBuffer(input, start, end, state) {
      dart.assert(dart.notNull(state) >= 0);
      let paddingStart = convert._Base64Decoder._trimPaddingChars(input, start, end);
      let length = dart.notNull(convert._Base64Decoder._stateCount(state)) + (dart.notNull(paddingStart) - dart.notNull(start));
      let bufferLength = length[dartx['>>']](2) * 3;
      let remainderLength = length & 3;
      if (remainderLength != 0 && dart.notNull(paddingStart) < dart.notNull(end)) {
        bufferLength = bufferLength + (remainderLength - 1);
      }
      if (bufferLength > 0) return typed_data.Uint8List.new(bufferLength);
      return null;
    }
    static _trimPaddingChars(input, start, end) {
      let padding = 0;
      let index = end;
      let newEnd = end;
      while (dart.notNull(index) > dart.notNull(start) && padding < 2) {
        index = dart.notNull(index) - 1;
        let char = input[dartx.codeUnitAt](index);
        if (char == convert._paddingChar) {
          padding++;
          newEnd = index;
          continue;
        }
        if ((dart.notNull(char) | 32) == convert._Base64Decoder._char_d) {
          if (index == start) break;
          index = dart.notNull(index) - 1;
          char = input[dartx.codeUnitAt](index);
        }
        if (char == convert._Base64Decoder._char_3) {
          if (index == start) break;
          index = dart.notNull(index) - 1;
          char = input[dartx.codeUnitAt](index);
        }
        if (char == convert._Base64Decoder._char_percent) {
          padding++;
          newEnd = index;
          continue;
        }
        break;
      }
      return newEnd;
    }
    static _checkPadding(input, start, end, state) {
      dart.assert(convert._Base64Decoder._hasSeenPadding(state));
      if (start == end) return state;
      let expectedPadding = convert._Base64Decoder._statePadding(state);
      dart.assert(dart.notNull(expectedPadding) >= 0);
      dart.assert(dart.notNull(expectedPadding) < 6);
      while (dart.notNull(expectedPadding) > 0) {
        let char = input[dartx.codeUnitAt](start);
        if (expectedPadding == 3) {
          if (char == convert._paddingChar) {
            expectedPadding = dart.notNull(expectedPadding) - 3;
            start = dart.notNull(start) + 1;
            break;
          }
          if (char == convert._Base64Decoder._char_percent) {
            expectedPadding = dart.notNull(expectedPadding) - 1;
            start = dart.notNull(start) + 1;
            if (start == end) break;
            char = input[dartx.codeUnitAt](start);
          } else {
            break;
          }
        }
        let expectedPartialPadding = expectedPadding;
        if (dart.notNull(expectedPartialPadding) > 3) {
          expectedPartialPadding = dart.notNull(expectedPartialPadding) - 3;
        }
        if (expectedPartialPadding == 2) {
          if (char != convert._Base64Decoder._char_3) break;
          start = dart.notNull(start) + 1;
          expectedPadding = dart.notNull(expectedPadding) - 1;
          if (start == end) break;
          char = input[dartx.codeUnitAt](start);
        }
        if ((dart.notNull(char) | 32) != convert._Base64Decoder._char_d) break;
        start = dart.notNull(start) + 1;
        expectedPadding = dart.notNull(expectedPadding) - 1;
        if (start == end) break;
      }
      if (start != end) {
        dart.throw(new core.FormatException("Invalid padding character", input, start));
      }
      return convert._Base64Decoder._encodePaddingState(expectedPadding);
    }
  };
  dart.setSignature(convert._Base64Decoder, {
    fields: () => ({[_state$0]: core.int}),
    methods: () => ({
      decode: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int]),
      close: dart.definiteFunctionType(dart.void, [core.String, core.int])
    }),
    sfields: () => ({
      _valueShift: core.int,
      _countMask: core.int,
      _invalid: core.int,
      _padding: core.int,
      __: core.int,
      _p: core.int,
      _inverseAlphabet: ListOfint(),
      _char_percent: core.int,
      _char_3: core.int,
      _char_d: core.int
    }),
    statics: () => ({
      _encodeCharacterState: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _stateCount: dart.definiteFunctionType(core.int, [core.int]),
      _stateBits: dart.definiteFunctionType(core.int, [core.int]),
      _encodePaddingState: dart.definiteFunctionType(core.int, [core.int]),
      _statePadding: dart.definiteFunctionType(core.int, [core.int]),
      _hasSeenPadding: dart.definiteFunctionType(core.bool, [core.int]),
      decodeChunk: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, typed_data.Uint8List, core.int, core.int]),
      _allocateBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int, core.int]),
      _trimPaddingChars: dart.definiteFunctionType(core.int, [core.String, core.int, core.int]),
      _checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int])
    }),
    names: ['_encodeCharacterState', '_stateCount', '_stateBits', '_encodePaddingState', '_statePadding', '_hasSeenPadding', 'decodeChunk', '_allocateBuffer', '_trimPaddingChars', '_checkPadding']
  });
  convert._Base64Decoder._valueShift = 2;
  convert._Base64Decoder._countMask = 3;
  convert._Base64Decoder._invalid = -2;
  convert._Base64Decoder._padding = -1;
  convert._Base64Decoder._char_percent = 37;
  convert._Base64Decoder._char_3 = 51;
  convert._Base64Decoder._char_d = 100;
  dart.defineLazy(convert._Base64Decoder, {
    get __() {
      return convert._Base64Decoder._invalid;
    },
    get _p() {
      return convert._Base64Decoder._padding;
    },
    get _inverseAlphabet() {
      return typed_data.Int8List.fromList(JSArrayOfint().of([convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 63, convert._Base64Decoder.__, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__]));
    }
  });
  const _decoder = Symbol('_decoder');
  convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_decoder] = new convert._Base64Decoder();
      this[_sink$] = sink;
    }
    add(string) {
      if (dart.test(string[dartx.isEmpty])) return;
      let buffer = this[_decoder].decode(string, 0, string[dartx.length]);
      if (buffer != null) this[_sink$].add(buffer);
    }
    close() {
      this[_decoder].close(null, null);
      this[_sink$].close();
    }
    addSlice(string, start, end, isLast) {
      end = core.RangeError.checkValidRange(start, end, string[dartx.length]);
      if (start == end) return;
      let buffer = this[_decoder].decode(string, start, end);
      if (buffer != null) this[_sink$].add(buffer);
      if (dart.test(isLast)) {
        this[_decoder].close(string, end);
        this[_sink$].close();
      }
    }
  };
  dart.setSignature(convert._Base64DecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Base64DecoderSink, [SinkOfListOfint()])}),
    fields: () => ({
      [_sink$]: SinkOfListOfint(),
      [_decoder]: convert._Base64Decoder
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    add(chunk) {
      this[_sink$].add(chunk);
    }
    close() {
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._ByteAdapterSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ByteAdapterSink, [SinkOfListOfint()])}),
    fields: () => ({[_sink$]: SinkOfListOfint()}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _buffer = Symbol('_buffer');
  const _callback = Symbol('_callback');
  const _bufferIndex = Symbol('_bufferIndex');
  convert._ByteCallbackSink = class _ByteCallbackSink extends convert.ByteConversionSinkBase {
    new(callback) {
      this[_buffer] = typed_data.Uint8List.new(convert._ByteCallbackSink._INITIAL_BUFFER_SIZE);
      this[_callback] = callback;
      this[_bufferIndex] = 0;
      super.new();
    }
    add(chunk) {
      let freeCount = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_bufferIndex]);
      if (dart.notNull(chunk[dartx.length]) > freeCount) {
        let oldLength = this[_buffer][dartx.length];
        let newLength = dart.notNull(convert._ByteCallbackSink._roundToPowerOf2(dart.notNull(chunk[dartx.length]) + dart.notNull(oldLength))) * 2;
        let grown = typed_data.Uint8List.new(newLength);
        grown[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
        this[_buffer] = grown;
      }
      this[_buffer][dartx.setRange](this[_bufferIndex], dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]), chunk);
      this[_bufferIndex] = dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]);
    }
    static _roundToPowerOf2(v) {
      dart.assert(dart.notNull(v) > 0);
      v = dart.notNull(v) - 1;
      v = (dart.notNull(v) | v[dartx['>>']](1)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](2)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](4)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](8)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](16)) >>> 0;
      v = dart.notNull(v) + 1;
      return v;
    }
    close() {
      this[_callback](this[_buffer][dartx.sublist](0, this[_bufferIndex]));
    }
  };
  dart.setSignature(convert._ByteCallbackSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ByteCallbackSink, [ListOfintTovoid()])}),
    fields: () => ({
      [_callback]: ListOfintTovoid(),
      [_buffer]: ListOfint(),
      [_bufferIndex]: core.int
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [IterableOfint()]),
      close: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({_INITIAL_BUFFER_SIZE: core.int}),
    statics: () => ({_roundToPowerOf2: dart.definiteFunctionType(core.int, [core.int])}),
    names: ['_roundToPowerOf2']
  });
  convert._ByteCallbackSink._INITIAL_BUFFER_SIZE = 1024;
  convert._ChunkedConversionCallback$ = dart.generic(T => {
    const _ChunkedConversionCallback = dart.typedef('_ChunkedConversionCallback', () => dart.functionType(dart.void, [T]));
    return _ChunkedConversionCallback;
  });
  convert._ChunkedConversionCallback = _ChunkedConversionCallback();
  convert.ChunkedConverter$ = dart.generic((S, T, S2, T2) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    class ChunkedConverter extends convert.Converter$(S, T) {
      new() {
        super.new();
      }
      bind(other) {
        return super.bind(StreamOfS()._check(other));
      }
      startChunkedConversion(sink) {
        return super.startChunkedConversion(SinkOfT()._check(sink));
      }
    }
    dart.setSignature(ChunkedConverter, {
      constructors: () => ({new: dart.definiteFunctionType(convert.ChunkedConverter$(S, T, S2, T2), [])}),
      methods: () => ({
        bind: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
        startChunkedConversion: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
      })
    });
    return ChunkedConverter;
  });
  convert.ChunkedConverter = ChunkedConverter();
  const _accumulated = Symbol('_accumulated');
  convert._SimpleCallbackSink$ = dart.generic(T => {
    let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    let _ChunkedConversionCallbackOfListOfT = () => (_ChunkedConversionCallbackOfListOfT = dart.constFn(convert._ChunkedConversionCallback$(ListOfT())))();
    class _SimpleCallbackSink extends convert.ChunkedConversionSink$(T) {
      new(callback) {
        this[_accumulated] = JSArrayOfT().of([]);
        this[_callback] = callback;
        super.new();
      }
      add(chunk) {
        T._check(chunk);
        this[_accumulated][dartx.add](chunk);
      }
      close() {
        this[_callback](this[_accumulated]);
      }
    }
    dart.setSignature(_SimpleCallbackSink, {
      constructors: () => ({new: dart.definiteFunctionType(convert._SimpleCallbackSink$(T), [_ChunkedConversionCallbackOfListOfT()])}),
      fields: () => ({
        [_callback]: _ChunkedConversionCallbackOfListOfT(),
        [_accumulated]: ListOfT()
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SimpleCallbackSink;
  });
  convert._SimpleCallbackSink = _SimpleCallbackSink();
  const _eventSink = Symbol('_eventSink');
  const _chunkedSink = Symbol('_chunkedSink');
  convert._ConverterStreamEventSink$ = dart.generic((S, T) => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let SinkOfS = () => (SinkOfS = dart.constFn(core.Sink$(S)))();
    let ConverterOfS$T = () => (ConverterOfS$T = dart.constFn(convert.Converter$(S, T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _ConverterStreamEventSink extends core.Object {
      new(converter, sink) {
        this[_eventSink] = sink;
        this[_chunkedSink] = converter.startChunkedConversion(sink);
      }
      add(o) {
        S._check(o);
        this[_chunkedSink].add(o);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_eventSink].addError(error, stackTrace);
      }
      close() {
        this[_chunkedSink].close();
      }
    }
    dart.addTypeTests(_ConverterStreamEventSink);
    _ConverterStreamEventSink[dart.implements] = () => [EventSinkOfS()];
    dart.setSignature(_ConverterStreamEventSink, {
      constructors: () => ({new: dart.definiteFunctionType(convert._ConverterStreamEventSink$(S, T), [ConverterOfS$T(), EventSinkOfT()])}),
      fields: () => ({
        [_eventSink]: EventSinkOfT(),
        [_chunkedSink]: SinkOfS()
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [S]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _ConverterStreamEventSink;
  });
  convert._ConverterStreamEventSink = _ConverterStreamEventSink();
  const _second = Symbol('_second');
  const _first$0 = Symbol('_first');
  convert._FusedCodec$ = dart.generic((S, M, T) => {
    let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
    let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
    class _FusedCodec extends convert.Codec$(S, T) {
      get encoder() {
        return this[_first$0].encoder.fuse(T)(this[_second].encoder);
      }
      get decoder() {
        return this[_second].decoder.fuse(S)(this[_first$0].decoder);
      }
      new(first, second) {
        this[_first$0] = first;
        this[_second] = second;
        super.new();
      }
    }
    dart.setSignature(_FusedCodec, {
      constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
      fields: () => ({
        [_first$0]: CodecOfS$M(),
        [_second]: CodecOfM$T()
      }),
      getters: () => ({
        encoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
        decoder: dart.definiteFunctionType(convert.Converter$(T, S), [])
      })
    });
    return _FusedCodec;
  });
  convert._FusedCodec = _FusedCodec();
  const _codec = Symbol('_codec');
  convert._InvertedCodec$ = dart.generic((T, S) => {
    let CodecOfS$T = () => (CodecOfS$T = dart.constFn(convert.Codec$(S, T)))();
    class _InvertedCodec extends convert.Codec$(T, S) {
      new(codec) {
        this[_codec] = codec;
        super.new();
      }
      get encoder() {
        return this[_codec].decoder;
      }
      get decoder() {
        return this[_codec].encoder;
      }
      get inverted() {
        return this[_codec];
      }
    }
    dart.setSignature(_InvertedCodec, {
      constructors: () => ({new: dart.definiteFunctionType(convert._InvertedCodec$(T, S), [CodecOfS$T()])}),
      fields: () => ({[_codec]: CodecOfS$T()}),
      getters: () => ({
        encoder: dart.definiteFunctionType(convert.Converter$(T, S), []),
        decoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
        inverted: dart.definiteFunctionType(convert.Codec$(S, T), [])
      })
    });
    return _InvertedCodec;
  });
  convert._InvertedCodec = _InvertedCodec();
  convert._FusedConverter$ = dart.generic((S, M, T) => {
    let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
    let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    class _FusedConverter extends convert.Converter$(S, T) {
      new(first, second) {
        this[_first$0] = first;
        this[_second] = second;
        super.new();
      }
      convert(input) {
        S._check(input);
        return this[_second].convert(this[_first$0].convert(input));
      }
      startChunkedConversion(sink) {
        SinkOfT()._check(sink);
        return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
      }
    }
    dart.setSignature(_FusedConverter, {
      constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
      fields: () => ({
        [_first$0]: ConverterOfS$M(),
        [_second]: ConverterOfM$T()
      }),
      methods: () => ({
        convert: dart.definiteFunctionType(T, [S]),
        startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()])
      })
    });
    return _FusedConverter;
  });
  convert._FusedConverter = _FusedConverter();
  const _name$0 = Symbol('_name');
  let const$34;
  let const$35;
  let const$36;
  let const$37;
  let const$38;
  let const$39;
  let const$40;
  let const$41;
  convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
    _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
      this[_name$0] = name;
      this.escapeLtGt = escapeLtGt;
      this.escapeQuot = escapeQuot;
      this.escapeApos = escapeApos;
      this.escapeSlash = escapeSlash;
    }
    new(opts) {
      let name = opts && 'name' in opts ? opts.name : "custom";
      let escapeLtGt = opts && 'escapeLtGt' in opts ? opts.escapeLtGt : false;
      let escapeQuot = opts && 'escapeQuot' in opts ? opts.escapeQuot : false;
      let escapeApos = opts && 'escapeApos' in opts ? opts.escapeApos : false;
      let escapeSlash = opts && 'escapeSlash' in opts ? opts.escapeSlash : false;
      this.escapeLtGt = escapeLtGt;
      this.escapeQuot = escapeQuot;
      this.escapeApos = escapeApos;
      this.escapeSlash = escapeSlash;
      this[_name$0] = name;
    }
    toString() {
      return this[_name$0];
    }
  };
  dart.defineNamedConstructor(convert.HtmlEscapeMode, '_');
  dart.setSignature(convert.HtmlEscapeMode, {
    constructors: () => ({
      _: dart.definiteFunctionType(convert.HtmlEscapeMode, [core.String, core.bool, core.bool, core.bool, core.bool]),
      new: dart.definiteFunctionType(convert.HtmlEscapeMode, [], {name: core.String, escapeLtGt: core.bool, escapeQuot: core.bool, escapeApos: core.bool, escapeSlash: core.bool})
    }),
    fields: () => ({
      [_name$0]: core.String,
      escapeLtGt: core.bool,
      escapeQuot: core.bool,
      escapeApos: core.bool,
      escapeSlash: core.bool
    }),
    sfields: () => ({
      UNKNOWN: convert.HtmlEscapeMode,
      ATTRIBUTE: convert.HtmlEscapeMode,
      SQ_ATTRIBUTE: convert.HtmlEscapeMode,
      ELEMENT: convert.HtmlEscapeMode
    })
  });
  dart.defineLazy(convert.HtmlEscapeMode, {
    get UNKNOWN() {
      return const$38 || (const$38 = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
    },
    get ATTRIBUTE() {
      return const$39 || (const$39 = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
    },
    get SQ_ATTRIBUTE() {
      return const$40 || (const$40 = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
    },
    get ELEMENT() {
      return const$41 || (const$41 = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
    }
  });
  const _convert = Symbol('_convert');
  convert.HtmlEscape = class HtmlEscape extends convert.Converter$(core.String, core.String) {
    new(mode) {
      if (mode === void 0) mode = convert.HtmlEscapeMode.UNKNOWN;
      this.mode = mode;
      super.new();
    }
    convert(text) {
      let val = this[_convert](text, 0, text[dartx.length]);
      return val == null ? text : val;
    }
    [_convert](text, start, end) {
      let result = null;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let ch = text[dartx._get](i);
        let replacement = null;
        switch (ch) {
          case '&':
          {
            replacement = '&amp;';
            break;
          }
          case '"':
          {
            if (dart.test(this.mode.escapeQuot)) replacement = '&quot;';
            break;
          }
          case "'":
          {
            if (dart.test(this.mode.escapeApos)) replacement = '&#39;';
            break;
          }
          case '<':
          {
            if (dart.test(this.mode.escapeLtGt)) replacement = '&lt;';
            break;
          }
          case '>':
          {
            if (dart.test(this.mode.escapeLtGt)) replacement = '&gt;';
            break;
          }
          case '/':
          {
            if (dart.test(this.mode.escapeSlash)) replacement = '&#47;';
            break;
          }
        }
        if (replacement != null) {
          if (result == null) result = new core.StringBuffer();
          if (dart.notNull(i) > dart.notNull(start)) result.write(text[dartx.substring](start, i));
          result.write(replacement);
          start = dart.notNull(i) + 1;
        }
      }
      if (result == null) return null;
      if (dart.notNull(end) > dart.notNull(start)) result.write(text[dartx.substring](start, end));
      return dart.toString(result);
    }
    startChunkedConversion(sink) {
      if (!convert.StringConversionSink.is(sink)) {
        sink = convert.StringConversionSink.from(sink);
      }
      return new convert._HtmlEscapeSink(this, convert.StringConversionSink._check(sink));
    }
  };
  dart.addSimpleTypeTests(convert.HtmlEscape);
  dart.setSignature(convert.HtmlEscape, {
    constructors: () => ({new: dart.definiteFunctionType(convert.HtmlEscape, [], [convert.HtmlEscapeMode])}),
    fields: () => ({mode: convert.HtmlEscapeMode}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [core.String]),
      [_convert]: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()])
    })
  });
  convert.HTML_ESCAPE = dart.const(new convert.HtmlEscape());
  const _escape = Symbol('_escape');
  convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
    new(escape, sink) {
      this[_escape] = escape;
      this[_sink$] = sink;
    }
    addSlice(chunk, start, end, isLast) {
      let val = this[_escape][_convert](chunk, start, end);
      if (val == null) {
        this[_sink$].addSlice(chunk, start, end, isLast);
      } else {
        this[_sink$].add(val);
        if (dart.test(isLast)) this[_sink$].close();
      }
    }
    close() {
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._HtmlEscapeSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._HtmlEscapeSink, [convert.HtmlEscape, convert.StringConversionSink])}),
    fields: () => ({
      [_escape]: convert.HtmlEscape,
      [_sink$]: convert.StringConversionSink
    }),
    methods: () => ({
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert.JsonUnsupportedObjectError = class JsonUnsupportedObjectError extends core.Error {
    new(unsupportedObject, opts) {
      let cause = opts && 'cause' in opts ? opts.cause : null;
      this.unsupportedObject = unsupportedObject;
      this.cause = cause;
      super.new();
    }
    toString() {
      if (this.cause != null) {
        return "Converting object to an encodable object failed.";
      } else {
        return "Converting object did not return an encodable object.";
      }
    }
  };
  dart.setSignature(convert.JsonUnsupportedObjectError, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonUnsupportedObjectError, [dart.dynamic], {cause: dart.dynamic})}),
    fields: () => ({
      unsupportedObject: dart.dynamic,
      cause: dart.dynamic
    })
  });
  convert.JsonCyclicError = class JsonCyclicError extends convert.JsonUnsupportedObjectError {
    new(object) {
      super.new(object);
    }
    toString() {
      return "Cyclic error in JSON stringify";
    }
  };
  dart.setSignature(convert.JsonCyclicError, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonCyclicError, [core.Object])})
  });
  const _toEncodable = Symbol('_toEncodable');
  let const$42;
  let const$43;
  convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
    new(opts) {
      let reviver = opts && 'reviver' in opts ? opts.reviver : null;
      let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
      this[_reviver] = reviver;
      this[_toEncodable] = toEncodable;
      super.new();
    }
    withReviver(reviver) {
      JsonCodec.prototype.new.call(this, {reviver: reviver});
    }
    decode(source, opts) {
      let reviver = opts && 'reviver' in opts ? opts.reviver : null;
      if (reviver == null) reviver = this[_reviver];
      if (reviver == null) return this.decoder.convert(source);
      return new convert.JsonDecoder(reviver).convert(source);
    }
    encode(value, opts) {
      let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
      if (toEncodable == null) toEncodable = this[_toEncodable];
      if (toEncodable == null) return this.encoder.convert(value);
      return new convert.JsonEncoder(toEncodable).convert(value);
    }
    get encoder() {
      if (this[_toEncodable] == null) return const$42 || (const$42 = dart.const(new convert.JsonEncoder()));
      return new convert.JsonEncoder(this[_toEncodable]);
    }
    get decoder() {
      if (this[_reviver] == null) return const$43 || (const$43 = dart.const(new convert.JsonDecoder()));
      return new convert.JsonDecoder(this[_reviver]);
    }
  };
  dart.addSimpleTypeTests(convert.JsonCodec);
  dart.defineNamedConstructor(convert.JsonCodec, 'withReviver');
  dart.setSignature(convert.JsonCodec, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.JsonCodec, [], {reviver: dynamicAnddynamicTodynamic(), toEncodable: dynamicTodynamic()}),
      withReviver: dart.definiteFunctionType(convert.JsonCodec, [dynamicAnddynamicTodynamic()])
    }),
    fields: () => ({
      [_reviver]: convert._Reviver,
      [_toEncodable]: convert._ToEncodable
    }),
    getters: () => ({
      encoder: dart.definiteFunctionType(convert.JsonEncoder, []),
      decoder: dart.definiteFunctionType(convert.JsonDecoder, [])
    }),
    methods: () => ({
      decode: dart.definiteFunctionType(dart.dynamic, [core.String], {reviver: dynamicAnddynamicTodynamic()}),
      encode: dart.definiteFunctionType(core.String, [core.Object], {toEncodable: dynamicTodynamic()})
    })
  });
  convert.JSON = dart.const(new convert.JsonCodec());
  convert._Reviver = dart.typedef('_Reviver', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
  convert._ToEncodable = dart.typedef('_ToEncodable', () => dart.functionType(dart.dynamic, [dart.dynamic]));
  convert.JsonEncoder = class JsonEncoder extends convert.Converter$(core.Object, core.String) {
    new(toEncodable) {
      if (toEncodable === void 0) toEncodable = null;
      this.indent = null;
      this[_toEncodable] = toEncodable;
      super.new();
    }
    withIndent(indent, toEncodable) {
      if (toEncodable === void 0) toEncodable = null;
      this.indent = indent;
      this[_toEncodable] = toEncodable;
      super.new();
    }
    convert(object) {
      return convert._JsonStringStringifier.stringify(object, this[_toEncodable], this.indent);
    }
    startChunkedConversion(sink) {
      if (!convert.StringConversionSink.is(sink)) {
        sink = convert.StringConversionSink.from(sink);
      } else if (convert._Utf8EncoderSink.is(sink)) {
        return new convert._JsonUtf8EncoderSink(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
      }
      return new convert._JsonEncoderSink(convert.StringConversionSink._check(sink), this[_toEncodable], this.indent);
    }
    bind(stream) {
      return super.bind(stream);
    }
    fuse(T) {
      return other => {
        if (convert.Utf8Encoder.is(other)) {
          return convert.Converter$(core.Object, T).as(new convert.JsonUtf8Encoder(this.indent, this[_toEncodable]));
        }
        return super.fuse(T)(other);
      };
    }
  };
  dart.addSimpleTypeTests(convert.JsonEncoder);
  dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
  dart.setSignature(convert.JsonEncoder, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.JsonEncoder, [], [dynamicTodynamic()]),
      withIndent: dart.definiteFunctionType(convert.JsonEncoder, [core.String], [dynamicTodynamic()])
    }),
    fields: () => ({
      indent: core.String,
      [_toEncodable]: convert._ToEncodable
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [core.Object]),
      startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfString()]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfObject()]),
      fuse: dart.definiteFunctionType(T => [convert.Converter$(core.Object, T), [convert.Converter$(core.String, T)]])
    })
  });
  const _indent = Symbol('_indent');
  const _bufferSize = Symbol('_bufferSize');
  convert.JsonUtf8Encoder = class JsonUtf8Encoder extends convert.Converter$(core.Object, core.List$(core.int)) {
    new(indent, toEncodable, bufferSize) {
      if (indent === void 0) indent = null;
      if (toEncodable === void 0) toEncodable = null;
      if (bufferSize === void 0) bufferSize = convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE;
      this[_indent] = convert.JsonUtf8Encoder._utf8Encode(indent);
      this[_toEncodable] = toEncodable;
      this[_bufferSize] = bufferSize;
      super.new();
    }
    static _utf8Encode(string) {
      if (string == null) return null;
      if (dart.test(string[dartx.isEmpty])) return typed_data.Uint8List.new(0);
      checkAscii: {
        for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
          if (dart.notNull(string[dartx.codeUnitAt](i)) >= 128) break checkAscii;
        }
        return string[dartx.codeUnits];
      }
      return convert.UTF8.encode(string);
    }
    convert(object) {
      let bytes = JSArrayOfListOfint().of([]);
      function addChunk(chunk, start, end) {
        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk[dartx.length])) {
          let length = dart.notNull(end) - dart.notNull(start);
          chunk = typed_data.Uint8List.view(chunk[dartx.buffer], dart.notNull(chunk[dartx.offsetInBytes]) + dart.notNull(start), length);
        }
        bytes[dartx.add](chunk);
      }
      dart.fn(addChunk, Uint8ListAndintAndintTovoid$());
      convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
      if (bytes[dartx.length] == 1) return bytes[dartx._get](0);
      let length = 0;
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        length = dart.notNull(length) + dart.notNull(bytes[dartx._get](i)[dartx.length]);
      }
      let result = typed_data.Uint8List.new(length);
      for (let i = 0, offset = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byteList = bytes[dartx._get](i);
        let end = offset + dart.notNull(byteList[dartx.length]);
        result[dartx.setRange](offset, end, byteList);
        offset = end;
      }
      return result;
    }
    startChunkedConversion(sink) {
      let byteSink = null;
      if (convert.ByteConversionSink.is(sink)) {
        byteSink = sink;
      } else {
        byteSink = convert.ByteConversionSink.from(sink);
      }
      return new convert._JsonUtf8EncoderSink(byteSink, this[_toEncodable], this[_indent], this[_bufferSize]);
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
  dart.setSignature(convert.JsonUtf8Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonUtf8Encoder, [], [core.String, dynamicTodynamic(), core.int])}),
    fields: () => ({
      [_indent]: ListOfint(),
      [_toEncodable]: convert._ToEncodable,
      [_bufferSize]: core.int
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.Object]),
      startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfListOfint()]),
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [StreamOfObject()])
    }),
    sfields: () => ({DEFAULT_BUFFER_SIZE: core.int}),
    statics: () => ({_utf8Encode: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
    names: ['_utf8Encode']
  });
  convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE = 256;
  const _isDone = Symbol('_isDone');
  convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
    new(sink, toEncodable, indent) {
      this[_sink$] = sink;
      this[_toEncodable] = toEncodable;
      this[_indent] = indent;
      this[_isDone] = false;
      super.new();
    }
    add(o) {
      if (dart.test(this[_isDone])) {
        dart.throw(new core.StateError("Only one call to add allowed"));
      }
      this[_isDone] = true;
      let stringSink = this[_sink$].asStringSink();
      convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
      stringSink.close();
    }
    close() {}
  };
  dart.addSimpleTypeTests(convert._JsonEncoderSink);
  dart.setSignature(convert._JsonEncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonEncoderSink, [convert.StringConversionSink, convert._ToEncodable, core.String])}),
    fields: () => ({
      [_indent]: core.String,
      [_toEncodable]: convert._ToEncodable,
      [_sink$]: convert.StringConversionSink,
      [_isDone]: core.bool
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [core.Object]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _addChunk = Symbol('_addChunk');
  convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
    new(sink, toEncodable, indent, bufferSize) {
      this[_sink$] = sink;
      this[_toEncodable] = toEncodable;
      this[_indent] = indent;
      this[_bufferSize] = bufferSize;
      this[_isDone] = false;
      super.new();
    }
    [_addChunk](chunk, start, end) {
      this[_sink$].addSlice(chunk, start, end, false);
    }
    add(object) {
      if (dart.test(this[_isDone])) {
        dart.throw(new core.StateError("Only one call to add allowed"));
      }
      this[_isDone] = true;
      convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
      this[_sink$].close();
    }
    close() {
      if (!dart.test(this[_isDone])) {
        this[_isDone] = true;
        this[_sink$].close();
      }
    }
  };
  dart.addSimpleTypeTests(convert._JsonUtf8EncoderSink);
  dart.setSignature(convert._JsonUtf8EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8EncoderSink, [convert.ByteConversionSink, convert._ToEncodable, ListOfint(), core.int])}),
    fields: () => ({
      [_sink$]: convert.ByteConversionSink,
      [_indent]: ListOfint(),
      [_toEncodable]: convert._ToEncodable,
      [_bufferSize]: core.int,
      [_isDone]: core.bool
    }),
    methods: () => ({
      [_addChunk]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int]),
      add: dart.definiteFunctionType(dart.void, [core.Object]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert.JsonDecoder = class JsonDecoder extends convert.Converter$(core.String, core.Object) {
    new(reviver) {
      if (reviver === void 0) reviver = null;
      this[_reviver] = reviver;
      super.new();
    }
    convert(input) {
      return convert._parseJson(input, this[_reviver]);
    }
    startChunkedConversion(sink) {
      return new convert._JsonDecoderSink(this[_reviver], sink);
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert.JsonDecoder);
  dart.setSignature(convert.JsonDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonDecoder, [], [dynamicAnddynamicTodynamic()])}),
    fields: () => ({[_reviver]: convert._Reviver}),
    methods: () => ({
      convert: dart.definiteFunctionType(dart.dynamic, [core.String]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfObject()]),
      bind: dart.definiteFunctionType(async.Stream$(core.Object), [StreamOfString()])
    })
  });
  convert._parseJson = function(source, reviver) {
    if (!(typeof source == 'string')) dart.throw(_js_helper.argumentErrorValue(source));
    let parsed = null;
    try {
      parsed = JSON.parse(source);
    } catch (e) {
      dart.throw(new core.FormatException(String(e)));
    }

    if (reviver == null) {
      return convert._convertJsonToDartLazy(parsed);
    } else {
      return convert._convertJsonToDart(parsed, reviver);
    }
  };
  dart.fn(convert._parseJson, StringAndFnTodynamic());
  convert._defaultToEncodable = function(object) {
    return dart.dsend(object, 'toJson');
  };
  dart.fn(convert._defaultToEncodable, dynamicTodynamic$());
  const _seen = Symbol('_seen');
  const _checkCycle = Symbol('_checkCycle');
  const _removeSeen = Symbol('_removeSeen');
  convert._JsonStringifier = class _JsonStringifier extends core.Object {
    new(toEncodable) {
      this[_seen] = core.List.new();
      this[_toEncodable] = (() => {
        let l = toEncodable;
        return l != null ? l : convert._defaultToEncodable;
      })();
    }
    static hexDigit(x) {
      return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x);
    }
    writeStringContent(s) {
      let offset = 0;
      let length = s[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        let charCode = s[dartx.codeUnitAt](i);
        if (dart.notNull(charCode) > convert._JsonStringifier.BACKSLASH) continue;
        if (dart.notNull(charCode) < 32) {
          if (i > offset) this.writeStringSlice(s, offset, i);
          offset = i + 1;
          this.writeCharCode(convert._JsonStringifier.BACKSLASH);
          switch (charCode) {
            case convert._JsonStringifier.BACKSPACE:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_b);
              break;
            }
            case convert._JsonStringifier.TAB:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_t);
              break;
            }
            case convert._JsonStringifier.NEWLINE:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_n);
              break;
            }
            case convert._JsonStringifier.FORM_FEED:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_f);
              break;
            }
            case convert._JsonStringifier.CARRIAGE_RETURN:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_r);
              break;
            }
            default:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_u);
              this.writeCharCode(convert._JsonStringifier.CHAR_0);
              this.writeCharCode(convert._JsonStringifier.CHAR_0);
              this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) >> 4 & 15));
              this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) & 15));
              break;
            }
          }
        } else if (charCode == convert._JsonStringifier.QUOTE || charCode == convert._JsonStringifier.BACKSLASH) {
          if (i > offset) this.writeStringSlice(s, offset, i);
          offset = i + 1;
          this.writeCharCode(convert._JsonStringifier.BACKSLASH);
          this.writeCharCode(charCode);
        }
      }
      if (offset == 0) {
        this.writeString(s);
      } else if (offset < dart.notNull(length)) {
        this.writeStringSlice(s, offset, length);
      }
    }
    [_checkCycle](object) {
      for (let i = 0; i < dart.notNull(this[_seen][dartx.length]); i++) {
        if (core.identical(object, this[_seen][dartx._get](i))) {
          dart.throw(new convert.JsonCyclicError(object));
        }
      }
      this[_seen][dartx.add](object);
    }
    [_removeSeen](object) {
      dart.assert(!dart.test(this[_seen][dartx.isEmpty]));
      dart.assert(core.identical(this[_seen][dartx.last], object));
      this[_seen][dartx.removeLast]();
    }
    writeObject(object) {
      if (dart.test(this.writeJsonValue(object))) return;
      this[_checkCycle](object);
      try {
        let customJson = dart.dcall(this[_toEncodable], object);
        if (!dart.test(this.writeJsonValue(customJson))) {
          dart.throw(new convert.JsonUnsupportedObjectError(object));
        }
        this[_removeSeen](object);
      } catch (e) {
        dart.throw(new convert.JsonUnsupportedObjectError(object, {cause: e}));
      }

    }
    writeJsonValue(object) {
      if (typeof object == 'number') {
        if (!dart.test(object[dartx.isFinite])) return false;
        this.writeNumber(object);
        return true;
      } else if (core.identical(object, true)) {
        this.writeString('true');
        return true;
      } else if (core.identical(object, false)) {
        this.writeString('false');
        return true;
      } else if (object == null) {
        this.writeString('null');
        return true;
      } else if (typeof object == 'string') {
        this.writeString('"');
        this.writeStringContent(object);
        this.writeString('"');
        return true;
      } else if (core.List.is(object)) {
        this[_checkCycle](object);
        this.writeList(object);
        this[_removeSeen](object);
        return true;
      } else if (core.Map.is(object)) {
        this[_checkCycle](object);
        let success = this.writeMap(object);
        this[_removeSeen](object);
        return success;
      } else {
        return false;
      }
    }
    writeList(list) {
      this.writeString('[');
      if (dart.notNull(list[dartx.length]) > 0) {
        this.writeObject(list[dartx._get](0));
        for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
          this.writeString(',');
          this.writeObject(list[dartx._get](i));
        }
      }
      this.writeString(']');
    }
    writeMap(map) {
      if (dart.test(map[dartx.isEmpty])) {
        this.writeString("{}");
        return true;
      }
      let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
      let i = 0;
      let allStringKeys = true;
      map[dartx.forEach](dart.fn((key, value) => {
        if (!(typeof key == 'string')) {
          allStringKeys = false;
        }
        keyValueList[dartx._set](i++, key);
        keyValueList[dartx._set](i++, value);
      }, dynamicAnddynamicTovoid$()));
      if (!allStringKeys) return false;
      this.writeString('{');
      let separator = '"';
      for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
        this.writeString(separator);
        separator = ',"';
        this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
        this.writeString('":');
        this.writeObject(keyValueList[dartx._get](i + 1));
      }
      this.writeString('}');
      return true;
    }
  };
  dart.setSignature(convert._JsonStringifier, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringifier, [dynamicTodynamic()])}),
    fields: () => ({
      [_seen]: core.List,
      [_toEncodable]: convert._ToEncodable
    }),
    methods: () => ({
      writeStringContent: dart.definiteFunctionType(dart.void, [core.String]),
      [_checkCycle]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_removeSeen]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      writeObject: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      writeJsonValue: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      writeList: dart.definiteFunctionType(dart.void, [core.List]),
      writeMap: dart.definiteFunctionType(core.bool, [core.Map])
    }),
    sfields: () => ({
      BACKSPACE: core.int,
      TAB: core.int,
      NEWLINE: core.int,
      CARRIAGE_RETURN: core.int,
      FORM_FEED: core.int,
      QUOTE: core.int,
      CHAR_0: core.int,
      BACKSLASH: core.int,
      CHAR_b: core.int,
      CHAR_f: core.int,
      CHAR_n: core.int,
      CHAR_r: core.int,
      CHAR_t: core.int,
      CHAR_u: core.int
    }),
    statics: () => ({hexDigit: dart.definiteFunctionType(core.int, [core.int])}),
    names: ['hexDigit']
  });
  convert._JsonStringifier.BACKSPACE = 8;
  convert._JsonStringifier.TAB = 9;
  convert._JsonStringifier.NEWLINE = 10;
  convert._JsonStringifier.CARRIAGE_RETURN = 13;
  convert._JsonStringifier.FORM_FEED = 12;
  convert._JsonStringifier.QUOTE = 34;
  convert._JsonStringifier.CHAR_0 = 48;
  convert._JsonStringifier.BACKSLASH = 92;
  convert._JsonStringifier.CHAR_b = 98;
  convert._JsonStringifier.CHAR_f = 102;
  convert._JsonStringifier.CHAR_n = 110;
  convert._JsonStringifier.CHAR_r = 114;
  convert._JsonStringifier.CHAR_t = 116;
  convert._JsonStringifier.CHAR_u = 117;
  const _indentLevel = Symbol('_indentLevel');
  convert._JsonPrettyPrintMixin = class _JsonPrettyPrintMixin extends core.Object {
    new() {
      this[_indentLevel] = 0;
    }
    writeList(list) {
      if (dart.test(list[dartx.isEmpty])) {
        this.writeString('[]');
      } else {
        this.writeString('[\n');
        this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
        this.writeIndentation(this[_indentLevel]);
        this.writeObject(list[dartx._get](0));
        for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
          this.writeString(',\n');
          this.writeIndentation(this[_indentLevel]);
          this.writeObject(list[dartx._get](i));
        }
        this.writeString('\n');
        this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
        this.writeIndentation(this[_indentLevel]);
        this.writeString(']');
      }
    }
    writeMap(map) {
      if (dart.test(map[dartx.isEmpty])) {
        this.writeString("{}");
        return true;
      }
      let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
      let i = 0;
      let allStringKeys = true;
      map[dartx.forEach](dart.fn((key, value) => {
        if (!(typeof key == 'string')) {
          allStringKeys = false;
        }
        keyValueList[dartx._set](i++, key);
        keyValueList[dartx._set](i++, value);
      }, dynamicAnddynamicTovoid$()));
      if (!allStringKeys) return false;
      this.writeString('{\n');
      this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
      let separator = "";
      for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
        this.writeString(separator);
        separator = ",\n";
        this.writeIndentation(this[_indentLevel]);
        this.writeString('"');
        this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
        this.writeString('": ');
        this.writeObject(keyValueList[dartx._get](i + 1));
      }
      this.writeString('\n');
      this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
      this.writeIndentation(this[_indentLevel]);
      this.writeString('}');
      return true;
    }
  };
  convert._JsonPrettyPrintMixin[dart.implements] = () => [convert._JsonStringifier];
  dart.setSignature(convert._JsonPrettyPrintMixin, {
    fields: () => ({[_indentLevel]: core.int}),
    methods: () => ({
      writeList: dart.definiteFunctionType(dart.void, [core.List]),
      writeMap: dart.definiteFunctionType(core.bool, [core.Map])
    })
  });
  convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
    new(sink, _toEncodable) {
      this[_sink$] = sink;
      super.new(dynamicTodynamic()._check(_toEncodable));
    }
    static stringify(object, toEncodable, indent) {
      let output = new core.StringBuffer();
      convert._JsonStringStringifier.printOn(object, output, toEncodable, indent);
      return output.toString();
    }
    static printOn(object, output, toEncodable, indent) {
      let stringifier = null;
      if (indent == null) {
        stringifier = new convert._JsonStringStringifier(output, toEncodable);
      } else {
        stringifier = new convert._JsonStringStringifierPretty(output, toEncodable, indent);
      }
      dart.dsend(stringifier, 'writeObject', object);
    }
    writeNumber(number) {
      this[_sink$].write(dart.toString(number));
    }
    writeString(string) {
      this[_sink$].write(string);
    }
    writeStringSlice(string, start, end) {
      this[_sink$].write(string[dartx.substring](start, end));
    }
    writeCharCode(charCode) {
      this[_sink$].writeCharCode(charCode);
    }
  };
  dart.setSignature(convert._JsonStringStringifier, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifier, [core.StringSink, dart.dynamic])}),
    fields: () => ({[_sink$]: core.StringSink}),
    methods: () => ({
      writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
      writeString: dart.definiteFunctionType(dart.void, [core.String]),
      writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
    }),
    statics: () => ({
      stringify: dart.definiteFunctionType(core.String, [dart.dynamic, dynamicTodynamic(), core.String]),
      printOn: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StringSink, dynamicTodynamic(), core.String])
    }),
    names: ['stringify', 'printOn']
  });
  convert._JsonStringStringifierPretty = class _JsonStringStringifierPretty extends dart.mixin(convert._JsonStringStringifier, convert._JsonPrettyPrintMixin) {
    new(sink, toEncodable, indent) {
      this[_indent] = indent;
      super.new(sink, toEncodable);
    }
    writeIndentation(count) {
      for (let i = 0; i < dart.notNull(count); i++)
        this.writeString(this[_indent]);
    }
  };
  dart.setSignature(convert._JsonStringStringifierPretty, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifierPretty, [core.StringSink, dynamicTodynamic(), core.String])}),
    fields: () => ({[_indent]: core.String}),
    methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
  });
  convert._AddChunk = dart.typedef('_AddChunk', () => dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int]));
  convert._JsonUtf8Stringifier = class _JsonUtf8Stringifier extends convert._JsonStringifier {
    new(toEncodable, bufferSize, addChunk) {
      this.addChunk = addChunk;
      this.bufferSize = bufferSize;
      this.buffer = typed_data.Uint8List.new(bufferSize);
      this.index = 0;
      super.new(toEncodable);
    }
    static stringify(object, indent, toEncodable, bufferSize, addChunk) {
      let stringifier = null;
      if (indent != null) {
        stringifier = new convert._JsonUtf8StringifierPretty(toEncodable, indent, bufferSize, addChunk);
      } else {
        stringifier = new convert._JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
      }
      stringifier.writeObject(object);
      stringifier.flush();
    }
    flush() {
      if (dart.notNull(this.index) > 0) {
        this.addChunk(this.buffer, 0, this.index);
      }
      this.buffer = null;
      this.index = 0;
    }
    writeNumber(number) {
      this.writeAsciiString(dart.toString(number));
    }
    writeAsciiString(string) {
      for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
        let char = string[dartx.codeUnitAt](i);
        dart.assert(dart.notNull(char) <= 127);
        this.writeByte(char);
      }
    }
    writeString(string) {
      this.writeStringSlice(string, 0, string[dartx.length]);
    }
    writeStringSlice(string, start, end) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = string[dartx.codeUnitAt](i);
        if (dart.notNull(char) <= 127) {
          this.writeByte(char);
        } else {
          if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(i) + 1 < dart.notNull(end)) {
            let nextChar = string[dartx.codeUnitAt](dart.notNull(i) + 1);
            if ((dart.notNull(nextChar) & 64512) == 56320) {
              char = 65536 + ((dart.notNull(char) & 1023) << 10) + (dart.notNull(nextChar) & 1023);
              this.writeFourByteCharCode(char);
              i = dart.notNull(i) + 1;
              continue;
            }
          }
          this.writeMultiByteCharCode(char);
        }
      }
    }
    writeCharCode(charCode) {
      if (dart.notNull(charCode) <= 127) {
        this.writeByte(charCode);
        return;
      }
      this.writeMultiByteCharCode(charCode);
    }
    writeMultiByteCharCode(charCode) {
      if (dart.notNull(charCode) <= 2047) {
        this.writeByte((192 | charCode[dartx['>>']](6)) >>> 0);
        this.writeByte(128 | dart.notNull(charCode) & 63);
        return;
      }
      if (dart.notNull(charCode) <= 65535) {
        this.writeByte((224 | charCode[dartx['>>']](12)) >>> 0);
        this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
        this.writeByte(128 | dart.notNull(charCode) & 63);
        return;
      }
      this.writeFourByteCharCode(charCode);
    }
    writeFourByteCharCode(charCode) {
      dart.assert(dart.notNull(charCode) <= 1114111);
      this.writeByte((240 | charCode[dartx['>>']](18)) >>> 0);
      this.writeByte(128 | dart.notNull(charCode) >> 12 & 63);
      this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
      this.writeByte(128 | dart.notNull(charCode) & 63);
    }
    writeByte(byte) {
      dart.assert(dart.notNull(byte) <= 255);
      if (this.index == this.buffer[dartx.length]) {
        this.addChunk(this.buffer, 0, this.index);
        this.buffer = typed_data.Uint8List.new(this.bufferSize);
        this.index = 0;
      }
      this.buffer[dartx._set]((() => {
        let x = this.index;
        this.index = dart.notNull(x) + 1;
        return x;
      })(), byte);
    }
  };
  dart.setSignature(convert._JsonUtf8Stringifier, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8Stringifier, [dynamicTodynamic(), core.int, convert._AddChunk])}),
    fields: () => ({
      bufferSize: core.int,
      addChunk: convert._AddChunk,
      buffer: typed_data.Uint8List,
      index: core.int
    }),
    methods: () => ({
      flush: dart.definiteFunctionType(dart.void, []),
      writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
      writeAsciiString: dart.definiteFunctionType(dart.void, [core.String]),
      writeString: dart.definiteFunctionType(dart.void, [core.String]),
      writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeMultiByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeFourByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeByte: dart.definiteFunctionType(dart.void, [core.int])
    }),
    statics: () => ({stringify: dart.definiteFunctionType(dart.void, [core.Object, ListOfint(), dynamicTodynamic(), core.int, Uint8ListAndintAndintTovoid()])}),
    names: ['stringify']
  });
  convert._JsonUtf8StringifierPretty = class _JsonUtf8StringifierPretty extends dart.mixin(convert._JsonUtf8Stringifier, convert._JsonPrettyPrintMixin) {
    new(toEncodable, indent, bufferSize, addChunk) {
      this.indent = indent;
      super.new(toEncodable, core.int._check(bufferSize), addChunk);
    }
    writeIndentation(count) {
      let indent = this.indent;
      let indentLength = indent[dartx.length];
      if (indentLength == 1) {
        let char = indent[dartx._get](0);
        while (dart.notNull(count) > 0) {
          this.writeByte(char);
          count = dart.notNull(count) - 1;
        }
        return;
      }
      while (dart.notNull(count) > 0) {
        count = dart.notNull(count) - 1;
        let end = dart.notNull(this.index) + dart.notNull(indentLength);
        if (end <= dart.notNull(this.buffer[dartx.length])) {
          this.buffer[dartx.setRange](this.index, end, indent);
          this.index = end;
        } else {
          for (let i = 0; i < dart.notNull(indentLength); i++) {
            this.writeByte(indent[dartx._get](i));
          }
        }
      }
    }
  };
  dart.setSignature(convert._JsonUtf8StringifierPretty, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8StringifierPretty, [dynamicTodynamic(), ListOfint(), dart.dynamic, Uint8ListAndintAndintTovoid()])}),
    fields: () => ({indent: ListOfint()}),
    methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
  });
  let const$44;
  let const$45;
  let const$46;
  let const$47;
  let const$48;
  convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      this[_allowInvalid] = allowInvalid;
      super.new();
    }
    get name() {
      return "iso-8859-1";
    }
    decode(bytes, opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
      if (allowInvalid == null) allowInvalid = this[_allowInvalid];
      if (dart.test(allowInvalid)) {
        return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
      } else {
        return (const$45 || (const$45 = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
      }
    }
    get encoder() {
      return const$46 || (const$46 = dart.const(new convert.Latin1Encoder()));
    }
    get decoder() {
      return dart.test(this[_allowInvalid]) ? const$47 || (const$47 = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const$48 || (const$48 = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
    }
  };
  dart.setSignature(convert.Latin1Codec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Codec, [], {allowInvalid: core.bool})}),
    fields: () => ({[_allowInvalid]: core.bool}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.Latin1Encoder, []),
      decoder: dart.definiteFunctionType(convert.Latin1Decoder, [])
    }),
    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
  });
  convert.LATIN1 = dart.const(new convert.Latin1Codec());
  convert._LATIN1_MASK = 255;
  convert.Latin1Encoder = class Latin1Encoder extends convert._UnicodeSubsetEncoder {
    new() {
      super.new(convert._LATIN1_MASK);
    }
  };
  dart.setSignature(convert.Latin1Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Encoder, [])})
  });
  convert.Latin1Decoder = class Latin1Decoder extends convert._UnicodeSubsetDecoder {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      super.new(allowInvalid, convert._LATIN1_MASK);
    }
    startChunkedConversion(sink) {
      let stringSink = null;
      if (convert.StringConversionSink.is(sink)) {
        stringSink = sink;
      } else {
        stringSink = convert.StringConversionSink.from(sink);
      }
      if (!dart.test(this[_allowInvalid])) return new convert._Latin1DecoderSink(stringSink);
      return new convert._Latin1AllowInvalidDecoderSink(stringSink);
    }
  };
  dart.setSignature(convert.Latin1Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Decoder, [], {allowInvalid: core.bool})}),
    methods: () => ({startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])})
  });
  const _addSliceToSink = Symbol('_addSliceToSink');
  convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    close() {
      this[_sink$].close();
      this[_sink$] = null;
    }
    add(source) {
      this.addSlice(source, 0, source[dartx.length], false);
    }
    [_addSliceToSink](source, start, end, isLast) {
      this[_sink$].add(core.String.fromCharCodes(source, start, end));
      if (dart.test(isLast)) this.close();
    }
    addSlice(source, start, end, isLast) {
      end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
      if (start == end) return;
      if (!typed_data.Uint8List.is(source)) {
        convert._Latin1DecoderSink._checkValidLatin1(source, start, end);
      }
      this[_addSliceToSink](source, start, end, isLast);
    }
    static _checkValidLatin1(source, start, end) {
      let mask = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        mask = (dart.notNull(mask) | dart.notNull(source[dartx._get](i))) >>> 0;
      }
      if (dart.notNull(mask) >= 0 && dart.notNull(mask) <= convert._LATIN1_MASK) {
        return;
      }
      convert._Latin1DecoderSink._reportInvalidLatin1(source, start, end);
    }
    static _reportInvalidLatin1(source, start, end) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = source[dartx._get](i);
        if (dart.notNull(char) < 0 || dart.notNull(char) > convert._LATIN1_MASK) {
          dart.throw(new core.FormatException("Source contains non-Latin-1 characters.", source, i));
        }
      }
      dart.assert(false);
    }
  };
  dart.setSignature(convert._Latin1DecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Latin1DecoderSink, [convert.StringConversionSink])}),
    fields: () => ({[_sink$]: convert.StringConversionSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      [_addSliceToSink]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
    }),
    statics: () => ({
      _checkValidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int]),
      _reportInvalidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
    }),
    names: ['_checkValidLatin1', '_reportInvalidLatin1']
  });
  let const$49;
  convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
    new(sink) {
      super.new(sink);
    }
    addSlice(source, start, end, isLast) {
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = source[dartx._get](i);
        if (dart.notNull(char) > convert._LATIN1_MASK || dart.notNull(char) < 0) {
          if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
          this[_addSliceToSink](const$49 || (const$49 = dart.constList([65533], core.int)), 0, 1, false);
          start = dart.notNull(i) + 1;
        }
      }
      if (dart.notNull(start) < dart.notNull(end)) {
        this[_addSliceToSink](source, start, end, isLast);
      }
      if (dart.test(isLast)) {
        this.close();
      }
    }
  };
  dart.setSignature(convert._Latin1AllowInvalidDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Latin1AllowInvalidDecoderSink, [convert.StringConversionSink])})
  });
  convert._LF = 10;
  convert._CR = 13;
  convert.LineSplitter = class LineSplitter extends core.Object {
    new() {
    }
    static split(lines, start, end) {
      return dart.syncStar(function*(lines, start, end) {
        if (start === void 0) start = 0;
        if (end === void 0) end = null;
        end = core.RangeError.checkValidRange(start, end, lines[dartx.length]);
        let sliceStart = start;
        let char = 0;
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          let previousChar = char;
          char = lines[dartx.codeUnitAt](i);
          if (char != convert._CR) {
            if (char != convert._LF) continue;
            if (previousChar == convert._CR) {
              sliceStart = dart.notNull(i) + 1;
              continue;
            }
          }
          yield lines[dartx.substring](sliceStart, i);
          sliceStart = dart.notNull(i) + 1;
        }
        if (dart.notNull(sliceStart) < dart.notNull(end)) {
          yield lines[dartx.substring](sliceStart, end);
        }
      }, core.String, lines, start, end);
    }
    convert(data) {
      let lines = JSArrayOfString().of([]);
      let end = data[dartx.length];
      let sliceStart = 0;
      let char = 0;
      for (let i = 0; i < dart.notNull(end); i++) {
        let previousChar = char;
        char = data[dartx.codeUnitAt](i);
        if (char != convert._CR) {
          if (char != convert._LF) continue;
          if (previousChar == convert._CR) {
            sliceStart = i + 1;
            continue;
          }
        }
        lines[dartx.add](data[dartx.substring](sliceStart, i));
        sliceStart = i + 1;
      }
      if (sliceStart < dart.notNull(end)) {
        lines[dartx.add](data[dartx.substring](sliceStart, end));
      }
      return lines;
    }
    startChunkedConversion(sink) {
      if (!convert.StringConversionSink.is(sink)) {
        sink = convert.StringConversionSink.from(sink);
      }
      return new convert._LineSplitterSink(convert.StringConversionSink._check(sink));
    }
    bind(stream) {
      return StreamOfString().eventTransformed(stream, dart.fn(sink => new convert._LineSplitterEventSink(sink), EventSinkOfStringTo_LineSplitterEventSink()));
    }
  };
  convert.LineSplitter[dart.implements] = () => [StreamTransformerOfString$String()];
  dart.setSignature(convert.LineSplitter, {
    constructors: () => ({new: dart.definiteFunctionType(convert.LineSplitter, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.String), [core.String]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfString()])
    }),
    statics: () => ({split: dart.definiteFunctionType(core.Iterable$(core.String), [core.String], [core.int, core.int])}),
    names: ['split']
  });
  const _carry = Symbol('_carry');
  const _skipLeadingLF = Symbol('_skipLeadingLF');
  const _addLines = Symbol('_addLines');
  convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      this[_carry] = null;
      this[_skipLeadingLF] = false;
    }
    addSlice(chunk, start, end, isLast) {
      end = core.RangeError.checkValidRange(start, end, chunk[dartx.length]);
      if (dart.notNull(start) >= dart.notNull(end)) {
        if (dart.test(isLast)) this.close();
        return;
      }
      if (this[_carry] != null) {
        dart.assert(!dart.test(this[_skipLeadingLF]));
        chunk = dart.notNull(this[_carry]) + dart.notNull(chunk[dartx.substring](start, end));
        start = 0;
        end = chunk[dartx.length];
        this[_carry] = null;
      } else if (dart.test(this[_skipLeadingLF])) {
        if (chunk[dartx.codeUnitAt](start) == convert._LF) {
          start = dart.notNull(start) + 1;
        }
        this[_skipLeadingLF] = false;
      }
      this[_addLines](chunk, start, end);
      if (dart.test(isLast)) this.close();
    }
    close() {
      if (this[_carry] != null) {
        this[_sink$].add(this[_carry]);
        this[_carry] = null;
      }
      this[_sink$].close();
    }
    [_addLines](lines, start, end) {
      let sliceStart = start;
      let char = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let previousChar = char;
        char = lines[dartx.codeUnitAt](i);
        if (char != convert._CR) {
          if (char != convert._LF) continue;
          if (previousChar == convert._CR) {
            sliceStart = dart.notNull(i) + 1;
            continue;
          }
        }
        this[_sink$].add(lines[dartx.substring](sliceStart, i));
        sliceStart = dart.notNull(i) + 1;
      }
      if (dart.notNull(sliceStart) < dart.notNull(end)) {
        this[_carry] = lines[dartx.substring](sliceStart, end);
      } else {
        this[_skipLeadingLF] = char == convert._CR;
      }
    }
  };
  dart.setSignature(convert._LineSplitterSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterSink, [convert.StringConversionSink])}),
    fields: () => ({
      [_sink$]: convert.StringConversionSink,
      [_carry]: core.String,
      [_skipLeadingLF]: core.bool
    }),
    methods: () => ({
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, []),
      [_addLines]: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int])
    })
  });
  convert._LineSplitterEventSink = class _LineSplitterEventSink extends convert._LineSplitterSink {
    new(eventSink) {
      this[_eventSink] = eventSink;
      super.new(convert.StringConversionSink.from(eventSink));
    }
    addError(o, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_eventSink].addError(o, stackTrace);
    }
  };
  convert._LineSplitterEventSink[dart.implements] = () => [EventSinkOfString()];
  dart.setSignature(convert._LineSplitterEventSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])}),
    fields: () => ({[_eventSink]: EventSinkOfString()}),
    methods: () => ({addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
  });
  convert.StringConversionSink = class StringConversionSink extends convert.ChunkedConversionSink$(core.String) {
    new() {
      super.new();
    }
    static withCallback(callback) {
      return new convert._StringCallbackSink(callback);
    }
    static from(sink) {
      return new convert._StringAdapterSink(sink);
    }
    static fromStringSink(sink) {
      return new convert._StringSinkConversionSink(sink);
    }
  };
  dart.addSimpleTypeTests(convert.StringConversionSink);
  dart.setSignature(convert.StringConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.StringConversionSink, []),
      withCallback: dart.definiteFunctionType(convert.StringConversionSink, [StringTovoid()]),
      from: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
      fromStringSink: dart.definiteFunctionType(convert.StringConversionSink, [core.StringSink])
    })
  });
  core.StringSink = class StringSink extends core.Object {};
  convert.ClosableStringSink = class ClosableStringSink extends core.StringSink {
    static fromStringSink(sink, onClose) {
      return new convert._ClosableStringSink(sink, onClose);
    }
  };
  dart.setSignature(convert.ClosableStringSink, {
    constructors: () => ({fromStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [core.StringSink, VoidTovoid()])})
  });
  convert._StringSinkCloseCallback = dart.typedef('_StringSinkCloseCallback', () => dart.functionType(dart.void, []));
  convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
    new(sink, callback) {
      this[_sink$] = sink;
      this[_callback] = callback;
    }
    close() {
      this[_callback]();
    }
    writeCharCode(charCode) {
      this[_sink$].writeCharCode(charCode);
    }
    write(o) {
      this[_sink$].write(o);
    }
    writeln(o) {
      if (o === void 0) o = "";
      this[_sink$].writeln(o);
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      this[_sink$].writeAll(objects, separator);
    }
  };
  convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
  dart.setSignature(convert._ClosableStringSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ClosableStringSink, [core.StringSink, convert._StringSinkCloseCallback])}),
    fields: () => ({
      [_callback]: convert._StringSinkCloseCallback,
      [_sink$]: core.StringSink
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String])
    })
  });
  const _flush = Symbol('_flush');
  convert._StringConversionSinkAsStringSinkAdapter = class _StringConversionSinkAsStringSinkAdapter extends core.Object {
    new(chunkedSink) {
      this[_chunkedSink] = chunkedSink;
      this[_buffer] = new core.StringBuffer();
    }
    close() {
      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
      this[_chunkedSink].close();
    }
    writeCharCode(charCode) {
      this[_buffer].writeCharCode(charCode);
      if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
    }
    write(o) {
      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
      this[_chunkedSink].add(dart.toString(o));
    }
    writeln(o) {
      if (o === void 0) o = "";
      this[_buffer].writeln(o);
      if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
      let iterator = objects[dartx.iterator];
      if (!dart.test(iterator.moveNext())) return;
      if (dart.test(separator[dartx.isEmpty])) {
        do {
          this[_chunkedSink].add(dart.toString(iterator.current));
        } while (dart.test(iterator.moveNext()));
      } else {
        this[_chunkedSink].add(dart.toString(iterator.current));
        while (dart.test(iterator.moveNext())) {
          this.write(separator);
          this[_chunkedSink].add(dart.toString(iterator.current));
        }
      }
    }
    [_flush]() {
      let accumulated = dart.toString(this[_buffer]);
      this[_buffer].clear();
      this[_chunkedSink].add(accumulated);
    }
  };
  convert._StringConversionSinkAsStringSinkAdapter[dart.implements] = () => [convert.ClosableStringSink];
  dart.setSignature(convert._StringConversionSinkAsStringSinkAdapter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringConversionSinkAsStringSinkAdapter, [convert.StringConversionSink])}),
    fields: () => ({
      [_buffer]: core.StringBuffer,
      [_chunkedSink]: convert.StringConversionSink
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      [_flush]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({_MIN_STRING_SIZE: core.int})
  });
  convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE = 16;
  convert._StringCallbackSink = class _StringCallbackSink extends convert._StringSinkConversionSink {
    new(callback) {
      this[_callback] = callback;
      super.new(new core.StringBuffer());
    }
    close() {
      let buffer = core.StringBuffer._check(this[_stringSink]);
      let accumulated = dart.toString(buffer);
      buffer.clear();
      this[_callback](accumulated);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
    }
  };
  dart.setSignature(convert._StringCallbackSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringCallbackSink, [StringTovoid()])}),
    fields: () => ({[_callback]: StringTovoid()})
  });
  convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
    }
    add(str) {
      this[_sink$].add(str);
    }
    addSlice(str, start, end, isLast) {
      if (start == 0 && end == str[dartx.length]) {
        this.add(str);
      } else {
        this.add(str[dartx.substring](start, end));
      }
      if (dart.test(isLast)) this.close();
    }
    close() {
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._StringAdapterSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringAdapterSink, [SinkOfString()])}),
    fields: () => ({[_sink$]: SinkOfString()}),
    methods: () => ({
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
    new(sink, stringSink, allowMalformed) {
      this[_sink$] = sink;
      this[_decoder] = new convert._Utf8Decoder(stringSink, allowMalformed);
      super.new();
    }
    close() {
      this[_decoder].close();
      if (this[_sink$] != null) this[_sink$].close();
    }
    add(chunk) {
      this.addSlice(chunk, 0, chunk[dartx.length], false);
    }
    addSlice(codeUnits, startIndex, endIndex, isLast) {
      this[_decoder].convert(codeUnits, startIndex, endIndex);
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert._Utf8StringSinkAdapter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8StringSinkAdapter, [core.Sink, core.StringSink, core.bool])}),
    fields: () => ({
      [_decoder]: convert._Utf8Decoder,
      [_sink$]: core.Sink
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
    })
  });
  convert._Utf8ConversionSink = class _Utf8ConversionSink extends convert.ByteConversionSink {
    new(sink, allowMalformed) {
      _Utf8ConversionSink.prototype._.call(this, sink, new core.StringBuffer(), allowMalformed);
    }
    _(chunkedSink, stringBuffer, allowMalformed) {
      this[_chunkedSink] = chunkedSink;
      this[_decoder] = new convert._Utf8Decoder(stringBuffer, allowMalformed);
      this[_buffer] = stringBuffer;
      super.new();
    }
    close() {
      this[_decoder].close();
      if (dart.test(this[_buffer].isNotEmpty)) {
        let accumulated = dart.toString(this[_buffer]);
        this[_buffer].clear();
        this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], true);
      } else {
        this[_chunkedSink].close();
      }
    }
    add(chunk) {
      this.addSlice(chunk, 0, chunk[dartx.length], false);
    }
    addSlice(chunk, startIndex, endIndex, isLast) {
      this[_decoder].convert(chunk, startIndex, endIndex);
      if (dart.test(this[_buffer].isNotEmpty)) {
        let accumulated = dart.toString(this[_buffer]);
        this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], isLast);
        this[_buffer].clear();
        return;
      }
      if (dart.test(isLast)) this.close();
    }
  };
  dart.defineNamedConstructor(convert._Utf8ConversionSink, '_');
  dart.setSignature(convert._Utf8ConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.bool]),
      _: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.StringBuffer, core.bool])
    }),
    fields: () => ({
      [_decoder]: convert._Utf8Decoder,
      [_chunkedSink]: convert.StringConversionSink,
      [_buffer]: core.StringBuffer
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
    })
  });
  convert.UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533;
  convert.UNICODE_BOM_CHARACTER_RUNE = 65279;
  const _allowMalformed = Symbol('_allowMalformed');
  let const$50;
  convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
    new(opts) {
      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
      this[_allowMalformed] = allowMalformed;
      super.new();
    }
    get name() {
      return "utf-8";
    }
    decode(codeUnits, opts) {
      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : null;
      if (allowMalformed == null) allowMalformed = this[_allowMalformed];
      return new convert.Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits);
    }
    get encoder() {
      return const$50 || (const$50 = dart.const(new convert.Utf8Encoder()));
    }
    get decoder() {
      return new convert.Utf8Decoder({allowMalformed: this[_allowMalformed]});
    }
  };
  dart.setSignature(convert.Utf8Codec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Codec, [], {allowMalformed: core.bool})}),
    fields: () => ({[_allowMalformed]: core.bool}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.Utf8Encoder, []),
      decoder: dart.definiteFunctionType(convert.Utf8Decoder, [])
    }),
    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowMalformed: core.bool})})
  });
  convert.UTF8 = dart.const(new convert.Utf8Codec());
  const _fillBuffer = Symbol('_fillBuffer');
  const _writeSurrogate = Symbol('_writeSurrogate');
  convert.Utf8Encoder = class Utf8Encoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    convert(string, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let stringLength = string[dartx.length];
      core.RangeError.checkValidRange(start, end, stringLength);
      if (end == null) end = stringLength;
      let length = dart.notNull(end) - dart.notNull(start);
      if (length == 0) return typed_data.Uint8List.new(0);
      let encoder = new convert._Utf8Encoder.withBufferSize(length * 3);
      let endPosition = encoder[_fillBuffer](string, start, end);
      dart.assert(dart.notNull(endPosition) >= dart.notNull(end) - 1);
      if (endPosition != end) {
        let lastCodeUnit = string[dartx.codeUnitAt](dart.notNull(end) - 1);
        dart.assert(convert._isLeadSurrogate(lastCodeUnit));
        let wasCombined = encoder[_writeSurrogate](lastCodeUnit, 0);
        dart.assert(!dart.test(wasCombined));
      }
      return encoder[_buffer][dartx.sublist](0, encoder[_bufferIndex]);
    }
    startChunkedConversion(sink) {
      if (!convert.ByteConversionSink.is(sink)) {
        sink = convert.ByteConversionSink.from(sink);
      }
      return new convert._Utf8EncoderSink(convert.ByteConversionSink._check(sink));
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert.Utf8Encoder);
  dart.setSignature(convert.Utf8Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Encoder, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()]),
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [StreamOfString()])
    })
  });
  convert._Utf8Encoder = class _Utf8Encoder extends core.Object {
    new() {
      _Utf8Encoder.prototype.withBufferSize.call(this, convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE);
    }
    withBufferSize(bufferSize) {
      this[_buffer] = convert._Utf8Encoder._createBuffer(bufferSize);
      this[_carry] = 0;
      this[_bufferIndex] = 0;
    }
    static _createBuffer(size) {
      return typed_data.Uint8List.new(size);
    }
    [_writeSurrogate](leadingSurrogate, nextCodeUnit) {
      if (dart.test(convert._isTailSurrogate(nextCodeUnit))) {
        let rune = convert._combineSurrogatePair(leadingSurrogate, nextCodeUnit);
        dart.assert(dart.notNull(rune) > convert._THREE_BYTE_LIMIT);
        dart.assert(dart.notNull(rune) <= convert._FOUR_BYTE_LIMIT);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), (240 | rune[dartx['>>']](18)) >>> 0);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(rune) >> 12 & 63);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(rune) >> 6 & 63);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(rune) & 63);
        return true;
      } else {
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), (224 | leadingSurrogate[dartx['>>']](12)) >>> 0);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(leadingSurrogate) >> 6 & 63);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(leadingSurrogate) & 63);
        return false;
      }
    }
    [_fillBuffer](str, start, end) {
      if (start != end && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](dart.notNull(end) - 1)))) {
        end = dart.notNull(end) - 1;
      }
      let stringIndex = null;
      for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); stringIndex = dart.notNull(stringIndex) + 1) {
        let codeUnit = str[dartx.codeUnitAt](stringIndex);
        if (dart.notNull(codeUnit) <= convert._ONE_BYTE_LIMIT) {
          if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer][dartx.length])) break;
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), codeUnit);
        } else if (dart.test(convert._isLeadSurrogate(codeUnit))) {
          if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer][dartx.length])) break;
          let nextCodeUnit = str[dartx.codeUnitAt](dart.notNull(stringIndex) + 1);
          let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit);
          if (dart.test(wasCombined)) {
            stringIndex = dart.notNull(stringIndex) + 1;
          }
        } else {
          let rune = codeUnit;
          if (dart.notNull(rune) <= convert._TWO_BYTE_LIMIT) {
            if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffer][dartx.length])) break;
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), (192 | rune[dartx['>>']](6)) >>> 0);
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), 128 | dart.notNull(rune) & 63);
          } else {
            dart.assert(dart.notNull(rune) <= convert._THREE_BYTE_LIMIT);
            if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffer][dartx.length])) break;
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), (224 | rune[dartx['>>']](12)) >>> 0);
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), 128 | dart.notNull(rune) >> 6 & 63);
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), 128 | dart.notNull(rune) & 63);
          }
        }
      }
      return stringIndex;
    }
  };
  dart.defineNamedConstructor(convert._Utf8Encoder, 'withBufferSize');
  dart.setSignature(convert._Utf8Encoder, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert._Utf8Encoder, []),
      withBufferSize: dart.definiteFunctionType(convert._Utf8Encoder, [core.int])
    }),
    fields: () => ({
      [_carry]: core.int,
      [_bufferIndex]: core.int,
      [_buffer]: ListOfint()
    }),
    methods: () => ({
      [_writeSurrogate]: dart.definiteFunctionType(core.bool, [core.int, core.int]),
      [_fillBuffer]: dart.definiteFunctionType(core.int, [core.String, core.int, core.int])
    }),
    sfields: () => ({_DEFAULT_BYTE_BUFFER_SIZE: core.int}),
    statics: () => ({_createBuffer: dart.definiteFunctionType(core.List$(core.int), [core.int])}),
    names: ['_createBuffer']
  });
  convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024;
  convert._Utf8EncoderSink = class _Utf8EncoderSink extends dart.mixin(convert._Utf8Encoder, convert.StringConversionSinkMixin) {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    close() {
      if (this[_carry] != 0) {
        this.addSlice("", 0, 0, true);
        return;
      }
      this[_sink$].close();
    }
    addSlice(str, start, end, isLast) {
      this[_bufferIndex] = 0;
      if (start == end && !dart.test(isLast)) {
        return;
      }
      if (this[_carry] != 0) {
        let nextCodeUnit = 0;
        if (start != end) {
          nextCodeUnit = str[dartx.codeUnitAt](start);
        } else {
          dart.assert(isLast);
        }
        let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit);
        dart.assert(!dart.test(wasCombined) || start != end);
        if (dart.test(wasCombined)) {
          start = dart.notNull(start) + 1;
        }
        this[_carry] = 0;
      }
      do {
        start = this[_fillBuffer](str, start, end);
        let isLastSlice = dart.test(isLast) && start == end;
        if (start == dart.notNull(end) - 1 && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](start)))) {
          if (dart.test(isLast) && dart.notNull(this[_bufferIndex]) < dart.notNull(this[_buffer][dartx.length]) - 3) {
            let hasBeenCombined = this[_writeSurrogate](str[dartx.codeUnitAt](start), 0);
            dart.assert(!dart.test(hasBeenCombined));
          } else {
            this[_carry] = str[dartx.codeUnitAt](start);
          }
          start = dart.notNull(start) + 1;
        }
        this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
        this[_bufferIndex] = 0;
      } while (dart.notNull(start) < dart.notNull(end));
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert._Utf8EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8EncoderSink, [convert.ByteConversionSink])}),
    fields: () => ({[_sink$]: convert.ByteConversionSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  convert.Utf8Decoder = class Utf8Decoder extends convert.Converter$(core.List$(core.int), core.String) {
    new(opts) {
      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
      this[_allowMalformed] = allowMalformed;
      super.new();
    }
    convert(codeUnits, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let result = convert.Utf8Decoder._convertIntercepted(this[_allowMalformed], codeUnits, start, end);
      if (result != null) {
        return result;
      }
      let length = codeUnits[dartx.length];
      core.RangeError.checkValidRange(start, end, length);
      if (end == null) end = length;
      let buffer = new core.StringBuffer();
      let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
      decoder.convert(codeUnits, start, end);
      decoder.close();
      return buffer.toString();
    }
    startChunkedConversion(sink) {
      let stringSink = null;
      if (convert.StringConversionSink.is(sink)) {
        stringSink = sink;
      } else {
        stringSink = convert.StringConversionSink.from(sink);
      }
      return stringSink.asUtf8Sink(this[_allowMalformed]);
    }
    bind(stream) {
      return super.bind(stream);
    }
    fuse(T) {
      return next => {
        return super.fuse(T)(next);
      };
    }
    static _convertIntercepted(allowMalformed, codeUnits, start, end) {
      return null;
    }
  };
  dart.addSimpleTypeTests(convert.Utf8Decoder);
  dart.setSignature(convert.Utf8Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Decoder, [], {allowMalformed: core.bool})}),
    fields: () => ({[_allowMalformed]: core.bool}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfListOfint()]),
      fuse: dart.definiteFunctionType(T => [convert.Converter$(core.List$(core.int), T), [convert.Converter$(core.String, T)]])
    }),
    statics: () => ({_convertIntercepted: dart.definiteFunctionType(core.String, [core.bool, ListOfint(), core.int, core.int])}),
    names: ['_convertIntercepted']
  });
  convert._ONE_BYTE_LIMIT = 127;
  convert._TWO_BYTE_LIMIT = 2047;
  convert._THREE_BYTE_LIMIT = 65535;
  convert._FOUR_BYTE_LIMIT = 1114111;
  convert._SURROGATE_MASK = 63488;
  convert._SURROGATE_TAG_MASK = 64512;
  convert._SURROGATE_VALUE_MASK = 1023;
  convert._LEAD_SURROGATE_MIN = 55296;
  convert._TAIL_SURROGATE_MIN = 56320;
  convert._isLeadSurrogate = function(codeUnit) {
    return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._LEAD_SURROGATE_MIN;
  };
  dart.lazyFn(convert._isLeadSurrogate, () => intTobool());
  convert._isTailSurrogate = function(codeUnit) {
    return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._TAIL_SURROGATE_MIN;
  };
  dart.lazyFn(convert._isTailSurrogate, () => intTobool());
  convert._combineSurrogatePair = function(lead, tail) {
    return (65536 + ((dart.notNull(lead) & convert._SURROGATE_VALUE_MASK) << 10) | dart.notNull(tail) & convert._SURROGATE_VALUE_MASK) >>> 0;
  };
  dart.fn(convert._combineSurrogatePair, intAndintToint());
  const _isFirstCharacter = Symbol('_isFirstCharacter');
  const _value = Symbol('_value');
  const _expectedUnits = Symbol('_expectedUnits');
  const _extraUnits = Symbol('_extraUnits');
  convert._Utf8Decoder = class _Utf8Decoder extends core.Object {
    new(stringSink, allowMalformed) {
      this[_stringSink] = stringSink;
      this[_allowMalformed] = allowMalformed;
      this[_isFirstCharacter] = true;
      this[_value] = 0;
      this[_expectedUnits] = 0;
      this[_extraUnits] = 0;
    }
    get hasPartialInput() {
      return dart.notNull(this[_expectedUnits]) > 0;
    }
    close() {
      this.flush();
    }
    flush() {
      if (dart.test(this.hasPartialInput)) {
        if (!dart.test(this[_allowMalformed])) {
          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
        }
        this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
        this[_value] = 0;
        this[_expectedUnits] = 0;
        this[_extraUnits] = 0;
      }
    }
    convert(codeUnits, startIndex, endIndex) {
      let value = this[_value];
      let expectedUnits = this[_expectedUnits];
      let extraUnits = this[_extraUnits];
      this[_value] = 0;
      this[_expectedUnits] = 0;
      this[_extraUnits] = 0;
      function scanOneByteCharacters(units, from) {
        let to = endIndex;
        let mask = convert._ONE_BYTE_LIMIT;
        for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) {
          let unit = dart.dindex(units, i);
          if (!dart.equals(dart.dsend(unit, '&', mask), unit)) return dart.notNull(i) - dart.notNull(from);
        }
        return dart.notNull(to) - dart.notNull(from);
      }
      dart.fn(scanOneByteCharacters, dynamicAndintToint());
      const addSingleBytes = (function(from, to) {
        dart.assert(dart.notNull(from) >= dart.notNull(startIndex) && dart.notNull(from) <= dart.notNull(endIndex));
        dart.assert(dart.notNull(to) >= dart.notNull(startIndex) && dart.notNull(to) <= dart.notNull(endIndex));
        this[_stringSink].write(core.String.fromCharCodes(codeUnits, from, to));
      }).bind(this);
      dart.fn(addSingleBytes, intAndintTovoid());
      let i = startIndex;
      loop:
        while (true) {
          multibyte:
            if (dart.notNull(expectedUnits) > 0) {
              do {
                if (i == endIndex) {
                  break loop;
                }
                let unit = codeUnits[dartx._get](i);
                if ((dart.notNull(unit) & 192) != 128) {
                  expectedUnits = 0;
                  if (!dart.test(this[_allowMalformed])) {
                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
                  }
                  this[_isFirstCharacter] = false;
                  this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
                  break multibyte;
                } else {
                  value = (dart.notNull(value) << 6 | dart.notNull(unit) & 63) >>> 0;
                  expectedUnits = dart.notNull(expectedUnits) - 1;
                  i = dart.notNull(i) + 1;
                }
              } while (dart.notNull(expectedUnits) > 0);
              if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
                if (!dart.test(this[_allowMalformed])) {
                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
                }
                expectedUnits = extraUnits = 0;
                value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
              }
              if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
                if (!dart.test(this[_allowMalformed])) {
                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
                }
                value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
              }
              if (!dart.test(this[_isFirstCharacter]) || value != convert.UNICODE_BOM_CHARACTER_RUNE) {
                this[_stringSink].writeCharCode(value);
              }
              this[_isFirstCharacter] = false;
            }
          while (dart.notNull(i) < dart.notNull(endIndex)) {
            let oneBytes = scanOneByteCharacters(codeUnits, i);
            if (dart.notNull(oneBytes) > 0) {
              this[_isFirstCharacter] = false;
              addSingleBytes(i, dart.notNull(i) + dart.notNull(oneBytes));
              i = dart.notNull(i) + dart.notNull(oneBytes);
              if (i == endIndex) break;
            }
            let unit = codeUnits[dartx._get]((() => {
              let x = i;
              i = dart.notNull(x) + 1;
              return x;
            })());
            if (dart.notNull(unit) < 0) {
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
              }
              this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
            } else {
              dart.assert(dart.notNull(unit) > convert._ONE_BYTE_LIMIT);
              if ((dart.notNull(unit) & 224) == 192) {
                value = dart.notNull(unit) & 31;
                expectedUnits = extraUnits = 1;
                continue loop;
              }
              if ((dart.notNull(unit) & 240) == 224) {
                value = dart.notNull(unit) & 15;
                expectedUnits = extraUnits = 2;
                continue loop;
              }
              if ((dart.notNull(unit) & 248) == 240 && dart.notNull(unit) < 245) {
                value = dart.notNull(unit) & 7;
                expectedUnits = extraUnits = 3;
                continue loop;
              }
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
              }
              value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
              expectedUnits = extraUnits = 0;
              this[_isFirstCharacter] = false;
              this[_stringSink].writeCharCode(value);
            }
          }
          break loop;
        }
      if (dart.notNull(expectedUnits) > 0) {
        this[_value] = value;
        this[_expectedUnits] = expectedUnits;
        this[_extraUnits] = extraUnits;
      }
    }
  };
  dart.setSignature(convert._Utf8Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Decoder, [core.StringSink, core.bool])}),
    fields: () => ({
      [_allowMalformed]: core.bool,
      [_stringSink]: core.StringSink,
      [_isFirstCharacter]: core.bool,
      [_value]: core.int,
      [_expectedUnits]: core.int,
      [_extraUnits]: core.int
    }),
    getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      flush: dart.definiteFunctionType(dart.void, []),
      convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
    }),
    sfields: () => ({_LIMITS: ListOfint()})
  });
  convert._Utf8Decoder._LIMITS = dart.constList([convert._ONE_BYTE_LIMIT, convert._TWO_BYTE_LIMIT, convert._THREE_BYTE_LIMIT, convert._FOUR_BYTE_LIMIT], core.int);
  core._symbolToString = function(symbol) {
    return _internal.Symbol.getName(_internal.Symbol._check(symbol));
  };
  dart.lazyFn(core._symbolToString, () => SymbolToString());
  core.StrongModeError = class StrongModeError extends core.Error {
    new() {
      super.new();
    }
  };
  core.Deprecated = class Deprecated extends core.Object {
    new(expires) {
      this.expires = expires;
    }
    toString() {
      return dart.str`Deprecated feature. Will be removed ${this.expires}`;
    }
  };
  dart.setSignature(core.Deprecated, {
    constructors: () => ({new: dart.definiteFunctionType(core.Deprecated, [core.String])}),
    fields: () => ({expires: core.String})
  });
  core._Override = class _Override extends core.Object {
    new() {
    }
  };
  dart.setSignature(core._Override, {
    constructors: () => ({new: dart.definiteFunctionType(core._Override, [])})
  });
  core.deprecated = dart.const(new core.Deprecated("next release"));
  core.override = dart.const(new core._Override());
  core._Proxy = class _Proxy extends core.Object {
    new() {
    }
  };
  dart.setSignature(core._Proxy, {
    constructors: () => ({new: dart.definiteFunctionType(core._Proxy, [])})
  });
  core.proxy = dart.const(new core._Proxy());
  dart.defineExtensionNames([
    'toString'
  ]);
  core.bool = class bool extends core.Object {
    static fromEnvironment(name, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
      dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
    }
    [dartx.toString]() {
      return this ? "true" : "false";
    }
  };
  core.bool.is = function is_bool(o) {
    return o === true || o === false;
  };
  core.bool.as = function as_bool(o) {
    if (o === true || o === false || o == null) return o;
    return dart.as(o, core.bool);
  };
  core.bool._check = function check_bool(o) {
    if (o === true || o === false || o == null) return o;
    return dart.check(o, core.bool);
  };
  dart.setSignature(core.bool, {
    constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.bool, [core.String], {defaultValue: core.bool})})
  });
  core.Comparator$ = dart.generic(T => {
    const Comparator = dart.typedef('Comparator', () => dart.functionType(core.int, [T, T]));
    return Comparator;
  });
  core.Comparator = Comparator();
  core.Comparable$ = dart.generic(T => {
    class Comparable extends core.Object {
      static compare(a, b) {
        return a[dartx.compareTo](b);
      }
    }
    dart.addTypeTests(Comparable);
    dart.setSignature(Comparable, {
      statics: () => ({compare: dart.definiteFunctionType(core.int, [core.Comparable, core.Comparable])}),
      names: ['compare']
    });
    return Comparable;
  });
  core.Comparable = Comparable();
  const _value$ = Symbol('_value');
  core.DateTime = class DateTime extends core.Object {
    new(year, month, day, hour, minute, second, millisecond, microsecond) {
      if (month === void 0) month = 1;
      if (day === void 0) day = 1;
      if (hour === void 0) hour = 0;
      if (minute === void 0) minute = 0;
      if (second === void 0) second = 0;
      if (millisecond === void 0) millisecond = 0;
      if (microsecond === void 0) microsecond = 0;
      DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, false);
    }
    utc(year, month, day, hour, minute, second, millisecond, microsecond) {
      if (month === void 0) month = 1;
      if (day === void 0) day = 1;
      if (hour === void 0) hour = 0;
      if (minute === void 0) minute = 0;
      if (second === void 0) second = 0;
      if (millisecond === void 0) millisecond = 0;
      if (microsecond === void 0) microsecond = 0;
      DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, true);
    }
    now() {
      DateTime.prototype._now.call(this);
    }
    static parse(formattedString) {
      let re = core.RegExp.new('^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)' + '(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{1,6}))?)?)?' + '( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$');
      let match = re.firstMatch(formattedString);
      if (match != null) {
        function parseIntOrZero(matched) {
          if (matched == null) return 0;
          return core.int.parse(matched);
        }
        dart.fn(parseIntOrZero, StringToint$());
        function parseMilliAndMicroseconds(matched) {
          if (matched == null) return 0;
          let length = matched[dartx.length];
          dart.assert(dart.notNull(length) >= 1);
          dart.assert(dart.notNull(length) <= 6);
          let result = 0;
          for (let i = 0; i < 6; i++) {
            result = result * 10;
            if (i < dart.notNull(matched[dartx.length])) {
              result = result + ((dart.notNull(matched[dartx.codeUnitAt](i)) ^ 48) >>> 0);
            }
          }
          return result;
        }
        dart.fn(parseMilliAndMicroseconds, StringToint$());
        let years = core.int.parse(match._get(1));
        let month = core.int.parse(match._get(2));
        let day = core.int.parse(match._get(3));
        let hour = parseIntOrZero(match._get(4));
        let minute = parseIntOrZero(match._get(5));
        let second = parseIntOrZero(match._get(6));
        let addOneMillisecond = false;
        let milliAndMicroseconds = parseMilliAndMicroseconds(match._get(7));
        let millisecond = (dart.notNull(milliAndMicroseconds) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
        let microsecond = dart.asInt(milliAndMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_MILLISECOND));
        let isUtc = false;
        if (match._get(8) != null) {
          isUtc = true;
          if (match._get(9) != null) {
            let sign = match._get(9) == '-' ? -1 : 1;
            let hourDifference = core.int.parse(match._get(10));
            let minuteDifference = parseIntOrZero(match._get(11));
            minuteDifference = dart.notNull(minuteDifference) + 60 * dart.notNull(hourDifference);
            minute = dart.notNull(minute) - sign * dart.notNull(minuteDifference);
          }
        }
        let value = core.DateTime._brokenDownDateToValue(years, month, day, hour, minute, second, millisecond, microsecond, isUtc);
        if (value == null) {
          dart.throw(new core.FormatException("Time out of range", formattedString));
        }
        return new core.DateTime._withValue(value, {isUtc: isUtc});
      } else {
        dart.throw(new core.FormatException("Invalid date format", formattedString));
      }
    }
    fromMillisecondsSinceEpoch(millisecondsSinceEpoch, opts) {
      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
      DateTime.prototype._withValue.call(this, millisecondsSinceEpoch, {isUtc: isUtc});
    }
    fromMicrosecondsSinceEpoch(microsecondsSinceEpoch, opts) {
      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
      DateTime.prototype._withValue.call(this, core.DateTime._microsecondInRoundedMilliseconds(microsecondsSinceEpoch), {isUtc: isUtc});
    }
    _withValue(value, opts) {
      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
      this[_value$] = value;
      this.isUtc = isUtc;
      if (dart.notNull(this.millisecondsSinceEpoch[dartx.abs]()) > core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH || this.millisecondsSinceEpoch[dartx.abs]() == core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH && this.microsecond != 0) {
        dart.throw(new core.ArgumentError(this.millisecondsSinceEpoch));
      }
      if (this.isUtc == null) dart.throw(new core.ArgumentError(this.isUtc));
    }
    ['=='](other) {
      if (!core.DateTime.is(other)) return false;
      return dart.equals(this[_value$], dart.dload(other, _value$)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
    }
    isBefore(other) {
      return dart.notNull(this[_value$]) < dart.notNull(other[_value$]);
    }
    isAfter(other) {
      return dart.notNull(this[_value$]) > dart.notNull(other[_value$]);
    }
    isAtSameMomentAs(other) {
      return this[_value$] == other[_value$];
    }
    compareTo(other) {
      return this[_value$][dartx.compareTo](other[_value$]);
    }
    get hashCode() {
      return (dart.notNull(this[_value$]) ^ this[_value$][dartx['>>']](30)) & 1073741823;
    }
    toLocal() {
      if (dart.test(this.isUtc)) {
        return new core.DateTime._withValue(this[_value$], {isUtc: false});
      }
      return this;
    }
    toUtc() {
      if (dart.test(this.isUtc)) return this;
      return new core.DateTime._withValue(this[_value$], {isUtc: true});
    }
    static _fourDigits(n) {
      let absN = n[dartx.abs]();
      let sign = dart.notNull(n) < 0 ? "-" : "";
      if (dart.notNull(absN) >= 1000) return dart.str`${n}`;
      if (dart.notNull(absN) >= 100) return dart.str`${sign}0${absN}`;
      if (dart.notNull(absN) >= 10) return dart.str`${sign}00${absN}`;
      return dart.str`${sign}000${absN}`;
    }
    static _sixDigits(n) {
      dart.assert(dart.notNull(n) < -9999 || dart.notNull(n) > 9999);
      let absN = n[dartx.abs]();
      let sign = dart.notNull(n) < 0 ? "-" : "+";
      if (dart.notNull(absN) >= 100000) return dart.str`${sign}${absN}`;
      return dart.str`${sign}0${absN}`;
    }
    static _threeDigits(n) {
      if (dart.notNull(n) >= 100) return dart.str`${n}`;
      if (dart.notNull(n) >= 10) return dart.str`0${n}`;
      return dart.str`00${n}`;
    }
    static _twoDigits(n) {
      if (dart.notNull(n) >= 10) return dart.str`${n}`;
      return dart.str`0${n}`;
    }
    toString() {
      let y = core.DateTime._fourDigits(this.year);
      let m = core.DateTime._twoDigits(this.month);
      let d = core.DateTime._twoDigits(this.day);
      let h = core.DateTime._twoDigits(this.hour);
      let min = core.DateTime._twoDigits(this.minute);
      let sec = core.DateTime._twoDigits(this.second);
      let ms = core.DateTime._threeDigits(this.millisecond);
      let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
      if (dart.test(this.isUtc)) {
        return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}Z`;
      } else {
        return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}`;
      }
    }
    toIso8601String() {
      let y = dart.notNull(this.year) >= -9999 && dart.notNull(this.year) <= 9999 ? core.DateTime._fourDigits(this.year) : core.DateTime._sixDigits(this.year);
      let m = core.DateTime._twoDigits(this.month);
      let d = core.DateTime._twoDigits(this.day);
      let h = core.DateTime._twoDigits(this.hour);
      let min = core.DateTime._twoDigits(this.minute);
      let sec = core.DateTime._twoDigits(this.second);
      let ms = core.DateTime._threeDigits(this.millisecond);
      let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
      if (dart.test(this.isUtc)) {
        return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}Z`;
      } else {
        return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}`;
      }
    }
    add(duration) {
      return new core.DateTime._withValue(dart.notNull(this[_value$]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
    }
    subtract(duration) {
      return new core.DateTime._withValue(dart.notNull(this[_value$]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
    }
    difference(other) {
      return new core.Duration({milliseconds: dart.notNull(this[_value$]) - dart.notNull(other[_value$])});
    }
    _internal(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
      this.isUtc = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, 'isUtc'));
      this[_value$] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
    }
    _now() {
      this.isUtc = false;
      this[_value$] = _js_helper.Primitives.dateNow();
    }
    static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
      return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
    }
    get millisecondsSinceEpoch() {
      return this[_value$];
    }
    get microsecondsSinceEpoch() {
      return dart.notNull(this[_value$]) * 1000;
    }
    get timeZoneName() {
      if (dart.test(this.isUtc)) return "UTC";
      return _js_helper.Primitives.getTimeZoneName(this);
    }
    get timeZoneOffset() {
      if (dart.test(this.isUtc)) return new core.Duration();
      return new core.Duration({minutes: _js_helper.Primitives.getTimeZoneOffsetInMinutes(this)});
    }
    get year() {
      return core.int._check(_js_helper.Primitives.getYear(this));
    }
    get month() {
      return core.int._check(_js_helper.Primitives.getMonth(this));
    }
    get day() {
      return core.int._check(_js_helper.Primitives.getDay(this));
    }
    get hour() {
      return core.int._check(_js_helper.Primitives.getHours(this));
    }
    get minute() {
      return core.int._check(_js_helper.Primitives.getMinutes(this));
    }
    get second() {
      return core.int._check(_js_helper.Primitives.getSeconds(this));
    }
    get millisecond() {
      return core.int._check(_js_helper.Primitives.getMilliseconds(this));
    }
    get microsecond() {
      return 0;
    }
    get weekday() {
      return core.int._check(_js_helper.Primitives.getWeekday(this));
    }
    static _microsecondInRoundedMilliseconds(microsecond) {
      return (dart.notNull(microsecond) / 1000)[dartx.round]();
    }
  };
  dart.defineNamedConstructor(core.DateTime, 'utc');
  dart.defineNamedConstructor(core.DateTime, 'now');
  dart.defineNamedConstructor(core.DateTime, 'fromMillisecondsSinceEpoch');
  dart.defineNamedConstructor(core.DateTime, 'fromMicrosecondsSinceEpoch');
  dart.defineNamedConstructor(core.DateTime, '_withValue');
  dart.defineNamedConstructor(core.DateTime, '_internal');
  dart.defineNamedConstructor(core.DateTime, '_now');
  core.DateTime[dart.implements] = () => [ComparableOfDateTime()];
  dart.setSignature(core.DateTime, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      utc: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      now: dart.definiteFunctionType(core.DateTime, []),
      fromMillisecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
      fromMicrosecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
      _withValue: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
      _internal: dart.definiteFunctionType(core.DateTime, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
      _now: dart.definiteFunctionType(core.DateTime, [])
    }),
    fields: () => ({
      [_value$]: core.int,
      isUtc: core.bool
    }),
    getters: () => ({
      millisecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
      microsecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
      timeZoneName: dart.definiteFunctionType(core.String, []),
      timeZoneOffset: dart.definiteFunctionType(core.Duration, []),
      year: dart.definiteFunctionType(core.int, []),
      month: dart.definiteFunctionType(core.int, []),
      day: dart.definiteFunctionType(core.int, []),
      hour: dart.definiteFunctionType(core.int, []),
      minute: dart.definiteFunctionType(core.int, []),
      second: dart.definiteFunctionType(core.int, []),
      millisecond: dart.definiteFunctionType(core.int, []),
      microsecond: dart.definiteFunctionType(core.int, []),
      weekday: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      isBefore: dart.definiteFunctionType(core.bool, [core.DateTime]),
      isAfter: dart.definiteFunctionType(core.bool, [core.DateTime]),
      isAtSameMomentAs: dart.definiteFunctionType(core.bool, [core.DateTime]),
      compareTo: dart.definiteFunctionType(core.int, [core.DateTime]),
      toLocal: dart.definiteFunctionType(core.DateTime, []),
      toUtc: dart.definiteFunctionType(core.DateTime, []),
      toIso8601String: dart.definiteFunctionType(core.String, []),
      add: dart.definiteFunctionType(core.DateTime, [core.Duration]),
      subtract: dart.definiteFunctionType(core.DateTime, [core.Duration]),
      difference: dart.definiteFunctionType(core.Duration, [core.DateTime])
    }),
    sfields: () => ({
      MONDAY: core.int,
      TUESDAY: core.int,
      WEDNESDAY: core.int,
      THURSDAY: core.int,
      FRIDAY: core.int,
      SATURDAY: core.int,
      SUNDAY: core.int,
      DAYS_PER_WEEK: core.int,
      JANUARY: core.int,
      FEBRUARY: core.int,
      MARCH: core.int,
      APRIL: core.int,
      MAY: core.int,
      JUNE: core.int,
      JULY: core.int,
      AUGUST: core.int,
      SEPTEMBER: core.int,
      OCTOBER: core.int,
      NOVEMBER: core.int,
      DECEMBER: core.int,
      MONTHS_PER_YEAR: core.int,
      _MAX_MILLISECONDS_SINCE_EPOCH: core.int
    }),
    statics: () => ({
      parse: dart.definiteFunctionType(core.DateTime, [core.String]),
      _fourDigits: dart.definiteFunctionType(core.String, [core.int]),
      _sixDigits: dart.definiteFunctionType(core.String, [core.int]),
      _threeDigits: dart.definiteFunctionType(core.String, [core.int]),
      _twoDigits: dart.definiteFunctionType(core.String, [core.int]),
      _brokenDownDateToValue: dart.definiteFunctionType(core.int, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
      _microsecondInRoundedMilliseconds: dart.definiteFunctionType(core.int, [core.int])
    }),
    names: ['parse', '_fourDigits', '_sixDigits', '_threeDigits', '_twoDigits', '_brokenDownDateToValue', '_microsecondInRoundedMilliseconds']
  });
  dart.defineExtensionMembers(core.DateTime, ['compareTo']);
  core.DateTime.MONDAY = 1;
  core.DateTime.TUESDAY = 2;
  core.DateTime.WEDNESDAY = 3;
  core.DateTime.THURSDAY = 4;
  core.DateTime.FRIDAY = 5;
  core.DateTime.SATURDAY = 6;
  core.DateTime.SUNDAY = 7;
  core.DateTime.DAYS_PER_WEEK = 7;
  core.DateTime.JANUARY = 1;
  core.DateTime.FEBRUARY = 2;
  core.DateTime.MARCH = 3;
  core.DateTime.APRIL = 4;
  core.DateTime.MAY = 5;
  core.DateTime.JUNE = 6;
  core.DateTime.JULY = 7;
  core.DateTime.AUGUST = 8;
  core.DateTime.SEPTEMBER = 9;
  core.DateTime.OCTOBER = 10;
  core.DateTime.NOVEMBER = 11;
  core.DateTime.DECEMBER = 12;
  core.DateTime.MONTHS_PER_YEAR = 12;
  core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
  const _duration = Symbol('_duration');
  core.Duration = class Duration extends core.Object {
    new(opts) {
      let days = opts && 'days' in opts ? opts.days : 0;
      let hours = opts && 'hours' in opts ? opts.hours : 0;
      let minutes = opts && 'minutes' in opts ? opts.minutes : 0;
      let seconds = opts && 'seconds' in opts ? opts.seconds : 0;
      let milliseconds = opts && 'milliseconds' in opts ? opts.milliseconds : 0;
      let microseconds = opts && 'microseconds' in opts ? opts.microseconds : 0;
      Duration.prototype._microseconds.call(this, core.Duration.MICROSECONDS_PER_DAY * dart.notNull(days) + core.Duration.MICROSECONDS_PER_HOUR * dart.notNull(hours) + core.Duration.MICROSECONDS_PER_MINUTE * dart.notNull(minutes) + core.Duration.MICROSECONDS_PER_SECOND * dart.notNull(seconds) + core.Duration.MICROSECONDS_PER_MILLISECOND * dart.notNull(milliseconds) + dart.notNull(microseconds));
    }
    _microseconds(duration) {
      this[_duration] = duration;
    }
    ['+'](other) {
      return new core.Duration._microseconds(dart.notNull(this[_duration]) + dart.notNull(other[_duration]));
    }
    ['-'](other) {
      return new core.Duration._microseconds(dart.notNull(this[_duration]) - dart.notNull(other[_duration]));
    }
    ['*'](factor) {
      return new core.Duration._microseconds((dart.notNull(this[_duration]) * dart.notNull(factor))[dartx.round]());
    }
    ['~/'](quotient) {
      if (quotient == 0) dart.throw(new core.IntegerDivisionByZeroException());
      return new core.Duration._microseconds((dart.notNull(this[_duration]) / dart.notNull(quotient))[dartx.truncate]());
    }
    ['<'](other) {
      return dart.notNull(this[_duration]) < dart.notNull(other[_duration]);
    }
    ['>'](other) {
      return dart.notNull(this[_duration]) > dart.notNull(other[_duration]);
    }
    ['<='](other) {
      return dart.notNull(this[_duration]) <= dart.notNull(other[_duration]);
    }
    ['>='](other) {
      return dart.notNull(this[_duration]) >= dart.notNull(other[_duration]);
    }
    get inDays() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_DAY)[dartx.truncate]();
    }
    get inHours() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_HOUR)[dartx.truncate]();
    }
    get inMinutes() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MINUTE)[dartx.truncate]();
    }
    get inSeconds() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_SECOND)[dartx.truncate]();
    }
    get inMilliseconds() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
    }
    get inMicroseconds() {
      return this[_duration];
    }
    ['=='](other) {
      if (!core.Duration.is(other)) return false;
      return dart.equals(this[_duration], dart.dload(other, _duration));
    }
    get hashCode() {
      return dart.hashCode(this[_duration]);
    }
    compareTo(other) {
      return this[_duration][dartx.compareTo](other[_duration]);
    }
    toString() {
      function sixDigits(n) {
        if (dart.notNull(n) >= 100000) return dart.str`${n}`;
        if (dart.notNull(n) >= 10000) return dart.str`0${n}`;
        if (dart.notNull(n) >= 1000) return dart.str`00${n}`;
        if (dart.notNull(n) >= 100) return dart.str`000${n}`;
        if (dart.notNull(n) >= 10) return dart.str`0000${n}`;
        return dart.str`00000${n}`;
      }
      dart.fn(sixDigits, intToString());
      function twoDigits(n) {
        if (dart.notNull(n) >= 10) return dart.str`${n}`;
        return dart.str`0${n}`;
      }
      dart.fn(twoDigits, intToString());
      if (dart.notNull(this.inMicroseconds) < 0) {
        return dart.str`-${this._negate()}`;
      }
      let twoDigitMinutes = twoDigits(dart.asInt(this.inMinutes[dartx.remainder](core.Duration.MINUTES_PER_HOUR)));
      let twoDigitSeconds = twoDigits(dart.asInt(this.inSeconds[dartx.remainder](core.Duration.SECONDS_PER_MINUTE)));
      let sixDigitUs = sixDigits(dart.asInt(this.inMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_SECOND)));
      return dart.str`${this.inHours}:${twoDigitMinutes}:${twoDigitSeconds}.${sixDigitUs}`;
    }
    get isNegative() {
      return dart.notNull(this[_duration]) < 0;
    }
    abs() {
      return new core.Duration._microseconds(this[_duration][dartx.abs]());
    }
    _negate() {
      return new core.Duration._microseconds(-dart.notNull(this[_duration]));
    }
  };
  dart.defineNamedConstructor(core.Duration, '_microseconds');
  core.Duration[dart.implements] = () => [ComparableOfDuration()];
  dart.setSignature(core.Duration, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.Duration, [], {days: core.int, hours: core.int, minutes: core.int, seconds: core.int, milliseconds: core.int, microseconds: core.int}),
      _microseconds: dart.definiteFunctionType(core.Duration, [core.int])
    }),
    fields: () => ({[_duration]: core.int}),
    getters: () => ({
      inDays: dart.definiteFunctionType(core.int, []),
      inHours: dart.definiteFunctionType(core.int, []),
      inMinutes: dart.definiteFunctionType(core.int, []),
      inSeconds: dart.definiteFunctionType(core.int, []),
      inMilliseconds: dart.definiteFunctionType(core.int, []),
      inMicroseconds: dart.definiteFunctionType(core.int, []),
      isNegative: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      '+': dart.definiteFunctionType(core.Duration, [core.Duration]),
      '-': dart.definiteFunctionType(core.Duration, [core.Duration]),
      '*': dart.definiteFunctionType(core.Duration, [core.num]),
      '~/': dart.definiteFunctionType(core.Duration, [core.int]),
      '<': dart.definiteFunctionType(core.bool, [core.Duration]),
      '>': dart.definiteFunctionType(core.bool, [core.Duration]),
      '<=': dart.definiteFunctionType(core.bool, [core.Duration]),
      '>=': dart.definiteFunctionType(core.bool, [core.Duration]),
      compareTo: dart.definiteFunctionType(core.int, [core.Duration]),
      abs: dart.definiteFunctionType(core.Duration, []),
      _negate: dart.definiteFunctionType(core.Duration, [])
    }),
    sfields: () => ({
      MICROSECONDS_PER_MILLISECOND: core.int,
      MILLISECONDS_PER_SECOND: core.int,
      SECONDS_PER_MINUTE: core.int,
      MINUTES_PER_HOUR: core.int,
      HOURS_PER_DAY: core.int,
      MICROSECONDS_PER_SECOND: core.int,
      MICROSECONDS_PER_MINUTE: core.int,
      MICROSECONDS_PER_HOUR: core.int,
      MICROSECONDS_PER_DAY: core.int,
      MILLISECONDS_PER_MINUTE: core.int,
      MILLISECONDS_PER_HOUR: core.int,
      MILLISECONDS_PER_DAY: core.int,
      SECONDS_PER_HOUR: core.int,
      SECONDS_PER_DAY: core.int,
      MINUTES_PER_DAY: core.int,
      ZERO: core.Duration
    })
  });
  dart.defineExtensionMembers(core.Duration, ['compareTo']);
  core.Duration.MICROSECONDS_PER_MILLISECOND = 1000;
  core.Duration.MILLISECONDS_PER_SECOND = 1000;
  core.Duration.SECONDS_PER_MINUTE = 60;
  core.Duration.MINUTES_PER_HOUR = 60;
  core.Duration.HOURS_PER_DAY = 24;
  dart.defineLazy(core.Duration, {
    get MICROSECONDS_PER_SECOND() {
      return core.Duration.MICROSECONDS_PER_MILLISECOND * core.Duration.MILLISECONDS_PER_SECOND;
    },
    get MICROSECONDS_PER_MINUTE() {
      return core.Duration.MICROSECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
    },
    get MICROSECONDS_PER_HOUR() {
      return core.Duration.MICROSECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
    },
    get MICROSECONDS_PER_DAY() {
      return core.Duration.MICROSECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get MILLISECONDS_PER_MINUTE() {
      return core.Duration.MILLISECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
    },
    get MILLISECONDS_PER_HOUR() {
      return core.Duration.MILLISECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
    },
    get MILLISECONDS_PER_DAY() {
      return core.Duration.MILLISECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get SECONDS_PER_HOUR() {
      return core.Duration.SECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
    },
    get SECONDS_PER_DAY() {
      return core.Duration.SECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get MINUTES_PER_DAY() {
      return core.Duration.MINUTES_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get ZERO() {
      return dart.const(new core.Duration({seconds: 0}));
    }
  });
  core.TypeError = class TypeError extends core.AssertionError {
    new() {
      super.new();
    }
  };
  core.CastError = class CastError extends core.Error {
    new() {
      super.new();
    }
  };
  core.NullThrownError = class NullThrownError extends core.Error {
    new() {
      super.new();
    }
    toString() {
      return "Throw of null.";
    }
  };
  const _hasValue = Symbol('_hasValue');
  const _errorName = Symbol('_errorName');
  const _errorExplanation = Symbol('_errorExplanation');
  core.ArgumentError = class ArgumentError extends core.Error {
    new(message) {
      if (message === void 0) message = null;
      this.message = message;
      this.invalidValue = null;
      this[_hasValue] = false;
      this.name = null;
      super.new();
    }
    value(value, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      this.name = name;
      this.message = message;
      this.invalidValue = value;
      this[_hasValue] = true;
      super.new();
    }
    notNull(name) {
      if (name === void 0) name = null;
      this.name = name;
      this[_hasValue] = false;
      this.message = "Must not be null";
      this.invalidValue = null;
      super.new();
    }
    get [_errorName]() {
      return dart.str`Invalid argument${!dart.test(this[_hasValue]) ? "(s)" : ""}`;
    }
    get [_errorExplanation]() {
      return "";
    }
    toString() {
      let nameString = "";
      if (this.name != null) {
        nameString = dart.str` (${this.name})`;
      }
      let message = this.message == null ? "" : dart.str`: ${this.message}`;
      let prefix = dart.str`${this[_errorName]}${nameString}${message}`;
      if (!dart.test(this[_hasValue])) return prefix;
      let explanation = this[_errorExplanation];
      let errorValue = core.Error.safeToString(this.invalidValue);
      return dart.str`${prefix}${explanation}: ${errorValue}`;
    }
  };
  dart.defineNamedConstructor(core.ArgumentError, 'value');
  dart.defineNamedConstructor(core.ArgumentError, 'notNull');
  dart.setSignature(core.ArgumentError, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.ArgumentError, [], [dart.dynamic]),
      value: dart.definiteFunctionType(core.ArgumentError, [dart.dynamic], [core.String, core.String]),
      notNull: dart.definiteFunctionType(core.ArgumentError, [], [core.String])
    }),
    fields: () => ({
      [_hasValue]: core.bool,
      invalidValue: dart.dynamic,
      name: core.String,
      message: dart.dynamic
    }),
    getters: () => ({
      [_errorName]: dart.definiteFunctionType(core.String, []),
      [_errorExplanation]: dart.definiteFunctionType(core.String, [])
    })
  });
  core.RangeError = class RangeError extends core.ArgumentError {
    new(message) {
      this.start = null;
      this.end = null;
      super.new(message);
    }
    value(value, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      this.start = null;
      this.end = null;
      super.value(value, name, message != null ? message : "Value not in range");
    }
    range(invalidValue, minValue, maxValue, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      this.start = minValue;
      this.end = maxValue;
      super.value(invalidValue, name, message != null ? message : "Invalid value");
    }
    static index(index, indexable, name, message, length) {
      return new core.IndexError(index, indexable, name, message, length);
    }
    static checkValueInInterval(value, minValue, maxValue, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      if (dart.notNull(value) < dart.notNull(minValue) || dart.notNull(value) > dart.notNull(maxValue)) {
        dart.throw(new core.RangeError.range(value, minValue, maxValue, name, message));
      }
    }
    static checkValidIndex(index, indexable, name, length, message) {
      if (name === void 0) name = null;
      if (length === void 0) length = null;
      if (message === void 0) message = null;
      if (length == null) length = core.int._check(dart.dload(indexable, 'length'));
      if (0 > dart.notNull(index) || dart.notNull(index) >= dart.notNull(length)) {
        if (name == null) name = "index";
        dart.throw(core.RangeError.index(index, indexable, name, message, length));
      }
    }
    static checkValidRange(start, end, length, startName, endName, message) {
      if (startName === void 0) startName = null;
      if (endName === void 0) endName = null;
      if (message === void 0) message = null;
      if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(length)) {
        if (startName == null) startName = "start";
        dart.throw(new core.RangeError.range(start, 0, length, startName, message));
      }
      if (end != null) {
        if (dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length)) {
          if (endName == null) endName = "end";
          dart.throw(new core.RangeError.range(end, start, length, endName, message));
        }
        return end;
      }
      return length;
    }
    static checkNotNegative(value, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      if (dart.notNull(value) < 0) dart.throw(new core.RangeError.range(value, 0, null, name, message));
    }
    get [_errorName]() {
      return "RangeError";
    }
    get [_errorExplanation]() {
      dart.assert(this[_hasValue]);
      let explanation = "";
      if (this.start == null) {
        if (this.end != null) {
          explanation = dart.str`: Not less than or equal to ${this.end}`;
        }
      } else if (this.end == null) {
        explanation = dart.str`: Not greater than or equal to ${this.start}`;
      } else if (dart.notNull(this.end) > dart.notNull(this.start)) {
        explanation = dart.str`: Not in range ${this.start}..${this.end}, inclusive`;
      } else if (dart.notNull(this.end) < dart.notNull(this.start)) {
        explanation = ": Valid value range is empty";
      } else {
        explanation = dart.str`: Only valid value is ${this.start}`;
      }
      return explanation;
    }
  };
  dart.defineNamedConstructor(core.RangeError, 'value');
  dart.defineNamedConstructor(core.RangeError, 'range');
  dart.setSignature(core.RangeError, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.RangeError, [dart.dynamic]),
      value: dart.definiteFunctionType(core.RangeError, [core.num], [core.String, core.String]),
      range: dart.definiteFunctionType(core.RangeError, [core.num, core.int, core.int], [core.String, core.String]),
      index: dart.definiteFunctionType(core.RangeError, [core.int, dart.dynamic], [core.String, core.String, core.int])
    }),
    fields: () => ({
      start: core.num,
      end: core.num
    }),
    statics: () => ({
      checkValueInInterval: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.String, core.String]),
      checkValidIndex: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic], [core.String, core.int, core.String]),
      checkValidRange: dart.definiteFunctionType(core.int, [core.int, core.int, core.int], [core.String, core.String, core.String]),
      checkNotNegative: dart.definiteFunctionType(dart.void, [core.int], [core.String, core.String])
    }),
    names: ['checkValueInInterval', 'checkValidIndex', 'checkValidRange', 'checkNotNegative']
  });
  core.IndexError = class IndexError extends core.ArgumentError {
    new(invalidValue, indexable, name, message, length) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      if (length === void 0) length = null;
      this.indexable = indexable;
      this.length = core.int._check(length != null ? length : dart.dload(indexable, 'length'));
      super.value(invalidValue, name, message != null ? message : "Index out of range");
    }
    get start() {
      return 0;
    }
    get end() {
      return dart.notNull(this.length) - 1;
    }
    get [_errorName]() {
      return "RangeError";
    }
    get [_errorExplanation]() {
      dart.assert(this[_hasValue]);
      if (dart.test(dart.dsend(this.invalidValue, '<', 0))) {
        return ": index must not be negative";
      }
      if (this.length == 0) {
        return ": no indices are valid";
      }
      return dart.str`: index should be less than ${this.length}`;
    }
  };
  core.IndexError[dart.implements] = () => [core.RangeError];
  dart.setSignature(core.IndexError, {
    constructors: () => ({new: dart.definiteFunctionType(core.IndexError, [core.int, dart.dynamic], [core.String, core.String, core.int])}),
    fields: () => ({
      indexable: dart.dynamic,
      length: core.int
    }),
    getters: () => ({
      start: dart.definiteFunctionType(core.int, []),
      end: dart.definiteFunctionType(core.int, [])
    })
  });
  const _className = Symbol('_className');
  core.AbstractClassInstantiationError = class AbstractClassInstantiationError extends core.Error {
    new(className) {
      this[_className] = className;
      super.new();
    }
    toString() {
      return dart.str`Cannot instantiate abstract class: '${this[_className]}'`;
    }
  };
  dart.setSignature(core.AbstractClassInstantiationError, {
    constructors: () => ({new: dart.definiteFunctionType(core.AbstractClassInstantiationError, [core.String])}),
    fields: () => ({[_className]: core.String})
  });
  const _receiver$ = Symbol('_receiver');
  const _memberName = Symbol('_memberName');
  const _arguments = Symbol('_arguments');
  const _namedArguments = Symbol('_namedArguments');
  const _existingArgumentNames = Symbol('_existingArgumentNames');
  core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
    new(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
      if (existingArgumentNames === void 0) existingArgumentNames = null;
      this[_receiver$] = receiver;
      this[_memberName] = memberName;
      this[_arguments] = positionalArguments;
      this[_namedArguments] = namedArguments;
      this[_existingArgumentNames] = existingArgumentNames;
      super.new();
    }
    toString() {
      let sb = new core.StringBuffer();
      let i = 0;
      if (this[_arguments] != null) {
        for (; i < dart.notNull(this[_arguments][dartx.length]); i++) {
          if (i > 0) {
            sb.write(", ");
          }
          sb.write(core.Error.safeToString(this[_arguments][dartx._get](i)));
        }
      }
      if (this[_namedArguments] != null) {
        this[_namedArguments][dartx.forEach](dart.fn((key, value) => {
          if (i > 0) {
            sb.write(", ");
          }
          sb.write(core._symbolToString(key));
          sb.write(": ");
          sb.write(core.Error.safeToString(value));
          i++;
        }, SymbolAnddynamicTovoid()));
      }
      if (this[_existingArgumentNames] == null) {
        return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
      } else {
        let actualParameters = sb.toString();
        sb = new core.StringBuffer();
        for (let i = 0; i < dart.notNull(this[_existingArgumentNames][dartx.length]); i++) {
          if (i > 0) {
            sb.write(", ");
          }
          sb.write(this[_existingArgumentNames][dartx._get](i));
        }
        let formalParameters = sb.toString();
        return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
      }
    }
  };
  dart.setSignature(core.NoSuchMethodError, {
    constructors: () => ({new: dart.definiteFunctionType(core.NoSuchMethodError, [core.Object, core.Symbol, core.List, MapOfSymbol$dynamic()], [core.List])}),
    fields: () => ({
      [_receiver$]: core.Object,
      [_memberName]: core.Symbol,
      [_arguments]: core.List,
      [_namedArguments]: MapOfSymbol$dynamic(),
      [_existingArgumentNames]: core.List
    })
  });
  core.UnsupportedError = class UnsupportedError extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return dart.str`Unsupported operation: ${this.message}`;
    }
  };
  dart.setSignature(core.UnsupportedError, {
    constructors: () => ({new: dart.definiteFunctionType(core.UnsupportedError, [core.String])}),
    fields: () => ({message: core.String})
  });
  core.UnimplementedError = class UnimplementedError extends core.Error {
    new(message) {
      if (message === void 0) message = null;
      this.message = message;
      super.new();
    }
    toString() {
      return this.message != null ? dart.str`UnimplementedError: ${this.message}` : "UnimplementedError";
    }
  };
  core.UnimplementedError[dart.implements] = () => [core.UnsupportedError];
  dart.setSignature(core.UnimplementedError, {
    constructors: () => ({new: dart.definiteFunctionType(core.UnimplementedError, [], [core.String])}),
    fields: () => ({message: core.String})
  });
  core.StateError = class StateError extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return dart.str`Bad state: ${this.message}`;
    }
  };
  dart.setSignature(core.StateError, {
    constructors: () => ({new: dart.definiteFunctionType(core.StateError, [core.String])}),
    fields: () => ({message: core.String})
  });
  core.ConcurrentModificationError = class ConcurrentModificationError extends core.Error {
    new(modifiedObject) {
      if (modifiedObject === void 0) modifiedObject = null;
      this.modifiedObject = modifiedObject;
      super.new();
    }
    toString() {
      if (this.modifiedObject == null) {
        return "Concurrent modification during iteration.";
      }
      return "Concurrent modification during iteration: " + dart.str`${core.Error.safeToString(this.modifiedObject)}.`;
    }
  };
  dart.setSignature(core.ConcurrentModificationError, {
    constructors: () => ({new: dart.definiteFunctionType(core.ConcurrentModificationError, [], [core.Object])}),
    fields: () => ({modifiedObject: core.Object})
  });
  core.OutOfMemoryError = class OutOfMemoryError extends core.Object {
    new() {
    }
    toString() {
      return "Out of Memory";
    }
    get stackTrace() {
      return null;
    }
  };
  core.OutOfMemoryError[dart.implements] = () => [core.Error];
  dart.setSignature(core.OutOfMemoryError, {
    constructors: () => ({new: dart.definiteFunctionType(core.OutOfMemoryError, [])}),
    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
  });
  core.StackOverflowError = class StackOverflowError extends core.Object {
    new() {
    }
    toString() {
      return "Stack Overflow";
    }
    get stackTrace() {
      return null;
    }
  };
  core.StackOverflowError[dart.implements] = () => [core.Error];
  dart.setSignature(core.StackOverflowError, {
    constructors: () => ({new: dart.definiteFunctionType(core.StackOverflowError, [])}),
    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
  });
  core.CyclicInitializationError = class CyclicInitializationError extends core.Error {
    new(variableName) {
      if (variableName === void 0) variableName = null;
      this.variableName = variableName;
      super.new();
    }
    toString() {
      return this.variableName == null ? "Reading static variable during its initialization" : dart.str`Reading static variable '${this.variableName}' during its initialization`;
    }
  };
  dart.setSignature(core.CyclicInitializationError, {
    constructors: () => ({new: dart.definiteFunctionType(core.CyclicInitializationError, [], [core.String])}),
    fields: () => ({variableName: core.String})
  });
  core.Exception = class Exception extends core.Object {
    static new(message) {
      if (message === void 0) message = null;
      return new core._Exception(message);
    }
  };
  dart.setSignature(core.Exception, {
    constructors: () => ({new: dart.definiteFunctionType(core.Exception, [], [dart.dynamic])})
  });
  core._Exception = class _Exception extends core.Object {
    new(message) {
      if (message === void 0) message = null;
      this.message = message;
    }
    toString() {
      if (this.message == null) return "Exception";
      return dart.str`Exception: ${this.message}`;
    }
  };
  core._Exception[dart.implements] = () => [core.Exception];
  dart.setSignature(core._Exception, {
    constructors: () => ({new: dart.definiteFunctionType(core._Exception, [], [dart.dynamic])}),
    fields: () => ({message: dart.dynamic})
  });
  core.FormatException = class FormatException extends core.Object {
    new(message, source, offset) {
      if (message === void 0) message = "";
      if (source === void 0) source = null;
      if (offset === void 0) offset = null;
      this.message = message;
      this.source = source;
      this.offset = offset;
    }
    toString() {
      let report = "FormatException";
      if (this.message != null && "" != this.message) {
        report = dart.str`${report}: ${this.message}`;
      }
      let offset = this.offset;
      if (!(typeof this.source == 'string')) {
        if (offset != null) {
          report = report + dart.str` (at offset ${offset})`;
        }
        return report;
      }
      if (offset != null && (dart.notNull(offset) < 0 || dart.notNull(offset) > dart.notNull(core.num._check(dart.dload(this.source, 'length'))))) {
        offset = null;
      }
      if (offset == null) {
        let source = core.String._check(this.source);
        if (dart.notNull(source[dartx.length]) > 78) {
          source = dart.notNull(source[dartx.substring](0, 75)) + "...";
        }
        return dart.str`${report}\n${source}`;
      }
      let lineNum = 1;
      let lineStart = 0;
      let lastWasCR = null;
      for (let i = 0; i < dart.notNull(offset); i++) {
        let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
        if (char == 10) {
          if (lineStart != i || !dart.test(lastWasCR)) {
            lineNum++;
          }
          lineStart = i + 1;
          lastWasCR = false;
        } else if (char == 13) {
          lineNum++;
          lineStart = i + 1;
          lastWasCR = true;
        }
      }
      if (lineNum > 1) {
        report = report + dart.str` (at line ${lineNum}, character ${dart.notNull(offset) - lineStart + 1})\n`;
      } else {
        report = report + dart.str` (at character ${dart.notNull(offset) + 1})\n`;
      }
      let lineEnd = core.int._check(dart.dload(this.source, 'length'));
      for (let i = offset; dart.notNull(i) < dart.notNull(core.num._check(dart.dload(this.source, 'length'))); i = dart.notNull(i) + 1) {
        let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
        if (char == 10 || char == 13) {
          lineEnd = i;
          break;
        }
      }
      let length = dart.notNull(lineEnd) - lineStart;
      let start = lineStart;
      let end = lineEnd;
      let prefix = "";
      let postfix = "";
      if (length > 78) {
        let index = dart.notNull(offset) - lineStart;
        if (index < 75) {
          end = start + 75;
          postfix = "...";
        } else if (dart.notNull(end) - dart.notNull(offset) < 75) {
          start = dart.notNull(end) - 75;
          prefix = "...";
        } else {
          start = dart.notNull(offset) - 36;
          end = dart.notNull(offset) + 36;
          prefix = postfix = "...";
        }
      }
      let slice = core.String._check(dart.dsend(this.source, 'substring', start, end));
      let markOffset = dart.notNull(offset) - start + dart.notNull(prefix[dartx.length]);
      return dart.str`${report}${prefix}${slice}${postfix}\n${" "[dartx['*']](markOffset)}^\n`;
    }
  };
  core.FormatException[dart.implements] = () => [core.Exception];
  dart.setSignature(core.FormatException, {
    constructors: () => ({new: dart.definiteFunctionType(core.FormatException, [], [core.String, dart.dynamic, core.int])}),
    fields: () => ({
      message: core.String,
      source: dart.dynamic,
      offset: core.int
    })
  });
  core.IntegerDivisionByZeroException = class IntegerDivisionByZeroException extends core.Object {
    new() {
    }
    toString() {
      return "IntegerDivisionByZeroException";
    }
  };
  core.IntegerDivisionByZeroException[dart.implements] = () => [core.Exception];
  dart.setSignature(core.IntegerDivisionByZeroException, {
    constructors: () => ({new: dart.definiteFunctionType(core.IntegerDivisionByZeroException, [])})
  });
  const _getKey = Symbol('_getKey');
  core.Expando$ = dart.generic(T => {
    class Expando extends core.Object {
      new(name) {
        if (name === void 0) name = null;
        this.name = name;
      }
      toString() {
        return dart.str`Expando:${this.name}`;
      }
      _get(object) {
        let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
        return T._check(values == null ? null : _js_helper.Primitives.getProperty(values, this[_getKey]()));
      }
      _set(object, value) {
        T._check(value);
        let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
        if (values == null) {
          values = new core.Object();
          _js_helper.Primitives.setProperty(object, core.Expando._EXPANDO_PROPERTY_NAME, values);
        }
        _js_helper.Primitives.setProperty(values, this[_getKey](), value);
        return value;
      }
      [_getKey]() {
        let key = core.String._check(_js_helper.Primitives.getProperty(this, core.Expando._KEY_PROPERTY_NAME));
        if (key == null) {
          key = dart.str`expando\$key\$${(() => {
            let x = core.Expando._keyCount;
            core.Expando._keyCount = dart.notNull(x) + 1;
            return x;
          })()}`;
          _js_helper.Primitives.setProperty(this, core.Expando._KEY_PROPERTY_NAME, key);
        }
        return key;
      }
    }
    dart.addTypeTests(Expando);
    dart.setSignature(Expando, {
      constructors: () => ({new: dart.definiteFunctionType(core.Expando$(T), [], [core.String])}),
      fields: () => ({name: core.String}),
      methods: () => ({
        _get: dart.definiteFunctionType(T, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [core.Object, T]),
        [_getKey]: dart.definiteFunctionType(core.String, [])
      }),
      sfields: () => ({
        _KEY_PROPERTY_NAME: core.String,
        _EXPANDO_PROPERTY_NAME: core.String,
        _keyCount: core.int
      })
    });
    return Expando;
  });
  core.Expando = Expando();
  core.Expando._KEY_PROPERTY_NAME = 'expando$key';
  core.Expando._EXPANDO_PROPERTY_NAME = 'expando$values';
  core.Expando._keyCount = 0;
  core.Function = class Function extends core.Object {
    static apply(f, positionalArguments, namedArguments) {
      if (namedArguments === void 0) namedArguments = null;
      return dart.dcall.apply(null, [f].concat(positionalArguments));
    }
    static _toMangledNames(namedArguments) {
      let result = dart.map({}, core.String, dart.dynamic);
      namedArguments[dartx.forEach](dart.fn((symbol, value) => {
        result[dartx._set](core._symbolToString(symbol), value);
      }, SymbolAnddynamicTovoid()));
      return result;
    }
  };
  core.Function.is = function is_Function(o) {
    return typeof o == "function";
  };
  core.Function.as = function as_Function(o) {
    if (typeof o == "function" || o == null) return o;
    return dart.as(o, core.Function);
  };
  core.Function._check = function check_String(o) {
    if (typeof o == "function" || o == null) return o;
    return dart.check(o, core.Function);
  };
  dart.setSignature(core.Function, {
    statics: () => ({
      apply: dart.definiteFunctionType(dart.dynamic, [core.Function, core.List], [MapOfSymbol$dynamic()]),
      _toMangledNames: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [MapOfSymbol$dynamic()])
    }),
    names: ['apply', '_toMangledNames']
  });
  core.identical = function(a, b) {
    return a == null ? b == null : a === b;
  };
  dart.fn(core.identical, ObjectAndObjectTobool());
  core.identityHashCode = function(object) {
    return _js_helper.objectHashCode(object);
  };
  dart.fn(core.identityHashCode, ObjectToint());
  core._Generator$ = dart.generic(E => {
    const _Generator = dart.typedef('_Generator', () => dart.functionType(E, [core.int]));
    return _Generator;
  });
  core._Generator = _Generator();
  const _end$ = Symbol('_end');
  const _start$0 = Symbol('_start');
  const _generator$ = Symbol('_generator');
  core._GeneratorIterable$ = dart.generic(E => {
    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
    let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
    class _GeneratorIterable extends core.Iterable$(E) {
      new(end, generator) {
        this[_end$] = end;
        this[_start$0] = 0;
        this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
        super.new();
      }
      slice(start, end, generator) {
        this[_start$0] = start;
        this[_end$] = end;
        this[_generator$] = generator;
        super.new();
      }
      get iterator() {
        return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
      }
      get length() {
        return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
      }
      skip(count) {
        core.RangeError.checkNotNegative(count, "count");
        if (count == 0) return this;
        let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
        if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
        return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
      }
      take(count) {
        core.RangeError.checkNotNegative(count, "count");
        if (count == 0) return new (EmptyIterableOfE())();
        let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
        if (newEnd >= dart.notNull(this[_end$])) return this;
        return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
      }
      static _id(n) {
        return n;
      }
    }
    dart.defineNamedConstructor(_GeneratorIterable, 'slice');
    _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_GeneratorIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, _GeneratorOfE()]),
        slice: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, core.int, _GeneratorOfE()])
      }),
      fields: () => ({
        [_start$0]: core.int,
        [_end$]: core.int,
        [_generator$]: _GeneratorOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int])
      }),
      statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
      names: ['_id']
    });
    dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
    return _GeneratorIterable;
  });
  core._GeneratorIterable = _GeneratorIterable();
  const _index$1 = Symbol('_index');
  const _current$3 = Symbol('_current');
  core._GeneratorIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
    class _GeneratorIterator extends core.Object {
      new(index, end, generator) {
        this[_index$1] = index;
        this[_end$] = end;
        this[_generator$] = generator;
        this[_current$3] = null;
      }
      moveNext() {
        if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
          this[_current$3] = this[_generator$](this[_index$1]);
          this[_index$1] = dart.notNull(this[_index$1]) + 1;
          return true;
        } else {
          this[_current$3] = null;
          return false;
        }
      }
      get current() {
        return this[_current$3];
      }
    }
    dart.addTypeTests(_GeneratorIterator);
    _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_GeneratorIterator, {
      constructors: () => ({new: dart.definiteFunctionType(core._GeneratorIterator$(E), [core.int, core.int, _GeneratorOfE()])}),
      fields: () => ({
        [_end$]: core.int,
        [_generator$]: _GeneratorOfE(),
        [_index$1]: core.int,
        [_current$3]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _GeneratorIterator;
  });
  core._GeneratorIterator = _GeneratorIterator();
  core.BidirectionalIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class BidirectionalIterator extends core.Object {}
    dart.addTypeTests(BidirectionalIterator);
    BidirectionalIterator[dart.implements] = () => [IteratorOfE()];
    return BidirectionalIterator;
  });
  core.BidirectionalIterator = BidirectionalIterator();
  core.Map$ = dart.generic((K, V) => {
    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
    let UnmodifiableMapViewOfK$V = () => (UnmodifiableMapViewOfK$V = dart.constFn(collection.UnmodifiableMapView$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    class Map extends core.Object {
      static new() {
        return JsLinkedHashMapOfK$V().es6();
      }
      static from(other) {
        return LinkedHashMapOfK$V().from(other);
      }
      static unmodifiable(other) {
        return new (UnmodifiableMapViewOfK$V())(MapOfK$V().from(other));
      }
      static identity() {
        return LinkedHashMapOfK$V().identity();
      }
      static fromIterable(iterable, opts) {
        return LinkedHashMapOfK$V().fromIterable(iterable, opts);
      }
      static fromIterables(keys, values) {
        return LinkedHashMapOfK$V().fromIterables(keys, values);
      }
    }
    dart.addTypeTests(Map);
    dart.setSignature(Map, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.Map$(K, V), []),
        from: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
        unmodifiable: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
        identity: dart.definiteFunctionType(core.Map$(K, V), []),
        fromIterable: dart.definiteFunctionType(core.Map$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
        fromIterables: dart.definiteFunctionType(core.Map$(K, V), [IterableOfK(), IterableOfV()])
      })
    });
    return Map;
  });
  core.Map = Map$();
  core.Null = class Null extends core.Object {
    static _uninstantiable() {
      dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
    }
    toString() {
      return "null";
    }
  };
  core.Null.is = function is_Null(o) {
    return o == null;
  };
  core.Null.as = function as_Null(o) {
    if (o == null) return o;
    return dart.as(o, core.Null);
  };
  core.Null._check = function check_Null(o) {
    if (o == null) return o;
    return dart.check(o, core.Null);
  };
  dart.setSignature(core.Null, {
    constructors: () => ({_uninstantiable: dart.definiteFunctionType(core.Null, [])})
  });
  core.Pattern = class Pattern extends core.Object {};
  core.print = function(object) {
    let line = dart.str`${object}`;
    if (_internal.printToZone == null) {
      _internal.printToConsole(line);
    } else {
      dart.dcall(_internal.printToZone, line);
    }
  };
  dart.fn(core.print, ObjectTovoid());
  core.RegExp = class RegExp extends core.Object {
    static new(source, opts) {
      let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
      let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
      return new _js_helper.JSSyntaxRegExp(source, {multiLine: multiLine, caseSensitive: caseSensitive});
    }
  };
  core.RegExp[dart.implements] = () => [core.Pattern];
  dart.setSignature(core.RegExp, {
    constructors: () => ({new: dart.definiteFunctionType(core.RegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})})
  });
  core.Set$ = dart.generic(E => {
    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class Set extends core.Iterable$(E) {
      static new() {
        return LinkedHashSetOfE().new();
      }
      static identity() {
        return LinkedHashSetOfE().identity();
      }
      static from(elements) {
        return LinkedHashSetOfE().from(elements);
      }
    }
    Set[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(Set, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.Set$(E), []),
        identity: dart.definiteFunctionType(core.Set$(E), []),
        from: dart.definiteFunctionType(core.Set$(E), [IterableOfE()])
      })
    });
    return Set;
  });
  core.Set = Set();
  core.Sink$ = dart.generic(T => {
    class Sink extends core.Object {}
    dart.addTypeTests(Sink);
    return Sink;
  });
  core.Sink = Sink();
  core.StackTrace = class StackTrace extends core.Object {
    new() {
    }
    static fromString(stackTraceString) {
      return new core._StringStackTrace(stackTraceString);
    }
    static get current() {
      if (Error.captureStackTrace != null) {
        let error = new Error();
        Error.captureStackTrace(error);
        return _js_helper.getTraceFromException(error);
      }
      try {
        dart.throw('');
      } catch (_) {
        let stackTrace = dart.stackTrace(_);
        return stackTrace;
      }

    }
  };
  dart.setSignature(core.StackTrace, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.StackTrace, []),
      fromString: dart.definiteFunctionType(core.StackTrace, [core.String])
    }),
    sgetters: () => ({current: dart.definiteFunctionType(core.StackTrace, [])})
  });
  const _stackTrace = Symbol('_stackTrace');
  core._StringStackTrace = class _StringStackTrace extends core.Object {
    new(stackTrace) {
      this[_stackTrace] = stackTrace;
    }
    toString() {
      return this[_stackTrace];
    }
  };
  core._StringStackTrace[dart.implements] = () => [core.StackTrace];
  dart.setSignature(core._StringStackTrace, {
    constructors: () => ({new: dart.definiteFunctionType(core._StringStackTrace, [core.String])}),
    fields: () => ({[_stackTrace]: core.String})
  });
  const _stop = Symbol('_stop');
  core.Stopwatch = class Stopwatch extends core.Object {
    get frequency() {
      return core.Stopwatch._frequency;
    }
    new() {
      this[_start$0] = null;
      this[_stop] = null;
      core.Stopwatch._initTicker();
    }
    start() {
      if (dart.test(this.isRunning)) return;
      if (this[_start$0] == null) {
        this[_start$0] = core.Stopwatch._now();
      } else {
        this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
        this[_stop] = null;
      }
    }
    stop() {
      if (!dart.test(this.isRunning)) return;
      this[_stop] = core.Stopwatch._now();
    }
    reset() {
      if (this[_start$0] == null) return;
      this[_start$0] = core.Stopwatch._now();
      if (this[_stop] != null) {
        this[_stop] = this[_start$0];
      }
    }
    get elapsedTicks() {
      if (this[_start$0] == null) {
        return 0;
      }
      return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
    }
    get elapsed() {
      return new core.Duration({microseconds: this.elapsedMicroseconds});
    }
    get elapsedMicroseconds() {
      return (dart.notNull(this.elapsedTicks) * 1000000 / dart.notNull(this.frequency))[dartx.truncate]();
    }
    get elapsedMilliseconds() {
      return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
    }
    get isRunning() {
      return this[_start$0] != null && this[_stop] == null;
    }
    static _initTicker() {
      _js_helper.Primitives.initTicker();
      core.Stopwatch._frequency = _js_helper.Primitives.timerFrequency;
    }
    static _now() {
      return core.int._check(dart.dsend(_js_helper.Primitives, 'timerTicks'));
    }
  };
  dart.setSignature(core.Stopwatch, {
    constructors: () => ({new: dart.definiteFunctionType(core.Stopwatch, [])}),
    fields: () => ({
      [_start$0]: core.int,
      [_stop]: core.int
    }),
    getters: () => ({
      frequency: dart.definiteFunctionType(core.int, []),
      elapsedTicks: dart.definiteFunctionType(core.int, []),
      elapsed: dart.definiteFunctionType(core.Duration, []),
      elapsedMicroseconds: dart.definiteFunctionType(core.int, []),
      elapsedMilliseconds: dart.definiteFunctionType(core.int, []),
      isRunning: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      start: dart.definiteFunctionType(dart.void, []),
      stop: dart.definiteFunctionType(dart.void, []),
      reset: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({_frequency: core.int}),
    statics: () => ({
      _initTicker: dart.definiteFunctionType(dart.void, []),
      _now: dart.definiteFunctionType(core.int, [])
    }),
    names: ['_initTicker', '_now']
  });
  core.Stopwatch._frequency = null;
  core.Runes = class Runes extends core.Iterable$(core.int) {
    new(string) {
      this.string = string;
      super.new();
    }
    get iterator() {
      return new core.RuneIterator(this.string);
    }
    get last() {
      if (this.string[dartx.length] == 0) {
        dart.throw(new core.StateError('No elements.'));
      }
      let length = this.string[dartx.length];
      let code = this.string[dartx.codeUnitAt](dart.notNull(length) - 1);
      if (dart.test(core._isTrailSurrogate(code)) && dart.notNull(this.string[dartx.length]) > 1) {
        let previousCode = this.string[dartx.codeUnitAt](dart.notNull(length) - 2);
        if (dart.test(core._isLeadSurrogate(previousCode))) {
          return core._combineSurrogatePair(previousCode, code);
        }
      }
      return code;
    }
  };
  dart.addSimpleTypeTests(core.Runes);
  dart.setSignature(core.Runes, {
    constructors: () => ({new: dart.definiteFunctionType(core.Runes, [core.String])}),
    fields: () => ({string: core.String}),
    getters: () => ({
      iterator: dart.definiteFunctionType(core.RuneIterator, []),
      last: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.defineExtensionMembers(core.Runes, ['iterator', 'last']);
  core._isLeadSurrogate = function(code) {
    return (dart.notNull(code) & 64512) == 55296;
  };
  dart.fn(core._isLeadSurrogate, intTobool());
  core._isTrailSurrogate = function(code) {
    return (dart.notNull(code) & 64512) == 56320;
  };
  dart.fn(core._isTrailSurrogate, intTobool());
  core._combineSurrogatePair = function(start, end) {
    return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
  };
  dart.fn(core._combineSurrogatePair, intAndintToint());
  const _position$ = Symbol('_position');
  const _nextPosition = Symbol('_nextPosition');
  const _currentCodePoint = Symbol('_currentCodePoint');
  const _checkSplitSurrogate = Symbol('_checkSplitSurrogate');
  core.RuneIterator = class RuneIterator extends core.Object {
    new(string) {
      this.string = string;
      this[_position$] = 0;
      this[_nextPosition] = 0;
      this[_currentCodePoint] = null;
    }
    at(string, index) {
      this.string = string;
      this[_position$] = index;
      this[_nextPosition] = index;
      this[_currentCodePoint] = null;
      core.RangeError.checkValueInInterval(index, 0, string[dartx.length]);
      this[_checkSplitSurrogate](index);
    }
    [_checkSplitSurrogate](index) {
      if (dart.notNull(index) > 0 && dart.notNull(index) < dart.notNull(this.string[dartx.length]) && dart.test(core._isLeadSurrogate(this.string[dartx.codeUnitAt](dart.notNull(index) - 1))) && dart.test(core._isTrailSurrogate(this.string[dartx.codeUnitAt](index)))) {
        dart.throw(new core.ArgumentError(dart.str`Index inside surrogate pair: ${index}`));
      }
    }
    get rawIndex() {
      return this[_position$] != this[_nextPosition] ? this[_position$] : null;
    }
    set rawIndex(rawIndex) {
      core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
      this.reset(rawIndex);
      this.moveNext();
    }
    reset(rawIndex) {
      if (rawIndex === void 0) rawIndex = 0;
      core.RangeError.checkValueInInterval(rawIndex, 0, this.string[dartx.length], "rawIndex");
      this[_checkSplitSurrogate](rawIndex);
      this[_position$] = this[_nextPosition] = rawIndex;
      this[_currentCodePoint] = null;
    }
    get current() {
      return this[_currentCodePoint];
    }
    get currentSize() {
      return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
    }
    get currentAsString() {
      if (this[_position$] == this[_nextPosition]) return null;
      if (dart.notNull(this[_position$]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position$]);
      return this.string[dartx.substring](this[_position$], this[_nextPosition]);
    }
    moveNext() {
      this[_position$] = this[_nextPosition];
      if (this[_position$] == this.string[dartx.length]) {
        this[_currentCodePoint] = null;
        return false;
      }
      let codeUnit = this.string[dartx.codeUnitAt](this[_position$]);
      let nextPosition = dart.notNull(this[_position$]) + 1;
      if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < dart.notNull(this.string[dartx.length])) {
        let nextCodeUnit = this.string[dartx.codeUnitAt](nextPosition);
        if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
          this[_nextPosition] = nextPosition + 1;
          this[_currentCodePoint] = core._combineSurrogatePair(codeUnit, nextCodeUnit);
          return true;
        }
      }
      this[_nextPosition] = nextPosition;
      this[_currentCodePoint] = codeUnit;
      return true;
    }
    movePrevious() {
      this[_nextPosition] = this[_position$];
      if (this[_position$] == 0) {
        this[_currentCodePoint] = null;
        return false;
      }
      let position = dart.notNull(this[_position$]) - 1;
      let codeUnit = this.string[dartx.codeUnitAt](position);
      if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
        let prevCodeUnit = this.string[dartx.codeUnitAt](position - 1);
        if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
          this[_position$] = position - 1;
          this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
          return true;
        }
      }
      this[_position$] = position;
      this[_currentCodePoint] = codeUnit;
      return true;
    }
  };
  dart.defineNamedConstructor(core.RuneIterator, 'at');
  core.RuneIterator[dart.implements] = () => [BidirectionalIteratorOfint()];
  dart.setSignature(core.RuneIterator, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.RuneIterator, [core.String]),
      at: dart.definiteFunctionType(core.RuneIterator, [core.String, core.int])
    }),
    fields: () => ({
      string: core.String,
      [_position$]: core.int,
      [_nextPosition]: core.int,
      [_currentCodePoint]: core.int
    }),
    getters: () => ({
      rawIndex: dart.definiteFunctionType(core.int, []),
      current: dart.definiteFunctionType(core.int, []),
      currentSize: dart.definiteFunctionType(core.int, []),
      currentAsString: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({rawIndex: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [_checkSplitSurrogate]: dart.definiteFunctionType(dart.void, [core.int]),
      reset: dart.definiteFunctionType(dart.void, [], [core.int]),
      moveNext: dart.definiteFunctionType(core.bool, []),
      movePrevious: dart.definiteFunctionType(core.bool, [])
    })
  });
  const _contents = Symbol('_contents');
  const _writeString = Symbol('_writeString');
  core.StringBuffer = class StringBuffer extends core.Object {
    new(content) {
      if (content === void 0) content = "";
      this[_contents] = dart.str`${content}`;
    }
    get length() {
      return this[_contents][dartx.length];
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    write(obj) {
      this[_writeString](dart.str`${obj}`);
    }
    writeCharCode(charCode) {
      this[_writeString](core.String.fromCharCode(charCode));
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      this[_contents] = core.StringBuffer._writeAll(this[_contents], objects, separator);
    }
    writeln(obj) {
      if (obj === void 0) obj = "";
      this[_writeString](dart.str`${obj}\n`);
    }
    clear() {
      this[_contents] = "";
    }
    toString() {
      return _js_helper.Primitives.flattenString(this[_contents]);
    }
    [_writeString](str) {
      this[_contents] = _js_helper.Primitives.stringConcatUnchecked(this[_contents], core.String._check(str));
    }
    static _writeAll(string, objects, separator) {
      let iterator = objects[dartx.iterator];
      if (!dart.test(iterator.moveNext())) return string;
      if (dart.test(separator[dartx.isEmpty])) {
        do {
          string = core.StringBuffer._writeOne(string, iterator.current);
        } while (dart.test(iterator.moveNext()));
      } else {
        string = core.StringBuffer._writeOne(string, iterator.current);
        while (dart.test(iterator.moveNext())) {
          string = core.StringBuffer._writeOne(string, separator);
          string = core.StringBuffer._writeOne(string, iterator.current);
        }
      }
      return string;
    }
    static _writeOne(string, obj) {
      return _js_helper.Primitives.stringConcatUnchecked(string, dart.str`${obj}`);
    }
  };
  core.StringBuffer[dart.implements] = () => [core.StringSink];
  dart.setSignature(core.StringBuffer, {
    constructors: () => ({new: dart.definiteFunctionType(core.StringBuffer, [], [core.Object])}),
    fields: () => ({[_contents]: core.String}),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      [_writeString]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    statics: () => ({
      _writeAll: dart.definiteFunctionType(core.String, [core.String, core.Iterable, core.String]),
      _writeOne: dart.definiteFunctionType(core.String, [core.String, core.Object])
    }),
    names: ['_writeAll', '_writeOne']
  });
  core.Symbol = class Symbol extends core.Object {
    static new(name) {
      return new _internal.Symbol(name);
    }
  };
  dart.setSignature(core.Symbol, {
    constructors: () => ({new: dart.definiteFunctionType(core.Symbol, [core.String])})
  });
  const _userInfo = Symbol('_userInfo');
  const _host = Symbol('_host');
  const _port = Symbol('_port');
  const _path = Symbol('_path');
  const _query = Symbol('_query');
  const _fragment = Symbol('_fragment');
  const _pathSegments = Symbol('_pathSegments');
  const _queryParameters = Symbol('_queryParameters');
  const _queryParameterLists = Symbol('_queryParameterLists');
  const _writeAuthority = Symbol('_writeAuthority');
  let const$51;
  const _mergePaths = Symbol('_mergePaths');
  const _toWindowsFilePath = Symbol('_toWindowsFilePath');
  const _toFilePath = Symbol('_toFilePath');
  const _isPathAbsolute = Symbol('_isPathAbsolute');
  core.Uri = class Uri extends core.Object {
    _internal(scheme, userInfo, host, port, path, query, fragment) {
      this.scheme = scheme;
      this[_userInfo] = userInfo;
      this[_host] = host;
      this[_port] = port;
      this[_path] = path;
      this[_query] = query;
      this[_fragment] = fragment;
      this[_pathSegments] = null;
      this[_queryParameters] = null;
      this[_queryParameterLists] = null;
    }
    static new(opts) {
      let scheme = opts && 'scheme' in opts ? opts.scheme : "";
      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
      let host = opts && 'host' in opts ? opts.host : null;
      let port = opts && 'port' in opts ? opts.port : null;
      let path = opts && 'path' in opts ? opts.path : null;
      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
      let query = opts && 'query' in opts ? opts.query : null;
      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
      scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
      userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
      host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
      if (query == "") query = null;
      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
      fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
      port = core.Uri._makePort(port, scheme);
      let isFile = scheme == "file";
      if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
        host = "";
      }
      let hasAuthority = host != null;
      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
      if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
        path = core.Uri._normalizeRelativePath(path);
      } else {
        path = core.Uri._removeDotSegments(path);
      }
      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
    }
    static http(authority, unencodedPath, queryParameters) {
      if (queryParameters === void 0) queryParameters = null;
      return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
    }
    static https(authority, unencodedPath, queryParameters) {
      if (queryParameters === void 0) queryParameters = null;
      return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
    }
    get authority() {
      if (!dart.test(this.hasAuthority)) return "";
      let sb = new core.StringBuffer();
      this[_writeAuthority](sb);
      return sb.toString();
    }
    get userInfo() {
      return this[_userInfo];
    }
    get host() {
      if (this[_host] == null) return "";
      if (dart.test(this[_host][dartx.startsWith]('['))) {
        return this[_host][dartx.substring](1, dart.notNull(this[_host][dartx.length]) - 1);
      }
      return this[_host];
    }
    get port() {
      if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
      return this[_port];
    }
    static _defaultPort(scheme) {
      if (scheme == "http") return 80;
      if (scheme == "https") return 443;
      return 0;
    }
    get path() {
      return this[_path];
    }
    get query() {
      return this[_query] == null ? "" : this[_query];
    }
    get fragment() {
      return this[_fragment] == null ? "" : this[_fragment];
    }
    static parse(uri, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let EOI = -1;
      let scheme = "";
      let userinfo = "";
      let host = null;
      let port = null;
      let path = null;
      let query = null;
      let fragment = null;
      if (end == null) end = uri[dartx.length];
      let index = start;
      let pathStart = start;
      let char = EOI;
      function parseAuth() {
        if (index == end) {
          char = EOI;
          return;
        }
        let authStart = index;
        let lastColon = -1;
        let lastAt = -1;
        char = uri[dartx.codeUnitAt](index);
        while (dart.notNull(index) < dart.notNull(end)) {
          char = uri[dartx.codeUnitAt](index);
          if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
            break;
          }
          if (char == core.Uri._AT_SIGN) {
            lastAt = index;
            lastColon = -1;
          } else if (char == core.Uri._COLON) {
            lastColon = index;
          } else if (char == core.Uri._LEFT_BRACKET) {
            lastColon = -1;
            let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
            if (endBracket == -1) {
              index = end;
              char = EOI;
              break;
            } else {
              index = endBracket;
            }
          }
          index = dart.notNull(index) + 1;
          char = EOI;
        }
        let hostStart = authStart;
        let hostEnd = index;
        if (dart.notNull(lastAt) >= 0) {
          userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
          hostStart = dart.notNull(lastAt) + 1;
        }
        if (dart.notNull(lastColon) >= 0) {
          let portNumber = null;
          if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
            portNumber = 0;
            for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
              let digit = uri[dartx.codeUnitAt](i);
              if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
                core.Uri._fail(uri, i, "Invalid port number");
              }
              portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
            }
          }
          port = core.Uri._makePort(portNumber, scheme);
          hostEnd = lastColon;
        }
        host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
        if (dart.notNull(index) < dart.notNull(end)) {
          char = uri[dartx.codeUnitAt](index);
        }
      }
      dart.fn(parseAuth, VoidTovoid$());
      let NOT_IN_PATH = 0;
      let IN_PATH = 1;
      let ALLOW_AUTH = 2;
      let state = NOT_IN_PATH;
      let i = index;
      while (dart.notNull(i) < dart.notNull(end)) {
        char = uri[dartx.codeUnitAt](i);
        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
          state = NOT_IN_PATH;
          break;
        }
        if (char == core.Uri._SLASH) {
          state = i == start ? ALLOW_AUTH : IN_PATH;
          break;
        }
        if (char == core.Uri._COLON) {
          if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
          scheme = core.Uri._makeScheme(uri, start, i);
          i = dart.notNull(i) + 1;
          pathStart = i;
          if (i == end) {
            char = EOI;
            state = NOT_IN_PATH;
          } else {
            char = uri[dartx.codeUnitAt](i);
            if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
              state = NOT_IN_PATH;
            } else if (char == core.Uri._SLASH) {
              state = ALLOW_AUTH;
            } else {
              state = IN_PATH;
            }
          }
          break;
        }
        i = dart.notNull(i) + 1;
        char = EOI;
      }
      index = i;
      if (state == ALLOW_AUTH) {
        dart.assert(char == core.Uri._SLASH);
        index = dart.notNull(index) + 1;
        if (index == end) {
          char = EOI;
          state = NOT_IN_PATH;
        } else {
          char = uri[dartx.codeUnitAt](index);
          if (char == core.Uri._SLASH) {
            index = dart.notNull(index) + 1;
            parseAuth();
            pathStart = index;
          }
          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
            state = NOT_IN_PATH;
          } else {
            state = IN_PATH;
          }
        }
      }
      dart.assert(state == IN_PATH || state == NOT_IN_PATH);
      if (state == IN_PATH) {
        while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
          char = uri[dartx.codeUnitAt](index);
          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
            break;
          }
          char = EOI;
        }
        state = NOT_IN_PATH;
      }
      dart.assert(state == NOT_IN_PATH);
      let hasAuthority = host != null;
      path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
      if (char == core.Uri._QUESTION) {
        let numberSignIndex = -1;
        for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
          if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
            numberSignIndex = i;
            break;
          }
        }
        if (numberSignIndex < 0) {
          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
        } else {
          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
          fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
        }
      } else if (char == core.Uri._NUMBER_SIGN) {
        fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
      }
      return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
    }
    static _fail(uri, index, message) {
      dart.throw(new core.FormatException(message, uri, index));
    }
    static _makeHttpUri(scheme, authority, unencodedPath, queryParameters) {
      let userInfo = "";
      let host = null;
      let port = null;
      if (authority != null && dart.test(authority[dartx.isNotEmpty])) {
        let hostStart = 0;
        let hasUserInfo = false;
        for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
          if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
            hasUserInfo = true;
            userInfo = authority[dartx.substring](0, i);
            hostStart = i + 1;
            break;
          }
        }
        let hostEnd = hostStart;
        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
          for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
            if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
          }
          if (hostEnd == authority[dartx.length]) {
            dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
          }
          core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
          hostEnd++;
          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
            dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
          }
        }
        let hasPort = false;
        for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
            let portString = authority[dartx.substring](hostEnd + 1);
            if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
            break;
          }
        }
        host = authority[dartx.substring](hostStart, hostEnd);
      }
      return core.Uri.new({scheme: scheme, userInfo: userInfo, host: core.String._check(host), port: core.int._check(port), pathSegments: unencodedPath[dartx.split]("/"), queryParameters: queryParameters});
    }
    static file(path, opts) {
      let windows = opts && 'windows' in opts ? opts.windows : null;
      windows = windows == null ? core.Uri._isWindows : windows;
      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
    }
    static directory(path, opts) {
      let windows = opts && 'windows' in opts ? opts.windows : null;
      windows = windows == null ? core.Uri._isWindows : windows;
      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
    }
    static dataFromString(content, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let base64 = opts && 'base64' in opts ? opts.base64 : false;
      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
      return data.uri;
    }
    static dataFromBytes(bytes, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
      return data.uri;
    }
    static get base() {
      let uri = _js_helper.Primitives.currentUri();
      if (uri != null) return core.Uri.parse(uri);
      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
    }
    static get _isWindows() {
      return false;
    }
    static _checkNonWindowsPathReservedCharacters(segments, argumentError) {
      segments[dartx.forEach](dart.fn(segment => {
        if (dart.test(segment[dartx.contains]("/"))) {
          if (dart.test(argumentError)) {
            dart.throw(new core.ArgumentError(dart.str`Illegal path character ${segment}`));
          } else {
            dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
          }
        }
      }, StringTovoid$()));
    }
    static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
      if (firstSegment === void 0) firstSegment = 0;
      for (let segment of segments[dartx.skip](firstSegment)) {
        if (dart.test(segment[dartx.contains](core.RegExp.new('["*/:<>?\\\\|]')))) {
          if (dart.test(argumentError)) {
            dart.throw(new core.ArgumentError("Illegal character in path"));
          } else {
            dart.throw(new core.UnsupportedError("Illegal character in path"));
          }
        }
      }
    }
    static _checkWindowsDriveLetter(charCode, argumentError) {
      if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
        return;
      }
      if (dart.test(argumentError)) {
        dart.throw(new core.ArgumentError("Illegal drive letter " + core.String.fromCharCode(charCode)));
      } else {
        dart.throw(new core.UnsupportedError("Illegal drive letter " + core.String.fromCharCode(charCode)));
      }
    }
    static _makeFileUri(path, slashTerminated) {
      let sep = "/";
      let segments = path[dartx.split](sep);
      if (dart.test(slashTerminated) && dart.test(segments[dartx.isNotEmpty]) && dart.test(segments[dartx.last][dartx.isNotEmpty])) {
        segments[dartx.add]("");
      }
      if (dart.test(path[dartx.startsWith](sep))) {
        return core.Uri.new({scheme: "file", pathSegments: segments});
      } else {
        return core.Uri.new({pathSegments: segments});
      }
    }
    static _makeWindowsFileUrl(path, slashTerminated) {
      if (dart.test(path[dartx.startsWith]("\\\\?\\"))) {
        if (dart.test(path[dartx.startsWith]("UNC\\", 4))) {
          path = path[dartx.replaceRange](0, 7, '\\');
        } else {
          path = path[dartx.substring](4);
          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
            dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
          }
        }
      } else {
        path = path[dartx.replaceAll]("/", '\\');
      }
      let sep = '\\';
      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
        core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
          dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
        }
        let pathSegments = path[dartx.split](sep);
        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
          pathSegments[dartx.add]("");
        }
        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
        return core.Uri.new({scheme: "file", pathSegments: pathSegments});
      }
      if (dart.test(path[dartx.startsWith](sep))) {
        if (dart.test(path[dartx.startsWith](sep, 1))) {
          let pathStart = path[dartx.indexOf]('\\', 2);
          let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
          let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
          let pathSegments = pathPart[dartx.split](sep);
          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
          if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
            pathSegments[dartx.add]("");
          }
          return core.Uri.new({scheme: "file", host: hostPart, pathSegments: pathSegments});
        } else {
          let pathSegments = path[dartx.split](sep);
          if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
            pathSegments[dartx.add]("");
          }
          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
          return core.Uri.new({scheme: "file", pathSegments: pathSegments});
        }
      } else {
        let pathSegments = path[dartx.split](sep);
        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
          pathSegments[dartx.add]("");
        }
        return core.Uri.new({pathSegments: pathSegments});
      }
    }
    replace(opts) {
      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
      let host = opts && 'host' in opts ? opts.host : null;
      let port = opts && 'port' in opts ? opts.port : null;
      let path = opts && 'path' in opts ? opts.path : null;
      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
      let query = opts && 'query' in opts ? opts.query : null;
      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
      let schemeChanged = false;
      if (scheme != null) {
        scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
        schemeChanged = true;
      } else {
        scheme = this.scheme;
      }
      let isFile = scheme == "file";
      if (userInfo != null) {
        userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
      } else {
        userInfo = this[_userInfo];
      }
      if (port != null) {
        port = core.Uri._makePort(port, scheme);
      } else {
        port = this[_port];
        if (schemeChanged) {
          port = core.Uri._makePort(port, scheme);
        }
      }
      if (host != null) {
        host = core.Uri._makeHost(host, 0, host[dartx.length], false);
      } else if (dart.test(this.hasAuthority)) {
        host = this[_host];
      } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
        host = "";
      }
      let hasAuthority = host != null;
      if (path != null || pathSegments != null) {
        path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
      } else {
        path = this[_path];
        if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
          path = "/" + dart.notNull(path);
        }
      }
      if (query != null || queryParameters != null) {
        query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
      } else {
        query = this[_query];
      }
      if (fragment != null) {
        fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
      } else {
        fragment = this[_fragment];
      }
      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
    }
    removeFragment() {
      if (!dart.test(this.hasFragment)) return this;
      return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
    }
    get pathSegments() {
      let result = this[_pathSegments];
      if (result != null) return result;
      let pathToSplit = this.path;
      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
        pathToSplit = pathToSplit[dartx.substring](1);
      }
      result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
      this[_pathSegments] = result;
      return result;
    }
    get queryParameters() {
      if (this[_queryParameters] == null) {
        this[_queryParameters] = new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
      }
      return this[_queryParameters];
    }
    get queryParametersAll() {
      if (this[_queryParameterLists] == null) {
        let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
        for (let key of queryParameterLists[dartx.keys]) {
          queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
        }
        this[_queryParameterLists] = MapOfString$ListOfString().unmodifiable(queryParameterLists);
      }
      return this[_queryParameterLists];
    }
    normalizePath() {
      let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
      if (core.identical(path, this[_path])) return this;
      return this.replace({path: path});
    }
    static _makePort(port, scheme) {
      if (port != null && port == core.Uri._defaultPort(scheme)) return null;
      return port;
    }
    static _makeHost(host, start, end, strictIPv6) {
      if (host == null) return null;
      if (start == end) return "";
      if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
          core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
        }
        core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
        return host[dartx.substring](start, end)[dartx.toLowerCase]();
      }
      if (!dart.test(strictIPv6)) {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
            core.Uri.parseIPv6Address(host, start, end);
            return dart.str`[${host}]`;
          }
        }
      }
      return core.Uri._normalizeRegName(host, start, end);
    }
    static _isRegNameChar(char) {
      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
    }
    static _normalizeRegName(host, start, end) {
      let buffer = null;
      let sectionStart = start;
      let index = start;
      let isNormalized = true;
      while (dart.notNull(index) < dart.notNull(end)) {
        let char = host[dartx.codeUnitAt](index);
        if (char == core.Uri._PERCENT) {
          let replacement = core.Uri._normalizeEscape(host, index, true);
          if (replacement == null && isNormalized) {
            index = dart.notNull(index) + 3;
            continue;
          }
          if (buffer == null) buffer = new core.StringBuffer();
          let slice = host[dartx.substring](sectionStart, index);
          if (!isNormalized) slice = slice[dartx.toLowerCase]();
          buffer.write(slice);
          let sourceLength = 3;
          if (replacement == null) {
            replacement = host[dartx.substring](index, dart.notNull(index) + 3);
          } else if (replacement == "%") {
            replacement = "%25";
            sourceLength = 1;
          }
          buffer.write(replacement);
          index = dart.notNull(index) + sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else if (dart.test(core.Uri._isRegNameChar(char))) {
          if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
            if (buffer == null) buffer = new core.StringBuffer();
            if (dart.notNull(sectionStart) < dart.notNull(index)) {
              buffer.write(host[dartx.substring](sectionStart, index));
              sectionStart = index;
            }
            isNormalized = false;
          }
          index = dart.notNull(index) + 1;
        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
          core.Uri._fail(host, index, "Invalid character");
        } else {
          let sourceLength = 1;
          if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
            let tail = host[dartx.codeUnitAt](dart.notNull(index) + 1);
            if ((dart.notNull(tail) & 64512) == 56320) {
              char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
              sourceLength = 2;
            }
          }
          if (buffer == null) buffer = new core.StringBuffer();
          let slice = host[dartx.substring](sectionStart, index);
          if (!isNormalized) slice = slice[dartx.toLowerCase]();
          buffer.write(slice);
          buffer.write(core.Uri._escapeChar(char));
          index = dart.notNull(index) + sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null) return host[dartx.substring](start, end);
      if (dart.notNull(sectionStart) < dart.notNull(end)) {
        let slice = host[dartx.substring](sectionStart, end);
        if (!isNormalized) slice = slice[dartx.toLowerCase]();
        buffer.write(slice);
      }
      return dart.toString(buffer);
    }
    static _makeScheme(scheme, start, end) {
      if (start == end) return "";
      let firstCodeUnit = scheme[dartx.codeUnitAt](start);
      if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
        core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
      }
      let containsUpperCase = false;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = scheme[dartx.codeUnitAt](i);
        if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
          core.Uri._fail(scheme, i, "Illegal scheme character");
        }
        if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
          containsUpperCase = true;
        }
      }
      scheme = scheme[dartx.substring](start, end);
      if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
      return scheme;
    }
    static _makeUserInfo(userInfo, start, end) {
      if (userInfo == null) return "";
      return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
    }
    static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
      let isFile = scheme == "file";
      let ensureLeadingSlash = isFile || dart.test(hasAuthority);
      if (path == null && pathSegments == null) return isFile ? "/" : "";
      if (path != null && pathSegments != null) {
        dart.throw(new core.ArgumentError('Both path and pathSegments specified'));
      }
      let result = null;
      if (path != null) {
        result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
      } else {
        result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
      }
      if (dart.test(dart.dload(result, 'isEmpty'))) {
        if (isFile) return "/";
      } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
        result = "/" + dart.notNull(core.String._check(result));
      }
      result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
      return core.String._check(result);
    }
    static _normalizePath(path, scheme, hasAuthority) {
      if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
        return core.Uri._normalizeRelativePath(path);
      }
      return core.Uri._removeDotSegments(path);
    }
    static _makeQuery(query, start, end, queryParameters) {
      if (query == null && queryParameters == null) return null;
      if (query != null && queryParameters != null) {
        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
      }
      if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
      let result = new core.StringBuffer();
      let separator = "";
      function writeParameter(key, value) {
        result.write(separator);
        separator = "&";
        result.write(core.Uri.encodeQueryComponent(key));
        if (value != null && dart.test(value[dartx.isNotEmpty])) {
          result.write("=");
          result.write(core.Uri.encodeQueryComponent(value));
        }
      }
      dart.fn(writeParameter, StringAndStringTovoid$());
      queryParameters[dartx.forEach](dart.fn((key, value) => {
        if (value == null || typeof value == 'string') {
          writeParameter(key, core.String._check(value));
        } else {
          let values = core.Iterable._check(value);
          for (let value of values) {
            core.String._check(value);
            writeParameter(key, value);
          }
        }
      }, StringAnddynamicTovoid()));
      return result.toString();
    }
    static _makeFragment(fragment, start, end) {
      if (fragment == null) return null;
      return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
    }
    static _stringOrNullLength(s) {
      return s == null ? 0 : s[dartx.length];
    }
    static _normalizeEscape(source, index, lowerCase) {
      dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
      if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
        return "%";
      }
      let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
      let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
      let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
      let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
      if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
        return "%";
      }
      let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
      if (dart.test(core.Uri._isUnreservedChar(value))) {
        if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
          value = (value | 32) >>> 0;
        }
        return core.String.fromCharCode(value);
      }
      if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
        return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
      }
      return null;
    }
    static _parseHexDigit(char) {
      let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
      if (digit <= 9) return digit;
      let lowerCase = (dart.notNull(char) | 32) >>> 0;
      if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
        return lowerCase - (core.Uri._LOWER_CASE_A - 10);
      }
      return -1;
    }
    static _escapeChar(char) {
      dart.assert(dart.notNull(char) <= 1114111);
      let codeUnits = null;
      if (dart.notNull(char) < 128) {
        codeUnits = ListOfint().new(3);
        codeUnits[dartx._set](0, core.Uri._PERCENT);
        codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
        codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
      } else {
        let flag = 192;
        let encodedBytes = 2;
        if (dart.notNull(char) > 2047) {
          flag = 224;
          encodedBytes = 3;
          if (dart.notNull(char) > 65535) {
            encodedBytes = 4;
            flag = 240;
          }
        }
        codeUnits = ListOfint().new(3 * encodedBytes);
        let index = 0;
        while (--encodedBytes >= 0) {
          let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
          codeUnits[dartx._set](index, core.Uri._PERCENT);
          codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
          codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
          index = index + 3;
          flag = 128;
        }
      }
      return core.String.fromCharCodes(codeUnits);
    }
    static _normalize(component, start, end, charTable) {
      let buffer = null;
      let sectionStart = start;
      let index = start;
      while (dart.notNull(index) < dart.notNull(end)) {
        let char = component[dartx.codeUnitAt](index);
        if (dart.notNull(char) < 127 && (dart.notNull(charTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0) {
          index = dart.notNull(index) + 1;
        } else {
          let replacement = null;
          let sourceLength = null;
          if (char == core.Uri._PERCENT) {
            replacement = core.Uri._normalizeEscape(component, index, false);
            if (replacement == null) {
              index = dart.notNull(index) + 3;
              continue;
            }
            if ("%" == replacement) {
              replacement = "%25";
              sourceLength = 1;
            } else {
              sourceLength = 3;
            }
          } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
            core.Uri._fail(component, index, "Invalid character");
          } else {
            sourceLength = 1;
            if ((dart.notNull(char) & 64512) == 55296) {
              if (dart.notNull(index) + 1 < dart.notNull(end)) {
                let tail = component[dartx.codeUnitAt](dart.notNull(index) + 1);
                if ((dart.notNull(tail) & 64512) == 56320) {
                  sourceLength = 2;
                  char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
                }
              }
            }
            replacement = core.Uri._escapeChar(char);
          }
          if (buffer == null) buffer = new core.StringBuffer();
          buffer.write(component[dartx.substring](sectionStart, index));
          buffer.write(replacement);
          index = dart.notNull(index) + dart.notNull(sourceLength);
          sectionStart = index;
        }
      }
      if (buffer == null) {
        return component[dartx.substring](start, end);
      }
      if (dart.notNull(sectionStart) < dart.notNull(end)) {
        buffer.write(component[dartx.substring](sectionStart, end));
      }
      return dart.toString(buffer);
    }
    static _isSchemeCharacter(ch) {
      return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
    }
    static _isGeneralDelimiter(ch) {
      return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
    }
    get isAbsolute() {
      return this.scheme != "" && this.fragment == "";
    }
    [_mergePaths](base, reference) {
      let backCount = 0;
      let refStart = 0;
      while (dart.test(reference[dartx.startsWith]("../", refStart))) {
        refStart = refStart + 3;
        backCount++;
      }
      let baseEnd = base[dartx.lastIndexOf]('/');
      while (dart.notNull(baseEnd) > 0 && backCount > 0) {
        let newEnd = base[dartx.lastIndexOf]('/', dart.notNull(baseEnd) - 1);
        if (dart.notNull(newEnd) < 0) {
          break;
        }
        let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
          break;
        }
        baseEnd = newEnd;
        backCount--;
      }
      return base[dartx.replaceRange](dart.notNull(baseEnd) + 1, null, reference[dartx.substring](refStart - 3 * backCount));
    }
    static _mayContainDotSegments(path) {
      if (dart.test(path[dartx.startsWith]('.'))) return true;
      let index = path[dartx.indexOf]("/.");
      return index != -1;
    }
    static _removeDotSegments(path) {
      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
      dart.assert(path[dartx.isNotEmpty]);
      let output = JSArrayOfString().of([]);
      let appendSlash = false;
      for (let segment of path[dartx.split]("/")) {
        appendSlash = false;
        if (segment == "..") {
          if (dart.test(output[dartx.isNotEmpty])) {
            output[dartx.removeLast]();
            if (dart.test(output[dartx.isEmpty])) {
              output[dartx.add]("");
            }
          }
          appendSlash = true;
        } else if ("." == segment) {
          appendSlash = true;
        } else {
          output[dartx.add](segment);
        }
      }
      if (appendSlash) output[dartx.add]("");
      return output[dartx.join]("/");
    }
    static _normalizeRelativePath(path) {
      dart.assert(!dart.test(path[dartx.startsWith]('/')));
      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
      dart.assert(path[dartx.isNotEmpty]);
      let output = JSArrayOfString().of([]);
      let appendSlash = false;
      for (let segment of path[dartx.split]("/")) {
        appendSlash = false;
        if (".." == segment) {
          if (!dart.test(output[dartx.isEmpty]) && output[dartx.last] != "..") {
            output[dartx.removeLast]();
            appendSlash = true;
          } else {
            output[dartx.add]("..");
          }
        } else if ("." == segment) {
          appendSlash = true;
        } else {
          output[dartx.add](segment);
        }
      }
      if (dart.test(output[dartx.isEmpty]) || output[dartx.length] == 1 && dart.test(output[dartx._get](0)[dartx.isEmpty])) {
        return "./";
      }
      if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
      return output[dartx.join]("/");
    }
    resolve(reference) {
      return this.resolveUri(core.Uri.parse(reference));
    }
    resolveUri(reference) {
      let targetScheme = null;
      let targetUserInfo = "";
      let targetHost = null;
      let targetPort = null;
      let targetPath = null;
      let targetQuery = null;
      if (dart.test(reference.scheme[dartx.isNotEmpty])) {
        targetScheme = reference.scheme;
        if (dart.test(reference.hasAuthority)) {
          targetUserInfo = reference.userInfo;
          targetHost = reference.host;
          targetPort = dart.test(reference.hasPort) ? reference.port : null;
        }
        targetPath = core.Uri._removeDotSegments(reference.path);
        if (dart.test(reference.hasQuery)) {
          targetQuery = reference.query;
        }
      } else {
        targetScheme = this.scheme;
        if (dart.test(reference.hasAuthority)) {
          targetUserInfo = reference.userInfo;
          targetHost = reference.host;
          targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
          targetPath = core.Uri._removeDotSegments(reference.path);
          if (dart.test(reference.hasQuery)) targetQuery = reference.query;
        } else {
          targetUserInfo = this[_userInfo];
          targetHost = this[_host];
          targetPort = this[_port];
          if (reference.path == "") {
            targetPath = this[_path];
            if (dart.test(reference.hasQuery)) {
              targetQuery = reference.query;
            } else {
              targetQuery = this[_query];
            }
          } else {
            if (dart.test(reference.hasAbsolutePath)) {
              targetPath = core.Uri._removeDotSegments(reference.path);
            } else {
              if (dart.test(this.hasEmptyPath)) {
                if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
                  targetPath = reference.path;
                } else {
                  targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
                }
              } else {
                let mergedPath = this[_mergePaths](this[_path], reference.path);
                if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
                  targetPath = core.Uri._removeDotSegments(mergedPath);
                } else {
                  targetPath = core.Uri._normalizeRelativePath(mergedPath);
                }
              }
            }
            if (dart.test(reference.hasQuery)) targetQuery = reference.query;
          }
        }
      }
      let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
      return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
    }
    get hasScheme() {
      return this.scheme[dartx.isNotEmpty];
    }
    get hasAuthority() {
      return this[_host] != null;
    }
    get hasPort() {
      return this[_port] != null;
    }
    get hasQuery() {
      return this[_query] != null;
    }
    get hasFragment() {
      return this[_fragment] != null;
    }
    get hasEmptyPath() {
      return this[_path][dartx.isEmpty];
    }
    get hasAbsolutePath() {
      return this[_path][dartx.startsWith]('/');
    }
    get origin() {
      if (this.scheme == "" || this[_host] == null || this[_host] == "") {
        dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
      }
      if (this.scheme != "http" && this.scheme != "https") {
        dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
      }
      if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
      return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
    }
    toFilePath(opts) {
      let windows = opts && 'windows' in opts ? opts.windows : null;
      if (this.scheme != "" && this.scheme != "file") {
        dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
      }
      if (this.query != "") {
        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
      }
      if (this.fragment != "") {
        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
      }
      if (windows == null) windows = core.Uri._isWindows;
      return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
    }
    [_toFilePath]() {
      if (this.host != "") {
        dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
      }
      core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
      let result = new core.StringBuffer();
      if (dart.test(this[_isPathAbsolute])) result.write("/");
      result.writeAll(this.pathSegments, "/");
      return result.toString();
    }
    [_toWindowsFilePath]() {
      let hasDriveLetter = false;
      let segments = this.pathSegments;
      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
        core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
        core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
        hasDriveLetter = true;
      } else {
        core.Uri._checkWindowsPathReservedCharacters(segments, false);
      }
      let result = new core.StringBuffer();
      if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
      if (this.host != "") {
        result.write("\\");
        result.write(this.host);
        result.write("\\");
      }
      result.writeAll(segments, "\\");
      if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
      return result.toString();
    }
    get [_isPathAbsolute]() {
      if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
      return this.path[dartx.startsWith]('/');
    }
    [_writeAuthority](ss) {
      if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
        ss.write(this[_userInfo]);
        ss.write("@");
      }
      if (this[_host] != null) ss.write(this[_host]);
      if (this[_port] != null) {
        ss.write(":");
        ss.write(this[_port]);
      }
    }
    get data() {
      return this.scheme == "data" ? core.UriData.fromUri(this) : null;
    }
    toString() {
      let sb = new core.StringBuffer();
      core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
      if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
        sb.write("//");
        this[_writeAuthority](sb);
      }
      sb.write(this.path);
      if (this[_query] != null) {
        sb.write("?");
        sb.write(this[_query]);
      }
      if (this[_fragment] != null) {
        sb.write("#");
        sb.write(this[_fragment]);
      }
      return sb.toString();
    }
    ['=='](other) {
      if (!core.Uri.is(other)) return false;
      let uri = core.Uri._check(other);
      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
    }
    get hashCode() {
      function combine(part, current) {
        return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
      }
      dart.fn(combine, dynamicAnddynamicToint());
      return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
    }
    static _addIfNonEmpty(sb, test, first, second) {
      if ("" != test) {
        sb.write(first);
        sb.write(second);
      }
    }
    static encodeComponent(component) {
      return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
    }
    static encodeQueryComponent(component, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
    }
    static decodeComponent(encodedComponent) {
      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
    }
    static decodeQueryComponent(encodedComponent, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
    }
    static encodeFull(uri) {
      return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
    }
    static decodeFull(uri) {
      return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
    }
    static splitQueryString(query, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
        let index = element[dartx.indexOf]("=");
        if (index == -1) {
          if (element != "") {
            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
          }
        } else if (index != 0) {
          let key = element[dartx.substring](0, index);
          let value = element[dartx.substring](dart.notNull(index) + 1);
          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
        }
        return map;
      }, MapOfString$StringAndStringToMapOfString$String()));
    }
    static _createList() {
      return [];
    }
    static _splitQueryStringAll(query, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      let result = dart.map();
      let i = 0;
      let start = 0;
      let equalsIndex = -1;
      function parsePair(start, equalsIndex, end) {
        let key = null;
        let value = null;
        if (start == end) return;
        if (dart.notNull(equalsIndex) < 0) {
          key = core.Uri._uriDecode(query, start, end, encoding, true);
          value = "";
        } else {
          key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
          value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
        }
        dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
      }
      dart.fn(parsePair, intAndintAndintTovoid());
      let _equals = 61;
      let _ampersand = 38;
      while (i < dart.notNull(query[dartx.length])) {
        let char = query[dartx.codeUnitAt](i);
        if (char == _equals) {
          if (equalsIndex < 0) equalsIndex = i;
        } else if (char == _ampersand) {
          parsePair(start, equalsIndex, i);
          start = i + 1;
          equalsIndex = -1;
        }
        i++;
      }
      parsePair(start, equalsIndex, i);
      return result;
    }
    static parseIPv4Address(host) {
      function error(msg) {
        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
      }
      dart.fn(error, StringTovoid$());
      let bytes = host[dartx.split]('.');
      if (bytes[dartx.length] != 4) {
        error('IPv4 address should contain exactly 4 parts');
      }
      return bytes[dartx.map](core.int)(dart.fn(byteString => {
        let byte = core.int.parse(byteString);
        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
          error('each part must be in the range of `0..255`');
        }
        return byte;
      }, StringToint$()))[dartx.toList]();
    }
    static parseIPv6Address(host, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      if (end == null) end = host[dartx.length];
      function error(msg, position) {
        if (position === void 0) position = null;
        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
      }
      dart.fn(error, String__Tovoid());
      function parseHex(start, end) {
        if (dart.notNull(end) - dart.notNull(start) > 4) {
          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
        }
        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
        if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
          error('each part must be in the range of `0x0..0xFFFF`', start);
        }
        return value;
      }
      dart.fn(parseHex, intAndintToint());
      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
      let parts = JSArrayOfint().of([]);
      let wildcardSeen = false;
      let partStart = start;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
          if (i == start) {
            i = dart.notNull(i) + 1;
            if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
              error('invalid start colon.', i);
            }
            partStart = i;
          }
          if (i == partStart) {
            if (wildcardSeen) {
              error('only one wildcard `::` is allowed', i);
            }
            wildcardSeen = true;
            parts[dartx.add](-1);
          } else {
            parts[dartx.add](parseHex(partStart, i));
          }
          partStart = dart.notNull(i) + 1;
        }
      }
      if (parts[dartx.length] == 0) error('too few parts');
      let atEnd = partStart == end;
      let isLastWildcard = parts[dartx.last] == -1;
      if (atEnd && !isLastWildcard) {
        error('expected a part after last `:`', end);
      }
      if (!atEnd) {
        try {
          parts[dartx.add](parseHex(partStart, end));
        } catch (e) {
          try {
            let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
            parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
            parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
          } catch (e) {
            error('invalid end of IPv6 address.', partStart);
          }

        }

      }
      if (wildcardSeen) {
        if (dart.notNull(parts[dartx.length]) > 7) {
          error('an address with a wildcard must have less than 7 parts');
        }
      } else if (parts[dartx.length] != 8) {
        error('an address without a wildcard must contain exactly 8 parts');
      }
      let bytes = typed_data.Uint8List.new(16);
      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
        let value = parts[dartx._get](i);
        if (value == -1) {
          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
          for (let j = 0; j < wildCardLength; j++) {
            bytes[dartx._set](index, 0);
            bytes[dartx._set](index + 1, 0);
            index = index + 2;
          }
        } else {
          bytes[dartx._set](index, value[dartx['>>']](8));
          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
          index = index + 2;
        }
      }
      return bytes;
    }
    static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
      if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
        return text;
      }
      let result = new core.StringBuffer();
      let bytes = encoding.encode(text);
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byte = bytes[dartx._get](i);
        if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
          result.writeCharCode(byte);
        } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
          result.write('+');
        } else {
          let hexDigits = '0123456789ABCDEF';
          result.write('%');
          result.write(hexDigits[dartx._get](dart.notNull(byte) >> 4 & 15));
          result.write(hexDigits[dartx._get](dart.notNull(byte) & 15));
        }
      }
      return result.toString();
    }
    static _hexCharPairToByte(s, pos) {
      let byte = 0;
      for (let i = 0; i < 2; i++) {
        let charCode = s[dartx.codeUnitAt](dart.notNull(pos) + i);
        if (48 <= dart.notNull(charCode) && dart.notNull(charCode) <= 57) {
          byte = byte * 16 + dart.notNull(charCode) - 48;
        } else {
          charCode = (dart.notNull(charCode) | 32) >>> 0;
          if (97 <= dart.notNull(charCode) && dart.notNull(charCode) <= 102) {
            byte = byte * 16 + dart.notNull(charCode) - 87;
          } else {
            dart.throw(new core.ArgumentError("Invalid URL encoding"));
          }
        }
      }
      return byte;
    }
    static _uriDecode(text, start, end, encoding, plusToSpace) {
      dart.assert(0 <= dart.notNull(start));
      dart.assert(dart.notNull(start) <= dart.notNull(end));
      dart.assert(dart.notNull(end) <= dart.notNull(text[dartx.length]));
      dart.assert(encoding != null);
      let simple = true;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
          simple = false;
          break;
        }
      }
      let bytes = null;
      if (simple) {
        if (dart.equals(convert.UTF8, encoding) || dart.equals(convert.LATIN1, encoding) || dart.equals(convert.ASCII, encoding)) {
          return text[dartx.substring](start, end);
        } else {
          bytes = text[dartx.substring](start, end)[dartx.codeUnits];
        }
      } else {
        bytes = ListOfint().new();
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          let codeUnit = text[dartx.codeUnitAt](i);
          if (dart.notNull(codeUnit) > 127) {
            dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
          }
          if (codeUnit == core.Uri._PERCENT) {
            if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
              dart.throw(new core.ArgumentError('Truncated URI'));
            }
            bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
            i = dart.notNull(i) + 2;
          } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
            bytes[dartx.add](core.Uri._SPACE);
          } else {
            bytes[dartx.add](codeUnit);
          }
        }
      }
      return encoding.decode(bytes);
    }
    static _isAlphabeticCharacter(codeUnit) {
      let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
      return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
    }
    static _isUnreservedChar(char) {
      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
    }
  };
  dart.defineNamedConstructor(core.Uri, '_internal');
  dart.setSignature(core.Uri, {
    constructors: () => ({
      _internal: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, core.int, core.String, core.String, core.String]),
      new: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
      http: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
      https: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
      file: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
      directory: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
      dataFromString: dart.definiteFunctionType(core.Uri, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
      dataFromBytes: dart.definiteFunctionType(core.Uri, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic})
    }),
    fields: () => ({
      scheme: core.String,
      [_userInfo]: core.String,
      [_host]: core.String,
      [_port]: core.int,
      [_path]: core.String,
      [_query]: core.String,
      [_fragment]: core.String,
      [_pathSegments]: ListOfString(),
      [_queryParameters]: MapOfString$String(),
      [_queryParameterLists]: MapOfString$ListOfString()
    }),
    getters: () => ({
      authority: dart.definiteFunctionType(core.String, []),
      userInfo: dart.definiteFunctionType(core.String, []),
      host: dart.definiteFunctionType(core.String, []),
      port: dart.definiteFunctionType(core.int, []),
      path: dart.definiteFunctionType(core.String, []),
      query: dart.definiteFunctionType(core.String, []),
      fragment: dart.definiteFunctionType(core.String, []),
      pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
      queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
      isAbsolute: dart.definiteFunctionType(core.bool, []),
      hasScheme: dart.definiteFunctionType(core.bool, []),
      hasAuthority: dart.definiteFunctionType(core.bool, []),
      hasPort: dart.definiteFunctionType(core.bool, []),
      hasQuery: dart.definiteFunctionType(core.bool, []),
      hasFragment: dart.definiteFunctionType(core.bool, []),
      hasEmptyPath: dart.definiteFunctionType(core.bool, []),
      hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
      origin: dart.definiteFunctionType(core.String, []),
      [_isPathAbsolute]: dart.definiteFunctionType(core.bool, []),
      data: dart.definiteFunctionType(core.UriData, [])
    }),
    methods: () => ({
      replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
      removeFragment: dart.definiteFunctionType(core.Uri, []),
      normalizePath: dart.definiteFunctionType(core.Uri, []),
      [_mergePaths]: dart.definiteFunctionType(core.String, [core.String, core.String]),
      resolve: dart.definiteFunctionType(core.Uri, [core.String]),
      resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
      toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
      [_toFilePath]: dart.definiteFunctionType(core.String, []),
      [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
    }),
    sfields: () => ({
      _SPACE: core.int,
      _DOUBLE_QUOTE: core.int,
      _NUMBER_SIGN: core.int,
      _PERCENT: core.int,
      _ASTERISK: core.int,
      _PLUS: core.int,
      _DOT: core.int,
      _SLASH: core.int,
      _ZERO: core.int,
      _NINE: core.int,
      _COLON: core.int,
      _LESS: core.int,
      _GREATER: core.int,
      _QUESTION: core.int,
      _AT_SIGN: core.int,
      _UPPER_CASE_A: core.int,
      _UPPER_CASE_F: core.int,
      _UPPER_CASE_Z: core.int,
      _LEFT_BRACKET: core.int,
      _BACKSLASH: core.int,
      _RIGHT_BRACKET: core.int,
      _LOWER_CASE_A: core.int,
      _LOWER_CASE_F: core.int,
      _LOWER_CASE_Z: core.int,
      _BAR: core.int,
      _hexDigits: core.String,
      _unreservedTable: ListOfint(),
      _unreserved2396Table: ListOfint(),
      _encodeFullTable: ListOfint(),
      _schemeTable: ListOfint(),
      _schemeLowerTable: ListOfint(),
      _subDelimitersTable: ListOfint(),
      _genDelimitersTable: ListOfint(),
      _userinfoTable: ListOfint(),
      _regNameTable: ListOfint(),
      _pathCharTable: ListOfint(),
      _pathCharOrSlashTable: ListOfint(),
      _queryCharTable: ListOfint(),
      _needsNoEncoding: core.RegExp
    }),
    sgetters: () => ({
      base: dart.definiteFunctionType(core.Uri, []),
      _isWindows: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
      _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
      _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
      _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
      _checkWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool], [core.int]),
      _checkWindowsDriveLetter: dart.definiteFunctionType(dart.dynamic, [core.int, core.bool]),
      _makeFileUri: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
      _makeWindowsFileUrl: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
      _makePort: dart.definiteFunctionType(core.int, [core.int, core.String]),
      _makeHost: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.bool]),
      _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
      _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
      _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
      _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
      _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
      _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
      _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
      _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
      _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
      _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
      _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
      _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
      _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
      _createList: dart.definiteFunctionType(core.List, []),
      _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
      _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
      _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
      _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
      _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
    }),
    names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
  });
  core.Uri._SPACE = 32;
  core.Uri._DOUBLE_QUOTE = 34;
  core.Uri._NUMBER_SIGN = 35;
  core.Uri._PERCENT = 37;
  core.Uri._ASTERISK = 42;
  core.Uri._PLUS = 43;
  core.Uri._DOT = 46;
  core.Uri._SLASH = 47;
  core.Uri._ZERO = 48;
  core.Uri._NINE = 57;
  core.Uri._COLON = 58;
  core.Uri._LESS = 60;
  core.Uri._GREATER = 62;
  core.Uri._QUESTION = 63;
  core.Uri._AT_SIGN = 64;
  core.Uri._UPPER_CASE_A = 65;
  core.Uri._UPPER_CASE_F = 70;
  core.Uri._UPPER_CASE_Z = 90;
  core.Uri._LEFT_BRACKET = 91;
  core.Uri._BACKSLASH = 92;
  core.Uri._RIGHT_BRACKET = 93;
  core.Uri._LOWER_CASE_A = 97;
  core.Uri._LOWER_CASE_F = 102;
  core.Uri._LOWER_CASE_Z = 122;
  core.Uri._BAR = 124;
  core.Uri._hexDigits = "0123456789ABCDEF";
  core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
  core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
  core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
  core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
  core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
  core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
  core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
  core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
  core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
  core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
  core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
  core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
  dart.defineLazy(core.Uri, {
    get _needsNoEncoding() {
      return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
    }
  });
  const _text = Symbol('_text');
  const _separatorIndices = Symbol('_separatorIndices');
  const _uriCache = Symbol('_uriCache');
  core.UriData = class UriData extends core.Object {
    _(text, separatorIndices, uriCache) {
      this[_text] = text;
      this[_separatorIndices] = separatorIndices;
      this[_uriCache] = uriCache;
    }
    static fromString(content, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let base64 = opts && 'base64' in opts ? opts.base64 : false;
      let buffer = new core.StringBuffer();
      let indices = JSArrayOfint().of([core.UriData._noScheme]);
      let charsetName = null;
      let encodingName = null;
      if (parameters != null) charsetName = parameters[dartx._get]("charset");
      if (encoding == null) {
        if (charsetName != null) {
          encoding = convert.Encoding.getByName(charsetName);
        }
      } else if (charsetName == null) {
        encodingName = encoding.name;
      }
      let t = encoding;
      t == null ? encoding = convert.ASCII : t;
      core.UriData._writeUri(mimeType, encodingName, parameters, buffer, indices);
      indices[dartx.add](buffer.length);
      if (dart.test(base64)) {
        buffer.write(';base64,');
        indices[dartx.add](dart.notNull(buffer.length) - 1);
        buffer.write(encoding.fuse(core.String)(convert.BASE64).encode(content));
      } else {
        buffer.write(',');
        core.UriData._uriEncodeBytes(core.UriData._uricTable, encoding.encode(content), buffer);
      }
      return new core.UriData._(buffer.toString(), indices, null);
    }
    static fromBytes(bytes, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
      let buffer = new core.StringBuffer();
      let indices = JSArrayOfint().of([core.UriData._noScheme]);
      core.UriData._writeUri(core.String._check(mimeType), null, parameters, buffer, indices);
      indices[dartx.add](buffer.length);
      if (dart.test(percentEncoded)) {
        buffer.write(',');
        core.UriData._uriEncodeBytes(core.UriData._uricTable, bytes, buffer);
      } else {
        buffer.write(';base64,');
        indices[dartx.add](dart.notNull(buffer.length) - 1);
        convert.BASE64.encoder.startChunkedConversion(convert.StringConversionSink.fromStringSink(buffer)).addSlice(bytes, 0, bytes[dartx.length], true);
      }
      return new core.UriData._(buffer.toString(), indices, null);
    }
    static fromUri(uri) {
      if (uri.scheme != "data") {
        dart.throw(new core.ArgumentError.value(uri, "uri", "Scheme must be 'data'"));
      }
      if (dart.test(uri.hasAuthority)) {
        dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have authority"));
      }
      if (dart.test(uri.hasFragment)) {
        dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have a fragment part"));
      }
      if (!dart.test(uri.hasQuery)) {
        return core.UriData._parse(uri.path, 0, uri);
      }
      return core.UriData._parse(dart.str`${uri}`, 5, uri);
    }
    static _writeUri(mimeType, charsetName, parameters, buffer, indices) {
      if (mimeType == null || mimeType == "text/plain") {
        mimeType = "";
      }
      if (dart.test(mimeType[dartx.isEmpty]) || core.identical(mimeType, "application/octet-stream")) {
        buffer.write(mimeType);
      } else {
        let slashIndex = core.UriData._validateMimeType(mimeType);
        if (dart.notNull(slashIndex) < 0) {
          dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
        }
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
        buffer.write("/");
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
      }
      if (charsetName != null) {
        if (indices != null) {
          indices[dartx.add](buffer.length);
          indices[dartx.add](dart.notNull(buffer.length) + 8);
        }
        buffer.write(";charset=");
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
      }
      dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
        if (dart.test(key[dartx.isEmpty])) {
          dart.throw(new core.ArgumentError.value("", "Parameter names must not be empty"));
        }
        if (dart.test(value[dartx.isEmpty])) {
          dart.throw(new core.ArgumentError.value("", "Parameter values must not be empty", dart.str`parameters["${key}"]`));
        }
        if (indices != null) indices[dartx.add](buffer.length);
        buffer.write(';');
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
        if (indices != null) indices[dartx.add](buffer.length);
        buffer.write('=');
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
      }, StringAndStringTovoid$())));
    }
    static _validateMimeType(mimeType) {
      let slashIndex = -1;
      for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
        let char = mimeType[dartx.codeUnitAt](i);
        if (char != core.Uri._SLASH) continue;
        if (slashIndex < 0) {
          slashIndex = i;
          continue;
        }
        return -1;
      }
      return slashIndex;
    }
    static parse(uri) {
      if (!dart.test(uri[dartx.startsWith]("data:"))) {
        dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
      }
      return core.UriData._parse(uri, 5, null);
    }
    get uri() {
      if (this[_uriCache] != null) return this[_uriCache];
      let path = this[_text];
      let query = null;
      let colonIndex = this[_separatorIndices][dartx._get](0);
      let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
      let end = null;
      if (dart.notNull(queryIndex) >= 0) {
        query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
        end = queryIndex;
      }
      path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
      this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
      return this[_uriCache];
    }
    get mimeType() {
      let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
      let end = this[_separatorIndices][dartx._get](1);
      if (start == end) return "text/plain";
      return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
    }
    get charset() {
      let parameterStart = 1;
      let parameterEnd = dart.notNull(this[_separatorIndices][dartx.length]) - 1;
      if (dart.test(this.isBase64)) {
        parameterEnd = parameterEnd - 1;
      }
      for (let i = parameterStart; i < parameterEnd; i = i + 2) {
        let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
        let keyEnd = this[_separatorIndices][dartx._get](i + 1);
        if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
          return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
        }
      }
      return "US-ASCII";
    }
    get isBase64() {
      return this[_separatorIndices][dartx.length][dartx.isOdd];
    }
    get contentText() {
      return this[_text][dartx.substring](dart.notNull(this[_separatorIndices][dartx.last]) + 1);
    }
    contentAsBytes() {
      let text = this[_text];
      let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
      if (dart.test(this.isBase64)) {
        return convert.BASE64.decoder.convert(text, start);
      }
      let percent = 37;
      let length = dart.notNull(text[dartx.length]) - start;
      for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (codeUnit == percent) {
          i = i + 2;
          length = length - 2;
        }
      }
      let result = typed_data.Uint8List.new(length);
      if (length == text[dartx.length]) {
        result[dartx.setRange](0, length, text[dartx.codeUnits], start);
        return result;
      }
      let index = 0;
      for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (codeUnit != percent) {
          result[dartx._set](index++, codeUnit);
        } else {
          if (i + 2 < dart.notNull(text[dartx.length])) {
            let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
            let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
            if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
              let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
              result[dartx._set](index++, byte);
              i = i + 2;
              continue;
            }
          }
          dart.throw(new core.FormatException("Invalid percent escape", text, i));
        }
      }
      dart.assert(index == result[dartx.length]);
      return result;
    }
    contentAsString(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
      if (encoding == null) {
        let charset = this.charset;
        encoding = convert.Encoding.getByName(charset);
        if (encoding == null) {
          dart.throw(new core.UnsupportedError(dart.str`Unknown charset: ${charset}`));
        }
      }
      let text = this[_text];
      let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
      if (dart.test(this.isBase64)) {
        let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
        return converter.convert(text[dartx.substring](start));
      }
      return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
    }
    get parameters() {
      let result = dart.map({}, core.String, core.String);
      for (let i = 3; i < dart.notNull(this[_separatorIndices][dartx.length]); i = i + 2) {
        let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
        let equals = this[_separatorIndices][dartx._get](i - 1);
        let end = this[_separatorIndices][dartx._get](i);
        let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
        let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
        result[dartx._set](key, value);
      }
      return result;
    }
    static _parse(text, start, sourceUri) {
      dart.assert(start == 0 || start == 5);
      dart.assert(start == 5 == text[dartx.startsWith]("data:"));
      let comma = 44;
      let slash = 47;
      let semicolon = 59;
      let equals = 61;
      let indices = JSArrayOfint().of([dart.notNull(start) - 1]);
      let slashIndex = -1;
      let char = null;
      let i = start;
      for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
        char = text[dartx.codeUnitAt](i);
        if (dart.equals(char, comma) || dart.equals(char, semicolon)) break;
        if (dart.equals(char, slash)) {
          if (dart.notNull(slashIndex) < 0) {
            slashIndex = i;
            continue;
          }
          dart.throw(new core.FormatException("Invalid MIME type", text, i));
        }
      }
      if (dart.notNull(slashIndex) < 0 && dart.notNull(i) > dart.notNull(start)) {
        dart.throw(new core.FormatException("Invalid MIME type", text, i));
      }
      while (!dart.equals(char, comma)) {
        indices[dartx.add](i);
        i = dart.notNull(i) + 1;
        let equalsIndex = -1;
        for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
          char = text[dartx.codeUnitAt](i);
          if (dart.equals(char, equals)) {
            if (dart.notNull(equalsIndex) < 0) equalsIndex = i;
          } else if (dart.equals(char, semicolon) || dart.equals(char, comma)) {
            break;
          }
        }
        if (dart.notNull(equalsIndex) >= 0) {
          indices[dartx.add](equalsIndex);
        } else {
          let lastSeparator = indices[dartx.last];
          if (!dart.equals(char, comma) || i != dart.notNull(lastSeparator) + 7 || !dart.test(text[dartx.startsWith]("base64", dart.notNull(lastSeparator) + 1))) {
            dart.throw(new core.FormatException("Expecting '='", text, i));
          }
          break;
        }
      }
      indices[dartx.add](i);
      return new core.UriData._(text, indices, sourceUri);
    }
    static _uriEncodeBytes(canonicalTable, bytes, buffer) {
      let byteOr = 0;
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byte = bytes[dartx._get](i);
        byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
        if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
          buffer.writeCharCode(byte);
        } else {
          buffer.writeCharCode(core.Uri._PERCENT);
          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
        }
      }
      if ((dart.notNull(byteOr) & ~255) != 0) {
        for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
          let byte = bytes[dartx._get](i);
          if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
            dart.throw(new core.ArgumentError.value(byte, "non-byte value"));
          }
        }
      }
    }
    toString() {
      return this[_separatorIndices][dartx._get](0) == core.UriData._noScheme ? dart.str`data:${this[_text]}` : this[_text];
    }
  };
  dart.defineNamedConstructor(core.UriData, '_');
  dart.setSignature(core.UriData, {
    constructors: () => ({
      _: dart.definiteFunctionType(core.UriData, [core.String, ListOfint(), core.Uri]),
      fromString: dart.definiteFunctionType(core.UriData, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
      fromBytes: dart.definiteFunctionType(core.UriData, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic}),
      fromUri: dart.definiteFunctionType(core.UriData, [core.Uri])
    }),
    fields: () => ({
      [_text]: core.String,
      [_separatorIndices]: ListOfint(),
      [_uriCache]: core.Uri
    }),
    getters: () => ({
      uri: dart.definiteFunctionType(core.Uri, []),
      mimeType: dart.definiteFunctionType(core.String, []),
      charset: dart.definiteFunctionType(core.String, []),
      isBase64: dart.definiteFunctionType(core.bool, []),
      contentText: dart.definiteFunctionType(core.String, []),
      parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
    }),
    methods: () => ({
      contentAsBytes: dart.definiteFunctionType(core.List$(core.int), []),
      contentAsString: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding})
    }),
    sfields: () => ({
      _noScheme: core.int,
      _tokenCharTable: ListOfint(),
      _uricTable: ListOfint()
    }),
    statics: () => ({
      _writeUri: dart.definiteFunctionType(dart.void, [core.String, core.String, MapOfString$String(), core.StringBuffer, core.List]),
      _validateMimeType: dart.definiteFunctionType(core.int, [core.String]),
      parse: dart.definiteFunctionType(core.UriData, [core.String]),
      _parse: dart.definiteFunctionType(core.UriData, [core.String, core.int, core.Uri]),
      _uriEncodeBytes: dart.definiteFunctionType(dart.void, [ListOfint(), ListOfint(), core.StringSink])
    }),
    names: ['_writeUri', '_validateMimeType', 'parse', '_parse', '_uriEncodeBytes']
  });
  core.UriData._noScheme = -1;
  core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
  core.UriData._uricTable = core.Uri._queryCharTable;
  developer.debugger = function(opts) {
    let when = opts && 'when' in opts ? opts.when : true;
    let message = opts && 'message' in opts ? opts.message : null;
    if (dart.test(when)) {
      debugger;
    }
    return when;
  };
  dart.fn(developer.debugger, __Tobool());
  developer.inspect = function(object) {
    return object;
  };
  dart.fn(developer.inspect, ObjectToObject());
  developer.log = function(message, opts) {
    let time = opts && 'time' in opts ? opts.time : null;
    let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
    let level = opts && 'level' in opts ? opts.level : 0;
    let name = opts && 'name' in opts ? opts.name : '';
    let zone = opts && 'zone' in opts ? opts.zone : null;
    let error = opts && 'error' in opts ? opts.error : null;
    let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
  };
  dart.fn(developer.log, String__Tovoid$());
  dart.defineLazy(developer, {
    get _extensions() {
      return MapOfString$ServiceExtensionHandler().new();
    }
  });
  developer._clockValue = 0;
  const _result = Symbol('_result');
  const _errorCode = Symbol('_errorCode');
  const _errorDetail = Symbol('_errorDetail');
  const _isError = Symbol('_isError');
  const _toString = Symbol('_toString');
  developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
    result(result) {
      this[_result] = result;
      this[_errorCode] = null;
      this[_errorDetail] = null;
      if (!(typeof this[_result] == 'string')) {
        dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
      }
    }
    error(errorCode, errorDetail) {
      this[_result] = null;
      this[_errorCode] = errorCode;
      this[_errorDetail] = errorDetail;
      developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
      if (!(typeof this[_errorDetail] == 'string')) {
        dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
      }
    }
    static _errorCodeMessage(errorCode) {
      developer.ServiceExtensionResponse._validateErrorCode(errorCode);
      if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
        return "Invalid params";
      }
      return "Server error";
    }
    static _validateErrorCode(errorCode) {
      if (!(typeof errorCode == 'number')) {
        dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
      }
      if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
        return;
      }
      if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
        return;
      }
      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
    }
    [_isError]() {
      return this[_errorCode] != null && this[_errorDetail] != null;
    }
    [_toString]() {
      if (this[_result] != null) {
        return this[_result];
      } else {
        dart.assert(this[_errorCode] != null);
        dart.assert(this[_errorDetail] != null);
        return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
      }
    }
  };
  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
  dart.setSignature(developer.ServiceExtensionResponse, {
    constructors: () => ({
      result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
      error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
    }),
    fields: () => ({
      [_result]: core.String,
      [_errorCode]: core.int,
      [_errorDetail]: core.String
    }),
    methods: () => ({
      [_isError]: dart.definiteFunctionType(core.bool, []),
      [_toString]: dart.definiteFunctionType(core.String, [])
    }),
    sfields: () => ({
      kInvalidParams: core.int,
      kExtensionError: core.int,
      kExtensionErrorMax: core.int,
      kExtensionErrorMin: core.int,
      invalidParams: core.int,
      extensionError: core.int,
      extensionErrorMax: core.int,
      extensionErrorMin: core.int
    }),
    statics: () => ({
      _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
      _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
    }),
    names: ['_errorCodeMessage', '_validateErrorCode']
  });
  developer.ServiceExtensionResponse.invalidParams = -32602;
  developer.ServiceExtensionResponse.extensionError = -32000;
  developer.ServiceExtensionResponse.extensionErrorMax = -32000;
  developer.ServiceExtensionResponse.extensionErrorMin = -32016;
  dart.defineLazy(developer.ServiceExtensionResponse, {
    get kInvalidParams() {
      return developer.ServiceExtensionResponse.invalidParams;
    },
    get kExtensionError() {
      return developer.ServiceExtensionResponse.extensionError;
    },
    get kExtensionErrorMax() {
      return developer.ServiceExtensionResponse.extensionErrorMax;
    },
    get kExtensionErrorMin() {
      return developer.ServiceExtensionResponse.extensionErrorMin;
    }
  });
  developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
  developer.registerExtension = function(method, handler) {
    if (!(typeof method == 'string')) {
      dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
    }
    if (!dart.test(method[dartx.startsWith]('ext.'))) {
      dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
    }
    if (developer._lookupExtension(method) != null) {
      dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
    }
    if (!developer.ServiceExtensionHandler.is(handler)) {
      dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
    }
    developer._registerExtension(method, handler);
  };
  dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
  developer.postEvent = function(eventKind, eventData) {
    if (!(typeof eventKind == 'string')) {
      dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
    }
    if (!core.Map.is(eventData)) {
      dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
    }
    let eventDataAsString = convert.JSON.encode(eventData);
    developer._postEvent(eventKind, eventDataAsString);
  };
  dart.fn(developer.postEvent, StringAndMapTovoid());
  developer._postEvent = function(eventKind, eventData) {
  };
  dart.fn(developer._postEvent, StringAndStringTodynamic());
  developer._lookupExtension = function(method) {
    return developer._extensions[dartx._get](method);
  };
  dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
  developer._registerExtension = function(method, handler) {
    developer._extensions[dartx._set](method, handler);
  };
  dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
  developer.UserTag = class UserTag extends core.Object {
    static new(label) {
      return developer._FakeUserTag.new(label);
    }
    static get defaultTag() {
      return developer._FakeUserTag._defaultTag;
    }
  };
  dart.setSignature(developer.UserTag, {
    constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
    sfields: () => ({MAX_USER_TAGS: core.int}),
    sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
  });
  developer.UserTag.MAX_USER_TAGS = 64;
  developer._FakeUserTag = class _FakeUserTag extends core.Object {
    real(label) {
      this.label = label;
    }
    static new(label) {
      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
      if (existingTag != null) {
        return developer._FakeUserTag._check(existingTag);
      }
      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
      }
      let instance = new developer._FakeUserTag.real(label);
      developer._FakeUserTag._instances[dartx._set](label, instance);
      return instance;
    }
    makeCurrent() {
      let old = developer._currentTag;
      developer._currentTag = this;
      return old;
    }
  };
  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
  dart.setSignature(developer._FakeUserTag, {
    constructors: () => ({
      real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
      new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
    }),
    fields: () => ({label: core.String}),
    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
    sfields: () => ({
      _instances: core.Map,
      _defaultTag: developer.UserTag
    })
  });
  dart.defineLazy(developer._FakeUserTag, {
    get _instances() {
      return dart.map();
    },
    set _instances(_) {},
    get _defaultTag() {
      return developer._FakeUserTag.new('Default');
    }
  });
  dart.defineLazy(developer, {
    get _currentTag() {
      return developer._FakeUserTag._defaultTag;
    },
    set _currentTag(_) {}
  });
  developer.getCurrentTag = function() {
    return developer._currentTag;
  };
  dart.fn(developer.getCurrentTag, VoidToUserTag());
  developer.Metric = class Metric extends core.Object {
    new(name, description) {
      this.name = name;
      this.description = description;
      if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
        dart.throw(new core.ArgumentError('Invalid Metric name.'));
      }
    }
  };
  dart.setSignature(developer.Metric, {
    constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
    fields: () => ({
      name: core.String,
      description: core.String
    })
  });
  const _value$0 = Symbol('_value');
  const _toJSON = Symbol('_toJSON');
  developer.Gauge = class Gauge extends developer.Metric {
    get value() {
      return this[_value$0];
    }
    set value(v) {
      if (dart.notNull(v) < dart.notNull(this.min)) {
        v = this.min;
      } else if (dart.notNull(v) > dart.notNull(this.max)) {
        v = this.max;
      }
      this[_value$0] = v;
    }
    new(name, description, min, max) {
      this.min = min;
      this.max = max;
      this[_value$0] = null;
      super.new(name, description);
      if (!(typeof this.min == 'number')) {
        dart.throw(new core.ArgumentError('min must be a double'));
      }
      if (!(typeof this.max == 'number')) {
        dart.throw(new core.ArgumentError('max must be a double'));
      }
      if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
        dart.throw(new core.ArgumentError('min must be less than max'));
      }
      this[_value$0] = this.min;
    }
    [_toJSON]() {
      let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
      return map;
    }
  };
  dart.setSignature(developer.Gauge, {
    constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
    fields: () => ({
      min: core.double,
      max: core.double,
      [_value$0]: core.double
    }),
    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
  });
  developer.Counter = class Counter extends developer.Metric {
    new(name, description) {
      this[_value$0] = 0.0;
      super.new(name, description);
    }
    get value() {
      return this[_value$0];
    }
    set value(v) {
      this[_value$0] = v;
    }
    [_toJSON]() {
      let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
      return map;
    }
  };
  dart.setSignature(developer.Counter, {
    constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
    fields: () => ({[_value$0]: core.double}),
    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
  });
  developer.Metrics = class Metrics extends core.Object {
    static register(metric) {
      if (!developer.Metric.is(metric)) {
        dart.throw(new core.ArgumentError('metric must be a Metric'));
      }
      if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
        dart.throw(new core.ArgumentError('Registered metrics have unique names'));
      }
      developer.Metrics._metrics[dartx._set](metric.name, metric);
    }
    static deregister(metric) {
      if (!developer.Metric.is(metric)) {
        dart.throw(new core.ArgumentError('metric must be a Metric'));
      }
      developer.Metrics._metrics[dartx.remove](metric.name);
    }
    static _printMetric(id) {
      let metric = developer.Metrics._metrics[dartx._get](id);
      if (metric == null) {
        return null;
      }
      return convert.JSON.encode(metric[_toJSON]());
    }
    static _printMetrics() {
      let metrics = [];
      for (let metric of developer.Metrics._metrics[dartx.values]) {
        metrics[dartx.add](metric[_toJSON]());
      }
      let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
      return convert.JSON.encode(map);
    }
  };
  dart.setSignature(developer.Metrics, {
    sfields: () => ({_metrics: MapOfString$Metric()}),
    statics: () => ({
      register: dart.definiteFunctionType(dart.void, [developer.Metric]),
      deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
      _printMetric: dart.definiteFunctionType(core.String, [core.String]),
      _printMetrics: dart.definiteFunctionType(core.String, [])
    }),
    names: ['register', 'deregister', '_printMetric', '_printMetrics']
  });
  dart.defineLazy(developer.Metrics, {
    get _metrics() {
      return MapOfString$Metric().new();
    }
  });
  developer._isProduct = false;
  developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
  developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
  const _appendArguments = Symbol('_appendArguments');
  developer.Timeline = class Timeline extends core.Object {
    static startSync(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      if (!dart.test(developer._isDartStreamEnabled())) {
        developer.Timeline._stack[dartx.add](null);
        return;
      }
      let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
      if (core.Map.is(arguments$)) {
        block[_appendArguments](arguments$);
      }
      developer.Timeline._stack[dartx.add](block);
    }
    static finishSync() {
      if (developer._isProduct) {
        return;
      }
      if (developer.Timeline._stack[dartx.length] == 0) {
        dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
      }
      let block = developer.Timeline._stack[dartx.removeLast]();
      if (block == null) {
        return;
      }
      block.finish();
    }
    static instantSync(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      if (!dart.test(developer._isDartStreamEnabled())) {
        return;
      }
      let instantArguments = null;
      if (core.Map.is(arguments$)) {
        instantArguments = core.Map.from(arguments$);
      }
      developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
    }
    static timeSync(name, func, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      developer.Timeline.startSync(name, {arguments: arguments$});
      try {
        return func();
      } finally {
        developer.Timeline.finishSync();
      }
    }
    static get now() {
      return developer._getTraceClock();
    }
  };
  dart.setSignature(developer.Timeline, {
    sfields: () => ({
      _stack: ListOf_SyncBlock(),
      _isolateId: core.int,
      _isolateIdString: core.String
    }),
    sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
    statics: () => ({
      startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      finishSync: dart.definiteFunctionType(dart.void, []),
      instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
    }),
    names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
  });
  dart.defineLazy(developer.Timeline, {
    get _stack() {
      return ListOf_SyncBlock().new();
    },
    get _isolateId() {
      return developer._getIsolateNum();
    },
    get _isolateIdString() {
      return dart.toString(developer.Timeline._isolateId);
    }
  });
  const _stack = Symbol('_stack');
  const _taskId = Symbol('_taskId');
  const _start$1 = Symbol('_start');
  const _finish = Symbol('_finish');
  developer.TimelineTask = class TimelineTask extends core.Object {
    new() {
      this[_stack] = JSArrayOf_AsyncBlock().of([]);
      this[_taskId] = developer._getNextAsyncId();
    }
    withTaskId(taskId) {
      this[_stack] = JSArrayOf_AsyncBlock().of([]);
      this[_taskId] = taskId;
      if (!(typeof taskId == 'number')) {
        dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
      }
    }
    start(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      let block = new developer._AsyncBlock._(name, this[_taskId]);
      if (core.Map.is(arguments$)) {
        block[_appendArguments](arguments$);
      }
      this[_stack][dartx.add](block);
      block[_start$1]();
    }
    instant(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      let instantArguments = null;
      if (core.Map.is(arguments$)) {
        instantArguments = core.Map.from(arguments$);
      }
      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
    }
    finish() {
      if (developer._isProduct) {
        return;
      }
      if (this[_stack][dartx.length] == 0) {
        dart.throw(new core.StateError('Uneven calls to start and finish'));
      }
      let block = this[_stack][dartx.removeLast]();
      block[_finish]();
    }
    pass() {
      if (dart.notNull(this[_stack][dartx.length]) > 0) {
        dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
      }
      let r = this[_taskId];
      return r;
    }
  };
  dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
  dart.setSignature(developer.TimelineTask, {
    constructors: () => ({
      new: dart.definiteFunctionType(developer.TimelineTask, []),
      withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
    }),
    fields: () => ({
      [_taskId]: core.int,
      [_stack]: ListOf_AsyncBlock()
    }),
    methods: () => ({
      start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      finish: dart.definiteFunctionType(dart.void, []),
      pass: dart.definiteFunctionType(core.int, [])
    })
  });
  const _arguments$ = Symbol('_arguments');
  developer._AsyncBlock = class _AsyncBlock extends core.Object {
    _(name, taskId) {
      this.name = name;
      this[_taskId] = taskId;
      this.category = 'Dart';
      this[_arguments$] = null;
    }
    [_start$1]() {
      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
    }
    [_finish]() {
      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
    }
    [_appendArguments](arguments$) {
      if (this[_arguments$] == null) {
        this[_arguments$] = dart.map();
      }
      this[_arguments$][dartx.addAll](arguments$);
    }
  };
  dart.defineNamedConstructor(developer._AsyncBlock, '_');
  dart.setSignature(developer._AsyncBlock, {
    constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
    fields: () => ({
      category: core.String,
      name: core.String,
      [_taskId]: core.int,
      [_arguments$]: core.Map
    }),
    methods: () => ({
      [_start$1]: dart.definiteFunctionType(dart.void, []),
      [_finish]: dart.definiteFunctionType(dart.void, []),
      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
    })
  });
  const _startCpu = Symbol('_startCpu');
  developer._SyncBlock = class _SyncBlock extends core.Object {
    _(name, start, startCpu) {
      this.name = name;
      this[_start$1] = start;
      this[_startCpu] = startCpu;
      this.category = 'Dart';
      this[_arguments$] = null;
    }
    finish() {
      developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
    }
    [_appendArguments](arguments$) {
      if (arguments$ == null) {
        return;
      }
      if (this[_arguments$] == null) {
        this[_arguments$] = dart.map();
      }
      this[_arguments$][dartx.addAll](arguments$);
    }
  };
  dart.defineNamedConstructor(developer._SyncBlock, '_');
  dart.setSignature(developer._SyncBlock, {
    constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
    fields: () => ({
      category: core.String,
      name: core.String,
      [_arguments$]: core.Map,
      [_start$1]: core.int,
      [_startCpu]: core.int
    }),
    methods: () => ({
      finish: dart.definiteFunctionType(dart.void, []),
      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
    })
  });
  developer._fastPathArguments = null;
  developer._argumentsAsJson = function(arguments$) {
    if (arguments$ == null || arguments$[dartx.length] == 0) {
      if (developer._fastPathArguments == null) {
        developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
      }
      return developer._fastPathArguments;
    }
    arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
    return convert.JSON.encode(arguments$);
  };
  dart.fn(developer._argumentsAsJson, MapToString());
  developer._isDartStreamEnabled = function() {
    return false;
  };
  dart.fn(developer._isDartStreamEnabled, VoidTobool());
  developer._getNextAsyncId = function() {
    return 0;
  };
  dart.fn(developer._getNextAsyncId, VoidToint());
  developer._getTraceClock = function() {
    let x = developer._clockValue;
    developer._clockValue = dart.notNull(x) + 1;
    return x;
  };
  dart.fn(developer._getTraceClock, VoidToint());
  developer._getThreadCpuClock = function() {
    return -1;
  };
  dart.fn(developer._getThreadCpuClock, VoidToint());
  developer._getIsolateNum = function() {
    return 0;
  };
  dart.fn(developer._getIsolateNum, VoidToint());
  developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
  };
  dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
  developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
  };
  dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
  developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
  };
  dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
  developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
    new(serverUri) {
      this.majorVersion = developer._getServiceMajorVersion();
      this.minorVersion = developer._getServiceMinorVersion();
      this.serverUri = serverUri;
    }
    toString() {
      if (this.serverUri != null) {
        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
      } else {
        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
      }
    }
  };
  dart.setSignature(developer.ServiceProtocolInfo, {
    constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
    fields: () => ({
      majorVersion: core.int,
      minorVersion: core.int,
      serverUri: core.Uri
    })
  });
  developer.Service = class Service extends core.Object {
    static getInfo() {
      return dart.async(function*() {
        let receivePort = isolate.RawReceivePort.new();
        let uriCompleter = CompleterOfUri().new();
        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
        developer._getServerInfo(receivePort.sendPort);
        let uri = (yield uriCompleter.future);
        receivePort.close();
        return new developer.ServiceProtocolInfo(uri);
      }, developer.ServiceProtocolInfo);
    }
    static controlWebServer(opts) {
      return dart.async(function*(opts) {
        let enable = opts && 'enable' in opts ? opts.enable : false;
        if (!(typeof enable == 'boolean')) {
          dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
        }
        let receivePort = isolate.RawReceivePort.new();
        let uriCompleter = CompleterOfUri().new();
        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
        developer._webServerControl(receivePort.sendPort, enable);
        let uri = (yield uriCompleter.future);
        receivePort.close();
        return new developer.ServiceProtocolInfo(uri);
      }, developer.ServiceProtocolInfo, opts);
    }
  };
  dart.setSignature(developer.Service, {
    statics: () => ({
      getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
    }),
    names: ['getInfo', 'controlWebServer']
  });
  developer._getServerInfo = function(sp) {
    sp.send(null);
  };
  dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
  developer._webServerControl = function(sp, enable) {
    sp.send(null);
  };
  dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
  developer._getServiceMajorVersion = function() {
    return 0;
  };
  dart.fn(developer._getServiceMajorVersion, VoidToint());
  developer._getServiceMinorVersion = function() {
    return 0;
  };
  dart.fn(developer._getServiceMinorVersion, VoidToint());
  io.BytesBuilder = class BytesBuilder extends core.Object {
    static new(opts) {
      let copy = opts && 'copy' in opts ? opts.copy : true;
      if (dart.test(copy)) {
        return new io._CopyingBytesBuilder();
      } else {
        return new io._BytesBuilder();
      }
    }
  };
  dart.setSignature(io.BytesBuilder, {
    constructors: () => ({new: dart.definiteFunctionType(io.BytesBuilder, [], {copy: core.bool})})
  });
  const _length$2 = Symbol('_length');
  const _buffer$ = Symbol('_buffer');
  const _pow2roundup = Symbol('_pow2roundup');
  io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
    new() {
      this[_length$2] = 0;
      this[_buffer$] = null;
    }
    add(bytes) {
      let bytesLength = bytes[dartx.length];
      if (bytesLength == 0) return;
      let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
      if (this[_buffer$] == null) {
        let size = this[_pow2roundup](required);
        size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
        this[_buffer$] = typed_data.Uint8List.new(size);
      } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
        let size = dart.notNull(this[_pow2roundup](required)) * 2;
        let newBuffer = typed_data.Uint8List.new(size);
        newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
        this[_buffer$] = newBuffer;
      }
      dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
      if (typed_data.Uint8List.is(bytes)) {
        this[_buffer$][dartx.setRange](this[_length$2], required, bytes);
      } else {
        for (let i = 0; i < dart.notNull(bytesLength); i++) {
          this[_buffer$][dartx._set](dart.notNull(this[_length$2]) + i, bytes[dartx._get](i));
        }
      }
      this[_length$2] = required;
    }
    addByte(byte) {
      this.add(JSArrayOfint().of([byte]));
    }
    takeBytes() {
      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
      let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
      this.clear();
      return buffer;
    }
    toBytes() {
      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
      return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
    }
    get length() {
      return this[_length$2];
    }
    get isEmpty() {
      return this[_length$2] == 0;
    }
    get isNotEmpty() {
      return this[_length$2] != 0;
    }
    clear() {
      this[_length$2] = 0;
      this[_buffer$] = null;
    }
    [_pow2roundup](x) {
      x = dart.notNull(x) - 1;
      x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
      x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
      x = (dart.notNull(x) | x[dartx['>>']](4)) >>> 0;
      x = (dart.notNull(x) | x[dartx['>>']](8)) >>> 0;
      x = (dart.notNull(x) | x[dartx['>>']](16)) >>> 0;
      return dart.notNull(x) + 1;
    }
  };
  io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
  dart.setSignature(io._CopyingBytesBuilder, {
    fields: () => ({
      [_length$2]: core.int,
      [_buffer$]: typed_data.Uint8List
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addByte: dart.definiteFunctionType(dart.void, [core.int]),
      takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
      toBytes: dart.definiteFunctionType(core.List$(core.int), []),
      clear: dart.definiteFunctionType(dart.void, []),
      [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
    }),
    sfields: () => ({_INIT_SIZE: core.int})
  });
  io._CopyingBytesBuilder._INIT_SIZE = 1024;
  const _chunks = Symbol('_chunks');
  io._BytesBuilder = class _BytesBuilder extends core.Object {
    new() {
      this[_chunks] = JSArrayOfListOfint().of([]);
      this[_length$2] = 0;
    }
    add(bytes) {
      if (!typed_data.Uint8List.is(bytes)) {
        bytes = typed_data.Uint8List.fromList(bytes);
      }
      this[_chunks][dartx.add](bytes);
      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
    }
    addByte(byte) {
      this.add(JSArrayOfint().of([byte]));
    }
    takeBytes() {
      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
      if (this[_chunks][dartx.length] == 1) {
        let buffer = this[_chunks][dartx.single];
        this.clear();
        return buffer;
      }
      let buffer = typed_data.Uint8List.new(this[_length$2]);
      let offset = 0;
      for (let chunk of this[_chunks]) {
        buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
        offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
      }
      this.clear();
      return buffer;
    }
    toBytes() {
      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
      let buffer = typed_data.Uint8List.new(this[_length$2]);
      let offset = 0;
      for (let chunk of this[_chunks]) {
        buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
        offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
      }
      return buffer;
    }
    get length() {
      return this[_length$2];
    }
    get isEmpty() {
      return this[_length$2] == 0;
    }
    get isNotEmpty() {
      return this[_length$2] != 0;
    }
    clear() {
      this[_length$2] = 0;
      this[_chunks][dartx.clear]();
    }
  };
  io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
  dart.setSignature(io._BytesBuilder, {
    fields: () => ({
      [_length$2]: core.int,
      [_chunks]: ListOfListOfint()
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addByte: dart.definiteFunctionType(dart.void, [core.int]),
      takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
      toBytes: dart.definiteFunctionType(core.List$(core.int), []),
      clear: dart.definiteFunctionType(dart.void, [])
    })
  });
  io._SUCCESS_RESPONSE = 0;
  io._ILLEGAL_ARGUMENT_RESPONSE = 1;
  io._OSERROR_RESPONSE = 2;
  io._FILE_CLOSED_RESPONSE = 3;
  io._ERROR_RESPONSE_ERROR_TYPE = 0;
  io._OSERROR_RESPONSE_ERROR_CODE = 1;
  io._OSERROR_RESPONSE_MESSAGE = 2;
  io._isErrorResponse = function(response) {
    return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
  };
  dart.fn(io._isErrorResponse, dynamicTobool$());
  io._exceptionFromResponse = function(response, message, path) {
    dart.assert(io._isErrorResponse(response));
    switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
      case io._ILLEGAL_ARGUMENT_RESPONSE:
      {
        return new core.ArgumentError();
      }
      case io._OSERROR_RESPONSE:
      {
        let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
        return new io.FileSystemException(message, path, err);
      }
      case io._FILE_CLOSED_RESPONSE:
      {
        return new io.FileSystemException("File closed", path);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  };
  dart.fn(io._exceptionFromResponse, dynamicAndStringAndStringTodynamic());
  io.IOException = class IOException extends core.Object {
    toString() {
      return "IOException";
    }
  };
  io.IOException[dart.implements] = () => [core.Exception];
  io.OSError = class OSError extends core.Object {
    new(message, errorCode) {
      if (message === void 0) message = "";
      if (errorCode === void 0) errorCode = io.OSError.noErrorCode;
      this.message = message;
      this.errorCode = errorCode;
    }
    toString() {
      let sb = new core.StringBuffer();
      sb.write("OS Error");
      if (!dart.test(this.message[dartx.isEmpty])) {
        sb.write(": ");
        sb.write(this.message);
        if (this.errorCode != io.OSError.noErrorCode) {
          sb.write(", errno = ");
          sb.write(dart.toString(this.errorCode));
        }
      } else if (this.errorCode != io.OSError.noErrorCode) {
        sb.write(": errno = ");
        sb.write(dart.toString(this.errorCode));
      }
      return sb.toString();
    }
  };
  dart.setSignature(io.OSError, {
    constructors: () => ({new: dart.definiteFunctionType(io.OSError, [], [core.String, core.int])}),
    fields: () => ({
      message: core.String,
      errorCode: core.int
    }),
    sfields: () => ({noErrorCode: core.int})
  });
  io.OSError.noErrorCode = -1;
  io._BufferAndStart = class _BufferAndStart extends core.Object {
    new(buffer, start) {
      this.buffer = buffer;
      this.start = start;
    }
  };
  dart.setSignature(io._BufferAndStart, {
    constructors: () => ({new: dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int])}),
    fields: () => ({
      buffer: core.List,
      start: core.int
    })
  });
  io._ensureFastAndSerializableByteData = function(buffer, start, end) {
    if (typed_data.Uint8List.is(buffer) || typed_data.Int8List.is(buffer)) {
      return new io._BufferAndStart(buffer, start);
    }
    let length = dart.notNull(end) - dart.notNull(start);
    let newBuffer = typed_data.Uint8List.new(length);
    let j = start;
    for (let i = 0; i < length; i++) {
      let value = core.int._check(buffer[dartx._get](j));
      if (!(typeof value == 'number')) {
        dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
      }
      newBuffer[dartx._set](i, value);
      j = dart.notNull(j) + 1;
    }
    return new io._BufferAndStart(newBuffer, 0);
  };
  dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
  io._IOCrypto = class _IOCrypto extends core.Object {
    static getRandomBytes(count) {
      dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
    }
  };
  dart.setSignature(io._IOCrypto, {
    statics: () => ({getRandomBytes: dart.definiteFunctionType(typed_data.Uint8List, [core.int])}),
    names: ['getRandomBytes']
  });
  io._CryptoUtils = class _CryptoUtils extends core.Object {
    static bytesToHex(bytes) {
      let result = new core.StringBuffer();
      for (let part of bytes) {
        result.write(dart.str`${dart.notNull(part) < 16 ? '0' : ''}${part[dartx.toRadixString](16)}`);
      }
      return result.toString();
    }
    static bytesToBase64(bytes, urlSafe, addLineSeparator) {
      if (urlSafe === void 0) urlSafe = false;
      if (addLineSeparator === void 0) addLineSeparator = false;
      let len = bytes[dartx.length];
      if (len == 0) {
        return "";
      }
      let lookup = dart.test(urlSafe) ? io._CryptoUtils._encodeTableUrlSafe : io._CryptoUtils._encodeTable;
      let remainderLength = dart.asInt(len[dartx.remainder](3));
      let chunkLength = dart.notNull(len) - dart.notNull(remainderLength);
      let outputLen = (dart.notNull(len) / 3)[dartx.truncate]() * 4 + (dart.notNull(remainderLength) > 0 ? 4 : 0);
      if (dart.test(addLineSeparator)) {
        outputLen = outputLen + (((outputLen - 1) / io._CryptoUtils.LINE_LENGTH)[dartx.truncate]() << 1 >>> 0);
      }
      let out = ListOfint().new(outputLen);
      let j = 0, i = 0, c = 0;
      while (i < chunkLength) {
        let x = (dart.notNull(bytes[dartx._get](i++)) << 16 & 16777215 | dart.notNull(bytes[dartx._get](i++)) << 8 & 16777215 | dart.notNull(bytes[dartx._get](i++))) >>> 0;
        out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](18)));
        out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 12 & 63));
        out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 6 & 63));
        out[dartx._set](j++, lookup[dartx.codeUnitAt](x & 63));
        if (dart.test(addLineSeparator) && ++c == 19 && j < outputLen - 2) {
          out[dartx._set](j++, io._CryptoUtils.CR);
          out[dartx._set](j++, io._CryptoUtils.LF);
          c = 0;
        }
      }
      if (remainderLength == 1) {
        let x = bytes[dartx._get](i);
        out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
        out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(x) << 4 & 63));
        out[dartx._set](j++, io._CryptoUtils.PAD);
        out[dartx._set](j++, io._CryptoUtils.PAD);
      } else if (remainderLength == 2) {
        let x = bytes[dartx._get](i);
        let y = bytes[dartx._get](i + 1);
        out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
        out[dartx._set](j++, lookup[dartx.codeUnitAt]((dart.notNull(x) << 4 | dart.notNull(y) >> 4) & 63));
        out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(y) << 2 & 63));
        out[dartx._set](j++, io._CryptoUtils.PAD);
      }
      return core.String.fromCharCodes(out);
    }
    static base64StringToBytes(input, ignoreInvalidCharacters) {
      if (ignoreInvalidCharacters === void 0) ignoreInvalidCharacters = true;
      let len = input[dartx.length];
      if (len == 0) {
        return ListOfint().new(0);
      }
      let extrasLen = 0;
      for (let i = 0; i < dart.notNull(len); i++) {
        let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i));
        if (dart.notNull(c) < 0) {
          extrasLen++;
          if (c == -2 && !dart.test(ignoreInvalidCharacters)) {
            dart.throw(new core.FormatException(dart.str`Invalid character: ${input[dartx._get](i)}`));
          }
        }
      }
      if ((dart.notNull(len) - extrasLen)[dartx['%']](4) != 0) {
        dart.throw(new core.FormatException(dart.str`Size of Base 64 characters in Input\n          must be a multiple of 4. Input: ${input}`));
      }
      let padLength = 0;
      for (let i = dart.notNull(len) - 1; i >= 0; i--) {
        let currentCodeUnit = input[dartx.codeUnitAt](i);
        if (dart.notNull(io._CryptoUtils._decodeTable[dartx._get](currentCodeUnit)) > 0) break;
        if (currentCodeUnit == io._CryptoUtils.PAD) padLength++;
      }
      let outputLen = ((dart.notNull(len) - extrasLen) * 6)[dartx['>>']](3) - padLength;
      let out = ListOfint().new(outputLen);
      for (let i = 0, o = 0; o < outputLen;) {
        let x = 0;
        for (let j = 4; j > 0;) {
          let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i++));
          if (dart.notNull(c) >= 0) {
            x = (x << 6 & 16777215 | dart.notNull(c)) >>> 0;
            j--;
          }
        }
        out[dartx._set](o++, x[dartx['>>']](16));
        if (o < outputLen) {
          out[dartx._set](o++, x >> 8 & 255);
          if (o < outputLen) out[dartx._set](o++, x & 255);
        }
      }
      return out;
    }
  };
  dart.setSignature(io._CryptoUtils, {
    sfields: () => ({
      PAD: core.int,
      CR: core.int,
      LF: core.int,
      LINE_LENGTH: core.int,
      _encodeTable: core.String,
      _encodeTableUrlSafe: core.String,
      _decodeTable: ListOfint()
    }),
    statics: () => ({
      bytesToHex: dart.definiteFunctionType(core.String, [ListOfint()]),
      bytesToBase64: dart.definiteFunctionType(core.String, [ListOfint()], [core.bool, core.bool]),
      base64StringToBytes: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.bool])
    }),
    names: ['bytesToHex', 'bytesToBase64', 'base64StringToBytes']
  });
  io._CryptoUtils.PAD = 61;
  io._CryptoUtils.CR = 13;
  io._CryptoUtils.LF = 10;
  io._CryptoUtils.LINE_LENGTH = 76;
  io._CryptoUtils._encodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  io._CryptoUtils._encodeTableUrlSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  io._CryptoUtils._decodeTable = dart.constList([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 0, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], core.int);
  io._MASK_8 = 255;
  io._MASK_32 = 4294967295;
  io._BITS_PER_BYTE = 8;
  io._BYTES_PER_WORD = 4;
  const _chunkSizeInWords = Symbol('_chunkSizeInWords');
  const _digestSizeInWords = Symbol('_digestSizeInWords');
  const _bigEndianWords = Symbol('_bigEndianWords');
  const _pendingData = Symbol('_pendingData');
  const _lengthInBytes = Symbol('_lengthInBytes');
  const _currentChunk = Symbol('_currentChunk');
  const _h = Symbol('_h');
  const _digestCalled = Symbol('_digestCalled');
  const _iterate = Symbol('_iterate');
  const _resultAsBytes = Symbol('_resultAsBytes');
  const _finalizeData = Symbol('_finalizeData');
  const _add32 = Symbol('_add32');
  const _roundUp = Symbol('_roundUp');
  const _rotl32 = Symbol('_rotl32');
  const _wordToBytes = Symbol('_wordToBytes');
  const _bytesToChunk = Symbol('_bytesToChunk');
  const _updateHash = Symbol('_updateHash');
  io._HashBase = class _HashBase extends core.Object {
    new(chunkSizeInWords, digestSizeInWords, bigEndianWords) {
      this[_chunkSizeInWords] = chunkSizeInWords;
      this[_digestSizeInWords] = digestSizeInWords;
      this[_bigEndianWords] = bigEndianWords;
      this[_pendingData] = JSArrayOfint().of([]);
      this[_lengthInBytes] = 0;
      this[_currentChunk] = null;
      this[_h] = null;
      this[_digestCalled] = false;
      this[_currentChunk] = ListOfint().new(this[_chunkSizeInWords]);
      this[_h] = ListOfint().new(this[_digestSizeInWords]);
    }
    add(data) {
      if (dart.test(this[_digestCalled])) {
        dart.throw(new core.StateError('Hash update method called after digest was retrieved'));
      }
      this[_lengthInBytes] = dart.notNull(this[_lengthInBytes]) + dart.notNull(data[dartx.length]);
      this[_pendingData][dartx.addAll](data);
      this[_iterate]();
    }
    close() {
      if (dart.test(this[_digestCalled])) {
        return ListOfint()._check(this[_resultAsBytes]());
      }
      this[_digestCalled] = true;
      this[_finalizeData]();
      this[_iterate]();
      dart.assert(this[_pendingData][dartx.length] == 0);
      return ListOfint()._check(this[_resultAsBytes]());
    }
    get blockSize() {
      return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
    }
    [_add32](x, y) {
      return dart.dsend(dart.dsend(x, '+', y), '&', io._MASK_32);
    }
    [_roundUp](val, n) {
      return dart.dsend(dart.dsend(dart.dsend(val, '+', n), '-', 1), '&', dart.dsend(n, '_negate'));
    }
    [_rotl32](val, shift) {
      let mod_shift = dart.notNull(shift) & 31;
      return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
    }
    [_resultAsBytes]() {
      let result = [];
      for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
        result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
      }
      return result;
    }
    [_bytesToChunk](data, dataIndex) {
      dart.assert(dart.notNull(data[dartx.length]) - dart.notNull(dataIndex) >= dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD);
      for (let wordIndex = 0; wordIndex < dart.notNull(this[_chunkSizeInWords]); wordIndex++) {
        let w3 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dataIndex) : data[dartx._get](dart.notNull(dataIndex) + 3);
        let w2 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 1) : data[dartx._get](dart.notNull(dataIndex) + 2);
        let w1 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 2) : data[dartx._get](dart.notNull(dataIndex) + 1);
        let w0 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 3) : data[dartx._get](dataIndex);
        dataIndex = dart.notNull(dataIndex) + 4;
        let word = (dart.notNull(w3) & 255) << 24 >>> 0;
        word = (word | (dart.notNull(w2) & io._MASK_8) << 16) >>> 0;
        word = (word | (dart.notNull(w1) & io._MASK_8) << 8) >>> 0;
        word = (word | dart.notNull(w0) & io._MASK_8) >>> 0;
        this[_currentChunk][dartx._set](wordIndex, word);
      }
    }
    [_wordToBytes](word) {
      let bytes = ListOfint().new(io._BYTES_PER_WORD);
      bytes[dartx._set](0, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 24 : 0) & io._MASK_8);
      bytes[dartx._set](1, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 16 : 8) & io._MASK_8);
      bytes[dartx._set](2, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 8 : 16) & io._MASK_8);
      bytes[dartx._set](3, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 0 : 24) & io._MASK_8);
      return bytes;
    }
    [_iterate]() {
      let len = this[_pendingData][dartx.length];
      let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
      if (dart.notNull(len) >= chunkSizeInBytes) {
        let index = 0;
        for (; dart.notNull(len) - index >= chunkSizeInBytes; index = index + chunkSizeInBytes) {
          this[_bytesToChunk](this[_pendingData], index);
          this[_updateHash](this[_currentChunk]);
        }
        this[_pendingData] = this[_pendingData][dartx.sublist](index, len);
      }
    }
    [_finalizeData]() {
      this[_pendingData][dartx.add](128);
      let contentsLength = dart.notNull(this[_lengthInBytes]) + 9;
      let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
      let finalizedLength = this[_roundUp](contentsLength, chunkSizeInBytes);
      let zeroPadding = dart.dsend(finalizedLength, '-', contentsLength);
      for (let i = 0; i < dart.notNull(core.num._check(zeroPadding)); i++) {
        this[_pendingData][dartx.add](0);
      }
      let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
      dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
      if (dart.test(this[_bigEndianWords])) {
        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
      } else {
        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
      }
    }
  };
  dart.setSignature(io._HashBase, {
    constructors: () => ({new: dart.definiteFunctionType(io._HashBase, [core.int, core.int, core.bool])}),
    fields: () => ({
      [_chunkSizeInWords]: core.int,
      [_digestSizeInWords]: core.int,
      [_bigEndianWords]: core.bool,
      [_lengthInBytes]: core.int,
      [_pendingData]: ListOfint(),
      [_currentChunk]: ListOfint(),
      [_h]: ListOfint(),
      [_digestCalled]: core.bool
    }),
    getters: () => ({blockSize: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.dynamic, [ListOfint()]),
      close: dart.definiteFunctionType(core.List$(core.int), []),
      [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
      [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
      [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
      [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
      [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
      [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
    })
  });
  io._MD5 = class _MD5 extends io._HashBase {
    new() {
      super.new(16, 4, false);
      this[_h][dartx._set](0, 1732584193);
      this[_h][dartx._set](1, 4023233417);
      this[_h][dartx._set](2, 2562383102);
      this[_h][dartx._set](3, 271733878);
    }
    newInstance() {
      return new io._MD5();
    }
    [_updateHash](m) {
      dart.assert(m[dartx.length] == 16);
      let a = this[_h][dartx._get](0);
      let b = this[_h][dartx._get](1);
      let c = this[_h][dartx._get](2);
      let d = this[_h][dartx._get](3);
      let t0 = null;
      let t1 = null;
      for (let i = 0; i < 64; i++) {
        if (i < 16) {
          t0 = (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & io._MASK_32 & dart.notNull(d)) >>> 0;
          t1 = i;
        } else if (i < 32) {
          t0 = (dart.notNull(d) & dart.notNull(b) | ~dart.notNull(d) & io._MASK_32 & dart.notNull(c)) >>> 0;
          t1 = (5 * i + 1)[dartx['%']](16);
        } else if (i < 48) {
          t0 = (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0;
          t1 = (3 * i + 5)[dartx['%']](16);
        } else {
          t0 = (dart.notNull(c) ^ (dart.notNull(b) | ~dart.notNull(d) & io._MASK_32)) >>> 0;
          t1 = (7 * i)[dartx['%']](16);
        }
        let temp = d;
        d = c;
        c = b;
        b = core.int._check(this[_add32](b, this[_rotl32](core.int._check(this[_add32](this[_add32](a, t0), this[_add32](io._MD5._k[dartx._get](i), m[dartx._get](core.int._check(t1))))), io._MD5._r[dartx._get](i))));
        a = temp;
      }
      this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
      this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
      this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
      this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
    }
  };
  dart.setSignature(io._MD5, {
    constructors: () => ({new: dart.definiteFunctionType(io._MD5, [])}),
    methods: () => ({
      newInstance: dart.definiteFunctionType(io._MD5, []),
      [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
    }),
    sfields: () => ({
      _k: ListOfint(),
      _r: ListOfint()
    })
  });
  io._MD5._k = dart.constList([3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745], core.int);
  io._MD5._r = dart.constList([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], core.int);
  const _w = Symbol('_w');
  io._SHA1 = class _SHA1 extends io._HashBase {
    new() {
      this[_w] = ListOfint().new(80);
      super.new(16, 5, true);
      this[_h][dartx._set](0, 1732584193);
      this[_h][dartx._set](1, 4023233417);
      this[_h][dartx._set](2, 2562383102);
      this[_h][dartx._set](3, 271733878);
      this[_h][dartx._set](4, 3285377520);
    }
    newInstance() {
      return new io._SHA1();
    }
    [_updateHash](m) {
      dart.assert(m[dartx.length] == 16);
      let a = this[_h][dartx._get](0);
      let b = this[_h][dartx._get](1);
      let c = this[_h][dartx._get](2);
      let d = this[_h][dartx._get](3);
      let e = this[_h][dartx._get](4);
      for (let i = 0; i < 80; i++) {
        if (i < 16) {
          this[_w][dartx._set](i, m[dartx._get](i));
        } else {
          let n = (dart.notNull(this[_w][dartx._get](i - 3)) ^ dart.notNull(this[_w][dartx._get](i - 8)) ^ dart.notNull(this[_w][dartx._get](i - 14)) ^ dart.notNull(this[_w][dartx._get](i - 16))) >>> 0;
          this[_w][dartx._set](i, this[_rotl32](n, 1));
        }
        let t = this[_add32](this[_add32](this[_rotl32](a, 5), e), this[_w][dartx._get](i));
        if (i < 20) {
          t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & dart.notNull(d)) >>> 0), 1518500249);
        } else if (i < 40) {
          t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 1859775393);
        } else if (i < 60) {
          t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | dart.notNull(b) & dart.notNull(d) | dart.notNull(c) & dart.notNull(d)) >>> 0), 2400959708);
        } else {
          t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 3395469782);
        }
        e = d;
        d = c;
        c = this[_rotl32](b, 30);
        b = a;
        a = core.int._check(dart.dsend(t, '&', io._MASK_32));
      }
      this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
      this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
      this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
      this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
      this[_h][dartx._set](4, core.int._check(this[_add32](e, this[_h][dartx._get](4))));
    }
  };
  dart.setSignature(io._SHA1, {
    constructors: () => ({new: dart.definiteFunctionType(io._SHA1, [])}),
    fields: () => ({[_w]: ListOfint()}),
    methods: () => ({
      newInstance: dart.definiteFunctionType(io._SHA1, []),
      [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
    })
  });
  io.ZLibOption = class ZLibOption extends core.Object {};
  dart.setSignature(io.ZLibOption, {
    sfields: () => ({
      MIN_WINDOW_BITS: core.int,
      MAX_WINDOW_BITS: core.int,
      DEFAULT_WINDOW_BITS: core.int,
      MIN_LEVEL: core.int,
      MAX_LEVEL: core.int,
      DEFAULT_LEVEL: core.int,
      MIN_MEM_LEVEL: core.int,
      MAX_MEM_LEVEL: core.int,
      DEFAULT_MEM_LEVEL: core.int,
      STRATEGY_FILTERED: core.int,
      STRATEGY_HUFFMAN_ONLY: core.int,
      STRATEGY_RLE: core.int,
      STRATEGY_FIXED: core.int,
      STRATEGY_DEFAULT: core.int
    })
  });
  io.ZLibOption.MIN_WINDOW_BITS = 8;
  io.ZLibOption.MAX_WINDOW_BITS = 15;
  io.ZLibOption.DEFAULT_WINDOW_BITS = 15;
  io.ZLibOption.MIN_LEVEL = -1;
  io.ZLibOption.MAX_LEVEL = 9;
  io.ZLibOption.DEFAULT_LEVEL = 6;
  io.ZLibOption.MIN_MEM_LEVEL = 1;
  io.ZLibOption.MAX_MEM_LEVEL = 9;
  io.ZLibOption.DEFAULT_MEM_LEVEL = 8;
  io.ZLibOption.STRATEGY_FILTERED = 1;
  io.ZLibOption.STRATEGY_HUFFMAN_ONLY = 2;
  io.ZLibOption.STRATEGY_RLE = 3;
  io.ZLibOption.STRATEGY_FIXED = 4;
  io.ZLibOption.STRATEGY_DEFAULT = 0;
  io.ZLibCodec = class ZLibCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
    new(opts) {
      let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
      let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
      let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
      let raw = opts && 'raw' in opts ? opts.raw : false;
      let gzip = opts && 'gzip' in opts ? opts.gzip : false;
      this.level = level;
      this.windowBits = windowBits;
      this.memLevel = memLevel;
      this.strategy = strategy;
      this.dictionary = dictionary;
      this.raw = raw;
      this.gzip = gzip;
      super.new();
      io._validateZLibeLevel(this.level);
      io._validateZLibMemLevel(this.memLevel);
      io._validateZLibStrategy(this.strategy);
      io._validateZLibWindowBits(this.windowBits);
    }
    _default() {
      this.level = io.ZLibOption.DEFAULT_LEVEL;
      this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
      this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
      this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
      this.raw = false;
      this.gzip = false;
      this.dictionary = null;
      super.new();
    }
    get encoder() {
      return new io.ZLibEncoder({gzip: false, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
    }
    get decoder() {
      return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
    }
  };
  dart.addSimpleTypeTests(io.ZLibCodec);
  dart.defineNamedConstructor(io.ZLibCodec, '_default');
  dart.setSignature(io.ZLibCodec, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.ZLibCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
      _default: dart.definiteFunctionType(io.ZLibCodec, [])
    }),
    fields: () => ({
      gzip: core.bool,
      level: core.int,
      memLevel: core.int,
      strategy: core.int,
      windowBits: core.int,
      raw: core.bool,
      dictionary: ListOfint()
    }),
    getters: () => ({
      encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
      decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
    })
  });
  io.ZLIB = dart.const(new io.ZLibCodec._default());
  io.GZipCodec = class GZipCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
    new(opts) {
      let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
      let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
      let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
      let raw = opts && 'raw' in opts ? opts.raw : false;
      let gzip = opts && 'gzip' in opts ? opts.gzip : true;
      this.level = level;
      this.windowBits = windowBits;
      this.memLevel = memLevel;
      this.strategy = strategy;
      this.dictionary = dictionary;
      this.raw = raw;
      this.gzip = gzip;
      super.new();
      io._validateZLibeLevel(this.level);
      io._validateZLibMemLevel(this.memLevel);
      io._validateZLibStrategy(this.strategy);
      io._validateZLibWindowBits(this.windowBits);
    }
    _default() {
      this.level = io.ZLibOption.DEFAULT_LEVEL;
      this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
      this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
      this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
      this.raw = false;
      this.gzip = true;
      this.dictionary = null;
      super.new();
    }
    get encoder() {
      return new io.ZLibEncoder({gzip: true, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
    }
    get decoder() {
      return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
    }
  };
  dart.addSimpleTypeTests(io.GZipCodec);
  dart.defineNamedConstructor(io.GZipCodec, '_default');
  dart.setSignature(io.GZipCodec, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.GZipCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
      _default: dart.definiteFunctionType(io.GZipCodec, [])
    }),
    fields: () => ({
      gzip: core.bool,
      level: core.int,
      memLevel: core.int,
      strategy: core.int,
      windowBits: core.int,
      dictionary: ListOfint(),
      raw: core.bool
    }),
    getters: () => ({
      encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
      decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
    })
  });
  io.GZIP = dart.const(new io.GZipCodec._default());
  io.ZLibEncoder = class ZLibEncoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
    new(opts) {
      let gzip = opts && 'gzip' in opts ? opts.gzip : false;
      let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
      let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
      let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
      let raw = opts && 'raw' in opts ? opts.raw : false;
      this.gzip = gzip;
      this.level = level;
      this.windowBits = windowBits;
      this.memLevel = memLevel;
      this.strategy = strategy;
      this.dictionary = dictionary;
      this.raw = raw;
      super.new();
      io._validateZLibeLevel(this.level);
      io._validateZLibMemLevel(this.memLevel);
      io._validateZLibStrategy(this.strategy);
      io._validateZLibWindowBits(this.windowBits);
    }
    convert(bytes) {
      let sink = new io._BufferSink();
      let _ = this.startChunkedConversion(sink);
      _.add(bytes);
      _.close();
      return sink.builder.takeBytes();
    }
    startChunkedConversion(sink) {
      if (!convert.ByteConversionSink.is(sink)) {
        sink = convert.ByteConversionSink.from(sink);
      }
      return new io._ZLibEncoderSink(convert.ByteConversionSink._check(sink), this.gzip, this.level, this.windowBits, this.memLevel, this.strategy, this.dictionary, this.raw);
    }
  };
  dart.addSimpleTypeTests(io.ZLibEncoder);
  dart.setSignature(io.ZLibEncoder, {
    constructors: () => ({new: dart.definiteFunctionType(io.ZLibEncoder, [], {gzip: core.bool, level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool})}),
    fields: () => ({
      gzip: core.bool,
      level: core.int,
      memLevel: core.int,
      strategy: core.int,
      windowBits: core.int,
      dictionary: ListOfint(),
      raw: core.bool
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
    })
  });
  io.ZLibDecoder = class ZLibDecoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
    new(opts) {
      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
      let raw = opts && 'raw' in opts ? opts.raw : false;
      this.windowBits = windowBits;
      this.dictionary = dictionary;
      this.raw = raw;
      super.new();
      io._validateZLibWindowBits(this.windowBits);
    }
    convert(bytes) {
      let sink = new io._BufferSink();
      let _ = this.startChunkedConversion(sink);
      _.add(bytes);
      _.close();
      return sink.builder.takeBytes();
    }
    startChunkedConversion(sink) {
      if (!convert.ByteConversionSink.is(sink)) {
        sink = convert.ByteConversionSink.from(sink);
      }
      return new io._ZLibDecoderSink(convert.ByteConversionSink._check(sink), this.windowBits, this.dictionary, this.raw);
    }
  };
  dart.addSimpleTypeTests(io.ZLibDecoder);
  dart.setSignature(io.ZLibDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(io.ZLibDecoder, [], {windowBits: core.int, dictionary: ListOfint(), raw: core.bool})}),
    fields: () => ({
      windowBits: core.int,
      dictionary: ListOfint(),
      raw: core.bool
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
    })
  });
  io._BufferSink = class _BufferSink extends convert.ByteConversionSink {
    new() {
      this.builder = io.BytesBuilder.new({copy: false});
      super.new();
    }
    add(chunk) {
      this.builder.add(chunk);
    }
    addSlice(chunk, start, end, isLast) {
      if (typed_data.Uint8List.is(chunk)) {
        let list = chunk;
        this.builder.add(typed_data.Uint8List.view(list[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
      } else {
        this.builder.add(chunk[dartx.sublist](start, end));
      }
    }
    close() {}
  };
  dart.setSignature(io._BufferSink, {
    fields: () => ({builder: io.BytesBuilder}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _sink$0 = Symbol('_sink');
  const _filter$ = Symbol('_filter');
  const _closed = Symbol('_closed');
  const _empty = Symbol('_empty');
  let const$52;
  io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
    new(sink, filter) {
      this[_sink$0] = sink;
      this[_filter$] = filter;
      this[_closed] = false;
      this[_empty] = true;
      super.new();
    }
    add(data) {
      this.addSlice(data, 0, data[dartx.length], false);
    }
    addSlice(data, start, end, isLast) {
      if (dart.test(this[_closed])) return;
      if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
      core.RangeError.checkValidRange(start, end, data[dartx.length]);
      try {
        this[_empty] = false;
        let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
        this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
        let out = null;
        while ((out = this[_filter$].processed({flush: false})) != null) {
          this[_sink$0].add(ListOfint()._check(out));
        }
      } catch (e) {
        this[_closed] = true;
        throw e;
      }

      if (dart.test(isLast)) this.close();
    }
    close() {
      if (dart.test(this[_closed])) return;
      if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
      try {
        let out = null;
        while ((out = this[_filter$].processed({end: true})) != null) {
          this[_sink$0].add(ListOfint()._check(out));
        }
      } catch (e) {
        this[_closed] = true;
        dart.throw(e);
      }

      this[_closed] = true;
      this[_sink$0].close();
    }
  };
  dart.setSignature(io._FilterSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
    fields: () => ({
      [_filter$]: io._Filter,
      [_sink$0]: convert.ByteConversionSink,
      [_closed]: core.bool,
      [_empty]: core.bool
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  io._ZLibEncoderSink = class _ZLibEncoderSink extends io._FilterSink {
    new(sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
      super.new(sink, io._Filter._newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw));
    }
  };
  dart.setSignature(io._ZLibEncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._ZLibEncoderSink, [convert.ByteConversionSink, core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool])})
  });
  io._ZLibDecoderSink = class _ZLibDecoderSink extends io._FilterSink {
    new(sink, windowBits, dictionary, raw) {
      super.new(sink, io._Filter._newZLibInflateFilter(windowBits, dictionary, raw));
    }
  };
  dart.setSignature(io._ZLibDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._ZLibDecoderSink, [convert.ByteConversionSink, core.int, ListOfint(), core.bool])})
  });
  io._Filter = class _Filter extends core.Object {
    static _newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
      dart.throw(new core.UnsupportedError("_newZLibDeflateFilter"));
    }
    static _newZLibInflateFilter(windowBits, dictionary, raw) {
      dart.throw(new core.UnsupportedError("_newZLibInflateFilter"));
    }
  };
  dart.setSignature(io._Filter, {
    statics: () => ({
      _newZLibDeflateFilter: dart.definiteFunctionType(io._Filter, [core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool]),
      _newZLibInflateFilter: dart.definiteFunctionType(io._Filter, [core.int, ListOfint(), core.bool])
    }),
    names: ['_newZLibDeflateFilter', '_newZLibInflateFilter']
  });
  io._validateZLibWindowBits = function(windowBits) {
    if (io.ZLibOption.MIN_WINDOW_BITS > dart.notNull(windowBits) || io.ZLibOption.MAX_WINDOW_BITS < dart.notNull(windowBits)) {
      dart.throw(new core.RangeError.range(windowBits, io.ZLibOption.MIN_WINDOW_BITS, io.ZLibOption.MAX_WINDOW_BITS));
    }
  };
  dart.fn(io._validateZLibWindowBits, intTovoid());
  io._validateZLibeLevel = function(level) {
    if (io.ZLibOption.MIN_LEVEL > dart.notNull(level) || io.ZLibOption.MAX_LEVEL < dart.notNull(level)) {
      dart.throw(new core.RangeError.range(level, io.ZLibOption.MIN_LEVEL, io.ZLibOption.MAX_LEVEL));
    }
  };
  dart.fn(io._validateZLibeLevel, intTovoid());
  io._validateZLibMemLevel = function(memLevel) {
    if (io.ZLibOption.MIN_MEM_LEVEL > dart.notNull(memLevel) || io.ZLibOption.MAX_MEM_LEVEL < dart.notNull(memLevel)) {
      dart.throw(new core.RangeError.range(memLevel, io.ZLibOption.MIN_MEM_LEVEL, io.ZLibOption.MAX_MEM_LEVEL));
    }
  };
  dart.fn(io._validateZLibMemLevel, intTovoid());
  let const$53;
  io._validateZLibStrategy = function(strategy) {
    let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
    if (strategies[dartx.indexOf](strategy) == -1) {
      dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
    }
  };
  dart.fn(io._validateZLibStrategy, intTovoid());
  io.Directory = class Directory extends core.Object {
    static new(path) {
      return new io._Directory(path);
    }
    static fromUri(uri) {
      return io.Directory.new(uri.toFilePath());
    }
    static get current() {
      return io._Directory.current;
    }
    static set current(path) {
      io._Directory.current = path;
    }
    static get systemTemp() {
      return io._Directory.systemTemp;
    }
  };
  io.Directory[dart.implements] = () => [io.FileSystemEntity];
  dart.setSignature(io.Directory, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.Directory, [core.String]),
      fromUri: dart.definiteFunctionType(io.Directory, [core.Uri])
    }),
    fields: () => ({path: core.String}),
    sgetters: () => ({
      current: dart.definiteFunctionType(io.Directory, []),
      systemTemp: dart.definiteFunctionType(io.Directory, [])
    }),
    ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  const _isErrorResponse = Symbol('_isErrorResponse');
  const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
  const _absolutePath = Symbol('_absolutePath');
  const _computeExistingIndex = Symbol('_computeExistingIndex');
  const _delete = Symbol('_delete');
  const _deleteSync = Symbol('_deleteSync');
  const _type = Symbol('_type');
  io.FileSystemEntity = class FileSystemEntity extends core.Object {
    get uri() {
      return core.Uri.file(this.path);
    }
    resolveSymbolicLinks() {
      return io._IOService._dispatch(io._FILE_RESOLVE_SYMBOLIC_LINKS, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot resolve symbolic links", this.path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    resolveSymbolicLinksSync() {
      let result = io.FileSystemEntity._resolveSymbolicLinks(this.path);
      io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
      return core.String._check(result);
    }
    delete(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      return this[_delete]({recursive: recursive});
    }
    deleteSync(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      return this[_deleteSync]({recursive: recursive});
    }
    watch(opts) {
      let events = opts && 'events' in opts ? opts.events : io.FileSystemEvent.ALL;
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      return io._FileSystemWatcher._watch(io.FileSystemEntity._trimTrailingPathSeparators(this.path), events, recursive);
    }
    static identical(path1, path2) {
      return io._IOService._dispatch(io._FILE_IDENTICAL, JSArrayOfString().of([path1, path2])).then(core.bool)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, dart.str`Error in FileSystemEntity.identical(${path1}, ${path2})`, ""));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    get isAbsolute() {
      if (dart.test(io.Platform.isWindows)) {
        return this.path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern);
      } else {
        return this.path[dartx.startsWith]('/');
      }
    }
    get [_absolutePath]() {
      if (dart.test(this.isAbsolute)) return this.path;
      let current = io.Directory.current.path;
      if (dart.test(current[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(current[dartx.endsWith]('\\'))) {
        return dart.str`${current}${this.path}`;
      } else {
        return dart.str`${current}${io.Platform.pathSeparator}${this.path}`;
      }
    }
    static identicalSync(path1, path2) {
      let result = io.FileSystemEntity._identical(path1, path2);
      io.FileSystemEntity._throwIfError(result, 'Error in FileSystemEntity.identicalSync');
      return core.bool._check(result);
    }
    static get isWatchSupported() {
      return io._FileSystemWatcher.isSupported;
    }
    static type(path, opts) {
      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
      return io.FileSystemEntity._getTypeAsync(path, followLinks).then(io.FileSystemEntityType)(io.FileSystemEntityType._lookup);
    }
    static typeSync(path, opts) {
      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
      return io.FileSystemEntityType._lookup(io.FileSystemEntity._getTypeSync(path, followLinks));
    }
    static isLink(path) {
      return io.FileSystemEntity._getTypeAsync(path, false).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.LINK[_type], intTobool()));
    }
    static isFile(path) {
      return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.FILE[_type], intTobool()));
    }
    static isDirectory(path) {
      return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.DIRECTORY[_type], intTobool()));
    }
    static isLinkSync(path) {
      return io.FileSystemEntity._getTypeSync(path, false) == io.FileSystemEntityType.LINK[_type];
    }
    static isFileSync(path) {
      return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.FILE[_type];
    }
    static isDirectorySync(path) {
      return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.DIRECTORY[_type];
    }
    static _getType(path, followLinks) {
      dart.throw(new core.UnsupportedError("FileSystemEntity._getType"));
    }
    static _identical(path1, path2) {
      dart.throw(new core.UnsupportedError("FileSystemEntity._identical"));
    }
    static _resolveSymbolicLinks(path) {
      dart.throw(new core.UnsupportedError("FileSystemEntity._resolveSymbolicLinks"));
    }
    static parentOf(path) {
      let rootEnd = -1;
      if (dart.test(io.Platform.isWindows)) {
        if (dart.test(path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern))) {
          rootEnd = path[dartx.indexOf](core.RegExp.new('[/\\\\]'), 2);
          if (rootEnd == -1) return path;
        } else if (dart.test(path[dartx.startsWith]('\\')) || dart.test(path[dartx.startsWith]('/'))) {
          rootEnd = 0;
        }
      } else if (dart.test(path[dartx.startsWith]('/'))) {
        rootEnd = 0;
      }
      let pos = path[dartx.lastIndexOf](io.FileSystemEntity._parentRegExp);
      if (dart.notNull(pos) > dart.notNull(rootEnd)) {
        return path[dartx.substring](0, dart.notNull(pos) + 1);
      } else if (dart.notNull(rootEnd) > -1) {
        return path[dartx.substring](0, dart.notNull(rootEnd) + 1);
      } else {
        return '.';
      }
    }
    get parent() {
      return io.Directory.new(io.FileSystemEntity.parentOf(this.path));
    }
    static _getTypeSync(path, followLinks) {
      let result = io.FileSystemEntity._getType(path, followLinks);
      io.FileSystemEntity._throwIfError(result, 'Error getting type of FileSystemEntity');
      return core.int._check(result);
    }
    static _getTypeAsync(path, followLinks) {
      return io._IOService._dispatch(io._FILE_TYPE, JSArrayOfObject().of([path, followLinks])).then(core.int)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Error getting type", path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    static _throwIfError(result, msg, path) {
      if (path === void 0) path = null;
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException(msg, path, result));
      } else if (core.ArgumentError.is(result)) {
        dart.throw(result);
      }
    }
    static _trimTrailingPathSeparators(path) {
      if (!(typeof path == 'string')) return path;
      if (dart.test(io.Platform.isWindows)) {
        while (dart.notNull(path[dartx.length]) > 1 && (dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) || dart.test(path[dartx.endsWith]('/')))) {
          path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
        }
      } else {
        while (dart.notNull(path[dartx.length]) > 1 && dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
          path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
        }
      }
      return path;
    }
    static _ensureTrailingPathSeparators(path) {
      if (!(typeof path == 'string')) return path;
      if (dart.test(path[dartx.isEmpty])) path = '.';
      if (dart.test(io.Platform.isWindows)) {
        while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) && !dart.test(path[dartx.endsWith]('/'))) {
          path = dart.str`${path}${io.Platform.pathSeparator}`;
        }
      } else {
        while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
          path = dart.str`${path}${io.Platform.pathSeparator}`;
        }
      }
      return path;
    }
  };
  dart.setSignature(io.FileSystemEntity, {
    getters: () => ({
      uri: dart.definiteFunctionType(core.Uri, []),
      isAbsolute: dart.definiteFunctionType(core.bool, []),
      [_absolutePath]: dart.definiteFunctionType(core.String, []),
      parent: dart.definiteFunctionType(io.Directory, [])
    }),
    methods: () => ({
      resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
      resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
      delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
      deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
      watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
    }),
    sfields: () => ({
      _absoluteWindowsPathPattern: core.RegExp,
      _parentRegExp: core.RegExp
    }),
    sgetters: () => ({isWatchSupported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      identical: dart.definiteFunctionType(async.Future$(core.bool), [core.String, core.String]),
      identicalSync: dart.definiteFunctionType(core.bool, [core.String, core.String]),
      type: dart.definiteFunctionType(async.Future$(io.FileSystemEntityType), [core.String], {followLinks: core.bool}),
      typeSync: dart.definiteFunctionType(io.FileSystemEntityType, [core.String], {followLinks: core.bool}),
      isLink: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
      isFile: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
      isDirectory: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
      isLinkSync: dart.definiteFunctionType(core.bool, [core.String]),
      isFileSync: dart.definiteFunctionType(core.bool, [core.String]),
      isDirectorySync: dart.definiteFunctionType(core.bool, [core.String]),
      _getType: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
      _identical: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      _resolveSymbolicLinks: dart.definiteFunctionType(dart.dynamic, [core.String]),
      parentOf: dart.definiteFunctionType(core.String, [core.String]),
      _getTypeSync: dart.definiteFunctionType(core.int, [core.String, core.bool]),
      _getTypeAsync: dart.definiteFunctionType(async.Future$(core.int), [core.String, core.bool]),
      _throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String]),
      _trimTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String]),
      _ensureTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String])
    }),
    names: ['identical', 'identicalSync', 'type', 'typeSync', 'isLink', 'isFile', 'isDirectory', 'isLinkSync', 'isFileSync', 'isDirectorySync', '_getType', '_identical', '_resolveSymbolicLinks', 'parentOf', '_getTypeSync', '_getTypeAsync', '_throwIfError', '_trimTrailingPathSeparators', '_ensureTrailingPathSeparators']
  });
  dart.defineLazy(io.FileSystemEntity, {
    get _absoluteWindowsPathPattern() {
      return core.RegExp.new('^(\\\\\\\\|[a-zA-Z]:[/\\\\])');
    },
    get _parentRegExp() {
      return dart.test(io.Platform.isWindows) ? core.RegExp.new('[^/\\\\][/\\\\]+[^/\\\\]') : core.RegExp.new('[^/]/+[^/]');
    }
  });
  io._Directory = class _Directory extends io.FileSystemEntity {
    new(path) {
      this.path = path;
      if (!(typeof this.path == 'string')) {
        dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
      }
    }
    static _current() {
      dart.throw(new core.UnsupportedError("Directory._current"));
    }
    static _setCurrent(path) {
      dart.throw(new core.UnsupportedError("Directory_SetCurrent"));
    }
    static _createTemp(path) {
      dart.throw(new core.UnsupportedError("Directory._createTemp"));
    }
    static _systemTemp() {
      dart.throw(new core.UnsupportedError("Directory._systemTemp"));
    }
    static _exists(path) {
      dart.throw(new core.UnsupportedError("Directory._exists"));
    }
    static _create(path) {
      dart.throw(new core.UnsupportedError("Directory._create"));
    }
    static _deleteNative(path, recursive) {
      dart.throw(new core.UnsupportedError("Directory._deleteNative"));
    }
    static _rename(path, newPath) {
      dart.throw(new core.UnsupportedError("Directory._rename"));
    }
    static _fillWithDirectoryListing(list, path, recursive, followLinks) {
      dart.throw(new core.UnsupportedError("Directory._fillWithDirectoryListing"));
    }
    static get current() {
      let result = io._Directory._current();
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Getting current working directory failed", "", result));
      }
      return new io._Directory(core.String._check(result));
    }
    static set current(path) {
      if (io.Directory.is(path)) path = dart.dload(path, 'path');
      let result = io._Directory._setCurrent(path);
      if (core.ArgumentError.is(result)) dart.throw(result);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Setting current working directory failed", core.String._check(path), result));
      }
    }
    get uri() {
      return core.Uri.directory(this.path);
    }
    exists() {
      return io._IOService._dispatch(io._DIRECTORY_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
        }
        return dart.equals(response, 1);
      }, dynamicTobool$()));
    }
    existsSync() {
      let result = io._Directory._exists(this.path);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Exists failed", this.path, result));
      }
      return dart.equals(result, 1);
    }
    get absolute() {
      return io.Directory.new(this[_absolutePath]);
    }
    stat() {
      return io.FileStat.stat(this.path);
    }
    statSync() {
      return io.FileStat.statSync(this.path);
    }
    [_computeExistingIndex](dirsToCreate) {
      let future = null;
      let notFound = dirsToCreate[dartx.length];
      for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
        if (future == null) {
          future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
        } else {
          future = dart.dsend(future, 'then', dart.fn(index => {
            if (!dart.equals(index, notFound)) {
              return async.Future.value(index);
            }
            return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
          }, dynamicTodynamic$()));
        }
      }
      if (future == null) {
        return FutureOfint().value(notFound);
      } else {
        return FutureOfint()._check(future);
      }
    }
    create(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        return this.exists().then(io.Directory)(dart.fn(exists => {
          if (dart.test(exists)) return this;
          if (this.path != this.parent.path) {
            return this.parent.create({recursive: true}).then(io.Directory)(dart.fn(_ => this.create(), DirectoryToFutureOfDirectory()));
          } else {
            return this.create();
          }
        }, boolTodynamic()));
      } else {
        return io._IOService._dispatch(io._DIRECTORY_CREATE, JSArrayOfString().of([this.path])).then(io._Directory)(dart.fn(response => {
          if (dart.test(this[_isErrorResponse](response))) {
            dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation failed"));
          }
          return this;
        }, dynamicTo_Directory()));
      }
    }
    createSync(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        if (dart.test(this.existsSync())) return;
        if (this.path != this.parent.path) {
          this.parent.createSync({recursive: true});
        }
      }
      let result = io._Directory._create(this.path);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Creation failed", this.path, result));
      }
    }
    static get systemTemp() {
      return io.Directory.new(io._Directory._systemTemp());
    }
    createTemp(prefix) {
      if (prefix === void 0) prefix = null;
      if (prefix == null) prefix = '';
      if (this.path == '') {
        dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
      }
      let fullPrefix = null;
      if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
        fullPrefix = dart.str`${this.path}${prefix}`;
      } else {
        fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
      }
      return io._IOService._dispatch(io._DIRECTORY_CREATE_TEMP, JSArrayOfString().of([fullPrefix])).then(io.Directory)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation of temporary directory failed"));
        }
        return io.Directory.new(core.String._check(response));
      }, dynamicToDirectory()));
    }
    createTempSync(prefix) {
      if (prefix === void 0) prefix = null;
      if (prefix == null) prefix = '';
      if (this.path == '') {
        dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
      }
      let fullPrefix = null;
      if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
        fullPrefix = dart.str`${this.path}${prefix}`;
      } else {
        fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
      }
      let result = io._Directory._createTemp(fullPrefix);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Creation of temporary directory failed", fullPrefix, result));
      }
      return io.Directory.new(core.String._check(result));
    }
    [_delete](opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      return io._IOService._dispatch(io._DIRECTORY_DELETE, JSArrayOfObject().of([this.path, recursive])).then(io._Directory)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Deletion failed"));
        }
        return this;
      }, dynamicTo_Directory()));
    }
    [_deleteSync](opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      let result = io._Directory._deleteNative(this.path, recursive);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Deletion failed", this.path, result));
      }
    }
    rename(newPath) {
      return io._IOService._dispatch(io._DIRECTORY_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.Directory)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Rename failed"));
        }
        return io.Directory.new(newPath);
      }, dynamicToDirectory()));
    }
    renameSync(newPath) {
      if (!(typeof newPath == 'string')) {
        dart.throw(new core.ArgumentError());
      }
      let result = io._Directory._rename(this.path, newPath);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("Rename failed", this.path, result));
      }
      return io.Directory.new(newPath);
    }
    list(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
      return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
    }
    listSync(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
      if (!(typeof recursive == 'boolean') || !(typeof followLinks == 'boolean')) {
        dart.throw(new core.ArgumentError());
      }
      let result = JSArrayOfFileSystemEntity().of([]);
      io._Directory._fillWithDirectoryListing(result, io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks);
      return result;
    }
    toString() {
      return dart.str`Directory: '${this.path}'`;
    }
    [_isErrorResponse](response) {
      return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
    }
    [_exceptionOrErrorFromResponse](response, message) {
      dart.assert(this[_isErrorResponse](response));
      switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
        case io._ILLEGAL_ARGUMENT_RESPONSE:
        {
          return new core.ArgumentError();
        }
        case io._OSERROR_RESPONSE:
        {
          let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
          return new io.FileSystemException(message, this.path, err);
        }
        default:
        {
          return core.Exception.new("Unknown error");
        }
      }
    }
  };
  io._Directory[dart.implements] = () => [io.Directory];
  dart.setSignature(io._Directory, {
    constructors: () => ({new: dart.definiteFunctionType(io._Directory, [core.String])}),
    fields: () => ({path: core.String}),
    getters: () => ({absolute: dart.definiteFunctionType(io.Directory, [])}),
    methods: () => ({
      exists: dart.definiteFunctionType(async.Future$(core.bool), []),
      existsSync: dart.definiteFunctionType(core.bool, []),
      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
      statSync: dart.definiteFunctionType(io.FileStat, []),
      [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
      create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
      createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
      createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
      createTempSync: dart.definiteFunctionType(io.Directory, [], [core.String]),
      [_delete]: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
      [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
      rename: dart.definiteFunctionType(async.Future$(io.Directory), [core.String]),
      renameSync: dart.definiteFunctionType(io.Directory, [core.String]),
      list: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
      listSync: dart.definiteFunctionType(core.List$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
      [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [_exceptionOrErrorFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])
    }),
    sgetters: () => ({
      current: dart.definiteFunctionType(io.Directory, []),
      systemTemp: dart.definiteFunctionType(io.Directory, [])
    }),
    ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
    statics: () => ({
      _current: dart.definiteFunctionType(dart.dynamic, []),
      _setCurrent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _createTemp: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _systemTemp: dart.definiteFunctionType(core.String, []),
      _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
      _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      _fillWithDirectoryListing: dart.definiteFunctionType(dart.void, [ListOfFileSystemEntity(), core.String, core.bool, core.bool])
    }),
    names: ['_current', '_setCurrent', '_createTemp', '_systemTemp', '_exists', '_create', '_deleteNative', '_rename', '_fillWithDirectoryListing']
  });
  io._AsyncDirectoryListerOps = class _AsyncDirectoryListerOps extends core.Object {
    static new(pointer) {
      dart.throw(new core.UnsupportedError("Directory._list"));
    }
  };
  dart.setSignature(io._AsyncDirectoryListerOps, {
    constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryListerOps, [core.int])})
  });
  const _ops = Symbol('_ops');
  const _pointer = Symbol('_pointer');
  const _cleanup = Symbol('_cleanup');
  io._AsyncDirectoryLister = class _AsyncDirectoryLister extends core.Object {
    new(path, recursive, followLinks) {
      this.closeCompleter = async.Completer.new();
      this.path = path;
      this.recursive = recursive;
      this.followLinks = followLinks;
      this.controller = null;
      this.canceled = false;
      this.nextRunning = false;
      this.closed = false;
      this[_ops] = null;
      this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
    }
    [_pointer]() {
      return this[_ops] == null ? null : this[_ops].getPointer();
    }
    get stream() {
      return this.controller.stream;
    }
    onListen() {
      io._IOService._dispatch(io._DIRECTORY_LIST_START, JSArrayOfObject().of([this.path, this.recursive, this.followLinks])).then(dart.dynamic)(dart.fn(response => {
        if (typeof response == 'number') {
          this[_ops] = io._AsyncDirectoryListerOps.new(response);
          this.next();
        } else if (core.Error.is(response)) {
          this.controller.addError(response, response.stackTrace);
          this.close();
        } else {
          this.error(response);
          this.close();
        }
      }, dynamicTodynamic$()));
    }
    onResume() {
      if (!dart.test(this.nextRunning)) {
        this.next();
      }
    }
    onCancel() {
      this.canceled = true;
      if (!dart.test(this.nextRunning)) {
        this.close();
      }
      return this.closeCompleter.future;
    }
    next() {
      if (dart.test(this.canceled)) {
        this.close();
        return;
      }
      if (dart.test(this.controller.isPaused) || dart.test(this.nextRunning)) {
        return;
      }
      let pointer = this[_pointer]();
      if (pointer == null) {
        return;
      }
      this.nextRunning = true;
      io._IOService._dispatch(io._DIRECTORY_LIST_NEXT, JSArrayOfint().of([pointer])).then(dart.dynamic)(dart.fn(result => {
        this.nextRunning = false;
        if (core.List.is(result)) {
          this.next();
          dart.assert(result[dartx.length][dartx['%']](2) == 0);
          for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
            dart.assert(i[dartx['%']](2) == 0);
            switch (result[dartx._get](i++)) {
              case io._AsyncDirectoryLister.LIST_FILE:
              {
                this.controller.add(io.File.new(core.String._check(result[dartx._get](i))));
                break;
              }
              case io._AsyncDirectoryLister.LIST_DIRECTORY:
              {
                this.controller.add(io.Directory.new(core.String._check(result[dartx._get](i))));
                break;
              }
              case io._AsyncDirectoryLister.LIST_LINK:
              {
                this.controller.add(io.Link.new(core.String._check(result[dartx._get](i))));
                break;
              }
              case io._AsyncDirectoryLister.LIST_ERROR:
              {
                this.error(result[dartx._get](i));
                break;
              }
              case io._AsyncDirectoryLister.LIST_DONE:
              {
                this.canceled = true;
                return;
              }
            }
          }
        } else {
          this.controller.addError(new io.FileSystemException("Internal error"));
        }
      }, dynamicTodynamic$()));
    }
    [_cleanup]() {
      this.controller.close();
      this.closeCompleter.complete();
      this[_ops] = null;
    }
    close() {
      if (dart.test(this.closed)) {
        return;
      }
      if (dart.test(this.nextRunning)) {
        return;
      }
      this.closed = true;
      let pointer = this[_pointer]();
      if (pointer == null) {
        this[_cleanup]();
      } else {
        io._IOService._dispatch(io._DIRECTORY_LIST_STOP, JSArrayOfint().of([pointer])).whenComplete(dart.bind(this, _cleanup));
      }
    }
    error(message) {
      let errorType = dart.dindex(dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR), io._ERROR_RESPONSE_ERROR_TYPE);
      if (dart.equals(errorType, io._ILLEGAL_ARGUMENT_RESPONSE)) {
        this.controller.addError(new core.ArgumentError());
      } else if (dart.equals(errorType, io._OSERROR_RESPONSE)) {
        let responseError = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR);
        let err = new io.OSError(core.String._check(dart.dindex(responseError, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(responseError, io._OSERROR_RESPONSE_ERROR_CODE)));
        let errorPath = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_PATH);
        if (errorPath == null) errorPath = this.path;
        this.controller.addError(new io.FileSystemException("Directory listing failed", core.String._check(errorPath), err));
      } else {
        this.controller.addError(new io.FileSystemException("Internal error"));
      }
    }
  };
  dart.setSignature(io._AsyncDirectoryLister, {
    constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryLister, [core.String, core.bool, core.bool])}),
    fields: () => ({
      path: core.String,
      recursive: core.bool,
      followLinks: core.bool,
      controller: async.StreamController,
      canceled: core.bool,
      nextRunning: core.bool,
      closed: core.bool,
      [_ops]: io._AsyncDirectoryListerOps,
      closeCompleter: async.Completer
    }),
    getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
    methods: () => ({
      [_pointer]: dart.definiteFunctionType(core.int, []),
      onListen: dart.definiteFunctionType(dart.void, []),
      onResume: dart.definiteFunctionType(dart.void, []),
      onCancel: dart.definiteFunctionType(async.Future, []),
      next: dart.definiteFunctionType(dart.void, []),
      [_cleanup]: dart.definiteFunctionType(dart.void, []),
      close: dart.definiteFunctionType(dart.void, []),
      error: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({
      LIST_FILE: core.int,
      LIST_DIRECTORY: core.int,
      LIST_LINK: core.int,
      LIST_ERROR: core.int,
      LIST_DONE: core.int,
      RESPONSE_TYPE: core.int,
      RESPONSE_PATH: core.int,
      RESPONSE_COMPLETE: core.int,
      RESPONSE_ERROR: core.int
    })
  });
  io._AsyncDirectoryLister.LIST_FILE = 0;
  io._AsyncDirectoryLister.LIST_DIRECTORY = 1;
  io._AsyncDirectoryLister.LIST_LINK = 2;
  io._AsyncDirectoryLister.LIST_ERROR = 3;
  io._AsyncDirectoryLister.LIST_DONE = 4;
  io._AsyncDirectoryLister.RESPONSE_TYPE = 0;
  io._AsyncDirectoryLister.RESPONSE_PATH = 1;
  io._AsyncDirectoryLister.RESPONSE_COMPLETE = 1;
  io._AsyncDirectoryLister.RESPONSE_ERROR = 2;
  io._EventHandler = class _EventHandler extends core.Object {
    static _sendData(sender, sendPort, data) {
      dart.throw(new core.UnsupportedError("EventHandler._sendData"));
    }
  };
  dart.setSignature(io._EventHandler, {
    statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
    names: ['_sendData']
  });
  const _mode = Symbol('_mode');
  io.FileMode = class FileMode extends core.Object {
    _internal(mode) {
      this[_mode] = mode;
    }
  };
  dart.defineNamedConstructor(io.FileMode, '_internal');
  dart.setSignature(io.FileMode, {
    constructors: () => ({_internal: dart.definiteFunctionType(io.FileMode, [core.int])}),
    fields: () => ({[_mode]: core.int}),
    sfields: () => ({
      READ: io.FileMode,
      WRITE: io.FileMode,
      APPEND: io.FileMode,
      WRITE_ONLY: io.FileMode,
      WRITE_ONLY_APPEND: io.FileMode
    })
  });
  dart.defineLazy(io.FileMode, {
    get READ() {
      return dart.const(new io.FileMode._internal(0));
    },
    get WRITE() {
      return dart.const(new io.FileMode._internal(1));
    },
    get APPEND() {
      return dart.const(new io.FileMode._internal(2));
    },
    get WRITE_ONLY() {
      return dart.const(new io.FileMode._internal(3));
    },
    get WRITE_ONLY_APPEND() {
      return dart.const(new io.FileMode._internal(4));
    }
  });
  io.READ = io.FileMode.READ;
  io.WRITE = io.FileMode.WRITE;
  io.APPEND = io.FileMode.APPEND;
  io.WRITE_ONLY = io.FileMode.WRITE_ONLY;
  io.WRITE_ONLY_APPEND = io.FileMode.WRITE_ONLY_APPEND;
  io.FileLock = class FileLock extends core.Object {
    new(index) {
      this.index = index;
    }
    toString() {
      return {
        0: "FileLock.SHARED",
        1: "FileLock.EXCLUSIVE"
      }[this.index];
    }
  };
  dart.defineEnumValues(io.FileLock, [
    'SHARED',
    'EXCLUSIVE'
  ]);
  io.File = class File extends core.Object {
    static new(path) {
      return new io._File(path);
    }
    static fromUri(uri) {
      return io.File.new(uri.toFilePath());
    }
  };
  io.File[dart.implements] = () => [io.FileSystemEntity];
  dart.setSignature(io.File, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.File, [core.String]),
      fromUri: dart.definiteFunctionType(io.File, [core.Uri])
    })
  });
  io.RandomAccessFile = class RandomAccessFile extends core.Object {};
  io.FileSystemException = class FileSystemException extends core.Object {
    new(message, path, osError) {
      if (message === void 0) message = "";
      if (path === void 0) path = "";
      if (osError === void 0) osError = null;
      this.message = message;
      this.path = path;
      this.osError = osError;
    }
    toString() {
      let sb = new core.StringBuffer();
      sb.write("FileSystemException");
      if (!dart.test(this.message[dartx.isEmpty])) {
        sb.write(dart.str`: ${this.message}`);
        if (this.path != null) {
          sb.write(dart.str`, path = '${this.path}'`);
        }
        if (this.osError != null) {
          sb.write(dart.str` (${this.osError})`);
        }
      } else if (this.osError != null) {
        sb.write(dart.str`: ${this.osError}`);
        if (this.path != null) {
          sb.write(dart.str`, path = '${this.path}'`);
        }
      } else if (this.path != null) {
        sb.write(dart.str`: ${this.path}`);
      }
      return sb.toString();
    }
  };
  io.FileSystemException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.FileSystemException, {
    constructors: () => ({new: dart.definiteFunctionType(io.FileSystemException, [], [core.String, core.String, io.OSError])}),
    fields: () => ({
      message: core.String,
      path: core.String,
      osError: io.OSError
    })
  });
  io._BLOCK_SIZE = 64 * 1024;
  const _closeCompleter = Symbol('_closeCompleter');
  const _path$ = Symbol('_path');
  const _position$0 = Symbol('_position');
  const _end$0 = Symbol('_end');
  const _controller$0 = Symbol('_controller');
  const _openedFile = Symbol('_openedFile');
  const _unsubscribed = Symbol('_unsubscribed');
  const _readInProgress = Symbol('_readInProgress');
  const _atEnd = Symbol('_atEnd');
  const _setupController = Symbol('_setupController');
  const _start$2 = Symbol('_start');
  const _readBlock = Symbol('_readBlock');
  const _closeFile = Symbol('_closeFile');
  io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
    new(path, position, end) {
      this[_closeCompleter] = async.Completer.new();
      this[_path$] = path;
      this[_position$0] = position;
      this[_end$0] = end;
      this[_controller$0] = null;
      this[_openedFile] = null;
      this[_unsubscribed] = false;
      this[_readInProgress] = true;
      this[_closed] = false;
      this[_atEnd] = false;
      super.new();
      if (this[_position$0] == null) this[_position$0] = 0;
    }
    forStdin() {
      this[_closeCompleter] = async.Completer.new();
      this[_position$0] = 0;
      this[_controller$0] = null;
      this[_path$] = null;
      this[_openedFile] = null;
      this[_end$0] = null;
      this[_unsubscribed] = false;
      this[_readInProgress] = true;
      this[_closed] = false;
      this[_atEnd] = false;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      this[_setupController]();
      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    [_setupController]() {
      this[_controller$0] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start$2), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
          this[_unsubscribed] = true;
          return this[_closeFile]();
        }, VoidToFuture())});
    }
    [_closeFile]() {
      if (dart.test(this[_readInProgress]) || dart.test(this[_closed])) {
        return this[_closeCompleter].future;
      }
      this[_closed] = true;
      const done = (function() {
        this[_closeCompleter].complete();
        this[_controller$0].close();
      }).bind(this);
      dart.fn(done, VoidTovoid$());
      this[_openedFile].close().catchError(dart.bind(this[_controller$0], 'addError')).whenComplete(done);
      return this[_closeCompleter].future;
    }
    [_readBlock]() {
      if (dart.test(this[_readInProgress])) return;
      if (dart.test(this[_atEnd])) {
        this[_closeFile]();
        return;
      }
      this[_readInProgress] = true;
      let readBytes = io._BLOCK_SIZE;
      if (this[_end$0] != null) {
        readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
        if (dart.notNull(readBytes) < 0) {
          this[_readInProgress] = false;
          if (!dart.test(this[_unsubscribed])) {
            this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
            this[_closeFile]();
            this[_unsubscribed] = true;
          }
          return;
        }
      }
      this[_openedFile].read(readBytes).then(dart.dynamic)(dart.fn(block => {
        this[_readInProgress] = false;
        if (dart.test(this[_unsubscribed])) {
          this[_closeFile]();
          return;
        }
        this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
        if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
          this[_atEnd] = true;
        }
        if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
          this[_readBlock]();
        }
        this[_controller$0].add(block);
        if (dart.test(this[_atEnd])) {
          this[_closeFile]();
        }
      }, ListOfintTodynamic())).catchError(dart.fn((e, s) => {
        if (!dart.test(this[_unsubscribed])) {
          this[_controller$0].addError(e, core.StackTrace._check(s));
          this[_closeFile]();
          this[_unsubscribed] = true;
        }
      }, dynamicAnddynamicTodynamic$()));
    }
    [_start$2]() {
      if (dart.notNull(this[_position$0]) < 0) {
        this[_controller$0].addError(new core.RangeError(dart.str`Bad start position: ${this[_position$0]}`));
        this[_controller$0].close();
        this[_closeCompleter].complete();
        return;
      }
      const onReady = (function(file) {
        this[_openedFile] = file;
        this[_readInProgress] = false;
        this[_readBlock]();
      }).bind(this);
      dart.fn(onReady, RandomAccessFileTovoid());
      const onOpenFile = (function(file) {
        if (dart.notNull(this[_position$0]) > 0) {
          file.setPosition(this[_position$0]).then(dart.dynamic)(onReady, {onError: dart.fn((e, s) => {
              this[_controller$0].addError(e, core.StackTrace._check(s));
              this[_readInProgress] = false;
              this[_closeFile]();
            }, dynamicAnddynamicTodynamic$())});
        } else {
          onReady(file);
        }
      }).bind(this);
      dart.fn(onOpenFile, RandomAccessFileTovoid());
      const openFailed = (function(error, stackTrace) {
        this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
        this[_controller$0].close();
        this[_closeCompleter].complete();
      }).bind(this);
      dart.fn(openFailed, dynamicAnddynamicTovoid$());
      if (this[_path$] != null) {
        io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.dynamic)(onOpenFile, {onError: openFailed});
      } else {
        try {
          onOpenFile(io._File._openStdioSync(0));
        } catch (e) {
          let s = dart.stackTrace(e);
          openFailed(e, s);
        }

      }
    }
  };
  dart.addSimpleTypeTests(io._FileStream);
  dart.defineNamedConstructor(io._FileStream, 'forStdin');
  dart.setSignature(io._FileStream, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._FileStream, [core.String, core.int, core.int]),
      forStdin: dart.definiteFunctionType(io._FileStream, [])
    }),
    fields: () => ({
      [_controller$0]: StreamControllerOfListOfint(),
      [_path$]: core.String,
      [_openedFile]: io.RandomAccessFile,
      [_position$0]: core.int,
      [_end$0]: core.int,
      [_closeCompleter]: async.Completer,
      [_unsubscribed]: core.bool,
      [_readInProgress]: core.bool,
      [_closed]: core.bool,
      [_atEnd]: core.bool
    }),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      [_setupController]: dart.definiteFunctionType(dart.void, []),
      [_closeFile]: dart.definiteFunctionType(async.Future, []),
      [_readBlock]: dart.definiteFunctionType(dart.void, []),
      [_start$2]: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _file = Symbol('_file');
  const _openFuture = Symbol('_openFuture');
  io._FileStreamConsumer = class _FileStreamConsumer extends async.StreamConsumer$(core.List$(core.int)) {
    new(file, mode) {
      this[_file] = file;
      this[_openFuture] = null;
      this[_openFuture] = this[_file].open({mode: mode});
    }
    fromStdio(fd) {
      this[_file] = null;
      this[_openFuture] = null;
      dart.assert(1 <= dart.notNull(fd) && dart.notNull(fd) <= 2);
      this[_openFuture] = FutureOfRandomAccessFile().value(io._File._openStdioSync(fd));
    }
    addStream(stream) {
      let completer = CompleterOfFile().sync();
      this[_openFuture].then(dart.dynamic)(dart.fn(openedFile => {
        let _subscription = null;
        function error(e, stackTrace) {
          if (stackTrace === void 0) stackTrace = null;
          dart.dsend(_subscription, 'cancel');
          openedFile.close();
          completer.completeError(e, stackTrace);
        }
        dart.fn(error, dynamic__Tovoid());
        _subscription = stream.listen(dart.fn(d => {
          dart.dsend(_subscription, 'pause');
          try {
            openedFile.writeFrom(d, 0, d[dartx.length]).then(dart.dynamic)(dart.fn(_ => dart.dsend(_subscription, 'resume'), RandomAccessFileTodynamic()), {onError: error});
          } catch (e) {
            let stackTrace = dart.stackTrace(e);
            error(e, stackTrace);
          }

        }, ListOfintTovoid$()), {onDone: dart.fn(() => {
            completer.complete(this[_file]);
          }, VoidTovoid$()), onError: error, cancelOnError: true});
      }, RandomAccessFileTodynamic())).catchError(dart.bind(completer, 'completeError'));
      return completer.future;
    }
    close() {
      return this[_openFuture].then(io.File)(dart.fn(openedFile => openedFile.close(), RandomAccessFileToFutureOfRandomAccessFile()));
    }
  };
  dart.addSimpleTypeTests(io._FileStreamConsumer);
  dart.defineNamedConstructor(io._FileStreamConsumer, 'fromStdio');
  dart.setSignature(io._FileStreamConsumer, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._FileStreamConsumer, [io.File, io.FileMode]),
      fromStdio: dart.definiteFunctionType(io._FileStreamConsumer, [core.int])
    }),
    fields: () => ({
      [_file]: io.File,
      [_openFuture]: FutureOfRandomAccessFile()
    }),
    methods: () => ({
      addStream: dart.definiteFunctionType(async.Future$(io.File), [StreamOfListOfint()]),
      close: dart.definiteFunctionType(async.Future$(io.File), [])
    })
  });
  const _tryDecode = Symbol('_tryDecode');
  let const$54;
  let const$55;
  io._File = class _File extends io.FileSystemEntity {
    new(path) {
      this.path = path;
      if (!(typeof this.path == 'string')) {
        dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
      }
    }
    exists() {
      return io._IOService._dispatch(io._FILE_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot check existence", this.path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    static _exists(path) {
      dart.throw(new core.UnsupportedError("File._exists"));
    }
    existsSync() {
      let result = io._File._exists(this.path);
      io._File.throwIfError(result, "Cannot check existence of file", this.path);
      return core.bool._check(result);
    }
    get absolute() {
      return io.File.new(this[_absolutePath]);
    }
    stat() {
      return io.FileStat.stat(this.path);
    }
    statSync() {
      return io.FileStat.statSync(this.path);
    }
    create(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
      return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE, JSArrayOfString().of([this.path])), dynamicToFuture())).then(io._File)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot create file", this.path));
        }
        return this;
      }, dynamicTo_File()));
    }
    static _create(path) {
      dart.throw(new core.UnsupportedError("File._create"));
    }
    static _createLink(path, target) {
      dart.throw(new core.UnsupportedError("File._createLink"));
    }
    static _linkTarget(path) {
      dart.throw(new core.UnsupportedError("File._linkTarget"));
    }
    createSync(opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        this.parent.createSync({recursive: true});
      }
      let result = io._File._create(this.path);
      io._File.throwIfError(result, "Cannot create file", this.path);
    }
    [_delete](opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        return io.Directory.new(this.path).delete({recursive: true}).then(io._File)(dart.fn(_ => this, FileSystemEntityTo_File()));
      }
      return io._IOService._dispatch(io._FILE_DELETE, JSArrayOfString().of([this.path])).then(io._File)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot delete file", this.path));
        }
        return this;
      }, dynamicTo_File()));
    }
    static _deleteNative(path) {
      dart.throw(new core.UnsupportedError("File._deleteNative"));
    }
    static _deleteLinkNative(path) {
      dart.throw(new core.UnsupportedError("File._deleteLinkNative"));
    }
    [_deleteSync](opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        return io.Directory.new(this.path).deleteSync({recursive: true});
      }
      let result = io._File._deleteNative(this.path);
      io._File.throwIfError(result, "Cannot delete file", this.path);
    }
    rename(newPath) {
      return io._IOService._dispatch(io._FILE_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, dart.str`Cannot rename file to '${newPath}'`, this.path));
        }
        return io.File.new(newPath);
      }, dynamicToFile()));
    }
    static _rename(oldPath, newPath) {
      dart.throw(new core.UnsupportedError("File._rename"));
    }
    static _renameLink(oldPath, newPath) {
      dart.throw(new core.UnsupportedError("File._renameLink"));
    }
    renameSync(newPath) {
      let result = io._File._rename(this.path, newPath);
      io._File.throwIfError(result, dart.str`Cannot rename file to '${newPath}'`, this.path);
      return io.File.new(newPath);
    }
    copy(newPath) {
      return io._IOService._dispatch(io._FILE_COPY, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, dart.str`Cannot copy file to '${newPath}'`, this.path));
        }
        return io.File.new(newPath);
      }, dynamicToFile()));
    }
    static _copy(oldPath, newPath) {
      dart.throw(new core.UnsupportedError("File._copy"));
    }
    copySync(newPath) {
      let result = io._File._copy(this.path, newPath);
      io._File.throwIfError(result, dart.str`Cannot copy file to '${newPath}'`, this.path);
      return io.File.new(newPath);
    }
    open(opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
      if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
        return FutureOfRandomAccessFile().error(new core.ArgumentError('Invalid file mode for this operation'));
      }
      return io._IOService._dispatch(io._FILE_OPEN, JSArrayOfObject().of([this.path, mode[_mode]])).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot open file", this.path));
        }
        return new io._RandomAccessFile(core.int._check(response), this.path);
      }, dynamicTo_RandomAccessFile()));
    }
    length() {
      return io._IOService._dispatch(io._FILE_LENGTH_FROM_PATH, JSArrayOfString().of([this.path])).then(core.int)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot retrieve length of file", this.path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    static _lengthFromPath(path) {
      dart.throw(new core.UnsupportedError("File._lengthFromPath"));
    }
    lengthSync() {
      let result = io._File._lengthFromPath(this.path);
      io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
      return core.int._check(result);
    }
    lastModified() {
      return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "Cannot retrieve modification time", this.path));
        }
        return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
      }, dynamicToDateTime()));
    }
    static _lastModified(path) {
      dart.throw(new core.UnsupportedError("File._lastModified"));
    }
    lastModifiedSync() {
      let ms = io._File._lastModified(this.path);
      io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
    }
    static _open(path, mode) {
      dart.throw(new core.UnsupportedError("File._open"));
    }
    openSync(opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
      if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
        dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
      }
      let id = io._File._open(this.path, mode[_mode]);
      io._File.throwIfError(id, "Cannot open file", this.path);
      return new io._RandomAccessFile(core.int._check(id), this.path);
    }
    static _openStdio(fd) {
      dart.throw(new core.UnsupportedError("File._openStdio"));
    }
    static _openStdioSync(fd) {
      let id = io._File._openStdio(fd);
      if (id == 0) {
        dart.throw(new io.FileSystemException(dart.str`Cannot open stdio file for: ${fd}`));
      }
      return new io._RandomAccessFile(id, "");
    }
    openRead(start, end) {
      if (start === void 0) start = null;
      if (end === void 0) end = null;
      return new io._FileStream(this.path, start, end);
    }
    openWrite(opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      if (!dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
        dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
      }
      let consumer = new io._FileStreamConsumer(this, mode);
      return io.IOSink.new(consumer, {encoding: encoding});
    }
    readAsBytes() {
      function readDataChunked(file) {
        let builder = io.BytesBuilder.new({copy: false});
        let completer = async.Completer.new();
        function read() {
          dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
              builder.add(ListOfint()._check(data));
              read();
            } else {
              completer.complete(builder.takeBytes());
            }
          }, dynamicTodynamic$()), {onError: dart.bind(completer, 'completeError')});
        }
        dart.fn(read, VoidTovoid$());
        read();
        return FutureOfListOfint()._check(completer.future);
      }
      dart.fn(readDataChunked, dynamicToFutureOfListOfint());
      return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
        if (length == 0) {
          return readDataChunked(file);
        }
        return file.read(length);
      }, intToFutureOfListOfint())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfListOfint()));
    }
    readAsBytesSync() {
      let opened = this.openSync();
      try {
        let data = null;
        let length = opened.lengthSync();
        if (length == 0) {
          let builder = io.BytesBuilder.new({copy: false});
          do {
            data = opened.readSync(io._BLOCK_SIZE);
            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
          } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
          data = builder.takeBytes();
        } else {
          data = opened.readSync(length);
        }
        return ListOfint()._check(data);
      } finally {
        opened.closeSync();
      }
    }
    [_tryDecode](bytes, encoding) {
      try {
        return encoding.decode(bytes);
      } catch (_) {
        dart.throw(new io.FileSystemException(dart.str`Failed to decode data using encoding '${encoding.name}'`, this.path));
      }

    }
    readAsString(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return this.readAsBytes().then(core.String)(dart.fn(bytes => this[_tryDecode](bytes, encoding), ListOfintToString()));
    }
    readAsStringSync(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return this[_tryDecode](this.readAsBytesSync(), encoding);
    }
    readAsLines(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
    }
    readAsLinesSync(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
    }
    writeAsBytes(bytes, opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
      let flush = opts && 'flush' in opts ? opts.flush : false;
      return this.open({mode: mode}).then(io.File)(dart.fn(file => file.writeFrom(bytes, 0, bytes[dartx.length]).then(dart.dynamic)(dart.fn(_ => {
        if (dart.test(flush)) return file.flush().then(io._File)(dart.fn(_ => this, RandomAccessFileTo_File()));
        return this;
      }, RandomAccessFileToObject())).whenComplete(dart.bind(file, 'close')), RandomAccessFileTodynamic()));
    }
    writeAsBytesSync(bytes, opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
      let flush = opts && 'flush' in opts ? opts.flush : false;
      let opened = this.openSync({mode: mode});
      try {
        opened.writeFromSync(bytes, 0, bytes[dartx.length]);
        if (dart.test(flush)) opened.flushSync();
      } finally {
        opened.closeSync();
      }
    }
    writeAsString(contents, opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      let flush = opts && 'flush' in opts ? opts.flush : false;
      try {
        return this.writeAsBytes(encoding.encode(contents), {mode: mode, flush: flush});
      } catch (e) {
        return FutureOfFile().error(e);
      }

    }
    writeAsStringSync(contents, opts) {
      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      let flush = opts && 'flush' in opts ? opts.flush : false;
      this.writeAsBytesSync(encoding.encode(contents), {mode: mode, flush: flush});
    }
    toString() {
      return dart.str`File: '${this.path}'`;
    }
    static throwIfError(result, msg, path) {
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException(msg, path, result));
      }
    }
  };
  io._File[dart.implements] = () => [io.File];
  dart.setSignature(io._File, {
    constructors: () => ({new: dart.definiteFunctionType(io._File, [core.String])}),
    fields: () => ({path: core.String}),
    getters: () => ({absolute: dart.definiteFunctionType(io.File, [])}),
    methods: () => ({
      exists: dart.definiteFunctionType(async.Future$(core.bool), []),
      existsSync: dart.definiteFunctionType(core.bool, []),
      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
      statSync: dart.definiteFunctionType(io.FileStat, []),
      create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
      createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
      [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
      [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
      rename: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
      renameSync: dart.definiteFunctionType(io.File, [core.String]),
      copy: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
      copySync: dart.definiteFunctionType(io.File, [core.String]),
      open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
      length: dart.definiteFunctionType(async.Future$(core.int), []),
      lengthSync: dart.definiteFunctionType(core.int, []),
      lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
      lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
      openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
      openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
      openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
      readAsBytes: dart.definiteFunctionType(async.Future$(core.List$(core.int)), []),
      readAsBytesSync: dart.definiteFunctionType(core.List$(core.int), []),
      [_tryDecode]: dart.definiteFunctionType(core.String, [ListOfint(), convert.Encoding]),
      readAsString: dart.definiteFunctionType(async.Future$(core.String), [], {encoding: convert.Encoding}),
      readAsStringSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding}),
      readAsLines: dart.definiteFunctionType(async.Future$(core.List$(core.String)), [], {encoding: convert.Encoding}),
      readAsLinesSync: dart.definiteFunctionType(core.List$(core.String), [], {encoding: convert.Encoding}),
      writeAsBytes: dart.definiteFunctionType(async.Future$(io.File), [ListOfint()], {mode: io.FileMode, flush: core.bool}),
      writeAsBytesSync: dart.definiteFunctionType(dart.void, [ListOfint()], {mode: io.FileMode, flush: core.bool}),
      writeAsString: dart.definiteFunctionType(async.Future$(io.File), [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool}),
      writeAsStringSync: dart.definiteFunctionType(dart.void, [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool})
    }),
    statics: () => ({
      _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _createLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      _linkTarget: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _deleteLinkNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
      _openStdio: dart.definiteFunctionType(core.int, [core.int]),
      _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
      throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
    }),
    names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
  });
  io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
    static new(pointer) {
      dart.throw(new core.UnsupportedError("RandomAccessFile"));
    }
  };
  dart.setSignature(io._RandomAccessFileOps, {
    constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFileOps, [core.int])})
  });
  const _asyncDispatched = Symbol('_asyncDispatched');
  const _fileService = Symbol('_fileService');
  const _resourceInfo = Symbol('_resourceInfo');
  const _maybeConnectHandler = Symbol('_maybeConnectHandler');
  const _maybePerformCleanup = Symbol('_maybePerformCleanup');
  const _dispatch = Symbol('_dispatch');
  const _checkAvailable = Symbol('_checkAvailable');
  io._RandomAccessFile = class _RandomAccessFile extends core.Object {
    new(pointer, path) {
      this.path = path;
      this[_asyncDispatched] = false;
      this[_fileService] = null;
      this[_resourceInfo] = null;
      this[_ops] = null;
      this.closed = false;
      this[_ops] = io._RandomAccessFileOps.new(pointer);
      this[_resourceInfo] = new io._FileResourceInfo(this);
      this[_maybeConnectHandler]();
    }
    [_maybePerformCleanup]() {
      if (dart.test(this.closed)) {
        io._FileResourceInfo.FileClosed(this[_resourceInfo]);
      }
    }
    [_maybeConnectHandler]() {
      if (!dart.test(io._RandomAccessFile._connectedResourceHandler)) {
        developer.registerExtension('ext.dart.io.getOpenFiles', io._FileResourceInfo.getOpenFiles);
        developer.registerExtension('ext.dart.io.getFileByID', io._FileResourceInfo.getFileInfoMapByID);
        io._RandomAccessFile._connectedResourceHandler = true;
      }
    }
    close() {
      return this[_dispatch](io._FILE_CLOSE, [null], {markClosed: true}).then(io._RandomAccessFile)(dart.fn(result => {
        if (!dart.equals(result, -1)) {
          this.closed = dart.test(this.closed) || dart.equals(result, 0);
          this[_maybePerformCleanup]();
          return this;
        } else {
          dart.throw(new io.FileSystemException("Cannot close file", this.path));
        }
      }, dynamicTo_RandomAccessFile()));
    }
    closeSync() {
      this[_checkAvailable]();
      let id = this[_ops].close();
      if (id == -1) {
        dart.throw(new io.FileSystemException("Cannot close file", this.path));
      }
      this.closed = dart.test(this.closed) || id == 0;
      this[_maybePerformCleanup]();
    }
    readByte() {
      return this[_dispatch](io._FILE_READ_BYTE, [null]).then(core.int)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "readByte failed", this.path));
        }
        this[_resourceInfo].addRead(1);
        return response;
      }, dynamicTodynamic$()));
    }
    readByteSync() {
      this[_checkAvailable]();
      let result = this[_ops].readByte();
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("readByte failed", this.path, result));
      }
      this[_resourceInfo].addRead(1);
      return core.int._check(result);
    }
    read(bytes) {
      if (!(typeof bytes == 'number')) {
        dart.throw(new core.ArgumentError(bytes));
      }
      return this[_dispatch](io._FILE_READ, JSArrayOfint().of([null, bytes])).then(ListOfint())(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
        }
        this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
        return dart.dindex(response, 1);
      }, dynamicTodynamic$()));
    }
    readSync(bytes) {
      this[_checkAvailable]();
      if (!(typeof bytes == 'number')) {
        dart.throw(new core.ArgumentError(bytes));
      }
      let result = this[_ops].read(bytes);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("readSync failed", this.path, result));
      }
      this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
      return ListOfint()._check(result);
    }
    readInto(buffer, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError());
      }
      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
      if (end == start) {
        return FutureOfint().value(0);
      }
      let length = dart.notNull(end) - dart.notNull(start);
      return this[_dispatch](io._FILE_READ_INTO, JSArrayOfint().of([null, length])).then(core.int)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
        }
        let read = dart.dindex(response, 1);
        let data = dart.dindex(response, 2);
        buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
        this[_resourceInfo].addRead(core.int._check(read));
        return read;
      }, dynamicTodynamic$()));
    }
    readIntoSync(buffer, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      this[_checkAvailable]();
      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError());
      }
      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
      if (end == start) {
        return 0;
      }
      let result = this[_ops].readInto(buffer, start, end);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("readInto failed", this.path, result));
      }
      this[_resourceInfo].addRead(core.int._check(result));
      return core.int._check(result);
    }
    writeByte(value) {
      if (!(typeof value == 'number')) {
        dart.throw(new core.ArgumentError(value));
      }
      return this[_dispatch](io._FILE_WRITE_BYTE, JSArrayOfint().of([null, value])).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "writeByte failed", this.path));
        }
        this[_resourceInfo].addWrite(1);
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    writeByteSync(value) {
      this[_checkAvailable]();
      if (!(typeof value == 'number')) {
        dart.throw(new core.ArgumentError(value));
      }
      let result = this[_ops].writeByte(value);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("writeByte failed", this.path, result));
      }
      this[_resourceInfo].addWrite(1);
      return core.int._check(result);
    }
    writeFrom(buffer, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError("Invalid arguments to writeFrom"));
      }
      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
      if (end == start) {
        return FutureOfRandomAccessFile().value(this);
      }
      let result = null;
      try {
        result = io._ensureFastAndSerializableByteData(buffer, start, end);
      } catch (e) {
        return FutureOfRandomAccessFile().error(e);
      }

      let request = core.List.new(4);
      request[dartx._set](0, null);
      request[dartx._set](1, result.buffer);
      request[dartx._set](2, result.start);
      request[dartx._set](3, dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
      return this[_dispatch](io._FILE_WRITE_FROM, request).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "writeFrom failed", this.path));
        }
        this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    writeFromSync(buffer, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      this[_checkAvailable]();
      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError("Invalid arguments to writeFromSync"));
      }
      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
      if (end == start) {
        return;
      }
      let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
      let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
      }
      this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
    }
    writeString(string, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      if (!convert.Encoding.is(encoding)) {
        dart.throw(new core.ArgumentError(encoding));
      }
      let data = encoding.encode(string);
      return this.writeFrom(data, 0, data[dartx.length]);
    }
    writeStringSync(string, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      if (!convert.Encoding.is(encoding)) {
        dart.throw(new core.ArgumentError(encoding));
      }
      let data = encoding.encode(string);
      this.writeFromSync(data, 0, data[dartx.length]);
    }
    position() {
      return this[_dispatch](io._FILE_POSITION, [null]).then(core.int)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "position failed", this.path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    positionSync() {
      this[_checkAvailable]();
      let result = this[_ops].position();
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("position failed", this.path, result));
      }
      return core.int._check(result);
    }
    setPosition(position) {
      return this[_dispatch](io._FILE_SET_POSITION, JSArrayOfint().of([null, position])).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "setPosition failed", this.path));
        }
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    setPositionSync(position) {
      this[_checkAvailable]();
      let result = this[_ops].setPosition(position);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("setPosition failed", this.path, result));
      }
    }
    truncate(length) {
      return this[_dispatch](io._FILE_TRUNCATE, JSArrayOfint().of([null, length])).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "truncate failed", this.path));
        }
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    truncateSync(length) {
      this[_checkAvailable]();
      let result = this[_ops].truncate(length);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("truncate failed", this.path, result));
      }
    }
    length() {
      return this[_dispatch](io._FILE_LENGTH, [null]).then(core.int)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "length failed", this.path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    lengthSync() {
      this[_checkAvailable]();
      let result = this[_ops].length();
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("length failed", this.path, result));
      }
      return core.int._check(result);
    }
    flush() {
      return this[_dispatch](io._FILE_FLUSH, [null]).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, "flush failed", this.path));
        }
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    flushSync() {
      this[_checkAvailable]();
      let result = this[_ops].flush();
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException("flush failed", this.path, result));
      }
    }
    lock(mode, start, end) {
      if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
      if (start === void 0) start = 0;
      if (end === void 0) end = -1;
      if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError());
      }
      if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
        dart.throw(new core.ArgumentError());
      }
      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
      return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
        }
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    unlock(start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = -1;
      if (!(typeof start == 'number') || !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError());
      }
      if (start == end) {
        dart.throw(new core.ArgumentError());
      }
      return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, io._RandomAccessFile.LOCK_UNLOCK, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          dart.throw(io._exceptionFromResponse(response, 'unlock failed', this.path));
        }
        return this;
      }, dynamicTo_RandomAccessFile()));
    }
    lockSync(mode, start, end) {
      if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
      if (start === void 0) start = 0;
      if (end === void 0) end = -1;
      this[_checkAvailable]();
      if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError());
      }
      if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
        dart.throw(new core.ArgumentError());
      }
      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
      let result = this[_ops].lock(lock, start, end);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException('lock failed', this.path, result));
      }
    }
    unlockSync(start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = -1;
      this[_checkAvailable]();
      if (!(typeof start == 'number') || !(typeof end == 'number')) {
        dart.throw(new core.ArgumentError());
      }
      if (start == end) {
        dart.throw(new core.ArgumentError());
      }
      let result = this[_ops].lock(io._RandomAccessFile.LOCK_UNLOCK, start, end);
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException('unlock failed', this.path, result));
      }
    }
    [_pointer]() {
      return this[_ops].getPointer();
    }
    [_dispatch](request, data, opts) {
      let markClosed = opts && 'markClosed' in opts ? opts.markClosed : false;
      if (dart.test(this.closed)) {
        return async.Future.error(new io.FileSystemException("File closed", this.path));
      }
      if (dart.test(this[_asyncDispatched])) {
        let msg = "An async operation is currently pending";
        return async.Future.error(new io.FileSystemException(msg, this.path));
      }
      if (dart.test(markClosed)) {
        this.closed = true;
      }
      this[_asyncDispatched] = true;
      data[dartx._set](0, this[_pointer]());
      return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
        this[_asyncDispatched] = false;
      }, VoidTodynamic$()));
    }
    [_checkAvailable]() {
      if (dart.test(this[_asyncDispatched])) {
        dart.throw(new io.FileSystemException("An async operation is currently pending", this.path));
      }
      if (dart.test(this.closed)) {
        dart.throw(new io.FileSystemException("File closed", this.path));
      }
    }
  };
  io._RandomAccessFile[dart.implements] = () => [io.RandomAccessFile];
  dart.setSignature(io._RandomAccessFile, {
    constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFile, [core.int, core.String])}),
    fields: () => ({
      path: core.String,
      [_asyncDispatched]: core.bool,
      [_fileService]: isolate.SendPort,
      [_resourceInfo]: io._FileResourceInfo,
      [_ops]: io._RandomAccessFileOps,
      closed: core.bool
    }),
    methods: () => ({
      [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
      [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
      close: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
      closeSync: dart.definiteFunctionType(dart.void, []),
      readByte: dart.definiteFunctionType(async.Future$(core.int), []),
      readByteSync: dart.definiteFunctionType(core.int, []),
      read: dart.definiteFunctionType(async.Future$(core.List$(core.int)), [core.int]),
      readSync: dart.definiteFunctionType(core.List$(core.int), [core.int]),
      readInto: dart.definiteFunctionType(async.Future$(core.int), [ListOfint()], [core.int, core.int]),
      readIntoSync: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
      writeByte: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
      writeByteSync: dart.definiteFunctionType(core.int, [core.int]),
      writeFrom: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [ListOfint()], [core.int, core.int]),
      writeFromSync: dart.definiteFunctionType(dart.void, [ListOfint()], [core.int, core.int]),
      writeString: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.String], {encoding: convert.Encoding}),
      writeStringSync: dart.definiteFunctionType(dart.void, [core.String], {encoding: convert.Encoding}),
      position: dart.definiteFunctionType(async.Future$(core.int), []),
      positionSync: dart.definiteFunctionType(core.int, []),
      setPosition: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
      setPositionSync: dart.definiteFunctionType(dart.void, [core.int]),
      truncate: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
      truncateSync: dart.definiteFunctionType(dart.void, [core.int]),
      length: dart.definiteFunctionType(async.Future$(core.int), []),
      lengthSync: dart.definiteFunctionType(core.int, []),
      flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
      flushSync: dart.definiteFunctionType(dart.void, []),
      lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
      unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
      lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
      unlockSync: dart.definiteFunctionType(dart.void, [], [core.int, core.int]),
      [_pointer]: dart.definiteFunctionType(core.int, []),
      [_dispatch]: dart.definiteFunctionType(async.Future, [core.int, core.List], {markClosed: core.bool}),
      [_checkAvailable]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      _connectedResourceHandler: core.bool,
      LOCK_UNLOCK: core.int,
      LOCK_SHARED: core.int,
      LOCK_EXCLUSIVE: core.int
    })
  });
  io._RandomAccessFile._connectedResourceHandler = false;
  io._RandomAccessFile.LOCK_UNLOCK = 0;
  io._RandomAccessFile.LOCK_SHARED = 1;
  io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
  let const$56;
  io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
    _internal(type) {
      this[_type] = type;
    }
    static _lookup(type) {
      return io.FileSystemEntityType._typeList[dartx._get](type);
    }
    toString() {
      return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
    }
  };
  dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
  dart.setSignature(io.FileSystemEntityType, {
    constructors: () => ({_internal: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
    fields: () => ({[_type]: core.int}),
    sfields: () => ({
      FILE: io.FileSystemEntityType,
      DIRECTORY: io.FileSystemEntityType,
      LINK: io.FileSystemEntityType,
      NOT_FOUND: io.FileSystemEntityType,
      _typeList: ListOfFileSystemEntityType()
    }),
    statics: () => ({_lookup: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
    names: ['_lookup']
  });
  dart.defineLazy(io.FileSystemEntityType, {
    get FILE() {
      return dart.const(new io.FileSystemEntityType._internal(0));
    },
    get DIRECTORY() {
      return dart.const(new io.FileSystemEntityType._internal(1));
    },
    get LINK() {
      return dart.const(new io.FileSystemEntityType._internal(2));
    },
    get NOT_FOUND() {
      return dart.const(new io.FileSystemEntityType._internal(3));
    },
    get _typeList() {
      return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
    }
  });
  let const$57;
  io.FileStat = class FileStat extends core.Object {
    _internal(changed, modified, accessed, type, mode, size) {
      this.changed = changed;
      this.modified = modified;
      this.accessed = accessed;
      this.type = type;
      this.mode = mode;
      this.size = size;
    }
    _internalNotFound() {
      this.changed = null;
      this.modified = null;
      this.accessed = null;
      this.type = io.FileSystemEntityType.NOT_FOUND;
      this.mode = 0;
      this.size = -1;
    }
    static _statSync(path) {
      dart.throw(new core.UnsupportedError("FileStat.stat"));
    }
    static statSync(path) {
      if (dart.test(io.Platform.isWindows)) {
        path = io.FileSystemEntity._trimTrailingPathSeparators(path);
      }
      let data = io.FileStat._statSync(path);
      if (io.OSError.is(data)) return io.FileStat._notFound;
      return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(dart.dindex(data, io.FileStat._TYPE))), core.int._check(dart.dindex(data, io.FileStat._MODE)), core.int._check(dart.dindex(data, io.FileStat._SIZE)));
    }
    static stat(path) {
      if (dart.test(io.Platform.isWindows)) {
        path = io.FileSystemEntity._trimTrailingPathSeparators(path);
      }
      return io._IOService._dispatch(io._FILE_STAT, JSArrayOfString().of([path])).then(io.FileStat)(dart.fn(response => {
        if (dart.test(io._isErrorResponse(response))) {
          return io.FileStat._notFound;
        }
        let data = core.List._check(dart.dindex(response, 1));
        return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(data[dartx._get](io.FileStat._TYPE))), core.int._check(data[dartx._get](io.FileStat._MODE)), core.int._check(data[dartx._get](io.FileStat._SIZE)));
      }, dynamicToFileStat()));
    }
    toString() {
      return dart.str`FileStat: type ${this.type}\n          changed ${this.changed}\n          modified ${this.modified}\n          accessed ${this.accessed}\n          mode ${this.modeString()}\n          size ${this.size}`;
    }
    modeString() {
      let permissions = dart.notNull(this.mode) & 4095;
      let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
      let result = [];
      if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
      if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
      if ((permissions & 512) != 0) result[dartx.add]("(sticky) ");
      result[dartx.add](codes[dartx._get](permissions >> 6 & 7));
      result[dartx.add](codes[dartx._get](permissions >> 3 & 7));
      result[dartx.add](codes[dartx._get](permissions & 7));
      return result[dartx.join]();
    }
  };
  dart.defineNamedConstructor(io.FileStat, '_internal');
  dart.defineNamedConstructor(io.FileStat, '_internalNotFound');
  dart.setSignature(io.FileStat, {
    constructors: () => ({
      _internal: dart.definiteFunctionType(io.FileStat, [core.DateTime, core.DateTime, core.DateTime, io.FileSystemEntityType, core.int, core.int]),
      _internalNotFound: dart.definiteFunctionType(io.FileStat, [])
    }),
    fields: () => ({
      changed: core.DateTime,
      modified: core.DateTime,
      accessed: core.DateTime,
      type: io.FileSystemEntityType,
      mode: core.int,
      size: core.int
    }),
    methods: () => ({modeString: dart.definiteFunctionType(core.String, [])}),
    sfields: () => ({
      _TYPE: core.int,
      _CHANGED_TIME: core.int,
      _MODIFIED_TIME: core.int,
      _ACCESSED_TIME: core.int,
      _MODE: core.int,
      _SIZE: core.int,
      _notFound: io.FileStat
    }),
    statics: () => ({
      _statSync: dart.definiteFunctionType(dart.dynamic, [core.String]),
      statSync: dart.definiteFunctionType(io.FileStat, [core.String]),
      stat: dart.definiteFunctionType(async.Future$(io.FileStat), [core.String])
    }),
    names: ['_statSync', 'statSync', 'stat']
  });
  io.FileStat._TYPE = 0;
  io.FileStat._CHANGED_TIME = 1;
  io.FileStat._MODIFIED_TIME = 2;
  io.FileStat._ACCESSED_TIME = 3;
  io.FileStat._MODE = 4;
  io.FileStat._SIZE = 5;
  dart.defineLazy(io.FileStat, {
    get _notFound() {
      return dart.const(new io.FileStat._internalNotFound());
    }
  });
  io.FileSystemEvent = class FileSystemEvent extends core.Object {
    _(type, path, isDirectory) {
      this.type = type;
      this.path = path;
      this.isDirectory = isDirectory;
    }
  };
  dart.defineNamedConstructor(io.FileSystemEvent, '_');
  dart.setSignature(io.FileSystemEvent, {
    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemEvent, [core.int, core.String, core.bool])}),
    fields: () => ({
      type: core.int,
      path: core.String,
      isDirectory: core.bool
    }),
    sfields: () => ({
      CREATE: core.int,
      MODIFY: core.int,
      DELETE: core.int,
      MOVE: core.int,
      ALL: core.int,
      _MODIFY_ATTRIBUTES: core.int,
      _DELETE_SELF: core.int,
      _IS_DIR: core.int
    })
  });
  io.FileSystemEvent.CREATE = 1 << 0;
  io.FileSystemEvent.MODIFY = 1 << 1;
  io.FileSystemEvent.DELETE = 1 << 2;
  io.FileSystemEvent.MOVE = 1 << 3;
  io.FileSystemEvent._MODIFY_ATTRIBUTES = 1 << 4;
  io.FileSystemEvent._DELETE_SELF = 1 << 5;
  io.FileSystemEvent._IS_DIR = 1 << 6;
  dart.defineLazy(io.FileSystemEvent, {
    get ALL() {
      return io.FileSystemEvent.CREATE | io.FileSystemEvent.MODIFY | io.FileSystemEvent.DELETE | io.FileSystemEvent.MOVE;
    }
  });
  io.FileSystemCreateEvent = class FileSystemCreateEvent extends io.FileSystemEvent {
    _(path, isDirectory) {
      super._(io.FileSystemEvent.CREATE, core.String._check(path), core.bool._check(isDirectory));
    }
    toString() {
      return dart.str`FileSystemCreateEvent('${this.path}')`;
    }
  };
  dart.defineNamedConstructor(io.FileSystemCreateEvent, '_');
  dart.setSignature(io.FileSystemCreateEvent, {
    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemCreateEvent, [dart.dynamic, dart.dynamic])})
  });
  io.FileSystemModifyEvent = class FileSystemModifyEvent extends io.FileSystemEvent {
    _(path, isDirectory, contentChanged) {
      this.contentChanged = contentChanged;
      super._(io.FileSystemEvent.MODIFY, core.String._check(path), core.bool._check(isDirectory));
    }
    toString() {
      return dart.str`FileSystemModifyEvent('${this.path}', contentChanged=${this.contentChanged})`;
    }
  };
  dart.defineNamedConstructor(io.FileSystemModifyEvent, '_');
  dart.setSignature(io.FileSystemModifyEvent, {
    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemModifyEvent, [dart.dynamic, dart.dynamic, core.bool])}),
    fields: () => ({contentChanged: core.bool})
  });
  io.FileSystemDeleteEvent = class FileSystemDeleteEvent extends io.FileSystemEvent {
    _(path, isDirectory) {
      super._(io.FileSystemEvent.DELETE, core.String._check(path), core.bool._check(isDirectory));
    }
    toString() {
      return dart.str`FileSystemDeleteEvent('${this.path}')`;
    }
  };
  dart.defineNamedConstructor(io.FileSystemDeleteEvent, '_');
  dart.setSignature(io.FileSystemDeleteEvent, {
    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemDeleteEvent, [dart.dynamic, dart.dynamic])})
  });
  io.FileSystemMoveEvent = class FileSystemMoveEvent extends io.FileSystemEvent {
    _(path, isDirectory, destination) {
      this.destination = destination;
      super._(io.FileSystemEvent.MOVE, core.String._check(path), core.bool._check(isDirectory));
    }
    toString() {
      let buffer = new core.StringBuffer();
      buffer.write(dart.str`FileSystemMoveEvent('${this.path}'`);
      if (this.destination != null) buffer.write(dart.str`, '${this.destination}'`);
      buffer.write(')');
      return buffer.toString();
    }
  };
  dart.defineNamedConstructor(io.FileSystemMoveEvent, '_');
  dart.setSignature(io.FileSystemMoveEvent, {
    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemMoveEvent, [dart.dynamic, dart.dynamic, core.String])}),
    fields: () => ({destination: core.String})
  });
  io._FileSystemWatcher = class _FileSystemWatcher extends core.Object {
    static _watch(path, events, recursive) {
      dart.throw(new core.UnsupportedError("_FileSystemWatcher.watch"));
    }
    static get isSupported() {
      dart.throw(new core.UnsupportedError("_FileSystemWatcher.isSupported"));
    }
  };
  dart.setSignature(io._FileSystemWatcher, {
    sgetters: () => ({isSupported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [core.String, core.int, core.bool])}),
    names: ['_watch']
  });
  io.HttpStatus = class HttpStatus extends core.Object {};
  dart.setSignature(io.HttpStatus, {
    sfields: () => ({
      CONTINUE: core.int,
      SWITCHING_PROTOCOLS: core.int,
      OK: core.int,
      CREATED: core.int,
      ACCEPTED: core.int,
      NON_AUTHORITATIVE_INFORMATION: core.int,
      NO_CONTENT: core.int,
      RESET_CONTENT: core.int,
      PARTIAL_CONTENT: core.int,
      MULTIPLE_CHOICES: core.int,
      MOVED_PERMANENTLY: core.int,
      FOUND: core.int,
      MOVED_TEMPORARILY: core.int,
      SEE_OTHER: core.int,
      NOT_MODIFIED: core.int,
      USE_PROXY: core.int,
      TEMPORARY_REDIRECT: core.int,
      BAD_REQUEST: core.int,
      UNAUTHORIZED: core.int,
      PAYMENT_REQUIRED: core.int,
      FORBIDDEN: core.int,
      NOT_FOUND: core.int,
      METHOD_NOT_ALLOWED: core.int,
      NOT_ACCEPTABLE: core.int,
      PROXY_AUTHENTICATION_REQUIRED: core.int,
      REQUEST_TIMEOUT: core.int,
      CONFLICT: core.int,
      GONE: core.int,
      LENGTH_REQUIRED: core.int,
      PRECONDITION_FAILED: core.int,
      REQUEST_ENTITY_TOO_LARGE: core.int,
      REQUEST_URI_TOO_LONG: core.int,
      UNSUPPORTED_MEDIA_TYPE: core.int,
      REQUESTED_RANGE_NOT_SATISFIABLE: core.int,
      EXPECTATION_FAILED: core.int,
      INTERNAL_SERVER_ERROR: core.int,
      NOT_IMPLEMENTED: core.int,
      BAD_GATEWAY: core.int,
      SERVICE_UNAVAILABLE: core.int,
      GATEWAY_TIMEOUT: core.int,
      HTTP_VERSION_NOT_SUPPORTED: core.int,
      NETWORK_CONNECT_TIMEOUT_ERROR: core.int
    })
  });
  io.HttpStatus.CONTINUE = 100;
  io.HttpStatus.SWITCHING_PROTOCOLS = 101;
  io.HttpStatus.OK = 200;
  io.HttpStatus.CREATED = 201;
  io.HttpStatus.ACCEPTED = 202;
  io.HttpStatus.NON_AUTHORITATIVE_INFORMATION = 203;
  io.HttpStatus.NO_CONTENT = 204;
  io.HttpStatus.RESET_CONTENT = 205;
  io.HttpStatus.PARTIAL_CONTENT = 206;
  io.HttpStatus.MULTIPLE_CHOICES = 300;
  io.HttpStatus.MOVED_PERMANENTLY = 301;
  io.HttpStatus.FOUND = 302;
  io.HttpStatus.MOVED_TEMPORARILY = 302;
  io.HttpStatus.SEE_OTHER = 303;
  io.HttpStatus.NOT_MODIFIED = 304;
  io.HttpStatus.USE_PROXY = 305;
  io.HttpStatus.TEMPORARY_REDIRECT = 307;
  io.HttpStatus.BAD_REQUEST = 400;
  io.HttpStatus.UNAUTHORIZED = 401;
  io.HttpStatus.PAYMENT_REQUIRED = 402;
  io.HttpStatus.FORBIDDEN = 403;
  io.HttpStatus.NOT_FOUND = 404;
  io.HttpStatus.METHOD_NOT_ALLOWED = 405;
  io.HttpStatus.NOT_ACCEPTABLE = 406;
  io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED = 407;
  io.HttpStatus.REQUEST_TIMEOUT = 408;
  io.HttpStatus.CONFLICT = 409;
  io.HttpStatus.GONE = 410;
  io.HttpStatus.LENGTH_REQUIRED = 411;
  io.HttpStatus.PRECONDITION_FAILED = 412;
  io.HttpStatus.REQUEST_ENTITY_TOO_LARGE = 413;
  io.HttpStatus.REQUEST_URI_TOO_LONG = 414;
  io.HttpStatus.UNSUPPORTED_MEDIA_TYPE = 415;
  io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE = 416;
  io.HttpStatus.EXPECTATION_FAILED = 417;
  io.HttpStatus.INTERNAL_SERVER_ERROR = 500;
  io.HttpStatus.NOT_IMPLEMENTED = 501;
  io.HttpStatus.BAD_GATEWAY = 502;
  io.HttpStatus.SERVICE_UNAVAILABLE = 503;
  io.HttpStatus.GATEWAY_TIMEOUT = 504;
  io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED = 505;
  io.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR = 599;
  io.HttpServer = class HttpServer extends core.Object {
    static bind(address, port, opts) {
      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
      let shared = opts && 'shared' in opts ? opts.shared : false;
      return io._HttpServer.bind(address, port, backlog, v6Only, shared);
    }
    static bindSecure(address, port, context, opts) {
      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let shared = opts && 'shared' in opts ? opts.shared : false;
      return io._HttpServer.bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared);
    }
    static listenOn(serverSocket) {
      return new io._HttpServer.listenOn(serverSocket);
    }
  };
  io.HttpServer[dart.implements] = () => [StreamOfHttpRequest()];
  dart.setSignature(io.HttpServer, {
    constructors: () => ({listenOn: dart.definiteFunctionType(io.HttpServer, [io.ServerSocket])}),
    fields: () => ({
      serverHeader: core.String,
      autoCompress: core.bool,
      idleTimeout: core.Duration
    }),
    statics: () => ({
      bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool}),
      bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, shared: core.bool})
    }),
    names: ['bind', 'bindSecure']
  });
  io.HttpConnectionsInfo = class HttpConnectionsInfo extends core.Object {
    new() {
      this.total = 0;
      this.active = 0;
      this.idle = 0;
      this.closing = 0;
    }
  };
  dart.setSignature(io.HttpConnectionsInfo, {
    fields: () => ({
      total: core.int,
      active: core.int,
      idle: core.int,
      closing: core.int
    })
  });
  io.HttpHeaders = class HttpHeaders extends core.Object {
    new() {
      this.date = null;
      this.expires = null;
      this.ifModifiedSince = null;
      this.host = null;
      this.port = null;
      this.contentType = null;
      this.contentLength = null;
      this.persistentConnection = null;
      this.chunkedTransferEncoding = null;
    }
  };
  dart.setSignature(io.HttpHeaders, {
    fields: () => ({
      date: core.DateTime,
      expires: core.DateTime,
      ifModifiedSince: core.DateTime,
      host: core.String,
      port: core.int,
      contentType: io.ContentType,
      contentLength: core.int,
      persistentConnection: core.bool,
      chunkedTransferEncoding: core.bool
    }),
    sfields: () => ({
      ACCEPT: core.String,
      ACCEPT_CHARSET: core.String,
      ACCEPT_ENCODING: core.String,
      ACCEPT_LANGUAGE: core.String,
      ACCEPT_RANGES: core.String,
      AGE: core.String,
      ALLOW: core.String,
      AUTHORIZATION: core.String,
      CACHE_CONTROL: core.String,
      CONNECTION: core.String,
      CONTENT_ENCODING: core.String,
      CONTENT_LANGUAGE: core.String,
      CONTENT_LENGTH: core.String,
      CONTENT_LOCATION: core.String,
      CONTENT_MD5: core.String,
      CONTENT_RANGE: core.String,
      CONTENT_TYPE: core.String,
      DATE: core.String,
      ETAG: core.String,
      EXPECT: core.String,
      EXPIRES: core.String,
      FROM: core.String,
      HOST: core.String,
      IF_MATCH: core.String,
      IF_MODIFIED_SINCE: core.String,
      IF_NONE_MATCH: core.String,
      IF_RANGE: core.String,
      IF_UNMODIFIED_SINCE: core.String,
      LAST_MODIFIED: core.String,
      LOCATION: core.String,
      MAX_FORWARDS: core.String,
      PRAGMA: core.String,
      PROXY_AUTHENTICATE: core.String,
      PROXY_AUTHORIZATION: core.String,
      RANGE: core.String,
      REFERER: core.String,
      RETRY_AFTER: core.String,
      SERVER: core.String,
      TE: core.String,
      TRAILER: core.String,
      TRANSFER_ENCODING: core.String,
      UPGRADE: core.String,
      USER_AGENT: core.String,
      VARY: core.String,
      VIA: core.String,
      WARNING: core.String,
      WWW_AUTHENTICATE: core.String,
      COOKIE: core.String,
      SET_COOKIE: core.String,
      GENERAL_HEADERS: ListOfString(),
      ENTITY_HEADERS: ListOfString(),
      RESPONSE_HEADERS: ListOfString(),
      REQUEST_HEADERS: ListOfString()
    })
  });
  io.HttpHeaders.ACCEPT = "accept";
  io.HttpHeaders.ACCEPT_CHARSET = "accept-charset";
  io.HttpHeaders.ACCEPT_ENCODING = "accept-encoding";
  io.HttpHeaders.ACCEPT_LANGUAGE = "accept-language";
  io.HttpHeaders.ACCEPT_RANGES = "accept-ranges";
  io.HttpHeaders.AGE = "age";
  io.HttpHeaders.ALLOW = "allow";
  io.HttpHeaders.AUTHORIZATION = "authorization";
  io.HttpHeaders.CACHE_CONTROL = "cache-control";
  io.HttpHeaders.CONNECTION = "connection";
  io.HttpHeaders.CONTENT_ENCODING = "content-encoding";
  io.HttpHeaders.CONTENT_LANGUAGE = "content-language";
  io.HttpHeaders.CONTENT_LENGTH = "content-length";
  io.HttpHeaders.CONTENT_LOCATION = "content-location";
  io.HttpHeaders.CONTENT_MD5 = "content-md5";
  io.HttpHeaders.CONTENT_RANGE = "content-range";
  io.HttpHeaders.CONTENT_TYPE = "content-type";
  io.HttpHeaders.DATE = "date";
  io.HttpHeaders.ETAG = "etag";
  io.HttpHeaders.EXPECT = "expect";
  io.HttpHeaders.EXPIRES = "expires";
  io.HttpHeaders.FROM = "from";
  io.HttpHeaders.HOST = "host";
  io.HttpHeaders.IF_MATCH = "if-match";
  io.HttpHeaders.IF_MODIFIED_SINCE = "if-modified-since";
  io.HttpHeaders.IF_NONE_MATCH = "if-none-match";
  io.HttpHeaders.IF_RANGE = "if-range";
  io.HttpHeaders.IF_UNMODIFIED_SINCE = "if-unmodified-since";
  io.HttpHeaders.LAST_MODIFIED = "last-modified";
  io.HttpHeaders.LOCATION = "location";
  io.HttpHeaders.MAX_FORWARDS = "max-forwards";
  io.HttpHeaders.PRAGMA = "pragma";
  io.HttpHeaders.PROXY_AUTHENTICATE = "proxy-authenticate";
  io.HttpHeaders.PROXY_AUTHORIZATION = "proxy-authorization";
  io.HttpHeaders.RANGE = "range";
  io.HttpHeaders.REFERER = "referer";
  io.HttpHeaders.RETRY_AFTER = "retry-after";
  io.HttpHeaders.SERVER = "server";
  io.HttpHeaders.TE = "te";
  io.HttpHeaders.TRAILER = "trailer";
  io.HttpHeaders.TRANSFER_ENCODING = "transfer-encoding";
  io.HttpHeaders.UPGRADE = "upgrade";
  io.HttpHeaders.USER_AGENT = "user-agent";
  io.HttpHeaders.VARY = "vary";
  io.HttpHeaders.VIA = "via";
  io.HttpHeaders.WARNING = "warning";
  io.HttpHeaders.WWW_AUTHENTICATE = "www-authenticate";
  io.HttpHeaders.COOKIE = "cookie";
  io.HttpHeaders.SET_COOKIE = "set-cookie";
  dart.defineLazy(io.HttpHeaders, {
    get GENERAL_HEADERS() {
      return dart.constList([io.HttpHeaders.CACHE_CONTROL, io.HttpHeaders.CONNECTION, io.HttpHeaders.DATE, io.HttpHeaders.PRAGMA, io.HttpHeaders.TRAILER, io.HttpHeaders.TRANSFER_ENCODING, io.HttpHeaders.UPGRADE, io.HttpHeaders.VIA, io.HttpHeaders.WARNING], core.String);
    },
    get ENTITY_HEADERS() {
      return dart.constList([io.HttpHeaders.ALLOW, io.HttpHeaders.CONTENT_ENCODING, io.HttpHeaders.CONTENT_LANGUAGE, io.HttpHeaders.CONTENT_LENGTH, io.HttpHeaders.CONTENT_LOCATION, io.HttpHeaders.CONTENT_MD5, io.HttpHeaders.CONTENT_RANGE, io.HttpHeaders.CONTENT_TYPE, io.HttpHeaders.EXPIRES, io.HttpHeaders.LAST_MODIFIED], core.String);
    },
    get RESPONSE_HEADERS() {
      return dart.constList([io.HttpHeaders.ACCEPT_RANGES, io.HttpHeaders.AGE, io.HttpHeaders.ETAG, io.HttpHeaders.LOCATION, io.HttpHeaders.PROXY_AUTHENTICATE, io.HttpHeaders.RETRY_AFTER, io.HttpHeaders.SERVER, io.HttpHeaders.VARY, io.HttpHeaders.WWW_AUTHENTICATE], core.String);
    },
    get REQUEST_HEADERS() {
      return dart.constList([io.HttpHeaders.ACCEPT, io.HttpHeaders.ACCEPT_CHARSET, io.HttpHeaders.ACCEPT_ENCODING, io.HttpHeaders.ACCEPT_LANGUAGE, io.HttpHeaders.AUTHORIZATION, io.HttpHeaders.EXPECT, io.HttpHeaders.FROM, io.HttpHeaders.HOST, io.HttpHeaders.IF_MATCH, io.HttpHeaders.IF_MODIFIED_SINCE, io.HttpHeaders.IF_NONE_MATCH, io.HttpHeaders.IF_RANGE, io.HttpHeaders.IF_UNMODIFIED_SINCE, io.HttpHeaders.MAX_FORWARDS, io.HttpHeaders.PROXY_AUTHORIZATION, io.HttpHeaders.RANGE, io.HttpHeaders.REFERER, io.HttpHeaders.TE, io.HttpHeaders.USER_AGENT], core.String);
    }
  });
  io.HeaderValue = class HeaderValue extends core.Object {
    static new(value, parameters) {
      if (value === void 0) value = "";
      if (parameters === void 0) parameters = null;
      return new io._HeaderValue(value, parameters);
    }
    static parse(value, opts) {
      let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
      let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
      let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
      return io._HeaderValue.parse(value, {parameterSeparator: parameterSeparator, valueSeparator: valueSeparator, preserveBackslash: preserveBackslash});
    }
  };
  dart.setSignature(io.HeaderValue, {
    constructors: () => ({new: dart.definiteFunctionType(io.HeaderValue, [], [core.String, MapOfString$String()])}),
    statics: () => ({parse: dart.definiteFunctionType(io.HeaderValue, [core.String], {parameterSeparator: core.String, valueSeparator: core.String, preserveBackslash: core.bool})}),
    names: ['parse']
  });
  io.HttpSession = class HttpSession extends core.Object {};
  io.HttpSession[dart.implements] = () => [core.Map];
  io.ContentType = class ContentType extends core.Object {
    static new(primaryType, subType, opts) {
      let charset = opts && 'charset' in opts ? opts.charset : null;
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      return new io._ContentType(primaryType, subType, charset, parameters);
    }
    static parse(value) {
      return io._ContentType.parse(value);
    }
  };
  io.ContentType[dart.implements] = () => [io.HeaderValue];
  dart.setSignature(io.ContentType, {
    constructors: () => ({new: dart.definiteFunctionType(io.ContentType, [core.String, core.String], {charset: core.String, parameters: MapOfString$String()})}),
    sfields: () => ({
      TEXT: io.ContentType,
      HTML: io.ContentType,
      JSON: io.ContentType,
      BINARY: io.ContentType
    }),
    statics: () => ({parse: dart.definiteFunctionType(io.ContentType, [core.String])}),
    names: ['parse']
  });
  dart.defineLazy(io.ContentType, {
    get TEXT() {
      return io.ContentType.new("text", "plain", {charset: "utf-8"});
    },
    get HTML() {
      return io.ContentType.new("text", "html", {charset: "utf-8"});
    },
    get JSON() {
      return io.ContentType.new("application", "json", {charset: "utf-8"});
    },
    get BINARY() {
      return io.ContentType.new("application", "octet-stream");
    }
  });
  io.Cookie = class Cookie extends core.Object {
    static new(name, value) {
      if (name === void 0) name = null;
      if (value === void 0) value = null;
      return new io._Cookie(name, value);
    }
    static fromSetCookieValue(value) {
      return new io._Cookie.fromSetCookieValue(value);
    }
  };
  dart.setSignature(io.Cookie, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.Cookie, [], [core.String, core.String]),
      fromSetCookieValue: dart.definiteFunctionType(io.Cookie, [core.String])
    }),
    fields: () => ({
      name: core.String,
      value: core.String,
      expires: core.DateTime,
      maxAge: core.int,
      domain: core.String,
      path: core.String,
      secure: core.bool,
      httpOnly: core.bool
    })
  });
  io.HttpRequest = class HttpRequest extends core.Object {};
  io.HttpRequest[dart.implements] = () => [StreamOfListOfint()];
  io.HttpResponse = class HttpResponse extends core.Object {
    new() {
      this.contentLength = null;
      this.statusCode = null;
      this.reasonPhrase = null;
      this.persistentConnection = null;
      this.deadline = null;
      this.bufferOutput = null;
    }
  };
  io.HttpResponse[dart.implements] = () => [io.IOSink];
  dart.setSignature(io.HttpResponse, {
    fields: () => ({
      contentLength: core.int,
      statusCode: core.int,
      reasonPhrase: core.String,
      persistentConnection: core.bool,
      deadline: core.Duration,
      bufferOutput: core.bool
    })
  });
  io.HttpClient = class HttpClient extends core.Object {
    static new(opts) {
      let context = opts && 'context' in opts ? opts.context : null;
      return new io._HttpClient(context);
    }
    static findProxyFromEnvironment(url, opts) {
      let environment = opts && 'environment' in opts ? opts.environment : null;
      return io._HttpClient._findProxyFromEnvironment(url, environment);
    }
  };
  dart.setSignature(io.HttpClient, {
    constructors: () => ({new: dart.definiteFunctionType(io.HttpClient, [], {context: io.SecurityContext})}),
    fields: () => ({
      idleTimeout: core.Duration,
      maxConnectionsPerHost: core.int,
      autoUncompress: core.bool,
      userAgent: core.String
    }),
    sfields: () => ({
      DEFAULT_HTTP_PORT: core.int,
      DEFAULT_HTTPS_PORT: core.int
    }),
    statics: () => ({findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri], {environment: MapOfString$String()})}),
    names: ['findProxyFromEnvironment']
  });
  io.HttpClient.DEFAULT_HTTP_PORT = 80;
  io.HttpClient.DEFAULT_HTTPS_PORT = 443;
  io.HttpClientRequest = class HttpClientRequest extends core.Object {
    new() {
      this.persistentConnection = null;
      this.followRedirects = null;
      this.maxRedirects = null;
      this.contentLength = null;
      this.bufferOutput = null;
    }
  };
  io.HttpClientRequest[dart.implements] = () => [io.IOSink];
  dart.setSignature(io.HttpClientRequest, {
    fields: () => ({
      persistentConnection: core.bool,
      followRedirects: core.bool,
      maxRedirects: core.int,
      contentLength: core.int,
      bufferOutput: core.bool
    })
  });
  io.HttpClientResponse = class HttpClientResponse extends core.Object {};
  io.HttpClientResponse[dart.implements] = () => [StreamOfListOfint()];
  io.HttpClientCredentials = class HttpClientCredentials extends core.Object {};
  io.HttpClientBasicCredentials = class HttpClientBasicCredentials extends io.HttpClientCredentials {
    static new(username, password) {
      return new io._HttpClientBasicCredentials(username, password);
    }
  };
  dart.setSignature(io.HttpClientBasicCredentials, {
    constructors: () => ({new: dart.definiteFunctionType(io.HttpClientBasicCredentials, [core.String, core.String])})
  });
  io.HttpClientDigestCredentials = class HttpClientDigestCredentials extends io.HttpClientCredentials {
    static new(username, password) {
      return new io._HttpClientDigestCredentials(username, password);
    }
  };
  dart.setSignature(io.HttpClientDigestCredentials, {
    constructors: () => ({new: dart.definiteFunctionType(io.HttpClientDigestCredentials, [core.String, core.String])})
  });
  io.HttpConnectionInfo = class HttpConnectionInfo extends core.Object {};
  io.RedirectInfo = class RedirectInfo extends core.Object {};
  io.DetachedSocket = class DetachedSocket extends core.Object {};
  io.HttpException = class HttpException extends core.Object {
    new(message, opts) {
      let uri = opts && 'uri' in opts ? opts.uri : null;
      this.message = message;
      this.uri = uri;
    }
    toString() {
      let b = new core.StringBuffer();
      b.write('HttpException: ');
      b.write(this.message);
      if (this.uri != null) {
        b.write(dart.str`, uri = ${this.uri}`);
      }
      return b.toString();
    }
  };
  io.HttpException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.HttpException, {
    constructors: () => ({new: dart.definiteFunctionType(io.HttpException, [core.String], {uri: core.Uri})}),
    fields: () => ({
      message: core.String,
      uri: core.Uri
    })
  });
  io.RedirectException = class RedirectException extends core.Object {
    new(message, redirects) {
      this.message = message;
      this.redirects = redirects;
    }
    toString() {
      return dart.str`RedirectException: ${this.message}`;
    }
    get uri() {
      return this.redirects[dartx.last].location;
    }
  };
  io.RedirectException[dart.implements] = () => [io.HttpException];
  dart.setSignature(io.RedirectException, {
    constructors: () => ({new: dart.definiteFunctionType(io.RedirectException, [core.String, ListOfRedirectInfo()])}),
    fields: () => ({
      message: core.String,
      redirects: ListOfRedirectInfo()
    }),
    getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
  });
  let const$58;
  let const$59;
  let const$60;
  let const$61;
  let const$62;
  let const$63;
  let const$64;
  let const$65;
  let const$66;
  io.HttpDate = class HttpDate extends core.Object {
    static format(date) {
      let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
      let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
      let d = date.toUtc();
      let sb = new core.StringBuffer();
      sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
      sb.write(", ");
      sb.write(dart.notNull(d.day) <= 9 ? "0" : "");
      sb.write(dart.toString(d.day));
      sb.write(" ");
      sb.write(month[dartx._get](dart.notNull(d.month) - 1));
      sb.write(" ");
      sb.write(dart.toString(d.year));
      sb.write(dart.notNull(d.hour) <= 9 ? " 0" : " ");
      sb.write(dart.toString(d.hour));
      sb.write(dart.notNull(d.minute) <= 9 ? ":0" : ":");
      sb.write(dart.toString(d.minute));
      sb.write(dart.notNull(d.second) <= 9 ? ":0" : ":");
      sb.write(dart.toString(d.second));
      sb.write(" GMT");
      return sb.toString();
    }
    static parse(date) {
      let SP = 32;
      let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
      let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
      let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
      let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
      let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
      let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
      let formatRfc1123 = 0;
      let formatRfc850 = 1;
      let formatAsctime = 2;
      let index = 0;
      let tmp = null;
      let format = null;
      function expect(s) {
        if (dart.notNull(date[dartx.length]) - dart.notNull(index) < dart.notNull(s[dartx.length])) {
          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        }
        let tmp = date[dartx.substring](index, dart.notNull(index) + dart.notNull(s[dartx.length]));
        if (tmp != s) {
          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        }
        index = dart.notNull(index) + dart.notNull(s[dartx.length]);
      }
      dart.fn(expect, StringTovoid$());
      function expectWeekday() {
        let weekday = null;
        let pos = date[dartx.indexOf](",", index);
        if (pos == -1) {
          let pos = date[dartx.indexOf](" ", index);
          if (pos == -1) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
          tmp = date[dartx.substring](index, pos);
          index = dart.notNull(pos) + 1;
          weekday = wkdays[dartx.indexOf](tmp);
          if (weekday != -1) {
            format = formatAsctime;
            return weekday;
          }
        } else {
          tmp = date[dartx.substring](index, pos);
          index = dart.notNull(pos) + 1;
          weekday = wkdays[dartx.indexOf](tmp);
          if (weekday != -1) {
            format = formatRfc1123;
            return weekday;
          }
          weekday = weekdays[dartx.indexOf](tmp);
          if (weekday != -1) {
            format = formatRfc850;
            return weekday;
          }
        }
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
      dart.fn(expectWeekday, VoidToint());
      function expectMonth(separator) {
        let pos = date[dartx.indexOf](separator, index);
        if (dart.notNull(pos) - dart.notNull(index) != 3) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        tmp = date[dartx.substring](index, pos);
        index = dart.notNull(pos) + 1;
        let month = months[dartx.indexOf](tmp);
        if (month != -1) return month;
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
      dart.fn(expectMonth, StringToint$());
      function expectNum(separator) {
        let pos = null;
        if (dart.notNull(separator[dartx.length]) > 0) {
          pos = date[dartx.indexOf](separator, index);
        } else {
          pos = date[dartx.length];
        }
        let tmp = date[dartx.substring](index, pos);
        index = dart.notNull(pos) + dart.notNull(separator[dartx.length]);
        try {
          let value = core.int.parse(tmp);
          return value;
        } catch (e) {
          if (core.FormatException.is(e)) {
            dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
          } else
            throw e;
        }

      }
      dart.fn(expectNum, StringToint$());
      function expectEnd() {
        if (index != date[dartx.length]) {
          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        }
      }
      dart.fn(expectEnd, VoidTovoid$());
      let weekday = expectWeekday();
      let day = null;
      let month = null;
      let year = null;
      let hours = null;
      let minutes = null;
      let seconds = null;
      if (format == formatAsctime) {
        month = expectMonth(" ");
        if (date[dartx.codeUnitAt](index) == SP) {
          index = dart.notNull(index) + 1;
        }
        day = expectNum(" ");
        hours = expectNum(":");
        minutes = expectNum(":");
        seconds = expectNum(" ");
        year = expectNum("");
      } else {
        expect(" ");
        day = expectNum(format == formatRfc1123 ? " " : "-");
        month = expectMonth(format == formatRfc1123 ? " " : "-");
        year = expectNum(" ");
        hours = expectNum(":");
        minutes = expectNum(":");
        seconds = expectNum(" ");
        expect("GMT");
      }
      expectEnd();
      return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
    }
    static _parseCookieDate(date) {
      let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
      let position = 0;
      function error() {
        dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
      }
      dart.fn(error, VoidTovoid$());
      function isEnd() {
        return position == date[dartx.length];
      }
      dart.fn(isEnd, VoidTobool());
      function isDelimiter(s) {
        let char = s[dartx.codeUnitAt](0);
        if (char == 9) return true;
        if (dart.notNull(char) >= 32 && dart.notNull(char) <= 47) return true;
        if (dart.notNull(char) >= 59 && dart.notNull(char) <= 64) return true;
        if (dart.notNull(char) >= 91 && dart.notNull(char) <= 96) return true;
        if (dart.notNull(char) >= 123 && dart.notNull(char) <= 126) return true;
        return false;
      }
      dart.fn(isDelimiter, StringTobool$());
      function isNonDelimiter(s) {
        let char = s[dartx.codeUnitAt](0);
        if (dart.notNull(char) >= 0 && dart.notNull(char) <= 8) return true;
        if (dart.notNull(char) >= 10 && dart.notNull(char) <= 31) return true;
        if (dart.notNull(char) >= 48 && dart.notNull(char) <= 57) return true;
        if (char == 58) return true;
        if (dart.notNull(char) >= 65 && dart.notNull(char) <= 90) return true;
        if (dart.notNull(char) >= 97 && dart.notNull(char) <= 122) return true;
        if (dart.notNull(char) >= 127 && dart.notNull(char) <= 255) return true;
        return false;
      }
      dart.fn(isNonDelimiter, StringTobool$());
      function isDigit(s) {
        let char = s[dartx.codeUnitAt](0);
        if (dart.notNull(char) > 47 && dart.notNull(char) < 58) return true;
        return false;
      }
      dart.fn(isDigit, StringTobool$());
      function getMonth(month) {
        if (dart.notNull(month[dartx.length]) < 3) return -1;
        return monthsLowerCase[dartx.indexOf](month[dartx.substring](0, 3));
      }
      dart.fn(getMonth, StringToint$());
      function toInt(s) {
        let index = 0;
        for (; index < dart.notNull(s[dartx.length]) && dart.test(isDigit(s[dartx._get](index))); index++)
          ;
        return core.int.parse(s[dartx.substring](0, index));
      }
      dart.fn(toInt, StringToint$());
      let tokens = [];
      while (!dart.test(isEnd())) {
        while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
          position++;
        let start = position;
        while (!dart.test(isEnd()) && dart.test(isNonDelimiter(date[dartx._get](position))))
          position++;
        tokens[dartx.add](date[dartx.substring](start, position)[dartx.toLowerCase]());
        while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
          position++;
      }
      let timeStr = null;
      let dayOfMonthStr = null;
      let monthStr = null;
      let yearStr = null;
      for (let token of tokens) {
        if (dart.test(dart.dsend(dart.dload(token, 'length'), '<', 1))) continue;
        if (timeStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 5)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && (dart.equals(dart.dindex(token, 1), ":") || dart.test(isDigit(core.String._check(dart.dindex(token, 1)))) && dart.equals(dart.dindex(token, 2), ":"))) {
          timeStr = core.String._check(token);
        } else if (dayOfMonthStr == null && dart.test(isDigit(core.String._check(dart.dindex(token, 0))))) {
          dayOfMonthStr = core.String._check(token);
        } else if (monthStr == null && dart.notNull(getMonth(core.String._check(token))) >= 0) {
          monthStr = core.String._check(token);
        } else if (yearStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 2)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && dart.test(isDigit(core.String._check(dart.dindex(token, 1))))) {
          yearStr = core.String._check(token);
        }
      }
      if (timeStr == null || dayOfMonthStr == null || monthStr == null || yearStr == null) {
        error();
      }
      let year = toInt(yearStr);
      if (dart.notNull(year) >= 70 && dart.notNull(year) <= 99) {
        year = dart.notNull(year) + 1900;
      } else if (dart.notNull(year) >= 0 && dart.notNull(year) <= 69) {
        year = dart.notNull(year) + 2000;
      }
      if (dart.notNull(year) < 1601) error();
      let dayOfMonth = toInt(dayOfMonthStr);
      if (dart.notNull(dayOfMonth) < 1 || dart.notNull(dayOfMonth) > 31) error();
      let month = dart.notNull(getMonth(monthStr)) + 1;
      let timeList = timeStr[dartx.split](":");
      if (timeList[dartx.length] != 3) error();
      let hour = toInt(timeList[dartx._get](0));
      let minute = toInt(timeList[dartx._get](1));
      let second = toInt(timeList[dartx._get](2));
      if (dart.notNull(hour) > 23) error();
      if (dart.notNull(minute) > 59) error();
      if (dart.notNull(second) > 59) error();
      return new core.DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
    }
  };
  dart.setSignature(io.HttpDate, {
    statics: () => ({
      format: dart.definiteFunctionType(core.String, [core.DateTime]),
      parse: dart.definiteFunctionType(core.DateTime, [core.String]),
      _parseCookieDate: dart.definiteFunctionType(core.DateTime, [core.String])
    }),
    names: ['format', 'parse', '_parseCookieDate']
  });
  const _headers = Symbol('_headers');
  const _defaultPortForScheme = Symbol('_defaultPortForScheme');
  const _mutable = Symbol('_mutable');
  const _noFoldingHeaders = Symbol('_noFoldingHeaders');
  const _contentLength = Symbol('_contentLength');
  const _persistentConnection = Symbol('_persistentConnection');
  const _chunkedTransferEncoding = Symbol('_chunkedTransferEncoding');
  const _host$ = Symbol('_host');
  const _port$ = Symbol('_port');
  const _checkMutable = Symbol('_checkMutable');
  const _addAll = Symbol('_addAll');
  const _add$2 = Symbol('_add');
  const _set$ = Symbol('_set');
  const _addValue = Symbol('_addValue');
  const _updateHostHeader = Symbol('_updateHostHeader');
  const _addDate = Symbol('_addDate');
  const _addHost = Symbol('_addHost');
  const _addExpires = Symbol('_addExpires');
  const _addConnection = Symbol('_addConnection');
  const _addContentType = Symbol('_addContentType');
  const _addContentLength = Symbol('_addContentLength');
  const _addTransferEncoding = Symbol('_addTransferEncoding');
  const _addIfModifiedSince = Symbol('_addIfModifiedSince');
  const _foldHeader = Symbol('_foldHeader');
  const _finalize = Symbol('_finalize');
  const _write = Symbol('_write');
  const _parseCookies = Symbol('_parseCookies');
  io._HttpHeaders = class _HttpHeaders extends core.Object {
    new(protocolVersion, opts) {
      let defaultPortForScheme = opts && 'defaultPortForScheme' in opts ? opts.defaultPortForScheme : io.HttpClient.DEFAULT_HTTP_PORT;
      let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
      this.protocolVersion = protocolVersion;
      this[_headers] = HashMapOfString$ListOfString().new();
      this[_defaultPortForScheme] = defaultPortForScheme;
      this[_mutable] = true;
      this[_noFoldingHeaders] = null;
      this[_contentLength] = -1;
      this[_persistentConnection] = true;
      this[_chunkedTransferEncoding] = false;
      this[_host$] = null;
      this[_port$] = null;
      if (initialHeaders != null) {
        initialHeaders[_headers][dartx.forEach](dart.fn((name, value) => this[_headers][dartx._set](name, value), StringAndListOfStringToListOfString()));
        this[_contentLength] = initialHeaders[_contentLength];
        this[_persistentConnection] = initialHeaders[_persistentConnection];
        this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
        this[_host$] = initialHeaders[_host$];
        this[_port$] = initialHeaders[_port$];
      }
      if (this.protocolVersion == "1.0") {
        this[_persistentConnection] = false;
        this[_chunkedTransferEncoding] = false;
      }
    }
    _get(name) {
      return this[_headers][dartx._get](name[dartx.toLowerCase]());
    }
    value(name) {
      name = name[dartx.toLowerCase]();
      let values = this[_headers][dartx._get](name);
      if (values == null) return null;
      if (dart.notNull(values[dartx.length]) > 1) {
        dart.throw(new io.HttpException(dart.str`More than one value for header ${name}`));
      }
      return values[dartx._get](0);
    }
    add(name, value) {
      this[_checkMutable]();
      this[_addAll](io._HttpHeaders._validateField(name), value);
    }
    [_addAll](name, value) {
      dart.assert(name == io._HttpHeaders._validateField(name));
      if (core.Iterable.is(value)) {
        for (let v of value) {
          this[_add$2](name, io._HttpHeaders._validateValue(v));
        }
      } else {
        this[_add$2](name, io._HttpHeaders._validateValue(value));
      }
    }
    set(name, value) {
      this[_checkMutable]();
      name = io._HttpHeaders._validateField(name);
      this[_headers][dartx.remove](name);
      if (name == io.HttpHeaders.TRANSFER_ENCODING) {
        this[_chunkedTransferEncoding] = false;
      }
      this[_addAll](name, value);
    }
    remove(name, value) {
      this[_checkMutable]();
      name = io._HttpHeaders._validateField(name);
      value = io._HttpHeaders._validateValue(value);
      let values = this[_headers][dartx._get](name);
      if (values != null) {
        let index = values[dartx.indexOf](core.String._check(value));
        if (index != -1) {
          values[dartx.removeRange](index, dart.notNull(index) + 1);
        }
        if (values[dartx.length] == 0) this[_headers][dartx.remove](name);
      }
      if (name == io.HttpHeaders.TRANSFER_ENCODING && dart.equals(value, "chunked")) {
        this[_chunkedTransferEncoding] = false;
      }
    }
    removeAll(name) {
      this[_checkMutable]();
      name = io._HttpHeaders._validateField(name);
      this[_headers][dartx.remove](name);
    }
    forEach(f) {
      this[_headers][dartx.forEach](f);
    }
    noFolding(name) {
      if (this[_noFoldingHeaders] == null) this[_noFoldingHeaders] = ListOfString().new();
      this[_noFoldingHeaders][dartx.add](name);
    }
    get persistentConnection() {
      return this[_persistentConnection];
    }
    set persistentConnection(persistentConnection) {
      this[_checkMutable]();
      if (persistentConnection == this[_persistentConnection]) return;
      if (dart.test(persistentConnection)) {
        if (this.protocolVersion == "1.1") {
          this.remove(io.HttpHeaders.CONNECTION, "close");
        } else {
          if (this[_contentLength] == -1) {
            dart.throw(new io.HttpException("Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with " + "no ContentLength"));
          }
          this.add(io.HttpHeaders.CONNECTION, "keep-alive");
        }
      } else {
        if (this.protocolVersion == "1.1") {
          this.add(io.HttpHeaders.CONNECTION, "close");
        } else {
          this.remove(io.HttpHeaders.CONNECTION, "keep-alive");
        }
      }
      this[_persistentConnection] = persistentConnection;
    }
    get contentLength() {
      return this[_contentLength];
    }
    set contentLength(contentLength) {
      this[_checkMutable]();
      if (this.protocolVersion == "1.0" && dart.test(this.persistentConnection) && contentLength == -1) {
        dart.throw(new io.HttpException("Trying to clear ContentLength on HTTP 1.0 headers with " + "'Connection: Keep-Alive' set"));
      }
      if (this[_contentLength] == contentLength) return;
      this[_contentLength] = contentLength;
      if (dart.notNull(this[_contentLength]) >= 0) {
        if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
        this[_set$](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
      } else {
        this.removeAll(io.HttpHeaders.CONTENT_LENGTH);
        if (this.protocolVersion == "1.1") {
          this.chunkedTransferEncoding = true;
        }
      }
    }
    get chunkedTransferEncoding() {
      return this[_chunkedTransferEncoding];
    }
    set chunkedTransferEncoding(chunkedTransferEncoding) {
      this[_checkMutable]();
      if (dart.test(chunkedTransferEncoding) && this.protocolVersion == "1.0") {
        dart.throw(new io.HttpException("Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers"));
      }
      if (chunkedTransferEncoding == this[_chunkedTransferEncoding]) return;
      if (dart.test(chunkedTransferEncoding)) {
        let values = this[_headers][dartx._get](io.HttpHeaders.TRANSFER_ENCODING);
        if (values == null || values[dartx.last] != "chunked") {
          this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, "chunked");
        }
        this.contentLength = -1;
      } else {
        this.remove(io.HttpHeaders.TRANSFER_ENCODING, "chunked");
      }
      this[_chunkedTransferEncoding] = chunkedTransferEncoding;
    }
    get host() {
      return this[_host$];
    }
    set host(host) {
      this[_checkMutable]();
      this[_host$] = host;
      this[_updateHostHeader]();
    }
    get port() {
      return this[_port$];
    }
    set port(port) {
      this[_checkMutable]();
      this[_port$] = port;
      this[_updateHostHeader]();
    }
    get ifModifiedSince() {
      let values = this[_headers][dartx._get](io.HttpHeaders.IF_MODIFIED_SINCE);
      if (values != null) {
        try {
          return io.HttpDate.parse(values[dartx._get](0));
        } catch (e) {
          if (core.Exception.is(e)) {
            return null;
          } else
            throw e;
        }

      }
      return null;
    }
    set ifModifiedSince(ifModifiedSince) {
      this[_checkMutable]();
      let formatted = io.HttpDate.format(ifModifiedSince.toUtc());
      this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
    }
    get date() {
      let values = this[_headers][dartx._get](io.HttpHeaders.DATE);
      if (values != null) {
        try {
          return io.HttpDate.parse(values[dartx._get](0));
        } catch (e) {
          if (core.Exception.is(e)) {
            return null;
          } else
            throw e;
        }

      }
      return null;
    }
    set date(date) {
      this[_checkMutable]();
      let formatted = io.HttpDate.format(date.toUtc());
      this[_set$]("date", formatted);
    }
    get expires() {
      let values = this[_headers][dartx._get](io.HttpHeaders.EXPIRES);
      if (values != null) {
        try {
          return io.HttpDate.parse(values[dartx._get](0));
        } catch (e) {
          if (core.Exception.is(e)) {
            return null;
          } else
            throw e;
        }

      }
      return null;
    }
    set expires(expires) {
      this[_checkMutable]();
      let formatted = io.HttpDate.format(expires.toUtc());
      this[_set$](io.HttpHeaders.EXPIRES, formatted);
    }
    get contentType() {
      let values = this[_headers][dartx._get]("content-type");
      if (values != null) {
        return io.ContentType.parse(values[dartx._get](0));
      } else {
        return null;
      }
    }
    set contentType(contentType) {
      this[_checkMutable]();
      this[_set$](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
    }
    clear() {
      this[_checkMutable]();
      this[_headers][dartx.clear]();
      this[_contentLength] = -1;
      this[_persistentConnection] = true;
      this[_chunkedTransferEncoding] = false;
      this[_host$] = null;
      this[_port$] = null;
    }
    [_add$2](name, value) {
      dart.assert(name == io._HttpHeaders._validateField(name));
      switch (name[dartx.length]) {
        case 4:
        {
          if (io.HttpHeaders.DATE == name) {
            this[_addDate](name, value);
            return;
          }
          if (io.HttpHeaders.HOST == name) {
            this[_addHost](name, value);
            return;
          }
          break;
        }
        case 7:
        {
          if (io.HttpHeaders.EXPIRES == name) {
            this[_addExpires](name, value);
            return;
          }
          break;
        }
        case 10:
        {
          if (io.HttpHeaders.CONNECTION == name) {
            this[_addConnection](name, value);
            return;
          }
          break;
        }
        case 12:
        {
          if (io.HttpHeaders.CONTENT_TYPE == name) {
            this[_addContentType](name, value);
            return;
          }
          break;
        }
        case 14:
        {
          if (io.HttpHeaders.CONTENT_LENGTH == name) {
            this[_addContentLength](name, value);
            return;
          }
          break;
        }
        case 17:
        {
          if (io.HttpHeaders.TRANSFER_ENCODING == name) {
            this[_addTransferEncoding](name, value);
            return;
          }
          if (io.HttpHeaders.IF_MODIFIED_SINCE == name) {
            this[_addIfModifiedSince](name, value);
            return;
          }
        }
      }
      this[_addValue](name, value);
    }
    [_addContentLength](name, value) {
      if (typeof value == 'number') {
        this.contentLength = value;
      } else if (typeof value == 'string') {
        this.contentLength = core.int.parse(value);
      } else {
        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
      }
    }
    [_addTransferEncoding](name, value) {
      if (dart.equals(value, "chunked")) {
        this.chunkedTransferEncoding = true;
      } else {
        this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, value);
      }
    }
    [_addDate](name, value) {
      if (core.DateTime.is(value)) {
        this.date = value;
      } else if (typeof value == 'string') {
        this[_set$](io.HttpHeaders.DATE, value);
      } else {
        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
      }
    }
    [_addExpires](name, value) {
      if (core.DateTime.is(value)) {
        this.expires = value;
      } else if (typeof value == 'string') {
        this[_set$](io.HttpHeaders.EXPIRES, value);
      } else {
        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
      }
    }
    [_addIfModifiedSince](name, value) {
      if (core.DateTime.is(value)) {
        this.ifModifiedSince = value;
      } else if (typeof value == 'string') {
        this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, value);
      } else {
        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
      }
    }
    [_addHost](name, value) {
      if (typeof value == 'string') {
        let pos = value[dartx.indexOf](":");
        if (pos == -1) {
          this[_host$] = value;
          this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
        } else {
          if (dart.notNull(pos) > 0) {
            this[_host$] = value[dartx.substring](0, pos);
          } else {
            this[_host$] = null;
          }
          if (dart.notNull(pos) + 1 == value[dartx.length]) {
            this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
          } else {
            try {
              this[_port$] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
            } catch (e) {
              if (core.FormatException.is(e)) {
                this[_port$] = null;
              } else
                throw e;
            }

          }
        }
        this[_set$](io.HttpHeaders.HOST, value);
      } else {
        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
      }
    }
    [_addConnection](name, value) {
      let lowerCaseValue = dart.dsend(value, 'toLowerCase');
      if (dart.equals(lowerCaseValue, 'close')) {
        this[_persistentConnection] = false;
      } else if (dart.equals(lowerCaseValue, 'keep-alive')) {
        this[_persistentConnection] = true;
      }
      this[_addValue](name, value);
    }
    [_addContentType](name, value) {
      this[_set$](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
    }
    [_addValue](name, value) {
      let values = this[_headers][dartx._get](name);
      if (values == null) {
        values = ListOfString().new();
        this[_headers][dartx._set](name, values);
      }
      if (core.DateTime.is(value)) {
        values[dartx.add](io.HttpDate.format(value));
      } else if (typeof value == 'string') {
        values[dartx.add](value);
      } else {
        values[dartx.add](core.String._check(io._HttpHeaders._validateValue(dart.toString(value))));
      }
    }
    [_set$](name, value) {
      dart.assert(name == io._HttpHeaders._validateField(name));
      let values = ListOfString().new();
      this[_headers][dartx._set](name, values);
      values[dartx.add](value);
    }
    [_checkMutable]() {
      if (!dart.test(this[_mutable])) dart.throw(new io.HttpException("HTTP headers are not mutable"));
    }
    [_updateHostHeader]() {
      let defaultPort = this[_port$] == null || this[_port$] == this[_defaultPortForScheme];
      this[_set$]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port$]}`);
    }
    [_foldHeader](name) {
      if (name == io.HttpHeaders.SET_COOKIE || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][dartx.indexOf](name) != -1) {
        return false;
      }
      return true;
    }
    [_finalize]() {
      this[_mutable] = false;
    }
    [_write](buffer, offset) {
      function write(bytes) {
        let len = bytes[dartx.length];
        for (let i = 0; i < dart.notNull(len); i++) {
          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
        }
        offset = dart.notNull(offset) + dart.notNull(len);
      }
      dart.fn(write, ListOfintTovoid$());
      for (let name of this[_headers][dartx.keys]) {
        let values = this[_headers][dartx._get](name);
        let fold = core.bool._check(this[_foldHeader](name));
        let nameData = name[dartx.codeUnits];
        write(nameData);
        buffer[dartx._set]((() => {
          let x = offset;
          offset = dart.notNull(x) + 1;
          return x;
        })(), io._CharCode.COLON);
        buffer[dartx._set]((() => {
          let x = offset;
          offset = dart.notNull(x) + 1;
          return x;
        })(), io._CharCode.SP);
        for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
          if (i > 0) {
            if (dart.test(fold)) {
              buffer[dartx._set]((() => {
                let x = offset;
                offset = dart.notNull(x) + 1;
                return x;
              })(), io._CharCode.COMMA);
              buffer[dartx._set]((() => {
                let x = offset;
                offset = dart.notNull(x) + 1;
                return x;
              })(), io._CharCode.SP);
            } else {
              buffer[dartx._set]((() => {
                let x = offset;
                offset = dart.notNull(x) + 1;
                return x;
              })(), io._CharCode.CR);
              buffer[dartx._set]((() => {
                let x = offset;
                offset = dart.notNull(x) + 1;
                return x;
              })(), io._CharCode.LF);
              write(nameData);
              buffer[dartx._set]((() => {
                let x = offset;
                offset = dart.notNull(x) + 1;
                return x;
              })(), io._CharCode.COLON);
              buffer[dartx._set]((() => {
                let x = offset;
                offset = dart.notNull(x) + 1;
                return x;
              })(), io._CharCode.SP);
            }
          }
          write(values[dartx._get](i)[dartx.codeUnits]);
        }
        buffer[dartx._set]((() => {
          let x = offset;
          offset = dart.notNull(x) + 1;
          return x;
        })(), io._CharCode.CR);
        buffer[dartx._set]((() => {
          let x = offset;
          offset = dart.notNull(x) + 1;
          return x;
        })(), io._CharCode.LF);
      }
      return offset;
    }
    toString() {
      let sb = new core.StringBuffer();
      this[_headers][dartx.forEach](dart.fn((name, values) => {
        sb.write(name);
        sb.write(": ");
        let fold = core.bool._check(this[_foldHeader](name));
        for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
          if (i > 0) {
            if (dart.test(fold)) {
              sb.write(", ");
            } else {
              sb.write("\n");
              sb.write(name);
              sb.write(": ");
            }
          }
          sb.write(values[dartx._get](i));
        }
        sb.write("\n");
      }, StringAndListOfStringTovoid$()));
      return sb.toString();
    }
    [_parseCookies]() {
      let cookies = ListOfCookie().new();
      function parseCookieString(s) {
        let index = 0;
        function done() {
          return index == -1 || index == s[dartx.length];
        }
        dart.fn(done, VoidTobool());
        function skipWS() {
          while (!dart.test(done())) {
            if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
            index = dart.notNull(index) + 1;
          }
        }
        dart.fn(skipWS, VoidTovoid$());
        function parseName() {
          let start = index;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=") break;
            index = dart.notNull(index) + 1;
          }
          return s[dartx.substring](start, index);
        }
        dart.fn(parseName, VoidToString$());
        function parseValue() {
          let start = index;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == ";") break;
            index = dart.notNull(index) + 1;
          }
          return s[dartx.substring](start, index);
        }
        dart.fn(parseValue, VoidToString$());
        function expect(expected) {
          if (dart.test(done())) return false;
          if (s[dartx._get](index) != expected) return false;
          index = dart.notNull(index) + 1;
          return true;
        }
        dart.fn(expect, StringTobool$());
        while (!dart.test(done())) {
          skipWS();
          if (dart.test(done())) return;
          let name = parseName();
          skipWS();
          if (!dart.test(expect("="))) {
            index = s[dartx.indexOf](';', index);
            continue;
          }
          skipWS();
          let value = parseValue();
          try {
            cookies[dartx.add](new io._Cookie(name, value));
          } catch (_) {
          }

          skipWS();
          if (dart.test(done())) return;
          if (!dart.test(expect(";"))) {
            index = s[dartx.indexOf](';', index);
            continue;
          }
        }
      }
      dart.fn(parseCookieString, StringTovoid$());
      let values = this[_headers][dartx._get](io.HttpHeaders.COOKIE);
      if (values != null) {
        values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid$()));
      }
      return cookies;
    }
    static _validateField(field) {
      for (let i = 0; i < dart.notNull(field[dartx.length]); i++) {
        if (!dart.test(io._HttpParser._isTokenChar(field[dartx.codeUnitAt](i)))) {
          dart.throw(new core.FormatException(dart.str`Invalid HTTP header field name: ${convert.JSON.encode(field)}`));
        }
      }
      return field[dartx.toLowerCase]();
    }
    static _validateValue(value) {
      if (!(typeof value == 'string')) return value;
      for (let i = 0; i < dart.notNull(core.num._check(dart.dload(value, 'length'))); i++) {
        if (!dart.test(io._HttpParser._isValueChar(core.int._check(dart.dsend(value, 'codeUnitAt', i))))) {
          dart.throw(new core.FormatException(dart.str`Invalid HTTP header field value: ${convert.JSON.encode(value)}`));
        }
      }
      return value;
    }
  };
  io._HttpHeaders[dart.implements] = () => [io.HttpHeaders];
  dart.setSignature(io._HttpHeaders, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpHeaders, [core.String], {defaultPortForScheme: core.int, initialHeaders: io._HttpHeaders})}),
    fields: () => ({
      [_headers]: MapOfString$ListOfString(),
      protocolVersion: core.String,
      [_mutable]: core.bool,
      [_noFoldingHeaders]: ListOfString(),
      [_contentLength]: core.int,
      [_persistentConnection]: core.bool,
      [_chunkedTransferEncoding]: core.bool,
      [_host$]: core.String,
      [_port$]: core.int,
      [_defaultPortForScheme]: core.int
    }),
    getters: () => ({
      persistentConnection: dart.definiteFunctionType(core.bool, []),
      contentLength: dart.definiteFunctionType(core.int, []),
      chunkedTransferEncoding: dart.definiteFunctionType(core.bool, []),
      host: dart.definiteFunctionType(core.String, []),
      port: dart.definiteFunctionType(core.int, []),
      ifModifiedSince: dart.definiteFunctionType(core.DateTime, []),
      date: dart.definiteFunctionType(core.DateTime, []),
      expires: dart.definiteFunctionType(core.DateTime, []),
      contentType: dart.definiteFunctionType(io.ContentType, [])
    }),
    setters: () => ({
      persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
      contentLength: dart.definiteFunctionType(dart.void, [core.int]),
      chunkedTransferEncoding: dart.definiteFunctionType(dart.void, [core.bool]),
      host: dart.definiteFunctionType(dart.void, [core.String]),
      port: dart.definiteFunctionType(dart.void, [core.int]),
      ifModifiedSince: dart.definiteFunctionType(dart.void, [core.DateTime]),
      date: dart.definiteFunctionType(dart.void, [core.DateTime]),
      expires: dart.definiteFunctionType(dart.void, [core.DateTime]),
      contentType: dart.definiteFunctionType(dart.void, [io.ContentType])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(core.List$(core.String), [core.String]),
      value: dart.definiteFunctionType(core.String, [core.String]),
      add: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
      [_addAll]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      set: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
      remove: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
      removeAll: dart.definiteFunctionType(dart.void, [core.String]),
      forEach: dart.definiteFunctionType(dart.void, [StringAndListOfStringTovoid()]),
      noFolding: dart.definiteFunctionType(dart.void, [core.String]),
      clear: dart.definiteFunctionType(dart.void, []),
      [_add$2]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addContentLength]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addTransferEncoding]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addDate]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addExpires]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addIfModifiedSince]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addHost]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addConnection]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addContentType]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
      [_addValue]: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
      [_set$]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [_checkMutable]: dart.definiteFunctionType(dart.dynamic, []),
      [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
      [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
      [_finalize]: dart.definiteFunctionType(dart.void, []),
      [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
      [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
    }),
    statics: () => ({
      _validateField: dart.definiteFunctionType(core.String, [core.String]),
      _validateValue: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    }),
    names: ['_validateField', '_validateValue']
  });
  const _value$1 = Symbol('_value');
  const _parameters = Symbol('_parameters');
  const _unmodifiableParameters = Symbol('_unmodifiableParameters');
  const _parse = Symbol('_parse');
  const _ensureParameters = Symbol('_ensureParameters');
  io._HeaderValue = class _HeaderValue extends core.Object {
    new(value, parameters) {
      if (value === void 0) value = "";
      if (parameters === void 0) parameters = null;
      this[_value$1] = value;
      this[_parameters] = null;
      this[_unmodifiableParameters] = null;
      if (parameters != null) {
        this[_parameters] = HashMapOfString$String().from(parameters);
      }
    }
    static parse(value, opts) {
      let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
      let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
      let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
      let result = new io._HeaderValue();
      result[_parse](value, core.String._check(parameterSeparator), core.String._check(valueSeparator), core.bool._check(preserveBackslash));
      return result;
    }
    get value() {
      return this[_value$1];
    }
    [_ensureParameters]() {
      if (this[_parameters] == null) {
        this[_parameters] = HashMapOfString$String().new();
      }
    }
    get parameters() {
      this[_ensureParameters]();
      if (this[_unmodifiableParameters] == null) {
        this[_unmodifiableParameters] = new (UnmodifiableMapViewOfString$String())(this[_parameters]);
      }
      return this[_unmodifiableParameters];
    }
    toString() {
      let sb = new core.StringBuffer();
      sb.write(this[_value$1]);
      if (this.parameters != null && dart.notNull(this.parameters[dartx.length]) > 0) {
        this[_parameters][dartx.forEach](dart.fn((name, value) => {
          sb.write("; ");
          sb.write(name);
          sb.write("=");
          sb.write(value);
        }, StringAndStringTovoid$()));
      }
      return sb.toString();
    }
    [_parse](s, parameterSeparator, valueSeparator, preserveBackslash) {
      let index = 0;
      function done() {
        return index == s[dartx.length];
      }
      dart.fn(done, VoidTobool());
      function skipWS() {
        while (!dart.test(done())) {
          if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
          index++;
        }
      }
      dart.fn(skipWS, VoidTovoid$());
      function parseValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == valueSeparator || s[dartx._get](index) == parameterSeparator) break;
          index++;
        }
        return s[dartx.substring](start, index);
      }
      dart.fn(parseValue, VoidToString$());
      function expect(expected) {
        if (dart.test(done()) || s[dartx._get](index) != expected) {
          dart.throw(new io.HttpException("Failed to parse header value"));
        }
        index++;
      }
      dart.fn(expect, StringTovoid$());
      function maybeExpect(expected) {
        if (s[dartx._get](index) == expected) index++;
      }
      dart.fn(maybeExpect, StringTovoid$());
      const parseParameters = (function() {
        let parameters = HashMapOfString$String().new();
        this[_parameters] = new (UnmodifiableMapViewOfString$String())(parameters);
        function parseParameterName() {
          let start = index;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=" || s[dartx._get](index) == parameterSeparator || s[dartx._get](index) == valueSeparator) break;
            index++;
          }
          return s[dartx.substring](start, index)[dartx.toLowerCase]();
        }
        dart.fn(parseParameterName, VoidToString$());
        function parseParameterValue() {
          if (!dart.test(done()) && s[dartx._get](index) == "\"") {
            let sb = new core.StringBuffer();
            index++;
            while (!dart.test(done())) {
              if (s[dartx._get](index) == "\\") {
                if (index + 1 == s[dartx.length]) {
                  dart.throw(new io.HttpException("Failed to parse header value"));
                }
                if (dart.test(preserveBackslash) && s[dartx._get](index + 1) != "\"") {
                  sb.write(s[dartx._get](index));
                }
                index++;
              } else if (s[dartx._get](index) == "\"") {
                index++;
                break;
              }
              sb.write(s[dartx._get](index));
              index++;
            }
            return sb.toString();
          } else {
            let val = parseValue();
            return val == "" ? null : val;
          }
        }
        dart.fn(parseParameterValue, VoidToString$());
        while (!dart.test(done())) {
          skipWS();
          if (dart.test(done())) return;
          let name = parseParameterName();
          skipWS();
          if (dart.test(done())) {
            parameters._set(name, null);
            return;
          }
          maybeExpect("=");
          skipWS();
          if (dart.test(done())) {
            parameters._set(name, null);
            return;
          }
          let value = parseParameterValue();
          if (name == 'charset' && io._ContentType.is(this)) {
            value = value[dartx.toLowerCase]();
          }
          parameters._set(name, value);
          skipWS();
          if (dart.test(done())) return;
          if (s[dartx._get](index) == valueSeparator) return;
          expect(parameterSeparator);
        }
      }).bind(this);
      dart.fn(parseParameters, VoidTovoid$());
      skipWS();
      this[_value$1] = parseValue();
      skipWS();
      if (dart.test(done())) return;
      maybeExpect(parameterSeparator);
      parseParameters();
    }
  };
  io._HeaderValue[dart.implements] = () => [io.HeaderValue];
  dart.setSignature(io._HeaderValue, {
    constructors: () => ({new: dart.definiteFunctionType(io._HeaderValue, [], [core.String, MapOfString$String()])}),
    fields: () => ({
      [_value$1]: core.String,
      [_parameters]: MapOfString$String(),
      [_unmodifiableParameters]: MapOfString$String()
    }),
    getters: () => ({
      value: dart.definiteFunctionType(core.String, []),
      parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
    }),
    methods: () => ({
      [_ensureParameters]: dart.definiteFunctionType(dart.void, []),
      [_parse]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String, core.bool])
    }),
    statics: () => ({parse: dart.definiteFunctionType(io._HeaderValue, [core.String], {parameterSeparator: dart.dynamic, valueSeparator: dart.dynamic, preserveBackslash: dart.dynamic})}),
    names: ['parse']
  });
  const _primaryType = Symbol('_primaryType');
  const _subType = Symbol('_subType');
  io._ContentType = class _ContentType extends io._HeaderValue {
    new(primaryType, subType, charset, parameters) {
      this[_primaryType] = primaryType;
      this[_subType] = subType;
      super.new("");
      if (this[_primaryType] == null) this[_primaryType] = "";
      if (this[_subType] == null) this[_subType] = "";
      this[_value$1] = dart.str`${this[_primaryType]}/${this[_subType]}`;
      if (parameters != null) {
        this[_ensureParameters]();
        parameters[dartx.forEach](dart.fn((key, value) => {
          let lowerCaseKey = key[dartx.toLowerCase]();
          if (lowerCaseKey == "charset") {
            value = value[dartx.toLowerCase]();
          }
          this[_parameters][dartx._set](lowerCaseKey, value);
        }, StringAndStringTovoid$()));
      }
      if (charset != null) {
        this[_ensureParameters]();
        this[_parameters][dartx._set]("charset", charset[dartx.toLowerCase]());
      }
    }
    _() {
      this[_primaryType] = "";
      this[_subType] = "";
      super.new();
    }
    static parse(value) {
      let result = new io._ContentType._();
      result[_parse](value, ";", null, false);
      let index = result[_value$1][dartx.indexOf]("/");
      if (index == -1 || index == dart.notNull(result[_value$1][dartx.length]) - 1) {
        result[_primaryType] = result[_value$1][dartx.trim]()[dartx.toLowerCase]();
        result[_subType] = "";
      } else {
        result[_primaryType] = result[_value$1][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
        result[_subType] = result[_value$1][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
      }
      return result;
    }
    get mimeType() {
      return dart.str`${this.primaryType}/${this.subType}`;
    }
    get primaryType() {
      return this[_primaryType];
    }
    get subType() {
      return this[_subType];
    }
    get charset() {
      return this.parameters[dartx._get]("charset");
    }
  };
  dart.defineNamedConstructor(io._ContentType, '_');
  io._ContentType[dart.implements] = () => [io.ContentType];
  dart.setSignature(io._ContentType, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._ContentType, [core.String, core.String, core.String, MapOfString$String()]),
      _: dart.definiteFunctionType(io._ContentType, [])
    }),
    fields: () => ({
      [_primaryType]: core.String,
      [_subType]: core.String
    }),
    getters: () => ({
      mimeType: dart.definiteFunctionType(core.String, []),
      primaryType: dart.definiteFunctionType(core.String, []),
      subType: dart.definiteFunctionType(core.String, []),
      charset: dart.definiteFunctionType(core.String, [])
    }),
    statics: () => ({parse: dart.definiteFunctionType(io._ContentType, [core.String])}),
    names: ['parse']
  });
  const _validate = Symbol('_validate');
  const _parseSetCookieValue = Symbol('_parseSetCookieValue');
  let const$67;
  io._Cookie = class _Cookie extends core.Object {
    new(name, value) {
      if (name === void 0) name = null;
      if (value === void 0) value = null;
      this.name = name;
      this.value = value;
      this.expires = null;
      this.maxAge = null;
      this.domain = null;
      this.path = null;
      this.httpOnly = false;
      this.secure = false;
      this.httpOnly = true;
      this[_validate]();
    }
    fromSetCookieValue(value) {
      this.name = null;
      this.value = null;
      this.expires = null;
      this.maxAge = null;
      this.domain = null;
      this.path = null;
      this.httpOnly = false;
      this.secure = false;
      this[_parseSetCookieValue](value);
    }
    [_parseSetCookieValue](s) {
      let index = 0;
      function done() {
        return index == s[dartx.length];
      }
      dart.fn(done, VoidTobool());
      function parseName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == "=") break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.trim]();
      }
      dart.fn(parseName, VoidToString$());
      function parseValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == ";") break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.trim]();
      }
      dart.fn(parseValue, VoidToString$());
      function expect(expected) {
        if (dart.test(done())) dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
        if (s[dartx._get](index) != expected) {
          dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
        }
        index++;
      }
      dart.fn(expect, StringTovoid$());
      const parseAttributes = (function() {
        function parseAttributeName() {
          let start = index;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == "=" || s[dartx._get](index) == ";") break;
            index++;
          }
          return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
        }
        dart.fn(parseAttributeName, VoidToString$());
        function parseAttributeValue() {
          let start = index;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == ";") break;
            index++;
          }
          return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
        }
        dart.fn(parseAttributeValue, VoidToString$());
        while (!dart.test(done())) {
          let name = parseAttributeName();
          let value = "";
          if (!dart.test(done()) && s[dartx._get](index) == "=") {
            index++;
            value = parseAttributeValue();
          }
          if (name == "expires") {
            this.expires = io.HttpDate._parseCookieDate(value);
          } else if (name == "max-age") {
            this.maxAge = core.int.parse(value);
          } else if (name == "domain") {
            this.domain = value;
          } else if (name == "path") {
            this.path = value;
          } else if (name == "httponly") {
            this.httpOnly = true;
          } else if (name == "secure") {
            this.secure = true;
          }
          if (!dart.test(done())) index++;
        }
      }).bind(this);
      dart.fn(parseAttributes, VoidTovoid$());
      this.name = parseName();
      if (dart.test(done()) || this.name[dartx.length] == 0) {
        dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
      }
      index++;
      this.value = parseValue();
      this[_validate]();
      if (dart.test(done())) return;
      index++;
      parseAttributes();
    }
    toString() {
      let sb = new core.StringBuffer();
      sb.write(this.name);
      sb.write("=");
      sb.write(this.value);
      if (this.expires != null) {
        sb.write("; Expires=");
        sb.write(io.HttpDate.format(this.expires));
      }
      if (this.maxAge != null) {
        sb.write("; Max-Age=");
        sb.write(this.maxAge);
      }
      if (this.domain != null) {
        sb.write("; Domain=");
        sb.write(this.domain);
      }
      if (this.path != null) {
        sb.write("; Path=");
        sb.write(this.path);
      }
      if (dart.test(this.secure)) sb.write("; Secure");
      if (dart.test(this.httpOnly)) sb.write("; HttpOnly");
      return sb.toString();
    }
    [_validate]() {
      let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
      for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
        let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
        if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
          dart.throw(new core.FormatException(dart.str`Invalid character in cookie name, code unit: '${codeUnit}'`));
        }
      }
      for (let i = 0; i < dart.notNull(this.value[dartx.length]); i++) {
        let codeUnit = this.value[dartx.codeUnits][dartx._get](i);
        if (!(codeUnit == 33 || dart.notNull(codeUnit) >= 35 && dart.notNull(codeUnit) <= 43 || dart.notNull(codeUnit) >= 45 && dart.notNull(codeUnit) <= 58 || dart.notNull(codeUnit) >= 60 && dart.notNull(codeUnit) <= 91 || dart.notNull(codeUnit) >= 93 && dart.notNull(codeUnit) <= 126)) {
          dart.throw(new core.FormatException(dart.str`Invalid character in cookie value, code unit: '${codeUnit}'`));
        }
      }
    }
  };
  dart.defineNamedConstructor(io._Cookie, 'fromSetCookieValue');
  io._Cookie[dart.implements] = () => [io.Cookie];
  dart.setSignature(io._Cookie, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._Cookie, [], [core.String, core.String]),
      fromSetCookieValue: dart.definiteFunctionType(io._Cookie, [core.String])
    }),
    fields: () => ({
      name: core.String,
      value: core.String,
      expires: core.DateTime,
      maxAge: core.int,
      domain: core.String,
      path: core.String,
      httpOnly: core.bool,
      secure: core.bool
    }),
    methods: () => ({
      [_parseSetCookieValue]: dart.definiteFunctionType(dart.void, [core.String]),
      [_validate]: dart.definiteFunctionType(dart.void, [])
    })
  });
  io._OUTGOING_BUFFER_SIZE = 8 * 1024;
  const _transferLength = Symbol('_transferLength');
  const _dataCompleter = Symbol('_dataCompleter');
  const _stream$ = Symbol('_stream');
  io._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
    get transferLength() {
      return this[_transferLength];
    }
    new(headers, transferLength, stream) {
      this[_dataCompleter] = async.Completer.new();
      this.headers = headers;
      this[_transferLength] = transferLength;
      this[_stream$] = stream;
      this.fullBodyRead = false;
      this.upgraded = false;
      this.statusCode = null;
      this.reasonPhrase = null;
      this.method = null;
      this.uri = null;
      this.hasSubscriber = false;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      this.hasSubscriber = true;
      return this[_stream$].handleError(dart.fn(error => {
        dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
      }, dynamicTodynamic$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    get dataDone() {
      return this[_dataCompleter].future;
    }
    close(closing) {
      this.fullBodyRead = true;
      this.hasSubscriber = true;
      this[_dataCompleter].complete(closing);
    }
  };
  dart.addSimpleTypeTests(io._HttpIncoming);
  dart.setSignature(io._HttpIncoming, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpIncoming, [io._HttpHeaders, core.int, StreamOfListOfint()])}),
    fields: () => ({
      [_transferLength]: core.int,
      [_dataCompleter]: async.Completer,
      [_stream$]: StreamOfListOfint(),
      fullBodyRead: core.bool,
      headers: io._HttpHeaders,
      upgraded: core.bool,
      statusCode: core.int,
      reasonPhrase: core.String,
      method: core.String,
      uri: core.Uri,
      hasSubscriber: core.bool
    }),
    getters: () => ({
      transferLength: dart.definiteFunctionType(core.int, []),
      dataDone: dart.definiteFunctionType(async.Future, [])
    }),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      close: dart.definiteFunctionType(dart.void, [core.bool])
    })
  });
  const _incoming = Symbol('_incoming');
  const _cookies = Symbol('_cookies');
  io._HttpInboundMessage = class _HttpInboundMessage extends async.Stream$(core.List$(core.int)) {
    new(incoming) {
      this[_incoming] = incoming;
      this[_cookies] = null;
      super.new();
    }
    get cookies() {
      if (this[_cookies] != null) return this[_cookies];
      return this[_cookies] = this.headers[_parseCookies]();
    }
    get headers() {
      return this[_incoming].headers;
    }
    get protocolVersion() {
      return this.headers.protocolVersion;
    }
    get contentLength() {
      return this.headers.contentLength;
    }
    get persistentConnection() {
      return this.headers.persistentConnection;
    }
  };
  dart.addSimpleTypeTests(io._HttpInboundMessage);
  dart.setSignature(io._HttpInboundMessage, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpInboundMessage, [io._HttpIncoming])}),
    fields: () => ({
      [_incoming]: io._HttpIncoming,
      [_cookies]: ListOfCookie()
    }),
    getters: () => ({
      cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
      headers: dart.definiteFunctionType(io._HttpHeaders, []),
      protocolVersion: dart.definiteFunctionType(core.String, []),
      contentLength: dart.definiteFunctionType(core.int, []),
      persistentConnection: dart.definiteFunctionType(core.bool, [])
    })
  });
  const _httpServer = Symbol('_httpServer');
  const _httpConnection = Symbol('_httpConnection');
  const _session = Symbol('_session');
  const _requestedUri = Symbol('_requestedUri');
  const _sessionManagerInstance = Symbol('_sessionManagerInstance');
  const _sessionManager = Symbol('_sessionManager');
  const _markSeen = Symbol('_markSeen');
  const _socket = Symbol('_socket');
  const _destroyed = Symbol('_destroyed');
  io._HttpRequest = class _HttpRequest extends io._HttpInboundMessage {
    new(response, _incoming, httpServer, httpConnection) {
      this.response = response;
      this[_httpServer] = httpServer;
      this[_httpConnection] = httpConnection;
      this[_session] = null;
      this[_requestedUri] = null;
      super.new(_incoming);
      if (this.headers.protocolVersion == "1.1") {
        let _ = this.response.headers;
        _.chunkedTransferEncoding = true;
        _.persistentConnection = this.headers.persistentConnection;
      }
      if (this[_httpServer][_sessionManagerInstance] != null) {
        let sessionIds = this.cookies[dartx.where](dart.fn(cookie => cookie.name[dartx.toUpperCase]() == io._DART_SESSION_ID, CookieTobool()))[dartx.map](core.String)(dart.fn(cookie => cookie.value, CookieToString()));
        for (let sessionId of sessionIds) {
          this[_session] = this[_httpServer][_sessionManager].getSession(sessionId);
          if (this[_session] != null) {
            this[_session][_markSeen]();
            break;
          }
        }
      }
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    get uri() {
      return this[_incoming].uri;
    }
    get requestedUri() {
      if (this[_requestedUri] == null) {
        let proto = this.headers._get('x-forwarded-proto');
        let scheme = proto != null ? proto[dartx.first] : io.SecureSocket.is(this[_httpConnection][_socket]) ? "https" : "http";
        let hostList = this.headers._get('x-forwarded-host');
        let host = null;
        if (hostList != null) {
          host = hostList[dartx.first];
        } else {
          hostList = this.headers._get('host');
          if (hostList != null) {
            host = hostList[dartx.first];
          } else {
            host = dart.str`${this[_httpServer].address.host}:${this[_httpServer].port}`;
          }
        }
        this[_requestedUri] = core.Uri.parse(dart.str`${scheme}://${host}${this.uri}`);
      }
      return this[_requestedUri];
    }
    get method() {
      return this[_incoming].method;
    }
    get session() {
      if (this[_session] != null) {
        if (dart.test(this[_session][_destroyed])) {
          this[_session] = null;
          return this.session;
        }
        return this[_session];
      }
      return this[_session] = this[_httpServer][_sessionManager].createSession();
    }
    get connectionInfo() {
      return this[_httpConnection].connectionInfo;
    }
    get certificate() {
      let socket = this[_httpConnection][_socket];
      if (io.SecureSocket.is(socket)) return socket.peerCertificate;
      return null;
    }
  };
  io._HttpRequest[dart.implements] = () => [io.HttpRequest];
  dart.setSignature(io._HttpRequest, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpRequest, [io.HttpResponse, io._HttpIncoming, io._HttpServer, io._HttpConnection])}),
    fields: () => ({
      response: io.HttpResponse,
      [_httpServer]: io._HttpServer,
      [_httpConnection]: io._HttpConnection,
      [_session]: io._HttpSession,
      [_requestedUri]: core.Uri
    }),
    getters: () => ({
      uri: dart.definiteFunctionType(core.Uri, []),
      requestedUri: dart.definiteFunctionType(core.Uri, []),
      method: dart.definiteFunctionType(core.String, []),
      session: dart.definiteFunctionType(io.HttpSession, []),
      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
      certificate: dart.definiteFunctionType(io.X509Certificate, [])
    }),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  const _responseRedirects = Symbol('_responseRedirects');
  const _httpRequest = Symbol('_httpRequest');
  const _httpClient = Symbol('_httpClient');
  const _httpClientConnection = Symbol('_httpClientConnection');
  const _openUrlFromRequest = Symbol('_openUrlFromRequest');
  const _connectionClosed = Symbol('_connectionClosed');
  const _shouldAuthenticateProxy = Symbol('_shouldAuthenticateProxy');
  const _shouldAuthenticate = Symbol('_shouldAuthenticate');
  const _proxy = Symbol('_proxy');
  const _findProxyCredentials = Symbol('_findProxyCredentials');
  const _findCredentials = Symbol('_findCredentials');
  const _removeProxyCredentials = Symbol('_removeProxyCredentials');
  const _removeCredentials = Symbol('_removeCredentials');
  const _authenticateProxy = Symbol('_authenticateProxy');
  const _authenticate = Symbol('_authenticate');
  io._HttpClientResponse = class _HttpClientResponse extends io._HttpInboundMessage {
    get redirects() {
      return this[_httpRequest][_responseRedirects];
    }
    new(_incoming, httpRequest, httpClient) {
      this[_httpRequest] = httpRequest;
      this[_httpClient] = httpClient;
      super.new(_incoming);
      _incoming.uri = this[_httpRequest].uri;
    }
    get statusCode() {
      return this[_incoming].statusCode;
    }
    get reasonPhrase() {
      return this[_incoming].reasonPhrase;
    }
    get certificate() {
      let socket = this[_httpRequest][_httpClientConnection][_socket];
      if (io.SecureSocket.is(socket)) return socket.peerCertificate;
      dart.throw(new core.UnsupportedError("Socket is not a SecureSocket"));
    }
    get cookies() {
      if (this[_cookies] != null) return this[_cookies];
      this[_cookies] = ListOfCookie().new();
      let values = this.headers._get(io.HttpHeaders.SET_COOKIE);
      if (values != null) {
        values[dartx.forEach](dart.fn(value => {
          this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
        }, StringTovoid$()));
      }
      return this[_cookies];
    }
    get isRedirect() {
      if (this[_httpRequest].method == "GET" || this[_httpRequest].method == "HEAD") {
        return this.statusCode == io.HttpStatus.MOVED_PERMANENTLY || this.statusCode == io.HttpStatus.FOUND || this.statusCode == io.HttpStatus.SEE_OTHER || this.statusCode == io.HttpStatus.TEMPORARY_REDIRECT;
      } else if (this[_httpRequest].method == "POST") {
        return this.statusCode == io.HttpStatus.SEE_OTHER;
      }
      return false;
    }
    redirect(method, url, followLoops) {
      if (method === void 0) method = null;
      if (url === void 0) url = null;
      if (followLoops === void 0) followLoops = null;
      if (method == null) {
        if (this.statusCode == io.HttpStatus.SEE_OTHER && this[_httpRequest].method == "POST") {
          method = "GET";
        } else {
          method = this[_httpRequest].method;
        }
      }
      if (url == null) {
        let location = this.headers.value(io.HttpHeaders.LOCATION);
        if (location == null) {
          dart.throw(new core.StateError("Response has no Location header for redirect"));
        }
        url = core.Uri.parse(location);
      }
      if (followLoops != true) {
        for (let redirect of this.redirects) {
          if (dart.equals(redirect.location, url)) {
            return FutureOfHttpClientResponse().error(new io.RedirectException("Redirect loop detected", this.redirects));
          }
        }
      }
      return this[_httpClient][_openUrlFromRequest](method, url, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => {
        let _ = request[_responseRedirects];
        _[dartx.addAll](this.redirects);
        _[dartx.add](new io._RedirectInfo(this.statusCode, method, url));
        return request.close();
      }, _HttpClientRequestToFutureOfHttpClientResponse()));
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      if (dart.test(this[_incoming].upgraded)) {
        this[_httpRequest][_httpClientConnection].destroy();
        return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
      }
      let stream = this[_incoming];
      if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
        stream = io._HttpIncoming._check(stream.transform(ListOfint())(io.GZIP.decoder));
      }
      return stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    detachSocket() {
      this[_httpClient][_connectionClosed](this[_httpRequest][_httpClientConnection]);
      return this[_httpRequest][_httpClientConnection].detachSocket();
    }
    get connectionInfo() {
      return this[_httpRequest].connectionInfo;
    }
    get [_shouldAuthenticateProxy]() {
      let challenge = this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE);
      return this.statusCode == io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED && challenge != null && challenge[dartx.length] == 1;
    }
    get [_shouldAuthenticate]() {
      let challenge = this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
      return this.statusCode == io.HttpStatus.UNAUTHORIZED && challenge != null && challenge[dartx.length] == 1;
    }
    [_authenticate](proxyAuth) {
      const retry = (function() {
        return this.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => this[_httpClient][_openUrlFromRequest](this[_httpRequest].method, this[_httpRequest].uri, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => request.close(), _HttpClientRequestToFutureOfHttpClientResponse())), dynamicToFutureOfHttpClientResponse()));
      }).bind(this);
      dart.fn(retry, VoidToFutureOfHttpClientResponse());
      const authChallenge = (function() {
        return dart.test(proxyAuth) ? this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE) : this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
      }).bind(this);
      dart.fn(authChallenge, VoidToListOfString());
      const findCredentials = (function(scheme) {
        return dart.test(proxyAuth) ? this[_httpClient][_findProxyCredentials](this[_httpRequest][_proxy], scheme) : this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
      }).bind(this);
      dart.fn(findCredentials, _AuthenticationSchemeTo_Credentials());
      const removeCredentials = (function(cr) {
        if (dart.test(proxyAuth)) {
          this[_httpClient][_removeProxyCredentials](cr);
        } else {
          this[_httpClient][_removeCredentials](cr);
        }
      }).bind(this);
      dart.fn(removeCredentials, _CredentialsTovoid());
      const requestAuthentication = (function(scheme, realm) {
        if (dart.test(proxyAuth)) {
          if (this[_httpClient][_authenticateProxy] == null) {
            return async.Future.value(false);
          }
          let proxy = this[_httpRequest][_proxy];
          return async.Future._check(dart.dsend(this[_httpClient], _authenticateProxy, proxy.host, proxy.port, dart.toString(scheme), realm));
        } else {
          if (this[_httpClient][_authenticate] == null) {
            return async.Future.value(false);
          }
          return async.Future._check(dart.dsend(this[_httpClient], _authenticate, this[_httpRequest].uri, dart.toString(scheme), realm));
        }
      }).bind(this);
      dart.fn(requestAuthentication, _AuthenticationSchemeAndStringToFuture());
      let challenge = authChallenge();
      dart.assert(challenge != null || challenge[dartx.length] == 1);
      let header = io._HeaderValue.parse(challenge[dartx._get](0), {parameterSeparator: ","});
      let scheme = io._AuthenticationScheme.fromString(header.value);
      let realm = header.parameters[dartx._get]("realm");
      let cr = findCredentials(scheme);
      if (cr != null) {
        if (dart.equals(cr.scheme, io._AuthenticationScheme.BASIC) && !dart.test(cr.used)) {
          return retry();
        }
        if (dart.equals(cr.scheme, io._AuthenticationScheme.DIGEST) && (header.parameters[dartx._get]("algorithm") == null || header.parameters[dartx._get]("algorithm")[dartx.toLowerCase]() == "md5")) {
          if (cr.nonce == null || cr.nonce == header.parameters[dartx._get]("nonce")) {
            if (cr.nonce == null) {
              let _ = cr;
              _.nonce = header.parameters[dartx._get]("nonce");
              _.algorithm = "MD5";
              _.qop = header.parameters[dartx._get]("qop");
              _.nonceCount = 0;
            }
            return retry();
          } else if (header.parameters[dartx._get]("stale") != null && header.parameters[dartx._get]("stale")[dartx.toLowerCase]() == "true") {
            cr.nonce = header.parameters[dartx._get]("nonce");
            return retry();
          }
        }
      }
      if (cr != null) {
        removeCredentials(cr);
        cr = null;
      }
      return requestAuthentication(scheme, realm).then(io.HttpClientResponse)(dart.fn(credsAvailable => {
        if (dart.test(credsAvailable)) {
          cr = this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
          return retry();
        } else {
          return this;
        }
      }, dynamicTodynamic$()));
    }
  };
  io._HttpClientResponse[dart.implements] = () => [io.HttpClientResponse];
  dart.setSignature(io._HttpClientResponse, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientResponse, [io._HttpIncoming, io._HttpClientRequest, io._HttpClient])}),
    fields: () => ({
      [_httpClient]: io._HttpClient,
      [_httpRequest]: io._HttpClientRequest
    }),
    getters: () => ({
      redirects: dart.definiteFunctionType(core.List$(io.RedirectInfo), []),
      statusCode: dart.definiteFunctionType(core.int, []),
      reasonPhrase: dart.definiteFunctionType(core.String, []),
      certificate: dart.definiteFunctionType(io.X509Certificate, []),
      isRedirect: dart.definiteFunctionType(core.bool, []),
      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
      [_shouldAuthenticateProxy]: dart.definiteFunctionType(core.bool, []),
      [_shouldAuthenticate]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      redirect: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [], [core.String, core.Uri, core.bool]),
      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
      [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
    })
  });
  const _uri = Symbol('_uri');
  const _outgoing = Symbol('_outgoing');
  const _encodingSet = Symbol('_encodingSet');
  const _bufferOutput = Symbol('_bufferOutput');
  const _encodingMutable = Symbol('_encodingMutable');
  const _encoding = Symbol('_encoding');
  const _isConnectionClosed = Symbol('_isConnectionClosed');
  const _doneCompleter = Symbol('_doneCompleter');
  const _target$ = Symbol('_target');
  const _controllerInstance = Symbol('_controllerInstance');
  const _controllerCompleter = Symbol('_controllerCompleter');
  const _isClosed$0 = Symbol('_isClosed');
  const _isBound = Symbol('_isBound');
  const _hasError$ = Symbol('_hasError');
  const _closeTarget = Symbol('_closeTarget');
  const _completeDoneValue = Symbol('_completeDoneValue');
  const _completeDoneError = Symbol('_completeDoneError');
  io._StreamSinkImpl$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
    let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
    class _StreamSinkImpl extends core.Object {
      new(target) {
        this[_doneCompleter] = async.Completer.new();
        this[_target$] = target;
        this[_controllerInstance] = null;
        this[_controllerCompleter] = null;
        this[_isClosed$0] = false;
        this[_isBound] = false;
        this[_hasError$] = false;
      }
      add(data) {
        T._check(data);
        if (dart.test(this[_isClosed$0])) return;
        this[_controller$0].add(data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_controller$0].addError(error, stackTrace);
      }
      addStream(stream) {
        StreamOfT()._check(stream);
        if (dart.test(this[_isBound])) {
          dart.throw(new core.StateError("StreamSink is already bound to a stream"));
        }
        this[_isBound] = true;
        if (dart.test(this[_hasError$])) return this.done;
        const targetAddStream = (function() {
          return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
            this[_isBound] = false;
          }, VoidTodynamic$()));
        }).bind(this);
        dart.fn(targetAddStream, VoidToFuture());
        if (this[_controllerInstance] == null) return targetAddStream();
        let future = this[_controllerCompleter].future;
        this[_controllerInstance].close();
        return future.then(dart.dynamic)(dart.fn(_ => targetAddStream(), dynamicToFuture()));
      }
      flush() {
        if (dart.test(this[_isBound])) {
          dart.throw(new core.StateError("StreamSink is bound to a stream"));
        }
        if (this[_controllerInstance] == null) return async.Future.value(this);
        this[_isBound] = true;
        let future = this[_controllerCompleter].future;
        this[_controllerInstance].close();
        return future.whenComplete(dart.fn(() => {
          this[_isBound] = false;
        }, VoidTodynamic$()));
      }
      close() {
        if (dart.test(this[_isBound])) {
          dart.throw(new core.StateError("StreamSink is bound to a stream"));
        }
        if (!dart.test(this[_isClosed$0])) {
          this[_isClosed$0] = true;
          if (this[_controllerInstance] != null) {
            this[_controllerInstance].close();
          } else {
            this[_closeTarget]();
          }
        }
        return this.done;
      }
      [_closeTarget]() {
        this[_target$].close().then(dart.dynamic)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
      }
      get done() {
        return this[_doneCompleter].future;
      }
      [_completeDoneValue](value) {
        if (!dart.test(this[_doneCompleter].isCompleted)) {
          this[_doneCompleter].complete(value);
        }
      }
      [_completeDoneError](error, stackTrace) {
        if (!dart.test(this[_doneCompleter].isCompleted)) {
          this[_hasError$] = true;
          this[_doneCompleter].completeError(error, stackTrace);
        }
      }
      get [_controller$0]() {
        if (dart.test(this[_isBound])) {
          dart.throw(new core.StateError("StreamSink is bound to a stream"));
        }
        if (dart.test(this[_isClosed$0])) {
          dart.throw(new core.StateError("StreamSink is closed"));
        }
        if (this[_controllerInstance] == null) {
          this[_controllerInstance] = StreamControllerOfT().new({sync: true});
          this[_controllerCompleter] = async.Completer.new();
          this[_target$].addStream(this[_controller$0].stream).then(dart.dynamic)(dart.fn(_ => {
            if (dart.test(this[_isBound])) {
              this[_controllerCompleter].complete(this);
              this[_controllerCompleter] = null;
              this[_controllerInstance] = null;
            } else {
              this[_closeTarget]();
            }
          }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
              if (dart.test(this[_isBound])) {
                this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
                this[_controllerCompleter] = null;
                this[_controllerInstance] = null;
              } else {
                this[_completeDoneError](error, core.StackTrace._check(stackTrace));
              }
            }, dynamicAnddynamicTodynamic$())});
        }
        return this[_controllerInstance];
      }
    }
    dart.addTypeTests(_StreamSinkImpl);
    _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
    dart.setSignature(_StreamSinkImpl, {
      constructors: () => ({new: dart.definiteFunctionType(io._StreamSinkImpl$(T), [StreamConsumerOfT()])}),
      fields: () => ({
        [_target$]: StreamConsumerOfT(),
        [_doneCompleter]: async.Completer,
        [_controllerInstance]: StreamControllerOfT(),
        [_controllerCompleter]: async.Completer,
        [_isClosed$0]: core.bool,
        [_isBound]: core.bool,
        [_hasError$]: core.bool
      }),
      getters: () => ({
        done: dart.definiteFunctionType(async.Future, []),
        [_controller$0]: dart.definiteFunctionType(async.StreamController$(T), [])
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()]),
        flush: dart.definiteFunctionType(async.Future, []),
        close: dart.definiteFunctionType(async.Future, []),
        [_closeTarget]: dart.definiteFunctionType(dart.void, []),
        [_completeDoneValue]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        [_completeDoneError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])
      })
    });
    return _StreamSinkImpl;
  });
  io._StreamSinkImpl = _StreamSinkImpl();
  io._IOSinkImpl = class _IOSinkImpl extends io._StreamSinkImpl$(core.List$(core.int)) {
    new(target, encoding) {
      this[_encoding] = encoding;
      this[_encodingMutable] = true;
      super.new(target);
    }
    get encoding() {
      return this[_encoding];
    }
    set encoding(value) {
      if (!dart.test(this[_encodingMutable])) {
        dart.throw(new core.StateError("IOSink encoding is not mutable"));
      }
      this[_encoding] = value;
    }
    write(obj) {
      let string = dart.str`${obj}`;
      if (dart.test(string[dartx.isEmpty])) return;
      this.add(this[_encoding].encode(string));
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      let iterator = objects[dartx.iterator];
      if (!dart.test(iterator.moveNext())) return;
      if (dart.test(separator[dartx.isEmpty])) {
        do {
          this.write(iterator.current);
        } while (dart.test(iterator.moveNext()));
      } else {
        this.write(iterator.current);
        while (dart.test(iterator.moveNext())) {
          this.write(separator);
          this.write(iterator.current);
        }
      }
    }
    writeln(object) {
      if (object === void 0) object = "";
      this.write(object);
      this.write("\n");
    }
    writeCharCode(charCode) {
      this.write(core.String.fromCharCode(charCode));
    }
  };
  dart.addSimpleTypeTests(io._IOSinkImpl);
  io._IOSinkImpl[dart.implements] = () => [io.IOSink];
  dart.setSignature(io._IOSinkImpl, {
    constructors: () => ({new: dart.definiteFunctionType(io._IOSinkImpl, [StreamConsumerOfListOfint(), convert.Encoding])}),
    fields: () => ({
      [_encoding]: convert.Encoding,
      [_encodingMutable]: core.bool
    }),
    getters: () => ({encoding: dart.definiteFunctionType(convert.Encoding, [])}),
    setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
    methods: () => ({
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  io._HttpOutboundMessage$ = dart.generic(T => {
    class _HttpOutboundMessage extends io._IOSinkImpl {
      new(uri, protocolVersion, outgoing, opts) {
        let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
        this[_uri] = uri;
        this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
        this[_outgoing] = outgoing;
        this[_encodingSet] = false;
        this[_bufferOutput] = true;
        super.new(outgoing, null);
        this[_outgoing].outbound = this;
        this[_encodingMutable] = false;
      }
      get contentLength() {
        return this.headers.contentLength;
      }
      set contentLength(contentLength) {
        this.headers.contentLength = contentLength;
      }
      get persistentConnection() {
        return this.headers.persistentConnection;
      }
      set persistentConnection(p) {
        this.headers.persistentConnection = p;
      }
      get bufferOutput() {
        return this[_bufferOutput];
      }
      set bufferOutput(bufferOutput) {
        if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
        this[_bufferOutput] = bufferOutput;
      }
      get encoding() {
        if (dart.test(this[_encodingSet]) && dart.test(this[_outgoing].headersWritten)) {
          return this[_encoding];
        }
        let charset = null;
        if (this.headers.contentType != null && this.headers.contentType.charset != null) {
          charset = this.headers.contentType.charset;
        } else {
          charset = "iso-8859-1";
        }
        return convert.Encoding.getByName(core.String._check(charset));
      }
      set encoding(value) {
        super.encoding = value;
      }
      add(data) {
        if (data[dartx.length] == 0) return;
        super.add(data);
      }
      write(obj) {
        if (!dart.test(this[_encodingSet])) {
          this[_encoding] = this.encoding;
          this[_encodingSet] = true;
        }
        super.write(obj);
      }
      get [_isConnectionClosed]() {
        return false;
      }
    }
    dart.addTypeTests(_HttpOutboundMessage);
    dart.setSignature(_HttpOutboundMessage, {
      constructors: () => ({new: dart.definiteFunctionType(io._HttpOutboundMessage$(T), [core.Uri, core.String, io._HttpOutgoing], {initialHeaders: io._HttpHeaders})}),
      fields: () => ({
        [_encodingSet]: core.bool,
        [_bufferOutput]: core.bool,
        [_uri]: core.Uri,
        [_outgoing]: io._HttpOutgoing,
        headers: io._HttpHeaders
      }),
      getters: () => ({
        contentLength: dart.definiteFunctionType(core.int, []),
        persistentConnection: dart.definiteFunctionType(core.bool, []),
        bufferOutput: dart.definiteFunctionType(core.bool, []),
        [_isConnectionClosed]: dart.definiteFunctionType(core.bool, [])
      }),
      setters: () => ({
        contentLength: dart.definiteFunctionType(dart.void, [core.int]),
        persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
        bufferOutput: dart.definiteFunctionType(dart.void, [core.bool])
      }),
      methods: () => ({add: dart.definiteFunctionType(dart.void, [ListOfint()])})
    });
    return _HttpOutboundMessage;
  });
  io._HttpOutboundMessage = _HttpOutboundMessage();
  const _statusCode = Symbol('_statusCode');
  const _reasonPhrase = Symbol('_reasonPhrase');
  const _deadline = Symbol('_deadline');
  const _deadlineTimer = Symbol('_deadlineTimer');
  const _isClosing = Symbol('_isClosing');
  const _findReasonPhrase = Symbol('_findReasonPhrase');
  const _isNew = Symbol('_isNew');
  const _writeHeader = Symbol('_writeHeader');
  io._HttpResponse = class _HttpResponse extends io._HttpOutboundMessage$(io.HttpResponse) {
    new(uri, protocolVersion, outgoing, defaultHeaders, serverHeader) {
      this[_statusCode] = 200;
      this[_reasonPhrase] = null;
      this[_cookies] = null;
      this[_httpRequest] = null;
      this[_deadline] = null;
      this[_deadlineTimer] = null;
      super.new(uri, protocolVersion, outgoing, {initialHeaders: io._HttpHeaders._check(defaultHeaders)});
      if (serverHeader != null) this.headers.set('server', serverHeader);
    }
    get [_isConnectionClosed]() {
      return this[_httpRequest][_httpConnection][_isClosing];
    }
    get cookies() {
      if (this[_cookies] == null) this[_cookies] = ListOfCookie().new();
      return this[_cookies];
    }
    get statusCode() {
      return this[_statusCode];
    }
    set statusCode(statusCode) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
      this[_statusCode] = statusCode;
    }
    get reasonPhrase() {
      return this[_findReasonPhrase](this.statusCode);
    }
    set reasonPhrase(reasonPhrase) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
      this[_reasonPhrase] = reasonPhrase;
    }
    redirect(location, opts) {
      let status = opts && 'status' in opts ? opts.status : io.HttpStatus.MOVED_TEMPORARILY;
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
      this.statusCode = status;
      this.headers.set("location", dart.toString(location));
      return this.close();
    }
    detachSocket(opts) {
      let writeHeaders = opts && 'writeHeaders' in opts ? opts.writeHeaders : true;
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Headers already sent"));
      this.deadline = null;
      let future = this[_httpRequest][_httpConnection].detachSocket();
      if (dart.test(writeHeaders)) {
        let headersFuture = this[_outgoing].writeHeaders({drainRequest: false, setOutgoing: false});
        dart.assert(headersFuture == null);
      } else {
        this[_outgoing].headersWritten = true;
      }
      this.close();
      this.done.catchError(dart.fn(_ => {
      }, dynamicTodynamic$()));
      return future;
    }
    get connectionInfo() {
      return this[_httpRequest].connectionInfo;
    }
    get deadline() {
      return this[_deadline];
    }
    set deadline(d) {
      if (this[_deadlineTimer] != null) this[_deadlineTimer].cancel();
      this[_deadline] = d;
      if (this[_deadline] == null) return;
      this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
        this[_httpRequest][_httpConnection].destroy();
      }, VoidTovoid$()));
    }
    [_writeHeader]() {
      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      let offset = 0;
      function write(bytes) {
        let len = bytes[dartx.length];
        for (let i = 0; i < dart.notNull(len); i++) {
          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
        }
        offset = dart.notNull(offset) + dart.notNull(len);
      }
      dart.fn(write, ListOfintTovoid$());
      if (this.headers.protocolVersion == "1.1") {
        write(io._Const.HTTP11);
      } else {
        write(io._Const.HTTP10);
      }
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.SP);
      write(dart.toString(this.statusCode)[dartx.codeUnits]);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.SP);
      write(this.reasonPhrase[dartx.codeUnits]);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.CR);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.LF);
      let session = this[_httpRequest][_session];
      if (session != null && !dart.test(session[_destroyed])) {
        session[_isNew] = false;
        let found = false;
        for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
          if (this.cookies[dartx._get](i).name[dartx.toUpperCase]() == io._DART_SESSION_ID) {
            let _ = this.cookies[dartx._get](i);
            _.value = session.id;
            _.httpOnly = true;
            _.path = "/";
            found = true;
          }
        }
        if (!found) {
          let cookie = io.Cookie.new(io._DART_SESSION_ID, session.id);
          this.cookies[dartx.add](((() => {
            cookie.httpOnly = true;
            cookie.path = "/";
            return cookie;
          })()));
        }
      }
      if (this[_cookies] != null) {
        this[_cookies][dartx.forEach](dart.fn(cookie => {
          this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
        }, CookieTovoid()));
      }
      this.headers[_finalize]();
      offset = this.headers[_write](buffer, offset);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.CR);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.LF);
      this[_outgoing].setHeader(buffer, offset);
    }
    [_findReasonPhrase](statusCode) {
      if (this[_reasonPhrase] != null) {
        return this[_reasonPhrase];
      }
      switch (statusCode) {
        case io.HttpStatus.CONTINUE:
        {
          return "Continue";
        }
        case io.HttpStatus.SWITCHING_PROTOCOLS:
        {
          return "Switching Protocols";
        }
        case io.HttpStatus.OK:
        {
          return "OK";
        }
        case io.HttpStatus.CREATED:
        {
          return "Created";
        }
        case io.HttpStatus.ACCEPTED:
        {
          return "Accepted";
        }
        case io.HttpStatus.NON_AUTHORITATIVE_INFORMATION:
        {
          return "Non-Authoritative Information";
        }
        case io.HttpStatus.NO_CONTENT:
        {
          return "No Content";
        }
        case io.HttpStatus.RESET_CONTENT:
        {
          return "Reset Content";
        }
        case io.HttpStatus.PARTIAL_CONTENT:
        {
          return "Partial Content";
        }
        case io.HttpStatus.MULTIPLE_CHOICES:
        {
          return "Multiple Choices";
        }
        case io.HttpStatus.MOVED_PERMANENTLY:
        {
          return "Moved Permanently";
        }
        case io.HttpStatus.FOUND:
        {
          return "Found";
        }
        case io.HttpStatus.SEE_OTHER:
        {
          return "See Other";
        }
        case io.HttpStatus.NOT_MODIFIED:
        {
          return "Not Modified";
        }
        case io.HttpStatus.USE_PROXY:
        {
          return "Use Proxy";
        }
        case io.HttpStatus.TEMPORARY_REDIRECT:
        {
          return "Temporary Redirect";
        }
        case io.HttpStatus.BAD_REQUEST:
        {
          return "Bad Request";
        }
        case io.HttpStatus.UNAUTHORIZED:
        {
          return "Unauthorized";
        }
        case io.HttpStatus.PAYMENT_REQUIRED:
        {
          return "Payment Required";
        }
        case io.HttpStatus.FORBIDDEN:
        {
          return "Forbidden";
        }
        case io.HttpStatus.NOT_FOUND:
        {
          return "Not Found";
        }
        case io.HttpStatus.METHOD_NOT_ALLOWED:
        {
          return "Method Not Allowed";
        }
        case io.HttpStatus.NOT_ACCEPTABLE:
        {
          return "Not Acceptable";
        }
        case io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
        {
          return "Proxy Authentication Required";
        }
        case io.HttpStatus.REQUEST_TIMEOUT:
        {
          return "Request Time-out";
        }
        case io.HttpStatus.CONFLICT:
        {
          return "Conflict";
        }
        case io.HttpStatus.GONE:
        {
          return "Gone";
        }
        case io.HttpStatus.LENGTH_REQUIRED:
        {
          return "Length Required";
        }
        case io.HttpStatus.PRECONDITION_FAILED:
        {
          return "Precondition Failed";
        }
        case io.HttpStatus.REQUEST_ENTITY_TOO_LARGE:
        {
          return "Request Entity Too Large";
        }
        case io.HttpStatus.REQUEST_URI_TOO_LONG:
        {
          return "Request-URI Too Large";
        }
        case io.HttpStatus.UNSUPPORTED_MEDIA_TYPE:
        {
          return "Unsupported Media Type";
        }
        case io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
        {
          return "Requested range not satisfiable";
        }
        case io.HttpStatus.EXPECTATION_FAILED:
        {
          return "Expectation Failed";
        }
        case io.HttpStatus.INTERNAL_SERVER_ERROR:
        {
          return "Internal Server Error";
        }
        case io.HttpStatus.NOT_IMPLEMENTED:
        {
          return "Not Implemented";
        }
        case io.HttpStatus.BAD_GATEWAY:
        {
          return "Bad Gateway";
        }
        case io.HttpStatus.SERVICE_UNAVAILABLE:
        {
          return "Service Unavailable";
        }
        case io.HttpStatus.GATEWAY_TIMEOUT:
        {
          return "Gateway Time-out";
        }
        case io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
        {
          return "Http Version not supported";
        }
        default:
        {
          return dart.str`Status ${statusCode}`;
        }
      }
    }
  };
  dart.addSimpleTypeTests(io._HttpResponse);
  io._HttpResponse[dart.implements] = () => [io.HttpResponse];
  dart.setSignature(io._HttpResponse, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpResponse, [core.Uri, core.String, io._HttpOutgoing, io.HttpHeaders, core.String])}),
    fields: () => ({
      [_statusCode]: core.int,
      [_reasonPhrase]: core.String,
      [_cookies]: ListOfCookie(),
      [_httpRequest]: io._HttpRequest,
      [_deadline]: core.Duration,
      [_deadlineTimer]: async.Timer
    }),
    getters: () => ({
      cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
      statusCode: dart.definiteFunctionType(core.int, []),
      reasonPhrase: dart.definiteFunctionType(core.String, []),
      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
      deadline: dart.definiteFunctionType(core.Duration, [])
    }),
    setters: () => ({
      statusCode: dart.definiteFunctionType(dart.void, [core.int]),
      reasonPhrase: dart.definiteFunctionType(dart.void, [core.String]),
      deadline: dart.definiteFunctionType(dart.void, [core.Duration])
    }),
    methods: () => ({
      redirect: dart.definiteFunctionType(async.Future, [core.Uri], {status: core.int}),
      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), [], {writeHeaders: core.bool}),
      [_writeHeader]: dart.definiteFunctionType(dart.void, []),
      [_findReasonPhrase]: dart.definiteFunctionType(core.String, [core.int])
    })
  });
  const _responseCompleter = Symbol('_responseCompleter');
  const _response = Symbol('_response');
  const _followRedirects = Symbol('_followRedirects');
  const _maxRedirects = Symbol('_maxRedirects');
  const _onIncoming = Symbol('_onIncoming');
  const _onError$ = Symbol('_onError');
  const _proxyTunnel = Symbol('_proxyTunnel');
  const _requestUri = Symbol('_requestUri');
  io._HttpClientRequest = class _HttpClientRequest extends io._HttpOutboundMessage$(io.HttpClientResponse) {
    new(outgoing, uri, method, proxy, httpClient, httpClientConnection) {
      this.cookies = ListOfCookie().new();
      this[_responseCompleter] = CompleterOfHttpClientResponse().new();
      this[_responseRedirects] = JSArrayOfRedirectInfo().of([]);
      this.method = method;
      this[_proxy] = proxy;
      this[_httpClient] = httpClient;
      this[_httpClientConnection] = httpClientConnection;
      this.uri = uri;
      this[_response] = null;
      this[_followRedirects] = true;
      this[_maxRedirects] = 5;
      super.new(uri, "1.1", outgoing);
      if (this.method == "GET" || this.method == "HEAD") {
        this.contentLength = 0;
      } else {
        this.headers.chunkedTransferEncoding = true;
      }
    }
    get done() {
      if (this[_response] == null) {
        this[_response] = async.Future.wait(dart.dynamic)(JSArrayOfFuture().of([this[_responseCompleter].future, super.done]), {eagerError: true}).then(io.HttpClientResponse)(dart.fn(list => list[dartx._get](0), ListTodynamic()));
      }
      return this[_response];
    }
    close() {
      super.close();
      return this.done;
    }
    get maxRedirects() {
      return this[_maxRedirects];
    }
    set maxRedirects(maxRedirects) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
      this[_maxRedirects] = maxRedirects;
    }
    get followRedirects() {
      return this[_followRedirects];
    }
    set followRedirects(followRedirects) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
      this[_followRedirects] = followRedirects;
    }
    get connectionInfo() {
      return this[_httpClientConnection].connectionInfo;
    }
    [_onIncoming](incoming) {
      let response = new io._HttpClientResponse(incoming, this, this[_httpClient]);
      let future = null;
      if (dart.test(this.followRedirects) && dart.test(response.isRedirect)) {
        if (dart.notNull(response.redirects[dartx.length]) < dart.notNull(this.maxRedirects)) {
          future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => response.redirect(), dynamicToFutureOfHttpClientResponse()));
        } else {
          future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => FutureOfHttpClientResponse().error(new io.RedirectException("Redirect limit exceeded", response.redirects)), dynamicToFutureOfHttpClientResponse()));
        }
      } else if (dart.test(response[_shouldAuthenticateProxy])) {
        future = response[_authenticate](true);
      } else if (dart.test(response[_shouldAuthenticate])) {
        future = response[_authenticate](false);
      } else {
        future = FutureOfHttpClientResponse().value(response);
      }
      future.then(dart.dynamic)(dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
    }
    [_onError$](error, stackTrace) {
      this[_responseCompleter].completeError(error, stackTrace);
    }
    [_requestUri]() {
      const uriStartingFromPath = (function() {
        let result = this.uri.path;
        if (dart.test(result[dartx.isEmpty])) result = "/";
        if (dart.test(this.uri.hasQuery)) {
          result = dart.str`${result}?${this.uri.query}`;
        }
        return result;
      }).bind(this);
      dart.fn(uriStartingFromPath, VoidToString$());
      if (dart.test(this[_proxy].isDirect)) {
        return uriStartingFromPath();
      } else {
        if (this.method == "CONNECT") {
          return dart.str`${this.uri.host}:${this.uri.port}`;
        } else {
          if (dart.test(this[_httpClientConnection][_proxyTunnel])) {
            return uriStartingFromPath();
          } else {
            return dart.toString(this.uri.removeFragment());
          }
        }
      }
    }
    [_writeHeader]() {
      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      let offset = 0;
      function write(bytes) {
        let len = bytes[dartx.length];
        for (let i = 0; i < dart.notNull(len); i++) {
          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
        }
        offset = dart.notNull(offset) + dart.notNull(len);
      }
      dart.fn(write, ListOfintTovoid$());
      write(this.method[dartx.codeUnits]);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.SP);
      write(this[_requestUri]()[dartx.codeUnits]);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.SP);
      write(io._Const.HTTP11);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.CR);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.LF);
      if (!dart.test(this.cookies[dartx.isEmpty])) {
        let sb = new core.StringBuffer();
        for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
          if (i > 0) sb.write("; ");
          sb.write(this.cookies[dartx._get](i).name);
          sb.write("=");
          sb.write(this.cookies[dartx._get](i).value);
        }
        this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
      }
      this.headers[_finalize]();
      offset = this.headers[_write](buffer, offset);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.CR);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.LF);
      this[_outgoing].setHeader(buffer, offset);
    }
  };
  dart.addSimpleTypeTests(io._HttpClientRequest);
  io._HttpClientRequest[dart.implements] = () => [io.HttpClientRequest];
  dart.setSignature(io._HttpClientRequest, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientRequest, [io._HttpOutgoing, core.Uri, core.String, io._Proxy, io._HttpClient, io._HttpClientConnection])}),
    fields: () => ({
      method: core.String,
      uri: core.Uri,
      cookies: ListOfCookie(),
      [_httpClient]: io._HttpClient,
      [_httpClientConnection]: io._HttpClientConnection,
      [_responseCompleter]: CompleterOfHttpClientResponse(),
      [_proxy]: io._Proxy,
      [_response]: FutureOfHttpClientResponse(),
      [_followRedirects]: core.bool,
      [_maxRedirects]: core.int,
      [_responseRedirects]: ListOfRedirectInfo()
    }),
    getters: () => ({
      done: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
      maxRedirects: dart.definiteFunctionType(core.int, []),
      followRedirects: dart.definiteFunctionType(core.bool, []),
      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])
    }),
    setters: () => ({
      maxRedirects: dart.definiteFunctionType(dart.void, [core.int]),
      followRedirects: dart.definiteFunctionType(dart.void, [core.bool])
    }),
    methods: () => ({
      close: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
      [_onIncoming]: dart.definiteFunctionType(dart.void, [io._HttpIncoming]),
      [_onError$]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
      [_requestUri]: dart.definiteFunctionType(core.String, []),
      [_writeHeader]: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _consume = Symbol('_consume');
  io._HttpGZipSink = class _HttpGZipSink extends convert.ByteConversionSink {
    new(consume) {
      this[_consume] = consume;
      super.new();
    }
    add(chunk) {
      dart.dcall(this[_consume], chunk);
    }
    addSlice(chunk, start, end, isLast) {
      if (typed_data.Uint8List.is(chunk)) {
        dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
      } else {
        dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
      }
    }
    close() {}
  };
  dart.setSignature(io._HttpGZipSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpGZipSink, [core.Function])}),
    fields: () => ({[_consume]: core.Function}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _closeFuture = Symbol('_closeFuture');
  const _pendingChunkedFooter = Symbol('_pendingChunkedFooter');
  const _bytesWritten = Symbol('_bytesWritten');
  const _gzip = Symbol('_gzip');
  const _gzipSink = Symbol('_gzipSink');
  const _gzipAdd = Symbol('_gzipAdd');
  const _gzipBuffer = Symbol('_gzipBuffer');
  const _gzipBufferLength = Symbol('_gzipBufferLength');
  const _socketError = Symbol('_socketError');
  const _addGZipChunk = Symbol('_addGZipChunk');
  const _addChunk$ = Symbol('_addChunk');
  const _chunkHeader = Symbol('_chunkHeader');
  const _ignoreError = Symbol('_ignoreError');
  let const$68;
  io._HttpOutgoing = class _HttpOutgoing extends core.Object {
    new(socket) {
      this[_doneCompleter] = async.Completer.new();
      this.socket = socket;
      this.ignoreBody = false;
      this.headersWritten = false;
      this[_buffer$] = null;
      this[_length$2] = 0;
      this[_closeFuture] = null;
      this.chunked = false;
      this[_pendingChunkedFooter] = 0;
      this.contentLength = null;
      this[_bytesWritten] = 0;
      this[_gzip] = false;
      this[_gzipSink] = null;
      this[_gzipAdd] = null;
      this[_gzipBuffer] = null;
      this[_gzipBufferLength] = 0;
      this[_socketError] = false;
      this.outbound = null;
    }
    writeHeaders(opts) {
      let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
      let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
      const write = (function() {
        try {
          this.outbound[_writeHeader]();
        } catch (_) {
          return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
        }

        return null;
      }).bind(this);
      dart.fn(write, VoidToFuture());
      if (dart.test(this.headersWritten)) return null;
      this.headersWritten = true;
      let drainFuture = null;
      let gzip = false;
      if (io._HttpResponse.is(this.outbound)) {
        let response = io._HttpResponse._check(this.outbound);
        if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
          let acceptEncodings = response[_httpRequest].headers._get(io.HttpHeaders.ACCEPT_ENCODING);
          let contentEncoding = this.outbound.headers._get(io.HttpHeaders.CONTENT_ENCODING);
          if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool$()))) && contentEncoding == null) {
            this.outbound.headers.set(io.HttpHeaders.CONTENT_ENCODING, "gzip");
            gzip = true;
          }
        }
        if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
          drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
          }, dynamicTodynamic$()));
        }
      } else {
        drainRequest = false;
      }
      if (dart.test(this.ignoreBody)) {
        return write();
      }
      if (dart.test(setOutgoing)) {
        let contentLength = this.outbound.headers.contentLength;
        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
          this.chunked = true;
          if (gzip) this.gzip = true;
        } else if (dart.notNull(contentLength) >= 0) {
          this.contentLength = contentLength;
        }
      }
      if (drainFuture != null) {
        return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
      }
      return write();
    }
    addStream(stream) {
      if (dart.test(this[_socketError])) {
        stream.listen(null).cancel();
        return async.Future.value(this.outbound);
      }
      if (dart.test(this.ignoreBody)) {
        stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
        }, dynamicTodynamic$()));
        let future = this.writeHeaders();
        if (future != null) {
          return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
        }
        return this.close();
      }
      let sub = null;
      let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
      const onData = (function(data) {
        if (dart.test(this[_socketError])) return;
        if (dart.equals(dart.dload(data, 'length'), 0)) return;
        if (dart.test(this.chunked)) {
          if (dart.test(this[_gzip])) {
            this[_gzipAdd] = dart.bind(controller, 'add');
            this[_addGZipChunk](data, dart.bind(this[_gzipSink], 'add'));
            this[_gzipAdd] = null;
            return;
          }
          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
          this[_pendingChunkedFooter] = 2;
        } else {
          if (this.contentLength != null) {
            this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
            if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
              controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
              return;
            }
          }
        }
        this[_addChunk$](data, dart.bind(controller, 'add'));
      }).bind(this);
      dart.fn(onData, dynamicTovoid$());
      sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
      if (!dart.test(this.headersWritten)) {
        let future = this.writeHeaders();
        if (future != null) {
          dart.dsend(sub, 'pause', future);
        }
      }
      return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
          if (dart.test(this[_gzip])) this[_gzipSink].close();
          this[_socketError] = true;
          this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
          if (dart.test(this[_ignoreError](error))) {
            return this.outbound;
          } else {
            dart.throw(error);
          }
        }, dynamicAnddynamicTo_HttpOutboundMessage())});
    }
    close() {
      if (this[_closeFuture] != null) return this[_closeFuture];
      if (dart.test(this[_socketError])) return async.Future.value(this.outbound);
      if (dart.test(this.outbound[_isConnectionClosed])) return async.Future.value(this.outbound);
      if (!dart.test(this.headersWritten) && !dart.test(this.ignoreBody)) {
        if (this.outbound.headers.contentLength == -1) {
          this.outbound.headers.chunkedTransferEncoding = false;
          this.outbound.headers.contentLength = 0;
        } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
          let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
          this[_doneCompleter].completeError(error);
          return this[_closeFuture] = async.Future.error(error);
        }
      }
      if (this.contentLength != null) {
        if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
          let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
          this[_doneCompleter].completeError(error);
          return this[_closeFuture] = async.Future.error(error);
        }
      }
      const finalize = (function() {
        if (dart.test(this.chunked)) {
          if (dart.test(this[_gzip])) {
            this[_gzipAdd] = dart.bind(this.socket, 'add');
            if (dart.notNull(this[_gzipBufferLength]) > 0) {
              this[_gzipSink].add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
            }
            this[_gzipBuffer] = null;
            this[_gzipSink].close();
            this[_gzipAdd] = null;
          }
          this[_addChunk$](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
        }
        if (dart.notNull(this[_length$2]) > 0) {
          this.socket.add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
        }
        this[_buffer$] = null;
        return this.socket.flush().then(io._HttpOutboundMessage)(dart.fn(_ => {
          this[_doneCompleter].complete(this.socket);
          return this.outbound;
        }, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
            this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
            if (dart.test(this[_ignoreError](error))) {
              return this.outbound;
            } else {
              dart.throw(error);
            }
          }, dynamicAnddynamicTo_HttpOutboundMessage())});
      }).bind(this);
      dart.fn(finalize, VoidToFuture());
      let future = this.writeHeaders();
      if (future != null) {
        return this[_closeFuture] = future.whenComplete(finalize);
      }
      return this[_closeFuture] = finalize();
    }
    get done() {
      return this[_doneCompleter].future;
    }
    setHeader(data, length) {
      dart.assert(this[_length$2] == 0);
      dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
      this[_buffer$] = typed_data.Uint8List._check(data);
      this[_length$2] = length;
    }
    set gzip(value) {
      this[_gzip] = value;
      if (dart.test(this[_gzip])) {
        this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
        dart.assert(this[_gzipSink] == null);
        this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
          if (this[_gzipAdd] == null) return;
          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
          this[_pendingChunkedFooter] = 2;
          this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
        }, dynamicTodynamic$())));
      }
    }
    [_ignoreError](error) {
      return (io.SocketException.is(error) || io.TlsException.is(error)) && io.HttpResponse.is(this.outbound);
    }
    [_addGZipChunk](chunk, add) {
      if (!dart.test(this.outbound.bufferOutput)) {
        add(ListOfint()._check(chunk));
        return;
      }
      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
        add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
        this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
        this[_gzipBufferLength] = 0;
      }
      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
        add(ListOfint()._check(chunk));
      } else {
        this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
        this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
      }
    }
    [_addChunk$](chunk, add) {
      if (!dart.test(this.outbound.bufferOutput)) {
        if (this[_buffer$] != null) {
          add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
          this[_buffer$] = null;
          this[_length$2] = 0;
        }
        add(ListOfint()._check(chunk));
        return;
      }
      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
        add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
        this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
        this[_length$2] = 0;
      }
      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
        add(ListOfint()._check(chunk));
      } else {
        this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
        this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
      }
    }
    [_chunkHeader](length) {
      let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
      if (length == 0) {
        if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
        return io._HttpOutgoing._chunk0Length;
      }
      let size = this[_pendingChunkedFooter];
      let len = length;
      while (dart.notNull(len) > 0) {
        size = dart.notNull(size) + 1;
        len = len[dartx['>>']](4);
      }
      let footerAndHeader = typed_data.Uint8List.new(dart.notNull(size) + 2);
      if (this[_pendingChunkedFooter] == 2) {
        footerAndHeader[dartx._set](0, io._CharCode.CR);
        footerAndHeader[dartx._set](1, io._CharCode.LF);
      }
      let index = size;
      while (dart.notNull(index) > dart.notNull(this[_pendingChunkedFooter])) {
        footerAndHeader[dartx._set]((index = dart.notNull(index) - 1), hexDigits[dartx._get](dart.notNull(length) & 15));
        length = length[dartx['>>']](4);
      }
      footerAndHeader[dartx._set](dart.notNull(size) + 0, io._CharCode.CR);
      footerAndHeader[dartx._set](dart.notNull(size) + 1, io._CharCode.LF);
      return footerAndHeader;
    }
  };
  io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
  dart.setSignature(io._HttpOutgoing, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpOutgoing, [io.Socket])}),
    fields: () => ({
      [_doneCompleter]: async.Completer,
      socket: io.Socket,
      ignoreBody: core.bool,
      headersWritten: core.bool,
      [_buffer$]: typed_data.Uint8List,
      [_length$2]: core.int,
      [_closeFuture]: async.Future,
      chunked: core.bool,
      [_pendingChunkedFooter]: core.int,
      contentLength: core.int,
      [_bytesWritten]: core.int,
      [_gzip]: core.bool,
      [_gzipSink]: convert.ByteConversionSink,
      [_gzipAdd]: core.Function,
      [_gzipBuffer]: typed_data.Uint8List,
      [_gzipBufferLength]: core.int,
      [_socketError]: core.bool,
      outbound: io._HttpOutboundMessage
    }),
    getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
    setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
    methods: () => ({
      writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
      close: dart.definiteFunctionType(async.Future, []),
      setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
      [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
      [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
      [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
    }),
    sfields: () => ({
      _footerAndChunk0Length: ListOfint(),
      _chunk0Length: ListOfint()
    })
  });
  dart.defineLazy(io._HttpOutgoing, {
    get _footerAndChunk0Length() {
      return dart.constList([io._CharCode.CR, io._CharCode.LF, 48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
    },
    get _chunk0Length() {
      return dart.constList([48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
    }
  });
  const _context = Symbol('_context');
  const _httpParser = Symbol('_httpParser');
  const _subscription$ = Symbol('_subscription');
  const _dispose = Symbol('_dispose');
  const _idleTimer = Symbol('_idleTimer');
  const _currentUri = Symbol('_currentUri');
  const _nextResponseCompleter = Symbol('_nextResponseCompleter');
  const _streamFuture = Symbol('_streamFuture');
  const _proxyCredentials = Symbol('_proxyCredentials');
  const _returnConnection = Symbol('_returnConnection');
  io._HttpClientConnection = class _HttpClientConnection extends core.Object {
    new(key, socket, httpClient, proxyTunnel, context) {
      if (proxyTunnel === void 0) proxyTunnel = false;
      if (context === void 0) context = null;
      this.key = key;
      this[_socket] = socket;
      this[_httpClient] = httpClient;
      this[_proxyTunnel] = proxyTunnel;
      this[_context] = context;
      this[_httpParser] = io._HttpParser.responseParser();
      this[_subscription$] = null;
      this[_dispose] = false;
      this[_idleTimer] = null;
      this.closed = false;
      this[_currentUri] = null;
      this[_nextResponseCompleter] = null;
      this[_streamFuture] = null;
      this[_httpParser].listenToStream(this[_socket]);
      this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
        this[_subscription$].pause();
        if (this[_nextResponseCompleter] == null) {
          dart.throw(new io.HttpException("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
        }
        if (incoming.statusCode == 100) {
          incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
            this[_subscription$].resume();
          }, dynamicTodynamic$())).catchError(dart.fn((error, stackTrace) => {
            if (stackTrace === void 0) stackTrace = null;
            this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
            this[_nextResponseCompleter] = null;
          }, dynamic__Todynamic$()));
        } else {
          this[_nextResponseCompleter].complete(incoming);
          this[_nextResponseCompleter] = null;
        }
      }, _HttpIncomingTovoid$()), {onError: dart.fn((error, stackTrace) => {
          if (stackTrace === void 0) stackTrace = null;
          if (this[_nextResponseCompleter] != null) {
            this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
            this[_nextResponseCompleter] = null;
          }
        }, dynamic__Todynamic$()), onDone: dart.fn(() => {
          if (this[_nextResponseCompleter] != null) {
            this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
            this[_nextResponseCompleter] = null;
          }
          this.close();
        }, VoidTovoid$())});
    }
    send(uri, port, method, proxy) {
      if (dart.test(this.closed)) {
        dart.throw(new io.HttpException("Socket closed before request was sent", {uri: uri}));
      }
      this[_currentUri] = uri;
      this[_subscription$].pause();
      let proxyCreds = null;
      let creds = null;
      let outgoing = new io._HttpOutgoing(this[_socket]);
      let request = new io._HttpClientRequest(outgoing, uri, method, proxy, this[_httpClient], this);
      let host = uri.host;
      if (dart.test(host[dartx.contains](':'))) host = dart.str`[${host}]`;
      request.headers.host = host;
      request.headers.port = port;
      request.headers[_add$2](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
      if (this[_httpClient].userAgent != null) {
        request.headers[_add$2]('user-agent', this[_httpClient].userAgent);
      }
      if (dart.test(proxy.isAuthenticated)) {
        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
        request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
      } else if (!dart.test(proxy.isDirect) && dart.notNull(this[_httpClient][_proxyCredentials][dartx.length]) > 0) {
        proxyCreds = this[_httpClient][_findProxyCredentials](proxy);
        if (proxyCreds != null) {
          proxyCreds.authorize(request);
        }
      }
      if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
        request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
      } else {
        creds = this[_httpClient][_findCredentials](uri);
        if (creds != null) {
          creds.authorize(request);
        }
      }
      this[_httpParser].isHead = method == "HEAD";
      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
        this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
        this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
          this[_currentUri] = null;
          incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
            if (dart.test(incoming.upgraded)) {
              this[_httpClient][_connectionClosed](this);
              this.startTimer();
              return;
            }
            if (dart.test(this.closed)) return;
            if (!dart.test(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
              this[_httpClient][_returnConnection](this);
              this[_subscription$].resume();
            } else {
              this.destroy();
            }
          }, dynamicTodynamic$()));
          if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
            let authInfo = incoming.headers._get("proxy-authentication-info");
            if (authInfo != null && authInfo[dartx.length] == 1) {
              let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
              let nextnonce = header.parameters[dartx._get]("nextnonce");
              if (nextnonce != null) proxyCreds.nonce = nextnonce;
            }
          }
          if (creds != null && dart.equals(creds.scheme, io._AuthenticationScheme.DIGEST)) {
            let authInfo = incoming.headers._get("authentication-info");
            if (authInfo != null && authInfo[dartx.length] == 1) {
              let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
              let nextnonce = header.parameters[dartx._get]("nextnonce");
              if (nextnonce != null) creds.nonce = nextnonce;
            }
          }
          request[_onIncoming](incoming);
        }, _HttpIncomingTodynamic())).catchError(dart.fn(error => {
          dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
        }, dynamicTodynamic$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
          this.destroy();
          request[_onError$](error, core.StackTrace._check(stackTrace));
        }, dynamicAnddynamicTodynamic$()));
        this[_subscription$].resume();
        return s;
      }, dynamicTodynamic$()), {onError: dart.fn(e => {
          this.destroy();
        }, dynamicTodynamic$())});
      return request;
    }
    detachSocket() {
      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
    }
    destroy() {
      this.closed = true;
      this[_httpClient][_connectionClosed](this);
      this[_socket].destroy();
    }
    close() {
      this.closed = true;
      this[_httpClient][_connectionClosed](this);
      this[_streamFuture].then(dart.dynamic)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
    }
    createProxyTunnel(host, port, proxy, callback) {
      let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
      if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
        request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
      }
      return request.close().then(io.SecureSocket)(dart.fn(response => {
        if (response.statusCode != io.HttpStatus.OK) {
          dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
        }
        let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
        return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
      }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
        let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
        return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
      }, SecureSocketTo_HttpClientConnection()));
    }
    get connectionInfo() {
      return io._HttpConnectionInfo.create(this[_socket]);
    }
    static makeKey(isSecure, host, port) {
      return dart.test(isSecure) ? dart.str`ssh:${host}:${port}` : dart.str`${host}:${port}`;
    }
    stopTimer() {
      if (this[_idleTimer] != null) {
        this[_idleTimer].cancel();
        this[_idleTimer] = null;
      }
    }
    startTimer() {
      dart.assert(this[_idleTimer] == null);
      this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
        this[_idleTimer] = null;
        this.close();
      }, VoidTovoid$()));
    }
  };
  dart.setSignature(io._HttpClientConnection, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientConnection, [core.String, io.Socket, io._HttpClient], [core.bool, io.SecurityContext])}),
    fields: () => ({
      key: core.String,
      [_socket]: io.Socket,
      [_proxyTunnel]: core.bool,
      [_context]: io.SecurityContext,
      [_httpParser]: io._HttpParser,
      [_subscription$]: async.StreamSubscription,
      [_httpClient]: io._HttpClient,
      [_dispose]: core.bool,
      [_idleTimer]: async.Timer,
      closed: core.bool,
      [_currentUri]: core.Uri,
      [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
      [_streamFuture]: async.Future
    }),
    getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
    methods: () => ({
      send: dart.definiteFunctionType(io._HttpClientRequest, [core.Uri, core.int, core.String, io._Proxy]),
      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
      destroy: dart.definiteFunctionType(dart.void, []),
      close: dart.definiteFunctionType(dart.void, []),
      createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      stopTimer: dart.definiteFunctionType(dart.void, []),
      startTimer: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({makeKey: dart.definiteFunctionType(dart.dynamic, [core.bool, core.String, core.int])}),
    names: ['makeKey']
  });
  io._ConnectionInfo = class _ConnectionInfo extends core.Object {
    new(connection, proxy) {
      this.connection = connection;
      this.proxy = proxy;
    }
  };
  dart.setSignature(io._ConnectionInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection, io._Proxy])}),
    fields: () => ({
      connection: io._HttpClientConnection,
      proxy: io._Proxy
    })
  });
  const _idle = Symbol('_idle');
  const _active = Symbol('_active');
  const _pending$ = Symbol('_pending');
  const _connecting = Symbol('_connecting');
  const _checkPending = Symbol('_checkPending');
  const _connectionsChanged = Symbol('_connectionsChanged');
  const _badCertificateCallback = Symbol('_badCertificateCallback');
  const _getConnectionTarget = Symbol('_getConnectionTarget');
  io._ConnectionTarget = class _ConnectionTarget extends core.Object {
    new(key, host, port, isSecure, context) {
      this[_idle] = HashSetOf_HttpClientConnection().new();
      this[_active] = HashSetOf_HttpClientConnection().new();
      this[_pending$] = new collection.ListQueue();
      this.key = key;
      this.host = host;
      this.port = port;
      this.isSecure = isSecure;
      this.context = context;
      this[_connecting] = 0;
    }
    get isEmpty() {
      return dart.test(this[_idle].isEmpty) && dart.test(this[_active].isEmpty) && this[_connecting] == 0;
    }
    get hasIdle() {
      return this[_idle].isNotEmpty;
    }
    get hasActive() {
      return dart.test(this[_active].isNotEmpty) || dart.notNull(this[_connecting]) > 0;
    }
    takeIdle() {
      dart.assert(this.hasIdle);
      let connection = this[_idle].first;
      this[_idle].remove(connection);
      connection.stopTimer();
      this[_active].add(connection);
      return connection;
    }
    [_checkPending]() {
      if (dart.test(this[_pending$].isNotEmpty)) {
        dart.dcall(this[_pending$].removeFirst());
      }
    }
    addNewActive(connection) {
      this[_active].add(connection);
    }
    returnConnection(connection) {
      dart.assert(this[_active].contains(connection));
      this[_active].remove(connection);
      this[_idle].add(connection);
      connection.startTimer();
      this[_checkPending]();
    }
    connectionClosed(connection) {
      dart.assert(!dart.test(this[_active].contains(connection)) || !dart.test(this[_idle].contains(connection)));
      this[_active].remove(connection);
      this[_idle].remove(connection);
      this[_checkPending]();
    }
    close(force) {
      for (let c of this[_idle].toList()) {
        c.close();
      }
      if (dart.test(force)) {
        for (let c of this[_active].toList()) {
          c.destroy();
        }
      }
    }
    connect(uriHost, uriPort, proxy, client) {
      if (dart.test(this.hasIdle)) {
        let connection = this.takeIdle();
        client[_connectionsChanged]();
        return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
      }
      if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
        let completer = async.Completer.new();
        this[_pending$].add(dart.fn(() => {
          this.connect(uriHost, uriPort, proxy, client).then(dart.dynamic)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
        }, VoidTodynamic$()));
        return FutureOf_ConnectionInfo()._check(completer.future);
      }
      let currentBadCertificateCallback = client[_badCertificateCallback];
      function callback(certificate) {
        if (currentBadCertificateCallback == null) return false;
        return currentBadCertificateCallback(certificate, uriHost, uriPort);
      }
      dart.fn(callback, X509CertificateTobool$());
      let socketFuture = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.connect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.connect(this.host, this.port);
      this[_connecting] = dart.notNull(this[_connecting]) + 1;
      return socketFuture.then(io._ConnectionInfo)(dart.fn(socket => {
        this[_connecting] = dart.notNull(this[_connecting]) - 1;
        dart.dsend(socket, 'setOption', io.SocketOption.TCP_NODELAY, true);
        let connection = new io._HttpClientConnection(this.key, io.Socket._check(socket), client, false, this.context);
        if (dart.test(this.isSecure) && !dart.test(proxy.isDirect)) {
          connection[_dispose] = true;
          return connection.createProxyTunnel(uriHost, uriPort, proxy, callback).then(io._ConnectionInfo)(dart.fn(tunnel => {
            client[_getConnectionTarget](uriHost, uriPort, true).addNewActive(tunnel);
            return new io._ConnectionInfo(tunnel, proxy);
          }, _HttpClientConnectionTo_ConnectionInfo()));
        } else {
          this.addNewActive(connection);
          return new io._ConnectionInfo(connection, proxy);
        }
      }, dynamicTodynamic$()), {onError: dart.fn(error => {
          this[_connecting] = dart.notNull(this[_connecting]) - 1;
          this[_checkPending]();
          dart.throw(error);
        }, dynamicTodynamic$())});
    }
  };
  dart.setSignature(io._ConnectionTarget, {
    constructors: () => ({new: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.String, core.int, core.bool, io.SecurityContext])}),
    fields: () => ({
      key: core.String,
      host: core.String,
      port: core.int,
      isSecure: core.bool,
      context: io.SecurityContext,
      [_idle]: SetOf_HttpClientConnection(),
      [_active]: SetOf_HttpClientConnection(),
      [_pending$]: collection.Queue,
      [_connecting]: core.int
    }),
    getters: () => ({
      isEmpty: dart.definiteFunctionType(core.bool, []),
      hasIdle: dart.definiteFunctionType(core.bool, []),
      hasActive: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      takeIdle: dart.definiteFunctionType(io._HttpClientConnection, []),
      [_checkPending]: dart.definiteFunctionType(dart.dynamic, []),
      addNewActive: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
      returnConnection: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
      connectionClosed: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
      close: dart.definiteFunctionType(dart.void, [core.bool]),
      connect: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._Proxy, io._HttpClient])
    })
  });
  io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
  const _idleTimeout = Symbol('_idleTimeout');
  let const$69;
  const _connectionTargets = Symbol('_connectionTargets');
  const _credentials = Symbol('_credentials');
  const _closing = Symbol('_closing');
  const _closingForcefully = Symbol('_closingForcefully');
  const _findProxy = Symbol('_findProxy');
  const _openUrl = Symbol('_openUrl');
  const _closeConnections = Symbol('_closeConnections');
  let const$70;
  const _getConnection = Symbol('_getConnection');
  io._HttpClient = class _HttpClient extends core.Object {
    get idleTimeout() {
      return this[_idleTimeout];
    }
    new(context) {
      this[_connectionTargets] = HashMapOfString$_ConnectionTarget().new();
      this[_credentials] = JSArrayOf_Credentials().of([]);
      this[_proxyCredentials] = JSArrayOf_ProxyCredentials().of([]);
      this.userAgent = io._getHttpVersion();
      this[_context] = context;
      this[_closing] = false;
      this[_closingForcefully] = false;
      this[_authenticate] = null;
      this[_authenticateProxy] = null;
      this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
      this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
      this[_badCertificateCallback] = null;
      this.maxConnectionsPerHost = null;
      this.autoUncompress = true;
    }
    set idleTimeout(timeout) {
      this[_idleTimeout] = timeout;
      for (let c of this[_connectionTargets][dartx.values]) {
        for (let idle of c[_idle]) {
          idle.stopTimer();
          idle.startTimer();
        }
      }
    }
    set badCertificateCallback(callback) {
      this[_badCertificateCallback] = callback;
    }
    open(method, host, port, path) {
      let hashMark = 35;
      let questionMark = 63;
      let fragmentStart = path[dartx.length];
      let queryStart = path[dartx.length];
      for (let i = dart.notNull(path[dartx.length]) - 1; i >= 0; i--) {
        let char = path[dartx.codeUnitAt](i);
        if (char == hashMark) {
          fragmentStart = i;
          queryStart = i;
        } else if (char == questionMark) {
          queryStart = i;
        }
      }
      let query = null;
      if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
        query = path[dartx.substring](dart.notNull(queryStart) + 1, fragmentStart);
        path = path[dartx.substring](0, queryStart);
      }
      let uri = core.Uri.new({scheme: "http", host: host, port: port, path: path, query: query});
      return this[_openUrl](method, uri);
    }
    openUrl(method, url) {
      return this[_openUrl](method, url);
    }
    get(host, port, path) {
      return this.open("get", host, port, path);
    }
    getUrl(url) {
      return this[_openUrl]("get", url);
    }
    post(host, port, path) {
      return this.open("post", host, port, path);
    }
    postUrl(url) {
      return this[_openUrl]("post", url);
    }
    put(host, port, path) {
      return this.open("put", host, port, path);
    }
    putUrl(url) {
      return this[_openUrl]("put", url);
    }
    delete(host, port, path) {
      return this.open("delete", host, port, path);
    }
    deleteUrl(url) {
      return this[_openUrl]("delete", url);
    }
    head(host, port, path) {
      return this.open("head", host, port, path);
    }
    headUrl(url) {
      return this[_openUrl]("head", url);
    }
    patch(host, port, path) {
      return this.open("patch", host, port, path);
    }
    patchUrl(url) {
      return this[_openUrl]("patch", url);
    }
    close(opts) {
      let force = opts && 'force' in opts ? opts.force : false;
      this[_closing] = true;
      this[_closingForcefully] = force;
      this[_closeConnections](this[_closingForcefully]);
      dart.assert(!dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s.hasIdle, _ConnectionTargetTobool()))));
      dart.assert(!dart.test(force) || !dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s[_active].isNotEmpty, _ConnectionTargetTobool()))));
    }
    set authenticate(f) {
      this[_authenticate] = f;
    }
    addCredentials(url, realm, cr) {
      this[_credentials][dartx.add](new io._SiteCredentials(url, realm, io._HttpClientCredentials._check(cr)));
    }
    set authenticateProxy(f) {
      this[_authenticateProxy] = f;
    }
    addProxyCredentials(host, port, realm, cr) {
      this[_proxyCredentials][dartx.add](new io._ProxyCredentials(host, port, realm, io._HttpClientCredentials._check(cr)));
    }
    set findProxy(f) {
      return this[_findProxy] = f;
    }
    [_openUrl](method, uri) {
      uri = uri.removeFragment();
      if (method == null) {
        dart.throw(new core.ArgumentError(method));
      }
      if (method != "CONNECT") {
        if (dart.test(uri.host[dartx.isEmpty])) {
          dart.throw(new core.ArgumentError(dart.str`No host specified in URI ${uri}`));
        } else if (uri.scheme != "http" && uri.scheme != "https") {
          dart.throw(new core.ArgumentError(dart.str`Unsupported scheme '${uri.scheme}' in URI ${uri}`));
        }
      }
      let isSecure = uri.scheme == "https";
      let port = uri.port;
      if (port == 0) {
        port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
      }
      let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
      if (this[_findProxy] != null) {
        try {
          proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
        } catch (error) {
          let stackTrace = dart.stackTrace(error);
          return FutureOf_HttpClientRequest().error(error, stackTrace);
        }

      }
      return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(dart.fn(info => {
        function send(info) {
          return info.connection.send(uri, port, method[dartx.toUpperCase](), info.proxy);
        }
        dart.fn(send, _ConnectionInfoTo_HttpClientRequest());
        if (dart.test(info.connection.closed)) {
          return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(send);
        }
        return send(info);
      }, _ConnectionInfoTodynamic()));
    }
    [_openUrlFromRequest](method, uri, previous) {
      let resolved = previous.uri.resolveUri(uri);
      return this[_openUrl](method, resolved).then(io._HttpClientRequest)(dart.fn(request => {
        request.followRedirects = previous.followRedirects;
        request.maxRedirects = previous.maxRedirects;
        for (let header of previous.headers[_headers][dartx.keys]) {
          if (request.headers._get(header) == null) {
            request.headers.set(header, previous.headers._get(header));
          }
        }
        request.headers.chunkedTransferEncoding = false;
        request.contentLength = 0;
        return request;
      }, _HttpClientRequestTo_HttpClientRequest()));
    }
    [_returnConnection](connection) {
      this[_connectionTargets][dartx._get](connection.key).returnConnection(connection);
      this[_connectionsChanged]();
    }
    [_connectionClosed](connection) {
      connection.stopTimer();
      let connectionTarget = this[_connectionTargets][dartx._get](connection.key);
      if (connectionTarget != null) {
        connectionTarget.connectionClosed(connection);
        if (dart.test(connectionTarget.isEmpty)) {
          this[_connectionTargets][dartx.remove](connection.key);
        }
        this[_connectionsChanged]();
      }
    }
    [_connectionsChanged]() {
      if (dart.test(this[_closing])) {
        this[_closeConnections](this[_closingForcefully]);
      }
    }
    [_closeConnections](force) {
      for (let connectionTarget of this[_connectionTargets][dartx.values][dartx.toList]()) {
        connectionTarget.close(force);
      }
    }
    [_getConnectionTarget](host, port, isSecure) {
      let key = core.String._check(io._HttpClientConnection.makeKey(isSecure, host, port));
      return this[_connectionTargets][dartx.putIfAbsent](key, dart.fn(() => new io._ConnectionTarget(key, host, port, isSecure, this[_context]), VoidTo_ConnectionTarget()));
    }
    [_getConnection](uriHost, uriPort, proxyConf, isSecure) {
      let proxies = proxyConf.proxies[dartx.iterator];
      const connect = (function(error) {
        if (!dart.test(proxies.moveNext())) return FutureOf_ConnectionInfo().error(error);
        let proxy = proxies.current;
        let host = dart.test(proxy.isDirect) ? uriHost : proxy.host;
        let port = dart.test(proxy.isDirect) ? uriPort : proxy.port;
        return this[_getConnectionTarget](host, port, isSecure).connect(uriHost, uriPort, proxy, this).catchError(connect);
      }).bind(this);
      dart.fn(connect, dynamicToFutureOf_ConnectionInfo());
      return FutureOf_ConnectionInfo().new(dart.fn(() => connect(new io.HttpException("No proxies given")), VoidToFutureOf_ConnectionInfo()));
    }
    [_findCredentials](url, scheme) {
      if (scheme === void 0) scheme = null;
      let cr = this[_credentials][dartx.fold](io._SiteCredentials)(null, dart.fn((prev, value) => {
        let siteCredentials = io._SiteCredentials.as(value);
        if (dart.test(siteCredentials.applies(url, scheme))) {
          if (prev == null) return io._SiteCredentials._check(value);
          return dart.notNull(siteCredentials.uri.path[dartx.length]) > dart.notNull(prev.uri.path[dartx.length]) ? siteCredentials : prev;
        } else {
          return prev;
        }
      }, _SiteCredentialsAnd_CredentialsTo_SiteCredentials()));
      return cr;
    }
    [_findProxyCredentials](proxy, scheme) {
      if (scheme === void 0) scheme = null;
      let it = this[_proxyCredentials][dartx.iterator];
      while (dart.test(it.moveNext())) {
        if (dart.test(it.current.applies(proxy, scheme))) {
          return it.current;
        }
      }
      return null;
    }
    [_removeCredentials](cr) {
      let index = this[_credentials][dartx.indexOf](cr);
      if (index != -1) {
        this[_credentials][dartx.removeAt](index);
      }
    }
    [_removeProxyCredentials](cr) {
      let index = this[_proxyCredentials][dartx.indexOf](io._ProxyCredentials._check(cr));
      if (index != -1) {
        this[_proxyCredentials][dartx.removeAt](index);
      }
    }
    static _findProxyFromEnvironment(url, environment) {
      function checkNoProxy(option) {
        if (option == null) return null;
        let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString$()))[dartx.iterator];
        while (dart.test(names.moveNext())) {
          let name = names.current;
          if (dart.test(name[dartx.startsWith]("[")) && dart.test(name[dartx.endsWith]("]")) && dart.str`[${url.host}]` == name || dart.test(name[dartx.isNotEmpty]) && dart.test(url.host[dartx.endsWith](name))) {
            return "DIRECT";
          }
        }
        return null;
      }
      dart.fn(checkNoProxy, StringToString$());
      function checkProxy(option) {
        if (option == null) return null;
        option = option[dartx.trim]();
        if (dart.test(option[dartx.isEmpty])) return null;
        let pos = option[dartx.indexOf]("://");
        if (dart.notNull(pos) >= 0) {
          option = option[dartx.substring](dart.notNull(pos) + 3);
        }
        pos = option[dartx.indexOf]("/");
        if (dart.notNull(pos) >= 0) {
          option = option[dartx.substring](0, pos);
        }
        if (option[dartx.indexOf]("[") == 0) {
          let pos = option[dartx.lastIndexOf](":");
          if (dart.notNull(option[dartx.indexOf]("]")) > dart.notNull(pos)) option = dart.str`${option}:1080`;
        } else {
          if (option[dartx.indexOf](":") == -1) option = dart.str`${option}:1080`;
        }
        return dart.str`PROXY ${option}`;
      }
      dart.fn(checkProxy, StringToString$());
      if (environment == null) environment = io._HttpClient._platformEnvironmentCache;
      let proxyCfg = null;
      let noProxy = environment[dartx._get]("no_proxy");
      if (noProxy == null) noProxy = environment[dartx._get]("NO_PROXY");
      if ((proxyCfg = checkNoProxy(noProxy)) != null) {
        return proxyCfg;
      }
      if (url.scheme == "http") {
        let proxy = environment[dartx._get]("http_proxy");
        if (proxy == null) proxy = environment[dartx._get]("HTTP_PROXY");
        if ((proxyCfg = checkProxy(proxy)) != null) {
          return proxyCfg;
        }
      } else if (url.scheme == "https") {
        let proxy = environment[dartx._get]("https_proxy");
        if (proxy == null) proxy = environment[dartx._get]("HTTPS_PROXY");
        if ((proxyCfg = checkProxy(proxy)) != null) {
          return proxyCfg;
        }
      }
      return "DIRECT";
    }
  };
  io._HttpClient[dart.implements] = () => [io.HttpClient];
  dart.setSignature(io._HttpClient, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpClient, [io.SecurityContext])}),
    fields: () => ({
      [_closing]: core.bool,
      [_closingForcefully]: core.bool,
      [_connectionTargets]: MapOfString$_ConnectionTarget(),
      [_credentials]: ListOf_Credentials(),
      [_proxyCredentials]: ListOf_ProxyCredentials(),
      [_context]: io.SecurityContext,
      [_authenticate]: core.Function,
      [_authenticateProxy]: core.Function,
      [_findProxy]: core.Function,
      [_idleTimeout]: core.Duration,
      [_badCertificateCallback]: io.BadCertificateCallback,
      maxConnectionsPerHost: core.int,
      autoUncompress: core.bool,
      userAgent: core.String
    }),
    getters: () => ({idleTimeout: dart.definiteFunctionType(core.Duration, [])}),
    setters: () => ({
      idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
      badCertificateCallback: dart.definiteFunctionType(dart.void, [X509CertificateAndStringAndintTobool()]),
      authenticate: dart.definiteFunctionType(dart.void, [UriAndStringAndStringToFutureOfbool()]),
      authenticateProxy: dart.definiteFunctionType(dart.void, [StringAndintAndString__ToFutureOfbool()]),
      findProxy: dart.definiteFunctionType(dart.void, [UriToString()])
    }),
    methods: () => ({
      open: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.String, core.int, core.String]),
      openUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.Uri]),
      get: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
      getUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
      post: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
      postUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
      put: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
      putUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
      delete: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
      deleteUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
      head: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
      headUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
      patch: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
      patchUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
      close: dart.definiteFunctionType(dart.void, [], {force: core.bool}),
      addCredentials: dart.definiteFunctionType(dart.void, [core.Uri, core.String, io.HttpClientCredentials]),
      addProxyCredentials: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String, io.HttpClientCredentials]),
      [_openUrl]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri]),
      [_openUrlFromRequest]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri, io._HttpClientRequest]),
      [_returnConnection]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
      [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
      [_connectionsChanged]: dart.definiteFunctionType(dart.void, []),
      [_closeConnections]: dart.definiteFunctionType(dart.void, [core.bool]),
      [_getConnectionTarget]: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.int, core.bool]),
      [_getConnection]: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._ProxyConfiguration, core.bool]),
      [_findCredentials]: dart.definiteFunctionType(io._SiteCredentials, [core.Uri], [io._AuthenticationScheme]),
      [_findProxyCredentials]: dart.definiteFunctionType(io._ProxyCredentials, [io._Proxy], [io._AuthenticationScheme]),
      [_removeCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials]),
      [_removeProxyCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials])
    }),
    sfields: () => ({_platformEnvironmentCache: MapOfString$String()}),
    statics: () => ({_findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri, MapOfString$String()])}),
    names: ['_findProxyFromEnvironment']
  });
  dart.defineLazy(io._HttpClient, {
    get _platformEnvironmentCache() {
      return io.Platform.environment;
    },
    set _platformEnvironmentCache(_) {}
  });
  const _state$1 = Symbol('_state');
  const _idleMark = Symbol('_idleMark');
  const _owner = Symbol('_owner');
  const _serviceId = Symbol('_serviceId');
  const _markActive = Symbol('_markActive');
  const _markIdle = Symbol('_markIdle');
  const _handleRequest = Symbol('_handleRequest');
  const _isActive = Symbol('_isActive');
  const _isIdle = Symbol('_isIdle');
  const _isDetached = Symbol('_isDetached');
  const _serviceTypePath = Symbol('_serviceTypePath');
  const _serviceTypeName = Symbol('_serviceTypeName');
  const _servicePath = Symbol('_servicePath');
  const _serviceType = Symbol('_serviceType');
  const _toJSON$ = Symbol('_toJSON');
  const __serviceId = Symbol('__serviceId');
  io._ServiceObject = class _ServiceObject extends core.Object {
    new() {
      this[__serviceId] = 0;
    }
    get [_serviceId]() {
      if (this[__serviceId] == 0) this[__serviceId] = (() => {
        let x = io._nextServiceId;
        io._nextServiceId = dart.notNull(x) + 1;
        return x;
      })();
      return this[__serviceId];
    }
    get [_servicePath]() {
      return dart.str`${this[_serviceTypePath]}/${this[_serviceId]}`;
    }
    [_serviceType](ref) {
      if (dart.test(ref)) return dart.str`@${this[_serviceTypeName]}`;
      return this[_serviceTypeName];
    }
  };
  dart.setSignature(io._ServiceObject, {
    fields: () => ({[__serviceId]: core.int}),
    getters: () => ({
      [_serviceId]: dart.definiteFunctionType(core.int, []),
      [_servicePath]: dart.definiteFunctionType(core.String, [])
    }),
    methods: () => ({[_serviceType]: dart.definiteFunctionType(core.String, [core.bool])})
  });
  io._HttpConnection = class _HttpConnection extends dart.mixin(collection.LinkedListEntry, io._ServiceObject) {
    new(socket, httpServer) {
      this[_socket] = socket;
      this[_httpServer] = httpServer;
      this[_httpParser] = io._HttpParser.requestParser();
      this[_state$1] = io._HttpConnection._IDLE;
      this[_subscription$] = null;
      this[_idleMark] = false;
      this[_streamFuture] = null;
      super.new();
      try {
        dart.dput(this[_socket], _owner, this);
      } catch (_) {
        core.print(_);
      }

      io._HttpConnection._connections[dartx._set](this[_serviceId], this);
      this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
      this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
        this[_httpServer][_markActive](this);
        incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
          if (dart.test(closing)) this.destroy();
        }, dynamicTodynamic$()));
        this[_subscription$].pause();
        this[_state$1] = io._HttpConnection._ACTIVE;
        let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
        let response = new io._HttpResponse(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
        let request = new io._HttpRequest(response, incoming, this[_httpServer], this);
        this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(_ => {
          response.deadline = null;
          if (this[_state$1] == io._HttpConnection._DETACHED) return;
          if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
            this[_state$1] = io._HttpConnection._IDLE;
            this[_idleMark] = false;
            this[_httpServer][_markIdle](this);
            this[_subscription$].resume();
          } else {
            this.destroy();
          }
        }, dynamicTodynamic$()), {onError: dart.fn(_ => {
            this.destroy();
          }, dynamicTodynamic$())});
        outgoing.ignoreBody = request.method == "HEAD";
        response[_httpRequest] = request;
        this[_httpServer][_handleRequest](request);
      }, _HttpIncomingTovoid$()), {onDone: dart.fn(() => {
          this.destroy();
        }, VoidTovoid$()), onError: dart.fn(error => {
          this.destroy();
        }, dynamicTodynamic$())});
    }
    markIdle() {
      this[_idleMark] = true;
    }
    get isMarkedIdle() {
      return this[_idleMark];
    }
    destroy() {
      if (this[_state$1] == io._HttpConnection._CLOSING || this[_state$1] == io._HttpConnection._DETACHED) return;
      this[_state$1] = io._HttpConnection._CLOSING;
      dart.dsend(this[_socket], 'destroy');
      this[_httpServer][_connectionClosed](this);
      io._HttpConnection._connections[dartx.remove](this[_serviceId]);
    }
    detachSocket() {
      this[_state$1] = io._HttpConnection._DETACHED;
      this[_httpServer][_connectionClosed](this);
      let detachedIncoming = this[_httpParser].detachIncoming();
      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
        io._HttpConnection._connections[dartx.remove](this[_serviceId]);
        return new io._DetachedSocket(this[_socket], detachedIncoming);
      }, dynamicTo_DetachedSocket()));
    }
    get connectionInfo() {
      return io._HttpConnectionInfo.create(io.Socket._check(this[_socket]));
    }
    get [_isActive]() {
      return this[_state$1] == io._HttpConnection._ACTIVE;
    }
    get [_isIdle]() {
      return this[_state$1] == io._HttpConnection._IDLE;
    }
    get [_isClosing]() {
      return this[_state$1] == io._HttpConnection._CLOSING;
    }
    get [_isDetached]() {
      return this[_state$1] == io._HttpConnection._DETACHED;
    }
    get [_serviceTypePath]() {
      return 'io/http/serverconnections';
    }
    get [_serviceTypeName]() {
      return 'HttpServerConnection';
    }
    [_toJSON$](ref) {
      let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')} <-> ` + dart.str`${dart.dload(dart.dload(this[_socket], 'remoteAddress'), 'host')}:${dart.dload(this[_socket], 'remotePort')}`;
      let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
      if (dart.test(ref)) {
        return r;
      }
      r[dartx._set]('server', this[_httpServer][_toJSON$](true));
      try {
        r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
      } catch (_) {
        r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
      }

      switch (this[_state$1]) {
        case io._HttpConnection._ACTIVE:
        {
          r[dartx._set]('state', "Active");
          break;
        }
        case io._HttpConnection._IDLE:
        {
          r[dartx._set]('state', "Idle");
          break;
        }
        case io._HttpConnection._CLOSING:
        {
          r[dartx._set]('state', "Closing");
          break;
        }
        case io._HttpConnection._DETACHED:
        {
          r[dartx._set]('state', "Detached");
          break;
        }
        default:
        {
          r[dartx._set]('state', 'Unknown');
          break;
        }
      }
      return r;
    }
  };
  dart.setBaseClass(io._HttpConnection, collection.LinkedListEntry$(io._HttpConnection));
  dart.addSimpleTypeTests(io._HttpConnection);
  dart.setSignature(io._HttpConnection, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpConnection, [dart.dynamic, io._HttpServer])}),
    fields: () => ({
      [_socket]: dart.dynamic,
      [_httpServer]: io._HttpServer,
      [_httpParser]: io._HttpParser,
      [_state$1]: core.int,
      [_subscription$]: async.StreamSubscription,
      [_idleMark]: core.bool,
      [_streamFuture]: async.Future
    }),
    getters: () => ({
      isMarkedIdle: dart.definiteFunctionType(core.bool, []),
      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
      [_isActive]: dart.definiteFunctionType(core.bool, []),
      [_isIdle]: dart.definiteFunctionType(core.bool, []),
      [_isClosing]: dart.definiteFunctionType(core.bool, []),
      [_isDetached]: dart.definiteFunctionType(core.bool, []),
      [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
      [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
    }),
    methods: () => ({
      markIdle: dart.definiteFunctionType(dart.void, []),
      destroy: dart.definiteFunctionType(dart.void, []),
      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
      [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
    }),
    sfields: () => ({
      _ACTIVE: core.int,
      _IDLE: core.int,
      _CLOSING: core.int,
      _DETACHED: core.int,
      _connections: MapOfint$_HttpConnection()
    })
  });
  io._HttpConnection._ACTIVE = 0;
  io._HttpConnection._IDLE = 1;
  io._HttpConnection._CLOSING = 2;
  io._HttpConnection._DETACHED = 3;
  dart.defineLazy(io._HttpConnection, {
    get _connections() {
      return HashMapOfint$_HttpConnection().new();
    },
    set _connections(_) {}
  });
  const _activeConnections = Symbol('_activeConnections');
  const _idleConnections = Symbol('_idleConnections');
  const _serverSocket = Symbol('_serverSocket');
  const _closeServer = Symbol('_closeServer');
  let const$71;
  let const$72;
  io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
    static bind(address, port, backlog, v6Only, shared) {
      return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
    }
    static bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared) {
      return io.SecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), SecureServerSocketTo_HttpServer()));
    }
    _(serverSocket, closeServer) {
      this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
      this[_activeConnections] = new (LinkedListOf_HttpConnection())();
      this[_idleConnections] = new (LinkedListOf_HttpConnection())();
      this[_serverSocket] = serverSocket;
      this[_closeServer] = closeServer;
      this.serverHeader = null;
      this.autoCompress = false;
      this[_idleTimeout] = null;
      this[_idleTimer] = null;
      this[_sessionManagerInstance] = null;
      this.closed = false;
      this[_controller$0] = null;
      super.new();
      this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
      this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
      io._HttpServer._servers[dartx._set](this[_serviceId], this);
      dart.dput(this[_serverSocket], _owner, this);
    }
    listenOn(serverSocket) {
      this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
      this[_activeConnections] = new (LinkedListOf_HttpConnection())();
      this[_idleConnections] = new (LinkedListOf_HttpConnection())();
      this[_serverSocket] = serverSocket;
      this[_closeServer] = false;
      this.serverHeader = null;
      this.autoCompress = false;
      this[_idleTimeout] = null;
      this[_idleTimer] = null;
      this[_sessionManagerInstance] = null;
      this.closed = false;
      this[_controller$0] = null;
      super.new();
      this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
      this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
      io._HttpServer._servers[dartx._set](this[_serviceId], this);
      try {
        dart.dput(this[_serverSocket], _owner, this);
      } catch (_) {
      }

    }
    static _initDefaultResponseHeaders() {
      let defaultResponseHeaders = new io._HttpHeaders('1.1');
      defaultResponseHeaders.contentType = io.ContentType.TEXT;
      defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
      defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
      defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
      return defaultResponseHeaders;
    }
    get idleTimeout() {
      return this[_idleTimeout];
    }
    set idleTimeout(duration) {
      if (this[_idleTimer] != null) {
        this[_idleTimer].cancel();
        this[_idleTimer] = null;
      }
      this[_idleTimeout] = duration;
      if (this[_idleTimeout] != null) {
        this[_idleTimer] = async.Timer.periodic(this[_idleTimeout], dart.fn(_ => {
          for (let idle of this[_idleConnections].toList()) {
            if (dart.test(idle.isMarkedIdle)) {
              idle.destroy();
            } else {
              idle.markIdle();
            }
          }
        }, TimerTovoid$()));
      }
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      dart.dsend(this[_serverSocket], 'listen', dart.fn(socket => {
        socket.setOption(io.SocketOption.TCP_NODELAY, true);
        let connection = new io._HttpConnection(socket, this);
        this[_idleConnections].add(connection);
      }, SocketTodynamic()), {onError: dart.fn((error, stackTrace) => {
          if (!io.HandshakeException.is(error)) {
            this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
          }
        }, dynamicAnddynamicTodynamic$()), onDone: dart.bind(this[_controller$0], 'close')});
      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    close(opts) {
      let force = opts && 'force' in opts ? opts.force : false;
      this.closed = true;
      let result = null;
      if (this[_serverSocket] != null && dart.test(this[_closeServer])) {
        result = async.Future._check(dart.dsend(this[_serverSocket], 'close'));
      } else {
        result = async.Future.value();
      }
      this.idleTimeout = null;
      if (dart.test(force)) {
        for (let c of this[_activeConnections].toList()) {
          c.destroy();
        }
        dart.assert(this[_activeConnections].isEmpty);
      }
      for (let c of this[_idleConnections].toList()) {
        c.destroy();
      }
      this[_maybePerformCleanup]();
      return result;
    }
    [_maybePerformCleanup]() {
      if (dart.test(this.closed) && dart.test(this[_idleConnections].isEmpty) && dart.test(this[_activeConnections].isEmpty) && this[_sessionManagerInstance] != null) {
        this[_sessionManagerInstance].close();
        this[_sessionManagerInstance] = null;
        io._HttpServer._servers[dartx.remove](this[_serviceId]);
      }
    }
    get port() {
      if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
      return core.int._check(dart.dload(this[_serverSocket], 'port'));
    }
    get address() {
      if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
      return io.InternetAddress._check(dart.dload(this[_serverSocket], 'address'));
    }
    set sessionTimeout(timeout) {
      this[_sessionManager].sessionTimeout = timeout;
    }
    [_handleRequest](request) {
      if (!dart.test(this.closed)) {
        this[_controller$0].add(request);
      } else {
        request[_httpConnection].destroy();
      }
    }
    [_connectionClosed](connection) {
      connection.unlink();
      this[_maybePerformCleanup]();
    }
    [_markIdle](connection) {
      this[_activeConnections].remove(connection);
      this[_idleConnections].add(connection);
    }
    [_markActive](connection) {
      this[_idleConnections].remove(connection);
      this[_activeConnections].add(connection);
    }
    get [_sessionManager]() {
      if (this[_sessionManagerInstance] == null) {
        this[_sessionManagerInstance] = new io._HttpSessionManager();
      }
      return this[_sessionManagerInstance];
    }
    connectionsInfo() {
      let result = new io.HttpConnectionsInfo();
      result.total = dart.notNull(this[_activeConnections].length) + dart.notNull(this[_idleConnections].length);
      this[_activeConnections].forEach(dart.fn(conn => {
        if (dart.test(conn[_isActive])) {
          result.active = dart.notNull(result.active) + 1;
        } else {
          dart.assert(conn[_isClosing]);
          result.closing = dart.notNull(result.closing) + 1;
        }
      }, _HttpConnectionTovoid()));
      this[_idleConnections].forEach(dart.fn(conn => {
        result.idle = dart.notNull(result.idle) + 1;
        dart.assert(conn[_isIdle]);
      }, _HttpConnectionTovoid()));
      return result;
    }
    get [_serviceTypePath]() {
      return 'io/http/servers';
    }
    get [_serviceTypeName]() {
      return 'HttpServer';
    }
    [_toJSON$](ref) {
      let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: dart.str`${this.address.host}:${this.port}`, user_name: dart.str`${this.address.host}:${this.port}`}, core.String, dart.dynamic);
      if (dart.test(ref)) {
        return r;
      }
      try {
        r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON$, true));
      } catch (_) {
        r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
      }

      r[dartx._set]('port', this.port);
      r[dartx._set]('address', this.address.host);
      r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
      r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
      r[dartx._set]('closed', this.closed);
      return r;
    }
  };
  dart.addSimpleTypeTests(io._HttpServer);
  dart.defineNamedConstructor(io._HttpServer, '_');
  dart.defineNamedConstructor(io._HttpServer, 'listenOn');
  io._HttpServer[dart.implements] = () => [io.HttpServer];
  dart.setSignature(io._HttpServer, {
    constructors: () => ({
      _: dart.definiteFunctionType(io._HttpServer, [dart.dynamic, core.bool]),
      listenOn: dart.definiteFunctionType(io._HttpServer, [dart.dynamic])
    }),
    fields: () => ({
      serverHeader: core.String,
      defaultResponseHeaders: io.HttpHeaders,
      autoCompress: core.bool,
      [_idleTimeout]: core.Duration,
      [_idleTimer]: async.Timer,
      [_sessionManagerInstance]: io._HttpSessionManager,
      closed: core.bool,
      [_serverSocket]: dart.dynamic,
      [_closeServer]: core.bool,
      [_activeConnections]: LinkedListOf_HttpConnection(),
      [_idleConnections]: LinkedListOf_HttpConnection(),
      [_controller$0]: StreamControllerOfHttpRequest()
    }),
    getters: () => ({
      idleTimeout: dart.definiteFunctionType(core.Duration, []),
      port: dart.definiteFunctionType(core.int, []),
      address: dart.definiteFunctionType(io.InternetAddress, []),
      [_sessionManager]: dart.definiteFunctionType(io._HttpSessionManager, []),
      [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
      [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({
      idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
      sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])
    }),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(io.HttpRequest), [HttpRequestTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      close: dart.definiteFunctionType(async.Future, [], {force: core.bool}),
      [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
      [_handleRequest]: dart.definiteFunctionType(dart.void, [io._HttpRequest]),
      [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
      [_markIdle]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
      [_markActive]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
      connectionsInfo: dart.definiteFunctionType(io.HttpConnectionsInfo, []),
      [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
    }),
    sfields: () => ({_servers: MapOfint$_HttpServer()}),
    statics: () => ({
      bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, core.int, core.bool, core.bool]),
      bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext, core.int, core.bool, core.bool, core.bool]),
      _initDefaultResponseHeaders: dart.definiteFunctionType(io.HttpHeaders, [])
    }),
    names: ['bind', 'bindSecure', '_initDefaultResponseHeaders']
  });
  dart.defineLazy(io._HttpServer, {
    get _servers() {
      return MapOfint$_HttpServer().new();
    },
    set _servers(_) {}
  });
  io._Proxy = class _Proxy extends core.Object {
    new(host, port, username, password) {
      this.host = host;
      this.port = port;
      this.username = username;
      this.password = password;
      this.isDirect = false;
    }
    direct() {
      this.host = null;
      this.port = null;
      this.username = null;
      this.password = null;
      this.isDirect = true;
    }
    get isAuthenticated() {
      return this.username != null;
    }
  };
  dart.defineNamedConstructor(io._Proxy, 'direct');
  dart.setSignature(io._Proxy, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._Proxy, [core.String, core.int, core.String, core.String]),
      direct: dart.definiteFunctionType(io._Proxy, [])
    }),
    fields: () => ({
      host: core.String,
      port: core.int,
      username: core.String,
      password: core.String,
      isDirect: core.bool
    }),
    getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
  });
  let const$73;
  let const$74;
  io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
    new(configuration) {
      this.proxies = ListOf_Proxy().new();
      if (configuration == null) {
        dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
      }
      let list = configuration[dartx.split](";");
      list[dartx.forEach](dart.fn(proxy => {
        proxy = proxy[dartx.trim]();
        if (!dart.test(proxy[dartx.isEmpty])) {
          if (dart.test(proxy[dartx.startsWith](io._ProxyConfiguration.PROXY_PREFIX))) {
            let username = null;
            let password = null;
            proxy = proxy[dartx.substring](io._ProxyConfiguration.PROXY_PREFIX[dartx.length])[dartx.trim]();
            let at = proxy[dartx.indexOf]("@");
            if (at != -1) {
              let userinfo = proxy[dartx.substring](0, at)[dartx.trim]();
              proxy = proxy[dartx.substring](dart.notNull(at) + 1)[dartx.trim]();
              let colon = userinfo[dartx.indexOf](":");
              if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
                dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
              }
              username = userinfo[dartx.substring](0, colon)[dartx.trim]();
              password = userinfo[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
            }
            let colon = proxy[dartx.lastIndexOf](":");
            if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
            }
            let host = proxy[dartx.substring](0, colon)[dartx.trim]();
            if (dart.test(host[dartx.startsWith]("[")) && dart.test(host[dartx.endsWith]("]"))) {
              host = host[dartx.substring](1, dart.notNull(host[dartx.length]) - 1);
            }
            let portString = proxy[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
            let port = null;
            try {
              port = core.int.parse(portString);
            } catch (e) {
              if (core.FormatException.is(e)) {
                dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}, ` + dart.str`invalid port '${portString}'`));
              } else
                throw e;
            }

            this.proxies[dartx.add](new io._Proxy(host, port, username, password));
          } else if (proxy[dartx.trim]() == io._ProxyConfiguration.DIRECT_PREFIX) {
            this.proxies[dartx.add](new io._Proxy.direct());
          } else {
            dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
          }
        }
      }, StringTovoid$()));
    }
    direct() {
      this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
    }
  };
  dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
  dart.setSignature(io._ProxyConfiguration, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._ProxyConfiguration, [core.String]),
      direct: dart.definiteFunctionType(io._ProxyConfiguration, [])
    }),
    fields: () => ({proxies: ListOf_Proxy()}),
    sfields: () => ({
      PROXY_PREFIX: core.String,
      DIRECT_PREFIX: core.String
    })
  });
  io._ProxyConfiguration.PROXY_PREFIX = "PROXY ";
  io._ProxyConfiguration.DIRECT_PREFIX = "DIRECT";
  io._HttpConnectionInfo = class _HttpConnectionInfo extends core.Object {
    new() {
      this.remoteAddress = null;
      this.remotePort = null;
      this.localPort = null;
    }
    static create(socket) {
      if (socket == null) return null;
      try {
        let info = new io._HttpConnectionInfo();
        info.remoteAddress = socket.remoteAddress;
        info.remotePort = socket.remotePort;
        info.localPort = socket.port;
        return info;
      } catch (e) {
      }

      return null;
    }
  };
  io._HttpConnectionInfo[dart.implements] = () => [io.HttpConnectionInfo];
  dart.setSignature(io._HttpConnectionInfo, {
    fields: () => ({
      remoteAddress: io.InternetAddress,
      remotePort: core.int,
      localPort: core.int
    }),
    statics: () => ({create: dart.definiteFunctionType(io._HttpConnectionInfo, [io.Socket])}),
    names: ['create']
  });
  io._DetachedSocket = class _DetachedSocket extends async.Stream$(core.List$(core.int)) {
    new(socket, incoming) {
      this[_socket] = socket;
      this[_incoming] = incoming;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    get encoding() {
      return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
    }
    set encoding(value) {
      dart.dput(this[_socket], 'encoding', value);
    }
    write(obj) {
      dart.dsend(this[_socket], 'write', obj);
    }
    writeln(obj) {
      if (obj === void 0) obj = "";
      dart.dsend(this[_socket], 'writeln', obj);
    }
    writeCharCode(charCode) {
      dart.dsend(this[_socket], 'writeCharCode', charCode);
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      dart.dsend(this[_socket], 'writeAll', objects, separator);
    }
    add(bytes) {
      dart.dsend(this[_socket], 'add', bytes);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      return dart.dsend(this[_socket], 'addError', error, stackTrace);
    }
    addStream(stream) {
      return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
    }
    destroy() {
      dart.dsend(this[_socket], 'destroy');
    }
    flush() {
      return async.Future._check(dart.dsend(this[_socket], 'flush'));
    }
    close() {
      return async.Future._check(dart.dsend(this[_socket], 'close'));
    }
    get done() {
      return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
    }
    get port() {
      return core.int._check(dart.dload(this[_socket], 'port'));
    }
    get address() {
      return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
    }
    get remoteAddress() {
      return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
    }
    get remotePort() {
      return core.int._check(dart.dload(this[_socket], 'remotePort'));
    }
    setOption(option, enabled) {
      return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
    }
    [_toJSON$](ref) {
      return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
    }
    set [_owner](owner) {
      dart.dput(this[_socket], _owner, owner);
    }
  };
  dart.addSimpleTypeTests(io._DetachedSocket);
  io._DetachedSocket[dart.implements] = () => [io.Socket];
  dart.setSignature(io._DetachedSocket, {
    constructors: () => ({new: dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic, StreamOfListOfint()])}),
    fields: () => ({
      [_incoming]: StreamOfListOfint(),
      [_socket]: dart.dynamic
    }),
    getters: () => ({
      encoding: dart.definiteFunctionType(convert.Encoding, []),
      done: dart.definiteFunctionType(async.Future$(io.Socket), []),
      port: dart.definiteFunctionType(core.int, []),
      address: dart.definiteFunctionType(io.InternetAddress, []),
      remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
      remotePort: dart.definiteFunctionType(core.int, [])
    }),
    setters: () => ({
      encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
      [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
      destroy: dart.definiteFunctionType(dart.void, []),
      flush: dart.definiteFunctionType(async.Future, []),
      close: dart.definiteFunctionType(async.Future, []),
      setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
      [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
    })
  });
  const _scheme = Symbol('_scheme');
  io._AuthenticationScheme = class _AuthenticationScheme extends core.Object {
    new(scheme) {
      this[_scheme] = scheme;
    }
    static fromString(scheme) {
      if (scheme[dartx.toLowerCase]() == "basic") return io._AuthenticationScheme.BASIC;
      if (scheme[dartx.toLowerCase]() == "digest") return io._AuthenticationScheme.DIGEST;
      return io._AuthenticationScheme.UNKNOWN;
    }
    toString() {
      if (dart.equals(this, io._AuthenticationScheme.BASIC)) return "Basic";
      if (dart.equals(this, io._AuthenticationScheme.DIGEST)) return "Digest";
      return "Unknown";
    }
  };
  dart.setSignature(io._AuthenticationScheme, {
    constructors: () => ({
      new: dart.definiteFunctionType(io._AuthenticationScheme, [core.int]),
      fromString: dart.definiteFunctionType(io._AuthenticationScheme, [core.String])
    }),
    fields: () => ({[_scheme]: core.int}),
    sfields: () => ({
      UNKNOWN: io._AuthenticationScheme,
      BASIC: io._AuthenticationScheme,
      DIGEST: io._AuthenticationScheme
    })
  });
  dart.defineLazy(io._AuthenticationScheme, {
    get UNKNOWN() {
      return dart.const(new io._AuthenticationScheme(-1));
    },
    get BASIC() {
      return dart.const(new io._AuthenticationScheme(0));
    },
    get DIGEST() {
      return dart.const(new io._AuthenticationScheme(1));
    }
  });
  io._Credentials = class _Credentials extends core.Object {
    new(credentials, realm) {
      this.credentials = credentials;
      this.realm = realm;
      this.used = false;
      this.ha1 = null;
      this.nonce = null;
      this.algorithm = null;
      this.qop = null;
      this.nonceCount = null;
      if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST)) {
        let creds = io._HttpClientDigestCredentials._check(this.credentials);
        let hasher = new io._MD5();
        hasher.add(convert.UTF8.encode(creds.username));
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(this.realm[dartx.codeUnits]);
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(convert.UTF8.encode(creds.password));
        this.ha1 = io._CryptoUtils.bytesToHex(hasher.close());
      }
    }
    get scheme() {
      return this.credentials.scheme;
    }
  };
  dart.setSignature(io._Credentials, {
    constructors: () => ({new: dart.definiteFunctionType(io._Credentials, [io._HttpClientCredentials, core.String])}),
    fields: () => ({
      credentials: io._HttpClientCredentials,
      realm: core.String,
      used: core.bool,
      ha1: core.String,
      nonce: core.String,
      algorithm: core.String,
      qop: core.String,
      nonceCount: core.int
    }),
    getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])})
  });
  io._SiteCredentials = class _SiteCredentials extends io._Credentials {
    new(uri, realm, creds) {
      this.uri = uri;
      super.new(creds, core.String._check(realm));
    }
    applies(uri, scheme) {
      if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
      if (uri.host != this.uri.host) return false;
      let thisPort = this.uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
      let otherPort = uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : uri.port;
      if (otherPort != thisPort) return false;
      return uri.path[dartx.startsWith](this.uri.path);
    }
    authorize(request) {
      if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
        return;
      }
      this.credentials.authorize(this, request);
      this.used = true;
    }
  };
  dart.setSignature(io._SiteCredentials, {
    constructors: () => ({new: dart.definiteFunctionType(io._SiteCredentials, [core.Uri, dart.dynamic, io._HttpClientCredentials])}),
    fields: () => ({uri: core.Uri}),
    methods: () => ({
      applies: dart.definiteFunctionType(core.bool, [core.Uri, io._AuthenticationScheme]),
      authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
    })
  });
  io._ProxyCredentials = class _ProxyCredentials extends io._Credentials {
    new(host, port, realm, creds) {
      this.host = host;
      this.port = port;
      super.new(creds, core.String._check(realm));
    }
    applies(proxy, scheme) {
      if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
      return proxy.host == this.host && proxy.port == this.port;
    }
    authorize(request) {
      if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
        return;
      }
      this.credentials.authorizeProxy(this, request);
    }
  };
  dart.setSignature(io._ProxyCredentials, {
    constructors: () => ({new: dart.definiteFunctionType(io._ProxyCredentials, [core.String, core.int, dart.dynamic, io._HttpClientCredentials])}),
    fields: () => ({
      host: core.String,
      port: core.int
    }),
    methods: () => ({
      applies: dart.definiteFunctionType(core.bool, [io._Proxy, io._AuthenticationScheme]),
      authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
    })
  });
  io._HttpClientCredentials = class _HttpClientCredentials extends core.Object {};
  io._HttpClientCredentials[dart.implements] = () => [io.HttpClientCredentials];
  io._HttpClientBasicCredentials = class _HttpClientBasicCredentials extends io._HttpClientCredentials {
    new(username, password) {
      this.username = username;
      this.password = password;
    }
    get scheme() {
      return io._AuthenticationScheme.BASIC;
    }
    authorization() {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${this.username}:${this.password}`));
      return dart.str`Basic ${auth}`;
    }
    authorize(_, request) {
      request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization());
    }
    authorizeProxy(_, request) {
      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization());
    }
  };
  io._HttpClientBasicCredentials[dart.implements] = () => [io.HttpClientBasicCredentials];
  dart.setSignature(io._HttpClientBasicCredentials, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientBasicCredentials, [core.String, core.String])}),
    fields: () => ({
      username: core.String,
      password: core.String
    }),
    getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
    methods: () => ({
      authorization: dart.definiteFunctionType(core.String, []),
      authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
      authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
    })
  });
  io._HttpClientDigestCredentials = class _HttpClientDigestCredentials extends io._HttpClientCredentials {
    new(username, password) {
      this.username = username;
      this.password = password;
    }
    get scheme() {
      return io._AuthenticationScheme.DIGEST;
    }
    authorization(credentials, request) {
      let requestUri = request[_requestUri]();
      let hasher = new io._MD5();
      hasher.add(request.method[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(requestUri[dartx.codeUnits]);
      let ha2 = io._CryptoUtils.bytesToHex(hasher.close());
      let qop = null;
      let cnonce = null;
      let nc = null;
      let x = null;
      hasher = new io._MD5();
      hasher.add(credentials.ha1[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      if (credentials.qop == "auth") {
        qop = credentials.qop;
        cnonce = io._CryptoUtils.bytesToHex(io._IOCrypto.getRandomBytes(4));
        credentials.nonceCount = dart.notNull(credentials.nonceCount) + 1;
        nc = credentials.nonceCount[dartx.toRadixString](16);
        nc = dart.notNull("00000000"[dartx.substring](0, 8 - dart.notNull(nc[dartx.length]) + 1)) + dart.notNull(nc);
        hasher.add(credentials.nonce[dartx.codeUnits]);
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(nc[dartx.codeUnits]);
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(cnonce[dartx.codeUnits]);
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(credentials.qop[dartx.codeUnits]);
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(ha2[dartx.codeUnits]);
      } else {
        hasher.add(credentials.nonce[dartx.codeUnits]);
        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
        hasher.add(ha2[dartx.codeUnits]);
      }
      let response = io._CryptoUtils.bytesToHex(hasher.close());
      let buffer = new core.StringBuffer();
      buffer.write('Digest ');
      buffer.write(dart.str`username="${this.username}"`);
      buffer.write(dart.str`, realm="${credentials.realm}"`);
      buffer.write(dart.str`, nonce="${credentials.nonce}"`);
      buffer.write(dart.str`, uri="${requestUri}"`);
      buffer.write(dart.str`, algorithm="${credentials.algorithm}"`);
      if (qop == "auth") {
        buffer.write(dart.str`, qop="${qop}"`);
        buffer.write(dart.str`, cnonce="${cnonce}"`);
        buffer.write(dart.str`, nc="${nc}"`);
      }
      buffer.write(dart.str`, response="${response}"`);
      return buffer.toString();
    }
    authorize(credentials, request) {
      request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
    }
    authorizeProxy(credentials, request) {
      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
    }
  };
  io._HttpClientDigestCredentials[dart.implements] = () => [io.HttpClientDigestCredentials];
  dart.setSignature(io._HttpClientDigestCredentials, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientDigestCredentials, [core.String, core.String])}),
    fields: () => ({
      username: core.String,
      password: core.String
    }),
    getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
    methods: () => ({
      authorization: dart.definiteFunctionType(core.String, [io._Credentials, io._HttpClientRequest]),
      authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
      authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
    })
  });
  io._RedirectInfo = class _RedirectInfo extends core.Object {
    new(statusCode, method, location) {
      this.statusCode = statusCode;
      this.method = method;
      this.location = location;
    }
  };
  io._RedirectInfo[dart.implements] = () => [io.RedirectInfo];
  dart.setSignature(io._RedirectInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._RedirectInfo, [core.int, core.String, core.Uri])}),
    fields: () => ({
      statusCode: core.int,
      method: core.String,
      location: core.Uri
    })
  });
  io._getHttpVersion = function() {
    let version = io.Platform.version;
    let index = version[dartx.indexOf]('.', dart.notNull(version[dartx.indexOf]('.')) + 1);
    version = version[dartx.substring](0, index);
    return dart.str`Dart/${version} (dart:io)`;
  };
  dart.fn(io._getHttpVersion, VoidToString$());
  io._Const = class _Const extends core.Object {};
  dart.setSignature(io._Const, {
    sfields: () => ({
      HTTP: ListOfint(),
      HTTP1DOT: ListOfint(),
      HTTP10: ListOfint(),
      HTTP11: ListOfint(),
      T: core.bool,
      F: core.bool,
      SEPARATOR_MAP: ListOfbool()
    })
  });
  io._Const.HTTP = dart.constList([72, 84, 84, 80], core.int);
  io._Const.HTTP1DOT = dart.constList([72, 84, 84, 80, 47, 49, 46], core.int);
  io._Const.HTTP10 = dart.constList([72, 84, 84, 80, 47, 49, 46, 48], core.int);
  io._Const.HTTP11 = dart.constList([72, 84, 84, 80, 47, 49, 46, 49], core.int);
  io._Const.T = true;
  io._Const.F = false;
  dart.defineLazy(io._Const, {
    get SEPARATOR_MAP() {
      return dart.constList([io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F], core.bool);
    }
  });
  io._CharCode = class _CharCode extends core.Object {};
  dart.setSignature(io._CharCode, {
    sfields: () => ({
      HT: core.int,
      LF: core.int,
      CR: core.int,
      SP: core.int,
      AMPERSAND: core.int,
      COMMA: core.int,
      DASH: core.int,
      SLASH: core.int,
      ZERO: core.int,
      ONE: core.int,
      COLON: core.int,
      SEMI_COLON: core.int,
      EQUAL: core.int
    })
  });
  io._CharCode.HT = 9;
  io._CharCode.LF = 10;
  io._CharCode.CR = 13;
  io._CharCode.SP = 32;
  io._CharCode.AMPERSAND = 38;
  io._CharCode.COMMA = 44;
  io._CharCode.DASH = 45;
  io._CharCode.SLASH = 47;
  io._CharCode.ZERO = 48;
  io._CharCode.ONE = 49;
  io._CharCode.COLON = 58;
  io._CharCode.SEMI_COLON = 59;
  io._CharCode.EQUAL = 61;
  io._State = class _State extends core.Object {};
  dart.setSignature(io._State, {
    sfields: () => ({
      START: core.int,
      METHOD_OR_RESPONSE_HTTP_VERSION: core.int,
      RESPONSE_HTTP_VERSION: core.int,
      REQUEST_LINE_METHOD: core.int,
      REQUEST_LINE_URI: core.int,
      REQUEST_LINE_HTTP_VERSION: core.int,
      REQUEST_LINE_ENDING: core.int,
      RESPONSE_LINE_STATUS_CODE: core.int,
      RESPONSE_LINE_REASON_PHRASE: core.int,
      RESPONSE_LINE_ENDING: core.int,
      HEADER_START: core.int,
      HEADER_FIELD: core.int,
      HEADER_VALUE_START: core.int,
      HEADER_VALUE: core.int,
      HEADER_VALUE_FOLDING_OR_ENDING: core.int,
      HEADER_VALUE_FOLD_OR_END: core.int,
      HEADER_ENDING: core.int,
      CHUNK_SIZE_STARTING_CR: core.int,
      CHUNK_SIZE_STARTING_LF: core.int,
      CHUNK_SIZE: core.int,
      CHUNK_SIZE_EXTENSION: core.int,
      CHUNK_SIZE_ENDING: core.int,
      CHUNKED_BODY_DONE_CR: core.int,
      CHUNKED_BODY_DONE_LF: core.int,
      BODY: core.int,
      CLOSED: core.int,
      UPGRADED: core.int,
      FAILURE: core.int,
      FIRST_BODY_STATE: core.int
    })
  });
  io._State.START = 0;
  io._State.METHOD_OR_RESPONSE_HTTP_VERSION = 1;
  io._State.RESPONSE_HTTP_VERSION = 2;
  io._State.REQUEST_LINE_METHOD = 3;
  io._State.REQUEST_LINE_URI = 4;
  io._State.REQUEST_LINE_HTTP_VERSION = 5;
  io._State.REQUEST_LINE_ENDING = 6;
  io._State.RESPONSE_LINE_STATUS_CODE = 7;
  io._State.RESPONSE_LINE_REASON_PHRASE = 8;
  io._State.RESPONSE_LINE_ENDING = 9;
  io._State.HEADER_START = 10;
  io._State.HEADER_FIELD = 11;
  io._State.HEADER_VALUE_START = 12;
  io._State.HEADER_VALUE = 13;
  io._State.HEADER_VALUE_FOLDING_OR_ENDING = 14;
  io._State.HEADER_VALUE_FOLD_OR_END = 15;
  io._State.HEADER_ENDING = 16;
  io._State.CHUNK_SIZE_STARTING_CR = 17;
  io._State.CHUNK_SIZE_STARTING_LF = 18;
  io._State.CHUNK_SIZE = 19;
  io._State.CHUNK_SIZE_EXTENSION = 20;
  io._State.CHUNK_SIZE_ENDING = 21;
  io._State.CHUNKED_BODY_DONE_CR = 22;
  io._State.CHUNKED_BODY_DONE_LF = 23;
  io._State.BODY = 24;
  io._State.CLOSED = 25;
  io._State.UPGRADED = 26;
  io._State.FAILURE = 27;
  dart.defineLazy(io._State, {
    get FIRST_BODY_STATE() {
      return io._State.CHUNK_SIZE_STARTING_CR;
    }
  });
  io._HttpVersion = class _HttpVersion extends core.Object {};
  dart.setSignature(io._HttpVersion, {
    sfields: () => ({
      UNDETERMINED: core.int,
      HTTP10: core.int,
      HTTP11: core.int
    })
  });
  io._HttpVersion.UNDETERMINED = 0;
  io._HttpVersion.HTTP10 = 1;
  io._HttpVersion.HTTP11 = 2;
  io._MessageType = class _MessageType extends core.Object {};
  dart.setSignature(io._MessageType, {
    sfields: () => ({
      UNDETERMINED: core.int,
      REQUEST: core.int,
      RESPONSE: core.int
    })
  });
  io._MessageType.UNDETERMINED = 0;
  io._MessageType.REQUEST = 1;
  io._MessageType.RESPONSE = 0;
  const _injectData = Symbol('_injectData');
  const _userOnData = Symbol('_userOnData');
  const _isCanceled$ = Symbol('_isCanceled');
  const _pauseCount$ = Symbol('_pauseCount');
  const _scheduled = Symbol('_scheduled');
  const _maybeScheduleData = Symbol('_maybeScheduleData');
  io._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
    new(subscription, injectData, userOnData) {
      this[_subscription$] = subscription;
      this[_injectData] = injectData;
      this[_userOnData] = userOnData;
      this[_isCanceled$] = false;
      this[_pauseCount$] = 1;
      this[_scheduled] = false;
    }
    get isPaused() {
      return this[_subscription$].isPaused;
    }
    asFuture(T) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        return this[_subscription$].asFuture(T)(futureValue);
      };
    }
    cancel() {
      this[_isCanceled$] = true;
      this[_injectData] = null;
      return this[_subscription$].cancel();
    }
    onData(handleData) {
      this[_userOnData] = handleData;
      this[_subscription$].onData(handleData);
    }
    onDone(handleDone) {
      this[_subscription$].onDone(handleDone);
    }
    onError(handleError) {
      this[_subscription$].onError(handleError);
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      if (this[_injectData] == null) {
        this[_subscription$].pause(resumeSignal);
      } else {
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
        if (resumeSignal != null) {
          resumeSignal.whenComplete(dart.bind(this, 'resume'));
        }
      }
    }
    resume() {
      if (this[_injectData] == null) {
        this[_subscription$].resume();
      } else {
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
        this[_maybeScheduleData]();
      }
    }
    [_maybeScheduleData]() {
      if (dart.test(this[_scheduled])) return;
      if (this[_pauseCount$] != 0) return;
      this[_scheduled] = true;
      async.scheduleMicrotask(dart.fn(() => {
        this[_scheduled] = false;
        if (dart.notNull(this[_pauseCount$]) > 0 || dart.test(this[_isCanceled$])) return;
        let data = this[_injectData];
        this[_injectData] = null;
        this[_subscription$].resume();
        if (this[_userOnData] != null) {
          dart.dcall(this[_userOnData], data);
        }
      }, VoidTovoid$()));
    }
  };
  io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
  dart.setSignature(io._HttpDetachedStreamSubscription, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedStreamSubscription, [StreamSubscriptionOfListOfint(), ListOfint(), core.Function])}),
    fields: () => ({
      [_subscription$]: StreamSubscriptionOfListOfint(),
      [_injectData]: ListOfint(),
      [_isCanceled$]: core.bool,
      [_pauseCount$]: core.int,
      [_userOnData]: core.Function,
      [_scheduled]: core.bool
    }),
    getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      asFuture: dart.definiteFunctionType(T => [async.Future$(T), [], [T]]),
      cancel: dart.definiteFunctionType(async.Future, []),
      onData: dart.definiteFunctionType(dart.void, [ListOfintTovoid()]),
      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      onError: dart.definiteFunctionType(dart.void, [core.Function]),
      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
      resume: dart.definiteFunctionType(dart.void, []),
      [_maybeScheduleData]: dart.definiteFunctionType(dart.void, [])
    })
  });
  io._HttpDetachedIncoming = class _HttpDetachedIncoming extends async.Stream$(core.List$(core.int)) {
    new(subscription, bufferedData) {
      this.subscription = subscription;
      this.bufferedData = bufferedData;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      if (this.subscription != null) {
        this.subscription.onData(onData);
        this.subscription.onError(onError);
        this.subscription.onDone(onDone);
        if (this.bufferedData == null) {
          return StreamSubscriptionOfListOfint()._check(((() => {
            this.subscription.resume();
            return this.subscription;
          })()));
        }
        let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
        _.resume();
        return _;
      } else {
        return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
    }
  };
  dart.addSimpleTypeTests(io._HttpDetachedIncoming);
  dart.setSignature(io._HttpDetachedIncoming, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedIncoming, [async.StreamSubscription, ListOfint()])}),
    fields: () => ({
      subscription: async.StreamSubscription,
      bufferedData: ListOfint()
    }),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  const _method$ = Symbol('_method');
  const _uri_or_reason_phrase = Symbol('_uri_or_reason_phrase');
  const _headerField = Symbol('_headerField');
  const _headerValue = Symbol('_headerValue');
  const _requestParser = Symbol('_requestParser');
  const _parserCalled = Symbol('_parserCalled');
  const _index$2 = Symbol('_index');
  const _httpVersionIndex = Symbol('_httpVersionIndex');
  const _messageType = Symbol('_messageType');
  const _statusCodeLength = Symbol('_statusCodeLength');
  const _httpVersion = Symbol('_httpVersion');
  const _connectionUpgrade = Symbol('_connectionUpgrade');
  const _chunked = Symbol('_chunked');
  const _noMessageBody = Symbol('_noMessageBody');
  const _remainingContent = Symbol('_remainingContent');
  const _socketSubscription = Symbol('_socketSubscription');
  const _paused = Symbol('_paused');
  const _bodyPaused = Symbol('_bodyPaused');
  const _bodyController = Symbol('_bodyController');
  const _pauseStateChanged = Symbol('_pauseStateChanged');
  const _reset = Symbol('_reset');
  const _onData$ = Symbol('_onData');
  const _onDone$ = Symbol('_onDone');
  const _doParse = Symbol('_doParse');
  const _reportError = Symbol('_reportError');
  const _createIncoming = Symbol('_createIncoming');
  const _closeIncoming = Symbol('_closeIncoming');
  const _headersEnd = Symbol('_headersEnd');
  const _expect = Symbol('_expect');
  const _caseInsensitiveCompare = Symbol('_caseInsensitiveCompare');
  const _expectHexDigit = Symbol('_expectHexDigit');
  const _releaseBuffer = Symbol('_releaseBuffer');
  io._HttpParser = class _HttpParser extends async.Stream$(io._HttpIncoming) {
    static requestParser() {
      return new io._HttpParser._(true);
    }
    static responseParser() {
      return new io._HttpParser._(false);
    }
    _(requestParser) {
      this[_method$] = JSArrayOfint().of([]);
      this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
      this[_headerField] = JSArrayOfint().of([]);
      this[_headerValue] = JSArrayOfint().of([]);
      this[_requestParser] = requestParser;
      this[_parserCalled] = false;
      this[_buffer$] = null;
      this[_index$2] = null;
      this[_state$1] = null;
      this[_httpVersionIndex] = null;
      this[_messageType] = null;
      this[_statusCode] = 0;
      this[_statusCodeLength] = 0;
      this[_httpVersion] = null;
      this[_transferLength] = -1;
      this[_persistentConnection] = null;
      this[_connectionUpgrade] = null;
      this[_chunked] = null;
      this[_noMessageBody] = false;
      this[_remainingContent] = -1;
      this[_headers] = null;
      this[_incoming] = null;
      this[_socketSubscription] = null;
      this[_paused] = true;
      this[_bodyPaused] = false;
      this[_controller$0] = null;
      this[_bodyController] = null;
      super.new();
      this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
          this[_paused] = false;
        }, VoidTovoid$()), onPause: dart.fn(() => {
          this[_paused] = true;
          this[_pauseStateChanged]();
        }, VoidTovoid$()), onResume: dart.fn(() => {
          this[_paused] = false;
          this[_pauseStateChanged]();
        }, VoidTovoid$()), onCancel: dart.fn(() => {
          if (this[_socketSubscription] != null) {
            this[_socketSubscription].cancel();
          }
        }, VoidTodynamic$())});
      this[_reset]();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    listenToStream(stream) {
      this[_socketSubscription] = stream.listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this, _onDone$)});
    }
    [_parse]() {
      try {
        this[_doParse]();
      } catch (e) {
        let s = dart.stackTrace(e);
        this[_state$1] = io._State.FAILURE;
        this[_reportError](e, s);
      }

    }
    [_headersEnd]() {
      this[_headers][_mutable] = false;
      this[_transferLength] = this[_headers].contentLength;
      if (dart.test(this[_chunked])) this[_transferLength] = -1;
      if (this[_messageType] == io._MessageType.REQUEST && dart.notNull(this[_transferLength]) < 0 && this[_chunked] == false) {
        this[_transferLength] = 0;
      }
      if (dart.test(this[_connectionUpgrade])) {
        this[_state$1] = io._State.UPGRADED;
        this[_transferLength] = 0;
      }
      this[_createIncoming](this[_transferLength]);
      if (dart.test(this[_requestParser])) {
        this[_incoming].method = core.String.fromCharCodes(this[_method$]);
        this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
      } else {
        this[_incoming].statusCode = this[_statusCode];
        this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
      }
      this[_method$][dartx.clear]();
      this[_uri_or_reason_phrase][dartx.clear]();
      if (dart.test(this[_connectionUpgrade])) {
        this[_incoming].upgraded = true;
        this[_parserCalled] = false;
        let tmp = this[_incoming];
        this[_closeIncoming]();
        this[_controller$0].add(tmp);
        return true;
      }
      if (this[_transferLength] == 0 || this[_messageType] == io._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
        this[_reset]();
        let tmp = this[_incoming];
        this[_closeIncoming]();
        this[_controller$0].add(tmp);
        return false;
      } else if (dart.test(this[_chunked])) {
        this[_state$1] = io._State.CHUNK_SIZE;
        this[_remainingContent] = 0;
      } else if (dart.notNull(this[_transferLength]) > 0) {
        this[_remainingContent] = this[_transferLength];
        this[_state$1] = io._State.BODY;
      } else {
        this[_state$1] = io._State.BODY;
      }
      this[_parserCalled] = false;
      this[_controller$0].add(this[_incoming]);
      return true;
    }
    [_doParse]() {
      dart.assert(!dart.test(this[_parserCalled]));
      this[_parserCalled] = true;
      if (this[_state$1] == io._State.CLOSED) {
        dart.throw(new io.HttpException("Data on closed connection"));
      }
      if (this[_state$1] == io._State.FAILURE) {
        dart.throw(new io.HttpException("Data on failed connection"));
      }
      while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
        if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
          this[_parserCalled] = false;
          return;
        }
        let byte = this[_buffer$][dartx._get]((() => {
          let x = this[_index$2];
          this[_index$2] = dart.notNull(x) + 1;
          return x;
        })());
        switch (this[_state$1]) {
          case io._State.START:
          {
            if (byte == io._Const.HTTP[dartx._get](0)) {
              this[_httpVersionIndex] = 1;
              this[_state$1] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
            } else {
              if (!dart.test(io._HttpParser._isTokenChar(byte))) {
                dart.throw(new io.HttpException("Invalid request method"));
              }
              this[_method$][dartx.add](byte);
              if (!dart.test(this[_requestParser])) {
                dart.throw(new io.HttpException("Invalid response line"));
              }
              this[_state$1] = io._State.REQUEST_LINE_METHOD;
            }
            break;
          }
          case io._State.METHOD_OR_RESPONSE_HTTP_VERSION:
          {
            if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP[dartx.length]) && byte == io._Const.HTTP[dartx._get](this[_httpVersionIndex])) {
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (this[_httpVersionIndex] == io._Const.HTTP[dartx.length] && byte == io._CharCode.SLASH) {
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
              if (dart.test(this[_requestParser])) {
                dart.throw(new io.HttpException("Invalid request line"));
              }
              this[_state$1] = io._State.RESPONSE_HTTP_VERSION;
            } else {
              for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
                this[_method$][dartx.add](io._Const.HTTP[dartx._get](i));
              }
              if (byte == io._CharCode.SP) {
                this[_state$1] = io._State.REQUEST_LINE_URI;
              } else {
                this[_method$][dartx.add](byte);
                this[_httpVersion] = io._HttpVersion.UNDETERMINED;
                if (!dart.test(this[_requestParser])) {
                  dart.throw(new io.HttpException("Invalid response line"));
                }
                this[_state$1] = io._State.REQUEST_LINE_METHOD;
              }
            }
            break;
          }
          case io._State.RESPONSE_HTTP_VERSION:
          {
            if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
              this[_expect](byte, io._Const.HTTP1DOT[dartx._get](this[_httpVersionIndex]));
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ONE) {
              this[_httpVersion] = io._HttpVersion.HTTP11;
              this[_persistentConnection] = true;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ZERO) {
              this[_httpVersion] = io._HttpVersion.HTTP10;
              this[_persistentConnection] = false;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (this[_httpVersionIndex] == dart.notNull(io._Const.HTTP1DOT[dartx.length]) + 1) {
              this[_expect](byte, io._CharCode.SP);
              this[_state$1] = io._State.RESPONSE_LINE_STATUS_CODE;
            } else {
              dart.throw(new io.HttpException("Invalid response line"));
            }
            break;
          }
          case io._State.REQUEST_LINE_METHOD:
          {
            if (byte == io._CharCode.SP) {
              this[_state$1] = io._State.REQUEST_LINE_URI;
            } else {
              if (dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte)) || byte == io._CharCode.CR || byte == io._CharCode.LF) {
                dart.throw(new io.HttpException("Invalid request method"));
              }
              this[_method$][dartx.add](byte);
            }
            break;
          }
          case io._State.REQUEST_LINE_URI:
          {
            if (byte == io._CharCode.SP) {
              if (this[_uri_or_reason_phrase][dartx.length] == 0) {
                dart.throw(new io.HttpException("Invalid request URI"));
              }
              this[_state$1] = io._State.REQUEST_LINE_HTTP_VERSION;
              this[_httpVersionIndex] = 0;
            } else {
              if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
                dart.throw(new io.HttpException("Invalid request URI"));
              }
              this[_uri_or_reason_phrase][dartx.add](byte);
            }
            break;
          }
          case io._State.REQUEST_LINE_HTTP_VERSION:
          {
            if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
              this[_expect](byte, io._Const.HTTP11[dartx._get](this[_httpVersionIndex]));
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length]) {
              if (byte == io._CharCode.ONE) {
                this[_httpVersion] = io._HttpVersion.HTTP11;
                this[_persistentConnection] = true;
                this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
              } else if (byte == io._CharCode.ZERO) {
                this[_httpVersion] = io._HttpVersion.HTTP10;
                this[_persistentConnection] = false;
                this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
              } else {
                dart.throw(new io.HttpException("Invalid response line"));
              }
            } else {
              if (byte == io._CharCode.CR) {
                this[_state$1] = io._State.REQUEST_LINE_ENDING;
              } else {
                this[_expect](byte, io._CharCode.LF);
                this[_messageType] = io._MessageType.REQUEST;
                this[_state$1] = io._State.HEADER_START;
              }
            }
            break;
          }
          case io._State.REQUEST_LINE_ENDING:
          {
            this[_expect](byte, io._CharCode.LF);
            this[_messageType] = io._MessageType.REQUEST;
            this[_state$1] = io._State.HEADER_START;
            break;
          }
          case io._State.RESPONSE_LINE_STATUS_CODE:
          {
            if (byte == io._CharCode.SP) {
              this[_state$1] = io._State.RESPONSE_LINE_REASON_PHRASE;
            } else if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.RESPONSE_LINE_ENDING;
            } else {
              this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
              if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
                dart.throw(new io.HttpException("Invalid response status code"));
              } else {
                this[_statusCode] = dart.notNull(this[_statusCode]) * 10 + dart.notNull(byte) - 48;
              }
            }
            break;
          }
          case io._State.RESPONSE_LINE_REASON_PHRASE:
          {
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.RESPONSE_LINE_ENDING;
            } else {
              if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
                dart.throw(new io.HttpException("Invalid response reason phrase"));
              }
              this[_uri_or_reason_phrase][dartx.add](byte);
            }
            break;
          }
          case io._State.RESPONSE_LINE_ENDING:
          {
            this[_expect](byte, io._CharCode.LF);
            this[_messageType] == io._MessageType.RESPONSE;
            if (dart.notNull(this[_statusCode]) < 100 || dart.notNull(this[_statusCode]) > 599) {
              dart.throw(new io.HttpException("Invalid response status code"));
            } else {
              if (dart.notNull(this[_statusCode]) <= 199 || this[_statusCode] == 204 || this[_statusCode] == 304) {
                this[_noMessageBody] = true;
              }
            }
            this[_state$1] = io._State.HEADER_START;
            break;
          }
          case io._State.HEADER_START:
          {
            this[_headers] = new io._HttpHeaders(this.version);
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.HEADER_ENDING;
            } else if (byte == io._CharCode.LF) {
              this[_state$1] = io._State.HEADER_ENDING;
              this[_index$2] = dart.notNull(this[_index$2]) - 1;
            } else {
              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
              this[_state$1] = io._State.HEADER_FIELD;
            }
            break;
          }
          case io._State.HEADER_FIELD:
          {
            if (byte == io._CharCode.COLON) {
              this[_state$1] = io._State.HEADER_VALUE_START;
            } else {
              if (!dart.test(io._HttpParser._isTokenChar(byte))) {
                dart.throw(new io.HttpException("Invalid header field name"));
              }
              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
            }
            break;
          }
          case io._State.HEADER_VALUE_START:
          {
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
            } else if (byte == io._CharCode.LF) {
              this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
            } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
              this[_headerValue][dartx.add](byte);
              this[_state$1] = io._State.HEADER_VALUE;
            }
            break;
          }
          case io._State.HEADER_VALUE:
          {
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
            } else if (byte == io._CharCode.LF) {
              this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
            } else {
              this[_headerValue][dartx.add](byte);
            }
            break;
          }
          case io._State.HEADER_VALUE_FOLDING_OR_ENDING:
          {
            this[_expect](byte, io._CharCode.LF);
            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
            break;
          }
          case io._State.HEADER_VALUE_FOLD_OR_END:
          {
            if (byte == io._CharCode.SP || byte == io._CharCode.HT) {
              this[_state$1] = io._State.HEADER_VALUE_START;
            } else {
              let headerField = core.String.fromCharCodes(this[_headerField]);
              let headerValue = core.String.fromCharCodes(this[_headerValue]);
              if (headerField == "transfer-encoding" && dart.test(this[_caseInsensitiveCompare]("chunked"[dartx.codeUnits], this[_headerValue]))) {
                this[_chunked] = true;
              }
              if (headerField == "connection") {
                let tokens = io._HttpParser._tokenizeFieldValue(headerValue);
                for (let i = 0; i < dart.notNull(tokens[dartx.length]); i++) {
                  if (dart.test(this[_caseInsensitiveCompare]("upgrade"[dartx.codeUnits], tokens[dartx._get](i)[dartx.codeUnits]))) {
                    this[_connectionUpgrade] = true;
                  }
                  this[_headers][_add$2](headerField, tokens[dartx._get](i));
                }
              } else {
                this[_headers][_add$2](headerField, headerValue);
              }
              this[_headerField][dartx.clear]();
              this[_headerValue][dartx.clear]();
              if (byte == io._CharCode.CR) {
                this[_state$1] = io._State.HEADER_ENDING;
              } else if (byte == io._CharCode.LF) {
                this[_state$1] = io._State.HEADER_ENDING;
                this[_index$2] = dart.notNull(this[_index$2]) - 1;
              } else {
                this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
                this[_state$1] = io._State.HEADER_FIELD;
              }
            }
            break;
          }
          case io._State.HEADER_ENDING:
          {
            this[_expect](byte, io._CharCode.LF);
            if (dart.test(this[_headersEnd]())) {
              return;
            } else {
              break;
            }
            return;
          }
          case io._State.CHUNK_SIZE_STARTING_CR:
          {
            this[_expect](byte, io._CharCode.CR);
            this[_state$1] = io._State.CHUNK_SIZE_STARTING_LF;
            break;
          }
          case io._State.CHUNK_SIZE_STARTING_LF:
          {
            this[_expect](byte, io._CharCode.LF);
            this[_state$1] = io._State.CHUNK_SIZE;
            break;
          }
          case io._State.CHUNK_SIZE:
          {
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.CHUNK_SIZE_ENDING;
            } else if (byte == io._CharCode.SEMI_COLON) {
              this[_state$1] = io._State.CHUNK_SIZE_EXTENSION;
            } else {
              let value = this[_expectHexDigit](byte);
              this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
            }
            break;
          }
          case io._State.CHUNK_SIZE_EXTENSION:
          {
            if (byte == io._CharCode.CR) {
              this[_state$1] = io._State.CHUNK_SIZE_ENDING;
            }
            break;
          }
          case io._State.CHUNK_SIZE_ENDING:
          {
            this[_expect](byte, io._CharCode.LF);
            if (dart.notNull(this[_remainingContent]) > 0) {
              this[_state$1] = io._State.BODY;
            } else {
              this[_state$1] = io._State.CHUNKED_BODY_DONE_CR;
            }
            break;
          }
          case io._State.CHUNKED_BODY_DONE_CR:
          {
            this[_expect](byte, io._CharCode.CR);
            this[_state$1] = io._State.CHUNKED_BODY_DONE_LF;
            break;
          }
          case io._State.CHUNKED_BODY_DONE_LF:
          {
            this[_expect](byte, io._CharCode.LF);
            this[_reset]();
            this[_closeIncoming]();
            break;
          }
          case io._State.BODY:
          {
            this[_index$2] = dart.notNull(this[_index$2]) - 1;
            let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
            if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
              dataAvailable = this[_remainingContent];
            }
            let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
            this[_bodyController].add(data);
            if (this[_remainingContent] != -1) {
              this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
            }
            this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
            if (this[_remainingContent] == 0) {
              if (!dart.test(this[_chunked])) {
                this[_reset]();
                this[_closeIncoming]();
              } else {
                this[_state$1] = io._State.CHUNK_SIZE_STARTING_CR;
              }
            }
            break;
          }
          case io._State.FAILURE:
          {
            dart.assert(false);
            break;
          }
          default:
          {
            dart.assert(false);
            break;
          }
        }
      }
      this[_parserCalled] = false;
      if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
        this[_releaseBuffer]();
        if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
          this[_socketSubscription].resume();
        }
      }
    }
    [_onData$](buffer) {
      this[_socketSubscription].pause();
      dart.assert(this[_buffer$] == null);
      this[_buffer$] = typed_data.Uint8List._check(buffer);
      this[_index$2] = 0;
      this[_parse]();
    }
    [_onDone$]() {
      this[_socketSubscription] = null;
      if (this[_state$1] == io._State.CLOSED || this[_state$1] == io._State.FAILURE) return;
      if (this[_incoming] != null) {
        if (this[_state$1] != io._State.UPGRADED && !(this[_state$1] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state$1] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
          this[_bodyController].addError(new io.HttpException("Connection closed while receiving data"));
        }
        this[_closeIncoming](true);
        this[_controller$0].close();
        return;
      }
      if (this[_state$1] == io._State.START) {
        if (!dart.test(this[_requestParser])) {
          this[_reportError](new io.HttpException("Connection closed before full header was received"));
        }
        this[_controller$0].close();
        return;
      }
      if (this[_state$1] == io._State.UPGRADED) {
        this[_controller$0].close();
        return;
      }
      if (dart.notNull(this[_state$1]) < io._State.FIRST_BODY_STATE) {
        this[_state$1] = io._State.FAILURE;
        this[_reportError](new io.HttpException("Connection closed before full header was received"));
        this[_controller$0].close();
        return;
      }
      if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
        this[_state$1] = io._State.CLOSED;
      } else {
        this[_state$1] = io._State.FAILURE;
        this[_reportError](new io.HttpException("Connection closed before full body was received"));
      }
      this[_controller$0].close();
    }
    get version() {
      switch (this[_httpVersion]) {
        case io._HttpVersion.HTTP10:
        {
          return "1.0";
        }
        case io._HttpVersion.HTTP11:
        {
          return "1.1";
        }
      }
      return null;
    }
    get messageType() {
      return this[_messageType];
    }
    get transferLength() {
      return this[_transferLength];
    }
    get upgrade() {
      return dart.test(this[_connectionUpgrade]) && this[_state$1] == io._State.UPGRADED;
    }
    get persistentConnection() {
      return this[_persistentConnection];
    }
    set isHead(value) {
      if (dart.test(value)) this[_noMessageBody] = true;
    }
    detachIncoming() {
      this[_state$1] = io._State.UPGRADED;
      return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
    }
    readUnparsedData() {
      if (this[_buffer$] == null) return null;
      if (this[_index$2] == this[_buffer$][dartx.length]) return null;
      let result = this[_buffer$][dartx.sublist](this[_index$2]);
      this[_releaseBuffer]();
      return result;
    }
    [_reset]() {
      if (this[_state$1] == io._State.UPGRADED) return;
      this[_state$1] = io._State.START;
      this[_messageType] = io._MessageType.UNDETERMINED;
      this[_headerField][dartx.clear]();
      this[_headerValue][dartx.clear]();
      this[_method$][dartx.clear]();
      this[_uri_or_reason_phrase][dartx.clear]();
      this[_statusCode] = 0;
      this[_statusCodeLength] = 0;
      this[_httpVersion] = io._HttpVersion.UNDETERMINED;
      this[_transferLength] = -1;
      this[_persistentConnection] = false;
      this[_connectionUpgrade] = false;
      this[_chunked] = false;
      this[_noMessageBody] = false;
      this[_remainingContent] = -1;
      this[_headers] = null;
    }
    [_releaseBuffer]() {
      this[_buffer$] = null;
      this[_index$2] = null;
    }
    static _isTokenChar(byte) {
      return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
    }
    static _isValueChar(byte) {
      return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 || byte == io._CharCode.SP || byte == io._CharCode.HT;
    }
    static _tokenizeFieldValue(headerValue) {
      let tokens = ListOfString().new();
      let start = 0;
      let index = 0;
      while (index < dart.notNull(headerValue[dartx.length])) {
        if (headerValue[dartx._get](index) == ",") {
          tokens[dartx.add](headerValue[dartx.substring](start, index));
          start = index + 1;
        } else if (headerValue[dartx._get](index) == " " || headerValue[dartx._get](index) == "\t") {
          start++;
        }
        index++;
      }
      tokens[dartx.add](headerValue[dartx.substring](start, index));
      return tokens;
    }
    static _toLowerCaseByte(x) {
      return (dart.notNull(x) - 65 & 127) < 26 ? (dart.notNull(x) | 32) >>> 0 : x;
    }
    [_caseInsensitiveCompare](expected, value) {
      if (expected[dartx.length] != value[dartx.length]) return false;
      for (let i = 0; i < dart.notNull(expected[dartx.length]); i++) {
        if (expected[dartx._get](i) != io._HttpParser._toLowerCaseByte(value[dartx._get](i))) return false;
      }
      return true;
    }
    [_expect](val1, val2) {
      if (val1 != val2) {
        dart.throw(new io.HttpException("Failed to parse HTTP"));
      }
    }
    [_expectHexDigit](byte) {
      if (48 <= dart.notNull(byte) && dart.notNull(byte) <= 57) {
        return dart.notNull(byte) - 48;
      } else if (65 <= dart.notNull(byte) && dart.notNull(byte) <= 70) {
        return dart.notNull(byte) - 65 + 10;
      } else if (97 <= dart.notNull(byte) && dart.notNull(byte) <= 102) {
        return dart.notNull(byte) - 97 + 10;
      } else {
        dart.throw(new io.HttpException("Failed to parse HTTP"));
      }
    }
    [_createIncoming](transferLength) {
      dart.assert(this[_incoming] == null);
      dart.assert(this[_bodyController] == null);
      dart.assert(!dart.test(this[_bodyPaused]));
      let incoming = null;
      this[_bodyController] = StreamControllerOfListOfint().new({sync: true, onListen: dart.fn(() => {
          if (!dart.equals(incoming, this[_incoming])) return;
          dart.assert(this[_bodyPaused]);
          this[_bodyPaused] = false;
          this[_pauseStateChanged]();
        }, VoidTovoid$()), onPause: dart.fn(() => {
          if (!dart.equals(incoming, this[_incoming])) return;
          dart.assert(!dart.test(this[_bodyPaused]));
          this[_bodyPaused] = true;
          this[_pauseStateChanged]();
        }, VoidTovoid$()), onResume: dart.fn(() => {
          if (!dart.equals(incoming, this[_incoming])) return;
          dart.assert(this[_bodyPaused]);
          this[_bodyPaused] = false;
          this[_pauseStateChanged]();
        }, VoidTovoid$()), onCancel: dart.fn(() => {
          if (!dart.equals(incoming, this[_incoming])) return;
          if (this[_socketSubscription] != null) {
            this[_socketSubscription].cancel();
          }
          this[_closeIncoming](true);
          this[_controller$0].close();
        }, VoidTodynamic$())});
      incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
      this[_bodyPaused] = true;
      this[_pauseStateChanged]();
    }
    [_closeIncoming](closing) {
      if (closing === void 0) closing = false;
      if (this[_incoming] == null) return;
      let tmp = this[_incoming];
      tmp.close(closing);
      this[_incoming] = null;
      if (this[_bodyController] != null) {
        this[_bodyController].close();
        this[_bodyController] = null;
      }
      this[_bodyPaused] = false;
      this[_pauseStateChanged]();
    }
    [_pauseStateChanged]() {
      if (this[_incoming] != null) {
        if (!dart.test(this[_bodyPaused]) && !dart.test(this[_parserCalled])) {
          this[_parse]();
        }
      } else {
        if (!dart.test(this[_paused]) && !dart.test(this[_parserCalled])) {
          this[_parse]();
        }
      }
    }
    [_reportError](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (this[_socketSubscription] != null) this[_socketSubscription].cancel();
      this[_state$1] = io._State.FAILURE;
      this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
      this[_controller$0].close();
    }
  };
  dart.addSimpleTypeTests(io._HttpParser);
  dart.defineNamedConstructor(io._HttpParser, '_');
  dart.setSignature(io._HttpParser, {
    constructors: () => ({
      requestParser: dart.definiteFunctionType(io._HttpParser, []),
      responseParser: dart.definiteFunctionType(io._HttpParser, []),
      _: dart.definiteFunctionType(io._HttpParser, [core.bool])
    }),
    fields: () => ({
      [_parserCalled]: core.bool,
      [_buffer$]: typed_data.Uint8List,
      [_index$2]: core.int,
      [_requestParser]: core.bool,
      [_state$1]: core.int,
      [_httpVersionIndex]: core.int,
      [_messageType]: core.int,
      [_statusCode]: core.int,
      [_statusCodeLength]: core.int,
      [_method$]: ListOfint(),
      [_uri_or_reason_phrase]: ListOfint(),
      [_headerField]: ListOfint(),
      [_headerValue]: ListOfint(),
      [_httpVersion]: core.int,
      [_transferLength]: core.int,
      [_persistentConnection]: core.bool,
      [_connectionUpgrade]: core.bool,
      [_chunked]: core.bool,
      [_noMessageBody]: core.bool,
      [_remainingContent]: core.int,
      [_headers]: io._HttpHeaders,
      [_incoming]: io._HttpIncoming,
      [_socketSubscription]: async.StreamSubscription,
      [_paused]: core.bool,
      [_bodyPaused]: core.bool,
      [_controller$0]: StreamControllerOf_HttpIncoming(),
      [_bodyController]: StreamControllerOfListOfint()
    }),
    getters: () => ({
      version: dart.definiteFunctionType(core.String, []),
      messageType: dart.definiteFunctionType(core.int, []),
      transferLength: dart.definiteFunctionType(core.int, []),
      upgrade: dart.definiteFunctionType(core.bool, []),
      persistentConnection: dart.definiteFunctionType(core.bool, [])
    }),
    setters: () => ({isHead: dart.definiteFunctionType(dart.void, [core.bool])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(io._HttpIncoming), [_HttpIncomingTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      listenToStream: dart.definiteFunctionType(dart.void, [StreamOfListOfint()]),
      [_parse]: dart.definiteFunctionType(dart.void, []),
      [_headersEnd]: dart.definiteFunctionType(core.bool, []),
      [_doParse]: dart.definiteFunctionType(dart.void, []),
      [_onData$]: dart.definiteFunctionType(dart.void, [ListOfint()]),
      [_onDone$]: dart.definiteFunctionType(dart.void, []),
      detachIncoming: dart.definiteFunctionType(io._HttpDetachedIncoming, []),
      readUnparsedData: dart.definiteFunctionType(core.List$(core.int), []),
      [_reset]: dart.definiteFunctionType(dart.void, []),
      [_releaseBuffer]: dart.definiteFunctionType(dart.void, []),
      [_caseInsensitiveCompare]: dart.definiteFunctionType(core.bool, [ListOfint(), ListOfint()]),
      [_expect]: dart.definiteFunctionType(core.int, [core.int, core.int]),
      [_expectHexDigit]: dart.definiteFunctionType(core.int, [core.int]),
      [_createIncoming]: dart.definiteFunctionType(dart.void, [core.int]),
      [_closeIncoming]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [_pauseStateChanged]: dart.definiteFunctionType(dart.void, []),
      [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic])
    }),
    statics: () => ({
      _isTokenChar: dart.definiteFunctionType(core.bool, [core.int]),
      _isValueChar: dart.definiteFunctionType(core.bool, [core.int]),
      _tokenizeFieldValue: dart.definiteFunctionType(core.List$(core.String), [core.String]),
      _toLowerCaseByte: dart.definiteFunctionType(core.int, [core.int])
    }),
    names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
  });
  io._DART_SESSION_ID = "DARTSESSID";
  const _data$ = Symbol('_data');
  const _lastSeen = Symbol('_lastSeen');
  const _timeoutCallback = Symbol('_timeoutCallback');
  const _prev = Symbol('_prev');
  const _next$1 = Symbol('_next');
  const _removeFromTimeoutQueue = Symbol('_removeFromTimeoutQueue');
  const _sessions = Symbol('_sessions');
  const _bumpToEnd = Symbol('_bumpToEnd');
  io._HttpSession = class _HttpSession extends core.Object {
    new(sessionManager, id) {
      this[_data$] = collection.HashMap.new();
      this[_sessionManager] = sessionManager;
      this.id = id;
      this[_lastSeen] = new core.DateTime.now();
      this[_destroyed] = false;
      this[_isNew] = true;
      this[_timeoutCallback] = null;
      this[_prev] = null;
      this[_next$1] = null;
    }
    destroy() {
      this[_destroyed] = true;
      this[_sessionManager][_removeFromTimeoutQueue](this);
      this[_sessionManager][_sessions][dartx.remove](this.id);
    }
    [_markSeen]() {
      this[_lastSeen] = new core.DateTime.now();
      this[_sessionManager][_bumpToEnd](this);
    }
    get lastSeen() {
      return this[_lastSeen];
    }
    get isNew() {
      return this[_isNew];
    }
    set onTimeout(callback) {
      this[_timeoutCallback] = callback;
    }
    containsValue(value) {
      return this[_data$][dartx.containsValue](value);
    }
    containsKey(key) {
      return this[_data$][dartx.containsKey](key);
    }
    _get(key) {
      return this[_data$][dartx._get](key);
    }
    _set(key, value) {
      this[_data$][dartx._set](key, value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      return this[_data$][dartx.putIfAbsent](key, ifAbsent);
    }
    addAll(other) {
      return this[_data$][dartx.addAll](other);
    }
    remove(key) {
      return this[_data$][dartx.remove](key);
    }
    clear() {
      this[_data$][dartx.clear]();
    }
    forEach(f) {
      this[_data$][dartx.forEach](f);
    }
    get keys() {
      return this[_data$][dartx.keys];
    }
    get values() {
      return this[_data$][dartx.values];
    }
    get length() {
      return this[_data$][dartx.length];
    }
    get isEmpty() {
      return this[_data$][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_data$][dartx.isNotEmpty];
    }
    toString() {
      return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
    }
  };
  io._HttpSession[dart.implements] = () => [io.HttpSession];
  dart.setSignature(io._HttpSession, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpSession, [io._HttpSessionManager, core.String])}),
    fields: () => ({
      [_destroyed]: core.bool,
      [_isNew]: core.bool,
      [_lastSeen]: core.DateTime,
      [_timeoutCallback]: core.Function,
      [_sessionManager]: io._HttpSessionManager,
      [_prev]: io._HttpSession,
      [_next$1]: io._HttpSession,
      id: core.String,
      [_data$]: core.Map
    }),
    getters: () => ({
      lastSeen: dart.definiteFunctionType(core.DateTime, []),
      isNew: dart.definiteFunctionType(core.bool, []),
      keys: dart.definiteFunctionType(core.Iterable, []),
      values: dart.definiteFunctionType(core.Iterable, []),
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    setters: () => ({onTimeout: dart.definiteFunctionType(dart.void, [VoidTovoid()])}),
    methods: () => ({
      destroy: dart.definiteFunctionType(dart.void, []),
      [_markSeen]: dart.definiteFunctionType(dart.void, []),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
      remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()])
    })
  });
  dart.defineExtensionMembers(io._HttpSession, [
    'containsValue',
    'containsKey',
    '_get',
    '_set',
    'putIfAbsent',
    'addAll',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  const _sessionTimeout = Symbol('_sessionTimeout');
  const _head$ = Symbol('_head');
  const _tail$ = Symbol('_tail');
  const _timer = Symbol('_timer');
  const _addToTimeoutQueue = Symbol('_addToTimeoutQueue');
  const _stopTimer = Symbol('_stopTimer');
  const _startTimer = Symbol('_startTimer');
  const _timerTimeout = Symbol('_timerTimeout');
  io._HttpSessionManager = class _HttpSessionManager extends core.Object {
    new() {
      this[_sessions] = dart.map({}, core.String, io._HttpSession);
      this[_sessionTimeout] = 20 * 60;
      this[_head$] = null;
      this[_tail$] = null;
      this[_timer] = null;
    }
    createSessionId() {
      let _KEY_LENGTH = 16;
      let data = io._IOCrypto.getRandomBytes(_KEY_LENGTH);
      return io._CryptoUtils.bytesToHex(data);
    }
    getSession(id) {
      return this[_sessions][dartx._get](id);
    }
    createSession() {
      let id = this.createSessionId();
      while (dart.test(this[_sessions][dartx.containsKey](id))) {
        id = this.createSessionId();
      }
      let session = this[_sessions][dartx._set](id, new io._HttpSession(this, id));
      this[_addToTimeoutQueue](session);
      return session;
    }
    set sessionTimeout(timeout) {
      this[_sessionTimeout] = timeout;
      this[_stopTimer]();
      this[_startTimer]();
    }
    close() {
      this[_stopTimer]();
    }
    [_bumpToEnd](session) {
      this[_removeFromTimeoutQueue](session);
      this[_addToTimeoutQueue](session);
    }
    [_addToTimeoutQueue](session) {
      if (this[_head$] == null) {
        dart.assert(this[_tail$] == null);
        this[_tail$] = this[_head$] = session;
        this[_startTimer]();
      } else {
        dart.assert(this[_timer] != null);
        dart.assert(this[_tail$] != null);
        this[_tail$][_next$1] = session;
        session[_prev] = this[_tail$];
        this[_tail$] = session;
      }
    }
    [_removeFromTimeoutQueue](session) {
      if (session[_next$1] != null) {
        session[_next$1][_prev] = session[_prev];
      }
      if (session[_prev] != null) {
        session[_prev][_next$1] = session[_next$1];
      }
      if (dart.equals(this[_head$], session)) {
        this[_head$] = session[_next$1];
        this[_stopTimer]();
        this[_startTimer]();
      }
      if (dart.equals(this[_tail$], session)) {
        this[_tail$] = session[_prev];
      }
      session[_next$1] = session[_prev] = null;
    }
    [_timerTimeout]() {
      this[_stopTimer]();
      dart.assert(this[_head$] != null);
      let session = this[_head$];
      session.destroy();
      if (session[_timeoutCallback] != null) {
        dart.dsend(session, _timeoutCallback);
      }
    }
    [_startTimer]() {
      dart.assert(this[_timer] == null);
      if (this[_head$] != null) {
        let seconds = new core.DateTime.now().difference(this[_head$].lastSeen).inSeconds;
        this[_timer] = async.Timer.new(new core.Duration({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
      }
    }
    [_stopTimer]() {
      if (this[_timer] != null) {
        this[_timer].cancel();
        this[_timer] = null;
      }
    }
  };
  dart.setSignature(io._HttpSessionManager, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpSessionManager, [])}),
    fields: () => ({
      [_sessions]: MapOfString$_HttpSession(),
      [_sessionTimeout]: core.int,
      [_head$]: io._HttpSession,
      [_tail$]: io._HttpSession,
      [_timer]: async.Timer
    }),
    setters: () => ({sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      createSessionId: dart.definiteFunctionType(core.String, []),
      getSession: dart.definiteFunctionType(io._HttpSession, [core.String]),
      createSession: dart.definiteFunctionType(io._HttpSession, []),
      close: dart.definiteFunctionType(dart.void, []),
      [_bumpToEnd]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
      [_addToTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
      [_removeFromTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
      [_timerTimeout]: dart.definiteFunctionType(dart.void, []),
      [_startTimer]: dart.definiteFunctionType(dart.void, []),
      [_stopTimer]: dart.definiteFunctionType(dart.void, [])
    })
  });
  io._IOResourceInfo = class _IOResourceInfo extends core.Object {
    static get timestamp() {
      return dart.notNull(io._IOResourceInfo._startTime) + dart.notNull(io._IOResourceInfo._sw.elapsedMicroseconds) / 1000;
    }
    new(type) {
      this.type = type;
      this.id = io._IOResourceInfo.getNextID();
    }
    get referenceValueMap() {
      return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
    }
    static getNextID() {
      return (() => {
        let x = io._IOResourceInfo._count;
        io._IOResourceInfo._count = dart.notNull(x) + 1;
        return x;
      })();
    }
  };
  dart.setSignature(io._IOResourceInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._IOResourceInfo, [core.String])}),
    fields: () => ({
      type: core.String,
      id: core.int
    }),
    getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
    sfields: () => ({
      _count: core.int,
      _sw: core.Stopwatch,
      _startTime: core.int
    }),
    sgetters: () => ({timestamp: dart.definiteFunctionType(core.double, [])}),
    statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
    names: ['getNextID']
  });
  io._IOResourceInfo._count = 0;
  dart.defineLazy(io._IOResourceInfo, {
    get _sw() {
      return (() => {
        let _ = new core.Stopwatch();
        _.start();
        return _;
      })();
    },
    get _startTime() {
      return new core.DateTime.now().millisecondsSinceEpoch;
    }
  });
  io._ReadWriteResourceInfo = class _ReadWriteResourceInfo extends io._IOResourceInfo {
    addRead(bytes) {
      this.totalRead = dart.notNull(this.totalRead) + dart.notNull(bytes);
      this.readCount = dart.notNull(this.readCount) + 1;
      this.lastRead = io._IOResourceInfo.timestamp;
    }
    didRead() {
      this.addRead(0);
    }
    addWrite(bytes) {
      this.totalWritten = dart.notNull(this.totalWritten) + dart.notNull(bytes);
      this.writeCount = dart.notNull(this.writeCount) + 1;
      this.lastWrite = io._IOResourceInfo.timestamp;
    }
    new(type) {
      this.totalRead = 0;
      this.totalWritten = 0;
      this.readCount = 0;
      this.writeCount = 0;
      this.lastRead = 0.0;
      this.lastWrite = 0.0;
      super.new(type);
    }
    get fullValueMap() {
      return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
    }
  };
  dart.setSignature(io._ReadWriteResourceInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._ReadWriteResourceInfo, [core.String])}),
    fields: () => ({
      totalRead: core.int,
      totalWritten: core.int,
      readCount: core.int,
      writeCount: core.int,
      lastRead: core.double,
      lastWrite: core.double
    }),
    getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
    methods: () => ({
      addRead: dart.definiteFunctionType(dart.void, [core.int]),
      didRead: dart.definiteFunctionType(dart.void, []),
      addWrite: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  io._FileResourceInfo = class _FileResourceInfo extends io._ReadWriteResourceInfo {
    new(file) {
      this.file = file;
      super.new(io._FileResourceInfo.TYPE);
      io._FileResourceInfo.FileOpened(this);
    }
    static FileOpened(info) {
      dart.assert(!dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](info.id)));
      io._FileResourceInfo.openFiles[dartx._set](info.id, info);
    }
    static FileClosed(info) {
      dart.assert(io._FileResourceInfo.openFiles[dartx.containsKey](info.id));
      io._FileResourceInfo.openFiles[dartx.remove](info.id);
    }
    static getOpenFilesList() {
      return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
    }
    static getOpenFiles(func, params) {
      dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
      let data = dart.map({type: '_openfiles', data: io._FileResourceInfo.getOpenFilesList()}, core.String, core.Object);
      let json = convert.JSON.encode(data);
      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
    }
    getFileInfoMap() {
      let result = this.fullValueMap;
      return result;
    }
    static getFileInfoMapByID(func, params) {
      dart.assert(dart.dsend(params, 'containsKey', 'id'));
      let id = core.int.parse(core.String._check(dart.dindex(params, 'id')));
      let result = dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](id)) ? io._FileResourceInfo.openFiles[dartx._get](id).getFileInfoMap() : dart.map();
      let json = convert.JSON.encode(result);
      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
    }
    get name() {
      return dart.str`${dart.dload(this.file, 'path')}`;
    }
  };
  dart.setSignature(io._FileResourceInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._FileResourceInfo, [dart.dynamic])}),
    fields: () => ({file: dart.dynamic}),
    getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
    sfields: () => ({
      TYPE: core.String,
      openFiles: MapOfint$_FileResourceInfo()
    }),
    statics: () => ({
      FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
      FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
      getOpenFilesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
      getOpenFiles: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
      getFileInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic])
    }),
    names: ['FileOpened', 'FileClosed', 'getOpenFilesList', 'getOpenFiles', 'getFileInfoMapByID']
  });
  io._FileResourceInfo.TYPE = '_file';
  dart.defineLazy(io._FileResourceInfo, {
    get openFiles() {
      return MapOfint$_FileResourceInfo().new();
    },
    set openFiles(_) {}
  });
  const _arguments$0 = Symbol('_arguments');
  const _workingDirectory = Symbol('_workingDirectory');
  io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
    new(process) {
      this.process = process;
      this.startedAt = io._IOResourceInfo.timestamp;
      super.new(io._ProcessResourceInfo.TYPE);
      io._ProcessResourceInfo.ProcessStarted(this);
    }
    get name() {
      return core.String._check(dart.dload(this.process, _path$));
    }
    stopped() {
      io._ProcessResourceInfo.ProcessStopped(this);
    }
    get fullValueMap() {
      return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
    }
    static ProcessStarted(info) {
      dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
      io._ProcessResourceInfo.startedProcesses[dartx._set](info.id, info);
    }
    static ProcessStopped(info) {
      dart.assert(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id));
      io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
    }
    static getStartedProcessesList() {
      return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
    }
    static getStartedProcesses(func, params) {
      dart.assert(func == 'ext.dart.io.getProcesses');
      let data = dart.map({type: '_startedprocesses', data: io._ProcessResourceInfo.getStartedProcessesList()}, core.String, core.Object);
      let json = convert.JSON.encode(data);
      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
    }
    static getProcessInfoMapById(func, params) {
      let id = core.int.parse(params[dartx._get]('id'));
      let result = dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](id)) ? io._ProcessResourceInfo.startedProcesses[dartx._get](id).fullValueMap : dart.map();
      let json = convert.JSON.encode(result);
      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
    }
  };
  dart.setSignature(io._ProcessResourceInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._ProcessResourceInfo, [dart.dynamic])}),
    fields: () => ({
      process: dart.dynamic,
      startedAt: core.double
    }),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
    }),
    methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
    sfields: () => ({
      TYPE: core.String,
      startedProcesses: MapOfint$_ProcessResourceInfo()
    }),
    statics: () => ({
      ProcessStarted: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
      ProcessStopped: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
      getStartedProcessesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
      getStartedProcesses: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
      getProcessInfoMapById: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()])
    }),
    names: ['ProcessStarted', 'ProcessStopped', 'getStartedProcessesList', 'getStartedProcesses', 'getProcessInfoMapById']
  });
  io._ProcessResourceInfo.TYPE = '_process';
  dart.defineLazy(io._ProcessResourceInfo, {
    get startedProcesses() {
      return MapOfint$_ProcessResourceInfo().new();
    },
    set startedProcesses(_) {}
  });
  io._SocketResourceInfo = class _SocketResourceInfo extends io._ReadWriteResourceInfo {
    new(socket) {
      this.socket = socket;
      super.new(io._SocketResourceInfo.TYPE);
      io._SocketResourceInfo.SocketOpened(this);
    }
    get name() {
      if (dart.test(dart.dload(this.socket, 'isListening'))) {
        return dart.str`listening:${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}`;
      }
      let remote = '';
      try {
        let remoteHost = dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host');
        let remotePort = dart.dload(this.socket, 'remotePort');
        remote = dart.str` -> ${remoteHost}:${remotePort}`;
      } catch (e) {
      }

      return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
    }
    static getOpenSocketsList() {
      return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
    }
    getSocketInfoMap() {
      let result = this.fullValueMap;
      result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
      result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
      result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
      result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
      if (!dart.test(dart.dload(this.socket, 'isListening'))) {
        try {
          result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
          result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
        } catch (e) {
          result[dartx._set]('remotePort', 'NA');
          result[dartx._set]('remoteHost', 'NA');
        }

      } else {
        result[dartx._set]('remotePort', 'NA');
        result[dartx._set]('remoteHost', 'NA');
      }
      result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
      return result;
    }
    static getSocketInfoMapByID(func, params) {
      dart.assert(params[dartx.containsKey]('id'));
      let id = core.int.parse(params[dartx._get]('id'));
      let result = dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](id)) ? io._SocketResourceInfo.openSockets[dartx._get](id).getSocketInfoMap() : dart.map();
      let json = convert.JSON.encode(result);
      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
    }
    static getOpenSockets(func, params) {
      dart.assert(dart.equals(func, 'ext.dart.io.getOpenSockets'));
      let data = dart.map({type: '_opensockets', data: io._SocketResourceInfo.getOpenSocketsList()}, core.String, core.Object);
      let json = convert.JSON.encode(data);
      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
    }
    static SocketOpened(info) {
      dart.assert(!dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id)));
      io._SocketResourceInfo.openSockets[dartx._set](info.id, info);
    }
    static SocketClosed(info) {
      dart.assert(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id));
      io._SocketResourceInfo.openSockets[dartx.remove](info.id);
    }
  };
  dart.setSignature(io._SocketResourceInfo, {
    constructors: () => ({new: dart.definiteFunctionType(io._SocketResourceInfo, [dart.dynamic])}),
    fields: () => ({socket: dart.dynamic}),
    getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
    sfields: () => ({
      TCP_STRING: core.String,
      UDP_STRING: core.String,
      TYPE: core.String,
      openSockets: MapOfint$_SocketResourceInfo()
    }),
    statics: () => ({
      getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
      getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
      getOpenSockets: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
      SocketOpened: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo]),
      SocketClosed: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo])
    }),
    names: ['getOpenSocketsList', 'getSocketInfoMapByID', 'getOpenSockets', 'SocketOpened', 'SocketClosed']
  });
  io._SocketResourceInfo.TCP_STRING = 'TCP';
  io._SocketResourceInfo.UDP_STRING = 'UDP';
  io._SocketResourceInfo.TYPE = '_socket';
  dart.defineLazy(io._SocketResourceInfo, {
    get openSockets() {
      return MapOfint$_SocketResourceInfo().new();
    },
    set openSockets(_) {}
  });
  io.IOSink = class IOSink extends core.Object {
    static new(target, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return new io._IOSinkImpl(target, encoding);
    }
  };
  io.IOSink[dart.implements] = () => [StreamSinkOfListOfint(), core.StringSink];
  dart.setSignature(io.IOSink, {
    constructors: () => ({new: dart.definiteFunctionType(io.IOSink, [StreamConsumerOfListOfint()], {encoding: convert.Encoding})}),
    fields: () => ({encoding: convert.Encoding})
  });
  io._FILE_EXISTS = 0;
  io._FILE_CREATE = 1;
  io._FILE_DELETE = 2;
  io._FILE_RENAME = 3;
  io._FILE_COPY = 4;
  io._FILE_OPEN = 5;
  io._FILE_RESOLVE_SYMBOLIC_LINKS = 6;
  io._FILE_CLOSE = 7;
  io._FILE_POSITION = 8;
  io._FILE_SET_POSITION = 9;
  io._FILE_TRUNCATE = 10;
  io._FILE_LENGTH = 11;
  io._FILE_LENGTH_FROM_PATH = 12;
  io._FILE_LAST_MODIFIED = 13;
  io._FILE_FLUSH = 14;
  io._FILE_READ_BYTE = 15;
  io._FILE_WRITE_BYTE = 16;
  io._FILE_READ = 17;
  io._FILE_READ_INTO = 18;
  io._FILE_WRITE_FROM = 19;
  io._FILE_CREATE_LINK = 20;
  io._FILE_DELETE_LINK = 21;
  io._FILE_RENAME_LINK = 22;
  io._FILE_LINK_TARGET = 23;
  io._FILE_TYPE = 24;
  io._FILE_IDENTICAL = 25;
  io._FILE_STAT = 26;
  io._FILE_LOCK = 27;
  io._SOCKET_LOOKUP = 28;
  io._SOCKET_LIST_INTERFACES = 29;
  io._SOCKET_REVERSE_LOOKUP = 30;
  io._DIRECTORY_CREATE = 31;
  io._DIRECTORY_DELETE = 32;
  io._DIRECTORY_EXISTS = 33;
  io._DIRECTORY_CREATE_TEMP = 34;
  io._DIRECTORY_LIST_START = 35;
  io._DIRECTORY_LIST_NEXT = 36;
  io._DIRECTORY_LIST_STOP = 37;
  io._DIRECTORY_RENAME = 38;
  io._SSL_PROCESS_FILTER = 39;
  io._IOService = class _IOService extends core.Object {
    static _dispatch(request, data) {
      dart.throw(new core.UnsupportedError("_IOService._dispatch"));
    }
  };
  dart.setSignature(io._IOService, {
    statics: () => ({_dispatch: dart.definiteFunctionType(async.Future, [core.int, core.List])}),
    names: ['_dispatch']
  });
  io.Link = class Link extends core.Object {
    static new(path) {
      return new io._Link(path);
    }
    static fromUri(uri) {
      return io.Link.new(uri.toFilePath());
    }
  };
  io.Link[dart.implements] = () => [io.FileSystemEntity];
  dart.setSignature(io.Link, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.Link, [core.String]),
      fromUri: dart.definiteFunctionType(io.Link, [core.Uri])
    })
  });
  const _makeWindowsLinkTarget = Symbol('_makeWindowsLinkTarget');
  const _exceptionFromResponse = Symbol('_exceptionFromResponse');
  io._Link = class _Link extends io.FileSystemEntity {
    new(path) {
      this.path = path;
      if (!(typeof this.path == 'string')) {
        dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
      }
    }
    toString() {
      return dart.str`Link: '${this.path}'`;
    }
    exists() {
      return io.FileSystemEntity.isLink(this.path);
    }
    existsSync() {
      return io.FileSystemEntity.isLinkSync(this.path);
    }
    get absolute() {
      return io.Link.new(this[_absolutePath]);
    }
    stat() {
      return io.FileStat.stat(this.path);
    }
    statSync() {
      return io.FileStat.statSync(this.path);
    }
    create(target, opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(io.Platform.isWindows)) {
        target = this[_makeWindowsLinkTarget](target);
      }
      let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
      return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE_LINK, JSArrayOfString().of([this.path, target])), dynamicToFuture())).then(io._Link)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot create link to target '${target}'`, this.path));
        }
        return this;
      }, dynamicTo_Link()));
    }
    createSync(target, opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        this.parent.createSync({recursive: true});
      }
      if (dart.test(io.Platform.isWindows)) {
        target = this[_makeWindowsLinkTarget](target);
      }
      let result = io._File._createLink(this.path, target);
      io._Link.throwIfError(result, "Cannot create link", this.path);
    }
    [_makeWindowsLinkTarget](target) {
      let base = core.Uri.file(dart.str`${io.Directory.current.path}\\`);
      let link = core.Uri.file(this.path);
      let destination = core.Uri.file(target);
      let result = base.resolveUri(link).resolveUri(destination).toFilePath();
      if (dart.notNull(result[dartx.length]) > 3 && result[dartx._get](1) == ':' && result[dartx._get](2) == '\\') {
        return dart.str`\\??\\${result}`;
      } else {
        dart.throw(new io.FileSystemException(dart.str`Target ${result} of Link.create on Windows cannot be converted` + ' to start with a drive letter.  Unexpected error.'));
      }
    }
    updateSync(target) {
      this.deleteSync();
      this.createSync(target);
    }
    update(target) {
      return this.delete().then(io.Link)(dart.fn(_ => this.create(target), FileSystemEntityToFutureOfLink()));
    }
    [_delete](opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        return io.Directory.new(this.path).delete({recursive: true}).then(io._Link)(dart.fn(_ => this, FileSystemEntityTo_Link()));
      }
      return io._IOService._dispatch(io._FILE_DELETE_LINK, JSArrayOfString().of([this.path])).then(io._Link)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionFromResponse](response, "Cannot delete link", this.path));
        }
        return this;
      }, dynamicTo_Link()));
    }
    [_deleteSync](opts) {
      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
      if (dart.test(recursive)) {
        return io.Directory.new(this.path).deleteSync({recursive: true});
      }
      let result = io._File._deleteLinkNative(this.path);
      io._Link.throwIfError(result, "Cannot delete link", this.path);
    }
    rename(newPath) {
      return io._IOService._dispatch(io._FILE_RENAME_LINK, JSArrayOfString().of([this.path, newPath])).then(io.Link)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot rename link to '${newPath}'`, this.path));
        }
        return io.Link.new(newPath);
      }, dynamicToLink()));
    }
    renameSync(newPath) {
      let result = io._File._renameLink(this.path, newPath);
      io._Link.throwIfError(result, dart.str`Cannot rename link '${this.path}' to '${newPath}'`);
      return io.Link.new(newPath);
    }
    target() {
      return io._IOService._dispatch(io._FILE_LINK_TARGET, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionFromResponse](response, "Cannot get target of link", this.path));
        }
        return response;
      }, dynamicTodynamic$()));
    }
    targetSync() {
      let result = io._File._linkTarget(this.path);
      io._Link.throwIfError(result, "Cannot read link", this.path);
      return core.String._check(result);
    }
    static throwIfError(result, msg, path) {
      if (path === void 0) path = "";
      if (io.OSError.is(result)) {
        dart.throw(new io.FileSystemException(msg, path, result));
      }
    }
    [_isErrorResponse](response) {
      return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
    }
    [_exceptionFromResponse](response, message, path) {
      dart.assert(this[_isErrorResponse](response));
      switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
        case io._ILLEGAL_ARGUMENT_RESPONSE:
        {
          return new core.ArgumentError();
        }
        case io._OSERROR_RESPONSE:
        {
          let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
          return new io.FileSystemException(message, path, err);
        }
        default:
        {
          return core.Exception.new("Unknown error");
        }
      }
    }
  };
  io._Link[dart.implements] = () => [io.Link];
  dart.setSignature(io._Link, {
    constructors: () => ({new: dart.definiteFunctionType(io._Link, [core.String])}),
    fields: () => ({path: core.String}),
    getters: () => ({absolute: dart.definiteFunctionType(io.Link, [])}),
    methods: () => ({
      exists: dart.definiteFunctionType(async.Future$(core.bool), []),
      existsSync: dart.definiteFunctionType(core.bool, []),
      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
      statSync: dart.definiteFunctionType(io.FileStat, []),
      create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
      createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
      [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
      updateSync: dart.definiteFunctionType(dart.void, [core.String]),
      update: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
      [_delete]: dart.definiteFunctionType(async.Future$(io.Link), [], {recursive: core.bool}),
      [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
      rename: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
      renameSync: dart.definiteFunctionType(io.Link, [core.String]),
      target: dart.definiteFunctionType(async.Future$(core.String), []),
      targetSync: dart.definiteFunctionType(core.String, []),
      [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [_exceptionFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])
    }),
    statics: () => ({throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String])}),
    names: ['throwIfError']
  });
  io.Platform = class Platform extends core.Object {
    static get numberOfProcessors() {
      return io.Platform._numberOfProcessors;
    }
    static get pathSeparator() {
      return io.Platform._pathSeparator;
    }
    static get operatingSystem() {
      return io.Platform._operatingSystem;
    }
    static get localHostname() {
      return io.Platform._localHostname;
    }
    static get environment() {
      return io._Platform.environment;
    }
    static get executable() {
      return io._Platform.executable;
    }
    static get resolvedExecutable() {
      return io._Platform.resolvedExecutable;
    }
    static get script() {
      return io._Platform.script;
    }
    static get executableArguments() {
      return io._Platform.executableArguments;
    }
    static get packageRoot() {
      return io._Platform.packageRoot;
    }
    static get packageConfig() {
      return io._Platform.packageConfig;
    }
    static get version() {
      return io.Platform._version;
    }
  };
  dart.setSignature(io.Platform, {
    sfields: () => ({
      _numberOfProcessors: core.int,
      _pathSeparator: core.String,
      _operatingSystem: core.String,
      _localHostname: core.String,
      _version: core.String,
      isLinux: core.bool,
      isMacOS: core.bool,
      isWindows: core.bool,
      isAndroid: core.bool,
      isIOS: core.bool
    }),
    sgetters: () => ({
      numberOfProcessors: dart.definiteFunctionType(core.int, []),
      pathSeparator: dart.definiteFunctionType(core.String, []),
      operatingSystem: dart.definiteFunctionType(core.String, []),
      localHostname: dart.definiteFunctionType(core.String, []),
      environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      executable: dart.definiteFunctionType(core.String, []),
      resolvedExecutable: dart.definiteFunctionType(core.String, []),
      script: dart.definiteFunctionType(core.Uri, []),
      executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
      packageRoot: dart.definiteFunctionType(core.String, []),
      packageConfig: dart.definiteFunctionType(core.String, []),
      version: dart.definiteFunctionType(core.String, [])
    })
  });
  dart.defineLazy(io.Platform, {
    get _numberOfProcessors() {
      return io._Platform.numberOfProcessors;
    },
    get _pathSeparator() {
      return io._Platform.pathSeparator;
    },
    get _operatingSystem() {
      return io._Platform.operatingSystem;
    },
    get _localHostname() {
      return io._Platform.localHostname;
    },
    get _version() {
      return io._Platform.version;
    },
    get isLinux() {
      return io.Platform._operatingSystem == "linux";
    },
    get isMacOS() {
      return io.Platform._operatingSystem == "macos";
    },
    get isWindows() {
      return io.Platform._operatingSystem == "windows";
    },
    get isAndroid() {
      return io.Platform._operatingSystem == "android";
    },
    get isIOS() {
      return io.Platform._operatingSystem == "ios";
    }
  });
  io._Platform = class _Platform extends core.Object {
    static _numberOfProcessors() {
      dart.throw(new core.UnsupportedError("Platform._numberOfProcessors"));
    }
    static _pathSeparator() {
      dart.throw(new core.UnsupportedError("Platform._pathSeparator"));
    }
    static _operatingSystem() {
      dart.throw(new core.UnsupportedError("Platform._operatingSystem"));
    }
    static _localHostname() {
      dart.throw(new core.UnsupportedError("Platform._localHostname"));
    }
    static _executable() {
      dart.throw(new core.UnsupportedError("Platform._executable"));
    }
    static _resolvedExecutable() {
      dart.throw(new core.UnsupportedError("Platform._resolvedExecutable"));
    }
    static _environment() {
      dart.throw(new core.UnsupportedError("Platform._environment"));
    }
    static _executableArguments() {
      dart.throw(new core.UnsupportedError("Platform._executableArguments"));
    }
    static _packageRoot() {
      dart.throw(new core.UnsupportedError("Platform._packageRoot"));
    }
    static _packageConfig() {
      dart.throw(new core.UnsupportedError("Platform._packageConfig"));
    }
    static _version() {
      dart.throw(new core.UnsupportedError("Platform._version"));
    }
    static get numberOfProcessors() {
      return io._Platform._numberOfProcessors();
    }
    static get pathSeparator() {
      return io._Platform._pathSeparator();
    }
    static get operatingSystem() {
      return io._Platform._operatingSystem();
    }
    static get localHostname() {
      let result = io._Platform._localHostname();
      if (io.OSError.is(result)) {
        dart.throw(result);
      } else {
        return core.String._check(result);
      }
    }
    static get executableArguments() {
      return io._Platform._executableArguments();
    }
    static get environment() {
      if (io._Platform._environmentCache == null) {
        let env = io._Platform._environment();
        if (!io.OSError.is(env)) {
          let isWindows = io._Platform.operatingSystem == 'windows';
          let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
          for (let str of core.Iterable._check(env)) {
            let equalsIndex = dart.dsend(str, 'indexOf', '=');
            if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
              result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
            }
          }
          io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
        } else {
          io._Platform._environmentCache = env;
        }
      }
      if (io.OSError.is(io._Platform._environmentCache)) {
        dart.throw(io._Platform._environmentCache);
      } else {
        return MapOfString$String()._check(io._Platform._environmentCache);
      }
    }
    static get version() {
      return io._Platform._version();
    }
  };
  dart.setSignature(io._Platform, {
    sfields: () => ({
      executable: core.String,
      resolvedExecutable: core.String,
      packageRoot: core.String,
      packageConfig: core.String,
      _environmentCache: dart.dynamic,
      script: core.Uri
    }),
    sgetters: () => ({
      numberOfProcessors: dart.definiteFunctionType(core.int, []),
      pathSeparator: dart.definiteFunctionType(core.String, []),
      operatingSystem: dart.definiteFunctionType(core.String, []),
      localHostname: dart.definiteFunctionType(core.String, []),
      executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
      environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      version: dart.definiteFunctionType(core.String, [])
    }),
    statics: () => ({
      _numberOfProcessors: dart.definiteFunctionType(core.int, []),
      _pathSeparator: dart.definiteFunctionType(core.String, []),
      _operatingSystem: dart.definiteFunctionType(core.String, []),
      _localHostname: dart.definiteFunctionType(dart.dynamic, []),
      _executable: dart.definiteFunctionType(dart.dynamic, []),
      _resolvedExecutable: dart.definiteFunctionType(dart.dynamic, []),
      _environment: dart.definiteFunctionType(dart.dynamic, []),
      _executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
      _packageRoot: dart.definiteFunctionType(core.String, []),
      _packageConfig: dart.definiteFunctionType(core.String, []),
      _version: dart.definiteFunctionType(core.String, [])
    }),
    names: ['_numberOfProcessors', '_pathSeparator', '_operatingSystem', '_localHostname', '_executable', '_resolvedExecutable', '_environment', '_executableArguments', '_packageRoot', '_packageConfig', '_version']
  });
  io._Platform._environmentCache = null;
  io._Platform.script = null;
  dart.defineLazy(io._Platform, {
    get executable() {
      return core.String._check(io._Platform._executable());
    },
    set executable(_) {},
    get resolvedExecutable() {
      return core.String._check(io._Platform._resolvedExecutable());
    },
    set resolvedExecutable(_) {},
    get packageRoot() {
      return io._Platform._packageRoot();
    },
    set packageRoot(_) {},
    get packageConfig() {
      return io._Platform._packageConfig();
    },
    set packageConfig(_) {}
  });
  const _map$1 = Symbol('_map');
  io._CaseInsensitiveStringMap$ = dart.generic(V => {
    let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
    class _CaseInsensitiveStringMap extends core.Object {
      new() {
        this[_map$1] = MapOfString$V().new();
      }
      containsKey(key) {
        return typeof key == 'string' && dart.test(this[_map$1][dartx.containsKey](key[dartx.toUpperCase]()));
      }
      containsValue(value) {
        return this[_map$1][dartx.containsValue](value);
      }
      _get(key) {
        return typeof key == 'string' ? this[_map$1][dartx._get](key[dartx.toUpperCase]()) : null;
      }
      _set(key, value) {
        V._check(value);
        this[_map$1][dartx._set](key[dartx.toUpperCase](), value);
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        VoidToV()._check(ifAbsent);
        return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
      }
      addAll(other) {
        other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
      }
      remove(key) {
        return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
      }
      clear() {
        this[_map$1][dartx.clear]();
      }
      forEach(f) {
        this[_map$1][dartx.forEach](f);
      }
      get keys() {
        return this[_map$1][dartx.keys];
      }
      get values() {
        return this[_map$1][dartx.values];
      }
      get length() {
        return this[_map$1][dartx.length];
      }
      get isEmpty() {
        return this[_map$1][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_map$1][dartx.isNotEmpty];
      }
      toString() {
        return dart.toString(this[_map$1]);
      }
    }
    dart.addTypeTests(_CaseInsensitiveStringMap);
    _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
    dart.setSignature(_CaseInsensitiveStringMap, {
      fields: () => ({[_map$1]: MapOfString$V()}),
      getters: () => ({
        keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
        values: dart.definiteFunctionType(core.Iterable$(V), []),
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [core.String, V]),
        putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
        addAll: dart.definiteFunctionType(dart.void, [core.Map]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
      })
    });
    dart.defineExtensionMembers(_CaseInsensitiveStringMap, [
      'containsKey',
      'containsValue',
      '_get',
      '_set',
      'putIfAbsent',
      'addAll',
      'remove',
      'clear',
      'forEach',
      'keys',
      'values',
      'length',
      'isEmpty',
      'isNotEmpty'
    ]);
    return _CaseInsensitiveStringMap;
  });
  io._CaseInsensitiveStringMap = _CaseInsensitiveStringMap();
  io._ProcessUtils = class _ProcessUtils extends core.Object {
    static _exit(status) {
      dart.throw(new core.UnsupportedError("ProcessUtils._exit"));
    }
    static _setExitCode(status) {
      dart.throw(new core.UnsupportedError("ProcessUtils._setExitCode"));
    }
    static _getExitCode() {
      dart.throw(new core.UnsupportedError("ProcessUtils._getExitCode"));
    }
    static _sleep(millis) {
      dart.throw(new core.UnsupportedError("ProcessUtils._sleep"));
    }
    static _pid(process) {
      dart.throw(new core.UnsupportedError("ProcessUtils._pid"));
    }
    static _watchSignal(signal) {
      dart.throw(new core.UnsupportedError("ProcessUtils._watchSignal"));
    }
  };
  dart.setSignature(io._ProcessUtils, {
    statics: () => ({
      _exit: dart.definiteFunctionType(dart.void, [core.int]),
      _setExitCode: dart.definiteFunctionType(dart.void, [core.int]),
      _getExitCode: dart.definiteFunctionType(core.int, []),
      _sleep: dart.definiteFunctionType(dart.void, [core.int]),
      _pid: dart.definiteFunctionType(core.int, [io.Process]),
      _watchSignal: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [io.ProcessSignal])
    }),
    names: ['_exit', '_setExitCode', '_getExitCode', '_sleep', '_pid', '_watchSignal']
  });
  io.exit = function(code) {
    if (!(typeof code == 'number')) {
      dart.throw(new core.ArgumentError("Integer value for exit code expected"));
    }
    io._ProcessUtils._exit(code);
  };
  dart.fn(io.exit, intTovoid());
  dart.copyProperties(io, {
    set exitCode(code) {
      if (!(typeof code == 'number')) {
        dart.throw(new core.ArgumentError("Integer value for exit code expected"));
      }
      io._ProcessUtils._setExitCode(code);
    },
    get exitCode() {
      return io._ProcessUtils._getExitCode();
    }
  });
  io.sleep = function(duration) {
    let milliseconds = duration.inMilliseconds;
    if (dart.notNull(milliseconds) < 0) {
      dart.throw(new core.ArgumentError("sleep: duration cannot be negative"));
    }
    io._ProcessUtils._sleep(milliseconds);
  };
  dart.fn(io.sleep, DurationTovoid());
  dart.copyProperties(io, {
    get pid() {
      return io._ProcessUtils._pid(null);
    }
  });
  io.ProcessStartMode = class ProcessStartMode extends core.Object {
    new(index) {
      this.index = index;
    }
    toString() {
      return {
        0: "ProcessStartMode.NORMAL",
        1: "ProcessStartMode.DETACHED",
        2: "ProcessStartMode.DETACHED_WITH_STDIO"
      }[this.index];
    }
  };
  dart.defineEnumValues(io.ProcessStartMode, [
    'NORMAL',
    'DETACHED',
    'DETACHED_WITH_STDIO'
  ]);
  io.Process = class Process extends core.Object {
    new() {
      this.exitCode = null;
    }
    static start(executable, arguments$, opts) {
      let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
      let environment = opts && 'environment' in opts ? opts.environment : null;
      let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
      let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
      let mode = opts && 'mode' in opts ? opts.mode : io.ProcessStartMode.NORMAL;
      dart.throw(new core.UnsupportedError("Process.start"));
    }
    static run(executable, arguments$, opts) {
      let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
      let environment = opts && 'environment' in opts ? opts.environment : null;
      let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
      let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
      let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
      let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
      dart.throw(new core.UnsupportedError("Process.run"));
    }
    static runSync(executable, arguments$, opts) {
      let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
      let environment = opts && 'environment' in opts ? opts.environment : null;
      let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
      let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
      let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
      let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
      dart.throw(new core.UnsupportedError("Process.runSync"));
    }
    static killPid(pid, signal) {
      if (signal === void 0) signal = io.ProcessSignal.SIGTERM;
      dart.throw(new core.UnsupportedError("Process.killPid"));
    }
  };
  dart.setSignature(io.Process, {
    fields: () => ({exitCode: FutureOfint()}),
    statics: () => ({
      start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
      run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
      runSync: dart.definiteFunctionType(io.ProcessResult, [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
      killPid: dart.definiteFunctionType(core.bool, [core.int], [io.ProcessSignal])
    }),
    names: ['start', 'run', 'runSync', 'killPid']
  });
  io.ProcessResult = class ProcessResult extends core.Object {
    new(pid, exitCode, stdout, stderr) {
      this.pid = pid;
      this.exitCode = exitCode;
      this.stdout = stdout;
      this.stderr = stderr;
    }
  };
  dart.setSignature(io.ProcessResult, {
    constructors: () => ({new: dart.definiteFunctionType(io.ProcessResult, [core.int, core.int, dart.dynamic, dart.dynamic])}),
    fields: () => ({
      exitCode: core.int,
      stdout: dart.dynamic,
      stderr: dart.dynamic,
      pid: core.int
    })
  });
  const _signalNumber = Symbol('_signalNumber');
  const _name$1 = Symbol('_name');
  io.ProcessSignal = class ProcessSignal extends core.Object {
    _(signalNumber, name) {
      this[_signalNumber] = signalNumber;
      this[_name$1] = name;
    }
    toString() {
      return this[_name$1];
    }
    watch() {
      return io._ProcessUtils._watchSignal(this);
    }
  };
  dart.defineNamedConstructor(io.ProcessSignal, '_');
  dart.setSignature(io.ProcessSignal, {
    constructors: () => ({_: dart.definiteFunctionType(io.ProcessSignal, [core.int, core.String])}),
    fields: () => ({
      [_signalNumber]: core.int,
      [_name$1]: core.String
    }),
    methods: () => ({watch: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [])}),
    sfields: () => ({
      SIGHUP: io.ProcessSignal,
      SIGINT: io.ProcessSignal,
      SIGQUIT: io.ProcessSignal,
      SIGILL: io.ProcessSignal,
      SIGTRAP: io.ProcessSignal,
      SIGABRT: io.ProcessSignal,
      SIGBUS: io.ProcessSignal,
      SIGFPE: io.ProcessSignal,
      SIGKILL: io.ProcessSignal,
      SIGUSR1: io.ProcessSignal,
      SIGSEGV: io.ProcessSignal,
      SIGUSR2: io.ProcessSignal,
      SIGPIPE: io.ProcessSignal,
      SIGALRM: io.ProcessSignal,
      SIGTERM: io.ProcessSignal,
      SIGCHLD: io.ProcessSignal,
      SIGCONT: io.ProcessSignal,
      SIGSTOP: io.ProcessSignal,
      SIGTSTP: io.ProcessSignal,
      SIGTTIN: io.ProcessSignal,
      SIGTTOU: io.ProcessSignal,
      SIGURG: io.ProcessSignal,
      SIGXCPU: io.ProcessSignal,
      SIGXFSZ: io.ProcessSignal,
      SIGVTALRM: io.ProcessSignal,
      SIGPROF: io.ProcessSignal,
      SIGWINCH: io.ProcessSignal,
      SIGPOLL: io.ProcessSignal,
      SIGSYS: io.ProcessSignal
    })
  });
  dart.defineLazy(io.ProcessSignal, {
    get SIGHUP() {
      return dart.const(new io.ProcessSignal._(1, "SIGHUP"));
    },
    get SIGINT() {
      return dart.const(new io.ProcessSignal._(2, "SIGINT"));
    },
    get SIGQUIT() {
      return dart.const(new io.ProcessSignal._(3, "SIGQUIT"));
    },
    get SIGILL() {
      return dart.const(new io.ProcessSignal._(4, "SIGILL"));
    },
    get SIGTRAP() {
      return dart.const(new io.ProcessSignal._(5, "SIGTRAP"));
    },
    get SIGABRT() {
      return dart.const(new io.ProcessSignal._(6, "SIGABRT"));
    },
    get SIGBUS() {
      return dart.const(new io.ProcessSignal._(7, "SIGBUS"));
    },
    get SIGFPE() {
      return dart.const(new io.ProcessSignal._(8, "SIGFPE"));
    },
    get SIGKILL() {
      return dart.const(new io.ProcessSignal._(9, "SIGKILL"));
    },
    get SIGUSR1() {
      return dart.const(new io.ProcessSignal._(10, "SIGUSR1"));
    },
    get SIGSEGV() {
      return dart.const(new io.ProcessSignal._(11, "SIGSEGV"));
    },
    get SIGUSR2() {
      return dart.const(new io.ProcessSignal._(12, "SIGUSR2"));
    },
    get SIGPIPE() {
      return dart.const(new io.ProcessSignal._(13, "SIGPIPE"));
    },
    get SIGALRM() {
      return dart.const(new io.ProcessSignal._(14, "SIGALRM"));
    },
    get SIGTERM() {
      return dart.const(new io.ProcessSignal._(15, "SIGTERM"));
    },
    get SIGCHLD() {
      return dart.const(new io.ProcessSignal._(17, "SIGCHLD"));
    },
    get SIGCONT() {
      return dart.const(new io.ProcessSignal._(18, "SIGCONT"));
    },
    get SIGSTOP() {
      return dart.const(new io.ProcessSignal._(19, "SIGSTOP"));
    },
    get SIGTSTP() {
      return dart.const(new io.ProcessSignal._(20, "SIGTSTP"));
    },
    get SIGTTIN() {
      return dart.const(new io.ProcessSignal._(21, "SIGTTIN"));
    },
    get SIGTTOU() {
      return dart.const(new io.ProcessSignal._(22, "SIGTTOU"));
    },
    get SIGURG() {
      return dart.const(new io.ProcessSignal._(23, "SIGURG"));
    },
    get SIGXCPU() {
      return dart.const(new io.ProcessSignal._(24, "SIGXCPU"));
    },
    get SIGXFSZ() {
      return dart.const(new io.ProcessSignal._(25, "SIGXFSZ"));
    },
    get SIGVTALRM() {
      return dart.const(new io.ProcessSignal._(26, "SIGVTALRM"));
    },
    get SIGPROF() {
      return dart.const(new io.ProcessSignal._(27, "SIGPROF"));
    },
    get SIGWINCH() {
      return dart.const(new io.ProcessSignal._(28, "SIGWINCH"));
    },
    get SIGPOLL() {
      return dart.const(new io.ProcessSignal._(29, "SIGPOLL"));
    },
    get SIGSYS() {
      return dart.const(new io.ProcessSignal._(31, "SIGSYS"));
    }
  });
  io.SignalException = class SignalException extends core.Object {
    new(message, osError) {
      if (osError === void 0) osError = null;
      this.message = message;
      this.osError = osError;
    }
    toString() {
      let msg = "";
      if (this.osError != null) {
        msg = dart.str`, osError: ${this.osError}`;
      }
      return dart.str`SignalException: ${this.message}${msg}`;
    }
  };
  io.SignalException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.SignalException, {
    constructors: () => ({new: dart.definiteFunctionType(io.SignalException, [core.String], [dart.dynamic])}),
    fields: () => ({
      message: core.String,
      osError: dart.dynamic
    })
  });
  io.ProcessException = class ProcessException extends core.Object {
    new(executable, arguments$, message, errorCode) {
      if (message === void 0) message = "";
      if (errorCode === void 0) errorCode = 0;
      this.executable = executable;
      this.arguments = arguments$;
      this.message = message;
      this.errorCode = errorCode;
    }
    toString() {
      let msg = this.message == null ? dart.str`OS error code: ${this.errorCode}` : this.message;
      let args = this.arguments[dartx.join](' ');
      return dart.str`ProcessException: ${msg}\n  Command: ${this.executable} ${args}`;
    }
  };
  io.ProcessException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.ProcessException, {
    constructors: () => ({new: dart.definiteFunctionType(io.ProcessException, [core.String, ListOfString()], [core.String, core.int])}),
    fields: () => ({
      executable: core.String,
      arguments: ListOfString(),
      message: core.String,
      errorCode: core.int
    })
  });
  const _detachRaw = Symbol('_detachRaw');
  io.SecureSocket = class SecureSocket extends core.Object {
    static _(rawSocket) {
      dart.throw(new core.UnsupportedError("SecureSocket constructor"));
    }
    static connect(host, port, opts) {
      let context = opts && 'context' in opts ? opts.context : null;
      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      return io.RawSecureSocket.connect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}).then(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket()));
    }
    static secure(socket, opts) {
      let host = opts && 'host' in opts ? opts.host : null;
      let context = opts && 'context' in opts ? opts.context : null;
      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
      let completer = async.Completer.new();
      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
      }, dynamicTodynamic$()));
      return FutureOfSecureSocket()._check(completer.future);
    }
    static secureServer(socket, context, opts) {
      let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      let completer = async.Completer.new();
      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
      }, dynamicTodynamic$()));
      return FutureOfSecureSocket()._check(completer.future);
    }
  };
  io.SecureSocket[dart.implements] = () => [io.Socket];
  dart.setSignature(io.SecureSocket, {
    constructors: () => ({_: dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])}),
    statics: () => ({
      connect: dart.definiteFunctionType(async.Future$(io.SecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
      secure: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket], {host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool()}),
      secureServer: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket, io.SecurityContext], {bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
    }),
    names: ['connect', 'secure', 'secureServer']
  });
  io.SecureServerSocket = class SecureServerSocket extends async.Stream$(io.SecureSocket) {
    _(socket) {
      this[_socket] = socket;
      super.new();
    }
    static bind(address, port, context, opts) {
      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      let shared = opts && 'shared' in opts ? opts.shared : false;
      return io.RawSecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols, shared: shared}).then(io.SecureServerSocket)(dart.fn(serverSocket => new io.SecureServerSocket._(serverSocket), RawSecureServerSocketToSecureServerSocket()));
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_socket].map(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    get port() {
      return this[_socket].port;
    }
    get address() {
      return this[_socket].address;
    }
    close() {
      return this[_socket].close().then(io.SecureServerSocket)(dart.fn(_ => this, RawSecureServerSocketToSecureServerSocket()));
    }
    set [_owner](owner) {
      this[_socket][_owner] = owner;
    }
  };
  dart.addSimpleTypeTests(io.SecureServerSocket);
  dart.defineNamedConstructor(io.SecureServerSocket, '_');
  dart.setSignature(io.SecureServerSocket, {
    constructors: () => ({_: dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])}),
    fields: () => ({[_socket]: io.RawSecureServerSocket}),
    getters: () => ({
      port: dart.definiteFunctionType(core.int, []),
      address: dart.definiteFunctionType(io.InternetAddress, [])
    }),
    setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(io.SecureSocket), [SecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      close: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [])
    }),
    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
    names: ['bind']
  });
  const _onSubscriptionStateChange = Symbol('_onSubscriptionStateChange');
  const _onPauseStateChange = Symbol('_onPauseStateChange');
  io.RawSecureSocket = class RawSecureSocket extends core.Object {
    static connect(host, port, opts) {
      let context = opts && 'context' in opts ? opts.context : null;
      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      io._RawSecureSocket._verifyFields(host, port, false, false, false, onBadCertificate);
      return io.RawSocket.connect(host, port).then(io.RawSecureSocket)(dart.fn(socket => io.RawSecureSocket.secure(socket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket()));
    }
    static secure(socket, opts) {
      let subscription = opts && 'subscription' in opts ? opts.subscription : null;
      let host = opts && 'host' in opts ? opts.host : null;
      let context = opts && 'context' in opts ? opts.context : null;
      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      socket.readEventsEnabled = false;
      socket.writeEventsEnabled = false;
      return io._RawSecureSocket.connect(host != null ? host : socket.address.host, socket.port, {is_server: false, socket: socket, subscription: subscription, context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols});
    }
    static secureServer(socket, context, opts) {
      let subscription = opts && 'subscription' in opts ? opts.subscription : null;
      let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      socket.readEventsEnabled = false;
      socket.writeEventsEnabled = false;
      return io._RawSecureSocket.connect(socket.address, socket.remotePort, {context: context, is_server: true, socket: socket, subscription: subscription, bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols});
    }
  };
  io.RawSecureSocket[dart.implements] = () => [io.RawSocket];
  dart.setSignature(io.RawSecureSocket, {
    statics: () => ({
      connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
      secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
      secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
    }),
    names: ['connect', 'secure', 'secureServer']
  });
  io.RawSecureServerSocket = class RawSecureServerSocket extends async.Stream$(io.RawSecureSocket) {
    _(socket, context, requestClientCertificate, requireClientCertificate, supportedProtocols) {
      this[_socket] = socket;
      this[_context] = context;
      this.requestClientCertificate = requestClientCertificate;
      this.requireClientCertificate = requireClientCertificate;
      this.supportedProtocols = supportedProtocols;
      this[_controller$0] = null;
      this[_subscription$] = null;
      this[_closed] = false;
      super.new();
      this[_controller$0] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
    }
    static bind(address, port, context, opts) {
      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      let shared = opts && 'shared' in opts ? opts.shared : false;
      return io.RawServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io.RawSecureServerSocket)(dart.fn(serverSocket => new io.RawSecureServerSocket._(serverSocket, context, requestClientCertificate, requireClientCertificate, supportedProtocols), RawServerSocketToRawSecureServerSocket()));
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    get port() {
      return this[_socket].port;
    }
    get address() {
      return this[_socket].address;
    }
    close() {
      this[_closed] = true;
      return this[_socket].close().then(io.RawSecureServerSocket)(dart.fn(_ => this, RawServerSocketToRawSecureServerSocket()));
    }
    [_onData$](connection) {
      let remotePort = null;
      try {
        remotePort = connection.remotePort;
      } catch (e) {
        return;
      }

      io._RawSecureSocket.connect(connection.address, core.int._check(remotePort), {context: this[_context], is_server: true, socket: connection, requestClientCertificate: this.requestClientCertificate, requireClientCertificate: this.requireClientCertificate, supportedProtocols: this.supportedProtocols}).then(dart.dynamic)(dart.fn(secureConnection => {
        if (dart.test(this[_closed])) {
          secureConnection.close();
        } else {
          this[_controller$0].add(secureConnection);
        }
      }, RawSecureSocketTodynamic())).catchError(dart.fn((e, s) => {
        if (!dart.test(this[_closed])) {
          this[_controller$0].addError(e, core.StackTrace._check(s));
        }
      }, dynamicAnddynamicTodynamic$()));
    }
    [_onPauseStateChange]() {
      if (dart.test(this[_controller$0].isPaused)) {
        this[_subscription$].pause();
      } else {
        this[_subscription$].resume();
      }
    }
    [_onSubscriptionStateChange]() {
      if (dart.test(this[_controller$0].hasListener)) {
        this[_subscription$] = this[_socket].listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this[_controller$0], 'close')});
      } else {
        this.close();
      }
    }
    set [_owner](owner) {
      dart.dput(this[_socket], _owner, owner);
    }
  };
  dart.addSimpleTypeTests(io.RawSecureServerSocket);
  dart.defineNamedConstructor(io.RawSecureServerSocket, '_');
  dart.setSignature(io.RawSecureServerSocket, {
    constructors: () => ({_: dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket, io.SecurityContext, core.bool, core.bool, ListOfString()])}),
    fields: () => ({
      [_socket]: io.RawServerSocket,
      [_controller$0]: StreamControllerOfRawSecureSocket(),
      [_subscription$]: StreamSubscriptionOfRawSocket(),
      [_context]: io.SecurityContext,
      requestClientCertificate: core.bool,
      requireClientCertificate: core.bool,
      supportedProtocols: ListOfString(),
      [_closed]: core.bool
    }),
    getters: () => ({
      port: dart.definiteFunctionType(core.int, []),
      address: dart.definiteFunctionType(io.InternetAddress, [])
    }),
    setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSecureSocket), [RawSecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      close: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), []),
      [_onData$]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
      [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
      [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
    names: ['bind']
  });
  io.X509Certificate = class X509Certificate extends core.Object {
    static _() {
      dart.throw(new core.UnsupportedError("X509Certificate constructor"));
    }
  };
  dart.setSignature(io.X509Certificate, {
    constructors: () => ({_: dart.definiteFunctionType(io.X509Certificate, [])})
  });
  io._FilterStatus = class _FilterStatus extends core.Object {
    new() {
      this.progress = false;
      this.readEmpty = true;
      this.writeEmpty = true;
      this.readPlaintextNoLongerEmpty = false;
      this.writePlaintextNoLongerFull = false;
      this.readEncryptedNoLongerFull = false;
      this.writeEncryptedNoLongerEmpty = false;
    }
  };
  dart.setSignature(io._FilterStatus, {
    constructors: () => ({new: dart.definiteFunctionType(io._FilterStatus, [])}),
    fields: () => ({
      progress: core.bool,
      readEmpty: core.bool,
      writeEmpty: core.bool,
      readPlaintextNoLongerEmpty: core.bool,
      writePlaintextNoLongerFull: core.bool,
      readEncryptedNoLongerFull: core.bool,
      writeEncryptedNoLongerEmpty: core.bool
    })
  });
  const _handshakeComplete = Symbol('_handshakeComplete');
  const _status = Symbol('_status');
  const _filterStatus = Symbol('_filterStatus');
  const _secureFilter = Symbol('_secureFilter');
  const _bufferedData = Symbol('_bufferedData');
  const _bufferedDataIndex = Symbol('_bufferedDataIndex');
  const _writeEventsEnabled = Symbol('_writeEventsEnabled');
  const _readEventsEnabled = Symbol('_readEventsEnabled');
  const _pendingReadEvent = Symbol('_pendingReadEvent');
  const _socketClosedRead = Symbol('_socketClosedRead');
  const _socketClosedWrite = Symbol('_socketClosedWrite');
  const _closedRead = Symbol('_closedRead');
  const _closedWrite = Symbol('_closedWrite');
  const _connectPending = Symbol('_connectPending');
  const _filterPending = Symbol('_filterPending');
  const _filterActive = Symbol('_filterActive');
  const _selectedProtocol = Symbol('_selectedProtocol');
  const _secureHandshakeCompleteHandler = Symbol('_secureHandshakeCompleteHandler');
  const _onBadCertificateWrapper = Symbol('_onBadCertificateWrapper');
  const _eventDispatcher = Symbol('_eventDispatcher');
  const _doneHandler = Symbol('_doneHandler');
  const _secureHandshake = Symbol('_secureHandshake');
  const _sendWriteEvent = Symbol('_sendWriteEvent');
  const _completeCloseCompleter = Symbol('_completeCloseCompleter');
  const _close$0 = Symbol('_close');
  const _scheduleReadEvent = Symbol('_scheduleReadEvent');
  const _scheduleFilter = Symbol('_scheduleFilter');
  const _readHandler = Symbol('_readHandler');
  const _writeHandler = Symbol('_writeHandler');
  const _closeHandler = Symbol('_closeHandler');
  const _readSocket = Symbol('_readSocket');
  const _writeSocket = Symbol('_writeSocket');
  const _tryFilter = Symbol('_tryFilter');
  const _pushAllFilterStages = Symbol('_pushAllFilterStages');
  const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
  const _sendReadEvent = Symbol('_sendReadEvent');
  let const$75;
  io.RawSocketEvent = class RawSocketEvent extends core.Object {
    _(value) {
      this[_value$1] = value;
    }
    toString() {
      return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
    }
  };
  dart.defineNamedConstructor(io.RawSocketEvent, '_');
  dart.setSignature(io.RawSocketEvent, {
    constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
    fields: () => ({[_value$1]: core.int}),
    sfields: () => ({
      READ: io.RawSocketEvent,
      WRITE: io.RawSocketEvent,
      READ_CLOSED: io.RawSocketEvent,
      CLOSED: io.RawSocketEvent
    })
  });
  dart.defineLazy(io.RawSocketEvent, {
    get READ() {
      return dart.const(new io.RawSocketEvent._(0));
    },
    get WRITE() {
      return dart.const(new io.RawSocketEvent._(1));
    },
    get READ_CLOSED() {
      return dart.const(new io.RawSocketEvent._(2));
    },
    get CLOSED() {
      return dart.const(new io.RawSocketEvent._(3));
    }
  });
  io._RawSecureSocket = class _RawSecureSocket extends async.Stream$(io.RawSocketEvent) {
    static _isBufferEncrypted(identifier) {
      return dart.notNull(identifier) >= dart.notNull(io._RawSecureSocket.READ_ENCRYPTED);
    }
    static connect(host, requestedPort, opts) {
      let is_server = opts && 'is_server' in opts ? opts.is_server : null;
      let context = opts && 'context' in opts ? opts.context : null;
      let socket = opts && 'socket' in opts ? opts.socket : null;
      let subscription = opts && 'subscription' in opts ? opts.subscription : null;
      let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
      io._RawSecureSocket._verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate);
      if (io.InternetAddress.is(host)) host = dart.dload(host, 'host');
      let address = socket.address;
      if (host != null) {
        address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
      }
      return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
    }
    new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
      this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
      this[_status] = io._RawSecureSocket.HANDSHAKE;
      this[_closeCompleter] = async.Completer.new();
      this[_filterStatus] = new io._FilterStatus();
      this[_secureFilter] = io._SecureFilter.new();
      this.address = address;
      this.is_server = is_server;
      this.context = context;
      this[_socket] = socket;
      this[_socketSubscription] = socketSubscription;
      this[_bufferedData] = bufferedData;
      this.requestClientCertificate = requestClientCertificate;
      this.requireClientCertificate = requireClientCertificate;
      this.onBadCertificate = onBadCertificate;
      this[_controller$0] = null;
      this[_stream$] = null;
      this[_bufferedDataIndex] = 0;
      this[_writeEventsEnabled] = true;
      this[_readEventsEnabled] = true;
      this[_pauseCount$] = 0;
      this[_pendingReadEvent] = false;
      this[_socketClosedRead] = false;
      this[_socketClosedWrite] = false;
      this[_closedRead] = false;
      this[_closedWrite] = false;
      this[_connectPending] = true;
      this[_filterPending] = false;
      this[_filterActive] = false;
      this[_selectedProtocol] = null;
      super.new();
      if (this.context == null) {
        this.context = io.SecurityContext.defaultContext;
      }
      this[_controller$0] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
      this[_stream$] = this[_controller$0].stream;
      this[_secureFilter].init();
      this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
      if (this.onBadCertificate != null) {
        this[_secureFilter].registerBadCertificateCallback(dart.bind(this, _onBadCertificateWrapper));
      }
      this[_socket].readEventsEnabled = true;
      this[_socket].writeEventsEnabled = false;
      if (this[_socketSubscription] == null) {
        this[_socketSubscription] = this[_socket].listen(dart.bind(this, _eventDispatcher), {onError: dart.bind(this, _reportError), onDone: dart.bind(this, _doneHandler)});
      } else {
        if (dart.test(this[_socketSubscription].isPaused)) {
          this[_socket].close();
          dart.throw(new core.ArgumentError("Subscription passed to TLS upgrade is paused"));
        }
        let s = this[_socket];
        if (dart.test(dart.dload(dart.dload(s, _socket), 'closedReadEventSent'))) {
          this[_eventDispatcher](io.RawSocketEvent.READ_CLOSED);
        }
        let _ = this[_socketSubscription];
        _.onData(dart.bind(this, _eventDispatcher));
        _.onError(dart.bind(this, _reportError));
        _.onDone(dart.bind(this, _doneHandler));
      }
      try {
        let encodedProtocols = io.SecurityContext._protocolsToLengthEncoding(supportedProtocols);
        this[_secureFilter].connect(this.address.host, this.context, this.is_server, dart.test(this.requestClientCertificate) || dart.test(this.requireClientCertificate), this.requireClientCertificate, encodedProtocols);
        this[_secureHandshake]();
      } catch (e) {
        let s = dart.stackTrace(e);
        this[_reportError](e, s);
      }

    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      this[_sendWriteEvent]();
      return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
      if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
        dart.throw(new core.ArgumentError("host is not a String or an InternetAddress"));
      }
      if (!(typeof requestedPort == 'number')) {
        dart.throw(new core.ArgumentError("requestedPort is not an int"));
      }
      if (dart.notNull(requestedPort) < 0 || dart.notNull(requestedPort) > 65535) {
        dart.throw(new core.ArgumentError("requestedPort is not in the range 0..65535"));
      }
      if (!(typeof requestClientCertificate == 'boolean')) {
        dart.throw(new core.ArgumentError("requestClientCertificate is not a bool"));
      }
      if (!(typeof requireClientCertificate == 'boolean')) {
        dart.throw(new core.ArgumentError("requireClientCertificate is not a bool"));
      }
      if (onBadCertificate != null && !core.Function.is(onBadCertificate)) {
        dart.throw(new core.ArgumentError("onBadCertificate is not null or a Function"));
      }
    }
    get port() {
      return this[_socket].port;
    }
    get remoteAddress() {
      return this[_socket].remoteAddress;
    }
    get remotePort() {
      return this[_socket].remotePort;
    }
    set [_owner](owner) {
      dart.dput(this[_socket], _owner, owner);
    }
    available() {
      return this[_status] != io._RawSecureSocket.CONNECTED ? 0 : this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).length;
    }
    close() {
      this.shutdown(io.SocketDirection.BOTH);
      return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
    }
    [_completeCloseCompleter](dummy) {
      if (dummy === void 0) dummy = null;
      if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
    }
    [_close$0]() {
      this[_closedWrite] = true;
      this[_closedRead] = true;
      if (this[_socket] != null) {
        this[_socket].close().then(dart.dynamic)(dart.bind(this, _completeCloseCompleter));
      } else {
        this[_completeCloseCompleter]();
      }
      this[_socketClosedWrite] = true;
      this[_socketClosedRead] = true;
      if (!dart.test(this[_filterActive]) && this[_secureFilter] != null) {
        this[_secureFilter].destroy();
        this[_secureFilter] = null;
      }
      if (this[_socketSubscription] != null) {
        this[_socketSubscription].cancel();
      }
      this[_controller$0].close();
      this[_status] = io._RawSecureSocket.CLOSED;
    }
    shutdown(direction) {
      if (dart.equals(direction, io.SocketDirection.SEND) || dart.equals(direction, io.SocketDirection.BOTH)) {
        this[_closedWrite] = true;
        if (dart.test(this[_filterStatus].writeEmpty)) {
          this[_socket].shutdown(io.SocketDirection.SEND);
          this[_socketClosedWrite] = true;
          if (dart.test(this[_closedRead])) {
            this[_close$0]();
          }
        }
      }
      if (dart.equals(direction, io.SocketDirection.RECEIVE) || dart.equals(direction, io.SocketDirection.BOTH)) {
        this[_closedRead] = true;
        this[_socketClosedRead] = true;
        this[_socket].shutdown(io.SocketDirection.RECEIVE);
        if (dart.test(this[_socketClosedWrite])) {
          this[_close$0]();
        }
      }
    }
    get writeEventsEnabled() {
      return this[_writeEventsEnabled];
    }
    set writeEventsEnabled(value) {
      this[_writeEventsEnabled] = value;
      if (dart.test(value)) {
        async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid$()));
      }
    }
    get readEventsEnabled() {
      return this[_readEventsEnabled];
    }
    set readEventsEnabled(value) {
      this[_readEventsEnabled] = value;
      this[_scheduleReadEvent]();
    }
    read(length) {
      if (length === void 0) length = null;
      if (length != null && (!(typeof length == 'number') || dart.notNull(length) < 0)) {
        dart.throw(new core.ArgumentError(dart.str`Invalid length parameter in SecureSocket.read (length: ${length})`));
      }
      if (dart.test(this[_closedRead])) {
        dart.throw(new io.SocketException("Reading from a closed socket"));
      }
      if (this[_status] != io._RawSecureSocket.CONNECTED) {
        return null;
      }
      let result = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).read(length);
      this[_scheduleFilter]();
      return result;
    }
    write(data, offset, bytes) {
      if (offset === void 0) offset = null;
      if (bytes === void 0) bytes = null;
      if (bytes != null && (!(typeof bytes == 'number') || dart.notNull(bytes) < 0)) {
        dart.throw(new core.ArgumentError(dart.str`Invalid bytes parameter in SecureSocket.read (bytes: ${bytes})`));
      }
      if (offset != null && (!(typeof offset == 'number') || dart.notNull(offset) < 0)) {
        dart.throw(new core.ArgumentError(dart.str`Invalid offset parameter in SecureSocket.read (offset: ${offset})`));
      }
      if (dart.test(this[_closedWrite])) {
        this[_controller$0].addError(new io.SocketException("Writing to a closed socket"));
        return 0;
      }
      if (this[_status] != io._RawSecureSocket.CONNECTED) return 0;
      if (offset == null) offset = 0;
      if (bytes == null) bytes = dart.notNull(data[dartx.length]) - dart.notNull(offset);
      let written = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).write(data, offset, bytes);
      if (dart.notNull(written) > 0) {
        this[_filterStatus].writeEmpty = false;
      }
      this[_scheduleFilter]();
      return written;
    }
    get peerCertificate() {
      return this[_secureFilter].peerCertificate;
    }
    get selectedProtocol() {
      return this[_selectedProtocol];
    }
    [_onBadCertificateWrapper](certificate) {
      if (this.onBadCertificate == null) return false;
      let result = dart.dcall(this.onBadCertificate, certificate);
      if (typeof result == 'boolean') return result;
      dart.throw(new io.HandshakeException(dart.str`onBadCertificate callback returned non-boolean ${result}`));
    }
    setOption(option, enabled) {
      if (this[_socket] == null) return false;
      return this[_socket].setOption(option, enabled);
    }
    [_eventDispatcher](event) {
      try {
        if (dart.equals(event, io.RawSocketEvent.READ)) {
          this[_readHandler]();
        } else if (dart.equals(event, io.RawSocketEvent.WRITE)) {
          this[_writeHandler]();
        } else if (dart.equals(event, io.RawSocketEvent.READ_CLOSED)) {
          this[_closeHandler]();
        }
      } catch (e) {
        let stackTrace = dart.stackTrace(e);
        this[_reportError](e, stackTrace);
      }

    }
    [_readHandler]() {
      this[_readSocket]();
      this[_scheduleFilter]();
    }
    [_writeHandler]() {
      this[_writeSocket]();
      this[_scheduleFilter]();
    }
    [_doneHandler]() {
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_close$0]();
      }
    }
    [_reportError](e, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (this[_status] == io._RawSecureSocket.CLOSED) {
        return;
      } else if (dart.test(this[_connectPending])) {
        this[_handshakeComplete].completeError(e, stackTrace);
      } else {
        this[_controller$0].addError(e, stackTrace);
      }
      this[_close$0]();
    }
    [_closeHandler]() {
      if (this[_status] == io._RawSecureSocket.CONNECTED) {
        if (dart.test(this[_closedRead])) return;
        this[_socketClosedRead] = true;
        if (dart.test(this[_filterStatus].readEmpty)) {
          this[_closedRead] = true;
          this[_controller$0].add(io.RawSocketEvent.READ_CLOSED);
          if (dart.test(this[_socketClosedWrite])) {
            this[_close$0]();
          }
        } else {
          this[_scheduleFilter]();
        }
      } else if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
        this[_socketClosedRead] = true;
        if (dart.test(this[_filterStatus].readEmpty)) {
          this[_reportError](new io.HandshakeException('Connection terminated during handshake'), null);
        } else {
          this[_secureHandshake]();
        }
      }
    }
    [_secureHandshake]() {
      try {
        this[_secureFilter].handshake();
        this[_filterStatus].writeEmpty = false;
        this[_readSocket]();
        this[_writeSocket]();
        this[_scheduleFilter]();
      } catch (e) {
        let stackTrace = dart.stackTrace(e);
        this[_reportError](e, stackTrace);
      }

    }
    renegotiate(opts) {
      let useSessionCache = opts && 'useSessionCache' in opts ? opts.useSessionCache : true;
      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
      if (this[_status] != io._RawSecureSocket.CONNECTED) {
        dart.throw(new io.HandshakeException("Called renegotiate on a non-connected socket"));
      }
      this[_secureFilter].renegotiate(useSessionCache, requestClientCertificate, requireClientCertificate);
      this[_status] = io._RawSecureSocket.HANDSHAKE;
      this[_filterStatus].writeEmpty = false;
      this[_scheduleFilter]();
    }
    [_secureHandshakeCompleteHandler]() {
      this[_status] = io._RawSecureSocket.CONNECTED;
      if (dart.test(this[_connectPending])) {
        this[_connectPending] = false;
        try {
          this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
          async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid$()));
        } catch (error) {
          let stack = dart.stackTrace(error);
          this[_handshakeComplete].completeError(error, stack);
        }

      }
    }
    [_onPauseStateChange]() {
      if (dart.test(this[_controller$0].isPaused)) {
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
      } else {
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
        if (this[_pauseCount$] == 0) {
          this[_scheduleReadEvent]();
          this[_sendWriteEvent]();
        }
      }
      if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
        if (dart.test(this[_controller$0].isPaused)) {
          this[_socketSubscription].pause();
        } else {
          this[_socketSubscription].resume();
        }
      }
    }
    [_onSubscriptionStateChange]() {
      if (dart.test(this[_controller$0].hasListener)) {
      }
    }
    [_scheduleFilter]() {
      this[_filterPending] = true;
      this[_tryFilter]();
    }
    [_tryFilter]() {
      if (this[_status] == io._RawSecureSocket.CLOSED) {
        return;
      }
      if (dart.test(this[_filterPending]) && !dart.test(this[_filterActive])) {
        this[_filterActive] = true;
        this[_filterPending] = false;
        this[_pushAllFilterStages]().then(dart.dynamic)(dart.fn(status => {
          this[_filterStatus] = status;
          this[_filterActive] = false;
          if (this[_status] == io._RawSecureSocket.CLOSED) {
            this[_secureFilter].destroy();
            this[_secureFilter] = null;
            return;
          }
          this[_socket].readEventsEnabled = true;
          if (dart.test(this[_filterStatus].writeEmpty) && dart.test(this[_closedWrite]) && !dart.test(this[_socketClosedWrite])) {
            this.shutdown(io.SocketDirection.SEND);
            if (this[_status] == io._RawSecureSocket.CLOSED) {
              return;
            }
          }
          if (dart.test(this[_filterStatus].readEmpty) && dart.test(this[_socketClosedRead]) && !dart.test(this[_closedRead])) {
            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
              this[_secureFilter].handshake();
              if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
                dart.throw(new io.HandshakeException('Connection terminated during handshake'));
              }
            }
            this[_closeHandler]();
          }
          if (this[_status] == io._RawSecureSocket.CLOSED) {
            return;
          }
          if (dart.test(this[_filterStatus].progress)) {
            this[_filterPending] = true;
            if (dart.test(this[_filterStatus].writeEncryptedNoLongerEmpty)) {
              this[_writeSocket]();
            }
            if (dart.test(this[_filterStatus].writePlaintextNoLongerFull)) {
              this[_sendWriteEvent]();
            }
            if (dart.test(this[_filterStatus].readEncryptedNoLongerFull)) {
              this[_readSocket]();
            }
            if (dart.test(this[_filterStatus].readPlaintextNoLongerEmpty)) {
              this[_scheduleReadEvent]();
            }
            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
              this[_secureHandshake]();
            }
          }
          this[_tryFilter]();
        }, _FilterStatusTodynamic())).catchError(dart.bind(this, _reportError));
      }
    }
    [_readSocketOrBufferedData](bytes) {
      if (this[_bufferedData] != null) {
        if (dart.notNull(bytes) > dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex])) {
          bytes = dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex]);
        }
        let result = this[_bufferedData][dartx.sublist](this[_bufferedDataIndex], dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes));
        this[_bufferedDataIndex] = dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes);
        if (this[_bufferedData][dartx.length] == this[_bufferedDataIndex]) {
          this[_bufferedData] = null;
        }
        return result;
      } else if (!dart.test(this[_socketClosedRead])) {
        return this[_socket].read(bytes);
      } else {
        return null;
      }
    }
    [_readSocket]() {
      if (this[_status] == io._RawSecureSocket.CLOSED) return;
      let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
      if (dart.notNull(buffer.writeFromSource(dart.bind(this, _readSocketOrBufferedData))) > 0) {
        this[_filterStatus].readEmpty = false;
      } else {
        this[_socket].readEventsEnabled = false;
      }
    }
    [_writeSocket]() {
      if (dart.test(this[_socketClosedWrite])) return;
      let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
      if (dart.test(buffer.readToSocket(this[_socket]))) {
        this[_socket].writeEventsEnabled = true;
      }
    }
    [_scheduleReadEvent]() {
      if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
        this[_pendingReadEvent] = true;
        async.Timer.run(dart.bind(this, _sendReadEvent));
      }
    }
    [_sendReadEvent]() {
      this[_pendingReadEvent] = false;
      if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
        this[_controller$0].add(io.RawSocketEvent.READ);
        this[_scheduleReadEvent]();
      }
    }
    [_sendWriteEvent]() {
      if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
        this[_writeEventsEnabled] = false;
        this[_controller$0].add(io.RawSocketEvent.WRITE);
      }
    }
    [_pushAllFilterStages]() {
      let wasInHandshake = this[_status] != io._RawSecureSocket.CONNECTED;
      let args = core.List.new(2 + dart.notNull(io._RawSecureSocket.NUM_BUFFERS) * 2);
      args[dartx._set](0, this[_secureFilter][_pointer]());
      args[dartx._set](1, wasInHandshake);
      let bufs = this[_secureFilter].buffers;
      for (let i = 0; i < dart.notNull(io._RawSecureSocket.NUM_BUFFERS); ++i) {
        args[dartx._set](2 * i + 2, bufs[dartx._get](i).start);
        args[dartx._set](2 * i + 3, bufs[dartx._get](i).end);
      }
      return io._IOService._dispatch(io._SSL_PROCESS_FILTER, args).then(io._FilterStatus)(dart.fn(response => {
        if (dart.equals(dart.dload(response, 'length'), 2)) {
          if (wasInHandshake) {
            this[_reportError](new io.HandshakeException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
          } else {
            this[_reportError](new io.TlsException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
          }
        }
        function start(index) {
          return core.int._check(dart.dindex(response, 2 * dart.notNull(index)));
        }
        dart.fn(start, intToint());
        function end(index) {
          return core.int._check(dart.dindex(response, 2 * dart.notNull(index) + 1));
        }
        dart.fn(end, intToint());
        let status = new io._FilterStatus();
        status.writeEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).isEmpty) && start(io._RawSecureSocket.WRITE_ENCRYPTED) == end(io._RawSecureSocket.WRITE_ENCRYPTED);
        if (wasInHandshake) status.writeEmpty = false;
        status.readEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED).isEmpty) && start(io._RawSecureSocket.READ_PLAINTEXT) == end(io._RawSecureSocket.READ_PLAINTEXT);
        let buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT);
        let new_start = start(io._RawSecureSocket.WRITE_PLAINTEXT);
        if (new_start != buffer.start) {
          status.progress = true;
          if (buffer.free == 0) {
            status.writePlaintextNoLongerFull = true;
          }
          buffer.start = new_start;
        }
        buffer = bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
        new_start = start(io._RawSecureSocket.READ_ENCRYPTED);
        if (new_start != buffer.start) {
          status.progress = true;
          if (buffer.free == 0) {
            status.readEncryptedNoLongerFull = true;
          }
          buffer.start = new_start;
        }
        buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
        let new_end = end(io._RawSecureSocket.WRITE_ENCRYPTED);
        if (new_end != buffer.end) {
          status.progress = true;
          if (buffer.length == 0) {
            status.writeEncryptedNoLongerEmpty = true;
          }
          buffer.end = new_end;
        }
        buffer = bufs[dartx._get](io._RawSecureSocket.READ_PLAINTEXT);
        new_end = end(io._RawSecureSocket.READ_PLAINTEXT);
        if (new_end != buffer.end) {
          status.progress = true;
          if (buffer.length == 0) {
            status.readPlaintextNoLongerEmpty = true;
          }
          buffer.end = new_end;
        }
        return status;
      }, dynamicTo_FilterStatus()));
    }
  };
  dart.addSimpleTypeTests(io._RawSecureSocket);
  io._RawSecureSocket[dart.implements] = () => [io.RawSecureSocket];
  dart.setSignature(io._RawSecureSocket, {
    constructors: () => ({new: dart.definiteFunctionType(io._RawSecureSocket, [io.InternetAddress, core.int, core.bool, io.SecurityContext, io.RawSocket, StreamSubscriptionOfRawSocketEvent(), ListOfint(), core.bool, core.bool, X509CertificateTodynamic(), ListOfString()])}),
    fields: () => ({
      [_socket]: io.RawSocket,
      [_handshakeComplete]: CompleterOf_RawSecureSocket(),
      [_controller$0]: StreamControllerOfRawSocketEvent(),
      [_stream$]: StreamOfRawSocketEvent(),
      [_socketSubscription]: StreamSubscriptionOfRawSocketEvent(),
      [_bufferedData]: ListOfint(),
      [_bufferedDataIndex]: core.int,
      address: io.InternetAddress,
      is_server: core.bool,
      context: io.SecurityContext,
      requestClientCertificate: core.bool,
      requireClientCertificate: core.bool,
      onBadCertificate: core.Function,
      [_status]: core.int,
      [_writeEventsEnabled]: core.bool,
      [_readEventsEnabled]: core.bool,
      [_pauseCount$]: core.int,
      [_pendingReadEvent]: core.bool,
      [_socketClosedRead]: core.bool,
      [_socketClosedWrite]: core.bool,
      [_closedRead]: core.bool,
      [_closedWrite]: core.bool,
      [_closeCompleter]: async.Completer,
      [_filterStatus]: io._FilterStatus,
      [_connectPending]: core.bool,
      [_filterPending]: core.bool,
      [_filterActive]: core.bool,
      [_secureFilter]: io._SecureFilter,
      [_selectedProtocol]: core.String
    }),
    getters: () => ({
      port: dart.definiteFunctionType(core.int, []),
      remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
      remotePort: dart.definiteFunctionType(core.int, []),
      writeEventsEnabled: dart.definiteFunctionType(core.bool, []),
      readEventsEnabled: dart.definiteFunctionType(core.bool, []),
      peerCertificate: dart.definiteFunctionType(io.X509Certificate, []),
      selectedProtocol: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({
      [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      writeEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool]),
      readEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool])
    }),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      available: dart.definiteFunctionType(core.int, []),
      close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
      [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
      [_close$0]: dart.definiteFunctionType(dart.void, []),
      shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
      read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
      write: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
      [_onBadCertificateWrapper]: dart.definiteFunctionType(core.bool, [io.X509Certificate]),
      setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
      [_eventDispatcher]: dart.definiteFunctionType(dart.void, [io.RawSocketEvent]),
      [_readHandler]: dart.definiteFunctionType(dart.void, []),
      [_writeHandler]: dart.definiteFunctionType(dart.void, []),
      [_doneHandler]: dart.definiteFunctionType(dart.void, []),
      [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      [_closeHandler]: dart.definiteFunctionType(dart.void, []),
      [_secureHandshake]: dart.definiteFunctionType(dart.void, []),
      renegotiate: dart.definiteFunctionType(dart.void, [], {useSessionCache: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool}),
      [_secureHandshakeCompleteHandler]: dart.definiteFunctionType(dart.void, []),
      [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
      [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, []),
      [_scheduleFilter]: dart.definiteFunctionType(dart.void, []),
      [_tryFilter]: dart.definiteFunctionType(dart.void, []),
      [_readSocketOrBufferedData]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
      [_readSocket]: dart.definiteFunctionType(dart.void, []),
      [_writeSocket]: dart.definiteFunctionType(dart.void, []),
      [_scheduleReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
      [_sendReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
      [_sendWriteEvent]: dart.definiteFunctionType(dart.dynamic, []),
      [_pushAllFilterStages]: dart.definiteFunctionType(async.Future$(io._FilterStatus), [])
    }),
    sfields: () => ({
      HANDSHAKE: core.int,
      CONNECTED: core.int,
      CLOSED: core.int,
      READ_PLAINTEXT: core.int,
      WRITE_PLAINTEXT: core.int,
      READ_ENCRYPTED: core.int,
      WRITE_ENCRYPTED: core.int,
      NUM_BUFFERS: core.int
    }),
    statics: () => ({
      _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
      connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
      _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
    }),
    names: ['_isBufferEncrypted', 'connect', '_verifyFields']
  });
  io._RawSecureSocket.HANDSHAKE = 201;
  io._RawSecureSocket.CONNECTED = 202;
  io._RawSecureSocket.CLOSED = 203;
  io._RawSecureSocket.READ_PLAINTEXT = 0;
  io._RawSecureSocket.WRITE_PLAINTEXT = 1;
  io._RawSecureSocket.READ_ENCRYPTED = 2;
  io._RawSecureSocket.WRITE_ENCRYPTED = 3;
  io._RawSecureSocket.NUM_BUFFERS = 4;
  io._ExternalBuffer = class _ExternalBuffer extends core.Object {
    new(size) {
      this.size = size;
      this.data = null;
      this.start = null;
      this.end = null;
      this.start = core.int._check(this.end = core.int._check(dart.dsend(this.size, '~/', 2)));
    }
    advanceStart(bytes) {
      dart.assert(dart.notNull(this.start) > dart.notNull(this.end) || dart.notNull(this.start) + dart.notNull(bytes) <= dart.notNull(this.end));
      this.start = dart.notNull(this.start) + dart.notNull(bytes);
      if (dart.notNull(this.start) >= dart.notNull(core.num._check(this.size))) {
        this.start = dart.notNull(this.start) - dart.notNull(core.num._check(this.size));
        dart.assert(dart.notNull(this.start) <= dart.notNull(this.end));
        dart.assert(dart.notNull(this.start) < dart.notNull(core.num._check(this.size)));
      }
    }
    advanceEnd(bytes) {
      dart.assert(dart.notNull(this.start) <= dart.notNull(this.end) || dart.notNull(this.start) > dart.notNull(this.end) + dart.notNull(bytes));
      this.end = dart.notNull(this.end) + dart.notNull(bytes);
      if (dart.notNull(this.end) >= dart.notNull(core.num._check(this.size))) {
        this.end = dart.notNull(this.end) - dart.notNull(core.num._check(this.size));
        dart.assert(dart.notNull(this.end) < dart.notNull(this.start));
        dart.assert(dart.notNull(this.end) < dart.notNull(core.num._check(this.size)));
      }
    }
    get isEmpty() {
      return this.end == this.start;
    }
    get length() {
      return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(dart.dsend(this.size, '+', this.end), '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
    }
    get linearLength() {
      return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(this.size, '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
    }
    get free() {
      return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.notNull(this.start) - dart.notNull(this.end) - 1 : dart.dsend(dart.dsend(dart.dsend(this.size, '+', this.start), '-', this.end), '-', 1));
    }
    get linearFree() {
      if (dart.notNull(this.start) > dart.notNull(this.end)) return dart.notNull(this.start) - dart.notNull(this.end) - 1;
      if (this.start == 0) return core.int._check(dart.dsend(dart.dsend(this.size, '-', this.end), '-', 1));
      return core.int._check(dart.dsend(this.size, '-', this.end));
    }
    read(bytes) {
      if (bytes == null) {
        bytes = this.length;
      } else {
        bytes = math.min(core.int)(bytes, this.length);
      }
      if (bytes == 0) return null;
      let result = typed_data.Uint8List.new(bytes);
      let bytesRead = 0;
      while (dart.notNull(bytesRead) < dart.notNull(bytes)) {
        let toRead = math.min(core.int)(dart.notNull(bytes) - dart.notNull(bytesRead), this.linearLength);
        result[dartx.setRange](bytesRead, dart.notNull(bytesRead) + dart.notNull(toRead), this.data, this.start);
        this.advanceStart(toRead);
        bytesRead = dart.notNull(bytesRead) + dart.notNull(toRead);
      }
      return result;
    }
    write(inputData, offset, bytes) {
      if (dart.notNull(bytes) > dart.notNull(this.free)) {
        bytes = this.free;
      }
      let written = 0;
      let toWrite = math.min(core.int)(bytes, this.linearFree);
      while (dart.notNull(toWrite) > 0) {
        this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(toWrite), inputData, offset);
        this.advanceEnd(toWrite);
        offset = dart.notNull(offset) + dart.notNull(toWrite);
        written = dart.notNull(written) + dart.notNull(toWrite);
        toWrite = math.min(core.int)(dart.notNull(bytes) - dart.notNull(written), this.linearFree);
      }
      return written;
    }
    writeFromSource(getData) {
      let written = 0;
      let toWrite = this.linearFree;
      while (dart.notNull(toWrite) > 0) {
        let inputData = getData(toWrite);
        if (inputData == null || inputData[dartx.length] == 0) break;
        let len = inputData[dartx.length];
        this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(len), inputData);
        this.advanceEnd(len);
        written = dart.notNull(written) + dart.notNull(len);
        toWrite = this.linearFree;
      }
      return written;
    }
    readToSocket(socket) {
      while (true) {
        let toWrite = this.linearLength;
        if (toWrite == 0) return false;
        let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
        this.advanceStart(bytes);
        if (dart.notNull(bytes) < dart.notNull(toWrite)) {
          return true;
        }
      }
    }
  };
  dart.setSignature(io._ExternalBuffer, {
    constructors: () => ({new: dart.definiteFunctionType(io._ExternalBuffer, [dart.dynamic])}),
    fields: () => ({
      data: core.List,
      start: core.int,
      end: core.int,
      size: dart.dynamic
    }),
    getters: () => ({
      isEmpty: dart.definiteFunctionType(core.bool, []),
      length: dart.definiteFunctionType(core.int, []),
      linearLength: dart.definiteFunctionType(core.int, []),
      free: dart.definiteFunctionType(core.int, []),
      linearFree: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      advanceStart: dart.definiteFunctionType(dart.void, [core.int]),
      advanceEnd: dart.definiteFunctionType(dart.void, [core.int]),
      read: dart.definiteFunctionType(core.List$(core.int), [core.int]),
      write: dart.definiteFunctionType(core.int, [ListOfint(), core.int, core.int]),
      writeFromSource: dart.definiteFunctionType(core.int, [intToListOfint()]),
      readToSocket: dart.definiteFunctionType(core.bool, [io.RawSocket])
    })
  });
  io._SecureFilter = class _SecureFilter extends core.Object {
    static new() {
      dart.throw(new core.UnsupportedError("_SecureFilter._SecureFilter"));
    }
  };
  dart.setSignature(io._SecureFilter, {
    constructors: () => ({new: dart.definiteFunctionType(io._SecureFilter, [])})
  });
  io.TlsException = class TlsException extends core.Object {
    new(message, osError) {
      if (message === void 0) message = "";
      if (osError === void 0) osError = null;
      TlsException.prototype._.call(this, "TlsException", message, osError);
    }
    _(type, message, osError) {
      this.type = type;
      this.message = message;
      this.osError = osError;
    }
    toString() {
      let sb = new core.StringBuffer();
      sb.write(this.type);
      if (!dart.test(this.message[dartx.isEmpty])) {
        sb.write(dart.str`: ${this.message}`);
        if (this.osError != null) {
          sb.write(dart.str` (${this.osError})`);
        }
      } else if (this.osError != null) {
        sb.write(dart.str`: ${this.osError}`);
      }
      return sb.toString();
    }
  };
  dart.defineNamedConstructor(io.TlsException, '_');
  io.TlsException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.TlsException, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.TlsException, [], [core.String, io.OSError]),
      _: dart.definiteFunctionType(io.TlsException, [core.String, core.String, io.OSError])
    }),
    fields: () => ({
      type: core.String,
      message: core.String,
      osError: io.OSError
    })
  });
  io.HandshakeException = class HandshakeException extends io.TlsException {
    new(message, osError) {
      if (message === void 0) message = "";
      if (osError === void 0) osError = null;
      super._("HandshakeException", message, osError);
    }
  };
  dart.setSignature(io.HandshakeException, {
    constructors: () => ({new: dart.definiteFunctionType(io.HandshakeException, [], [core.String, io.OSError])})
  });
  io.CertificateException = class CertificateException extends io.TlsException {
    new(message, osError) {
      if (message === void 0) message = "";
      if (osError === void 0) osError = null;
      super._("CertificateException", message, osError);
    }
  };
  dart.setSignature(io.CertificateException, {
    constructors: () => ({new: dart.definiteFunctionType(io.CertificateException, [], [core.String, io.OSError])})
  });
  io.SecurityContext = class SecurityContext extends core.Object {
    static new() {
      dart.throw(new core.UnsupportedError("SecurityContext constructor"));
    }
    static get defaultContext() {
      dart.throw(new core.UnsupportedError("default SecurityContext getter"));
    }
    static get alpnSupported() {
      dart.throw(new core.UnsupportedError("SecurityContext alpnSupported getter"));
    }
    static _protocolsToLengthEncoding(protocols) {
      if (protocols == null || protocols[dartx.length] == 0) {
        return typed_data.Uint8List.new(0);
      }
      let protocolsLength = protocols[dartx.length];
      let expectedLength = protocolsLength;
      for (let i = 0; i < dart.notNull(protocolsLength); i++) {
        let length = protocols[dartx._get](i)[dartx.length];
        if (dart.notNull(length) > 0 && dart.notNull(length) <= 255) {
          expectedLength = dart.notNull(expectedLength) + dart.notNull(length);
        } else {
          dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${length}).`));
        }
      }
      if (dart.notNull(expectedLength) >= 1 << 13) {
        dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
      }
      let bytes = typed_data.Uint8List.new(expectedLength);
      let bytesOffset = 0;
      for (let i = 0; i < dart.notNull(protocolsLength); i++) {
        let proto = protocols[dartx._get](i);
        bytes[dartx._set](bytesOffset++, proto[dartx.length]);
        let bits = 0;
        for (let j = 0; j < dart.notNull(proto[dartx.length]); j++) {
          let char = proto[dartx.codeUnitAt](j);
          bits = (dart.notNull(bits) | dart.notNull(char)) >>> 0;
          bytes[dartx._set](bytesOffset++, dart.notNull(char) & 255);
        }
        if (dart.notNull(bits) > 127) {
          return io.SecurityContext._protocolsToLengthEncodingNonAsciiBailout(protocols);
        }
      }
      return bytes;
    }
    static _protocolsToLengthEncodingNonAsciiBailout(protocols) {
      function addProtocol(outBytes, protocol) {
        let protocolBytes = convert.UTF8.encode(protocol);
        let len = protocolBytes[dartx.length];
        if (dart.notNull(len) > 255) {
          dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${len})`));
        }
        outBytes[dartx.add](len);
        outBytes[dartx.addAll](protocolBytes);
      }
      dart.fn(addProtocol, ListOfintAndStringTovoid());
      let bytes = JSArrayOfint().of([]);
      for (let i = 0; i < dart.notNull(protocols[dartx.length]); i++) {
        addProtocol(bytes, protocols[dartx._get](i));
      }
      if (dart.notNull(bytes[dartx.length]) >= 1 << 13) {
        dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
      }
      return typed_data.Uint8List.fromList(bytes);
    }
  };
  dart.setSignature(io.SecurityContext, {
    constructors: () => ({new: dart.definiteFunctionType(io.SecurityContext, [])}),
    sgetters: () => ({
      defaultContext: dart.definiteFunctionType(io.SecurityContext, []),
      alpnSupported: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      _protocolsToLengthEncoding: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()]),
      _protocolsToLengthEncodingNonAsciiBailout: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()])
    }),
    names: ['_protocolsToLengthEncoding', '_protocolsToLengthEncodingNonAsciiBailout']
  });
  io._nextServiceId = 1;
  io.InternetAddressType = class InternetAddressType extends core.Object {
    _(value) {
      this[_value$1] = value;
    }
    static _from(value) {
      if (value == 0) return io.InternetAddressType.IP_V4;
      if (value == 1) return io.InternetAddressType.IP_V6;
      dart.throw(new core.ArgumentError(dart.str`Invalid type: ${value}`));
    }
    get name() {
      switch (this[_value$1]) {
        case -1:
        {
          return "ANY";
        }
        case 0:
        {
          return "IP_V4";
        }
        case 1:
        {
          return "IP_V6";
        }
        default:
        {
          dart.throw(new core.ArgumentError("Invalid InternetAddress"));
        }
      }
    }
    toString() {
      return dart.str`InternetAddressType: ${this.name}`;
    }
  };
  dart.defineNamedConstructor(io.InternetAddressType, '_');
  dart.setSignature(io.InternetAddressType, {
    constructors: () => ({
      _: dart.definiteFunctionType(io.InternetAddressType, [core.int]),
      _from: dart.definiteFunctionType(io.InternetAddressType, [core.int])
    }),
    fields: () => ({[_value$1]: core.int}),
    getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
    sfields: () => ({
      IP_V4: io.InternetAddressType,
      IP_V6: io.InternetAddressType,
      ANY: io.InternetAddressType
    })
  });
  dart.defineLazy(io.InternetAddressType, {
    get IP_V4() {
      return dart.const(new io.InternetAddressType._(0));
    },
    get IP_V6() {
      return dart.const(new io.InternetAddressType._(1));
    },
    get ANY() {
      return dart.const(new io.InternetAddressType._(-1));
    }
  });
  io.InternetAddress = class InternetAddress extends core.Object {
    static get LOOPBACK_IP_V4() {
      dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V4"));
    }
    static get LOOPBACK_IP_V6() {
      dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V6"));
    }
    static get ANY_IP_V4() {
      dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V4"));
    }
    static get ANY_IP_V6() {
      dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V6"));
    }
    static new(address) {
      dart.throw(new core.UnsupportedError("InternetAddress"));
    }
    static lookup(host, opts) {
      let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
      dart.throw(new core.UnsupportedError("InternetAddress.lookup"));
    }
    static _cloneWithNewHost(address, host) {
      dart.throw(new core.UnsupportedError("InternetAddress._cloneWithNewHost"));
    }
  };
  dart.setSignature(io.InternetAddress, {
    constructors: () => ({new: dart.definiteFunctionType(io.InternetAddress, [core.String])}),
    fields: () => ({type: io.InternetAddressType}),
    sgetters: () => ({
      LOOPBACK_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
      LOOPBACK_IP_V6: dart.definiteFunctionType(io.InternetAddress, []),
      ANY_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
      ANY_IP_V6: dart.definiteFunctionType(io.InternetAddress, [])
    }),
    statics: () => ({
      lookup: dart.definiteFunctionType(async.Future$(core.List$(io.InternetAddress)), [core.String], {type: io.InternetAddressType}),
      _cloneWithNewHost: dart.definiteFunctionType(io.InternetAddress, [io.InternetAddress, core.String])
    }),
    names: ['lookup', '_cloneWithNewHost']
  });
  io.NetworkInterface = class NetworkInterface extends core.Object {
    static get listSupported() {
      dart.throw(new core.UnsupportedError("NetworkInterface.listSupported"));
    }
    static list(opts) {
      let includeLoopback = opts && 'includeLoopback' in opts ? opts.includeLoopback : false;
      let includeLinkLocal = opts && 'includeLinkLocal' in opts ? opts.includeLinkLocal : false;
      let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
      dart.throw(new core.UnsupportedError("NetworkInterface.list"));
    }
  };
  dart.setSignature(io.NetworkInterface, {
    sgetters: () => ({listSupported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({list: dart.definiteFunctionType(async.Future$(core.List$(io.NetworkInterface)), [], {includeLoopback: core.bool, includeLinkLocal: core.bool, type: io.InternetAddressType})}),
    names: ['list']
  });
  io.RawServerSocket = class RawServerSocket extends core.Object {
    static bind(address, port, opts) {
      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
      let shared = opts && 'shared' in opts ? opts.shared : false;
      dart.throw(new core.UnsupportedError("RawServerSocket.bind"));
    }
  };
  io.RawServerSocket[dart.implements] = () => [StreamOfRawSocket()];
  dart.setSignature(io.RawServerSocket, {
    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
    names: ['bind']
  });
  io.ServerSocket = class ServerSocket extends core.Object {
    static bind(address, port, opts) {
      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
      let shared = opts && 'shared' in opts ? opts.shared : false;
      dart.throw(new core.UnsupportedError("ServerSocket.bind"));
    }
  };
  io.ServerSocket[dart.implements] = () => [StreamOfSocket()];
  dart.setSignature(io.ServerSocket, {
    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.ServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
    names: ['bind']
  });
  io.SocketDirection = class SocketDirection extends core.Object {
    _(value) {
      this[_value$1] = value;
    }
  };
  dart.defineNamedConstructor(io.SocketDirection, '_');
  dart.setSignature(io.SocketDirection, {
    constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
    fields: () => ({[_value$1]: dart.dynamic}),
    sfields: () => ({
      RECEIVE: io.SocketDirection,
      SEND: io.SocketDirection,
      BOTH: io.SocketDirection
    })
  });
  dart.defineLazy(io.SocketDirection, {
    get RECEIVE() {
      return dart.const(new io.SocketDirection._(0));
    },
    get SEND() {
      return dart.const(new io.SocketDirection._(1));
    },
    get BOTH() {
      return dart.const(new io.SocketDirection._(2));
    }
  });
  io.SocketOption = class SocketOption extends core.Object {
    _(value) {
      this[_value$1] = value;
    }
  };
  dart.defineNamedConstructor(io.SocketOption, '_');
  dart.setSignature(io.SocketOption, {
    constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
    fields: () => ({[_value$1]: dart.dynamic}),
    sfields: () => ({
      TCP_NODELAY: io.SocketOption,
      _IP_MULTICAST_LOOP: io.SocketOption,
      _IP_MULTICAST_HOPS: io.SocketOption,
      _IP_MULTICAST_IF: io.SocketOption,
      _IP_BROADCAST: io.SocketOption
    })
  });
  dart.defineLazy(io.SocketOption, {
    get TCP_NODELAY() {
      return dart.const(new io.SocketOption._(0));
    },
    get _IP_MULTICAST_LOOP() {
      return dart.const(new io.SocketOption._(1));
    },
    get _IP_MULTICAST_HOPS() {
      return dart.const(new io.SocketOption._(2));
    },
    get _IP_MULTICAST_IF() {
      return dart.const(new io.SocketOption._(3));
    },
    get _IP_BROADCAST() {
      return dart.const(new io.SocketOption._(4));
    }
  });
  io.RawSocket = class RawSocket extends core.Object {
    new() {
      this.readEventsEnabled = null;
      this.writeEventsEnabled = null;
    }
    static connect(host, port, opts) {
      let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
      dart.throw(new core.UnsupportedError("RawSocket constructor"));
    }
  };
  io.RawSocket[dart.implements] = () => [StreamOfRawSocketEvent()];
  dart.setSignature(io.RawSocket, {
    fields: () => ({
      readEventsEnabled: core.bool,
      writeEventsEnabled: core.bool
    }),
    statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.RawSocket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
    names: ['connect']
  });
  io.Socket = class Socket extends core.Object {
    static connect(host, port, opts) {
      let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
      dart.throw(new core.UnsupportedError("Socket constructor"));
    }
  };
  io.Socket[dart.implements] = () => [StreamOfListOfint(), io.IOSink];
  dart.setSignature(io.Socket, {
    statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.Socket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
    names: ['connect']
  });
  io.Datagram = class Datagram extends core.Object {
    new(data, address, port) {
      this.data = data;
      this.address = address;
      this.port = port;
    }
  };
  dart.setSignature(io.Datagram, {
    constructors: () => ({new: dart.definiteFunctionType(io.Datagram, [ListOfint(), io.InternetAddress, core.int])}),
    fields: () => ({
      data: ListOfint(),
      address: io.InternetAddress,
      port: core.int
    })
  });
  io.RawDatagramSocket = class RawDatagramSocket extends async.Stream$(io.RawSocketEvent) {
    new() {
      this.readEventsEnabled = null;
      this.writeEventsEnabled = null;
      this.multicastLoopback = null;
      this.multicastHops = null;
      this.multicastInterface = null;
      this.broadcastEnabled = null;
      super.new();
    }
    static bind(host, port, opts) {
      let reuseAddress = opts && 'reuseAddress' in opts ? opts.reuseAddress : true;
      dart.throw(new core.UnsupportedError("RawDatagramSocket.bind"));
    }
  };
  dart.addSimpleTypeTests(io.RawDatagramSocket);
  dart.setSignature(io.RawDatagramSocket, {
    fields: () => ({
      readEventsEnabled: core.bool,
      writeEventsEnabled: core.bool,
      multicastLoopback: core.bool,
      multicastHops: core.int,
      multicastInterface: io.NetworkInterface,
      broadcastEnabled: core.bool
    }),
    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawDatagramSocket), [dart.dynamic, core.int], {reuseAddress: core.bool})}),
    names: ['bind']
  });
  io.SocketException = class SocketException extends core.Object {
    new(message, opts) {
      let osError = opts && 'osError' in opts ? opts.osError : null;
      let address = opts && 'address' in opts ? opts.address : null;
      let port = opts && 'port' in opts ? opts.port : null;
      this.message = message;
      this.osError = osError;
      this.address = address;
      this.port = port;
    }
    closed() {
      this.message = 'Socket has been closed';
      this.osError = null;
      this.address = null;
      this.port = null;
    }
    toString() {
      let sb = new core.StringBuffer();
      sb.write("SocketException");
      if (!dart.test(this.message[dartx.isEmpty])) {
        sb.write(dart.str`: ${this.message}`);
        if (this.osError != null) {
          sb.write(dart.str` (${this.osError})`);
        }
      } else if (this.osError != null) {
        sb.write(dart.str`: ${this.osError}`);
      }
      if (this.address != null) {
        sb.write(dart.str`, address = ${this.address.host}`);
      }
      if (this.port != null) {
        sb.write(dart.str`, port = ${this.port}`);
      }
      return sb.toString();
    }
  };
  dart.defineNamedConstructor(io.SocketException, 'closed');
  io.SocketException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.SocketException, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.SocketException, [core.String], {osError: io.OSError, address: io.InternetAddress, port: core.int}),
      closed: dart.definiteFunctionType(io.SocketException, [])
    }),
    fields: () => ({
      message: core.String,
      osError: io.OSError,
      address: io.InternetAddress,
      port: core.int
    })
  });
  io._STDIO_HANDLE_TYPE_TERMINAL = 0;
  io._STDIO_HANDLE_TYPE_PIPE = 1;
  io._STDIO_HANDLE_TYPE_FILE = 2;
  io._STDIO_HANDLE_TYPE_SOCKET = 3;
  io._STDIO_HANDLE_TYPE_OTHER = 4;
  io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
    new(stream) {
      this[_stream$] = stream;
      super.new();
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
  };
  dart.addSimpleTypeTests(io._StdStream);
  dart.setSignature(io._StdStream, {
    constructors: () => ({new: dart.definiteFunctionType(io._StdStream, [StreamOfListOfint()])}),
    fields: () => ({[_stream$]: StreamOfListOfint()}),
    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
  });
  io.Stdin = class Stdin extends io._StdStream {
    _(stream) {
      super.new(stream);
    }
    readLineSync(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : io.SYSTEM_ENCODING;
      let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
      let CR = 13;
      let LF = 10;
      let line = [];
      let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
      if (dart.test(retainNewlines)) {
        let byte = null;
        do {
          byte = this.readByteSync();
          if (dart.notNull(byte) < 0) {
            break;
          }
          line[dartx.add](byte);
        } while (byte != LF && !(byte == CR && crIsNewline));
        if (dart.test(line[dartx.isEmpty])) {
          return null;
        }
      } else if (crIsNewline) {
        while (true) {
          let byte = this.readByteSync();
          if (dart.notNull(byte) < 0) {
            if (dart.test(line[dartx.isEmpty])) return null;
            break;
          }
          if (byte == LF || byte == CR) break;
          line[dartx.add](byte);
        }
      } else {
        outer:
          while (true) {
            let byte = this.readByteSync();
            if (byte == LF) break;
            if (byte == CR) {
              do {
                byte = this.readByteSync();
                if (byte == LF) break outer;
                line[dartx.add](CR);
              } while (byte == CR);
            }
            if (dart.notNull(byte) < 0) {
              if (dart.test(line[dartx.isEmpty])) return null;
              break;
            }
            line[dartx.add](byte);
          }
      }
      return encoding.decode(ListOfint()._check(line));
    }
    set echoMode(enabled) {
      dart.throw(new core.UnsupportedError("Stdin.echoMode"));
    }
    set echoMode(enabled) {
      dart.throw(new core.UnsupportedError("Stdin.echoMode"));
    }
    set lineMode(enabled) {
      dart.throw(new core.UnsupportedError("Stdin.lineMode"));
    }
    set lineMode(enabled) {
      dart.throw(new core.UnsupportedError("Stdin.lineMode"));
    }
    readByteSync() {
      dart.throw(new core.UnsupportedError("Stdin.readByteSync"));
    }
  };
  dart.defineNamedConstructor(io.Stdin, '_');
  io.Stdin[dart.implements] = () => [StreamOfListOfint()];
  dart.setSignature(io.Stdin, {
    constructors: () => ({_: dart.definiteFunctionType(io.Stdin, [StreamOfListOfint()])}),
    setters: () => ({
      echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
      echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
      lineMode: dart.definiteFunctionType(dart.void, [core.bool]),
      lineMode: dart.definiteFunctionType(dart.void, [core.bool])
    }),
    methods: () => ({
      readLineSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding, retainNewlines: core.bool}),
      readByteSync: dart.definiteFunctionType(core.int, [])
    })
  });
  const _fd = Symbol('_fd');
  const _nonBlocking = Symbol('_nonBlocking');
  const _hasTerminal = Symbol('_hasTerminal');
  const _terminalColumns = Symbol('_terminalColumns');
  const _terminalLines = Symbol('_terminalLines');
  io._StdSink = class _StdSink extends core.Object {
    new(sink) {
      this[_sink$0] = sink;
    }
    get encoding() {
      return this[_sink$0].encoding;
    }
    set encoding(encoding) {
      this[_sink$0].encoding = encoding;
    }
    write(object) {
      this[_sink$0].write(object);
    }
    writeln(object) {
      if (object === void 0) object = "";
      this[_sink$0].writeln(object);
    }
    writeAll(objects, sep) {
      if (sep === void 0) sep = "";
      this[_sink$0].writeAll(objects, sep);
    }
    add(data) {
      this[_sink$0].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_sink$0].addError(error, stackTrace);
    }
    writeCharCode(charCode) {
      this[_sink$0].writeCharCode(charCode);
    }
    addStream(stream) {
      return this[_sink$0].addStream(stream);
    }
    flush() {
      return this[_sink$0].flush();
    }
    close() {
      return this[_sink$0].close();
    }
    get done() {
      return this[_sink$0].done;
    }
  };
  io._StdSink[dart.implements] = () => [io.IOSink];
  dart.setSignature(io._StdSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
    fields: () => ({[_sink$0]: io.IOSink}),
    getters: () => ({
      encoding: dart.definiteFunctionType(convert.Encoding, []),
      done: dart.definiteFunctionType(async.Future, [])
    }),
    setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
    methods: () => ({
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
      flush: dart.definiteFunctionType(async.Future, []),
      close: dart.definiteFunctionType(async.Future, [])
    })
  });
  io.Stdout = class Stdout extends io._StdSink {
    _(sink, fd) {
      this[_fd] = fd;
      this[_nonBlocking] = null;
      super.new(sink);
    }
    get hasTerminal() {
      return this[_hasTerminal](this[_fd]);
    }
    get terminalColumns() {
      return this[_terminalColumns](this[_fd]);
    }
    get terminalLines() {
      return this[_terminalLines](this[_fd]);
    }
    [_hasTerminal](fd) {
      dart.throw(new core.UnsupportedError("Stdout.hasTerminal"));
    }
    [_terminalColumns](fd) {
      dart.throw(new core.UnsupportedError("Stdout.terminalColumns"));
    }
    [_terminalLines](fd) {
      dart.throw(new core.UnsupportedError("Stdout.terminalLines"));
    }
    get nonBlocking() {
      if (this[_nonBlocking] == null) {
        this[_nonBlocking] = io.IOSink.new(new io._FileStreamConsumer.fromStdio(this[_fd]));
      }
      return this[_nonBlocking];
    }
  };
  dart.defineNamedConstructor(io.Stdout, '_');
  io.Stdout[dart.implements] = () => [io.IOSink];
  dart.setSignature(io.Stdout, {
    constructors: () => ({_: dart.definiteFunctionType(io.Stdout, [io.IOSink, core.int])}),
    fields: () => ({
      [_fd]: core.int,
      [_nonBlocking]: io.IOSink
    }),
    getters: () => ({
      hasTerminal: dart.definiteFunctionType(core.bool, []),
      terminalColumns: dart.definiteFunctionType(core.int, []),
      terminalLines: dart.definiteFunctionType(core.int, []),
      nonBlocking: dart.definiteFunctionType(io.IOSink, [])
    }),
    methods: () => ({
      [_hasTerminal]: dart.definiteFunctionType(core.bool, [core.int]),
      [_terminalColumns]: dart.definiteFunctionType(core.int, [core.int]),
      [_terminalLines]: dart.definiteFunctionType(core.int, [core.int])
    })
  });
  io.StdoutException = class StdoutException extends core.Object {
    new(message, osError) {
      if (osError === void 0) osError = null;
      this.message = message;
      this.osError = osError;
    }
    toString() {
      return dart.str`StdoutException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
    }
  };
  io.StdoutException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.StdoutException, {
    constructors: () => ({new: dart.definiteFunctionType(io.StdoutException, [core.String], [io.OSError])}),
    fields: () => ({
      message: core.String,
      osError: io.OSError
    })
  });
  io._StdConsumer = class _StdConsumer extends core.Object {
    new(fd) {
      this[_file] = io._File._openStdioSync(fd);
    }
    addStream(stream) {
      let completer = async.Completer.new();
      let sub = null;
      sub = stream.listen(dart.fn(data => {
        try {
          dart.dsend(this[_file], 'writeFromSync', data);
        } catch (e) {
          let s = dart.stackTrace(e);
          dart.dsend(sub, 'cancel');
          completer.completeError(e, s);
        }

      }, ListOfintTovoid$()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
      return completer.future;
    }
    close() {
      dart.dsend(this[_file], 'closeSync');
      return async.Future.value();
    }
  };
  io._StdConsumer[dart.implements] = () => [StreamConsumerOfListOfint()];
  dart.setSignature(io._StdConsumer, {
    constructors: () => ({new: dart.definiteFunctionType(io._StdConsumer, [core.int])}),
    fields: () => ({[_file]: dart.dynamic}),
    methods: () => ({
      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
      close: dart.definiteFunctionType(async.Future, [])
    })
  });
  io.StdioType = class StdioType extends core.Object {
    _(name) {
      this.name = name;
    }
    toString() {
      return dart.str`StdioType: ${this.name}`;
    }
  };
  dart.defineNamedConstructor(io.StdioType, '_');
  dart.setSignature(io.StdioType, {
    constructors: () => ({_: dart.definiteFunctionType(io.StdioType, [core.String])}),
    fields: () => ({name: core.String}),
    sfields: () => ({
      TERMINAL: io.StdioType,
      PIPE: io.StdioType,
      FILE: io.StdioType,
      OTHER: io.StdioType
    })
  });
  dart.defineLazy(io.StdioType, {
    get TERMINAL() {
      return dart.const(new io.StdioType._("terminal"));
    },
    get PIPE() {
      return dart.const(new io.StdioType._("pipe"));
    },
    get FILE() {
      return dart.const(new io.StdioType._("file"));
    },
    get OTHER() {
      return dart.const(new io.StdioType._("other"));
    }
  });
  io._stdin = null;
  io._stdout = null;
  io._stderr = null;
  dart.copyProperties(io, {
    get stdin() {
      if (io._stdin == null) {
        io._stdin = io._StdIOUtils._getStdioInputStream();
      }
      return io._stdin;
    }
  });
  dart.copyProperties(io, {
    get stdout() {
      if (io._stdout == null) {
        io._stdout = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(1));
      }
      return io._stdout;
    }
  });
  dart.copyProperties(io, {
    get stderr() {
      if (io._stderr == null) {
        io._stderr = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(2));
      }
      return io._stderr;
    }
  });
  io.stdioType = function(object) {
    if (io._StdStream.is(object)) {
      object = dart.dload(object, _stream$);
    } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
      switch (io._StdIOUtils._getStdioHandleType(dart.equals(object, io.stdout) ? 1 : 2)) {
        case io._STDIO_HANDLE_TYPE_TERMINAL:
        {
          return io.StdioType.TERMINAL;
        }
        case io._STDIO_HANDLE_TYPE_PIPE:
        {
          return io.StdioType.PIPE;
        }
        case io._STDIO_HANDLE_TYPE_FILE:
        {
          return io.StdioType.FILE;
        }
      }
    }
    if (io._FileStream.is(object)) {
      return io.StdioType.FILE;
    }
    if (io.Socket.is(object)) {
      let socketType = io._StdIOUtils._socketType(object);
      if (socketType == null) return io.StdioType.OTHER;
      switch (socketType) {
        case io._STDIO_HANDLE_TYPE_TERMINAL:
        {
          return io.StdioType.TERMINAL;
        }
        case io._STDIO_HANDLE_TYPE_PIPE:
        {
          return io.StdioType.PIPE;
        }
        case io._STDIO_HANDLE_TYPE_FILE:
        {
          return io.StdioType.FILE;
        }
      }
    }
    if (io._IOSinkImpl.is(object)) {
      try {
        if (io._FileStreamConsumer.is(object[_target$])) {
          return io.StdioType.FILE;
        }
      } catch (e) {
      }

    }
    return io.StdioType.OTHER;
  };
  dart.fn(io.stdioType, dynamicToStdioType());
  io._StdIOUtils = class _StdIOUtils extends core.Object {
    static _getStdioOutputStream(fd) {
      dart.throw(new core.UnsupportedError("StdIOUtils._getStdioOutputStream"));
    }
    static _getStdioInputStream() {
      dart.throw(new core.UnsupportedError("StdIOUtils._getStdioInputStream"));
    }
    static _socketType(socket) {
      dart.throw(new core.UnsupportedError("StdIOUtils._socketType"));
    }
    static _getStdioHandleType(fd) {
      dart.throw(new core.UnsupportedError("StdIOUtils._getStdioHandleType"));
    }
  };
  dart.setSignature(io._StdIOUtils, {
    statics: () => ({
      _getStdioOutputStream: dart.definiteFunctionType(dart.dynamic, [core.int]),
      _getStdioInputStream: dart.definiteFunctionType(io.Stdin, []),
      _socketType: dart.definiteFunctionType(core.int, [io.Socket]),
      _getStdioHandleType: dart.definiteFunctionType(dart.dynamic, [core.int])
    }),
    names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
  });
  let const$76;
  let const$77;
  let const$78;
  let const$79;
  io.SystemEncoding = class SystemEncoding extends convert.Encoding {
    new() {
      super.new();
    }
    get name() {
      return 'system';
    }
    encode(input) {
      return this.encoder.convert(input);
    }
    decode(encoded) {
      return this.decoder.convert(encoded);
    }
    get encoder() {
      if (io.Platform.operatingSystem == "windows") {
        return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
      } else {
        return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
      }
    }
    get decoder() {
      if (io.Platform.operatingSystem == "windows") {
        return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
      } else {
        return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
      }
    }
  };
  dart.setSignature(io.SystemEncoding, {
    constructors: () => ({new: dart.definiteFunctionType(io.SystemEncoding, [])}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.Converter$(core.String, core.List$(core.int)), []),
      decoder: dart.definiteFunctionType(convert.Converter$(core.List$(core.int), core.String), [])
    }),
    methods: () => ({
      encode: dart.definiteFunctionType(core.List$(core.int), [core.String]),
      decode: dart.definiteFunctionType(core.String, [ListOfint()])
    })
  });
  io.SYSTEM_ENCODING = dart.const(new io.SystemEncoding());
  io._WindowsCodePageEncoder = class _WindowsCodePageEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    convert(input) {
      let encoded = io._WindowsCodePageEncoder._encodeString(input);
      if (encoded == null) {
        dart.throw(new core.FormatException("Invalid character for encoding"));
      }
      return encoded;
    }
    startChunkedConversion(sink) {
      return new io._WindowsCodePageEncoderSink(sink);
    }
    static _encodeString(string) {
      dart.throw(new core.UnsupportedError("_WindowsCodePageEncoder._encodeString"));
    }
  };
  dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
  dart.setSignature(io._WindowsCodePageEncoder, {
    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoder, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
    }),
    statics: () => ({_encodeString: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
    names: ['_encodeString']
  });
  io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_sink$0] = sink;
    }
    close() {
      this[_sink$0].close();
    }
    add(string) {
      let encoded = io._WindowsCodePageEncoder._encodeString(string);
      if (encoded == null) {
        dart.throw(new core.FormatException("Invalid character for encoding"));
      }
      this[_sink$0].add(encoded);
    }
    addSlice(source, start, end, isLast) {
      if (start != 0 || end != source[dartx.length]) {
        source = source[dartx.substring](start, end);
      }
      this.add(source);
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(io._WindowsCodePageEncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoderSink, [SinkOfListOfint()])}),
    fields: () => ({[_sink$0]: SinkOfListOfint()}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  io._WindowsCodePageDecoder = class _WindowsCodePageDecoder extends convert.Converter$(core.List$(core.int), core.String) {
    new() {
      super.new();
    }
    convert(input) {
      return io._WindowsCodePageDecoder._decodeBytes(input);
    }
    startChunkedConversion(sink) {
      return new io._WindowsCodePageDecoderSink(sink);
    }
    static _decodeBytes(bytes) {
      dart.throw(new core.UnsupportedError("_WindowsCodePageDecoder._decodeBytes"));
    }
  };
  dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
  dart.setSignature(io._WindowsCodePageDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoder, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
    }),
    statics: () => ({_decodeBytes: dart.definiteFunctionType(core.String, [ListOfint()])}),
    names: ['_decodeBytes']
  });
  io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$0] = sink;
      super.new();
    }
    close() {
      this[_sink$0].close();
    }
    add(bytes) {
      this[_sink$0].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
    }
  };
  dart.setSignature(io._WindowsCodePageDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
    fields: () => ({[_sink$0]: SinkOfString()}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()])
    })
  });
  io.WebSocketStatus = class WebSocketStatus extends core.Object {};
  dart.setSignature(io.WebSocketStatus, {
    sfields: () => ({
      NORMAL_CLOSURE: core.int,
      GOING_AWAY: core.int,
      PROTOCOL_ERROR: core.int,
      UNSUPPORTED_DATA: core.int,
      RESERVED_1004: core.int,
      NO_STATUS_RECEIVED: core.int,
      ABNORMAL_CLOSURE: core.int,
      INVALID_FRAME_PAYLOAD_DATA: core.int,
      POLICY_VIOLATION: core.int,
      MESSAGE_TOO_BIG: core.int,
      MISSING_MANDATORY_EXTENSION: core.int,
      INTERNAL_SERVER_ERROR: core.int,
      RESERVED_1015: core.int
    })
  });
  io.WebSocketStatus.NORMAL_CLOSURE = 1000;
  io.WebSocketStatus.GOING_AWAY = 1001;
  io.WebSocketStatus.PROTOCOL_ERROR = 1002;
  io.WebSocketStatus.UNSUPPORTED_DATA = 1003;
  io.WebSocketStatus.RESERVED_1004 = 1004;
  io.WebSocketStatus.NO_STATUS_RECEIVED = 1005;
  io.WebSocketStatus.ABNORMAL_CLOSURE = 1006;
  io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA = 1007;
  io.WebSocketStatus.POLICY_VIOLATION = 1008;
  io.WebSocketStatus.MESSAGE_TOO_BIG = 1009;
  io.WebSocketStatus.MISSING_MANDATORY_EXTENSION = 1010;
  io.WebSocketStatus.INTERNAL_SERVER_ERROR = 1011;
  io.WebSocketStatus.RESERVED_1015 = 1015;
  const _createServerResponseHeader = Symbol('_createServerResponseHeader');
  const _createClientRequestHeader = Symbol('_createClientRequestHeader');
  const _createHeader = Symbol('_createHeader');
  io.CompressionOptions = class CompressionOptions extends core.Object {
    new(opts) {
      let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
      let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
      let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : null;
      let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : null;
      let enabled = opts && 'enabled' in opts ? opts.enabled : true;
      this.clientNoContextTakeover = clientNoContextTakeover;
      this.serverNoContextTakeover = serverNoContextTakeover;
      this.clientMaxWindowBits = clientMaxWindowBits;
      this.serverMaxWindowBits = serverMaxWindowBits;
      this.enabled = enabled;
    }
    [_createServerResponseHeader](requested) {
      let info = new io._CompressionMaxWindowBits();
      let mwb = null;
      let part = null;
      if (dart.nullSafe(requested, _ => _.parameters) != null) {
        part = requested.parameters[dartx._get](io._serverMaxWindowBits);
      }
      if (part != null) {
        if (dart.notNull(part[dartx.length]) >= 2 && dart.test(part[dartx.startsWith]('0'))) {
          dart.throw(new core.ArgumentError("Illegal 0 padding on value."));
        } else {
          mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())}) : this.serverMaxWindowBits;
          info.headerValue = dart.str`; server_max_window_bits=${mwb}`;
          info.maxWindowBits = mwb;
        }
      } else {
        info.headerValue = "";
        info.maxWindowBits = io._WebSocketImpl.DEFAULT_WINDOW_BITS;
      }
      return info;
    }
    [_createClientRequestHeader](requested, size) {
      let info = "";
      if (requested != null) {
        info = dart.str`; client_max_window_bits=${size}`;
      } else {
        if (this.clientMaxWindowBits == null) {
          info = "; client_max_window_bits";
        } else {
          info = dart.str`; client_max_window_bits=${this.clientMaxWindowBits}`;
        }
        if (this.serverMaxWindowBits != null) {
          info = info + dart.str`; server_max_window_bits=${this.serverMaxWindowBits}`;
        }
      }
      return info;
    }
    [_createHeader](requested) {
      if (requested === void 0) requested = null;
      let info = new io._CompressionMaxWindowBits("", 0);
      if (!dart.test(this.enabled)) {
        return info;
      }
      info.headerValue = io._WebSocketImpl.PER_MESSAGE_DEFLATE;
      if (dart.test(this.clientNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._clientNoContextTakeover)))) {
        info.headerValue = dart.notNull(info.headerValue) + "; client_no_context_takeover";
      }
      if (dart.test(this.serverNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._serverNoContextTakeover)))) {
        info.headerValue = dart.notNull(info.headerValue) + "; server_no_context_takeover";
      }
      let headerList = this[_createServerResponseHeader](requested);
      info.headerValue = dart.notNull(info.headerValue) + dart.notNull(headerList.headerValue);
      info.maxWindowBits = headerList.maxWindowBits;
      info.headerValue = dart.notNull(info.headerValue) + dart.notNull(this[_createClientRequestHeader](requested, info.maxWindowBits));
      return info;
    }
  };
  dart.setSignature(io.CompressionOptions, {
    constructors: () => ({new: dart.definiteFunctionType(io.CompressionOptions, [], {clientNoContextTakeover: core.bool, serverNoContextTakeover: core.bool, clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, enabled: core.bool})}),
    fields: () => ({
      clientNoContextTakeover: core.bool,
      serverNoContextTakeover: core.bool,
      clientMaxWindowBits: core.int,
      serverMaxWindowBits: core.int,
      enabled: core.bool
    }),
    methods: () => ({
      [_createServerResponseHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [io.HeaderValue]),
      [_createClientRequestHeader]: dart.definiteFunctionType(core.String, [io.HeaderValue, core.int]),
      [_createHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [io.HeaderValue])
    }),
    sfields: () => ({
      DEFAULT: io.CompressionOptions,
      OFF: io.CompressionOptions
    })
  });
  dart.defineLazy(io.CompressionOptions, {
    get DEFAULT() {
      return dart.const(new io.CompressionOptions());
    },
    get OFF() {
      return dart.const(new io.CompressionOptions({enabled: false}));
    }
  });
  io.WebSocketTransformer = class WebSocketTransformer extends core.Object {
    static new(opts) {
      let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
      return new io._WebSocketTransformerImpl(protocolSelector, compression);
    }
    static upgrade(request, opts) {
      let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
      return io._WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
    }
    static isUpgradeRequest(request) {
      return io._WebSocketTransformerImpl._isUpgradeRequest(request);
    }
  };
  io.WebSocketTransformer[dart.implements] = () => [StreamTransformerOfHttpRequest$WebSocket()];
  dart.setSignature(io.WebSocketTransformer, {
    constructors: () => ({new: dart.definiteFunctionType(io.WebSocketTransformer, [], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions})}),
    statics: () => ({
      upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions}),
      isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
    }),
    names: ['upgrade', 'isUpgradeRequest']
  });
  io.WebSocket = class WebSocket extends core.Object {
    static connect(url, opts) {
      let protocols = opts && 'protocols' in opts ? opts.protocols : null;
      let headers = opts && 'headers' in opts ? opts.headers : null;
      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
      return io._WebSocketImpl.connect(url, protocols, headers, {compression: compression});
    }
    new() {
      this.pingInterval = null;
    }
    static fromUpgradedSocket(socket, opts) {
      let protocol = opts && 'protocol' in opts ? opts.protocol : null;
      let serverSide = opts && 'serverSide' in opts ? opts.serverSide : null;
      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
      if (serverSide == null) {
        dart.throw(new core.ArgumentError("The serverSide argument must be passed " + "explicitly to WebSocket.fromUpgradedSocket."));
      }
      return new io._WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
    }
  };
  io.WebSocket[dart.implements] = () => [async.Stream, async.StreamSink];
  dart.setSignature(io.WebSocket, {
    constructors: () => ({
      new: dart.definiteFunctionType(io.WebSocket, []),
      fromUpgradedSocket: dart.definiteFunctionType(io.WebSocket, [io.Socket], {protocol: core.String, serverSide: core.bool, compression: io.CompressionOptions})
    }),
    fields: () => ({pingInterval: core.Duration}),
    sfields: () => ({
      CONNECTING: core.int,
      OPEN: core.int,
      CLOSING: core.int,
      CLOSED: core.int
    }),
    statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String], {protocols: IterableOfString(), headers: MapOfString$dynamic(), compression: io.CompressionOptions})}),
    names: ['connect']
  });
  io.WebSocket.CONNECTING = 0;
  io.WebSocket.OPEN = 1;
  io.WebSocket.CLOSING = 2;
  io.WebSocket.CLOSED = 3;
  io.WebSocketException = class WebSocketException extends core.Object {
    new(message) {
      if (message === void 0) message = "";
      this.message = message;
    }
    toString() {
      return dart.str`WebSocketException: ${this.message}`;
    }
  };
  io.WebSocketException[dart.implements] = () => [io.IOException];
  dart.setSignature(io.WebSocketException, {
    constructors: () => ({new: dart.definiteFunctionType(io.WebSocketException, [], [core.String])}),
    fields: () => ({message: core.String})
  });
  io._webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
  io._clientNoContextTakeover = "client_no_context_takeover";
  io._serverNoContextTakeover = "server_no_context_takeover";
  io._clientMaxWindowBits = "client_max_window_bits";
  io._serverMaxWindowBits = "server_max_window_bits";
  io._WebSocketMessageType = class _WebSocketMessageType extends core.Object {};
  dart.setSignature(io._WebSocketMessageType, {
    sfields: () => ({
      NONE: core.int,
      TEXT: core.int,
      BINARY: core.int
    })
  });
  io._WebSocketMessageType.NONE = 0;
  io._WebSocketMessageType.TEXT = 1;
  io._WebSocketMessageType.BINARY = 2;
  io._WebSocketOpcode = class _WebSocketOpcode extends core.Object {};
  dart.setSignature(io._WebSocketOpcode, {
    sfields: () => ({
      CONTINUATION: core.int,
      TEXT: core.int,
      BINARY: core.int,
      RESERVED_3: core.int,
      RESERVED_4: core.int,
      RESERVED_5: core.int,
      RESERVED_6: core.int,
      RESERVED_7: core.int,
      CLOSE: core.int,
      PING: core.int,
      PONG: core.int,
      RESERVED_B: core.int,
      RESERVED_C: core.int,
      RESERVED_D: core.int,
      RESERVED_E: core.int,
      RESERVED_F: core.int
    })
  });
  io._WebSocketOpcode.CONTINUATION = 0;
  io._WebSocketOpcode.TEXT = 1;
  io._WebSocketOpcode.BINARY = 2;
  io._WebSocketOpcode.RESERVED_3 = 3;
  io._WebSocketOpcode.RESERVED_4 = 4;
  io._WebSocketOpcode.RESERVED_5 = 5;
  io._WebSocketOpcode.RESERVED_6 = 6;
  io._WebSocketOpcode.RESERVED_7 = 7;
  io._WebSocketOpcode.CLOSE = 8;
  io._WebSocketOpcode.PING = 9;
  io._WebSocketOpcode.PONG = 10;
  io._WebSocketOpcode.RESERVED_B = 11;
  io._WebSocketOpcode.RESERVED_C = 12;
  io._WebSocketOpcode.RESERVED_D = 13;
  io._WebSocketOpcode.RESERVED_E = 14;
  io._WebSocketOpcode.RESERVED_F = 15;
  io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
    new(headerValue, maxWindowBits) {
      if (headerValue === void 0) headerValue = null;
      if (maxWindowBits === void 0) maxWindowBits = null;
      this.headerValue = headerValue;
      this.maxWindowBits = maxWindowBits;
    }
    toString() {
      return this.headerValue;
    }
  };
  dart.setSignature(io._CompressionMaxWindowBits, {
    constructors: () => ({new: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [core.String, core.int])}),
    fields: () => ({
      headerValue: core.String,
      maxWindowBits: core.int
    })
  });
  const _maskingBytes = Symbol('_maskingBytes');
  const _payload = Symbol('_payload');
  const _serverSide = Symbol('_serverSide');
  const _deflate = Symbol('_deflate');
  const _fin = Symbol('_fin');
  const _compressed = Symbol('_compressed');
  const _opcode = Symbol('_opcode');
  const _len = Symbol('_len');
  const _masked = Symbol('_masked');
  const _remainingLenBytes = Symbol('_remainingLenBytes');
  const _remainingMaskingKeyBytes = Symbol('_remainingMaskingKeyBytes');
  const _remainingPayloadBytes = Symbol('_remainingPayloadBytes');
  const _unmaskingIndex = Symbol('_unmaskingIndex');
  const _currentMessageType = Symbol('_currentMessageType');
  const _eventSink$ = Symbol('_eventSink');
  const _isControlFrame = Symbol('_isControlFrame');
  const _lengthDone = Symbol('_lengthDone');
  const _maskDone = Symbol('_maskDone');
  const _unmask = Symbol('_unmask');
  const _controlFrameEnd = Symbol('_controlFrameEnd');
  const _messageFrameEnd = Symbol('_messageFrameEnd');
  const _startPayload = Symbol('_startPayload');
  const _prepareForNextFrame = Symbol('_prepareForNextFrame');
  io._WebSocketProtocolTransformer = class _WebSocketProtocolTransformer extends core.Object {
    new(serverSide, deflate) {
      if (serverSide === void 0) serverSide = false;
      if (deflate === void 0) deflate = null;
      this[_maskingBytes] = core.List.new(4);
      this[_payload] = io.BytesBuilder.new({copy: false});
      this[_serverSide] = serverSide;
      this[_deflate] = deflate;
      this[_state$1] = io._WebSocketProtocolTransformer.START;
      this[_fin] = false;
      this[_compressed] = false;
      this[_opcode] = -1;
      this[_len] = -1;
      this[_masked] = false;
      this[_remainingLenBytes] = -1;
      this[_remainingMaskingKeyBytes] = 4;
      this[_remainingPayloadBytes] = -1;
      this[_unmaskingIndex] = 0;
      this[_currentMessageType] = io._WebSocketMessageType.NONE;
      this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
      this.closeReason = "";
      this[_eventSink$] = null;
    }
    bind(stream) {
      return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
        if (this[_eventSink$] != null) {
          dart.throw(new core.StateError("WebSocket transformer already used."));
        }
        this[_eventSink$] = eventSink;
        return this;
      }, EventSinkTo_WebSocketProtocolTransformer()));
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_eventSink$].addError(error, stackTrace);
    }
    close() {
      this[_eventSink$].close();
    }
    add(bytes) {
      let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
      let index = 0;
      let lastIndex = buffer[dartx.length];
      if (this[_state$1] == io._WebSocketProtocolTransformer.CLOSED) {
        dart.throw(new io.WebSocketException("Data on closed connection"));
      }
      if (this[_state$1] == io._WebSocketProtocolTransformer.FAILURE) {
        dart.throw(new io.WebSocketException("Data on failed connection"));
      }
      while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) {
        let byte = buffer[dartx._get](index);
        if (dart.notNull(this[_state$1]) <= io._WebSocketProtocolTransformer.LEN_REST) {
          if (this[_state$1] == io._WebSocketProtocolTransformer.START) {
            this[_fin] = (dart.notNull(byte) & io._WebSocketProtocolTransformer.FIN) != 0;
            if ((dart.notNull(byte) & (io._WebSocketProtocolTransformer.RSV2 | io._WebSocketProtocolTransformer.RSV3)) != 0) {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            this[_opcode] = dart.notNull(byte) & io._WebSocketProtocolTransformer.OPCODE;
            if (this[_opcode] != io._WebSocketOpcode.CONTINUATION) {
              if ((dart.notNull(byte) & io._WebSocketProtocolTransformer.RSV1) != 0) {
                this[_compressed] = true;
              } else {
                this[_compressed] = false;
              }
            }
            if (dart.notNull(this[_opcode]) <= io._WebSocketOpcode.BINARY) {
              if (this[_opcode] == io._WebSocketOpcode.CONTINUATION) {
                if (this[_currentMessageType] == io._WebSocketMessageType.NONE) {
                  dart.throw(new io.WebSocketException("Protocol error"));
                }
              } else {
                dart.assert(this[_opcode] == io._WebSocketOpcode.TEXT || this[_opcode] == io._WebSocketOpcode.BINARY);
                if (this[_currentMessageType] != io._WebSocketMessageType.NONE) {
                  dart.throw(new io.WebSocketException("Protocol error"));
                }
                this[_currentMessageType] = this[_opcode];
              }
            } else if (dart.notNull(this[_opcode]) >= io._WebSocketOpcode.CLOSE && dart.notNull(this[_opcode]) <= io._WebSocketOpcode.PONG) {
              if (!dart.test(this[_fin])) dart.throw(new io.WebSocketException("Protocol error"));
            } else {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            this[_state$1] = io._WebSocketProtocolTransformer.LEN_FIRST;
          } else if (this[_state$1] == io._WebSocketProtocolTransformer.LEN_FIRST) {
            this[_masked] = (dart.notNull(byte) & 128) != 0;
            this[_len] = dart.notNull(byte) & 127;
            if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            if (this[_len] == 126) {
              this[_len] = 0;
              this[_remainingLenBytes] = 2;
              this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
            } else if (this[_len] == 127) {
              this[_len] = 0;
              this[_remainingLenBytes] = 8;
              this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
            } else {
              dart.assert(dart.notNull(this[_len]) < 126);
              this[_lengthDone]();
            }
          } else {
            dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.LEN_REST);
            this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
            this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
            if (this[_remainingLenBytes] == 0) {
              this[_lengthDone]();
            }
          }
        } else {
          if (this[_state$1] == io._WebSocketProtocolTransformer.MASK) {
            this[_maskingBytes][dartx._set](4 - (() => {
              let x = this[_remainingMaskingKeyBytes];
              this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
              return x;
            })(), byte);
            if (this[_remainingMaskingKeyBytes] == 0) {
              this[_maskDone]();
            }
          } else {
            dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.PAYLOAD);
            let payloadLength = math.min(core.int)(dart.notNull(lastIndex) - dart.notNull(index), this[_remainingPayloadBytes]);
            this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - dart.notNull(payloadLength);
            if (dart.test(this[_masked])) {
              this[_unmask](index, payloadLength, buffer);
            }
            this[_payload].add(typed_data.Uint8List.view(buffer[dartx.buffer], index, payloadLength));
            index = dart.notNull(index) + dart.notNull(payloadLength);
            if (dart.test(this[_isControlFrame]())) {
              if (this[_remainingPayloadBytes] == 0) this[_controlFrameEnd]();
            } else {
              if (this[_currentMessageType] != io._WebSocketMessageType.TEXT && this[_currentMessageType] != io._WebSocketMessageType.BINARY) {
                dart.throw(new io.WebSocketException("Protocol error"));
              }
              if (this[_remainingPayloadBytes] == 0) this[_messageFrameEnd]();
            }
            index = dart.notNull(index) - 1;
          }
        }
        index = dart.notNull(index) + 1;
      }
    }
    [_unmask](index, length, buffer) {
      let BLOCK_SIZE = 16;
      if (dart.notNull(length) >= BLOCK_SIZE) {
        let startOffset = BLOCK_SIZE - (dart.notNull(index) & 15);
        let end = dart.notNull(index) + startOffset;
        for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
          buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
            let x = this[_unmaskingIndex];
            this[_unmaskingIndex] = dart.notNull(x) + 1;
            return x;
          })() & 3)))) >>> 0);
        }
        index = dart.notNull(index) + startOffset;
        length = dart.notNull(length) - startOffset;
        let blockCount = (dart.notNull(length) / BLOCK_SIZE)[dartx.truncate]();
        if (blockCount > 0) {
          let mask = 0;
          for (let i = 3; i >= 0; i--) {
            mask = (mask << 8 | dart.notNull(core.int._check(this[_maskingBytes][dartx._get](dart.notNull(this[_unmaskingIndex]) + i & 3)))) >>> 0;
          }
          let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
          let blockBuffer = typed_data.Int32x4List.view(buffer[dartx.buffer], index, blockCount);
          for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
            blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
          }
          let bytes = blockCount * BLOCK_SIZE;
          index = dart.notNull(index) + bytes;
          length = dart.notNull(length) - bytes;
        }
      }
      let end = dart.notNull(index) + dart.notNull(length);
      for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
        buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
          let x = this[_unmaskingIndex];
          this[_unmaskingIndex] = dart.notNull(x) + 1;
          return x;
        })() & 3)))) >>> 0);
      }
    }
    [_lengthDone]() {
      if (dart.test(this[_masked])) {
        if (!dart.test(this[_serverSide])) {
          dart.throw(new io.WebSocketException("Received masked frame from server"));
        }
        this[_state$1] = io._WebSocketProtocolTransformer.MASK;
      } else {
        if (dart.test(this[_serverSide])) {
          dart.throw(new io.WebSocketException("Received unmasked frame from client"));
        }
        this[_remainingPayloadBytes] = this[_len];
        this[_startPayload]();
      }
    }
    [_maskDone]() {
      this[_remainingPayloadBytes] = this[_len];
      this[_startPayload]();
    }
    [_startPayload]() {
      if (this[_remainingPayloadBytes] == 0) {
        if (dart.test(this[_isControlFrame]())) {
          switch (this[_opcode]) {
            case io._WebSocketOpcode.CLOSE:
            {
              this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
              this[_eventSink$].close();
              break;
            }
            case io._WebSocketOpcode.PING:
            {
              this[_eventSink$].add(new io._WebSocketPing());
              break;
            }
            case io._WebSocketOpcode.PONG:
            {
              this[_eventSink$].add(new io._WebSocketPong());
              break;
            }
          }
          this[_prepareForNextFrame]();
        } else {
          this[_messageFrameEnd]();
        }
      } else {
        this[_state$1] = io._WebSocketProtocolTransformer.PAYLOAD;
      }
    }
    [_messageFrameEnd]() {
      if (dart.test(this[_fin])) {
        let bytes = this[_payload].takeBytes();
        if (this[_deflate] != null && dart.test(this[_compressed])) {
          bytes = this[_deflate].processIncomingMessage(bytes);
        }
        switch (this[_currentMessageType]) {
          case io._WebSocketMessageType.TEXT:
          {
            this[_eventSink$].add(convert.UTF8.decode(bytes));
            break;
          }
          case io._WebSocketMessageType.BINARY:
          {
            this[_eventSink$].add(bytes);
            break;
          }
        }
        this[_currentMessageType] = io._WebSocketMessageType.NONE;
      }
      this[_prepareForNextFrame]();
    }
    [_controlFrameEnd]() {
      switch (this[_opcode]) {
        case io._WebSocketOpcode.CLOSE:
        {
          this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
          let payload = this[_payload].takeBytes();
          if (dart.notNull(payload[dartx.length]) > 0) {
            if (payload[dartx.length] == 1) {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            this.closeCode = (dart.notNull(payload[dartx._get](0)) << 8 | dart.notNull(payload[dartx._get](1))) >>> 0;
            if (this.closeCode == io.WebSocketStatus.NO_STATUS_RECEIVED) {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            if (dart.notNull(payload[dartx.length]) > 2) {
              this.closeReason = convert.UTF8.decode(payload[dartx.sublist](2));
            }
          }
          this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
          this[_eventSink$].close();
          break;
        }
        case io._WebSocketOpcode.PING:
        {
          this[_eventSink$].add(new io._WebSocketPing(this[_payload].takeBytes()));
          break;
        }
        case io._WebSocketOpcode.PONG:
        {
          this[_eventSink$].add(new io._WebSocketPong(this[_payload].takeBytes()));
          break;
        }
      }
      this[_prepareForNextFrame]();
    }
    [_isControlFrame]() {
      return this[_opcode] == io._WebSocketOpcode.CLOSE || this[_opcode] == io._WebSocketOpcode.PING || this[_opcode] == io._WebSocketOpcode.PONG;
    }
    [_prepareForNextFrame]() {
      if (this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) this[_state$1] = io._WebSocketProtocolTransformer.START;
      this[_fin] = false;
      this[_opcode] = -1;
      this[_len] = -1;
      this[_remainingLenBytes] = -1;
      this[_remainingMaskingKeyBytes] = 4;
      this[_remainingPayloadBytes] = -1;
      this[_unmaskingIndex] = 0;
    }
  };
  io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
  dart.setSignature(io._WebSocketProtocolTransformer, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketProtocolTransformer, [], [core.bool, io._WebSocketPerMessageDeflate])}),
    fields: () => ({
      [_state$1]: core.int,
      [_fin]: core.bool,
      [_compressed]: core.bool,
      [_opcode]: core.int,
      [_len]: core.int,
      [_masked]: core.bool,
      [_remainingLenBytes]: core.int,
      [_remainingMaskingKeyBytes]: core.int,
      [_remainingPayloadBytes]: core.int,
      [_unmaskingIndex]: core.int,
      [_currentMessageType]: core.int,
      closeCode: core.int,
      closeReason: core.String,
      [_eventSink$]: async.EventSink,
      [_serverSide]: core.bool,
      [_maskingBytes]: core.List,
      [_payload]: io.BytesBuilder,
      [_deflate]: io._WebSocketPerMessageDeflate
    }),
    methods: () => ({
      bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      [_unmask]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.Uint8List]),
      [_lengthDone]: dart.definiteFunctionType(dart.void, []),
      [_maskDone]: dart.definiteFunctionType(dart.void, []),
      [_startPayload]: dart.definiteFunctionType(dart.void, []),
      [_messageFrameEnd]: dart.definiteFunctionType(dart.void, []),
      [_controlFrameEnd]: dart.definiteFunctionType(dart.void, []),
      [_isControlFrame]: dart.definiteFunctionType(core.bool, []),
      [_prepareForNextFrame]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      START: core.int,
      LEN_FIRST: core.int,
      LEN_REST: core.int,
      MASK: core.int,
      PAYLOAD: core.int,
      CLOSED: core.int,
      FAILURE: core.int,
      FIN: core.int,
      RSV1: core.int,
      RSV2: core.int,
      RSV3: core.int,
      OPCODE: core.int
    })
  });
  io._WebSocketProtocolTransformer.START = 0;
  io._WebSocketProtocolTransformer.LEN_FIRST = 1;
  io._WebSocketProtocolTransformer.LEN_REST = 2;
  io._WebSocketProtocolTransformer.MASK = 3;
  io._WebSocketProtocolTransformer.PAYLOAD = 4;
  io._WebSocketProtocolTransformer.CLOSED = 5;
  io._WebSocketProtocolTransformer.FAILURE = 6;
  io._WebSocketProtocolTransformer.FIN = 128;
  io._WebSocketProtocolTransformer.RSV1 = 64;
  io._WebSocketProtocolTransformer.RSV2 = 32;
  io._WebSocketProtocolTransformer.RSV3 = 16;
  io._WebSocketProtocolTransformer.OPCODE = 15;
  io._WebSocketPing = class _WebSocketPing extends core.Object {
    new(payload) {
      if (payload === void 0) payload = null;
      this.payload = payload;
    }
  };
  dart.setSignature(io._WebSocketPing, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPing, [], [ListOfint()])}),
    fields: () => ({payload: ListOfint()})
  });
  io._WebSocketPong = class _WebSocketPong extends core.Object {
    new(payload) {
      if (payload === void 0) payload = null;
      this.payload = payload;
    }
  };
  dart.setSignature(io._WebSocketPong, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPong, [], [ListOfint()])}),
    fields: () => ({payload: ListOfint()})
  });
  const _protocolSelector = Symbol('_protocolSelector');
  const _compression = Symbol('_compression');
  io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
    new(protocolSelector, compression) {
      this[_controller$0] = StreamControllerOfWebSocket().new({sync: true});
      this[_protocolSelector] = protocolSelector;
      this[_compression] = compression;
    }
    bind(stream) {
      stream.listen(dart.fn(request => {
        io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.dynamic)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
      }, HttpRequestTovoid$()), {onDone: dart.fn(() => {
          this[_controller$0].close();
        }, VoidTovoid$())});
      return this[_controller$0].stream;
    }
    static _upgrade(request, _protocolSelector, compression) {
      let response = request.response;
      if (!dart.test(io._WebSocketTransformerImpl._isUpgradeRequest(request))) {
        response.statusCode = io.HttpStatus.BAD_REQUEST;
        response.close();
        return FutureOfWebSocket().error(new io.WebSocketException("Invalid WebSocket upgrade request"));
      }
      function upgrade(protocol) {
        response.statusCode = io.HttpStatus.SWITCHING_PROTOCOLS;
        response.headers.add(io.HttpHeaders.CONNECTION, "Upgrade");
        response.headers.add(io.HttpHeaders.UPGRADE, "websocket");
        let key = request.headers.value("Sec-WebSocket-Key");
        let sha1 = new io._SHA1();
        sha1.add(dart.str`${key}${io._webSocketGUID}`[dartx.codeUnits]);
        let accept = io._CryptoUtils.bytesToBase64(sha1.close());
        response.headers.add("Sec-WebSocket-Accept", accept);
        if (protocol != null) {
          response.headers.add("Sec-WebSocket-Protocol", protocol);
        }
        let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
        response.headers.contentLength = 0;
        return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
      }
      dart.fn(upgrade, StringToFuture());
      let protocols = request.headers._get('Sec-WebSocket-Protocol');
      if (protocols != null && _protocolSelector != null) {
        protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
        return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
          if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
            dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
          }
          return protocol;
        }, dynamicTodynamic$())).catchError(dart.fn(error => {
          response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
          response.close();
          dart.throw(error);
        }, dynamicTodynamic$())).then(io.WebSocket)(upgrade);
      } else {
        return FutureOfWebSocket()._check(upgrade(null));
      }
    }
    static _negotiateCompression(request, response, compression) {
      let extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
      let t = extensionHeader;
      t == null ? extensionHeader = "" : t;
      let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
      if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
        let info = compression[_createHeader](hv);
        response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
        let serverNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._serverNoContextTakeover)) && dart.test(compression.serverNoContextTakeover);
        let clientNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._clientNoContextTakeover)) && dart.test(compression.clientNoContextTakeover);
        let deflate = new io._WebSocketPerMessageDeflate({serverNoContextTakeover: serverNoContextTakeover, clientNoContextTakeover: clientNoContextTakeover, serverMaxWindowBits: info.maxWindowBits, clientMaxWindowBits: info.maxWindowBits, serverSide: true});
        return deflate;
      }
      return null;
    }
    static _isUpgradeRequest(request) {
      if (request.method != "GET") {
        return false;
      }
      if (request.headers._get(io.HttpHeaders.CONNECTION) == null) {
        return false;
      }
      let isUpgrade = false;
      request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
        if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
      }, StringTovoid$()));
      if (!isUpgrade) return false;
      let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
      if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
        return false;
      }
      let version = request.headers.value("Sec-WebSocket-Version");
      if (version == null || version != "13") {
        return false;
      }
      let key = request.headers.value("Sec-WebSocket-Key");
      if (key == null) {
        return false;
      }
      return true;
    }
  };
  io._WebSocketTransformerImpl[dart.implements] = () => [io.WebSocketTransformer];
  dart.setSignature(io._WebSocketTransformerImpl, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketTransformerImpl, [core.Function, io.CompressionOptions])}),
    fields: () => ({
      [_controller$0]: StreamControllerOfWebSocket(),
      [_protocolSelector]: core.Function,
      [_compression]: io.CompressionOptions
    }),
    methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
    statics: () => ({
      _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
      _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
      _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
    }),
    names: ['_upgrade', '_negotiateCompression', '_isUpgradeRequest']
  });
  const _ensureDecoder = Symbol('_ensureDecoder');
  const _ensureEncoder = Symbol('_ensureEncoder');
  let const$80;
  io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
    new(opts) {
      let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
      let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
      let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
      let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
      let serverSide = opts && 'serverSide' in opts ? opts.serverSide : false;
      this.clientMaxWindowBits = clientMaxWindowBits;
      this.serverMaxWindowBits = serverMaxWindowBits;
      this.serverNoContextTakeover = serverNoContextTakeover;
      this.clientNoContextTakeover = clientNoContextTakeover;
      this.serverSide = serverSide;
      this.decoder = null;
      this.encoder = null;
    }
    [_ensureDecoder]() {
      if (this.decoder == null) {
        this.decoder = io._Filter._newZLibInflateFilter(dart.test(this.serverSide) ? this.clientMaxWindowBits : this.serverMaxWindowBits, null, true);
      }
    }
    [_ensureEncoder]() {
      if (this.encoder == null) {
        this.encoder = io._Filter._newZLibDeflateFilter(false, io.ZLibOption.DEFAULT_LEVEL, dart.test(this.serverSide) ? this.serverMaxWindowBits : this.clientMaxWindowBits, io.ZLibOption.DEFAULT_MEM_LEVEL, io.ZLibOption.STRATEGY_DEFAULT, null, true);
      }
    }
    processIncomingMessage(msg) {
      this[_ensureDecoder]();
      let data = [];
      data[dartx.addAll](msg);
      data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
      this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
      let result = [];
      let out = null;
      while ((out = this.decoder.processed()) != null) {
        result[dartx.addAll](core.Iterable._check(out));
      }
      if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
        this.decoder = null;
      }
      return typed_data.Uint8List.fromList(ListOfint()._check(result));
    }
    processOutgoingMessage(msg) {
      this[_ensureEncoder]();
      let result = [];
      let buffer = null;
      let out = null;
      if (!typed_data.Uint8List.is(msg)) {
        for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
          if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
            dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${msg[dartx._get](i)} at index ${i})`));
          }
        }
        buffer = typed_data.Uint8List.fromList(msg);
      } else {
        buffer = typed_data.Uint8List._check(msg);
      }
      this.encoder.process(buffer, 0, buffer[dartx.length]);
      while ((out = this.encoder.processed()) != null) {
        result[dartx.addAll](core.Iterable._check(out));
      }
      if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
        this.encoder = null;
      }
      if (dart.notNull(result[dartx.length]) > 4) {
        result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
      }
      return ListOfint()._check(result);
    }
  };
  dart.setSignature(io._WebSocketPerMessageDeflate, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [], {clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, serverNoContextTakeover: core.bool, clientNoContextTakeover: core.bool, serverSide: core.bool})}),
    fields: () => ({
      serverNoContextTakeover: core.bool,
      clientNoContextTakeover: core.bool,
      clientMaxWindowBits: core.int,
      serverMaxWindowBits: core.int,
      serverSide: core.bool,
      decoder: io._Filter,
      encoder: io._Filter
    }),
    methods: () => ({
      [_ensureDecoder]: dart.definiteFunctionType(dart.void, []),
      [_ensureEncoder]: dart.definiteFunctionType(dart.void, []),
      processIncomingMessage: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
      processOutgoingMessage: dart.definiteFunctionType(core.List$(core.int), [ListOfint()])
    })
  });
  const _deflateHelper = Symbol('_deflateHelper');
  const _outCloseCode = Symbol('_outCloseCode');
  const _outCloseReason = Symbol('_outCloseReason');
  io._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends core.Object {
    new(webSocket) {
      this.webSocket = webSocket;
      this[_eventSink$] = null;
      this[_deflateHelper] = null;
      this[_deflateHelper] = this.webSocket[_deflate];
    }
    bind(stream) {
      return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
        if (this[_eventSink$] != null) {
          dart.throw(new core.StateError("WebSocket transformer already used"));
        }
        this[_eventSink$] = eventSink;
        return this;
      }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
    }
    add(message) {
      if (io._WebSocketPong.is(message)) {
        this.addFrame(io._WebSocketOpcode.PONG, message.payload);
        return;
      }
      if (io._WebSocketPing.is(message)) {
        this.addFrame(io._WebSocketOpcode.PING, message.payload);
        return;
      }
      let data = null;
      let opcode = null;
      if (message != null) {
        if (typeof message == 'string') {
          opcode = io._WebSocketOpcode.TEXT;
          data = convert.UTF8.encode(message);
        } else {
          if (ListOfint().is(message)) {
            data = message;
            opcode = io._WebSocketOpcode.BINARY;
          } else {
            dart.throw(new core.ArgumentError(message));
          }
        }
        if (this[_deflateHelper] != null) {
          data = this[_deflateHelper].processOutgoingMessage(data);
        }
      } else {
        opcode = io._WebSocketOpcode.TEXT;
      }
      this.addFrame(opcode, data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_eventSink$].addError(error, stackTrace);
    }
    close() {
      let code = this.webSocket[_outCloseCode];
      let reason = this.webSocket[_outCloseReason];
      let data = null;
      if (code != null) {
        data = ListOfint().new();
        data[dartx.add](dart.notNull(code) >> 8 & 255);
        data[dartx.add](dart.notNull(code) & 255);
        if (reason != null) {
          data[dartx.addAll](convert.UTF8.encode(reason));
        }
      }
      this.addFrame(io._WebSocketOpcode.CLOSE, data);
      this[_eventSink$].close();
    }
    addFrame(opcode, data) {
      return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
        this[_eventSink$].add(e);
      }, ListOfintTovoid$()));
    }
    static createFrame(opcode, data, serverSide, compressed) {
      let mask = !dart.test(serverSide);
      let dataLength = data == null ? 0 : data[dartx.length];
      let headerSize = mask ? 6 : 2;
      if (dart.notNull(dataLength) > 65535) {
        headerSize = headerSize + 8;
      } else if (dart.notNull(dataLength) > 125) {
        headerSize = headerSize + 2;
      }
      let header = typed_data.Uint8List.new(headerSize);
      let index = 0;
      let hoc = (io._WebSocketProtocolTransformer.FIN | (dart.test(compressed) ? io._WebSocketProtocolTransformer.RSV1 : 0) | dart.notNull(opcode) & io._WebSocketProtocolTransformer.OPCODE) >>> 0;
      header[dartx._set](index++, hoc);
      let lengthBytes = 1;
      if (dart.notNull(dataLength) > 65535) {
        header[dartx._set](index++, 127);
        lengthBytes = 8;
      } else if (dart.notNull(dataLength) > 125) {
        header[dartx._set](index++, 126);
        lengthBytes = 2;
      }
      for (let i = 0; i < lengthBytes; i++) {
        header[dartx._set](index++, dataLength[dartx['>>']]((lengthBytes - 1 - i) * 8) & 255);
      }
      if (mask) {
        let i$ = 1;
        header[dartx._set](i$, (dart.notNull(header[dartx._get](i$)) | 1 << 7) >>> 0);
        let maskBytes = io._IOCrypto.getRandomBytes(4);
        header[dartx.setRange](index, index + 4, maskBytes);
        index = index + 4;
        if (data != null) {
          let list = null;
          if (opcode == io._WebSocketOpcode.TEXT && typed_data.Uint8List.is(data)) {
            list = data;
          } else {
            if (typed_data.Uint8List.is(data)) {
              list = typed_data.Uint8List.fromList(data);
            } else {
              list = typed_data.Uint8List.new(data[dartx.length]);
              for (let i = 0; i < dart.notNull(data[dartx.length]); i++) {
                if (dart.notNull(data[dartx._get](i)) < 0 || 255 < dart.notNull(data[dartx._get](i))) {
                  dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${data[dartx._get](i)} at index ${i})`));
                }
                list[dartx._set](i, data[dartx._get](i));
              }
            }
          }
          let BLOCK_SIZE = 16;
          let blockCount = (dart.notNull(list[dartx.length]) / BLOCK_SIZE)[dartx.truncate]();
          if (blockCount > 0) {
            let mask = 0;
            for (let i = 3; i >= 0; i--) {
              mask = (mask << 8 | dart.notNull(maskBytes[dartx._get](i))) >>> 0;
            }
            let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
            let blockBuffer = typed_data.Int32x4List.view(list[dartx.buffer], 0, blockCount);
            for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
              blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
            }
          }
          for (let i = blockCount * BLOCK_SIZE; i < dart.notNull(list[dartx.length]); i++) {
            list[dartx._set](i, (dart.notNull(list[dartx._get](i)) ^ dart.notNull(maskBytes[dartx._get](i & 3))) >>> 0);
          }
          data = list;
        }
      }
      dart.assert(index == headerSize);
      if (data == null) {
        return JSArrayOfUint8List().of([header]);
      } else {
        return JSArrayOfListOfint().of([header, data]);
      }
    }
  };
  io._WebSocketOutgoingTransformer[dart.implements] = () => [StreamTransformerOfdynamic$ListOfint(), async.EventSink];
  dart.setSignature(io._WebSocketOutgoingTransformer, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [io._WebSocketImpl])}),
    fields: () => ({
      webSocket: io._WebSocketImpl,
      [_eventSink$]: EventSinkOfListOfint(),
      [_deflateHelper]: io._WebSocketPerMessageDeflate
    }),
    methods: () => ({
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [async.Stream]),
      add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
      close: dart.definiteFunctionType(dart.void, []),
      addFrame: dart.definiteFunctionType(dart.void, [core.int, ListOfint()])
    }),
    statics: () => ({createFrame: dart.definiteFunctionType(core.Iterable$(core.List$(core.int)), [core.int, ListOfint(), core.bool, core.bool])}),
    names: ['createFrame']
  });
  const _issuedPause = Symbol('_issuedPause');
  const _completer = Symbol('_completer');
  const _onListen$ = Symbol('_onListen');
  const _onPause$ = Symbol('_onPause');
  const _onResume$ = Symbol('_onResume');
  const _cancel$ = Symbol('_cancel');
  const _done$ = Symbol('_done');
  const _ensureController = Symbol('_ensureController');
  io._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
    new(webSocket, socket) {
      this[_closeCompleter] = async.Completer.new();
      this.webSocket = webSocket;
      this.socket = socket;
      this[_controller$0] = null;
      this[_subscription$] = null;
      this[_issuedPause] = false;
      this[_closed] = false;
      this[_completer] = null;
    }
    [_onListen$]() {
      if (this[_subscription$] != null) {
        this[_subscription$].cancel();
      }
    }
    [_onPause$]() {
      if (this[_subscription$] != null) {
        this[_subscription$].pause();
      } else {
        this[_issuedPause] = true;
      }
    }
    [_onResume$]() {
      if (this[_subscription$] != null) {
        this[_subscription$].resume();
      } else {
        this[_issuedPause] = false;
      }
    }
    [_cancel$]() {
      if (this[_subscription$] != null) {
        let subscription = this[_subscription$];
        this[_subscription$] = null;
        subscription.cancel();
      }
    }
    [_ensureController]() {
      if (this[_controller$0] != null) return;
      this[_controller$0] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause$), onResume: dart.bind(this, _onResume$), onCancel: dart.bind(this, _onListen$)});
      let stream = this[_controller$0].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
      this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
        this[_done$]();
        this[_closeCompleter].complete(this.webSocket);
      }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
          this[_closed] = true;
          this[_cancel$]();
          if (core.ArgumentError.is(error)) {
            if (!dart.test(this[_done$](error, stackTrace))) {
              this[_closeCompleter].completeError(error, stackTrace);
            }
          } else {
            this[_done$]();
            this[_closeCompleter].complete(this.webSocket);
          }
        }, dynamicAndStackTraceTodynamic())});
    }
    [_done$](error, stackTrace) {
      if (error === void 0) error = null;
      if (stackTrace === void 0) stackTrace = null;
      if (this[_completer] == null) return false;
      if (error != null) {
        this[_completer].completeError(error, stackTrace);
      } else {
        this[_completer].complete(this.webSocket);
      }
      this[_completer] = null;
      return true;
    }
    addStream(stream) {
      if (dart.test(this[_closed])) {
        stream.listen(null).cancel();
        return async.Future.value(this.webSocket);
      }
      this[_ensureController]();
      this[_completer] = async.Completer.new();
      this[_subscription$] = stream.listen(dart.fn(data => {
        this[_controller$0].add(data);
      }, dynamicTovoid$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
      if (dart.test(this[_issuedPause])) {
        this[_subscription$].pause();
        this[_issuedPause] = false;
      }
      return this[_completer].future;
    }
    close() {
      this[_ensureController]();
      const closeSocket = (function() {
        return this.socket.close().catchError(dart.fn(_ => {
        }, dynamicTodynamic$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
      }).bind(this);
      dart.fn(closeSocket, VoidToFuture());
      this[_controller$0].close();
      return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
    }
    add(data) {
      if (dart.test(this[_closed])) return;
      this[_ensureController]();
      this[_controller$0].add(data);
    }
    closeSocket() {
      this[_closed] = true;
      this[_cancel$]();
      this.close();
    }
  };
  io._WebSocketConsumer[dart.implements] = () => [async.StreamConsumer];
  dart.setSignature(io._WebSocketConsumer, {
    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketConsumer, [io._WebSocketImpl, io.Socket])}),
    fields: () => ({
      webSocket: io._WebSocketImpl,
      socket: io.Socket,
      [_controller$0]: async.StreamController,
      [_subscription$]: async.StreamSubscription,
      [_issuedPause]: core.bool,
      [_closed]: core.bool,
      [_closeCompleter]: async.Completer,
      [_completer]: async.Completer
    }),
    methods: () => ({
      [_onListen$]: dart.definiteFunctionType(dart.void, []),
      [_onPause$]: dart.definiteFunctionType(dart.void, []),
      [_onResume$]: dart.definiteFunctionType(dart.void, []),
      [_cancel$]: dart.definiteFunctionType(dart.void, []),
      [_ensureController]: dart.definiteFunctionType(dart.dynamic, []),
      [_done$]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
      addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
      close: dart.definiteFunctionType(async.Future, []),
      add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      closeSocket: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _readyState = Symbol('_readyState');
  const _writeClosed = Symbol('_writeClosed');
  const _closeCode = Symbol('_closeCode');
  const _closeReason = Symbol('_closeReason');
  const _pingInterval = Symbol('_pingInterval');
  const _pingTimer = Symbol('_pingTimer');
  const _consumer = Symbol('_consumer');
  const _closeTimer = Symbol('_closeTimer');
  let const$81;
  io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
    static connect(url, protocols, headers, opts) {
      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
      let uri = core.Uri.parse(url);
      if (uri.scheme != "ws" && uri.scheme != "wss") {
        dart.throw(new io.WebSocketException(dart.str`Unsupported URL scheme '${uri.scheme}'`));
      }
      let random = math.Random.new();
      let nonceData = typed_data.Uint8List.new(16);
      for (let i = 0; i < 16; i++) {
        nonceData[dartx._set](i, random.nextInt(256));
      }
      let nonce = io._CryptoUtils.bytesToBase64(nonceData);
      uri = core.Uri.new({scheme: uri.scheme == "wss" ? "https" : "http", userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, query: uri.query, fragment: uri.fragment});
      return io._WebSocketImpl._httpClient.openUrl("GET", uri).then(io.HttpClientResponse)(dart.fn(request => {
        if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
          let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
          request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
        }
        if (headers != null) {
          headers[dartx.forEach](dart.fn((field, value) => request.headers.add(field, value), StringAnddynamicTovoid()));
        }
        let _ = request.headers;
        _.set(io.HttpHeaders.CONNECTION, "Upgrade");
        _.set(io.HttpHeaders.UPGRADE, "websocket");
        _.set("Sec-WebSocket-Key", nonce);
        _.set("Cache-Control", "no-cache");
        _.set("Sec-WebSocket-Version", "13");
        if (protocols != null) {
          request.headers.add("Sec-WebSocket-Protocol", protocols[dartx.toList]());
        }
        if (dart.test(compression.enabled)) {
          request.headers.add("Sec-WebSocket-Extensions", compression[_createHeader]());
        }
        return request.close();
      }, HttpClientRequestToFutureOfHttpClientResponse())).then(io.WebSocket)(dart.fn(response => {
        function error(message) {
          response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
            socket.destroy();
          }, SocketTodynamic()));
          dart.throw(new io.WebSocketException(message));
        }
        dart.fn(error, StringTovoid$());
        if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool$()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
          error(dart.str`Connection to '${uri}' was not upgraded to websocket`);
        }
        let accept = response.headers.value("Sec-WebSocket-Accept");
        if (accept == null) {
          error("Response did not contain a 'Sec-WebSocket-Accept' header");
        }
        let sha1 = new io._SHA1();
        sha1.add(dart.str`${nonce}${io._webSocketGUID}`[dartx.codeUnits]);
        let expectedAccept = sha1.close();
        let receivedAccept = io._CryptoUtils.base64StringToBytes(accept);
        if (expectedAccept[dartx.length] != receivedAccept[dartx.length]) {
          error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
        }
        for (let i = 0; i < dart.notNull(expectedAccept[dartx.length]); i++) {
          if (expectedAccept[dartx._get](i) != receivedAccept[dartx._get](i)) {
            error("Bad response 'Sec-WebSocket-Accept' header");
          }
        }
        let protocol = response.headers.value('Sec-WebSocket-Protocol');
        let deflate = io._WebSocketImpl.negotiateClientCompression(response, compression);
        return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, false, deflate), SocketTo_WebSocketImpl()));
      }, HttpClientResponseToFutureOfWebSocket()));
    }
    static negotiateClientCompression(response, compression) {
      let extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
      if (extensionHeader == null) {
        extensionHeader = "";
      }
      let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
      if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
        let serverNoContextTakeover = hv.parameters[dartx.containsKey](io._serverNoContextTakeover);
        let clientNoContextTakeover = hv.parameters[dartx.containsKey](io._clientNoContextTakeover);
        function getWindowBits(type) {
          let o = hv.parameters[dartx._get](type);
          if (o == null) {
            return io._WebSocketImpl.DEFAULT_WINDOW_BITS;
          }
          return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())});
        }
        dart.fn(getWindowBits, StringToint$());
        return new io._WebSocketPerMessageDeflate({clientMaxWindowBits: getWindowBits(io._clientMaxWindowBits), serverMaxWindowBits: getWindowBits(io._serverMaxWindowBits), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
      }
      return null;
    }
    _fromSocket(socket, protocol, compression, serverSide, deflate) {
      if (serverSide === void 0) serverSide = false;
      if (deflate === void 0) deflate = null;
      this[_socket] = socket;
      this.protocol = protocol;
      this[_serverSide] = serverSide;
      this[_controller$0] = null;
      this[_subscription$] = null;
      this[_sink$0] = null;
      this[_readyState] = io.WebSocket.CONNECTING;
      this[_writeClosed] = false;
      this[_closeCode] = null;
      this[_closeReason] = null;
      this[_pingInterval] = null;
      this[_pingTimer] = null;
      this[_consumer] = null;
      this[_outCloseCode] = null;
      this[_outCloseReason] = null;
      this[_closeTimer] = null;
      this[_deflate] = null;
      super.new();
      this[_consumer] = new io._WebSocketConsumer(this, io.Socket._check(this[_socket]));
      this[_sink$0] = new io._StreamSinkImpl(this[_consumer]);
      this[_readyState] = io.WebSocket.OPEN;
      this[_deflate] = deflate;
      let transformer = new io._WebSocketProtocolTransformer(this[_serverSide], this[_deflate]);
      this[_subscription$] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
        if (io._WebSocketPing.is(data)) {
          if (!dart.test(this[_writeClosed])) this[_consumer].add(new io._WebSocketPong(data.payload));
        } else if (io._WebSocketPong.is(data)) {
          this.pingInterval = this[_pingInterval];
        } else {
          this[_controller$0].add(data);
        }
      }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
          if (this[_closeTimer] != null) this[_closeTimer].cancel();
          if (core.FormatException.is(error)) {
            this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
          } else {
            this[_close$0](io.WebSocketStatus.PROTOCOL_ERROR);
          }
          this[_closeCode] = this[_outCloseCode];
          this[_closeReason] = this[_outCloseReason];
          this[_controller$0].close();
        }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
          if (this[_closeTimer] != null) this[_closeTimer].cancel();
          if (this[_readyState] == io.WebSocket.OPEN) {
            this[_readyState] = io.WebSocket.CLOSING;
            if (!dart.test(io._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
              this[_close$0](transformer.closeCode, transformer.closeReason);
            } else {
              this[_close$0]();
            }
            this[_readyState] = io.WebSocket.CLOSED;
          }
          this[_closeCode] = transformer.closeCode;
          this[_closeReason] = transformer.closeReason;
          this[_controller$0].close();
        }, VoidTodynamic$()), cancelOnError: true}));
      this[_subscription$].pause();
      this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
          this[_subscription$].cancel();
          this[_subscription$] = null;
        }, VoidTodynamic$()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
      io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
      try {
        dart.dput(this[_socket], _owner, this);
      } catch (_) {
      }

    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    get pingInterval() {
      return this[_pingInterval];
    }
    set pingInterval(interval) {
      if (dart.test(this[_writeClosed])) return;
      if (this[_pingTimer] != null) this[_pingTimer].cancel();
      this[_pingInterval] = interval;
      if (this[_pingInterval] == null) return;
      this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
        if (dart.test(this[_writeClosed])) return;
        this[_consumer].add(new io._WebSocketPing());
        this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
          this[_close$0](io.WebSocketStatus.GOING_AWAY);
        }, VoidTovoid$()));
      }, VoidTovoid$()));
    }
    get readyState() {
      return this[_readyState];
    }
    get extensions() {
      return null;
    }
    get closeCode() {
      return this[_closeCode];
    }
    get closeReason() {
      return this[_closeReason];
    }
    add(data) {
      this[_sink$0].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_sink$0].addError(error, stackTrace);
    }
    addStream(stream) {
      return this[_sink$0].addStream(stream);
    }
    get done() {
      return this[_sink$0].done;
    }
    close(code, reason) {
      if (code === void 0) code = null;
      if (reason === void 0) reason = null;
      if (dart.test(io._WebSocketImpl._isReservedStatusCode(code))) {
        dart.throw(new io.WebSocketException(dart.str`Reserved status code ${code}`));
      }
      if (this[_outCloseCode] == null) {
        this[_outCloseCode] = code;
        this[_outCloseReason] = reason;
      }
      if (!dart.test(this[_controller$0].isClosed)) {
        if (!dart.test(this[_controller$0].hasListener) && this[_subscription$] != null) {
          this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
        }
        if (this[_closeTimer] == null) {
          this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
            this[_closeCode] = this[_outCloseCode];
            this[_closeReason] = this[_outCloseReason];
            if (this[_subscription$] != null) this[_subscription$].cancel();
            this[_controller$0].close();
            io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
          }, VoidTovoid$()));
        }
      }
      return this[_sink$0].close();
    }
    [_close$0](code, reason) {
      if (code === void 0) code = null;
      if (reason === void 0) reason = null;
      if (dart.test(this[_writeClosed])) return;
      if (this[_outCloseCode] == null) {
        this[_outCloseCode] = code;
        this[_outCloseReason] = reason;
      }
      this[_writeClosed] = true;
      this[_consumer].closeSocket();
      io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
    }
    get [_serviceTypePath]() {
      return 'io/websockets';
    }
    get [_serviceTypeName]() {
      return 'WebSocket';
    }
    [_toJSON$](ref) {
      let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')}`;
      let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
      if (dart.test(ref)) {
        return r;
      }
      try {
        r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
      } catch (_) {
        r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
      }

      return r;
    }
    static _isReservedStatusCode(code) {
      return code != null && (dart.notNull(code) < io.WebSocketStatus.NORMAL_CLOSURE || code == io.WebSocketStatus.RESERVED_1004 || code == io.WebSocketStatus.NO_STATUS_RECEIVED || code == io.WebSocketStatus.ABNORMAL_CLOSURE || dart.notNull(code) > io.WebSocketStatus.INTERNAL_SERVER_ERROR && dart.notNull(code) < io.WebSocketStatus.RESERVED_1015 || dart.notNull(code) >= io.WebSocketStatus.RESERVED_1015 && dart.notNull(code) < 3000);
    }
  };
  dart.addSimpleTypeTests(io._WebSocketImpl);
  dart.defineNamedConstructor(io._WebSocketImpl, '_fromSocket');
  io._WebSocketImpl[dart.implements] = () => [io.WebSocket];
  dart.setSignature(io._WebSocketImpl, {
    constructors: () => ({_fromSocket: dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic, core.String, io.CompressionOptions], [core.bool, io._WebSocketPerMessageDeflate])}),
    fields: () => ({
      protocol: core.String,
      [_controller$0]: async.StreamController,
      [_subscription$]: async.StreamSubscription,
      [_sink$0]: async.StreamSink,
      [_socket]: dart.dynamic,
      [_serverSide]: core.bool,
      [_readyState]: core.int,
      [_writeClosed]: core.bool,
      [_closeCode]: core.int,
      [_closeReason]: core.String,
      [_pingInterval]: core.Duration,
      [_pingTimer]: async.Timer,
      [_consumer]: io._WebSocketConsumer,
      [_outCloseCode]: core.int,
      [_outCloseReason]: core.String,
      [_closeTimer]: async.Timer,
      [_deflate]: io._WebSocketPerMessageDeflate
    }),
    getters: () => ({
      pingInterval: dart.definiteFunctionType(core.Duration, []),
      readyState: dart.definiteFunctionType(core.int, []),
      extensions: dart.definiteFunctionType(core.String, []),
      closeCode: dart.definiteFunctionType(core.int, []),
      closeReason: dart.definiteFunctionType(core.String, []),
      done: dart.definiteFunctionType(async.Future, []),
      [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
      [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({pingInterval: dart.definiteFunctionType(dart.void, [core.Duration])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
      close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
      [_close$0]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
      [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
    }),
    sfields: () => ({
      _webSockets: MapOfint$_WebSocketImpl(),
      DEFAULT_WINDOW_BITS: core.int,
      PER_MESSAGE_DEFLATE: core.String,
      _httpClient: io.HttpClient
    }),
    statics: () => ({
      connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String, IterableOfString(), MapOfString$dynamic()], {compression: io.CompressionOptions}),
      negotiateClientCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpClientResponse, io.CompressionOptions]),
      _isReservedStatusCode: dart.definiteFunctionType(core.bool, [core.int])
    }),
    names: ['connect', 'negotiateClientCompression', '_isReservedStatusCode']
  });
  io._WebSocketImpl.DEFAULT_WINDOW_BITS = 15;
  io._WebSocketImpl.PER_MESSAGE_DEFLATE = "permessage-deflate";
  dart.defineLazy(io._WebSocketImpl, {
    get _webSockets() {
      return MapOfint$_WebSocketImpl().new();
    },
    set _webSockets(_) {},
    get _httpClient() {
      return io.HttpClient.new();
    }
  });
  isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
    new(message) {
      this.message = message;
    }
    toString() {
      return dart.str`IsolateSpawnException: ${this.message}`;
    }
  };
  isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
  dart.setSignature(isolate.IsolateSpawnException, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.IsolateSpawnException, [core.String])}),
    fields: () => ({message: core.String})
  });
  const _pause = Symbol('_pause');
  isolate.Isolate = class Isolate extends core.Object {
    new(controlPort, opts) {
      let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
      let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
      this.controlPort = controlPort;
      this.pauseCapability = pauseCapability;
      this.terminateCapability = terminateCapability;
    }
    static get current() {
      return isolate.Isolate._currentIsolateCache;
    }
    static spawn(entryPoint, message, opts) {
      let paused = opts && 'paused' in opts ? opts.paused : false;
      try {
        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
      } catch (e) {
        let st = dart.stackTrace(e);
        return FutureOfIsolate().error(e, st);
      }

    }
    static spawnUri(uri, args, message, opts) {
      let paused = opts && 'paused' in opts ? opts.paused : false;
      let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
      if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
      try {
        if (core.List.is(args)) {
          for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
            if (!(typeof args[dartx._get](i) == 'string')) {
              dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
            }
          }
        } else if (args != null) {
          dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
        }
        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
      } catch (e) {
        let st = dart.stackTrace(e);
        return FutureOfIsolate().error(e, st);
      }

    }
    pause(resumeCapability) {
      if (resumeCapability === void 0) resumeCapability = null;
      if (resumeCapability == null) resumeCapability = isolate.Capability.new();
      this[_pause](resumeCapability);
      return resumeCapability;
    }
    [_pause](resumeCapability) {
      let message = core.List.new(3);
      message[dartx._set](0, "pause");
      message[dartx._set](1, this.pauseCapability);
      message[dartx._set](2, resumeCapability);
      this.controlPort.send(message);
    }
    resume(resumeCapability) {
      let message = core.List.new(2);
      message[dartx._set](0, "resume");
      message[dartx._set](1, resumeCapability);
      this.controlPort.send(message);
    }
    addOnExitListener(responsePort) {
      let message = core.List.new(2);
      message[dartx._set](0, "add-ondone");
      message[dartx._set](1, responsePort);
      this.controlPort.send(message);
    }
    removeOnExitListener(responsePort) {
      let message = core.List.new(2);
      message[dartx._set](0, "remove-ondone");
      message[dartx._set](1, responsePort);
      this.controlPort.send(message);
    }
    setErrorsFatal(errorsAreFatal) {
      let message = core.List.new(3);
      message[dartx._set](0, "set-errors-fatal");
      message[dartx._set](1, this.terminateCapability);
      message[dartx._set](2, errorsAreFatal);
      this.controlPort.send(message);
    }
    kill(priority) {
      if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
      this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
    }
    ping(responsePort, pingType) {
      if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
      let message = core.List.new(3);
      message[dartx._set](0, "ping");
      message[dartx._set](1, responsePort);
      message[dartx._set](2, pingType);
      this.controlPort.send(message);
    }
    addErrorListener(port) {
      let message = core.List.new(2);
      message[dartx._set](0, "getErrors");
      message[dartx._set](1, port);
      this.controlPort.send(message);
    }
    removeErrorListener(port) {
      let message = core.List.new(2);
      message[dartx._set](0, "stopErrors");
      message[dartx._set](1, port);
      this.controlPort.send(message);
    }
    get errors() {
      let controller = null;
      let port = null;
      function handleError(message) {
        let errorDescription = core.String._check(dart.dindex(message, 0));
        let stackDescription = core.String._check(dart.dindex(message, 1));
        let error = new isolate.RemoteError(errorDescription, stackDescription);
        controller.addError(error, error.stackTrace);
      }
      dart.fn(handleError, dynamicTovoid$());
      controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
          port = isolate.RawReceivePort.new(handleError);
          this.addErrorListener(port.sendPort);
        }, VoidTovoid$()), onCancel: dart.fn(() => {
          this.removeErrorListener(port.sendPort);
          port.close();
          port = null;
        }, VoidTovoid$())});
      return controller.stream;
    }
  };
  dart.setSignature(isolate.Isolate, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.Isolate, [isolate.SendPort], {pauseCapability: isolate.Capability, terminateCapability: isolate.Capability})}),
    fields: () => ({
      controlPort: isolate.SendPort,
      pauseCapability: isolate.Capability,
      terminateCapability: isolate.Capability
    }),
    getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
    methods: () => ({
      pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
      [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
      resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
      kill: dart.definiteFunctionType(dart.void, [], [core.int]),
      ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
    }),
    sfields: () => ({
      IMMEDIATE: core.int,
      BEFORE_NEXT_EVENT: core.int,
      AS_EVENT: core.int,
      _currentIsolateCache: isolate.Isolate
    }),
    sgetters: () => ({current: dart.definiteFunctionType(isolate.Isolate, [])}),
    statics: () => ({
      spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
      spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
    }),
    names: ['spawn', 'spawnUri']
  });
  isolate.Isolate.IMMEDIATE = 0;
  isolate.Isolate.BEFORE_NEXT_EVENT = 1;
  isolate.Isolate.AS_EVENT = 2;
  dart.defineLazy(isolate.Isolate, {
    get _currentIsolateCache() {
      return _isolate_helper.IsolateNatives.currentIsolate;
    }
  });
  isolate.SendPort = class SendPort extends core.Object {};
  isolate.SendPort[dart.implements] = () => [isolate.Capability];
  isolate.ReceivePort = class ReceivePort extends core.Object {
    static new() {
      return new _isolate_helper.ReceivePortImpl();
    }
    static fromRawReceivePort(rawPort) {
      return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
    }
  };
  isolate.ReceivePort[dart.implements] = () => [async.Stream];
  dart.setSignature(isolate.ReceivePort, {
    constructors: () => ({
      new: dart.definiteFunctionType(isolate.ReceivePort, []),
      fromRawReceivePort: dart.definiteFunctionType(isolate.ReceivePort, [isolate.RawReceivePort])
    })
  });
  isolate.RawReceivePort = class RawReceivePort extends core.Object {
    static new(handler) {
      if (handler === void 0) handler = null;
      return new _isolate_helper.RawReceivePortImpl(handler);
    }
  };
  dart.setSignature(isolate.RawReceivePort, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.RawReceivePort, [], [dynamicTovoid()])})
  });
  isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
    new(message, source, stackTrace) {
      this.message = message;
      this.source = source;
      this.stackTrace = stackTrace;
    }
    toString() {
      return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
    }
  };
  isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
  dart.setSignature(isolate._IsolateUnhandledException, {
    constructors: () => ({new: dart.definiteFunctionType(isolate._IsolateUnhandledException, [dart.dynamic, dart.dynamic, core.StackTrace])}),
    fields: () => ({
      message: dart.dynamic,
      source: dart.dynamic,
      stackTrace: core.StackTrace
    })
  });
  const _description = Symbol('_description');
  isolate.RemoteError = class RemoteError extends core.Object {
    new(description, stackDescription) {
      this[_description] = description;
      this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
    }
    toString() {
      return this[_description];
    }
  };
  isolate.RemoteError[dart.implements] = () => [core.Error];
  dart.setSignature(isolate.RemoteError, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.RemoteError, [core.String, core.String])}),
    fields: () => ({
      [_description]: core.String,
      stackTrace: core.StackTrace
    })
  });
  const _trace$ = Symbol('_trace');
  isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
    new(trace) {
      this[_trace$] = trace;
    }
    toString() {
      return this[_trace$];
    }
  };
  isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
  dart.setSignature(isolate._RemoteStackTrace, {
    constructors: () => ({new: dart.definiteFunctionType(isolate._RemoteStackTrace, [core.String])}),
    fields: () => ({[_trace$]: core.String})
  });
  isolate.Capability = class Capability extends core.Object {
    static new() {
      return new _isolate_helper.CapabilityImpl();
    }
  };
  dart.setSignature(isolate.Capability, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.Capability, [])})
  });
  dart.defineLazy(js, {
    get _global() {
      return dart.global;
    }
  });
  dart.defineLazy(js, {
    get context() {
      return js._wrapToDart(js._global);
    }
  });
  const _jsObject = Symbol('_jsObject');
  js.JsObject = class JsObject extends core.Object {
    _fromJs(jsObject) {
      this[_jsObject] = jsObject;
      dart.assert(this[_jsObject] != null);
    }
    static new(constructor, arguments$) {
      if (arguments$ === void 0) arguments$ = null;
      let ctor = constructor[_jsObject];
      if (arguments$ == null) {
        return js._wrapToDart(new ctor());
      }
      let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
      return js._wrapToDart(new ctor(...unwrapped));
    }
    static fromBrowserObject(object) {
      if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
        dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
      }
      return js._wrapToDart(js._convertToJS(object));
    }
    static jsify(object) {
      if (!core.Map.is(object) && !core.Iterable.is(object)) {
        dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
      }
      return js._wrapToDart(js.JsObject._convertDataTree(object));
    }
    static _convertDataTree(data) {
      let _convertedObjects = collection.HashMap.identity();
      function _convert(o) {
        if (dart.test(_convertedObjects.containsKey(o))) {
          return _convertedObjects._get(o);
        }
        if (core.Map.is(o)) {
          let convertedMap = {};
          _convertedObjects._set(o, convertedMap);
          for (let key of o[dartx.keys]) {
            convertedMap[key] = _convert(o[dartx._get](key));
          }
          return convertedMap;
        } else if (core.Iterable.is(o)) {
          let convertedList = [];
          _convertedObjects._set(o, convertedList);
          convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
          return convertedList;
        } else {
          return js._convertToJS(o);
        }
      }
      dart.fn(_convert, dynamicTodynamic$());
      return _convert(data);
    }
    _get(property) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      return js._convertToDart(this[_jsObject][property]);
    }
    _set(property, value) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      this[_jsObject][property] = js._convertToJS(value);
      return value;
    }
    get hashCode() {
      return 0;
    }
    ['=='](other) {
      return js.JsObject.is(other) && this[_jsObject] === other[_jsObject];
    }
    hasProperty(property) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      return property in this[_jsObject];
    }
    deleteProperty(property) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      delete this[_jsObject][property];
    }
    instanceof(type) {
      return this[_jsObject] instanceof js._convertToJS(type);
    }
    toString() {
      try {
        return String(this[_jsObject]);
      } catch (e) {
        return super.toString();
      }

    }
    callMethod(method, args) {
      if (args === void 0) args = null;
      if (!(typeof method == 'string') && !(typeof method == 'number')) {
        dart.throw(new core.ArgumentError("method is not a String or num"));
      }
      if (args != null) args = core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS));
      let fn = this[_jsObject][method];
      if (typeof fn !== "function") {
        dart.throw(new core.NoSuchMethodError(this[_jsObject], core.Symbol.new(core.String._check(method)), args, dart.map({}, core.Symbol, dart.dynamic)));
      }
      return js._convertToDart(fn.apply(this[_jsObject], args));
    }
  };
  dart.defineNamedConstructor(js.JsObject, '_fromJs');
  dart.setSignature(js.JsObject, {
    constructors: () => ({
      _fromJs: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
      new: dart.definiteFunctionType(js.JsObject, [js.JsFunction], [core.List]),
      fromBrowserObject: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
      jsify: dart.definiteFunctionType(js.JsObject, [dart.dynamic])
    }),
    fields: () => ({[_jsObject]: dart.dynamic}),
    methods: () => ({
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      _set: dart.definiteFunctionType(dart.dynamic, [core.Object, dart.dynamic]),
      hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      deleteProperty: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      instanceof: dart.definiteFunctionType(core.bool, [js.JsFunction]),
      callMethod: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.List])
    }),
    statics: () => ({_convertDataTree: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_convertDataTree']
  });
  js.JsFunction = class JsFunction extends js.JsObject {
    static withThis(f) {
      return new js.JsFunction._fromJs(function() {
        let args = [js._convertToDart(this)];
        for (let arg of arguments) {
          args.push(js._convertToDart(arg));
        }
        return js._convertToJS(f(...args));
      });
    }
    _fromJs(jsObject) {
      super._fromJs(jsObject);
    }
    apply(args, opts) {
      let thisArg = opts && 'thisArg' in opts ? opts.thisArg : null;
      return js._convertToDart(this[_jsObject].apply(js._convertToJS(thisArg), args == null ? null : core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS))));
    }
  };
  dart.defineNamedConstructor(js.JsFunction, '_fromJs');
  dart.setSignature(js.JsFunction, {
    constructors: () => ({
      withThis: dart.definiteFunctionType(js.JsFunction, [core.Function]),
      _fromJs: dart.definiteFunctionType(js.JsFunction, [dart.dynamic])
    }),
    methods: () => ({apply: dart.definiteFunctionType(dart.dynamic, [core.List], {thisArg: dart.dynamic})})
  });
  const _checkIndex = Symbol('_checkIndex');
  const _checkInsertIndex = Symbol('_checkInsertIndex');
  js.JsArray$ = dart.generic(E => {
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    let JSArrayOfEAndEToint = () => (JSArrayOfEAndEToint = dart.constFn(_interceptors.JSArray$(EAndEToint())))();
    class JsArray extends dart.mixin(js.JsObject, collection.ListMixin$(E)) {
      new() {
        super._fromJs([]);
      }
      from(other) {
        super._fromJs((() => {
          let _ = [];
          _[dartx.addAll](other[dartx.map](dart.dynamic)(js._convertToJS));
          return _;
        })());
      }
      _fromJs(jsObject) {
        super._fromJs(jsObject);
      }
      [_checkIndex](index) {
        if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length))) {
          dart.throw(new core.RangeError.range(index, 0, this.length));
        }
      }
      [_checkInsertIndex](index) {
        if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length) + 1)) {
          dart.throw(new core.RangeError.range(index, 0, this.length));
        }
      }
      static _checkRange(start, end, length) {
        if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
          dart.throw(new core.RangeError.range(start, 0, length));
        }
        if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
          dart.throw(new core.RangeError.range(end, start, length));
        }
      }
      _get(index) {
        if (typeof index == 'number' && index == index[dartx.toInt]()) {
          this[_checkIndex](dart.asInt(index));
        }
        return E.as(super._get(index));
      }
      _set(index, value) {
        E._check(value);
        if (typeof index == 'number' && index == index[dartx.toInt]()) {
          this[_checkIndex](dart.asInt(index));
        }
        super._set(index, value);
        return value;
      }
      get length() {
        let len = this[_jsObject].length;
        if (typeof len === "number" && len >>> 0 === len) {
          return len;
        }
        dart.throw(new core.StateError('Bad JsArray length'));
      }
      set length(length) {
        super._set('length', length);
      }
      add(value) {
        E._check(value);
        this.callMethod('push', JSArrayOfE().of([value]));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        let list = iterable instanceof Array ? iterable : core.List.from(iterable);
        this.callMethod('push', core.List._check(list));
      }
      insert(index, element) {
        E._check(element);
        this[_checkInsertIndex](index);
        this.callMethod('splice', JSArrayOfObject().of([index, 0, element]));
      }
      removeAt(index) {
        this[_checkIndex](index);
        return E.as(dart.dindex(this.callMethod('splice', JSArrayOfint().of([index, 1])), 0));
      }
      removeLast() {
        if (this.length == 0) dart.throw(new core.RangeError(-1));
        return E.as(this.callMethod('pop'));
      }
      removeRange(start, end) {
        js.JsArray._checkRange(start, end, this.length);
        this.callMethod('splice', JSArrayOfint().of([start, dart.notNull(end) - dart.notNull(start)]));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        js.JsArray._checkRange(start, end, this.length);
        let length = dart.notNull(end) - dart.notNull(start);
        if (length == 0) return;
        if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
        let args = JSArrayOfObject().of([start, length]);
        args[dartx.addAll](iterable[dartx.skip](skipCount)[dartx.take](length));
        this.callMethod('splice', args);
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        this.callMethod('sort', compare == null ? [] : JSArrayOfEAndEToint().of([compare]));
      }
    }
    dart.addTypeTests(JsArray);
    dart.defineNamedConstructor(JsArray, 'from');
    dart.defineNamedConstructor(JsArray, '_fromJs');
    dart.setSignature(JsArray, {
      constructors: () => ({
        new: dart.definiteFunctionType(js.JsArray$(E), []),
        from: dart.definiteFunctionType(js.JsArray$(E), [IterableOfE()]),
        _fromJs: dart.definiteFunctionType(js.JsArray$(E), [dart.dynamic])
      }),
      getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        [_checkIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
        [_checkInsertIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
        _get: dart.definiteFunctionType(E, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [core.Object, E]),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()])
      }),
      statics: () => ({_checkRange: dart.definiteFunctionType(dart.dynamic, [core.int, core.int, core.int])}),
      names: ['_checkRange']
    });
    dart.defineExtensionMembers(JsArray, [
      '_get',
      '_set',
      'add',
      'addAll',
      'insert',
      'removeAt',
      'removeLast',
      'removeRange',
      'setRange',
      'sort',
      'length',
      'length'
    ]);
    return JsArray;
  });
  js.JsArray = JsArray();
  js._isBrowserType = function(o) {
    return o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || o instanceof Window;
  };
  dart.fn(js._isBrowserType, dynamicTobool$());
  const _dartObj = Symbol('_dartObj');
  js._DartObject = class _DartObject extends core.Object {
    new(dartObj) {
      this[_dartObj] = dartObj;
    }
  };
  dart.setSignature(js._DartObject, {
    constructors: () => ({new: dart.definiteFunctionType(js._DartObject, [dart.dynamic])}),
    fields: () => ({[_dartObj]: dart.dynamic})
  });
  js._convertToJS = function(o) {
    if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
      return o;
    } else if (core.DateTime.is(o)) {
      return _js_helper.Primitives.lazyAsJsDate(o);
    } else if (js.JsObject.is(o)) {
      return o[_jsObject];
    } else if (core.Function.is(o)) {
      return js._putIfAbsent(js._jsProxies, o, js._wrapDartFunction);
    } else {
      return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject(o), dynamicTo_DartObject()));
    }
  };
  dart.fn(js._convertToJS, dynamicTodynamic$());
  js._wrapDartFunction = function(f) {
    let wrapper = function() {
      let args = Array.prototype.map.call(arguments, js._convertToDart);
      return js._convertToJS(f(...args));
    };
    js._dartProxies.set(wrapper, f);
    return wrapper;
  };
  dart.fn(js._wrapDartFunction, dynamicTodynamic$());
  js._convertToDart = function(o) {
    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean" || dart.test(js._isBrowserType(o))) {
      return o;
    } else if (o instanceof Date) {
      let ms = o.getTime();
      return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms));
    } else if (js._DartObject.is(o) && dart.jsobject != dart.getReifiedType(o)) {
      return o[_dartObj];
    } else {
      return js._wrapToDart(o);
    }
  };
  dart.fn(js._convertToDart, dynamicToObject());
  js._wrapToDart = function(o) {
    return js.JsObject._check(js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper));
  };
  dart.fn(js._wrapToDart, dynamicToJsObject());
  js._wrapToDartHelper = function(o) {
    if (typeof o == "function") {
      return new js.JsFunction._fromJs(o);
    }
    if (o instanceof Array) {
      return new js.JsArray._fromJs(o);
    }
    return new js.JsObject._fromJs(o);
  };
  dart.fn(js._wrapToDartHelper, dynamicToJsObject());
  dart.defineLazy(js, {
    get _dartProxies() {
      return new WeakMap();
    }
  });
  dart.defineLazy(js, {
    get _jsProxies() {
      return new WeakMap();
    }
  });
  js._putIfAbsent = function(weakMap, o, getValue) {
    let value = weakMap.get(o);
    if (value == null) {
      value = dart.dcall(getValue, o);
      weakMap.set(o, value);
    }
    return value;
  };
  dart.fn(js._putIfAbsent, dynamicAnddynamicAndFnToObject());
  js.allowInterop = function(F) {
    return f => {
      return f;
    };
  };
  dart.fn(js.allowInterop, FToF());
  dart.defineLazy(js, {
    get _interopCaptureThisExpando() {
      return new (ExpandoOfFunction())();
    },
    set _interopCaptureThisExpando(_) {}
  });
  js.allowInteropCaptureThis = function(f) {
    let ret = js._interopCaptureThisExpando._get(f);
    if (ret == null) {
      ret = function() {
        let args = [this];
        for (let arg of arguments) {
          args.push(arg);
        }
        return f(...args);
      };
      js._interopCaptureThisExpando._set(f, ret);
    }
    return ret;
  };
  dart.fn(js.allowInteropCaptureThis, FunctionToFunction());
  js_util.jsify = function(object) {
    if (!core.Map.is(object) && !core.Iterable.is(object)) {
      dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
    }
    return js_util._convertDataTree(object);
  };
  dart.fn(js_util.jsify, dynamicTodynamic$());
  js_util._convertDataTree = function(data) {
    let _convertedObjects = collection.HashMap.identity();
    function _convert(o) {
      if (dart.test(_convertedObjects.containsKey(o))) {
        return _convertedObjects._get(o);
      }
      if (core.Map.is(o)) {
        let convertedMap = {};
        _convertedObjects._set(o, convertedMap);
        for (let key of o[dartx.keys]) {
          convertedMap[key] = _convert(o[dartx._get](key));
        }
        return convertedMap;
      } else if (core.Iterable.is(o)) {
        let convertedList = [];
        _convertedObjects._set(o, convertedList);
        convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
        return convertedList;
      } else {
        return o;
      }
    }
    dart.fn(_convert, dynamicTodynamic$());
    return _convert(data);
  };
  dart.fn(js_util._convertDataTree, dynamicTodynamic$());
  js_util.newObject = function() {
    return {};
  };
  dart.fn(js_util.newObject, VoidTodynamic$());
  js_util.hasProperty = function(o, name) {
    return name in o;
  };
  dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic$());
  js_util.getProperty = function(o, name) {
    return o[name];
  };
  dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic$());
  js_util.setProperty = function(o, name, value) {
    return o[name] = value;
  };
  dart.fn(js_util.setProperty, dynamicAnddynamicAnddynamicTodynamic());
  js_util.callMethod = function(o, method, args) {
    return o[method].apply(o, args);
  };
  dart.fn(js_util.callMethod, dynamicAndStringAndListTodynamic());
  js_util.instanceof = function(o, type) {
    return o instanceof type;
  };
  dart.fn(js_util.instanceof, dynamicAndFunctionTodynamic());
  js_util.callConstructor = function(constr, arguments$) {
    if (arguments$ == null) {
      return new constr();
    }
    if (arguments$ instanceof Array) {
      let argumentCount = arguments$.length;
      switch (argumentCount) {
        case 0:
        {
          return new constr();
        }
        case 1:
        {
          let arg0 = arguments$[0];
          return new constr(arg0);
        }
        case 2:
        {
          let arg0 = arguments$[0];
          let arg1 = arguments$[1];
          return new constr(arg0, arg1);
        }
        case 3:
        {
          let arg0 = arguments$[0];
          let arg1 = arguments$[1];
          let arg2 = arguments$[2];
          return new constr(arg0, arg1, arg2);
        }
        case 4:
        {
          let arg0 = arguments$[0];
          let arg1 = arguments$[1];
          let arg2 = arguments$[2];
          let arg3 = arguments$[3];
          return new constr(arg0, arg1, arg2, arg3);
        }
      }
    }
    let args = [null];
    args[dartx.addAll](arguments$);
    let factoryFunction = constr.bind.apply(constr, args);
    String(factoryFunction);
    return new factoryFunction();
  };
  dart.fn(js_util.callConstructor, FunctionAndListTodynamic());
  math.E = 2.718281828459045;
  math.LN10 = 2.302585092994046;
  math.LN2 = 0.6931471805599453;
  math.LOG2E = 1.4426950408889634;
  math.LOG10E = 0.4342944819032518;
  math.PI = 3.141592653589793;
  math.SQRT1_2 = 0.7071067811865476;
  math.SQRT2 = 1.4142135623730951;
  math.min = function(T) {
    return (a, b) => {
      return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
    };
  };
  dart.fn(math.min, TAndTToT());
  math.max = function(T) {
    return (a, b) => {
      return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
    };
  };
  dart.fn(math.max, TAndTToT$());
  math.atan2 = function(a, b) {
    return Math.atan2(_js_helper.checkNum(a), _js_helper.checkNum(b));
  };
  dart.fn(math.atan2, numAndnumTodouble());
  math.pow = function(x, exponent) {
    _js_helper.checkNum(x);
    _js_helper.checkNum(exponent);
    return Math.pow(x, exponent);
  };
  dart.fn(math.pow, numAndnumTonum());
  math.sin = function(x) {
    return Math.sin(_js_helper.checkNum(x));
  };
  dart.fn(math.sin, numTodouble());
  math.cos = function(x) {
    return Math.cos(_js_helper.checkNum(x));
  };
  dart.fn(math.cos, numTodouble());
  math.tan = function(x) {
    return Math.tan(_js_helper.checkNum(x));
  };
  dart.fn(math.tan, numTodouble());
  math.acos = function(x) {
    return Math.acos(_js_helper.checkNum(x));
  };
  dart.fn(math.acos, numTodouble());
  math.asin = function(x) {
    return Math.asin(_js_helper.checkNum(x));
  };
  dart.fn(math.asin, numTodouble());
  math.atan = function(x) {
    return Math.atan(_js_helper.checkNum(x));
  };
  dart.fn(math.atan, numTodouble());
  math.sqrt = function(x) {
    return Math.sqrt(_js_helper.checkNum(x));
  };
  dart.fn(math.sqrt, numTodouble());
  math.exp = function(x) {
    return Math.exp(_js_helper.checkNum(x));
  };
  dart.fn(math.exp, numTodouble());
  math.log = function(x) {
    return Math.log(_js_helper.checkNum(x));
  };
  dart.fn(math.log, numTodouble());
  math._POW2_32 = 4294967296;
  math._JSRandom = class _JSRandom extends core.Object {
    new() {
    }
    nextInt(max) {
      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
      }
      return Math.random() * max >>> 0;
    }
    nextDouble() {
      return Math.random();
    }
    nextBool() {
      return Math.random() < 0.5;
    }
  };
  math._JSRandom[dart.implements] = () => [math.Random];
  dart.setSignature(math._JSRandom, {
    constructors: () => ({new: dart.definiteFunctionType(math._JSRandom, [])}),
    methods: () => ({
      nextInt: dart.definiteFunctionType(core.int, [core.int]),
      nextDouble: dart.definiteFunctionType(core.double, []),
      nextBool: dart.definiteFunctionType(core.bool, [])
    })
  });
  const _lo = Symbol('_lo');
  const _hi = Symbol('_hi');
  const _nextState = Symbol('_nextState');
  math._Random = class _Random extends core.Object {
    new(seed) {
      this[_lo] = 0;
      this[_hi] = 0;
      let empty_seed = 0;
      if (dart.notNull(seed) < 0) {
        empty_seed = -1;
      }
      do {
        let low = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
        seed = ((dart.notNull(seed) - low) / math._POW2_32)[dartx.truncate]();
        let high = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
        seed = ((dart.notNull(seed) - high) / math._POW2_32)[dartx.truncate]();
        let tmplow = low << 21 >>> 0;
        let tmphigh = (high << 21 | low[dartx['>>']](11)) >>> 0;
        tmplow = ((~low & math._Random._MASK32) >>> 0) + tmplow;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = ((~high >>> 0) + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmphigh = high[dartx['>>']](24);
        tmplow = (low[dartx['>>']](24) | high << 8) >>> 0;
        low = (low ^ tmplow) >>> 0;
        high = (high ^ tmphigh) >>> 0;
        tmplow = low * 265;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = (high * 265 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmphigh = high[dartx['>>']](14);
        tmplow = (low[dartx['>>']](14) | high << 18) >>> 0;
        low = (low ^ tmplow) >>> 0;
        high = (high ^ tmphigh) >>> 0;
        tmplow = low * 21;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = (high * 21 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmphigh = high[dartx['>>']](28);
        tmplow = (low[dartx['>>']](28) | high << 4) >>> 0;
        low = (low ^ tmplow) >>> 0;
        high = (high ^ tmphigh) >>> 0;
        tmplow = low << 31 >>> 0;
        tmphigh = (high << 31 | low[dartx['>>']](1)) >>> 0;
        tmplow = tmplow + low;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = (high + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmplow = dart.notNull(this[_lo]) * 1037;
        this[_lo] = (tmplow & math._Random._MASK32) >>> 0;
        this[_hi] = (dart.notNull(this[_hi]) * 1037 + ((tmplow - dart.notNull(this[_lo])) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        this[_lo] = (dart.notNull(this[_lo]) ^ low) >>> 0;
        this[_hi] = (dart.notNull(this[_hi]) ^ high) >>> 0;
      } while (seed != empty_seed);
      if (this[_hi] == 0 && this[_lo] == 0) {
        this[_lo] = 23063;
      }
      this[_nextState]();
      this[_nextState]();
      this[_nextState]();
      this[_nextState]();
    }
    [_nextState]() {
      let tmpHi = 4294901760 * dart.notNull(this[_lo]);
      let tmpHiLo = (tmpHi & math._Random._MASK32) >>> 0;
      let tmpHiHi = tmpHi - tmpHiLo;
      let tmpLo = 55905 * dart.notNull(this[_lo]);
      let tmpLoLo = (tmpLo & math._Random._MASK32) >>> 0;
      let tmpLoHi = tmpLo - tmpLoLo;
      let newLo = tmpLoLo + tmpHiLo + dart.notNull(this[_hi]);
      this[_lo] = (newLo & math._Random._MASK32) >>> 0;
      let newLoHi = newLo - dart.notNull(this[_lo]);
      this[_hi] = (((tmpLoHi + tmpHiHi + newLoHi) / math._POW2_32)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      dart.assert(dart.notNull(this[_lo]) < math._POW2_32);
      dart.assert(dart.notNull(this[_hi]) < math._POW2_32);
    }
    nextInt(max) {
      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
      }
      if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
        this[_nextState]();
        return (dart.notNull(this[_lo]) & dart.notNull(max) - 1) >>> 0;
      }
      let rnd32 = null;
      let result = null;
      do {
        this[_nextState]();
        rnd32 = this[_lo];
        result = dart.asInt(rnd32[dartx.remainder](max));
      } while (dart.notNull(rnd32) - dart.notNull(result) + dart.notNull(max) >= math._POW2_32);
      return result;
    }
    nextDouble() {
      this[_nextState]();
      let bits26 = (dart.notNull(this[_lo]) & (1 << 26) - 1) >>> 0;
      this[_nextState]();
      let bits27 = (dart.notNull(this[_lo]) & (1 << 27) - 1) >>> 0;
      return (bits26 * math._Random._POW2_27_D + bits27) / math._Random._POW2_53_D;
    }
    nextBool() {
      this[_nextState]();
      return (dart.notNull(this[_lo]) & 1) == 0;
    }
  };
  math._Random[dart.implements] = () => [math.Random];
  dart.setSignature(math._Random, {
    constructors: () => ({new: dart.definiteFunctionType(math._Random, [core.int])}),
    fields: () => ({
      [_lo]: core.int,
      [_hi]: core.int
    }),
    methods: () => ({
      [_nextState]: dart.definiteFunctionType(dart.void, []),
      nextInt: dart.definiteFunctionType(core.int, [core.int]),
      nextDouble: dart.definiteFunctionType(core.double, []),
      nextBool: dart.definiteFunctionType(core.bool, [])
    }),
    sfields: () => ({
      _POW2_53_D: core.double,
      _POW2_27_D: core.double,
      _MASK32: core.int
    })
  });
  math._Random._POW2_53_D = 1.0 * 9007199254740992;
  math._Random._POW2_27_D = 1.0 * (1 << 27);
  math._Random._MASK32 = 4294967295;
  const _buffer$0 = Symbol('_buffer');
  const _getRandomBytes = Symbol('_getRandomBytes');
  math._JSSecureRandom = class _JSSecureRandom extends core.Object {
    new() {
      this[_buffer$0] = typed_data.ByteData.new(8);
      let crypto = self.crypto;
      if (crypto != null) {
        let getRandomValues = crypto.getRandomValues;
        if (getRandomValues != null) {
          return;
        }
      }
      dart.throw(new core.UnsupportedError("No source of cryptographically secure random numbers available."));
    }
    [_getRandomBytes](start, length) {
      crypto.getRandomValues(this[_buffer$0][dartx.buffer][dartx.asUint8List](start, length));
    }
    nextBool() {
      this[_getRandomBytes](0, 1);
      return this[_buffer$0][dartx.getUint8](0)[dartx.isOdd];
    }
    nextDouble() {
      this[_getRandomBytes](1, 7);
      this[_buffer$0][dartx.setUint8](0, 63);
      let highByte = this[_buffer$0][dartx.getUint8](1);
      this[_buffer$0][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
      let result = dart.notNull(this[_buffer$0][dartx.getFloat64](0)) - 1.0;
      if ((dart.notNull(highByte) & 16) != 0) {
        result = result + 1.1102230246251565e-16;
      }
      return result;
    }
    nextInt(max) {
      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
      }
      let byteCount = 1;
      if (dart.notNull(max) > 255) {
        byteCount++;
        if (dart.notNull(max) > 65535) {
          byteCount++;
          if (dart.notNull(max) > 16777215) {
            byteCount++;
          }
        }
      }
      this[_buffer$0][dartx.setUint32](0, 0);
      let start = 4 - byteCount;
      let randomLimit = dart.asInt(math.pow(256, byteCount));
      while (true) {
        this[_getRandomBytes](start, byteCount);
        let random = this[_buffer$0][dartx.getUint32](0);
        if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
          return (dart.notNull(random) & dart.notNull(max) - 1) >>> 0;
        }
        let result = dart.asInt(random[dartx.remainder](max));
        if (dart.notNull(random) - dart.notNull(result) + dart.notNull(max) < dart.notNull(randomLimit)) {
          return result;
        }
      }
    }
  };
  math._JSSecureRandom[dart.implements] = () => [math.Random];
  dart.setSignature(math._JSSecureRandom, {
    constructors: () => ({new: dart.definiteFunctionType(math._JSSecureRandom, [])}),
    fields: () => ({[_buffer$0]: typed_data.ByteData}),
    methods: () => ({
      [_getRandomBytes]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      nextBool: dart.definiteFunctionType(core.bool, []),
      nextDouble: dart.definiteFunctionType(core.double, []),
      nextInt: dart.definiteFunctionType(core.int, [core.int])
    })
  });
  math._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
    static combine(hash, value) {
      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
      return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
    }
    static finish(hash) {
      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
    }
    static hash2(a, b) {
      return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
    }
    static hash4(a, b, c, d) {
      return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
    }
  };
  dart.setSignature(math._JenkinsSmiHash, {
    statics: () => ({
      combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
      finish: dart.definiteFunctionType(core.int, [core.int]),
      hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
      hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['combine', 'finish', 'hash2', 'hash4']
  });
  math.Point$ = dart.generic(T => {
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    class Point extends core.Object {
      new(x, y) {
        this.x = x;
        this.y = y;
      }
      toString() {
        return dart.str`Point(${this.x}, ${this.y})`;
      }
      ['=='](other) {
        if (!PointOfnum().is(other)) return false;
        return dart.equals(this.x, dart.dload(other, 'x')) && dart.equals(this.y, dart.dload(other, 'y'));
      }
      get hashCode() {
        return math._JenkinsSmiHash.hash2(dart.hashCode(this.x), dart.hashCode(this.y));
      }
      ['+'](other) {
        PointOfT()._check(other);
        return new (PointOfT())(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
      }
      ['-'](other) {
        PointOfT()._check(other);
        return new (PointOfT())(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
      }
      ['*'](factor) {
        return new (PointOfT())(dart.notNull(this.x) * dart.notNull(factor), dart.notNull(this.y) * dart.notNull(factor));
      }
      get magnitude() {
        return math.sqrt(dart.notNull(this.x) * dart.notNull(this.x) + dart.notNull(this.y) * dart.notNull(this.y));
      }
      distanceTo(other) {
        PointOfT()._check(other);
        let dx = dart.notNull(this.x) - dart.notNull(other.x);
        let dy = dart.notNull(this.y) - dart.notNull(other.y);
        return math.sqrt(dx * dx + dy * dy);
      }
      squaredDistanceTo(other) {
        PointOfT()._check(other);
        let dx = dart.notNull(this.x) - dart.notNull(other.x);
        let dy = dart.notNull(this.y) - dart.notNull(other.y);
        return dx * dx + dy * dy;
      }
    }
    dart.addTypeTests(Point);
    dart.setSignature(Point, {
      constructors: () => ({new: dart.definiteFunctionType(math.Point$(T), [T, T])}),
      fields: () => ({
        x: T,
        y: T
      }),
      getters: () => ({magnitude: dart.definiteFunctionType(core.double, [])}),
      methods: () => ({
        '+': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
        '-': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
        '*': dart.definiteFunctionType(math.Point$(T), [core.num]),
        distanceTo: dart.definiteFunctionType(core.double, [PointOfT()]),
        squaredDistanceTo: dart.definiteFunctionType(T, [PointOfT()])
      })
    });
    return Point;
  });
  math.Point = Point$();
  let const$82;
  math.Random = class Random extends core.Object {
    static new(seed) {
      if (seed === void 0) seed = null;
      return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
    }
    static secure() {
      return math.Random._secureRandom;
    }
  };
  dart.setSignature(math.Random, {
    constructors: () => ({
      new: dart.definiteFunctionType(math.Random, [], [core.int]),
      secure: dart.definiteFunctionType(math.Random, [])
    }),
    sfields: () => ({_secureRandom: math._JSSecureRandom})
  });
  dart.defineLazy(math.Random, {
    get _secureRandom() {
      return new math._JSSecureRandom();
    }
  });
  math._RectangleBase$ = dart.generic(T => {
    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    dart.defineExtensionNames([
      'right',
      'bottom',
      'toString',
      '==',
      'hashCode',
      'intersection',
      'intersects',
      'boundingBox',
      'containsRectangle',
      'containsPoint',
      'topLeft',
      'topRight',
      'bottomRight',
      'bottomLeft'
    ]);
    class _RectangleBase extends core.Object {
      new() {
      }
      get right() {
        return dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]);
      }
      get bottom() {
        return dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
      }
      toString() {
        return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
      }
      ['=='](other) {
        if (!RectangleOfnum().is(other)) return false;
        let otherRect = RectangleOfnum().as(other);
        return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
      }
      get hashCode() {
        return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
      }
      intersection(other) {
        RectangleOfT()._check(other);
        let x0 = math.max(T)(this[dartx.left], other[dartx.left]);
        let x1 = math.min(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
        if (dart.notNull(x0) <= dart.notNull(x1)) {
          let y0 = math.max(T)(this[dartx.top], other[dartx.top]);
          let y1 = math.min(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
          if (dart.notNull(y0) <= dart.notNull(y1)) {
            return new (RectangleOfT())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
          }
        }
        return null;
      }
      intersects(other) {
        return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
      }
      boundingBox(other) {
        RectangleOfT()._check(other);
        let right = math.max(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
        let bottom = math.max(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        let left = math.min(T)(this[dartx.left], other[dartx.left]);
        let top = math.min(T)(this[dartx.top], other[dartx.top]);
        return new (RectangleOfT())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
      }
      containsRectangle(another) {
        return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
      }
      containsPoint(another) {
        return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
      }
      get topLeft() {
        return new (PointOfT())(this[dartx.left], this[dartx.top]);
      }
      get topRight() {
        return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
      }
      get bottomRight() {
        return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
      }
      get bottomLeft() {
        return new (PointOfT())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
      }
    }
    dart.addTypeTests(_RectangleBase);
    dart.setSignature(_RectangleBase, {
      constructors: () => ({new: dart.definiteFunctionType(math._RectangleBase$(T), [])}),
      getters: () => ({
        right: dart.definiteFunctionType(T, []),
        bottom: dart.definiteFunctionType(T, []),
        topLeft: dart.definiteFunctionType(math.Point$(T), []),
        topRight: dart.definiteFunctionType(math.Point$(T), []),
        bottomRight: dart.definiteFunctionType(math.Point$(T), []),
        bottomLeft: dart.definiteFunctionType(math.Point$(T), [])
      }),
      methods: () => ({
        intersection: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
        intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
        boundingBox: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
        containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
        containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
      })
    });
    dart.defineExtensionMembers(_RectangleBase, [
      'toString',
      '==',
      'intersection',
      'intersects',
      'boundingBox',
      'containsRectangle',
      'containsPoint',
      'right',
      'bottom',
      'hashCode',
      'topLeft',
      'topRight',
      'bottomRight',
      'bottomLeft'
    ]);
    return _RectangleBase;
  });
  math._RectangleBase = _RectangleBase();
  math.Rectangle$ = dart.generic(T => {
    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    dart.defineExtensionNames([
      'left',
      'top',
      'width',
      'height'
    ]);
    class Rectangle extends math._RectangleBase$(T) {
      get left() {
        return this[left$];
      }
      set left(value) {
        super.left = value;
      }
      get top() {
        return this[top$];
      }
      set top(value) {
        super.top = value;
      }
      get width() {
        return this[width$];
      }
      set width(value) {
        super.width = value;
      }
      get height() {
        return this[height$];
      }
      set height(value) {
        super.height = value;
      }
      new(left, top, width, height) {
        this[left$] = left;
        this[top$] = top;
        this[width$] = dart.notNull(width) < 0 ? -dart.notNull(width) * 0 : width;
        this[height$] = dart.notNull(height) < 0 ? -dart.notNull(height) * 0 : height;
        super.new();
      }
      static fromPoints(a, b) {
        let left = math.min(T)(a.x, b.x);
        let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
        let top = math.min(T)(a.y, b.y);
        let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
        return new (RectangleOfT())(left, top, width, height);
      }
    }
    const left$ = Symbol(Rectangle.name + "." + 'left'.toString());
    const top$ = Symbol(Rectangle.name + "." + 'top'.toString());
    const width$ = Symbol(Rectangle.name + "." + 'width'.toString());
    const height$ = Symbol(Rectangle.name + "." + 'height'.toString());
    dart.setSignature(Rectangle, {
      constructors: () => ({
        new: dart.definiteFunctionType(math.Rectangle$(T), [T, T, T, T]),
        fromPoints: dart.definiteFunctionType(math.Rectangle$(T), [PointOfT(), PointOfT()])
      }),
      fields: () => ({
        left: T,
        top: T,
        width: T,
        height: T
      })
    });
    dart.defineExtensionMembers(Rectangle, ['left', 'top', 'width', 'height']);
    return Rectangle;
  });
  math.Rectangle = Rectangle();
  const _width = Symbol('_width');
  const _height = Symbol('_height');
  math.MutableRectangle$ = dart.generic(T => {
    let MutableRectangleOfT = () => (MutableRectangleOfT = dart.constFn(math.MutableRectangle$(T)))();
    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    class MutableRectangle extends math._RectangleBase$(T) {
      get left() {
        return this[left$];
      }
      set left(value) {
        this[left$] = value;
      }
      get top() {
        return this[top$];
      }
      set top(value) {
        this[top$] = value;
      }
      new(left, top, width, height) {
        this[left$] = left;
        this[top$] = top;
        this[_width] = dart.notNull(width) < 0 ? math._clampToZero(T)(width) : width;
        this[_height] = dart.notNull(height) < 0 ? math._clampToZero(T)(height) : height;
        super.new();
      }
      static fromPoints(a, b) {
        let left = math.min(T)(a.x, b.x);
        let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
        let top = math.min(T)(a.y, b.y);
        let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
        return new (MutableRectangleOfT())(left, top, width, height);
      }
      get width() {
        return this[_width];
      }
      set width(width) {
        T._check(width);
        if (dart.notNull(width) < 0) width = math._clampToZero(T)(width);
        this[_width] = width;
      }
      get height() {
        return this[_height];
      }
      set height(height) {
        T._check(height);
        if (dart.notNull(height) < 0) height = math._clampToZero(T)(height);
        this[_height] = height;
      }
    }
    const left$ = Symbol(MutableRectangle.name + "." + 'left'.toString());
    const top$ = Symbol(MutableRectangle.name + "." + 'top'.toString());
    MutableRectangle[dart.implements] = () => [RectangleOfT()];
    dart.setSignature(MutableRectangle, {
      constructors: () => ({
        new: dart.definiteFunctionType(math.MutableRectangle$(T), [T, T, T, T]),
        fromPoints: dart.definiteFunctionType(math.MutableRectangle$(T), [PointOfT(), PointOfT()])
      }),
      fields: () => ({
        left: T,
        top: T,
        [_width]: T,
        [_height]: T
      }),
      getters: () => ({
        width: dart.definiteFunctionType(T, []),
        height: dart.definiteFunctionType(T, [])
      }),
      setters: () => ({
        width: dart.definiteFunctionType(dart.void, [T]),
        height: dart.definiteFunctionType(dart.void, [T])
      })
    });
    dart.defineExtensionMembers(MutableRectangle, ['left', 'top', 'width', 'height']);
    return MutableRectangle;
  });
  math.MutableRectangle = MutableRectangle();
  math._clampToZero = function(T) {
    return value => {
      dart.assert(dart.notNull(value) < 0);
      return -dart.notNull(value) * 0;
    };
  };
  dart.fn(math._clampToZero, TToT());
  mirrors.MirrorSystem = class MirrorSystem extends core.Object {
    findLibrary(libraryName) {
      return this.libraries[dartx.values][dartx.singleWhere](dart.fn(library => dart.equals(library.simpleName, libraryName), LibraryMirrorTobool()));
    }
    static getName(symbol) {
      return _js_mirrors.getName(symbol);
    }
    static getSymbol(name, library) {
      if (library === void 0) library = null;
      return _js_mirrors.getSymbol(name, library);
    }
  };
  dart.setSignature(mirrors.MirrorSystem, {
    methods: () => ({findLibrary: dart.definiteFunctionType(mirrors.LibraryMirror, [core.Symbol])}),
    statics: () => ({
      getName: dart.definiteFunctionType(core.String, [core.Symbol]),
      getSymbol: dart.definiteFunctionType(core.Symbol, [core.String], [mirrors.LibraryMirror])
    }),
    names: ['getName', 'getSymbol']
  });
  mirrors.currentMirrorSystem = function() {
    return mirrors.MirrorSystem._check(_js_mirrors.currentJsMirrorSystem);
  };
  dart.fn(mirrors.currentMirrorSystem, VoidToMirrorSystem());
  mirrors.reflect = function(reflectee) {
    return _js_mirrors.reflect(reflectee);
  };
  dart.lazyFn(mirrors.reflect, () => ObjectToInstanceMirror());
  mirrors.reflectClass = function(key) {
    if (!core.Type.is(key) || dart.equals(key, dart.wrapType(dart.dynamic))) {
      dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
    }
    let tm = mirrors.reflectType(key);
    if (!mirrors.ClassMirror.is(tm)) {
      dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
    }
    return mirrors.ClassMirror._check(mirrors.ClassMirror.as(tm).originalDeclaration);
  };
  dart.lazyFn(mirrors.reflectClass, () => TypeToClassMirror());
  mirrors.reflectType = function(key) {
    if (dart.equals(key, dart.wrapType(dart.dynamic))) {
      return mirrors.currentMirrorSystem().dynamicType;
    }
    return _js_mirrors.reflectType(key);
  };
  dart.lazyFn(mirrors.reflectType, () => TypeToTypeMirror());
  mirrors.Mirror = class Mirror extends core.Object {};
  mirrors.IsolateMirror = class IsolateMirror extends core.Object {};
  mirrors.IsolateMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.DeclarationMirror = class DeclarationMirror extends core.Object {};
  mirrors.DeclarationMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.ObjectMirror = class ObjectMirror extends core.Object {};
  mirrors.ObjectMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.InstanceMirror = class InstanceMirror extends core.Object {};
  mirrors.InstanceMirror[dart.implements] = () => [mirrors.ObjectMirror];
  mirrors.ClosureMirror = class ClosureMirror extends core.Object {};
  mirrors.ClosureMirror[dart.implements] = () => [mirrors.InstanceMirror];
  mirrors.LibraryMirror = class LibraryMirror extends core.Object {};
  mirrors.LibraryMirror[dart.implements] = () => [mirrors.DeclarationMirror, mirrors.ObjectMirror];
  mirrors.LibraryDependencyMirror = class LibraryDependencyMirror extends core.Object {};
  mirrors.LibraryDependencyMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.CombinatorMirror = class CombinatorMirror extends core.Object {};
  mirrors.CombinatorMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.TypeMirror = class TypeMirror extends core.Object {};
  mirrors.TypeMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  mirrors.ClassMirror = class ClassMirror extends core.Object {};
  mirrors.ClassMirror[dart.implements] = () => [mirrors.TypeMirror, mirrors.ObjectMirror];
  mirrors.FunctionTypeMirror = class FunctionTypeMirror extends core.Object {};
  mirrors.FunctionTypeMirror[dart.implements] = () => [mirrors.ClassMirror];
  mirrors.TypeVariableMirror = class TypeVariableMirror extends mirrors.TypeMirror {};
  mirrors.TypedefMirror = class TypedefMirror extends core.Object {};
  mirrors.TypedefMirror[dart.implements] = () => [mirrors.TypeMirror];
  mirrors.MethodMirror = class MethodMirror extends core.Object {};
  mirrors.MethodMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  mirrors.VariableMirror = class VariableMirror extends core.Object {};
  mirrors.VariableMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  mirrors.ParameterMirror = class ParameterMirror extends core.Object {};
  mirrors.ParameterMirror[dart.implements] = () => [mirrors.VariableMirror];
  mirrors.SourceLocation = class SourceLocation extends core.Object {};
  mirrors.Comment = class Comment extends core.Object {
    new(text, trimmedText, isDocComment) {
      this.text = text;
      this.trimmedText = trimmedText;
      this.isDocComment = isDocComment;
    }
  };
  dart.setSignature(mirrors.Comment, {
    constructors: () => ({new: dart.definiteFunctionType(mirrors.Comment, [core.String, core.String, core.bool])}),
    fields: () => ({
      text: core.String,
      trimmedText: core.String,
      isDocComment: core.bool
    })
  });
  mirrors.MirrorsUsed = class MirrorsUsed extends core.Object {
    new(opts) {
      let symbols = opts && 'symbols' in opts ? opts.symbols : null;
      let targets = opts && 'targets' in opts ? opts.targets : null;
      let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
      let override = opts && 'override' in opts ? opts.override : null;
      this.symbols = symbols;
      this.targets = targets;
      this.metaTargets = metaTargets;
      this.override = override;
    }
  };
  dart.setSignature(mirrors.MirrorsUsed, {
    constructors: () => ({new: dart.definiteFunctionType(mirrors.MirrorsUsed, [], {symbols: dart.dynamic, targets: dart.dynamic, metaTargets: dart.dynamic, override: dart.dynamic})}),
    fields: () => ({
      symbols: dart.dynamic,
      targets: dart.dynamic,
      metaTargets: dart.dynamic,
      override: dart.dynamic
    })
  });
  typed_data.ByteBuffer = class ByteBuffer extends core.Object {};
  typed_data.TypedData = class TypedData extends core.Object {};
  const _littleEndian = Symbol('_littleEndian');
  typed_data.Endianness = class Endianness extends core.Object {
    _(littleEndian) {
      this[_littleEndian] = littleEndian;
    }
  };
  dart.defineNamedConstructor(typed_data.Endianness, '_');
  dart.setSignature(typed_data.Endianness, {
    constructors: () => ({_: dart.definiteFunctionType(typed_data.Endianness, [core.bool])}),
    fields: () => ({[_littleEndian]: core.bool}),
    sfields: () => ({
      BIG_ENDIAN: typed_data.Endianness,
      LITTLE_ENDIAN: typed_data.Endianness,
      HOST_ENDIAN: typed_data.Endianness
    })
  });
  dart.defineLazy(typed_data.Endianness, {
    get BIG_ENDIAN() {
      return dart.const(new typed_data.Endianness._(false));
    },
    get LITTLE_ENDIAN() {
      return dart.const(new typed_data.Endianness._(true));
    },
    get HOST_ENDIAN() {
      return typed_data.ByteData.view(typed_data.Uint16List.fromList(JSArrayOfint().of([1]))[dartx.buffer])[dartx.getInt8](0) == 1 ? typed_data.Endianness.LITTLE_ENDIAN : typed_data.Endianness.BIG_ENDIAN;
    }
  });
  typed_data.ByteData = class ByteData extends core.Object {
    static new(length) {
      return _native_typed_data.NativeByteData.new(length);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asByteData](offsetInBytes, length);
    }
  };
  typed_data.ByteData[dart.implements] = () => [typed_data.TypedData];
  dart.setSignature(typed_data.ByteData, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.ByteData, [core.int]),
      view: dart.definiteFunctionType(typed_data.ByteData, [typed_data.ByteBuffer], [core.int, core.int])
    })
  });
  typed_data.Int8List = class Int8List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeInt8List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt8List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt8List](offsetInBytes, length);
    }
  };
  typed_data.Int8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int8List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int8List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int8List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int8List.BYTES_PER_ELEMENT = 1;
  typed_data.Uint8List = class Uint8List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint8List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint8List](offsetInBytes, length);
    }
  };
  typed_data.Uint8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint8List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint8List.BYTES_PER_ELEMENT = 1;
  typed_data.Uint8ClampedList = class Uint8ClampedList extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint8ClampedList.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8ClampedList.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint8ClampedList](offsetInBytes, length);
    }
  };
  typed_data.Uint8ClampedList[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint8ClampedList, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint8ClampedList, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint8ClampedList, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint8ClampedList, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint8ClampedList.BYTES_PER_ELEMENT = 1;
  typed_data.Int16List = class Int16List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeInt16List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt16List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt16List](offsetInBytes, length);
    }
  };
  typed_data.Int16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int16List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int16List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int16List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int16List.BYTES_PER_ELEMENT = 2;
  typed_data.Uint16List = class Uint16List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint16List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint16List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint16List](offsetInBytes, length);
    }
  };
  typed_data.Uint16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint16List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint16List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint16List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint16List.BYTES_PER_ELEMENT = 2;
  typed_data.Int32List = class Int32List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeInt32List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt32List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt32List](offsetInBytes, length);
    }
  };
  typed_data.Int32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int32List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int32List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int32List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int32List.BYTES_PER_ELEMENT = 4;
  typed_data.Uint32List = class Uint32List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint32List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint32List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint32List](offsetInBytes, length);
    }
  };
  typed_data.Uint32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint32List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint32List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint32List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint32List.BYTES_PER_ELEMENT = 4;
  typed_data.Int64List = class Int64List extends core.Object {
    static new(length) {
      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
    }
    static fromList(elements) {
      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt64List](offsetInBytes, length);
    }
  };
  typed_data.Int64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int64List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int64List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int64List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int64List.BYTES_PER_ELEMENT = 8;
  typed_data.Uint64List = class Uint64List extends core.Object {
    static new(length) {
      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
    }
    static fromList(elements) {
      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint64List](offsetInBytes, length);
    }
  };
  typed_data.Uint64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint64List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint64List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint64List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint64List.BYTES_PER_ELEMENT = 8;
  typed_data.Float32List = class Float32List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeFloat32List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat32List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat32List](offsetInBytes, length);
    }
  };
  typed_data.Float32List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
  dart.setSignature(typed_data.Float32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float32List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float32List, [ListOfdouble()]),
      view: dart.definiteFunctionType(typed_data.Float32List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float32List.BYTES_PER_ELEMENT = 4;
  typed_data.Float64List = class Float64List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeFloat64List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat64List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat64List](offsetInBytes, length);
    }
  };
  typed_data.Float64List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
  dart.setSignature(typed_data.Float64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float64List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float64List, [ListOfdouble()]),
      view: dart.definiteFunctionType(typed_data.Float64List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float64List.BYTES_PER_ELEMENT = 8;
  typed_data.Float32x4List = class Float32x4List extends core.Object {
    static new(length) {
      return new _native_typed_data.NativeFloat32x4List(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat32x4List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat32x4List](offsetInBytes, length);
    }
  };
  typed_data.Float32x4List[dart.implements] = () => [ListOfFloat32x4(), typed_data.TypedData];
  dart.setSignature(typed_data.Float32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float32x4List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float32x4List, [ListOfFloat32x4()]),
      view: dart.definiteFunctionType(typed_data.Float32x4List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float32x4List.BYTES_PER_ELEMENT = 16;
  typed_data.Int32x4List = class Int32x4List extends core.Object {
    static new(length) {
      return new _native_typed_data.NativeInt32x4List(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt32x4List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt32x4List](offsetInBytes, length);
    }
  };
  typed_data.Int32x4List[dart.implements] = () => [ListOfInt32x4(), typed_data.TypedData];
  dart.setSignature(typed_data.Int32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int32x4List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int32x4List, [ListOfInt32x4()]),
      view: dart.definiteFunctionType(typed_data.Int32x4List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int32x4List.BYTES_PER_ELEMENT = 16;
  typed_data.Float64x2List = class Float64x2List extends core.Object {
    static new(length) {
      return new _native_typed_data.NativeFloat64x2List(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat64x2List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat64x2List](offsetInBytes, length);
    }
  };
  typed_data.Float64x2List[dart.implements] = () => [ListOfFloat64x2(), typed_data.TypedData];
  dart.setSignature(typed_data.Float64x2List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float64x2List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float64x2List, [ListOfFloat64x2()]),
      view: dart.definiteFunctionType(typed_data.Float64x2List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float64x2List.BYTES_PER_ELEMENT = 16;
  indexed_db._KeyRangeFactoryProvider = class _KeyRangeFactoryProvider extends core.Object {
    static createKeyRange_only(value) {
      return indexed_db._KeyRangeFactoryProvider._only(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(value));
    }
    static createKeyRange_lowerBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider._lowerBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
    }
    static createKeyRange_upperBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider._upperBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
    }
    static createKeyRange_bound(lower, upper, lowerOpen, upperOpen) {
      if (lowerOpen === void 0) lowerOpen = false;
      if (upperOpen === void 0) upperOpen = false;
      return indexed_db._KeyRangeFactoryProvider._bound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(lower), indexed_db._KeyRangeFactoryProvider._translateKey(upper), lowerOpen, upperOpen);
    }
    static _class() {
      if (indexed_db._KeyRangeFactoryProvider._cachedClass != null) return indexed_db._KeyRangeFactoryProvider._cachedClass;
      return indexed_db._KeyRangeFactoryProvider._cachedClass = indexed_db._KeyRangeFactoryProvider._uncachedClass();
    }
    static _uncachedClass() {
      return window.webkitIDBKeyRange || window.mozIDBKeyRange || window.msIDBKeyRange || window.IDBKeyRange;
    }
    static _translateKey(idbkey) {
      return idbkey;
    }
    static _only(cls, value) {
      return cls.only(value);
    }
    static _lowerBound(cls, bound, open) {
      return cls.lowerBound(bound, open);
    }
    static _upperBound(cls, bound, open) {
      return cls.upperBound(bound, open);
    }
    static _bound(cls, lower, upper, lowerOpen, upperOpen) {
      return cls.bound(lower, upper, lowerOpen, upperOpen);
    }
  };
  dart.setSignature(indexed_db._KeyRangeFactoryProvider, {
    sfields: () => ({_cachedClass: dart.dynamic}),
    statics: () => ({
      createKeyRange_only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
      createKeyRange_lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      createKeyRange_upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      createKeyRange_bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
      _class: dart.definiteFunctionType(dart.dynamic, []),
      _uncachedClass: dart.definiteFunctionType(dart.dynamic, []),
      _translateKey: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic]),
      _lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['createKeyRange_only', 'createKeyRange_lowerBound', 'createKeyRange_upperBound', 'createKeyRange_bound', '_class', '_uncachedClass', '_translateKey', '_only', '_lowerBound', '_upperBound', '_bound']
  });
  indexed_db._KeyRangeFactoryProvider._cachedClass = null;
  indexed_db._convertNativeToDart_IDBKey = function(nativeKey) {
    function containsDate(object) {
      if (dart.test(html_common.isJavaScriptDate(object))) return true;
      if (core.List.is(object)) {
        for (let i = 0; i < dart.notNull(object[dartx.length]); i++) {
          if (dart.test(containsDate(object[dartx._get](i)))) return true;
        }
      }
      return false;
    }
    dart.fn(containsDate, dynamicTobool$());
    if (dart.test(containsDate(nativeKey))) {
      dart.throw(new core.UnimplementedError('Key containing DateTime'));
    }
    return nativeKey;
  };
  dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic$());
  indexed_db._convertDartToNative_IDBKey = function(dartKey) {
    return dartKey;
  };
  dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic$());
  indexed_db._convertNativeToDart_IDBAny = function(object) {
    return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
  };
  dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic$());
  indexed_db._idbKey = 'JSExtendableArray|=Object|num|String';
  indexed_db._annotation_Creates_IDBKey = dart.const(new _js_helper.Creates(indexed_db._idbKey));
  indexed_db._annotation_Returns_IDBKey = dart.const(new _js_helper.Returns(indexed_db._idbKey));
  const _delete$ = Symbol('_delete');
  const _update = Symbol('_update');
  const _update_1 = Symbol('_update_1');
  dart.defineExtensionNames([
    'delete',
    'update',
    'next',
    'advance',
    'continuePrimaryKey',
    'direction',
    'key',
    'primaryKey',
    'source'
  ]);
  indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
    [dartx.delete]() {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_delete$]());
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.update](value) {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_update](value));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.next](key) {
      if (key === void 0) key = null;
      if (key == null) {
        this.continue();
      } else {
        this.continue(key);
      }
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.direction]() {
      return this.direction;
    }
    get [dartx.key]() {
      return this.key;
    }
    get [dartx.primaryKey]() {
      return this.primaryKey;
    }
    get [dartx.source]() {
      return this.source;
    }
    [dartx.advance](...args) {
      return this.advance.apply(this, args);
    }
    [dartx.continuePrimaryKey](...args) {
      return this.continuePrimaryKey.apply(this, args);
    }
    [_delete$](...args) {
      return this.delete.apply(this, args);
    }
    [_update](value) {
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      return this[_update_1](value_1);
    }
    [_update_1](...args) {
      return this.update.apply(this, args);
    }
  };
  dart.setSignature(indexed_db.Cursor, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Cursor, [])}),
    fields: () => ({
      [dartx.direction]: core.String,
      [dartx.key]: core.Object,
      [dartx.primaryKey]: core.Object,
      [dartx.source]: core.Object
    }),
    methods: () => ({
      [dartx.delete]: dart.definiteFunctionType(async.Future, []),
      [dartx.update]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.next]: dart.definiteFunctionType(dart.void, [], [core.Object]),
      [dartx.advance]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.continuePrimaryKey]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
      [_delete$]: dart.definiteFunctionType(indexed_db.Request, []),
      [_update]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
      [_update_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.IDBCursor, indexed_db.Cursor);
  const _get_value = Symbol('_get_value');
  dart.defineExtensionNames([
    'value'
  ]);
  indexed_db.CursorWithValue = class CursorWithValue extends indexed_db.Cursor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return indexed_db._convertNativeToDart_IDBAny(this[_get_value]);
    }
    get [_get_value]() {
      return this.value;
    }
  };
  dart.setSignature(indexed_db.CursorWithValue, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.CursorWithValue, [])}),
    fields: () => ({[_get_value]: dart.dynamic}),
    getters: () => ({[dartx.value]: dart.definiteFunctionType(dart.dynamic, [])})
  });
  dart.registerExtension(dart.global.IDBCursorWithValue, indexed_db.CursorWithValue);
  const _createObjectStore = Symbol('_createObjectStore');
  const _transaction = Symbol('_transaction');
  const _createObjectStore_1 = Symbol('_createObjectStore_1');
  const _createObjectStore_2 = Symbol('_createObjectStore_2');
  const _addEventListener = Symbol('_addEventListener');
  const _removeEventListener = Symbol('_removeEventListener');
  dart.defineExtensionNames([
    'on',
    'addEventListener',
    'removeEventListener',
    'dispatchEvent'
  ]);
  html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
    _created() {
      super.new();
    }
    get [dartx.on]() {
      return new html$.Events(this);
    }
    [dartx.addEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      if (listener != null) {
        this[_addEventListener](type, listener, useCapture);
      }
    }
    [dartx.removeEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      if (listener != null) {
        this[_removeEventListener](type, listener, useCapture);
      }
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_addEventListener](...args) {
      return this.addEventListener.apply(this, args);
    }
    [dartx.dispatchEvent](...args) {
      return this.dispatchEvent.apply(this, args);
    }
    [_removeEventListener](...args) {
      return this.removeEventListener.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.EventTarget, '_created');
  dart.setSignature(html$.EventTarget, {
    constructors: () => ({
      _created: dart.definiteFunctionType(html$.EventTarget, []),
      _: dart.definiteFunctionType(html$.EventTarget, [])
    }),
    getters: () => ({[dartx.on]: dart.definiteFunctionType(html$.Events, [])}),
    methods: () => ({
      [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html$.Event]),
      [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
    })
  });
  dart.registerExtension(dart.global.EventTarget, html$.EventTarget);
  dart.defineExtensionNames([
    'createObjectStore',
    'transaction',
    'transactionStore',
    'transactionList',
    'transactionStores',
    'close',
    'deleteObjectStore',
    'onAbort',
    'onClose',
    'onError',
    'onVersionChange',
    'name',
    'objectStoreNames',
    'version'
  ]);
  indexed_db.Database = class Database extends html$.EventTarget {
    [dartx.createObjectStore](name, opts) {
      let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
      let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
      let options = dart.map();
      if (keyPath != null) {
        options[dartx._set]('keyPath', keyPath);
      }
      if (autoIncrement != null) {
        options[dartx._set]('autoIncrement', autoIncrement);
      }
      return this[_createObjectStore](name, options);
    }
    [dartx.transaction](storeName_OR_storeNames, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      return this[_transaction](storeName_OR_storeNames, mode);
    }
    [dartx.transactionStore](storeName, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      return this[_transaction](storeName, mode);
    }
    [dartx.transactionList](storeNames, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      let storeNames_1 = html_common.convertDartToNative_StringArray(storeNames);
      return this[_transaction](storeNames_1, mode);
    }
    [dartx.transactionStores](storeNames, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      return this[_transaction](storeNames, mode);
    }
    [_transaction](...args) {
      return this.transaction.apply(this, args);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.objectStoreNames]() {
      return this.objectStoreNames;
    }
    get [dartx.version]() {
      return this.version;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [_createObjectStore](name, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_createObjectStore_1](name, options_1);
      }
      return this[_createObjectStore_2](name);
    }
    [_createObjectStore_1](...args) {
      return this.createObjectStore.apply(this, args);
    }
    [_createObjectStore_2](...args) {
      return this.createObjectStore.apply(this, args);
    }
    [dartx.deleteObjectStore](...args) {
      return this.deleteObjectStore.apply(this, args);
    }
    get [dartx.onAbort]() {
      return indexed_db.Database.abortEvent.forTarget(this);
    }
    get [dartx.onClose]() {
      return indexed_db.Database.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return indexed_db.Database.errorEvent.forTarget(this);
    }
    get [dartx.onVersionChange]() {
      return indexed_db.Database.versionChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.Database, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Database, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.objectStoreNames]: ListOfString(),
      [dartx.version]: core.Object
    }),
    getters: () => ({
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onVersionChange]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
    }),
    methods: () => ({
      [dartx.createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], {keyPath: core.String, autoIncrement: core.bool}),
      [dartx.transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, core.String]),
      [dartx.transactionStore]: dart.definiteFunctionType(indexed_db.Transaction, [core.String, core.String]),
      [dartx.transactionList]: dart.definiteFunctionType(indexed_db.Transaction, [ListOfString(), core.String]),
      [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html$.DomStringList, core.String]),
      [_transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [_createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], [core.Map]),
      [_createObjectStore_1]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic, dart.dynamic]),
      [_createObjectStore_2]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic]),
      [dartx.deleteObjectStore]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfEvent(),
      closeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      versionChangeEvent: EventStreamProviderOfVersionChangeEvent()
    })
  });
  dart.defineLazy(indexed_db.Database, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get versionChangeEvent() {
      return dart.const(new (EventStreamProviderOfVersionChangeEvent())('versionchange'));
    }
  });
  dart.registerExtension(dart.global.IDBDatabase, indexed_db.Database);
  const _open = Symbol('_open');
  const _deleteDatabase = Symbol('_deleteDatabase');
  const _webkitGetDatabaseNames = Symbol('_webkitGetDatabaseNames');
  dart.defineExtensionNames([
    'open',
    'deleteDatabase',
    'getDatabaseNames',
    'supportsDatabaseNames',
    'cmp'
  ]);
  indexed_db.IdbFactory = class IdbFactory extends _interceptors.Interceptor {
    static get supported() {
      return !!(window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB);
    }
    [dartx.open](name, opts) {
      let version = opts && 'version' in opts ? opts.version : null;
      let onUpgradeNeeded = opts && 'onUpgradeNeeded' in opts ? opts.onUpgradeNeeded : null;
      let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
      if (version == null != (onUpgradeNeeded == null)) {
        return FutureOfDatabase().error(new core.ArgumentError('version and onUpgradeNeeded must be specified together'));
      }
      try {
        let request = null;
        if (version != null) {
          request = this[_open](name, version);
        } else {
          request = this[_open](name);
        }
        if (onUpgradeNeeded != null) {
          dart.dsend(dart.dload(request, 'onUpgradeNeeded'), 'listen', onUpgradeNeeded);
        }
        if (onBlocked != null) {
          dart.dsend(dart.dload(request, 'onBlocked'), 'listen', onBlocked);
        }
        return indexed_db._completeRequest(indexed_db.Database)(indexed_db.Request._check(request));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfDatabase().error(e, stacktrace);
      }

    }
    [dartx.deleteDatabase](name, opts) {
      let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
      try {
        let request = this[_deleteDatabase](name);
        if (onBlocked != null) {
          request[dartx.onBlocked].listen(onBlocked);
        }
        let completer = CompleterOfIdbFactory().sync();
        request[dartx.onSuccess].listen(dart.fn(e => {
          completer.complete(this);
        }, EventTovoid$()));
        request[dartx.onError].listen(dart.bind(completer, 'completeError'));
        return completer.future;
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfIdbFactory().error(e, stacktrace);
      }

    }
    [dartx.getDatabaseNames]() {
      try {
        let request = this[_webkitGetDatabaseNames]();
        return indexed_db._completeRequest(ListOfString())(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfListOfString().error(e, stacktrace);
      }

    }
    get [dartx.supportsDatabaseNames]() {
      return dart.test(indexed_db.IdbFactory.supported) && !!(this.getDatabaseNames || this.webkitGetDatabaseNames);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cmp](...args) {
      return this.cmp.apply(this, args);
    }
    [_deleteDatabase](...args) {
      return this.deleteDatabase.apply(this, args);
    }
    [_open](...args) {
      return this.open.apply(this, args);
    }
    [_webkitGetDatabaseNames](...args) {
      return this.webkitGetDatabaseNames.apply(this, args);
    }
  };
  dart.setSignature(indexed_db.IdbFactory, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.IdbFactory, [])}),
    getters: () => ({[dartx.supportsDatabaseNames]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      [dartx.open]: dart.definiteFunctionType(async.Future$(indexed_db.Database), [core.String], {version: core.int, onUpgradeNeeded: dynamicTovoid(), onBlocked: dynamicTovoid()}),
      [dartx.deleteDatabase]: dart.definiteFunctionType(async.Future$(indexed_db.IdbFactory), [core.String], {onBlocked: EventTovoid()}),
      [dartx.getDatabaseNames]: dart.definiteFunctionType(async.Future$(core.List$(core.String)), []),
      [dartx.cmp]: dart.definiteFunctionType(core.int, [core.Object, core.Object]),
      [_deleteDatabase]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String]),
      [_open]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String], [core.int]),
      [_webkitGetDatabaseNames]: dart.definiteFunctionType(indexed_db.Request, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.IDBFactory, indexed_db.IdbFactory);
  indexed_db._completeRequest = function(T) {
    return request => {
      let completer = async.Completer$(T).sync();
      request[dartx.onSuccess].listen(dart.fn(e => {
        let result = indexed_db._cast(T)(request[dartx.result]);
        completer.complete(result);
      }, EventTovoid$()));
      request[dartx.onError].listen(dart.bind(completer, 'completeError'));
      return completer.future;
    };
  };
  dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
  const _count$0 = Symbol('_count');
  const _get$ = Symbol('_get');
  const _getKey$ = Symbol('_getKey');
  const _openCursor = Symbol('_openCursor');
  const _openKeyCursor = Symbol('_openKeyCursor');
  dart.defineExtensionNames([
    'count',
    'get',
    'getKey',
    'openCursor',
    'openKeyCursor',
    'getAll',
    'getAllKeys',
    'keyPath',
    'multiEntry',
    'name',
    'objectStore',
    'unique'
  ]);
  indexed_db.Index = class Index extends _interceptors.Interceptor {
    [dartx.count](key_OR_range) {
      if (key_OR_range === void 0) key_OR_range = null;
      try {
        let request = this[_count$0](key_OR_range);
        return indexed_db._completeRequest(core.int)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfint().error(e, stacktrace);
      }

    }
    [dartx.get](key) {
      try {
        let request = this[_get$](key);
        return indexed_db._completeRequest(dart.dynamic)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.getKey](key) {
      try {
        let request = this[_getKey$](key);
        return indexed_db._completeRequest(dart.dynamic)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.openCursor](opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let range = opts && 'range' in opts ? opts.range : null;
      let direction = opts && 'direction' in opts ? opts.direction : null;
      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
      let key_OR_range = null;
      if (key != null) {
        if (range != null) {
          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
        }
        key_OR_range = key;
      } else {
        key_OR_range = range;
      }
      let request = null;
      if (direction == null) {
        request = this[_openCursor](key_OR_range, "next");
      } else {
        request = this[_openCursor](key_OR_range, direction);
      }
      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
    }
    [dartx.openKeyCursor](opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let range = opts && 'range' in opts ? opts.range : null;
      let direction = opts && 'direction' in opts ? opts.direction : null;
      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
      let key_OR_range = null;
      if (key != null) {
        if (range != null) {
          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
        }
        key_OR_range = key;
      } else {
        key_OR_range = range;
      }
      let request = null;
      if (direction == null) {
        request = this[_openKeyCursor](key_OR_range, "next");
      } else {
        request = this[_openKeyCursor](key_OR_range, direction);
      }
      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.Cursor)(indexed_db.Request._check(request), autoAdvance);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.keyPath]() {
      return this.keyPath;
    }
    get [dartx.multiEntry]() {
      return this.multiEntry;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.objectStore]() {
      return this.objectStore;
    }
    get [dartx.unique]() {
      return this.unique;
    }
    [_count$0](...args) {
      return this.count.apply(this, args);
    }
    [_get$](...args) {
      return this.get.apply(this, args);
    }
    [dartx.getAll](...args) {
      return this.getAll.apply(this, args);
    }
    [dartx.getAllKeys](...args) {
      return this.getAllKeys.apply(this, args);
    }
    [_getKey$](...args) {
      return this.getKey.apply(this, args);
    }
    [_openCursor](...args) {
      return this.openCursor.apply(this, args);
    }
    [_openKeyCursor](...args) {
      return this.openKeyCursor.apply(this, args);
    }
  };
  dart.setSignature(indexed_db.Index, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Index, [])}),
    fields: () => ({
      [dartx.keyPath]: core.Object,
      [dartx.multiEntry]: core.bool,
      [dartx.name]: core.String,
      [dartx.objectStore]: indexed_db.ObjectStore,
      [dartx.unique]: core.bool
    }),
    methods: () => ({
      [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
      [dartx.get]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.getKey]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
      [dartx.openKeyCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
      [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [_getKey$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
      [_openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String])
    })
  });
  dart.registerExtension(dart.global.IDBIndex, indexed_db.Index);
  dart.defineExtensionNames([
    'lower',
    'lowerOpen',
    'upper',
    'upperOpen'
  ]);
  indexed_db.KeyRange = class KeyRange extends _interceptors.Interceptor {
    static only(value) {
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_only(value);
    }
    static lowerBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
    }
    static upperBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
    }
    static bound(lower, upper, lowerOpen, upperOpen) {
      if (lowerOpen === void 0) lowerOpen = false;
      if (upperOpen === void 0) upperOpen = false;
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_bound(lower, upper, lowerOpen, upperOpen);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.lower]() {
      return this.lower;
    }
    get [dartx.lowerOpen]() {
      return this.lowerOpen;
    }
    get [dartx.upper]() {
      return this.upper;
    }
    get [dartx.upperOpen]() {
      return this.upperOpen;
    }
  };
  dart.setSignature(indexed_db.KeyRange, {
    constructors: () => ({
      only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
      lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
      _: dart.definiteFunctionType(indexed_db.KeyRange, [])
    }),
    fields: () => ({
      [dartx.lower]: core.Object,
      [dartx.lowerOpen]: core.bool,
      [dartx.upper]: core.Object,
      [dartx.upperOpen]: core.bool
    }),
    statics: () => ({
      bound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object, core.Object], [core.bool, core.bool]),
      lowerBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool]),
      only_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object]),
      upperBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool])
    }),
    names: ['bound_', 'lowerBound_', 'only_', 'upperBound_']
  });
  dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
  const _add$3 = Symbol('_add');
  const _clear$0 = Symbol('_clear');
  const _put = Symbol('_put');
  const _createIndex = Symbol('_createIndex');
  const _add_1 = Symbol('_add_1');
  const _add_2 = Symbol('_add_2');
  const _createIndex_1 = Symbol('_createIndex_1');
  const _createIndex_2 = Symbol('_createIndex_2');
  const _put_1 = Symbol('_put_1');
  const _put_2 = Symbol('_put_2');
  dart.defineExtensionNames([
    'add',
    'clear',
    'delete',
    'count',
    'put',
    'getObject',
    'openCursor',
    'createIndex',
    'deleteIndex',
    'getAll',
    'getAllKeys',
    'index',
    'openKeyCursor',
    'autoIncrement',
    'indexNames',
    'keyPath',
    'name',
    'transaction'
  ]);
  indexed_db.ObjectStore = class ObjectStore extends _interceptors.Interceptor {
    [dartx.add](value, key) {
      if (key === void 0) key = null;
      try {
        let request = null;
        if (key != null) {
          request = this[_add$3](value, key);
        } else {
          request = this[_add$3](value);
        }
        return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.clear]() {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.delete](key_OR_keyRange) {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_delete$](key_OR_keyRange));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.count](key_OR_range) {
      if (key_OR_range === void 0) key_OR_range = null;
      try {
        let request = this[_count$0](key_OR_range);
        return indexed_db._completeRequest(core.int)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfint().error(e, stacktrace);
      }

    }
    [dartx.put](value, key) {
      if (key === void 0) key = null;
      try {
        let request = null;
        if (key != null) {
          request = this[_put](value, key);
        } else {
          request = this[_put](value);
        }
        return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.getObject](key) {
      try {
        let request = this[_get$](key);
        return indexed_db._completeRequest(dart.dynamic)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.openCursor](opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let range = opts && 'range' in opts ? opts.range : null;
      let direction = opts && 'direction' in opts ? opts.direction : null;
      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
      let key_OR_range = null;
      if (key != null) {
        if (range != null) {
          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
        }
        key_OR_range = key;
      } else {
        key_OR_range = range;
      }
      let request = null;
      if (direction == null) {
        request = this[_openCursor](key_OR_range);
      } else {
        request = this[_openCursor](key_OR_range, direction);
      }
      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
    }
    [dartx.createIndex](name, keyPath, opts) {
      let unique = opts && 'unique' in opts ? opts.unique : null;
      let multiEntry = opts && 'multiEntry' in opts ? opts.multiEntry : null;
      let options = dart.map();
      if (unique != null) {
        options[dartx._set]('unique', unique);
      }
      if (multiEntry != null) {
        options[dartx._set]('multiEntry', multiEntry);
      }
      return this[_createIndex](name, keyPath, options);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.autoIncrement]() {
      return this.autoIncrement;
    }
    get [dartx.indexNames]() {
      return this.indexNames;
    }
    get [dartx.keyPath]() {
      return this.keyPath;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.transaction]() {
      return this.transaction;
    }
    [_add$3](value, key) {
      if (key === void 0) key = null;
      if (key != null) {
        let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
        let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
        return this[_add_1](value_1, key_2);
      }
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      return this[_add_2](value_1);
    }
    [_add_1](...args) {
      return this.add.apply(this, args);
    }
    [_add_2](...args) {
      return this.add.apply(this, args);
    }
    [_clear$0](...args) {
      return this.clear.apply(this, args);
    }
    [_count$0](...args) {
      return this.count.apply(this, args);
    }
    [_createIndex](name, keyPath, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_createIndex_1](name, keyPath, options_1);
      }
      return this[_createIndex_2](name, keyPath);
    }
    [_createIndex_1](...args) {
      return this.createIndex.apply(this, args);
    }
    [_createIndex_2](...args) {
      return this.createIndex.apply(this, args);
    }
    [_delete$](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.deleteIndex](...args) {
      return this.deleteIndex.apply(this, args);
    }
    [_get$](...args) {
      return this.get.apply(this, args);
    }
    [dartx.getAll](...args) {
      return this.getAll.apply(this, args);
    }
    [dartx.getAllKeys](...args) {
      return this.getAllKeys.apply(this, args);
    }
    [dartx.index](...args) {
      return this.index.apply(this, args);
    }
    [_openCursor](...args) {
      return this.openCursor.apply(this, args);
    }
    [dartx.openKeyCursor](...args) {
      return this.openKeyCursor.apply(this, args);
    }
    [_put](value, key) {
      if (key === void 0) key = null;
      if (key != null) {
        let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
        let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
        return this[_put_1](value_1, key_2);
      }
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      return this[_put_2](value_1);
    }
    [_put_1](...args) {
      return this.put.apply(this, args);
    }
    [_put_2](...args) {
      return this.put.apply(this, args);
    }
    static _cursorStreamFromResult(T) {
      return (request, autoAdvance) => {
        let controller = async.StreamController$(T).new({sync: true});
        request[dartx.onError].listen(dart.bind(controller, 'addError'));
        request[dartx.onSuccess].listen(dart.fn(e => {
          let cursor = indexed_db._cast(T)(request[dartx.result]);
          if (cursor == null) {
            controller.close();
          } else {
            controller.add(cursor);
            if (autoAdvance == true && dart.test(controller.hasListener)) {
              cursor[dartx.next]();
            }
          }
        }, EventTovoid$()));
        return controller.stream;
      };
    }
  };
  dart.setSignature(indexed_db.ObjectStore, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.ObjectStore, [])}),
    fields: () => ({
      [dartx.autoIncrement]: core.bool,
      [dartx.indexNames]: ListOfString(),
      [dartx.keyPath]: core.Object,
      [dartx.name]: core.String,
      [dartx.transaction]: indexed_db.Transaction
    }),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
      [dartx.clear]: dart.definiteFunctionType(async.Future, []),
      [dartx.delete]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
      [dartx.put]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
      [dartx.getObject]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
      [dartx.createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
      [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
      [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
      [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
      [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
      [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
      [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [_createIndex_2]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
      [_delete$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [dartx.deleteIndex]: dart.definiteFunctionType(dart.void, [core.String]),
      [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [dartx.index]: dart.definiteFunctionType(indexed_db.Index, [core.String]),
      [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
      [dartx.openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
      [_put]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
      [_put_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
      [_put_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
    }),
    statics: () => ({_cursorStreamFromResult: dart.definiteFunctionType(T => [async.Stream$(T), [indexed_db.Request, core.bool]])}),
    names: ['_cursorStreamFromResult']
  });
  dart.registerExtension(dart.global.IDBObjectStore, indexed_db.ObjectStore);
  indexed_db._cast = function(To) {
    return x => {
      return To._check(x);
    };
  };
  dart.fn(indexed_db._cast, dynamicToTo());
  const _get_result = Symbol('_get_result');
  dart.defineExtensionNames([
    'result',
    'onError',
    'onSuccess',
    'error',
    'readyState',
    'source',
    'transaction'
  ]);
  indexed_db.Request = class Request extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.result]() {
      return indexed_db._convertNativeToDart_IDBAny(this[_get_result]);
    }
    get [_get_result]() {
      return this.result;
    }
    get [dartx.source]() {
      return this.source;
    }
    get [dartx.transaction]() {
      return this.transaction;
    }
    get [dartx.onError]() {
      return indexed_db.Request.errorEvent.forTarget(this);
    }
    get [dartx.onSuccess]() {
      return indexed_db.Request.successEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.Request, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Request, [])}),
    fields: () => ({
      [dartx.error]: html$.DomError,
      [dartx.readyState]: core.String,
      [_get_result]: dart.dynamic,
      [dartx.source]: core.Object,
      [dartx.transaction]: indexed_db.Transaction
    }),
    getters: () => ({
      [dartx.result]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      successEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(indexed_db.Request, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get successEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('success'));
    }
  });
  dart.registerExtension(dart.global.IDBRequest, indexed_db.Request);
  dart.defineExtensionNames([
    'onBlocked',
    'onUpgradeNeeded'
  ]);
  indexed_db.OpenDBRequest = class OpenDBRequest extends indexed_db.Request {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.onBlocked]() {
      return indexed_db.OpenDBRequest.blockedEvent.forTarget(this);
    }
    get [dartx.onUpgradeNeeded]() {
      return indexed_db.OpenDBRequest.upgradeNeededEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.OpenDBRequest, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.OpenDBRequest, [])}),
    getters: () => ({
      [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onUpgradeNeeded]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
    }),
    sfields: () => ({
      blockedEvent: EventStreamProviderOfEvent(),
      upgradeNeededEvent: EventStreamProviderOfVersionChangeEvent()
    })
  });
  dart.defineLazy(indexed_db.OpenDBRequest, {
    get blockedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blocked'));
    },
    get upgradeNeededEvent() {
      return dart.const(new (EventStreamProviderOfVersionChangeEvent())('upgradeneeded'));
    }
  });
  dart.registerExtension(dart.global.IDBOpenDBRequest, indexed_db.OpenDBRequest);
  dart.registerExtension(dart.global.IDBVersionChangeRequest, indexed_db.OpenDBRequest);
  dart.defineExtensionNames([
    'completed',
    'abort',
    'objectStore',
    'onAbort',
    'onComplete',
    'onError',
    'db',
    'error',
    'mode',
    'objectStoreNames'
  ]);
  indexed_db.Transaction = class Transaction extends html$.EventTarget {
    get [dartx.completed]() {
      let completer = CompleterOfDatabase().new();
      this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
        completer.complete(this[dartx.db]);
      }, EventTodynamic()));
      this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
        completer.completeError(e);
      }, EventTodynamic()));
      this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
        if (!dart.test(completer.isCompleted)) {
          completer.completeError(e);
        }
      }, EventTodynamic()));
      return completer.future;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.db]() {
      return this.db;
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    get [dartx.objectStoreNames]() {
      return this.objectStoreNames;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.objectStore](...args) {
      return this.objectStore.apply(this, args);
    }
    get [dartx.onAbort]() {
      return indexed_db.Transaction.abortEvent.forTarget(this);
    }
    get [dartx.onComplete]() {
      return indexed_db.Transaction.completeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return indexed_db.Transaction.errorEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.Transaction, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Transaction, [])}),
    fields: () => ({
      [dartx.db]: indexed_db.Database,
      [dartx.error]: html$.DomError,
      [dartx.mode]: core.String,
      [dartx.objectStoreNames]: ListOfString()
    }),
    getters: () => ({
      [dartx.completed]: dart.definiteFunctionType(async.Future$(indexed_db.Database), []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.objectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfEvent(),
      completeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(indexed_db.Transaction, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get completeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('complete'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.registerExtension(dart.global.IDBTransaction, indexed_db.Transaction);
  const _createEvent = Symbol('_createEvent');
  const _initEvent = Symbol('_initEvent');
  const _selector = Symbol('_selector');
  const _get_currentTarget = Symbol('_get_currentTarget');
  const _get_target = Symbol('_get_target');
  dart.defineExtensionNames([
    'matchingTarget',
    'currentTarget',
    'target',
    'preventDefault',
    'stopImmediatePropagation',
    'stopPropagation',
    'bubbles',
    'cancelable',
    'defaultPrevented',
    'eventPhase',
    'path',
    'timeStamp',
    'type'
  ]);
  html$.Event = class Event extends _interceptors.Interceptor {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      return html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
    }
    static eventType(type, name, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let e = html$.document[_createEvent](type);
      e[_initEvent](name, canBubble, cancelable);
      return e;
    }
    get [_selector]() {
      return this._selector;
    }
    set [_selector](value) {
      this._selector = value;
    }
    get [dartx.matchingTarget]() {
      if (this[_selector] == null) {
        dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
      }
      let currentTarget = html$.Element._check(this[dartx.currentTarget]);
      let target = html$.Element._check(this[dartx.target]);
      let matchedTarget = null;
      do {
        if (dart.test(target[dartx.matches](this[_selector]))) return target;
        target = target[dartx.parent];
      } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
      dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.Event._create_1(type, eventInitDict_1);
      }
      return html$.Event._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new Event(type, eventInitDict);
    }
    static _create_2(type) {
      return new Event(type);
    }
    get [dartx.bubbles]() {
      return this.bubbles;
    }
    get [dartx.cancelable]() {
      return this.cancelable;
    }
    get [dartx.currentTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
    }
    get [_get_currentTarget]() {
      return this.currentTarget;
    }
    get [dartx.defaultPrevented]() {
      return this.defaultPrevented;
    }
    get [dartx.eventPhase]() {
      return this.eventPhase;
    }
    get [dartx.path]() {
      return this.path;
    }
    get [dartx.target]() {
      return html$._convertNativeToDart_EventTarget(this[_get_target]);
    }
    get [_get_target]() {
      return this.target;
    }
    get [dartx.timeStamp]() {
      return this.timeStamp;
    }
    get [dartx.type]() {
      return this.type;
    }
    [_initEvent](...args) {
      return this.initEvent.apply(this, args);
    }
    [dartx.preventDefault](...args) {
      return this.preventDefault.apply(this, args);
    }
    [dartx.stopImmediatePropagation](...args) {
      return this.stopImmediatePropagation.apply(this, args);
    }
    [dartx.stopPropagation](...args) {
      return this.stopPropagation.apply(this, args);
    }
  };
  dart.setSignature(html$.Event, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
      eventType: dart.definiteFunctionType(html$.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
      _: dart.definiteFunctionType(html$.Event, [core.String], [core.Map])
    }),
    fields: () => ({
      [_selector]: core.String,
      [dartx.bubbles]: core.bool,
      [dartx.cancelable]: core.bool,
      [_get_currentTarget]: dart.dynamic,
      [dartx.defaultPrevented]: core.bool,
      [dartx.eventPhase]: core.int,
      [dartx.path]: ListOfEventTarget(),
      [_get_target]: dart.dynamic,
      [dartx.timeStamp]: core.int,
      [dartx.type]: core.String
    }),
    getters: () => ({
      [dartx.matchingTarget]: dart.definiteFunctionType(html$.Element, []),
      [dartx.currentTarget]: dart.definiteFunctionType(html$.EventTarget, []),
      [dartx.target]: dart.definiteFunctionType(html$.EventTarget, [])
    }),
    methods: () => ({
      [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
      [dartx.preventDefault]: dart.definiteFunctionType(dart.void, []),
      [dartx.stopImmediatePropagation]: dart.definiteFunctionType(dart.void, []),
      [dartx.stopPropagation]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      AT_TARGET: core.int,
      BUBBLING_PHASE: core.int,
      CAPTURING_PHASE: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.Event, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.Event, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.Event.AT_TARGET = 2;
  html$.Event.BUBBLING_PHASE = 3;
  html$.Event.CAPTURING_PHASE = 1;
  dart.registerExtension(dart.global.Event, html$.Event);
  dart.registerExtension(dart.global.InputEvent, html$.Event);
  dart.defineExtensionNames([
    'dataLoss',
    'dataLossMessage',
    'newVersion',
    'oldVersion'
  ]);
  indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return indexed_db.VersionChangeEvent._create_1(type, eventInitDict_1);
      }
      return indexed_db.VersionChangeEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new IDBVersionChangeEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new IDBVersionChangeEvent(type);
    }
    get [dartx.dataLoss]() {
      return this.dataLoss;
    }
    get [dartx.dataLossMessage]() {
      return this.dataLossMessage;
    }
    get [dartx.newVersion]() {
      return this.newVersion;
    }
    get [dartx.oldVersion]() {
      return this.oldVersion;
    }
  };
  dart.setSignature(indexed_db.VersionChangeEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(indexed_db.VersionChangeEvent, []),
      new: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.dataLoss]: core.String,
      [dartx.dataLossMessage]: core.String,
      [dartx.newVersion]: core.int,
      [dartx.oldVersion]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.IDBVersionChangeEvent, indexed_db.VersionChangeEvent);
  dart.copyProperties(html$, {
    get window() {
      return window;
    }
  });
  dart.copyProperties(html$, {
    get document() {
      return document;
    }
  });
  const _xtag = Symbol('_xtag');
  const _attributes$ = Symbol('_attributes');
  const _innerHtml = Symbol('_innerHtml');
  const _scrollHeight = Symbol('_scrollHeight');
  const _scrollLeft = Symbol('_scrollLeft');
  const _scrollTop = Symbol('_scrollTop');
  const _scrollWidth = Symbol('_scrollWidth');
  const _childElementCount = Symbol('_childElementCount');
  const _children = Symbol('_children');
  const _firstElementChild = Symbol('_firstElementChild');
  const _lastElementChild = Symbol('_lastElementChild');
  const _querySelectorAll = Symbol('_querySelectorAll');
  const _getComputedStyle = Symbol('_getComputedStyle');
  const _animate = Symbol('_animate');
  const _localName = Symbol('_localName');
  const _namespaceUri = Symbol('_namespaceUri');
  const _scrollIntoView = Symbol('_scrollIntoView');
  const _scrollIntoViewIfNeeded = Symbol('_scrollIntoViewIfNeeded');
  const _insertAdjacentText = Symbol('_insertAdjacentText');
  const _insertAdjacentNode = Symbol('_insertAdjacentNode');
  const _insertAdjacentHtml = Symbol('_insertAdjacentHtml');
  const _insertAdjacentElement = Symbol('_insertAdjacentElement');
  const _canBeUsedToCreateContextualFragment = Symbol('_canBeUsedToCreateContextualFragment');
  const _cannotBeUsedToCreateContextualFragment = Symbol('_cannotBeUsedToCreateContextualFragment');
  const _getElementsByTagName = Symbol('_getElementsByTagName');
  const _hasAttribute = Symbol('_hasAttribute');
  const _hasAttributeNS = Symbol('_hasAttributeNS');
  const _removeAttribute = Symbol('_removeAttribute');
  const _removeAttributeNS = Symbol('_removeAttributeNS');
  const _scroll_1 = Symbol('_scroll_1');
  const _scroll_2 = Symbol('_scroll_2');
  const _scroll_3 = Symbol('_scroll_3');
  const _scrollBy_1 = Symbol('_scrollBy_1');
  const _scrollBy_2 = Symbol('_scrollBy_2');
  const _scrollBy_3 = Symbol('_scrollBy_3');
  const _scrollTo_1 = Symbol('_scrollTo_1');
  const _scrollTo_2 = Symbol('_scrollTo_2');
  const _scrollTo_3 = Symbol('_scrollTo_3');
  const _removeChild = Symbol('_removeChild');
  const _replaceChild = Symbol('_replaceChild');
  const _this = Symbol('_this');
  const _clearChildren = Symbol('_clearChildren');
  dart.defineExtensionNames([
    'nodes',
    'nodes',
    'remove',
    'replaceWith',
    'insertAllBefore',
    'toString',
    'append',
    'clone',
    'contains',
    'hasChildNodes',
    'insertBefore',
    'childNodes',
    'baseUri',
    'firstChild',
    'lastChild',
    'nextNode',
    'nodeName',
    'nodeType',
    'nodeValue',
    'ownerDocument',
    'parent',
    'parentNode',
    'previousNode',
    'text'
  ]);
  html$.Node = class Node extends html$.EventTarget {
    _created() {
      this[dartx.childNodes] = null;
      this[dartx.baseUri] = null;
      this[dartx.firstChild] = null;
      this[dartx.lastChild] = null;
      this[_localName] = null;
      this[_namespaceUri] = null;
      this[dartx.nextNode] = null;
      this[dartx.nodeName] = null;
      this[dartx.nodeType] = null;
      this[dartx.nodeValue] = null;
      this[dartx.ownerDocument] = null;
      this[dartx.parent] = null;
      this[dartx.parentNode] = null;
      this[dartx.previousNode] = null;
      this[dartx.text] = null;
      super._created();
    }
    get [dartx.nodes]() {
      return new html$._ChildNodeListLazy(this);
    }
    set [dartx.nodes](value) {
      let copy = value[dartx.toList]();
      this[dartx.text] = '';
      for (let node of copy) {
        this[dartx.append](node);
      }
    }
    [dartx.remove]() {
      if (this[dartx.parentNode] != null) {
        let parent = this[dartx.parentNode];
        this[dartx.parentNode][_removeChild](this);
      }
    }
    [dartx.replaceWith](otherNode) {
      try {
        let parent = this[dartx.parentNode];
        parent[_replaceChild](otherNode, this);
      } catch (e) {
      }

      ;
      return this;
    }
    [dartx.insertAllBefore](newNodes, refChild) {
      if (html$._ChildNodeListLazy.is(newNodes)) {
        let otherList = newNodes;
        if (core.identical(otherList[_this], this)) {
          dart.throw(new core.ArgumentError(newNodes));
        }
        for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
          this[dartx.insertBefore](otherList[_this][dartx.firstChild], refChild);
        }
      } else {
        for (let node of newNodes) {
          this[dartx.insertBefore](node, refChild);
        }
      }
    }
    [_clearChildren]() {
      while (this[dartx.firstChild] != null) {
        this[_removeChild](this[dartx.firstChild]);
      }
    }
    [dartx.toString]() {
      let value = this[dartx.nodeValue];
      return value == null ? super.toString() : value;
    }
    get [dartx.childNodes]() {
      return this.childNodes;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.baseUri]() {
      return this.baseURI;
    }
    get [dartx.firstChild]() {
      return this.firstChild;
    }
    get [dartx.lastChild]() {
      return this.lastChild;
    }
    get [_localName]() {
      return this.localName;
    }
    get [_namespaceUri]() {
      return this.namespaceURI;
    }
    get [dartx.nextNode]() {
      return this.nextSibling;
    }
    get [dartx.nodeName]() {
      return this.nodeName;
    }
    get [dartx.nodeType]() {
      return this.nodeType;
    }
    get [dartx.nodeValue]() {
      return this.nodeValue;
    }
    get [dartx.ownerDocument]() {
      return this.ownerDocument;
    }
    get [dartx.parent]() {
      return this.parentElement;
    }
    get [dartx.parentNode]() {
      return this.parentNode;
    }
    get [dartx.previousNode]() {
      return this.previousSibling;
    }
    get [dartx.text]() {
      return this.textContent;
    }
    set [dartx.text](value) {
      this.textContent = value;
    }
    [dartx.append](...args) {
      return this.appendChild.apply(this, args);
    }
    [dartx.clone](...args) {
      return this.cloneNode.apply(this, args);
    }
    [dartx.contains](...args) {
      return this.contains.apply(this, args);
    }
    [dartx.hasChildNodes](...args) {
      return this.hasChildNodes.apply(this, args);
    }
    [dartx.insertBefore](...args) {
      return this.insertBefore.apply(this, args);
    }
    [_removeChild](...args) {
      return this.removeChild.apply(this, args);
    }
    [_replaceChild](...args) {
      return this.replaceChild.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.Node, '_created');
  dart.setSignature(html$.Node, {
    constructors: () => ({
      _created: dart.definiteFunctionType(html$.Node, []),
      _: dart.definiteFunctionType(html$.Node, [])
    }),
    fields: () => ({
      [dartx.childNodes]: ListOfNode(),
      [dartx.baseUri]: core.String,
      [dartx.firstChild]: html$.Node,
      [dartx.lastChild]: html$.Node,
      [_localName]: core.String,
      [_namespaceUri]: core.String,
      [dartx.nextNode]: html$.Node,
      [dartx.nodeName]: core.String,
      [dartx.nodeType]: core.int,
      [dartx.nodeValue]: core.String,
      [dartx.ownerDocument]: html$.Document,
      [dartx.parent]: html$.Element,
      [dartx.parentNode]: html$.Node,
      [dartx.previousNode]: html$.Node,
      [dartx.text]: core.String
    }),
    getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
    setters: () => ({[dartx.nodes]: dart.definiteFunctionType(dart.void, [IterableOfNode()])}),
    methods: () => ({
      [dartx.remove]: dart.definiteFunctionType(dart.void, []),
      [dartx.replaceWith]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [dartx.insertAllBefore]: dart.definiteFunctionType(html$.Node, [IterableOfNode(), html$.Node]),
      [_clearChildren]: dart.definiteFunctionType(dart.void, []),
      [dartx.append]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [dartx.clone]: dart.definiteFunctionType(html$.Node, [core.bool]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [html$.Node]),
      [dartx.hasChildNodes]: dart.definiteFunctionType(core.bool, []),
      [dartx.insertBefore]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node]),
      [_removeChild]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [_replaceChild]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node])
    }),
    sfields: () => ({
      ATTRIBUTE_NODE: core.int,
      CDATA_SECTION_NODE: core.int,
      COMMENT_NODE: core.int,
      DOCUMENT_FRAGMENT_NODE: core.int,
      DOCUMENT_NODE: core.int,
      DOCUMENT_TYPE_NODE: core.int,
      ELEMENT_NODE: core.int,
      ENTITY_NODE: core.int,
      ENTITY_REFERENCE_NODE: core.int,
      NOTATION_NODE: core.int,
      PROCESSING_INSTRUCTION_NODE: core.int,
      TEXT_NODE: core.int
    })
  });
  html$.Node.ATTRIBUTE_NODE = 2;
  html$.Node.CDATA_SECTION_NODE = 4;
  html$.Node.COMMENT_NODE = 8;
  html$.Node.DOCUMENT_FRAGMENT_NODE = 11;
  html$.Node.DOCUMENT_NODE = 9;
  html$.Node.DOCUMENT_TYPE_NODE = 10;
  html$.Node.ELEMENT_NODE = 1;
  html$.Node.ENTITY_NODE = 6;
  html$.Node.ENTITY_REFERENCE_NODE = 5;
  html$.Node.NOTATION_NODE = 12;
  html$.Node.PROCESSING_INSTRUCTION_NODE = 7;
  html$.Node.TEXT_NODE = 3;
  dart.registerExtension(dart.global.Node, html$.Node);
  dart.defineExtensionNames([
    'attributes',
    'attributes',
    'children',
    'children',
    'querySelectorAll',
    'query',
    'queryAll',
    'classes',
    'classes',
    'dataset',
    'dataset',
    'getNamespacedAttributes',
    'getComputedStyle',
    'client',
    'offset',
    'appendText',
    'appendHtml',
    'attached',
    'detached',
    'enteredView',
    'leftView',
    'animate',
    'attributeChanged',
    'xtag',
    'xtag',
    'localName',
    'namespaceUri',
    'toString',
    'scrollIntoView',
    'insertAdjacentText',
    'insertAdjacentHtml',
    'insertAdjacentElement',
    'matches',
    'matchesWithAncestors',
    'createShadowRoot',
    'shadowRoot',
    'contentEdge',
    'paddingEdge',
    'borderEdge',
    'marginEdge',
    'documentOffset',
    'offsetTo',
    'createFragment',
    'innerHtml',
    'setInnerHtml',
    'innerHtml',
    'on',
    'offsetHeight',
    'offsetLeft',
    'offsetTop',
    'offsetWidth',
    'scrollHeight',
    'scrollLeft',
    'scrollLeft',
    'scrollTop',
    'scrollTop',
    'scrollWidth',
    'isContentEditable',
    'blur',
    'click',
    'focus',
    'outerHtml',
    'closest',
    'getAnimations',
    'getAttribute',
    'getAttributeNS',
    'getBoundingClientRect',
    'getClientRects',
    'getDestinationInsertionPoints',
    'getElementsByClassName',
    'requestFullscreen',
    'requestPointerLock',
    'scroll',
    'scrollBy',
    'scrollTo',
    'setAttribute',
    'setAttributeNS',
    'after',
    'before',
    'querySelector',
    'onAbort',
    'onBeforeCopy',
    'onBeforeCut',
    'onBeforePaste',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onCopy',
    'onCut',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPaste',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSearch',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onSelectStart',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onTouchCancel',
    'onTouchEnd',
    'onTouchEnter',
    'onTouchLeave',
    'onTouchMove',
    'onTouchStart',
    'onTransitionEnd',
    'onVolumeChange',
    'onWaiting',
    'onFullscreenChange',
    'onFullscreenError',
    'offsetParent',
    'contentEditable',
    'contextMenu',
    'dir',
    'draggable',
    'hidden',
    'lang',
    'spellcheck',
    'style',
    'tabIndex',
    'title',
    'translate',
    'dropzone',
    'className',
    'clientHeight',
    'clientLeft',
    'clientTop',
    'clientWidth',
    'computedName',
    'computedRole',
    'id',
    'tagName',
    'nextElementSibling',
    'previousElementSibling'
  ]);
  html$.Element = class Element extends html$.Node {
    static html(html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      let fragment = html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      return html$.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html$.Element.is(e), NodeTobool$()))[dartx.single]);
    }
    created() {
      this[_xtag] = null;
      this[dartx.offsetParent] = null;
      this[dartx.contentEditable] = null;
      this[dartx.contextMenu] = null;
      this[dartx.dir] = null;
      this[dartx.draggable] = null;
      this[dartx.hidden] = null;
      this[dartx.lang] = null;
      this[dartx.spellcheck] = null;
      this[dartx.style] = null;
      this[dartx.tabIndex] = null;
      this[dartx.title] = null;
      this[dartx.translate] = null;
      this[dartx.dropzone] = null;
      this[_attributes$] = null;
      this[dartx.className] = null;
      this[dartx.clientHeight] = null;
      this[dartx.clientLeft] = null;
      this[dartx.clientTop] = null;
      this[dartx.clientWidth] = null;
      this[dartx.computedName] = null;
      this[dartx.computedRole] = null;
      this[dartx.id] = null;
      this[_innerHtml] = null;
      this[_scrollHeight] = null;
      this[_scrollLeft] = null;
      this[_scrollTop] = null;
      this[_scrollWidth] = null;
      this[dartx.tagName] = null;
      this[dartx.nextElementSibling] = null;
      this[dartx.previousElementSibling] = null;
      this[_childElementCount] = null;
      this[_children] = null;
      this[_firstElementChild] = null;
      this[_lastElementChild] = null;
      super._created();
    }
    static tag(tag, typeExtention) {
      if (typeExtention === void 0) typeExtention = null;
      return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
    }
    static a() {
      return html$.Element.tag('a');
    }
    static article() {
      return html$.Element.tag('article');
    }
    static aside() {
      return html$.Element.tag('aside');
    }
    static audio() {
      return html$.Element.tag('audio');
    }
    static br() {
      return html$.Element.tag('br');
    }
    static canvas() {
      return html$.Element.tag('canvas');
    }
    static div() {
      return html$.Element.tag('div');
    }
    static footer() {
      return html$.Element.tag('footer');
    }
    static header() {
      return html$.Element.tag('header');
    }
    static hr() {
      return html$.Element.tag('hr');
    }
    static iframe() {
      return html$.Element.tag('iframe');
    }
    static img() {
      return html$.Element.tag('img');
    }
    static li() {
      return html$.Element.tag('li');
    }
    static nav() {
      return html$.Element.tag('nav');
    }
    static ol() {
      return html$.Element.tag('ol');
    }
    static option() {
      return html$.Element.tag('option');
    }
    static p() {
      return html$.Element.tag('p');
    }
    static pre() {
      return html$.Element.tag('pre');
    }
    static section() {
      return html$.Element.tag('section');
    }
    static select() {
      return html$.Element.tag('select');
    }
    static span() {
      return html$.Element.tag('span');
    }
    static svg() {
      return html$.Element.tag('svg');
    }
    static table() {
      return html$.Element.tag('table');
    }
    static td() {
      return html$.Element.tag('td');
    }
    static textarea() {
      return html$.Element.tag('textarea');
    }
    static th() {
      return html$.Element.tag('th');
    }
    static tr() {
      return html$.Element.tag('tr');
    }
    static ul() {
      return html$.Element.tag('ul');
    }
    static video() {
      return html$.Element.tag('video');
    }
    get [dartx.attributes]() {
      return new html$._ElementAttributeMap(this);
    }
    set [dartx.attributes](value) {
      let attributes = this[dartx.attributes];
      attributes[dartx.clear]();
      for (let key of value[dartx.keys]) {
        attributes[dartx._set](key, value[dartx._get](key));
      }
    }
    get [dartx.children]() {
      return new html$._ChildrenElementList._wrap(this);
    }
    set [dartx.children](value) {
      let copy = value[dartx.toList]();
      let children = this[dartx.children];
      children[dartx.clear]();
      children[dartx.addAll](copy);
    }
    [dartx.querySelectorAll](T) {
      return selectors => {
        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
      };
    }
    [dartx.query](relativeSelectors) {
      return this[dartx.querySelector](relativeSelectors);
    }
    [dartx.queryAll](T) {
      return relativeSelectors => {
        return this[dartx.querySelectorAll](T)(relativeSelectors);
      };
    }
    get [dartx.classes]() {
      return new html$._ElementCssClassSet(this);
    }
    set [dartx.classes](value) {
      let classSet = this[dartx.classes];
      classSet.clear();
      classSet.addAll(value);
    }
    get [dartx.dataset]() {
      return new html$._DataAttributeMap(this[dartx.attributes]);
    }
    set [dartx.dataset](value) {
      let data = this[dartx.dataset];
      data[dartx.clear]();
      for (let key of value[dartx.keys]) {
        data[dartx._set](key, value[dartx._get](key));
      }
    }
    [dartx.getNamespacedAttributes](namespace) {
      return new html$._NamespacedAttributeMap(this, namespace);
    }
    [dartx.getComputedStyle](pseudoElement) {
      if (pseudoElement === void 0) pseudoElement = null;
      if (pseudoElement == null) {
        pseudoElement = '';
      }
      return html$.window[_getComputedStyle](this, pseudoElement);
    }
    get [dartx.client]() {
      return new (RectangleOfint())(this[dartx.clientLeft], this[dartx.clientTop], this[dartx.clientWidth], this[dartx.clientHeight]);
    }
    get [dartx.offset]() {
      return new (RectangleOfint())(this[dartx.offsetLeft], this[dartx.offsetTop], this[dartx.offsetWidth], this[dartx.offsetHeight]);
    }
    [dartx.appendText](text) {
      this[dartx.append](html$.Text.new(text));
    }
    [dartx.appendHtml](text, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.insertAdjacentHtml]('beforeend', text, {validator: validator, treeSanitizer: treeSanitizer});
    }
    static isTagSupported(tag) {
      let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
      return html$.Element.is(e) && !html$.UnknownElement.is(e);
    }
    [dartx.attached]() {
      this[dartx.enteredView]();
    }
    [dartx.detached]() {
      this[dartx.leftView]();
    }
    [dartx.enteredView]() {}
    [dartx.leftView]() {}
    [dartx.animate](frames, timing) {
      if (timing === void 0) timing = null;
      if (!core.Iterable.is(frames) || !dart.test(frames[dartx.every](dart.fn(x => core.Map.is(x), MapOfString$dynamicTobool())))) {
        dart.throw(new core.ArgumentError("The frames parameter should be a List of Maps " + "with frame information"));
      }
      let convertedFrames = null;
      if (core.Iterable.is(frames)) {
        convertedFrames = frames[dartx.map](dart.dynamic)(html_common.convertDartToNative_Dictionary)[dartx.toList]();
      } else {
        convertedFrames = frames;
      }
      let convertedTiming = core.Map.is(timing) ? html_common.convertDartToNative_Dictionary(timing) : timing;
      return convertedTiming == null ? this[_animate](convertedFrames) : this[_animate](convertedFrames, convertedTiming);
    }
    [_animate](...args) {
      return this.animate.apply(this, args);
    }
    [dartx.attributeChanged](name, oldValue, newValue) {}
    get [_xtag]() {
      return this._xtag;
    }
    set [_xtag](value) {
      this._xtag = value;
    }
    get [dartx.xtag]() {
      return this[_xtag] != null ? this[_xtag] : this;
    }
    set [dartx.xtag](value) {
      this[_xtag] = value;
    }
    get [dartx.localName]() {
      return this[_localName];
    }
    get [dartx.namespaceUri]() {
      return this[_namespaceUri];
    }
    [dartx.toString]() {
      return this[dartx.localName];
    }
    [dartx.scrollIntoView](alignment) {
      if (alignment === void 0) alignment = null;
      let hasScrollIntoViewIfNeeded = true;
      hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
      if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
        this[_scrollIntoView](true);
      } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
        this[_scrollIntoView](false);
      } else if (hasScrollIntoViewIfNeeded) {
        if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
          this[_scrollIntoViewIfNeeded](true);
        } else {
          this[_scrollIntoViewIfNeeded]();
        }
      } else {
        this[_scrollIntoView]();
      }
    }
    static _determineMouseWheelEventType(e) {
      return 'wheel';
    }
    static _determineTransitionEventType(e) {
      if (dart.test(html_common.Device.isWebKit)) {
        return 'webkitTransitionEnd';
      } else if (dart.test(html_common.Device.isOpera)) {
        return 'oTransitionEnd';
      }
      return 'transitionend';
    }
    [dartx.insertAdjacentText](where, text) {
      if (!!this.insertAdjacentText) {
        this[_insertAdjacentText](where, text);
      } else {
        this[_insertAdjacentNode](where, html$.Text.new(text));
      }
    }
    [_insertAdjacentText](...args) {
      return this.insertAdjacentText.apply(this, args);
    }
    [dartx.insertAdjacentHtml](where, html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
        this[_insertAdjacentHtml](where, html);
      } else {
        this[_insertAdjacentNode](where, this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
      }
    }
    [_insertAdjacentHtml](...args) {
      return this.insertAdjacentHTML.apply(this, args);
    }
    [dartx.insertAdjacentElement](where, element) {
      if (!!this.insertAdjacentElement) {
        this[_insertAdjacentElement](where, element);
      } else {
        this[_insertAdjacentNode](where, element);
      }
      return element;
    }
    [_insertAdjacentElement](...args) {
      return this.insertAdjacentElement.apply(this, args);
    }
    [_insertAdjacentNode](where, node) {
      switch (where[dartx.toLowerCase]()) {
        case 'beforebegin':
        {
          this[dartx.parentNode][dartx.insertBefore](node, this);
          break;
        }
        case 'afterbegin':
        {
          let first = dart.notNull(this[dartx.nodes][dartx.length]) > 0 ? this[dartx.nodes][dartx._get](0) : null;
          this[dartx.insertBefore](node, first);
          break;
        }
        case 'beforeend':
        {
          this[dartx.append](node);
          break;
        }
        case 'afterend':
        {
          this[dartx.parentNode][dartx.insertBefore](node, this[dartx.nextNode]);
          break;
        }
        default:
        {
          dart.throw(new core.ArgumentError(dart.str`Invalid position ${where}`));
        }
      }
    }
    [dartx.matches](selectors) {
      if (!!this.matches) {
        return this.matches(selectors);
      } else if (!!this.webkitMatchesSelector) {
        return this.webkitMatchesSelector(selectors);
      } else if (!!this.mozMatchesSelector) {
        return this.mozMatchesSelector(selectors);
      } else if (!!this.msMatchesSelector) {
        return this.msMatchesSelector(selectors);
      } else if (!!this.oMatchesSelector) {
        return this.oMatchesSelector(selectors);
      } else {
        dart.throw(new core.UnsupportedError("Not supported on this platform"));
      }
    }
    [dartx.matchesWithAncestors](selectors) {
      let elem = this;
      do {
        if (dart.test(elem[dartx.matches](selectors))) return true;
        elem = elem[dartx.parent];
      } while (elem != null);
      return false;
    }
    [dartx.createShadowRoot]() {
      return (this.createShadowRoot || this.webkitCreateShadowRoot).call(this);
    }
    get [dartx.shadowRoot]() {
      return this.shadowRoot || this.webkitShadowRoot;
    }
    get [dartx.contentEdge]() {
      return new html$._ContentCssRect(this);
    }
    get [dartx.paddingEdge]() {
      return new html$._PaddingCssRect(this);
    }
    get [dartx.borderEdge]() {
      return new html$._BorderCssRect(this);
    }
    get [dartx.marginEdge]() {
      return new html$._MarginCssRect(this);
    }
    get [dartx.documentOffset]() {
      return this[dartx.offsetTo](html$.document[dartx.documentElement]);
    }
    [dartx.offsetTo](parent) {
      return html$.Element._offsetToHelper(this, parent);
    }
    static _offsetToHelper(current, parent) {
      let sameAsParent = core.identical(current, parent);
      let foundAsParent = sameAsParent || parent[dartx.tagName] == 'HTML';
      if (current == null || sameAsParent) {
        if (foundAsParent) return new (PointOfnum())(0, 0);
        dart.throw(new core.ArgumentError("Specified element is not a transitive offset " + "parent of this element."));
      }
      let parentOffset = current[dartx.offsetParent];
      let p = html$.Element._offsetToHelper(parentOffset, parent);
      return new (PointOfnum())(dart.notNull(p.x) + dart.notNull(current[dartx.offsetLeft]), dart.notNull(p.y) + dart.notNull(current[dartx.offsetTop]));
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (treeSanitizer == null) {
        if (validator == null) {
          if (html$.Element._defaultValidator == null) {
            html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
          }
          validator = html$.Element._defaultValidator;
        }
        if (html$.Element._defaultSanitizer == null) {
          html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer(validator);
        } else {
          html$.Element._defaultSanitizer.validator = validator;
        }
        treeSanitizer = html$.Element._defaultSanitizer;
      } else if (validator != null) {
        dart.throw(new core.ArgumentError('validator can only be passed if treeSanitizer is null'));
      }
      if (html$.Element._parseDocument == null) {
        html$.Element._parseDocument = html$.document[dartx.implementation][dartx.createHtmlDocument]('');
        html$.Element._parseRange = html$.Element._parseDocument[dartx.createRange]();
        let base = html$.BaseElement._check(html$.Element._parseDocument[dartx.createElement]('base'));
        base[dartx.href] = html$.document[dartx.baseUri];
        html$.Element._parseDocument[dartx.head][dartx.append](base);
      }
      let contextElement = null;
      if (html$.BodyElement.is(this)) {
        contextElement = html$.Element._parseDocument[dartx.body];
      } else {
        contextElement = html$.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
        html$.Element._parseDocument[dartx.body][dartx.append](html$.Node._check(contextElement));
      }
      let fragment = null;
      if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
        html$.Element._parseRange[dartx.selectNodeContents](html$.Node._check(contextElement));
        fragment = html$.Element._parseRange[dartx.createContextualFragment](html);
      } else {
        dart.dput(contextElement, _innerHtml, html);
        fragment = html$.Element._parseDocument[dartx.createDocumentFragment]();
        while (dart.dload(contextElement, 'firstChild') != null) {
          dart.dsend(fragment, 'append', dart.dload(contextElement, 'firstChild'));
        }
      }
      if (!dart.equals(contextElement, html$.Element._parseDocument[dartx.body])) {
        dart.dsend(contextElement, 'remove');
      }
      treeSanitizer.sanitizeTree(html$.Node._check(fragment));
      html$.document[dartx.adoptNode](html$.Node._check(fragment));
      return html$.DocumentFragment._check(fragment);
    }
    get [_canBeUsedToCreateContextualFragment]() {
      return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
    }
    get [_cannotBeUsedToCreateContextualFragment]() {
      return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
    }
    set [dartx.innerHtml](html) {
      this[dartx.setInnerHtml](html);
    }
    [dartx.setInnerHtml](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.text] = null;
      if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
        this[_innerHtml] = html;
      } else {
        this[dartx.append](this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
      }
    }
    get [dartx.innerHtml]() {
      return this[_innerHtml];
    }
    get [dartx.on]() {
      return new html$.ElementEvents(this);
    }
    static _hasCorruptedAttributes(element) {
      return (function(element) {
        if (!(element.attributes instanceof NamedNodeMap)) {
          return true;
        }
        var childNodes = element.childNodes;
        if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
          return true;
        }
        if (element.children) {
          if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
            return true;
          }
        }
        var length = 0;
        if (element.children) {
          length = element.children.length;
        }
        for (var i = 0; i < length; i++) {
          var child = element.children[i];
          if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'children' || child.name == 'children') {
            return true;
          }
        }
        return false;
      })(element);
    }
    static _hasCorruptedAttributesAdditionalCheck(element) {
      return !(element.attributes instanceof NamedNodeMap);
    }
    static _safeTagName(element) {
      let result = 'element tag unavailable';
      try {
        if (typeof dart.dload(element, 'tagName') == 'string') {
          result = core.String._check(dart.dload(element, 'tagName'));
        }
      } catch (e) {
      }

      return result;
    }
    get [dartx.offsetParent]() {
      return this.offsetParent;
    }
    get [dartx.offsetHeight]() {
      return this.offsetHeight[dartx.round]();
    }
    get [dartx.offsetLeft]() {
      return this.offsetLeft[dartx.round]();
    }
    get [dartx.offsetTop]() {
      return this.offsetTop[dartx.round]();
    }
    get [dartx.offsetWidth]() {
      return this.offsetWidth[dartx.round]();
    }
    get [dartx.scrollHeight]() {
      return this.scrollHeight[dartx.round]();
    }
    get [dartx.scrollLeft]() {
      return this.scrollLeft[dartx.round]();
    }
    set [dartx.scrollLeft](value) {
      this.scrollLeft = value[dartx.round]();
    }
    get [dartx.scrollTop]() {
      return this.scrollTop[dartx.round]();
    }
    set [dartx.scrollTop](value) {
      this.scrollTop = value[dartx.round]();
    }
    get [dartx.scrollWidth]() {
      return this.scrollWidth[dartx.round]();
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.contentEditable]() {
      return this.contentEditable;
    }
    set [dartx.contentEditable](value) {
      this.contentEditable = value;
    }
    get [dartx.contextMenu]() {
      return this.contextMenu;
    }
    set [dartx.contextMenu](value) {
      this.contextMenu = value;
    }
    get [dartx.dir]() {
      return this.dir;
    }
    set [dartx.dir](value) {
      this.dir = value;
    }
    get [dartx.draggable]() {
      return this.draggable;
    }
    set [dartx.draggable](value) {
      this.draggable = value;
    }
    get [dartx.hidden]() {
      return this.hidden;
    }
    set [dartx.hidden](value) {
      this.hidden = value;
    }
    get [dartx.isContentEditable]() {
      return this.isContentEditable;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    set [dartx.lang](value) {
      this.lang = value;
    }
    get [dartx.spellcheck]() {
      return this.spellcheck;
    }
    set [dartx.spellcheck](value) {
      this.spellcheck = value;
    }
    get [dartx.style]() {
      return this.style;
    }
    get [dartx.tabIndex]() {
      return this.tabIndex;
    }
    set [dartx.tabIndex](value) {
      this.tabIndex = value;
    }
    get [dartx.title]() {
      return this.title;
    }
    set [dartx.title](value) {
      this.title = value;
    }
    get [dartx.translate]() {
      return this.translate;
    }
    set [dartx.translate](value) {
      this.translate = value;
    }
    get [dartx.dropzone]() {
      return this.webkitdropzone;
    }
    set [dartx.dropzone](value) {
      this.webkitdropzone = value;
    }
    [dartx.blur](...args) {
      return this.blur.apply(this, args);
    }
    [dartx.click](...args) {
      return this.click.apply(this, args);
    }
    [dartx.focus](...args) {
      return this.focus.apply(this, args);
    }
    get [_attributes$]() {
      return this.attributes;
    }
    get [dartx.className]() {
      return this.className;
    }
    set [dartx.className](value) {
      this.className = value;
    }
    get [dartx.clientHeight]() {
      return this.clientHeight;
    }
    get [dartx.clientLeft]() {
      return this.clientLeft;
    }
    get [dartx.clientTop]() {
      return this.clientTop;
    }
    get [dartx.clientWidth]() {
      return this.clientWidth;
    }
    get [dartx.computedName]() {
      return this.computedName;
    }
    get [dartx.computedRole]() {
      return this.computedRole;
    }
    get [dartx.id]() {
      return this.id;
    }
    set [dartx.id](value) {
      this.id = value;
    }
    get [_innerHtml]() {
      return this.innerHTML;
    }
    set [_innerHtml](value) {
      this.innerHTML = value;
    }
    get [dartx.outerHtml]() {
      return this.outerHTML;
    }
    get [_scrollHeight]() {
      return this.scrollHeight;
    }
    get [_scrollLeft]() {
      return this.scrollLeft;
    }
    set [_scrollLeft](value) {
      this.scrollLeft = value;
    }
    get [_scrollTop]() {
      return this.scrollTop;
    }
    set [_scrollTop](value) {
      this.scrollTop = value;
    }
    get [_scrollWidth]() {
      return this.scrollWidth;
    }
    get [dartx.tagName]() {
      return this.tagName;
    }
    [dartx.closest](...args) {
      return this.closest.apply(this, args);
    }
    [dartx.getAnimations](...args) {
      return this.getAnimations.apply(this, args);
    }
    [dartx.getAttribute](...args) {
      return this.getAttribute.apply(this, args);
    }
    [dartx.getAttributeNS](...args) {
      return this.getAttributeNS.apply(this, args);
    }
    [dartx.getBoundingClientRect](...args) {
      return this.getBoundingClientRect.apply(this, args);
    }
    [dartx.getClientRects](...args) {
      return this.getClientRects.apply(this, args);
    }
    [dartx.getDestinationInsertionPoints](...args) {
      return this.getDestinationInsertionPoints.apply(this, args);
    }
    [dartx.getElementsByClassName](...args) {
      return this.getElementsByClassName.apply(this, args);
    }
    [_getElementsByTagName](...args) {
      return this.getElementsByTagName.apply(this, args);
    }
    [_hasAttribute](...args) {
      return this.hasAttribute.apply(this, args);
    }
    [_hasAttributeNS](...args) {
      return this.hasAttributeNS.apply(this, args);
    }
    [_removeAttribute](...args) {
      return this.removeAttribute.apply(this, args);
    }
    [_removeAttributeNS](...args) {
      return this.removeAttributeNS.apply(this, args);
    }
    [dartx.requestFullscreen](...args) {
      return this.requestFullscreen.apply(this, args);
    }
    [dartx.requestPointerLock](...args) {
      return this.requestPointerLock.apply(this, args);
    }
    [dartx.scroll](options_OR_x, y) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (options_OR_x == null && y == null) {
        this[_scroll_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scroll_2](options_1);
        return;
      }
      if (y != null && typeof options_OR_x == 'number') {
        this[_scroll_3](options_OR_x, y);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scroll_1](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_2](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_3](...args) {
      return this.scroll.apply(this, args);
    }
    [dartx.scrollBy](options_OR_x, y) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (options_OR_x == null && y == null) {
        this[_scrollBy_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollBy_2](options_1);
        return;
      }
      if (y != null && typeof options_OR_x == 'number') {
        this[_scrollBy_3](options_OR_x, y);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollBy_1](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_2](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_3](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollIntoView](...args) {
      return this.scrollIntoView.apply(this, args);
    }
    [_scrollIntoViewIfNeeded](...args) {
      return this.scrollIntoViewIfNeeded.apply(this, args);
    }
    [dartx.scrollTo](options_OR_x, y) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (options_OR_x == null && y == null) {
        this[_scrollTo_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollTo_2](options_1);
        return;
      }
      if (y != null && typeof options_OR_x == 'number') {
        this[_scrollTo_3](options_OR_x, y);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollTo_1](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_2](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_3](...args) {
      return this.scrollTo.apply(this, args);
    }
    [dartx.setAttribute](...args) {
      return this.setAttribute.apply(this, args);
    }
    [dartx.setAttributeNS](...args) {
      return this.setAttributeNS.apply(this, args);
    }
    [dartx.after](...args) {
      return this.after.apply(this, args);
    }
    [dartx.before](...args) {
      return this.before.apply(this, args);
    }
    get [dartx.nextElementSibling]() {
      return this.nextElementSibling;
    }
    get [dartx.previousElementSibling]() {
      return this.previousElementSibling;
    }
    get [_childElementCount]() {
      return this.childElementCount;
    }
    get [_children]() {
      return this.children;
    }
    get [_firstElementChild]() {
      return this.firstElementChild;
    }
    get [_lastElementChild]() {
      return this.lastElementChild;
    }
    [dartx.querySelector](...args) {
      return this.querySelector.apply(this, args);
    }
    [_querySelectorAll](...args) {
      return this.querySelectorAll.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.Element.abortEvent.forElement(this);
    }
    get [dartx.onBeforeCopy]() {
      return html$.Element.beforeCopyEvent.forElement(this);
    }
    get [dartx.onBeforeCut]() {
      return html$.Element.beforeCutEvent.forElement(this);
    }
    get [dartx.onBeforePaste]() {
      return html$.Element.beforePasteEvent.forElement(this);
    }
    get [dartx.onBlur]() {
      return html$.Element.blurEvent.forElement(this);
    }
    get [dartx.onCanPlay]() {
      return html$.Element.canPlayEvent.forElement(this);
    }
    get [dartx.onCanPlayThrough]() {
      return html$.Element.canPlayThroughEvent.forElement(this);
    }
    get [dartx.onChange]() {
      return html$.Element.changeEvent.forElement(this);
    }
    get [dartx.onClick]() {
      return html$.Element.clickEvent.forElement(this);
    }
    get [dartx.onContextMenu]() {
      return html$.Element.contextMenuEvent.forElement(this);
    }
    get [dartx.onCopy]() {
      return html$.Element.copyEvent.forElement(this);
    }
    get [dartx.onCut]() {
      return html$.Element.cutEvent.forElement(this);
    }
    get [dartx.onDoubleClick]() {
      return html$.Element.doubleClickEvent.forElement(this);
    }
    get [dartx.onDrag]() {
      return html$.Element.dragEvent.forElement(this);
    }
    get [dartx.onDragEnd]() {
      return html$.Element.dragEndEvent.forElement(this);
    }
    get [dartx.onDragEnter]() {
      return html$.Element.dragEnterEvent.forElement(this);
    }
    get [dartx.onDragLeave]() {
      return html$.Element.dragLeaveEvent.forElement(this);
    }
    get [dartx.onDragOver]() {
      return html$.Element.dragOverEvent.forElement(this);
    }
    get [dartx.onDragStart]() {
      return html$.Element.dragStartEvent.forElement(this);
    }
    get [dartx.onDrop]() {
      return html$.Element.dropEvent.forElement(this);
    }
    get [dartx.onDurationChange]() {
      return html$.Element.durationChangeEvent.forElement(this);
    }
    get [dartx.onEmptied]() {
      return html$.Element.emptiedEvent.forElement(this);
    }
    get [dartx.onEnded]() {
      return html$.Element.endedEvent.forElement(this);
    }
    get [dartx.onError]() {
      return html$.Element.errorEvent.forElement(this);
    }
    get [dartx.onFocus]() {
      return html$.Element.focusEvent.forElement(this);
    }
    get [dartx.onInput]() {
      return html$.Element.inputEvent.forElement(this);
    }
    get [dartx.onInvalid]() {
      return html$.Element.invalidEvent.forElement(this);
    }
    get [dartx.onKeyDown]() {
      return html$.Element.keyDownEvent.forElement(this);
    }
    get [dartx.onKeyPress]() {
      return html$.Element.keyPressEvent.forElement(this);
    }
    get [dartx.onKeyUp]() {
      return html$.Element.keyUpEvent.forElement(this);
    }
    get [dartx.onLoad]() {
      return html$.Element.loadEvent.forElement(this);
    }
    get [dartx.onLoadedData]() {
      return html$.Element.loadedDataEvent.forElement(this);
    }
    get [dartx.onLoadedMetadata]() {
      return html$.Element.loadedMetadataEvent.forElement(this);
    }
    get [dartx.onMouseDown]() {
      return html$.Element.mouseDownEvent.forElement(this);
    }
    get [dartx.onMouseEnter]() {
      return html$.Element.mouseEnterEvent.forElement(this);
    }
    get [dartx.onMouseLeave]() {
      return html$.Element.mouseLeaveEvent.forElement(this);
    }
    get [dartx.onMouseMove]() {
      return html$.Element.mouseMoveEvent.forElement(this);
    }
    get [dartx.onMouseOut]() {
      return html$.Element.mouseOutEvent.forElement(this);
    }
    get [dartx.onMouseOver]() {
      return html$.Element.mouseOverEvent.forElement(this);
    }
    get [dartx.onMouseUp]() {
      return html$.Element.mouseUpEvent.forElement(this);
    }
    get [dartx.onMouseWheel]() {
      return html$.Element.mouseWheelEvent.forElement(this);
    }
    get [dartx.onPaste]() {
      return html$.Element.pasteEvent.forElement(this);
    }
    get [dartx.onPause]() {
      return html$.Element.pauseEvent.forElement(this);
    }
    get [dartx.onPlay]() {
      return html$.Element.playEvent.forElement(this);
    }
    get [dartx.onPlaying]() {
      return html$.Element.playingEvent.forElement(this);
    }
    get [dartx.onRateChange]() {
      return html$.Element.rateChangeEvent.forElement(this);
    }
    get [dartx.onReset]() {
      return html$.Element.resetEvent.forElement(this);
    }
    get [dartx.onResize]() {
      return html$.Element.resizeEvent.forElement(this);
    }
    get [dartx.onScroll]() {
      return html$.Element.scrollEvent.forElement(this);
    }
    get [dartx.onSearch]() {
      return html$.Element.searchEvent.forElement(this);
    }
    get [dartx.onSeeked]() {
      return html$.Element.seekedEvent.forElement(this);
    }
    get [dartx.onSeeking]() {
      return html$.Element.seekingEvent.forElement(this);
    }
    get [dartx.onSelect]() {
      return html$.Element.selectEvent.forElement(this);
    }
    get [dartx.onSelectStart]() {
      return html$.Element.selectStartEvent.forElement(this);
    }
    get [dartx.onStalled]() {
      return html$.Element.stalledEvent.forElement(this);
    }
    get [dartx.onSubmit]() {
      return html$.Element.submitEvent.forElement(this);
    }
    get [dartx.onSuspend]() {
      return html$.Element.suspendEvent.forElement(this);
    }
    get [dartx.onTimeUpdate]() {
      return html$.Element.timeUpdateEvent.forElement(this);
    }
    get [dartx.onTouchCancel]() {
      return html$.Element.touchCancelEvent.forElement(this);
    }
    get [dartx.onTouchEnd]() {
      return html$.Element.touchEndEvent.forElement(this);
    }
    get [dartx.onTouchEnter]() {
      return html$.Element.touchEnterEvent.forElement(this);
    }
    get [dartx.onTouchLeave]() {
      return html$.Element.touchLeaveEvent.forElement(this);
    }
    get [dartx.onTouchMove]() {
      return html$.Element.touchMoveEvent.forElement(this);
    }
    get [dartx.onTouchStart]() {
      return html$.Element.touchStartEvent.forElement(this);
    }
    get [dartx.onTransitionEnd]() {
      return html$.Element.transitionEndEvent.forElement(this);
    }
    get [dartx.onVolumeChange]() {
      return html$.Element.volumeChangeEvent.forElement(this);
    }
    get [dartx.onWaiting]() {
      return html$.Element.waitingEvent.forElement(this);
    }
    get [dartx.onFullscreenChange]() {
      return html$.Element.fullscreenChangeEvent.forElement(this);
    }
    get [dartx.onFullscreenError]() {
      return html$.Element.fullscreenErrorEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(html$.Element, 'created');
  html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
  dart.setSignature(html$.Element, {
    constructors: () => ({
      html: dart.definiteFunctionType(html$.Element, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      created: dart.definiteFunctionType(html$.Element, []),
      tag: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
      a: dart.definiteFunctionType(html$.Element, []),
      article: dart.definiteFunctionType(html$.Element, []),
      aside: dart.definiteFunctionType(html$.Element, []),
      audio: dart.definiteFunctionType(html$.Element, []),
      br: dart.definiteFunctionType(html$.Element, []),
      canvas: dart.definiteFunctionType(html$.Element, []),
      div: dart.definiteFunctionType(html$.Element, []),
      footer: dart.definiteFunctionType(html$.Element, []),
      header: dart.definiteFunctionType(html$.Element, []),
      hr: dart.definiteFunctionType(html$.Element, []),
      iframe: dart.definiteFunctionType(html$.Element, []),
      img: dart.definiteFunctionType(html$.Element, []),
      li: dart.definiteFunctionType(html$.Element, []),
      nav: dart.definiteFunctionType(html$.Element, []),
      ol: dart.definiteFunctionType(html$.Element, []),
      option: dart.definiteFunctionType(html$.Element, []),
      p: dart.definiteFunctionType(html$.Element, []),
      pre: dart.definiteFunctionType(html$.Element, []),
      section: dart.definiteFunctionType(html$.Element, []),
      select: dart.definiteFunctionType(html$.Element, []),
      span: dart.definiteFunctionType(html$.Element, []),
      svg: dart.definiteFunctionType(html$.Element, []),
      table: dart.definiteFunctionType(html$.Element, []),
      td: dart.definiteFunctionType(html$.Element, []),
      textarea: dart.definiteFunctionType(html$.Element, []),
      th: dart.definiteFunctionType(html$.Element, []),
      tr: dart.definiteFunctionType(html$.Element, []),
      ul: dart.definiteFunctionType(html$.Element, []),
      video: dart.definiteFunctionType(html$.Element, []),
      _: dart.definiteFunctionType(html$.Element, [])
    }),
    fields: () => ({
      [_xtag]: html$.Element,
      [dartx.offsetParent]: html$.Element,
      [dartx.contentEditable]: core.String,
      [dartx.contextMenu]: html$.MenuElement,
      [dartx.dir]: core.String,
      [dartx.draggable]: core.bool,
      [dartx.hidden]: core.bool,
      [dartx.lang]: core.String,
      [dartx.spellcheck]: core.bool,
      [dartx.style]: html$.CssStyleDeclaration,
      [dartx.tabIndex]: core.int,
      [dartx.title]: core.String,
      [dartx.translate]: core.bool,
      [dartx.dropzone]: core.String,
      [_attributes$]: html$._NamedNodeMap,
      [dartx.className]: core.String,
      [dartx.clientHeight]: core.int,
      [dartx.clientLeft]: core.int,
      [dartx.clientTop]: core.int,
      [dartx.clientWidth]: core.int,
      [dartx.computedName]: core.String,
      [dartx.computedRole]: core.String,
      [dartx.id]: core.String,
      [_innerHtml]: core.String,
      [_scrollHeight]: core.int,
      [_scrollLeft]: core.num,
      [_scrollTop]: core.num,
      [_scrollWidth]: core.int,
      [dartx.tagName]: core.String,
      [dartx.nextElementSibling]: html$.Element,
      [dartx.previousElementSibling]: html$.Element,
      [_childElementCount]: core.int,
      [_children]: ListOfNode(),
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    }),
    getters: () => ({
      [dartx.attributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
      [dartx.classes]: dart.definiteFunctionType(html$.CssClassSet, []),
      [dartx.dataset]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      [dartx.client]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.offset]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.xtag]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.localName]: dart.definiteFunctionType(core.String, []),
      [dartx.namespaceUri]: dart.definiteFunctionType(core.String, []),
      [dartx.shadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
      [dartx.contentEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.paddingEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.borderEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.marginEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.documentOffset]: dart.definiteFunctionType(math.Point$(core.num), []),
      [_canBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
      [_cannotBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
      [dartx.innerHtml]: dart.definiteFunctionType(core.String, []),
      [dartx.on]: dart.definiteFunctionType(html$.ElementEvents, []),
      [dartx.offsetHeight]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetLeft]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetTop]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetWidth]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollHeight]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollLeft]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollTop]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollWidth]: dart.definiteFunctionType(core.int, []),
      [dartx.isContentEditable]: dart.definiteFunctionType(core.bool, []),
      [dartx.outerHtml]: dart.definiteFunctionType(core.String, []),
      [dartx.onAbort]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBeforeCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBeforeCut]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBeforePaste]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBlur]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onCanPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onCanPlayThrough]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onClick]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onContextMenu]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      [dartx.onCut]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      [dartx.onDoubleClick]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onDrag]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragStart]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDrop]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDurationChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onEmptied]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onFocus]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onInput]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onInvalid]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onKeyDown]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      [dartx.onKeyPress]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      [dartx.onKeyUp]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onLoadedData]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onLoadedMetadata]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onMouseDown]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseMove]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseOut]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseUp]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseWheel]: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
      [dartx.onPaste]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      [dartx.onPause]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onPlaying]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onRateChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onReset]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onResize]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onScroll]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSearch]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSeeked]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSeeking]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSelect]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSelectStart]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onStalled]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSubmit]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSuspend]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onTimeUpdate]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onTouchCancel]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchMove]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchStart]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTransitionEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
      [dartx.onVolumeChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onWaiting]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onFullscreenChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onFullscreenError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
    }),
    setters: () => ({
      [dartx.attributes]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
      [dartx.classes]: dart.definiteFunctionType(dart.void, [IterableOfString()]),
      [dartx.dataset]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      [dartx.xtag]: dart.definiteFunctionType(dart.void, [html$.Element]),
      [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.scrollLeft]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.scrollTop]: dart.definiteFunctionType(dart.void, [core.int])
    }),
    methods: () => ({
      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.getNamespacedAttributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String]),
      [dartx.getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [], [core.String]),
      [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.attached]: dart.definiteFunctionType(dart.void, []),
      [dartx.detached]: dart.definiteFunctionType(dart.void, []),
      [dartx.enteredView]: dart.definiteFunctionType(dart.void, []),
      [dartx.leftView]: dart.definiteFunctionType(dart.void, []),
      [dartx.animate]: dart.definiteFunctionType(html$.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
      [_animate]: dart.definiteFunctionType(html$.Animation, [core.Object], [dart.dynamic]),
      [dartx.attributeChanged]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html$.ScrollAlignment]),
      [dartx.insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [_insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [_insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.insertAdjacentElement]: dart.definiteFunctionType(html$.Element, [core.String, html$.Element]),
      [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html$.Element]),
      [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html$.Node]),
      [dartx.matches]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.matchesWithAncestors]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.createShadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
      [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html$.Element]),
      [dartx.createFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.blur]: dart.definiteFunctionType(dart.void, []),
      [dartx.click]: dart.definiteFunctionType(dart.void, []),
      [dartx.focus]: dart.definiteFunctionType(dart.void, []),
      [dartx.closest]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
      [dartx.getAttribute]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.getAttributeNS]: dart.definiteFunctionType(core.String, [core.String, core.String]),
      [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
      [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
      [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [_hasAttribute]: dart.definiteFunctionType(core.bool, [core.String]),
      [_hasAttributeNS]: dart.definiteFunctionType(core.bool, [core.String, core.String]),
      [_removeAttribute]: dart.definiteFunctionType(dart.void, [core.String]),
      [_removeAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.requestFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.requestPointerLock]: dart.definiteFunctionType(dart.void, []),
      [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
      [_scroll_1]: dart.definiteFunctionType(dart.void, []),
      [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
      [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
      [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
      [_scrollIntoView]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [_scrollIntoViewIfNeeded]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
      [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
      [dartx.setAttribute]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.setAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
      [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object]),
      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
    }),
    sfields: () => ({
      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
      transitionEndEvent: EventStreamProviderOfTransitionEvent(),
      _parseDocument: html$.HtmlDocument,
      _parseRange: html$.Range,
      _defaultValidator: html$.NodeValidatorBuilder,
      _defaultSanitizer: html$._ValidatingTreeSanitizer,
      _tagsForWhichCreateContextualFragmentIsNotSupported: ListOfString(),
      abortEvent: EventStreamProviderOfEvent(),
      beforeCopyEvent: EventStreamProviderOfEvent(),
      beforeCutEvent: EventStreamProviderOfEvent(),
      beforePasteEvent: EventStreamProviderOfEvent(),
      blurEvent: EventStreamProviderOfEvent(),
      canPlayEvent: EventStreamProviderOfEvent(),
      canPlayThroughEvent: EventStreamProviderOfEvent(),
      changeEvent: EventStreamProviderOfEvent(),
      clickEvent: EventStreamProviderOfMouseEvent(),
      contextMenuEvent: EventStreamProviderOfMouseEvent(),
      copyEvent: EventStreamProviderOfClipboardEvent(),
      cutEvent: EventStreamProviderOfClipboardEvent(),
      doubleClickEvent: EventStreamProviderOfEvent(),
      dragEvent: EventStreamProviderOfMouseEvent(),
      dragEndEvent: EventStreamProviderOfMouseEvent(),
      dragEnterEvent: EventStreamProviderOfMouseEvent(),
      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
      dragOverEvent: EventStreamProviderOfMouseEvent(),
      dragStartEvent: EventStreamProviderOfMouseEvent(),
      dropEvent: EventStreamProviderOfMouseEvent(),
      durationChangeEvent: EventStreamProviderOfEvent(),
      emptiedEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      inputEvent: EventStreamProviderOfEvent(),
      invalidEvent: EventStreamProviderOfEvent(),
      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      loadedDataEvent: EventStreamProviderOfEvent(),
      loadedMetadataEvent: EventStreamProviderOfEvent(),
      mouseDownEvent: EventStreamProviderOfMouseEvent(),
      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
      mouseOutEvent: EventStreamProviderOfMouseEvent(),
      mouseOverEvent: EventStreamProviderOfMouseEvent(),
      mouseUpEvent: EventStreamProviderOfMouseEvent(),
      pasteEvent: EventStreamProviderOfClipboardEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      playEvent: EventStreamProviderOfEvent(),
      playingEvent: EventStreamProviderOfEvent(),
      rateChangeEvent: EventStreamProviderOfEvent(),
      resetEvent: EventStreamProviderOfEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      searchEvent: EventStreamProviderOfEvent(),
      seekedEvent: EventStreamProviderOfEvent(),
      seekingEvent: EventStreamProviderOfEvent(),
      selectEvent: EventStreamProviderOfEvent(),
      selectStartEvent: EventStreamProviderOfEvent(),
      stalledEvent: EventStreamProviderOfEvent(),
      submitEvent: EventStreamProviderOfEvent(),
      suspendEvent: EventStreamProviderOfEvent(),
      timeUpdateEvent: EventStreamProviderOfEvent(),
      touchCancelEvent: EventStreamProviderOfTouchEvent(),
      touchEndEvent: EventStreamProviderOfTouchEvent(),
      touchEnterEvent: EventStreamProviderOfTouchEvent(),
      touchLeaveEvent: EventStreamProviderOfTouchEvent(),
      touchMoveEvent: EventStreamProviderOfTouchEvent(),
      touchStartEvent: EventStreamProviderOfTouchEvent(),
      volumeChangeEvent: EventStreamProviderOfEvent(),
      waitingEvent: EventStreamProviderOfEvent(),
      fullscreenChangeEvent: EventStreamProviderOfEvent(),
      fullscreenErrorEvent: EventStreamProviderOfEvent()
    }),
    statics: () => ({
      isTagSupported: dart.definiteFunctionType(core.bool, [core.String]),
      _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
      _determineTransitionEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
      _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html$.Element, html$.Element]),
      _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html$.Element]),
      _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html$.Element]),
      _safeTagName: dart.definiteFunctionType(core.String, [dart.dynamic])
    }),
    names: ['isTagSupported', '_determineMouseWheelEventType', '_determineTransitionEventType', '_offsetToHelper', '_hasCorruptedAttributes', '_hasCorruptedAttributesAdditionalCheck', '_safeTagName']
  });
  html$.Element._parseDocument = null;
  html$.Element._parseRange = null;
  html$.Element._defaultValidator = null;
  html$.Element._defaultSanitizer = null;
  html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
  dart.defineLazy(html$.Element, {
    get mouseWheelEvent() {
      return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html$.Element._determineMouseWheelEventType));
    },
    get transitionEndEvent() {
      return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html$.Element._determineTransitionEventType));
    },
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get beforeCopyEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('beforecopy'));
    },
    get beforeCutEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('beforecut'));
    },
    get beforePasteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('beforepaste'));
    },
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get canPlayEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
    },
    get canPlayThroughEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    },
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
    },
    get contextMenuEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
    },
    get copyEvent() {
      return dart.const(new (EventStreamProviderOfClipboardEvent())('copy'));
    },
    get cutEvent() {
      return dart.const(new (EventStreamProviderOfClipboardEvent())('cut'));
    },
    get doubleClickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
    },
    get dragEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
    },
    get dragEndEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
    },
    get dragEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
    },
    get dragLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
    },
    get dragOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
    },
    get dragStartEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
    },
    get dropEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
    },
    get durationChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
    },
    get emptiedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get inputEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('input'));
    },
    get invalidEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
    },
    get keyDownEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
    },
    get keyPressEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
    },
    get keyUpEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get loadedDataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
    },
    get loadedMetadataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
    },
    get mouseDownEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
    },
    get mouseEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
    },
    get mouseLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
    },
    get mouseMoveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
    },
    get mouseOutEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
    },
    get mouseOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
    },
    get mouseUpEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
    },
    get pasteEvent() {
      return dart.const(new (EventStreamProviderOfClipboardEvent())('paste'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get playEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('play'));
    },
    get playingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('playing'));
    },
    get rateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
    },
    get resetEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('reset'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get searchEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('search'));
    },
    get seekedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
    },
    get seekingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
    },
    get selectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('select'));
    },
    get selectStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('selectstart'));
    },
    get stalledEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
    },
    get submitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('submit'));
    },
    get suspendEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
    },
    get timeUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
    },
    get touchCancelEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchcancel'));
    },
    get touchEndEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchend'));
    },
    get touchEnterEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchenter'));
    },
    get touchLeaveEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchleave'));
    },
    get touchMoveEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchmove'));
    },
    get touchStartEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchstart'));
    },
    get volumeChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
    },
    get waitingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
    },
    get fullscreenChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenchange'));
    },
    get fullscreenErrorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenerror'));
    }
  });
  dart.registerExtension(dart.global.Element, html$.Element);
  html$.HtmlElement = class HtmlElement extends html$.Element {
    static new() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HtmlElement, 'created');
  dart.setSignature(html$.HtmlElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.HtmlElement, []),
      created: dart.definiteFunctionType(html$.HtmlElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLElement, html$.HtmlElement);
  html$._EntryArray = class _EntryArray extends core.Object {};
  html$._EntryArray[dart.implements] = () => [ListOfEntry()];
  dart.registerExtension(dart.global.EntryArray, html$._EntryArray);
  html$.spawnDomUri = function(uri, args, message) {
    dart.throw(new core.UnimplementedError());
  };
  dart.fn(html$.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
  html$.createCustomUpgrader = function(customElementClass, $this) {
    return $this;
  };
  dart.fn(html$.createCustomUpgrader, TypeAnddynamicTodynamic());
  dart.defineExtensionNames([
    'onError'
  ]);
  html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onError() {
      return html$.AbstractWorker.errorEvent.forTarget(this);
    }
  };
  html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
  dart.setSignature(html$.AbstractWorker, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AbstractWorker, [])}),
    getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({errorEvent: EventStreamProviderOfEvent()})
  });
  dart.defineExtensionMembers(html$.AbstractWorker, ['onError']);
  dart.defineLazy(html$.AbstractWorker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.defineExtensionNames([
    'toString',
    'download',
    'hreflang',
    'rel',
    'target',
    'type',
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(opts) {
      let href = opts && 'href' in opts ? opts.href : null;
      let e = html$.AnchorElement._check(html$.document[dartx.createElement]("a"));
      if (href != null) e[dartx.href] = href;
      return e;
    }
    created() {
      this[dartx.download] = null;
      this[dartx.hreflang] = null;
      this[dartx.rel] = null;
      this[dartx.target] = null;
      this[dartx.type] = null;
      this[dartx.hash] = null;
      this[dartx.host] = null;
      this[dartx.hostname] = null;
      this[dartx.href] = null;
      this[dartx.origin] = null;
      this[dartx.password] = null;
      this[dartx.pathname] = null;
      this[dartx.port] = null;
      this[dartx.protocol] = null;
      this[dartx.search] = null;
      this[dartx.username] = null;
      super.created();
    }
    get [dartx.download]() {
      return this.download;
    }
    set [dartx.download](value) {
      this.download = value;
    }
    get [dartx.hreflang]() {
      return this.hreflang;
    }
    set [dartx.hreflang](value) {
      this.hreflang = value;
    }
    get [dartx.rel]() {
      return this.rel;
    }
    set [dartx.rel](value) {
      this.rel = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.password]() {
      return this.password;
    }
    set [dartx.password](value) {
      this.password = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    get [dartx.username]() {
      return this.username;
    }
    set [dartx.username](value) {
      this.username = value;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  dart.defineNamedConstructor(html$.AnchorElement, 'created');
  html$.AnchorElement[dart.implements] = () => [html$.UrlUtils];
  dart.setSignature(html$.AnchorElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AnchorElement, []),
      new: dart.definiteFunctionType(html$.AnchorElement, [], {href: core.String}),
      created: dart.definiteFunctionType(html$.AnchorElement, [])
    }),
    fields: () => ({
      [dartx.download]: core.String,
      [dartx.hreflang]: core.String,
      [dartx.rel]: core.String,
      [dartx.target]: core.String,
      [dartx.type]: core.String,
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.origin]: core.String,
      [dartx.password]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String,
      [dartx.username]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLAnchorElement, html$.AnchorElement);
  dart.defineExtensionNames([
    'cancel',
    'finish',
    'pause',
    'play',
    'reverse',
    'currentTime',
    'effect',
    'endClip',
    'finished',
    'playState',
    'playbackRate',
    'ready',
    'startClip',
    'startTime'
  ]);
  html$.Animation = class Animation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!document.body.animate;
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.effect]() {
      return this.effect;
    }
    set [dartx.effect](value) {
      this.effect = value;
    }
    get [dartx.endClip]() {
      return this.endClip;
    }
    set [dartx.endClip](value) {
      this.endClip = value;
    }
    get [dartx.finished]() {
      return this.finished;
    }
    get [dartx.playState]() {
      return this.playState;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    get [dartx.ready]() {
      return this.ready;
    }
    get [dartx.startClip]() {
      return this.startClip;
    }
    set [dartx.startClip](value) {
      this.startClip = value;
    }
    get [dartx.startTime]() {
      return this.startTime;
    }
    set [dartx.startTime](value) {
      this.startTime = value;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.finish](...args) {
      return this.finish.apply(this, args);
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
    [dartx.reverse](...args) {
      return this.reverse.apply(this, args);
    }
  };
  dart.setSignature(html$.Animation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Animation, [])}),
    fields: () => ({
      [dartx.currentTime]: core.num,
      [dartx.effect]: html$.AnimationEffectReadOnly,
      [dartx.endClip]: core.num,
      [dartx.finished]: async.Future,
      [dartx.playState]: core.String,
      [dartx.playbackRate]: core.num,
      [dartx.ready]: async.Future,
      [dartx.startClip]: core.num,
      [dartx.startTime]: core.num
    }),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
      [dartx.finish]: dart.definiteFunctionType(dart.void, []),
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.play]: dart.definiteFunctionType(dart.void, []),
      [dartx.reverse]: dart.definiteFunctionType(dart.void, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.Animation, html$.Animation);
  const _get_computedTiming = Symbol('_get_computedTiming');
  dart.defineExtensionNames([
    'computedTiming',
    'timing'
  ]);
  html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.computedTiming]() {
      return html_common.convertNativeToDart_Dictionary(this[_get_computedTiming]);
    }
    get [_get_computedTiming]() {
      return this.computedTiming;
    }
    get [dartx.timing]() {
      return this.timing;
    }
  };
  dart.setSignature(html$.AnimationEffectReadOnly, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectReadOnly, [])}),
    fields: () => ({
      [_get_computedTiming]: dart.dynamic,
      [dartx.timing]: html$.AnimationEffectTiming
    }),
    getters: () => ({[dartx.computedTiming]: dart.definiteFunctionType(core.Map, [])})
  });
  dart.registerExtension(dart.global.AnimationEffectReadOnly, html$.AnimationEffectReadOnly);
  dart.defineExtensionNames([
    'delay',
    'direction',
    'duration',
    'easing',
    'endDelay',
    'fill',
    'iterationStart',
    'iterations',
    'playbackRate'
  ]);
  html$.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.delay]() {
      return this.delay;
    }
    set [dartx.delay](value) {
      this.delay = value;
    }
    get [dartx.direction]() {
      return this.direction;
    }
    set [dartx.direction](value) {
      this.direction = value;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    set [dartx.duration](value) {
      this.duration = value;
    }
    get [dartx.easing]() {
      return this.easing;
    }
    set [dartx.easing](value) {
      this.easing = value;
    }
    get [dartx.endDelay]() {
      return this.endDelay;
    }
    set [dartx.endDelay](value) {
      this.endDelay = value;
    }
    get [dartx.fill]() {
      return this.fill;
    }
    set [dartx.fill](value) {
      this.fill = value;
    }
    get [dartx.iterationStart]() {
      return this.iterationStart;
    }
    set [dartx.iterationStart](value) {
      this.iterationStart = value;
    }
    get [dartx.iterations]() {
      return this.iterations;
    }
    set [dartx.iterations](value) {
      this.iterations = value;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
  };
  dart.setSignature(html$.AnimationEffectTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectTiming, [])}),
    fields: () => ({
      [dartx.delay]: core.num,
      [dartx.direction]: core.String,
      [dartx.duration]: core.Object,
      [dartx.easing]: core.String,
      [dartx.endDelay]: core.num,
      [dartx.fill]: core.String,
      [dartx.iterationStart]: core.num,
      [dartx.iterations]: core.num,
      [dartx.playbackRate]: core.num
    })
  });
  dart.registerExtension(dart.global.AnimationEffectTiming, html$.AnimationEffectTiming);
  dart.defineExtensionNames([
    'animationName',
    'elapsedTime'
  ]);
  html$.AnimationEvent = class AnimationEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.AnimationEvent._create_1(type, eventInitDict_1);
      }
      return html$.AnimationEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new AnimationEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new AnimationEvent(type);
    }
    get [dartx.animationName]() {
      return this.animationName;
    }
    get [dartx.elapsedTime]() {
      return this.elapsedTime;
    }
  };
  dart.setSignature(html$.AnimationEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AnimationEvent, []),
      new: dart.definiteFunctionType(html$.AnimationEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.animationName]: core.String,
      [dartx.elapsedTime]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.AnimationEvent, html$.AnimationEvent);
  dart.defineExtensionNames([
    'currentTime',
    'timelineTime'
  ]);
  html$.AnimationPlayerEvent = class AnimationPlayerEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.AnimationPlayerEvent._create_1(type, eventInitDict_1);
      }
      return html$.AnimationPlayerEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new AnimationPlayerEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new AnimationPlayerEvent(type);
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    get [dartx.timelineTime]() {
      return this.timelineTime;
    }
  };
  dart.setSignature(html$.AnimationPlayerEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AnimationPlayerEvent, []),
      new: dart.definiteFunctionType(html$.AnimationPlayerEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.currentTime]: core.double,
      [dartx.timelineTime]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.AnimationPlayerEvent, html$.AnimationPlayerEvent);
  dart.defineExtensionNames([
    'getAnimations',
    'play',
    'currentTime',
    'playbackRate'
  ]);
  html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    [dartx.getAnimations](...args) {
      return this.getAnimations.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
  };
  dart.setSignature(html$.AnimationTimeline, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationTimeline, [])}),
    fields: () => ({
      [dartx.currentTime]: core.num,
      [dartx.playbackRate]: core.num
    }),
    methods: () => ({
      [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
      [dartx.play]: dart.definiteFunctionType(html$.Animation, [html$.AnimationEffectReadOnly])
    })
  });
  dart.registerExtension(dart.global.AnimationTimeline, html$.AnimationTimeline);
  dart.defineExtensionNames([
    'outcome',
    'platform'
  ]);
  html$.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.outcome]() {
      return this.outcome;
    }
    get [dartx.platform]() {
      return this.platform;
    }
  };
  dart.setSignature(html$.AppBannerPromptResult, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AppBannerPromptResult, [])}),
    fields: () => ({
      [dartx.outcome]: core.String,
      [dartx.platform]: core.String
    })
  });
  dart.registerExtension(dart.global.AppBannerPromptResult, html$.AppBannerPromptResult);
  dart.defineExtensionNames([
    'abort',
    'swapCache',
    'update',
    'onCached',
    'onChecking',
    'onDownloading',
    'onError',
    'onNoUpdate',
    'onObsolete',
    'onProgress',
    'onUpdateReady',
    'status'
  ]);
  html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.applicationCache;
    }
    get [dartx.status]() {
      return this.status;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.swapCache](...args) {
      return this.swapCache.apply(this, args);
    }
    [dartx.update](...args) {
      return this.update.apply(this, args);
    }
    get [dartx.onCached]() {
      return html$.ApplicationCache.cachedEvent.forTarget(this);
    }
    get [dartx.onChecking]() {
      return html$.ApplicationCache.checkingEvent.forTarget(this);
    }
    get [dartx.onDownloading]() {
      return html$.ApplicationCache.downloadingEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.ApplicationCache.errorEvent.forTarget(this);
    }
    get [dartx.onNoUpdate]() {
      return html$.ApplicationCache.noUpdateEvent.forTarget(this);
    }
    get [dartx.onObsolete]() {
      return html$.ApplicationCache.obsoleteEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.ApplicationCache.progressEvent.forTarget(this);
    }
    get [dartx.onUpdateReady]() {
      return html$.ApplicationCache.updateReadyEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ApplicationCache, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ApplicationCache, [])}),
    fields: () => ({[dartx.status]: core.int}),
    getters: () => ({
      [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.swapCache]: dart.definiteFunctionType(dart.void, []),
      [dartx.update]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      cachedEvent: EventStreamProviderOfEvent(),
      checkingEvent: EventStreamProviderOfEvent(),
      downloadingEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      noUpdateEvent: EventStreamProviderOfEvent(),
      obsoleteEvent: EventStreamProviderOfEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      updateReadyEvent: EventStreamProviderOfEvent(),
      CHECKING: core.int,
      DOWNLOADING: core.int,
      IDLE: core.int,
      OBSOLETE: core.int,
      UNCACHED: core.int,
      UPDATEREADY: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  html$.ApplicationCache.CHECKING = 2;
  html$.ApplicationCache.DOWNLOADING = 3;
  html$.ApplicationCache.IDLE = 1;
  html$.ApplicationCache.OBSOLETE = 5;
  html$.ApplicationCache.UNCACHED = 0;
  html$.ApplicationCache.UPDATEREADY = 4;
  dart.defineLazy(html$.ApplicationCache, {
    get cachedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('cached'));
    },
    get checkingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('checking'));
    },
    get downloadingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('downloading'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get noUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('noupdate'));
    },
    get obsoleteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('obsolete'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    },
    get updateReadyEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('updateready'));
    }
  });
  dart.registerExtension(dart.global.ApplicationCache, html$.ApplicationCache);
  dart.registerExtension(dart.global.DOMApplicationCache, html$.ApplicationCache);
  dart.registerExtension(dart.global.OfflineResourceList, html$.ApplicationCache);
  dart.defineExtensionNames([
    'message',
    'reason',
    'status',
    'url'
  ]);
  html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
      }
      return html$.ApplicationCacheErrorEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ApplicationCacheErrorEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ApplicationCacheErrorEvent(type);
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.reason]() {
      return this.reason;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.url]() {
      return this.url;
    }
  };
  dart.setSignature(html$.ApplicationCacheErrorEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, []),
      new: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.message]: core.String,
      [dartx.reason]: core.String,
      [dartx.status]: core.int,
      [dartx.url]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html$.ApplicationCacheErrorEvent);
  dart.defineExtensionNames([
    'toString',
    'alt',
    'coords',
    'shape',
    'target',
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.AreaElement = class AreaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.AreaElement._check(html$.document[dartx.createElement]("area"));
    }
    created() {
      this[dartx.alt] = null;
      this[dartx.coords] = null;
      this[dartx.shape] = null;
      this[dartx.target] = null;
      this[dartx.hash] = null;
      this[dartx.host] = null;
      this[dartx.hostname] = null;
      this[dartx.href] = null;
      this[dartx.origin] = null;
      this[dartx.password] = null;
      this[dartx.pathname] = null;
      this[dartx.port] = null;
      this[dartx.protocol] = null;
      this[dartx.search] = null;
      this[dartx.username] = null;
      super.created();
    }
    get [dartx.alt]() {
      return this.alt;
    }
    set [dartx.alt](value) {
      this.alt = value;
    }
    get [dartx.coords]() {
      return this.coords;
    }
    set [dartx.coords](value) {
      this.coords = value;
    }
    get [dartx.shape]() {
      return this.shape;
    }
    set [dartx.shape](value) {
      this.shape = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.password]() {
      return this.password;
    }
    set [dartx.password](value) {
      this.password = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    get [dartx.username]() {
      return this.username;
    }
    set [dartx.username](value) {
      this.username = value;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  dart.defineNamedConstructor(html$.AreaElement, 'created');
  html$.AreaElement[dart.implements] = () => [html$.UrlUtils];
  dart.setSignature(html$.AreaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AreaElement, []),
      new: dart.definiteFunctionType(html$.AreaElement, []),
      created: dart.definiteFunctionType(html$.AreaElement, [])
    }),
    fields: () => ({
      [dartx.alt]: core.String,
      [dartx.coords]: core.String,
      [dartx.shape]: core.String,
      [dartx.target]: core.String,
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.origin]: core.String,
      [dartx.password]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String,
      [dartx.username]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLAreaElement, html$.AreaElement);
  dart.defineExtensionNames([
    'addTextTrack',
    'canPlayType',
    'load',
    'pause',
    'play',
    'setMediaKeys',
    'setSinkId',
    'addKey',
    'cancelKeyRequest',
    'generateKeyRequest',
    'onKeyAdded',
    'onKeyError',
    'onKeyMessage',
    'onNeedKey',
    'audioTracks',
    'autoplay',
    'buffered',
    'controller',
    'controls',
    'crossOrigin',
    'currentSrc',
    'currentTime',
    'defaultMuted',
    'defaultPlaybackRate',
    'duration',
    'ended',
    'error',
    'loop',
    'mediaGroup',
    'mediaKeys',
    'muted',
    'networkState',
    'paused',
    'playbackRate',
    'played',
    'preload',
    'readyState',
    'seekable',
    'seeking',
    'session',
    'sinkId',
    'src',
    'textTracks',
    'videoTracks',
    'volume',
    'audioDecodedByteCount',
    'videoDecodedByteCount'
  ]);
  html$.MediaElement = class MediaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.audioTracks] = null;
      this[dartx.autoplay] = null;
      this[dartx.buffered] = null;
      this[dartx.controller] = null;
      this[dartx.controls] = null;
      this[dartx.crossOrigin] = null;
      this[dartx.currentSrc] = null;
      this[dartx.currentTime] = null;
      this[dartx.defaultMuted] = null;
      this[dartx.defaultPlaybackRate] = null;
      this[dartx.duration] = null;
      this[dartx.ended] = null;
      this[dartx.error] = null;
      this[dartx.loop] = null;
      this[dartx.mediaGroup] = null;
      this[dartx.mediaKeys] = null;
      this[dartx.muted] = null;
      this[dartx.networkState] = null;
      this[dartx.paused] = null;
      this[dartx.playbackRate] = null;
      this[dartx.played] = null;
      this[dartx.preload] = null;
      this[dartx.readyState] = null;
      this[dartx.seekable] = null;
      this[dartx.seeking] = null;
      this[dartx.session] = null;
      this[dartx.sinkId] = null;
      this[dartx.src] = null;
      this[dartx.textTracks] = null;
      this[dartx.videoTracks] = null;
      this[dartx.volume] = null;
      this[dartx.audioDecodedByteCount] = null;
      this[dartx.videoDecodedByteCount] = null;
      super.created();
    }
    get [dartx.audioTracks]() {
      return this.audioTracks;
    }
    get [dartx.autoplay]() {
      return this.autoplay;
    }
    set [dartx.autoplay](value) {
      this.autoplay = value;
    }
    get [dartx.buffered]() {
      return this.buffered;
    }
    get [dartx.controller]() {
      return this.controller;
    }
    set [dartx.controller](value) {
      this.controller = value;
    }
    get [dartx.controls]() {
      return this.controls;
    }
    set [dartx.controls](value) {
      this.controls = value;
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.currentSrc]() {
      return this.currentSrc;
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.defaultMuted]() {
      return this.defaultMuted;
    }
    set [dartx.defaultMuted](value) {
      this.defaultMuted = value;
    }
    get [dartx.defaultPlaybackRate]() {
      return this.defaultPlaybackRate;
    }
    set [dartx.defaultPlaybackRate](value) {
      this.defaultPlaybackRate = value;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.ended]() {
      return this.ended;
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.loop]() {
      return this.loop;
    }
    set [dartx.loop](value) {
      this.loop = value;
    }
    get [dartx.mediaGroup]() {
      return this.mediaGroup;
    }
    set [dartx.mediaGroup](value) {
      this.mediaGroup = value;
    }
    get [dartx.mediaKeys]() {
      return this.mediaKeys;
    }
    get [dartx.muted]() {
      return this.muted;
    }
    set [dartx.muted](value) {
      this.muted = value;
    }
    get [dartx.networkState]() {
      return this.networkState;
    }
    get [dartx.paused]() {
      return this.paused;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    get [dartx.played]() {
      return this.played;
    }
    get [dartx.preload]() {
      return this.preload;
    }
    set [dartx.preload](value) {
      this.preload = value;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.seekable]() {
      return this.seekable;
    }
    get [dartx.seeking]() {
      return this.seeking;
    }
    get [dartx.session]() {
      return this.session;
    }
    set [dartx.session](value) {
      this.session = value;
    }
    get [dartx.sinkId]() {
      return this.sinkId;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.textTracks]() {
      return this.textTracks;
    }
    get [dartx.videoTracks]() {
      return this.videoTracks;
    }
    get [dartx.volume]() {
      return this.volume;
    }
    set [dartx.volume](value) {
      this.volume = value;
    }
    get [dartx.audioDecodedByteCount]() {
      return this.webkitAudioDecodedByteCount;
    }
    get [dartx.videoDecodedByteCount]() {
      return this.webkitVideoDecodedByteCount;
    }
    [dartx.addTextTrack](...args) {
      return this.addTextTrack.apply(this, args);
    }
    [dartx.canPlayType](...args) {
      return this.canPlayType.apply(this, args);
    }
    [dartx.load](...args) {
      return this.load.apply(this, args);
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
    [dartx.setMediaKeys](...args) {
      return this.setMediaKeys.apply(this, args);
    }
    [dartx.setSinkId](...args) {
      return this.setSinkId.apply(this, args);
    }
    [dartx.addKey](...args) {
      return this.webkitAddKey.apply(this, args);
    }
    [dartx.cancelKeyRequest](...args) {
      return this.webkitCancelKeyRequest.apply(this, args);
    }
    [dartx.generateKeyRequest](...args) {
      return this.webkitGenerateKeyRequest.apply(this, args);
    }
    get [dartx.onKeyAdded]() {
      return html$.MediaElement.keyAddedEvent.forElement(this);
    }
    get [dartx.onKeyError]() {
      return html$.MediaElement.keyErrorEvent.forElement(this);
    }
    get [dartx.onKeyMessage]() {
      return html$.MediaElement.keyMessageEvent.forElement(this);
    }
    get [dartx.onNeedKey]() {
      return html$.MediaElement.needKeyEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(html$.MediaElement, 'created');
  dart.setSignature(html$.MediaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaElement, []),
      created: dart.definiteFunctionType(html$.MediaElement, [])
    }),
    fields: () => ({
      [dartx.audioTracks]: html$.AudioTrackList,
      [dartx.autoplay]: core.bool,
      [dartx.buffered]: html$.TimeRanges,
      [dartx.controller]: html$.MediaController,
      [dartx.controls]: core.bool,
      [dartx.crossOrigin]: core.String,
      [dartx.currentSrc]: core.String,
      [dartx.currentTime]: core.num,
      [dartx.defaultMuted]: core.bool,
      [dartx.defaultPlaybackRate]: core.num,
      [dartx.duration]: core.double,
      [dartx.ended]: core.bool,
      [dartx.error]: html$.MediaError,
      [dartx.loop]: core.bool,
      [dartx.mediaGroup]: core.String,
      [dartx.mediaKeys]: html$.MediaKeys,
      [dartx.muted]: core.bool,
      [dartx.networkState]: core.int,
      [dartx.paused]: core.bool,
      [dartx.playbackRate]: core.num,
      [dartx.played]: html$.TimeRanges,
      [dartx.preload]: core.String,
      [dartx.readyState]: core.int,
      [dartx.seekable]: html$.TimeRanges,
      [dartx.seeking]: core.bool,
      [dartx.session]: html$.MediaSession,
      [dartx.sinkId]: core.String,
      [dartx.src]: core.String,
      [dartx.textTracks]: html$.TextTrackList,
      [dartx.videoTracks]: html$.VideoTrackList,
      [dartx.volume]: core.num,
      [dartx.audioDecodedByteCount]: core.int,
      [dartx.videoDecodedByteCount]: core.int
    }),
    getters: () => ({
      [dartx.onKeyAdded]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
      [dartx.onKeyError]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
      [dartx.onKeyMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
      [dartx.onNeedKey]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), [])
    }),
    methods: () => ({
      [dartx.addTextTrack]: dart.definiteFunctionType(html$.TextTrack, [core.String], [core.String, core.String]),
      [dartx.canPlayType]: dart.definiteFunctionType(core.String, [core.String], [core.String]),
      [dartx.load]: dart.definiteFunctionType(dart.void, []),
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.play]: dart.definiteFunctionType(dart.void, []),
      [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html$.MediaKeys]),
      [dartx.setSinkId]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.addKey]: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List], [typed_data.Uint8List, core.String]),
      [dartx.cancelKeyRequest]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.generateKeyRequest]: dart.definiteFunctionType(dart.void, [core.String], [typed_data.Uint8List])
    }),
    sfields: () => ({
      keyAddedEvent: EventStreamProviderOfMediaKeyEvent(),
      keyErrorEvent: EventStreamProviderOfMediaKeyEvent(),
      keyMessageEvent: EventStreamProviderOfMediaKeyEvent(),
      needKeyEvent: EventStreamProviderOfMediaKeyEvent(),
      HAVE_CURRENT_DATA: core.int,
      HAVE_ENOUGH_DATA: core.int,
      HAVE_FUTURE_DATA: core.int,
      HAVE_METADATA: core.int,
      HAVE_NOTHING: core.int,
      NETWORK_EMPTY: core.int,
      NETWORK_IDLE: core.int,
      NETWORK_LOADING: core.int,
      NETWORK_NO_SOURCE: core.int
    })
  });
  html$.MediaElement.HAVE_CURRENT_DATA = 2;
  html$.MediaElement.HAVE_ENOUGH_DATA = 4;
  html$.MediaElement.HAVE_FUTURE_DATA = 3;
  html$.MediaElement.HAVE_METADATA = 1;
  html$.MediaElement.HAVE_NOTHING = 0;
  html$.MediaElement.NETWORK_EMPTY = 0;
  html$.MediaElement.NETWORK_IDLE = 1;
  html$.MediaElement.NETWORK_LOADING = 2;
  html$.MediaElement.NETWORK_NO_SOURCE = 3;
  dart.defineLazy(html$.MediaElement, {
    get keyAddedEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyadded'));
    },
    get keyErrorEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyerror'));
    },
    get keyMessageEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeymessage'));
    },
    get needKeyEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitneedkey'));
    }
  });
  dart.registerExtension(dart.global.HTMLMediaElement, html$.MediaElement);
  html$.AudioElement = class AudioElement extends html$.MediaElement {
    static _(src) {
      if (src === void 0) src = null;
      if (src != null) {
        return html$.AudioElement._create_1(src);
      }
      return html$.AudioElement._create_2();
    }
    static _create_1(src) {
      return new Audio(src);
    }
    static _create_2() {
      return new Audio();
    }
    created() {
      super.created();
    }
    static new(src) {
      if (src === void 0) src = null;
      return html$.AudioElement._(src);
    }
  };
  dart.defineNamedConstructor(html$.AudioElement, 'created');
  dart.setSignature(html$.AudioElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AudioElement, [], [core.String]),
      created: dart.definiteFunctionType(html$.AudioElement, []),
      new: dart.definiteFunctionType(html$.AudioElement, [], [core.String])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AudioElement, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AudioElement, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.HTMLAudioElement, html$.AudioElement);
  dart.defineExtensionNames([
    'enabled',
    'id',
    'kind',
    'label',
    'language'
  ]);
  html$.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.enabled]() {
      return this.enabled;
    }
    set [dartx.enabled](value) {
      this.enabled = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
  };
  dart.setSignature(html$.AudioTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrack, [])}),
    fields: () => ({
      [dartx.enabled]: core.bool,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.language]: core.String
    })
  });
  dart.registerExtension(dart.global.AudioTrack, html$.AudioTrack);
  const __getter__ = Symbol('__getter__');
  dart.defineExtensionNames([
    'getTrackById',
    'onChange',
    'length'
  ]);
  html$.AudioTrackList = class AudioTrackList extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.AudioTrackList.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.AudioTrackList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrackList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(html$.AudioTrack, [core.int]),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.AudioTrack, [core.String])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.AudioTrackList, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.AudioTrackList, html$.AudioTrackList);
  dart.defineExtensionNames([
    'reason'
  ]);
  html$.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
      }
      return html$.AutocompleteErrorEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new AutocompleteErrorEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new AutocompleteErrorEvent(type);
    }
    get [dartx.reason]() {
      return this.reason;
    }
  };
  dart.setSignature(html$.AutocompleteErrorEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AutocompleteErrorEvent, []),
      new: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.reason]: core.String}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.AutocompleteErrorEvent, html$.AutocompleteErrorEvent);
  html$.BRElement = class BRElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.BRElement._check(html$.document[dartx.createElement]("br"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.BRElement, 'created');
  dart.setSignature(html$.BRElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BRElement, []),
      new: dart.definiteFunctionType(html$.BRElement, []),
      created: dart.definiteFunctionType(html$.BRElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLBRElement, html$.BRElement);
  dart.defineExtensionNames([
    'visible'
  ]);
  html$.BarProp = class BarProp extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.visible]() {
      return this.visible;
    }
  };
  dart.setSignature(html$.BarProp, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BarProp, [])}),
    fields: () => ({[dartx.visible]: core.bool})
  });
  dart.registerExtension(dart.global.BarProp, html$.BarProp);
  dart.defineExtensionNames([
    'href',
    'target'
  ]);
  html$.BaseElement = class BaseElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.BaseElement._check(html$.document[dartx.createElement]("base"));
    }
    created() {
      this[dartx.href] = null;
      this[dartx.target] = null;
      super.created();
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
  };
  dart.defineNamedConstructor(html$.BaseElement, 'created');
  dart.setSignature(html$.BaseElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BaseElement, []),
      new: dart.definiteFunctionType(html$.BaseElement, []),
      created: dart.definiteFunctionType(html$.BaseElement, [])
    }),
    fields: () => ({
      [dartx.href]: core.String,
      [dartx.target]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLBaseElement, html$.BaseElement);
  dart.defineExtensionNames([
    'charging',
    'chargingTime',
    'dischargingTime',
    'level'
  ]);
  html$.BatteryManager = class BatteryManager extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.charging]() {
      return this.charging;
    }
    get [dartx.chargingTime]() {
      return this.chargingTime;
    }
    get [dartx.dischargingTime]() {
      return this.dischargingTime;
    }
    get [dartx.level]() {
      return this.level;
    }
  };
  dart.setSignature(html$.BatteryManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BatteryManager, [])}),
    fields: () => ({
      [dartx.charging]: core.bool,
      [dartx.chargingTime]: core.double,
      [dartx.dischargingTime]: core.double,
      [dartx.level]: core.double
    })
  });
  dart.registerExtension(dart.global.BatteryManager, html$.BatteryManager);
  dart.defineExtensionNames([
    'platforms',
    'prompt',
    'userChoice'
  ]);
  html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
      }
      return html$.BeforeInstallPromptEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new BeforeInstallPromptEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new BeforeInstallPromptEvent(type);
    }
    get [dartx.platforms]() {
      return this.platforms;
    }
    get [dartx.userChoice]() {
      return this.userChoice;
    }
    [dartx.prompt](...args) {
      return this.prompt.apply(this, args);
    }
  };
  dart.setSignature(html$.BeforeInstallPromptEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, []),
      new: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.userChoice]: async.Future}),
    getters: () => ({[dartx.platforms]: dart.definiteFunctionType(core.List$(core.String), [])}),
    methods: () => ({[dartx.prompt]: dart.definiteFunctionType(async.Future, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.BeforeInstallPromptEvent, html$.BeforeInstallPromptEvent);
  dart.defineExtensionNames([
    'returnValue',
    'returnValue'
  ]);
  html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.returnValue]() {
      return this.returnValue;
    }
    set [dartx.returnValue](value) {
      this.returnValue = value;
    }
  };
  dart.setSignature(html$.BeforeUnloadEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BeforeUnloadEvent, [])}),
    getters: () => ({[dartx.returnValue]: dart.definiteFunctionType(core.String, [])}),
    setters: () => ({[dartx.returnValue]: dart.definiteFunctionType(dart.void, [core.String])})
  });
  dart.registerExtension(dart.global.BeforeUnloadEvent, html$.BeforeUnloadEvent);
  dart.defineExtensionNames([
    'close',
    'slice',
    'size',
    'type'
  ]);
  html$.Blob = class Blob extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.slice](...args) {
      return this.slice.apply(this, args);
    }
    static new(blobParts, type, endings) {
      if (type === void 0) type = null;
      if (endings === void 0) endings = null;
      if (type == null && endings == null) {
        return html$.Blob._check(html$.Blob._create_1(blobParts));
      }
      let bag = html$.Blob._create_bag();
      if (type != null) html$.Blob._bag_set(bag, 'type', type);
      if (endings != null) html$.Blob._bag_set(bag, 'endings', endings);
      return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
    }
    static _create_1(parts) {
      return new window.Blob(parts);
    }
    static _create_2(parts, bag) {
      return new window.Blob(parts, bag);
    }
    static _create_bag() {
      return {};
    }
    static _bag_set(bag, key, value) {
      bag[key] = value;
    }
  };
  dart.setSignature(html$.Blob, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Blob, []),
      new: dart.definiteFunctionType(html$.Blob, [core.List], [core.String, core.String])
    }),
    fields: () => ({
      [dartx.size]: core.int,
      [dartx.type]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.slice]: dart.definiteFunctionType(html$.Blob, [], [core.int, core.int, core.String])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      _create_bag: dart.definiteFunctionType(dart.dynamic, []),
      _bag_set: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_bag', '_bag_set']
  });
  dart.registerExtension(dart.global.Blob, html$.Blob);
  const _requestDevice_1 = Symbol('_requestDevice_1');
  dart.defineExtensionNames([
    'requestDevice'
  ]);
  html$.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.requestDevice](options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_requestDevice_1](options_1);
    }
    [_requestDevice_1](...args) {
      return this.requestDevice.apply(this, args);
    }
  };
  dart.setSignature(html$.Bluetooth, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Bluetooth, [])}),
    methods: () => ({
      [dartx.requestDevice]: dart.definiteFunctionType(async.Future, [core.Map]),
      [_requestDevice_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.Bluetooth, html$.Bluetooth);
  dart.defineExtensionNames([
    'connectGatt',
    'deviceClass',
    'instanceID',
    'name',
    'paired',
    'productID',
    'productVersion',
    'vendorID',
    'vendorIDSource'
  ]);
  html$.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.deviceClass]() {
      return this.deviceClass;
    }
    get [dartx.instanceID]() {
      return this.instanceID;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.paired]() {
      return this.paired;
    }
    get [dartx.productID]() {
      return this.productID;
    }
    get [dartx.productVersion]() {
      return this.productVersion;
    }
    get [dartx.vendorID]() {
      return this.vendorID;
    }
    get [dartx.vendorIDSource]() {
      return this.vendorIDSource;
    }
    [dartx.connectGatt](...args) {
      return this.connectGATT.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothDevice, [])}),
    fields: () => ({
      [dartx.deviceClass]: core.int,
      [dartx.instanceID]: core.String,
      [dartx.name]: core.String,
      [dartx.paired]: core.bool,
      [dartx.productID]: core.int,
      [dartx.productVersion]: core.int,
      [dartx.vendorID]: core.int,
      [dartx.vendorIDSource]: core.String
    }),
    methods: () => ({[dartx.connectGatt]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.BluetoothDevice, html$.BluetoothDevice);
  dart.defineExtensionNames([
    'readValue',
    'writeValue',
    'uuid'
  ]);
  html$.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.uuid]() {
      return this.uuid;
    }
    [dartx.readValue](...args) {
      return this.readValue.apply(this, args);
    }
    [dartx.writeValue](...args) {
      return this.writeValue.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothGattCharacteristic, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattCharacteristic, [])}),
    fields: () => ({[dartx.uuid]: core.String}),
    methods: () => ({
      [dartx.readValue]: dart.definiteFunctionType(async.Future, []),
      [dartx.writeValue]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html$.BluetoothGattCharacteristic);
  dart.defineExtensionNames([
    'getPrimaryService',
    'connected'
  ]);
  html$.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connected]() {
      return this.connected;
    }
    [dartx.getPrimaryService](...args) {
      return this.getPrimaryService.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothGattRemoteServer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattRemoteServer, [])}),
    fields: () => ({[dartx.connected]: core.bool}),
    methods: () => ({[dartx.getPrimaryService]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
  });
  dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html$.BluetoothGattRemoteServer);
  dart.defineExtensionNames([
    'getCharacteristic',
    'isPrimary',
    'uuid'
  ]);
  html$.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.isPrimary]() {
      return this.isPrimary;
    }
    get [dartx.uuid]() {
      return this.uuid;
    }
    [dartx.getCharacteristic](...args) {
      return this.getCharacteristic.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothGattService, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattService, [])}),
    fields: () => ({
      [dartx.isPrimary]: core.bool,
      [dartx.uuid]: core.String
    }),
    methods: () => ({[dartx.getCharacteristic]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
  });
  dart.registerExtension(dart.global.BluetoothGATTService, html$.BluetoothGattService);
  html$.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.BluetoothUuid, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothUuid, [])}),
    statics: () => ({
      canonicalUuid: dart.definiteFunctionType(core.String, [core.int]),
      getCharacteristic: dart.definiteFunctionType(core.String, [core.Object]),
      getDescriptor: dart.definiteFunctionType(core.String, [core.Object]),
      getService: dart.definiteFunctionType(core.String, [core.Object])
    }),
    names: ['canonicalUuid', 'getCharacteristic', 'getDescriptor', 'getService']
  });
  dart.registerExtension(dart.global.BluetoothUUID, html$.BluetoothUuid);
  dart.defineExtensionNames([
    'arrayBuffer',
    'blob',
    'json',
    'text',
    'bodyUsed'
  ]);
  html$.Body = class Body extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bodyUsed]() {
      return this.bodyUsed;
    }
    [dartx.arrayBuffer](...args) {
      return this.arrayBuffer.apply(this, args);
    }
    [dartx.blob](...args) {
      return this.blob.apply(this, args);
    }
    [dartx.json](...args) {
      return this.json.apply(this, args);
    }
    [dartx.text](...args) {
      return this.text.apply(this, args);
    }
  };
  dart.setSignature(html$.Body, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Body, [])}),
    fields: () => ({[dartx.bodyUsed]: core.bool}),
    methods: () => ({
      [dartx.arrayBuffer]: dart.definiteFunctionType(async.Future, []),
      [dartx.blob]: dart.definiteFunctionType(async.Future, []),
      [dartx.json]: dart.definiteFunctionType(async.Future, []),
      [dartx.text]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.Body, html$.Body);
  dart.defineExtensionNames([
    'onBlur',
    'onError',
    'onFocus',
    'onHashChange',
    'onLoad',
    'onMessage',
    'onOffline',
    'onOnline',
    'onPopState',
    'onResize',
    'onScroll',
    'onStorage',
    'onUnload'
  ]);
  html$.BodyElement = class BodyElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.BodyElement._check(html$.document[dartx.createElement]("body"));
    }
    created() {
      super.created();
    }
    get [dartx.onBlur]() {
      return html$.BodyElement.blurEvent.forElement(this);
    }
    get [dartx.onError]() {
      return html$.BodyElement.errorEvent.forElement(this);
    }
    get [dartx.onFocus]() {
      return html$.BodyElement.focusEvent.forElement(this);
    }
    get [dartx.onHashChange]() {
      return html$.BodyElement.hashChangeEvent.forElement(this);
    }
    get [dartx.onLoad]() {
      return html$.BodyElement.loadEvent.forElement(this);
    }
    get [dartx.onMessage]() {
      return html$.BodyElement.messageEvent.forElement(this);
    }
    get [dartx.onOffline]() {
      return html$.BodyElement.offlineEvent.forElement(this);
    }
    get [dartx.onOnline]() {
      return html$.BodyElement.onlineEvent.forElement(this);
    }
    get [dartx.onPopState]() {
      return html$.BodyElement.popStateEvent.forElement(this);
    }
    get [dartx.onResize]() {
      return html$.BodyElement.resizeEvent.forElement(this);
    }
    get [dartx.onScroll]() {
      return html$.BodyElement.scrollEvent.forElement(this);
    }
    get [dartx.onStorage]() {
      return html$.BodyElement.storageEvent.forElement(this);
    }
    get [dartx.onUnload]() {
      return html$.BodyElement.unloadEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(html$.BodyElement, 'created');
  html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
  dart.setSignature(html$.BodyElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BodyElement, []),
      new: dart.definiteFunctionType(html$.BodyElement, []),
      created: dart.definiteFunctionType(html$.BodyElement, [])
    }),
    getters: () => ({
      [dartx.onHashChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MessageEvent), []),
      [dartx.onOffline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onOnline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onPopState]: dart.definiteFunctionType(html$.ElementStream$(html$.PopStateEvent), []),
      [dartx.onStorage]: dart.definiteFunctionType(html$.ElementStream$(html$.StorageEvent), []),
      [dartx.onUnload]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
    }),
    sfields: () => ({
      blurEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      hashChangeEvent: EventStreamProviderOfEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      offlineEvent: EventStreamProviderOfEvent(),
      onlineEvent: EventStreamProviderOfEvent(),
      popStateEvent: EventStreamProviderOfPopStateEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      storageEvent: EventStreamProviderOfStorageEvent(),
      unloadEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.BodyElement, {
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get hashChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get offlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('offline'));
    },
    get onlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('online'));
    },
    get popStateEvent() {
      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get storageEvent() {
      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
    },
    get unloadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unload'));
    }
  });
  dart.registerExtension(dart.global.HTMLBodyElement, html$.BodyElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'autofocus',
    'disabled',
    'form',
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget',
    'labels',
    'name',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate'
  ]);
  html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ButtonElement._check(html$.document[dartx.createElement]("button"));
    }
    created() {
      this[dartx.autofocus] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.formAction] = null;
      this[dartx.formEnctype] = null;
      this[dartx.formMethod] = null;
      this[dartx.formNoValidate] = null;
      this[dartx.formTarget] = null;
      this[dartx.labels] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.formAction]() {
      return this.formAction;
    }
    set [dartx.formAction](value) {
      this.formAction = value;
    }
    get [dartx.formEnctype]() {
      return this.formEnctype;
    }
    set [dartx.formEnctype](value) {
      this.formEnctype = value;
    }
    get [dartx.formMethod]() {
      return this.formMethod;
    }
    set [dartx.formMethod](value) {
      this.formMethod = value;
    }
    get [dartx.formNoValidate]() {
      return this.formNoValidate;
    }
    set [dartx.formNoValidate](value) {
      this.formNoValidate = value;
    }
    get [dartx.formTarget]() {
      return this.formTarget;
    }
    set [dartx.formTarget](value) {
      this.formTarget = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ButtonElement, 'created');
  dart.setSignature(html$.ButtonElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ButtonElement, []),
      new: dart.definiteFunctionType(html$.ButtonElement, []),
      created: dart.definiteFunctionType(html$.ButtonElement, [])
    }),
    fields: () => ({
      [dartx.autofocus]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.formAction]: core.String,
      [dartx.formEnctype]: core.String,
      [dartx.formMethod]: core.String,
      [dartx.formNoValidate]: core.bool,
      [dartx.formTarget]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLButtonElement, html$.ButtonElement);
  const _createTextNode = Symbol('_createTextNode');
  dart.defineExtensionNames([
    'appendData',
    'deleteData',
    'insertData',
    'replaceData',
    'substringData',
    'after',
    'before',
    'data',
    'length',
    'nextElementSibling',
    'previousElementSibling'
  ]);
  html$.CharacterData = class CharacterData extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.data]() {
      return this.data;
    }
    set [dartx.data](value) {
      this.data = value;
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.appendData](...args) {
      return this.appendData.apply(this, args);
    }
    [dartx.deleteData](...args) {
      return this.deleteData.apply(this, args);
    }
    [dartx.insertData](...args) {
      return this.insertData.apply(this, args);
    }
    [dartx.replaceData](...args) {
      return this.replaceData.apply(this, args);
    }
    [dartx.substringData](...args) {
      return this.substringData.apply(this, args);
    }
    [dartx.after](...args) {
      return this.after.apply(this, args);
    }
    [dartx.before](...args) {
      return this.before.apply(this, args);
    }
    get [dartx.nextElementSibling]() {
      return this.nextElementSibling;
    }
    get [dartx.previousElementSibling]() {
      return this.previousElementSibling;
    }
  };
  html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
  dart.setSignature(html$.CharacterData, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CharacterData, [])}),
    fields: () => ({
      [dartx.data]: core.String,
      [dartx.length]: core.int,
      [dartx.nextElementSibling]: html$.Element,
      [dartx.previousElementSibling]: html$.Element
    }),
    methods: () => ({
      [dartx.appendData]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.deleteData]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.insertData]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.replaceData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
      [dartx.substringData]: dart.definiteFunctionType(core.String, [core.int, core.int]),
      [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
      [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object])
    })
  });
  dart.registerExtension(dart.global.CharacterData, html$.CharacterData);
  dart.defineExtensionNames([
    'getDestinationInsertionPoints',
    'splitText',
    'wholeText'
  ]);
  html$.Text = class Text extends html$.CharacterData {
    static new(data) {
      return html$.document[_createTextNode](data);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.wholeText]() {
      return this.wholeText;
    }
    [dartx.getDestinationInsertionPoints](...args) {
      return this.getDestinationInsertionPoints.apply(this, args);
    }
    [dartx.splitText](...args) {
      return this.splitText.apply(this, args);
    }
  };
  dart.setSignature(html$.Text, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Text, [core.String]),
      _: dart.definiteFunctionType(html$.Text, [])
    }),
    fields: () => ({[dartx.wholeText]: core.String}),
    methods: () => ({
      [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
      [dartx.splitText]: dart.definiteFunctionType(html$.Text, [core.int])
    })
  });
  dart.registerExtension(dart.global.Text, html$.Text);
  html$.CDataSection = class CDataSection extends html$.Text {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.CDataSection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CDataSection, [])})
  });
  dart.registerExtension(dart.global.CDATASection, html$.CDataSection);
  const _match_1 = Symbol('_match_1');
  const _match_2 = Symbol('_match_2');
  dart.defineExtensionNames([
    'delete',
    'has',
    'keys',
    'match',
    'open'
  ]);
  html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.has](...args) {
      return this.has.apply(this, args);
    }
    [dartx.keys](...args) {
      return this.keys.apply(this, args);
    }
    [dartx.match](request, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_match_1](request, options_1);
      }
      return this[_match_2](request);
    }
    [_match_1](...args) {
      return this.match.apply(this, args);
    }
    [_match_2](...args) {
      return this.match.apply(this, args);
    }
    [dartx.open](...args) {
      return this.open.apply(this, args);
    }
  };
  dart.setSignature(html$.CacheStorage, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CacheStorage, [])}),
    methods: () => ({
      [dartx.delete]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.has]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.keys]: dart.definiteFunctionType(async.Future, []),
      [dartx.match]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
      [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_match_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.open]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.CacheStorage, html$.CacheStorage);
  const _getContext_1 = Symbol('_getContext_1');
  const _getContext_2 = Symbol('_getContext_2');
  const _toDataUrl = Symbol('_toDataUrl');
  dart.defineExtensionNames([
    'getContext',
    'onWebGlContextLost',
    'onWebGlContextRestored',
    'context2D',
    'getContext3d',
    'toDataUrl',
    'height',
    'width'
  ]);
  html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(opts) {
      let width = opts && 'width' in opts ? opts.width : null;
      let height = opts && 'height' in opts ? opts.height : null;
      let e = html$.CanvasElement._check(html$.document[dartx.createElement]("canvas"));
      if (width != null) e[dartx.width] = width;
      if (height != null) e[dartx.height] = height;
      return e;
    }
    created() {
      this[dartx.height] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    [dartx.getContext](contextId, attributes) {
      if (attributes === void 0) attributes = null;
      if (attributes != null) {
        let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
        return this[_getContext_1](contextId, attributes_1);
      }
      return this[_getContext_2](contextId);
    }
    [_getContext_1](...args) {
      return this.getContext.apply(this, args);
    }
    [_getContext_2](...args) {
      return this.getContext.apply(this, args);
    }
    [_toDataUrl](...args) {
      return this.toDataURL.apply(this, args);
    }
    get [dartx.onWebGlContextLost]() {
      return html$.CanvasElement.webGlContextLostEvent.forElement(this);
    }
    get [dartx.onWebGlContextRestored]() {
      return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
    }
    get [dartx.context2D]() {
      return this.getContext('2d');
    }
    [dartx.getContext3d](opts) {
      let alpha = opts && 'alpha' in opts ? opts.alpha : true;
      let depth = opts && 'depth' in opts ? opts.depth : true;
      let stencil = opts && 'stencil' in opts ? opts.stencil : false;
      let antialias = opts && 'antialias' in opts ? opts.antialias : true;
      let premultipliedAlpha = opts && 'premultipliedAlpha' in opts ? opts.premultipliedAlpha : true;
      let preserveDrawingBuffer = opts && 'preserveDrawingBuffer' in opts ? opts.preserveDrawingBuffer : false;
      let options = dart.map({alpha: alpha, depth: depth, stencil: stencil, antialias: antialias, premultipliedAlpha: premultipliedAlpha, preserveDrawingBuffer: preserveDrawingBuffer}, core.String, dart.dynamic);
      let context = this[dartx.getContext]('webgl', options);
      if (context == null) {
        context = this[dartx.getContext]('experimental-webgl', options);
      }
      return web_gl.RenderingContext._check(context);
    }
    [dartx.toDataUrl](type, quality) {
      if (type === void 0) type = 'image/png';
      if (quality === void 0) quality = null;
      return this[_toDataUrl](type, quality);
    }
  };
  dart.defineNamedConstructor(html$.CanvasElement, 'created');
  html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
  dart.setSignature(html$.CanvasElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CanvasElement, []),
      new: dart.definiteFunctionType(html$.CanvasElement, [], {width: core.int, height: core.int}),
      created: dart.definiteFunctionType(html$.CanvasElement, [])
    }),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.width]: core.int
    }),
    getters: () => ({
      [dartx.onWebGlContextLost]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
      [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
      [dartx.context2D]: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])
    }),
    methods: () => ({
      [dartx.getContext]: dart.definiteFunctionType(core.Object, [core.String], [core.Map]),
      [_getContext_1]: dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic]),
      [_getContext_2]: dart.definiteFunctionType(core.Object, [dart.dynamic]),
      [_toDataUrl]: dart.definiteFunctionType(core.String, [core.String], [dart.dynamic]),
      [dartx.getContext3d]: dart.definiteFunctionType(web_gl.RenderingContext, [], {alpha: dart.dynamic, depth: dart.dynamic, stencil: dart.dynamic, antialias: dart.dynamic, premultipliedAlpha: dart.dynamic, preserveDrawingBuffer: dart.dynamic}),
      [dartx.toDataUrl]: dart.definiteFunctionType(core.String, [], [core.String, core.num])
    }),
    sfields: () => ({
      webGlContextLostEvent: EventStreamProviderOfContextEvent(),
      webGlContextRestoredEvent: EventStreamProviderOfContextEvent()
    })
  });
  dart.defineLazy(html$.CanvasElement, {
    get webGlContextLostEvent() {
      return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextlost'));
    },
    get webGlContextRestoredEvent() {
      return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextrestored'));
    }
  });
  dart.registerExtension(dart.global.HTMLCanvasElement, html$.CanvasElement);
  dart.defineExtensionNames([
    'addColorStop'
  ]);
  html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.addColorStop](...args) {
      return this.addColorStop.apply(this, args);
    }
  };
  dart.setSignature(html$.CanvasGradient, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasGradient, [])}),
    methods: () => ({[dartx.addColorStop]: dart.definiteFunctionType(dart.void, [core.num, core.String])})
  });
  dart.registerExtension(dart.global.CanvasGradient, html$.CanvasGradient);
  dart.defineExtensionNames([
    'setTransform'
  ]);
  html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.setTransform](...args) {
      return this.setTransform.apply(this, args);
    }
  };
  dart.setSignature(html$.CanvasPattern, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasPattern, [])}),
    methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg$.Matrix])})
  });
  dart.registerExtension(dart.global.CanvasPattern, html$.CanvasPattern);
  html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
  const _addHitRegion_1 = Symbol('_addHitRegion_1');
  const _addHitRegion_2 = Symbol('_addHitRegion_2');
  const _createImageData_1 = Symbol('_createImageData_1');
  const _createImageData_2 = Symbol('_createImageData_2');
  const _getContextAttributes_1 = Symbol('_getContextAttributes_1');
  const _getImageData_1 = Symbol('_getImageData_1');
  const _getLineDash = Symbol('_getLineDash');
  const _putImageData_1 = Symbol('_putImageData_1');
  const _putImageData_2 = Symbol('_putImageData_2');
  const _arc = Symbol('_arc');
  dart.defineExtensionNames([
    'addHitRegion',
    'beginPath',
    'clearHitRegions',
    'clearRect',
    'clip',
    'createImageData',
    'createLinearGradient',
    'createPattern',
    'createRadialGradient',
    'drawFocusIfNeeded',
    'fillRect',
    'getContextAttributes',
    'getImageData',
    'isContextLost',
    'isPointInPath',
    'isPointInStroke',
    'measureText',
    'putImageData',
    'removeHitRegion',
    'resetTransform',
    'restore',
    'rotate',
    'save',
    'scale',
    'scrollPathIntoView',
    'setTransform',
    'stroke',
    'strokeRect',
    'strokeText',
    'transform',
    'translate',
    'arcTo',
    'bezierCurveTo',
    'closePath',
    'ellipse',
    'lineTo',
    'moveTo',
    'quadraticCurveTo',
    'rect',
    'createImageDataFromImageData',
    'setFillColorRgb',
    'setFillColorHsl',
    'setStrokeColorRgb',
    'setStrokeColorHsl',
    'arc',
    'createPatternFromImage',
    'drawImageToRect',
    'drawImage',
    'drawImageScaled',
    'drawImageScaledFromSource',
    'lineDashOffset',
    'lineDashOffset',
    'getLineDash',
    'setLineDash',
    'fillText',
    'fill',
    'backingStorePixelRatio',
    'canvas',
    'currentTransform',
    'direction',
    'fillStyle',
    'filter',
    'font',
    'globalAlpha',
    'globalCompositeOperation',
    'imageSmoothingEnabled',
    'lineCap',
    'lineJoin',
    'lineWidth',
    'miterLimit',
    'shadowBlur',
    'shadowColor',
    'shadowOffsetX',
    'shadowOffsetY',
    'strokeStyle',
    'textAlign',
    'textBaseline'
  ]);
  html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.canvas]() {
      return this.canvas;
    }
    get [dartx.currentTransform]() {
      return this.currentTransform;
    }
    set [dartx.currentTransform](value) {
      this.currentTransform = value;
    }
    get [dartx.direction]() {
      return this.direction;
    }
    set [dartx.direction](value) {
      this.direction = value;
    }
    get [dartx.fillStyle]() {
      return this.fillStyle;
    }
    set [dartx.fillStyle](value) {
      this.fillStyle = value;
    }
    get [dartx.filter]() {
      return this.filter;
    }
    set [dartx.filter](value) {
      this.filter = value;
    }
    get [dartx.font]() {
      return this.font;
    }
    set [dartx.font](value) {
      this.font = value;
    }
    get [dartx.globalAlpha]() {
      return this.globalAlpha;
    }
    set [dartx.globalAlpha](value) {
      this.globalAlpha = value;
    }
    get [dartx.globalCompositeOperation]() {
      return this.globalCompositeOperation;
    }
    set [dartx.globalCompositeOperation](value) {
      this.globalCompositeOperation = value;
    }
    get [dartx.imageSmoothingEnabled]() {
      return this.imageSmoothingEnabled;
    }
    set [dartx.imageSmoothingEnabled](value) {
      this.imageSmoothingEnabled = value;
    }
    get [dartx.lineCap]() {
      return this.lineCap;
    }
    set [dartx.lineCap](value) {
      this.lineCap = value;
    }
    get [dartx.lineJoin]() {
      return this.lineJoin;
    }
    set [dartx.lineJoin](value) {
      this.lineJoin = value;
    }
    get [dartx.lineWidth]() {
      return this.lineWidth;
    }
    set [dartx.lineWidth](value) {
      this.lineWidth = value;
    }
    get [dartx.miterLimit]() {
      return this.miterLimit;
    }
    set [dartx.miterLimit](value) {
      this.miterLimit = value;
    }
    get [dartx.shadowBlur]() {
      return this.shadowBlur;
    }
    set [dartx.shadowBlur](value) {
      this.shadowBlur = value;
    }
    get [dartx.shadowColor]() {
      return this.shadowColor;
    }
    set [dartx.shadowColor](value) {
      this.shadowColor = value;
    }
    get [dartx.shadowOffsetX]() {
      return this.shadowOffsetX;
    }
    set [dartx.shadowOffsetX](value) {
      this.shadowOffsetX = value;
    }
    get [dartx.shadowOffsetY]() {
      return this.shadowOffsetY;
    }
    set [dartx.shadowOffsetY](value) {
      this.shadowOffsetY = value;
    }
    get [dartx.strokeStyle]() {
      return this.strokeStyle;
    }
    set [dartx.strokeStyle](value) {
      this.strokeStyle = value;
    }
    get [dartx.textAlign]() {
      return this.textAlign;
    }
    set [dartx.textAlign](value) {
      this.textAlign = value;
    }
    get [dartx.textBaseline]() {
      return this.textBaseline;
    }
    set [dartx.textBaseline](value) {
      this.textBaseline = value;
    }
    [dartx.addHitRegion](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[_addHitRegion_1](options_1);
        return;
      }
      this[_addHitRegion_2]();
      return;
    }
    [_addHitRegion_1](...args) {
      return this.addHitRegion.apply(this, args);
    }
    [_addHitRegion_2](...args) {
      return this.addHitRegion.apply(this, args);
    }
    [dartx.beginPath](...args) {
      return this.beginPath.apply(this, args);
    }
    [dartx.clearHitRegions](...args) {
      return this.clearHitRegions.apply(this, args);
    }
    [dartx.clearRect](...args) {
      return this.clearRect.apply(this, args);
    }
    [dartx.clip](...args) {
      return this.clip.apply(this, args);
    }
    [dartx.createImageData](imagedata_OR_sw, sh) {
      if (sh === void 0) sh = null;
      if (html$.ImageData.is(imagedata_OR_sw) && sh == null) {
        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata_OR_sw);
        return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
      }
      if (sh != null && typeof imagedata_OR_sw == 'number') {
        return html_common.convertNativeToDart_ImageData(this[_createImageData_2](imagedata_OR_sw, sh));
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_createImageData_1](...args) {
      return this.createImageData.apply(this, args);
    }
    [_createImageData_2](...args) {
      return this.createImageData.apply(this, args);
    }
    [dartx.createLinearGradient](...args) {
      return this.createLinearGradient.apply(this, args);
    }
    [dartx.createPattern](...args) {
      return this.createPattern.apply(this, args);
    }
    [dartx.createRadialGradient](...args) {
      return this.createRadialGradient.apply(this, args);
    }
    [dartx.drawFocusIfNeeded](...args) {
      return this.drawFocusIfNeeded.apply(this, args);
    }
    [dartx.fillRect](...args) {
      return this.fillRect.apply(this, args);
    }
    [dartx.getContextAttributes]() {
      return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1]());
    }
    [_getContextAttributes_1](...args) {
      return this.getContextAttributes.apply(this, args);
    }
    [dartx.getImageData](sx, sy, sw, sh) {
      return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
    }
    [_getImageData_1](...args) {
      return this.getImageData.apply(this, args);
    }
    [_getLineDash](...args) {
      return this.getLineDash.apply(this, args);
    }
    [dartx.isContextLost](...args) {
      return this.isContextLost.apply(this, args);
    }
    [dartx.isPointInPath](...args) {
      return this.isPointInPath.apply(this, args);
    }
    [dartx.isPointInStroke](...args) {
      return this.isPointInStroke.apply(this, args);
    }
    [dartx.measureText](...args) {
      return this.measureText.apply(this, args);
    }
    [dartx.putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
      if (dirtyX === void 0) dirtyX = null;
      if (dirtyY === void 0) dirtyY = null;
      if (dirtyWidth === void 0) dirtyWidth = null;
      if (dirtyHeight === void 0) dirtyHeight = null;
      if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
        this[_putImageData_1](imagedata_1, dx, dy);
        return;
      }
      if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
        this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_putImageData_1](...args) {
      return this.putImageData.apply(this, args);
    }
    [_putImageData_2](...args) {
      return this.putImageData.apply(this, args);
    }
    [dartx.removeHitRegion](...args) {
      return this.removeHitRegion.apply(this, args);
    }
    [dartx.resetTransform](...args) {
      return this.resetTransform.apply(this, args);
    }
    [dartx.restore](...args) {
      return this.restore.apply(this, args);
    }
    [dartx.rotate](...args) {
      return this.rotate.apply(this, args);
    }
    [dartx.save](...args) {
      return this.save.apply(this, args);
    }
    [dartx.scale](...args) {
      return this.scale.apply(this, args);
    }
    [dartx.scrollPathIntoView](...args) {
      return this.scrollPathIntoView.apply(this, args);
    }
    [dartx.setTransform](...args) {
      return this.setTransform.apply(this, args);
    }
    [dartx.stroke](...args) {
      return this.stroke.apply(this, args);
    }
    [dartx.strokeRect](...args) {
      return this.strokeRect.apply(this, args);
    }
    [dartx.strokeText](...args) {
      return this.strokeText.apply(this, args);
    }
    [dartx.transform](...args) {
      return this.transform.apply(this, args);
    }
    [dartx.translate](...args) {
      return this.translate.apply(this, args);
    }
    [_arc](...args) {
      return this.arc.apply(this, args);
    }
    [dartx.arcTo](...args) {
      return this.arcTo.apply(this, args);
    }
    [dartx.bezierCurveTo](...args) {
      return this.bezierCurveTo.apply(this, args);
    }
    [dartx.closePath](...args) {
      return this.closePath.apply(this, args);
    }
    [dartx.ellipse](...args) {
      return this.ellipse.apply(this, args);
    }
    [dartx.lineTo](...args) {
      return this.lineTo.apply(this, args);
    }
    [dartx.moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.quadraticCurveTo](...args) {
      return this.quadraticCurveTo.apply(this, args);
    }
    [dartx.rect](...args) {
      return this.rect.apply(this, args);
    }
    [dartx.createImageDataFromImageData](imagedata) {
      return this.createImageData(imagedata);
    }
    [dartx.setFillColorRgb](r, g, b, a) {
      if (a === void 0) a = 1;
      this[dartx.fillStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
    }
    [dartx.setFillColorHsl](h, s, l, a) {
      if (a === void 0) a = 1;
      this[dartx.fillStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
    }
    [dartx.setStrokeColorRgb](r, g, b, a) {
      if (a === void 0) a = 1;
      this[dartx.strokeStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
    }
    [dartx.setStrokeColorHsl](h, s, l, a) {
      if (a === void 0) a = 1;
      this[dartx.strokeStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
    }
    [dartx.arc](x, y, radius, startAngle, endAngle, anticlockwise) {
      if (anticlockwise === void 0) anticlockwise = false;
      this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
    }
    [dartx.createPatternFromImage](image, repetitionType) {
      return this.createPattern(image, repetitionType);
    }
    [dartx.drawImageToRect](source, destRect, opts) {
      let sourceRect = opts && 'sourceRect' in opts ? opts.sourceRect : null;
      if (sourceRect == null) {
        this[dartx.drawImageScaled](source, destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
      } else {
        this[dartx.drawImageScaledFromSource](source, sourceRect[dartx.left], sourceRect[dartx.top], sourceRect[dartx.width], sourceRect[dartx.height], destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
      }
    }
    [dartx.drawImage](...args) {
      return this.drawImage.apply(this, args);
    }
    [dartx.drawImageScaled](...args) {
      return this.drawImage.apply(this, args);
    }
    [dartx.drawImageScaledFromSource](...args) {
      return this.drawImage.apply(this, args);
    }
    get [dartx.lineDashOffset]() {
      return this.lineDashOffset || this.webkitLineDashOffset;
    }
    set [dartx.lineDashOffset](value) {
      typeof this.lineDashOffset != "undefined" ? this.lineDashOffset = value : this.webkitLineDashOffset = value;
    }
    [dartx.getLineDash]() {
      if (!!this.getLineDash) {
        return this.getLineDash();
      } else if (!!this.webkitLineDash) {
        return this.webkitLineDash;
      }
    }
    [dartx.setLineDash](dash) {
      if (!!this.setLineDash) {
        this.setLineDash(dash);
      } else if (!!this.webkitLineDash) {
        this.webkitLineDash = dash;
      }
    }
    [dartx.fillText](text, x, y, maxWidth) {
      if (maxWidth === void 0) maxWidth = null;
      if (maxWidth != null) {
        this.fillText(text, x, y, maxWidth);
      } else {
        this.fillText(text, x, y);
      }
    }
    [dartx.fill](winding) {
      if (winding === void 0) winding = 'nonzero';
      this.fill(winding);
    }
    get [dartx.backingStorePixelRatio]() {
      return 1.0;
    }
  };
  html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
  dart.setSignature(html$.CanvasRenderingContext2D, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])}),
    fields: () => ({
      [dartx.canvas]: html$.CanvasElement,
      [dartx.currentTransform]: svg$.Matrix,
      [dartx.direction]: core.String,
      [dartx.fillStyle]: core.Object,
      [dartx.filter]: core.String,
      [dartx.font]: core.String,
      [dartx.globalAlpha]: core.num,
      [dartx.globalCompositeOperation]: core.String,
      [dartx.imageSmoothingEnabled]: core.bool,
      [dartx.lineCap]: core.String,
      [dartx.lineJoin]: core.String,
      [dartx.lineWidth]: core.num,
      [dartx.miterLimit]: core.num,
      [dartx.shadowBlur]: core.num,
      [dartx.shadowColor]: core.String,
      [dartx.shadowOffsetX]: core.num,
      [dartx.shadowOffsetY]: core.num,
      [dartx.strokeStyle]: core.Object,
      [dartx.textAlign]: core.String,
      [dartx.textBaseline]: core.String
    }),
    getters: () => ({
      [dartx.lineDashOffset]: dart.definiteFunctionType(core.num, []),
      [dartx.backingStorePixelRatio]: dart.definiteFunctionType(core.double, [])
    }),
    setters: () => ({[dartx.lineDashOffset]: dart.definiteFunctionType(dart.void, [core.num])}),
    methods: () => ({
      [dartx.addHitRegion]: dart.definiteFunctionType(dart.void, [], [core.Map]),
      [_addHitRegion_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_addHitRegion_2]: dart.definiteFunctionType(dart.void, []),
      [dartx.beginPath]: dart.definiteFunctionType(dart.void, []),
      [dartx.clearHitRegions]: dart.definiteFunctionType(dart.void, []),
      [dartx.clearRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.clip]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.String]),
      [dartx.createImageData]: dart.definiteFunctionType(html$.ImageData, [dart.dynamic], [core.num]),
      [_createImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      [_createImageData_2]: dart.definiteFunctionType(dart.dynamic, [core.num, dart.dynamic]),
      [dartx.createLinearGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
      [dartx.createPattern]: dart.definiteFunctionType(html$.CanvasPattern, [core.Object, core.String]),
      [dartx.createRadialGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html$.Element]),
      [dartx.fillRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.getContextAttributes]: dart.definiteFunctionType(core.Map, []),
      [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.getImageData]: dart.definiteFunctionType(html$.ImageData, [core.num, core.num, core.num, core.num]),
      [_getImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
      [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
      [dartx.isPointInPath]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
      [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [core.num]),
      [dartx.measureText]: dart.definiteFunctionType(html$.TextMetrics, [core.String]),
      [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html$.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
      [_putImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [_putImageData_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.removeHitRegion]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.resetTransform]: dart.definiteFunctionType(dart.void, []),
      [dartx.restore]: dart.definiteFunctionType(dart.void, []),
      [dartx.rotate]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.save]: dart.definiteFunctionType(dart.void, []),
      [dartx.scale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
      [dartx.setTransform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
      [dartx.strokeRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.strokeText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
      [dartx.transform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.translate]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
      [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
      [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html$.ImageData, [html$.ImageData]),
      [dartx.setFillColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
      [dartx.setFillColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
      [dartx.setStrokeColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
      [dartx.setStrokeColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
      [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
      [dartx.createPatternFromImage]: dart.definiteFunctionType(html$.CanvasPattern, [html$.ImageElement, core.String]),
      [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
      [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
      [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
      [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
      [dartx.setLineDash]: dart.definiteFunctionType(dart.void, [ListOfnum()]),
      [dartx.fillText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
      [dartx.fill]: dart.definiteFunctionType(dart.void, [], [core.String])
    })
  });
  dart.registerExtension(dart.global.CanvasRenderingContext2D, html$.CanvasRenderingContext2D);
  html$.ChildNode = class ChildNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.ChildNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ChildNode, [])})
  });
  html$.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.ChromiumValuebuffer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ChromiumValuebuffer, [])})
  });
  dart.registerExtension(dart.global.CHROMIUMValuebuffer, html$.ChromiumValuebuffer);
  dart.defineExtensionNames([
    'id'
  ]);
  html$.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
  };
  dart.setSignature(html$.GeofencingRegion, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingRegion, [])}),
    fields: () => ({[dartx.id]: core.String})
  });
  dart.registerExtension(dart.global.GeofencingRegion, html$.GeofencingRegion);
  dart.defineExtensionNames([
    'latitude',
    'longitude',
    'radius'
  ]);
  html$.CircularGeofencingRegion = class CircularGeofencingRegion extends html$.GeofencingRegion {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(init) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$.CircularGeofencingRegion._create_1(init_1);
    }
    static _create_1(init) {
      return new CircularGeofencingRegion(init);
    }
    get [dartx.latitude]() {
      return this.latitude;
    }
    get [dartx.longitude]() {
      return this.longitude;
    }
    get [dartx.radius]() {
      return this.radius;
    }
  };
  dart.setSignature(html$.CircularGeofencingRegion, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CircularGeofencingRegion, []),
      new: dart.definiteFunctionType(html$.CircularGeofencingRegion, [core.Map])
    }),
    fields: () => ({
      [dartx.latitude]: core.double,
      [dartx.longitude]: core.double,
      [dartx.radius]: core.double
    }),
    sfields: () => ({
      MAX_RADIUS: core.num,
      MIN_RADIUS: core.num
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.CircularGeofencingRegion, [dart.dynamic])}),
    names: ['_create_1']
  });
  html$.CircularGeofencingRegion.MAX_RADIUS = 100.0;
  html$.CircularGeofencingRegion.MIN_RADIUS = 1.0;
  dart.registerExtension(dart.global.CircularGeofencingRegion, html$.CircularGeofencingRegion);
  const _postMessage_1 = Symbol('_postMessage_1');
  const _postMessage_2 = Symbol('_postMessage_2');
  dart.defineExtensionNames([
    'postMessage',
    'frameType',
    'id',
    'url'
  ]);
  html$.Client = class Client extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.frameType]() {
      return this.frameType;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.url]() {
      return this.url;
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
  };
  dart.setSignature(html$.Client, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Client, [])}),
    fields: () => ({
      [dartx.frameType]: core.String,
      [dartx.id]: core.String,
      [dartx.url]: core.String
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.Client, html$.Client);
  const _matchAll_1 = Symbol('_matchAll_1');
  const _matchAll_2 = Symbol('_matchAll_2');
  dart.defineExtensionNames([
    'claim',
    'matchAll',
    'openWindow'
  ]);
  html$.Clients = class Clients extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.claim](...args) {
      return this.claim.apply(this, args);
    }
    [dartx.matchAll](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_matchAll_1](options_1);
      }
      return this[_matchAll_2]();
    }
    [_matchAll_1](...args) {
      return this.matchAll.apply(this, args);
    }
    [_matchAll_2](...args) {
      return this.matchAll.apply(this, args);
    }
    [dartx.openWindow](...args) {
      return this.openWindow.apply(this, args);
    }
  };
  dart.setSignature(html$.Clients, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Clients, [])}),
    methods: () => ({
      [dartx.claim]: dart.definiteFunctionType(async.Future, []),
      [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_matchAll_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.openWindow]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.Clients, html$.Clients);
  dart.defineExtensionNames([
    'clipboardData'
  ]);
  html$.ClipboardEvent = class ClipboardEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.clipboardData]() {
      return this.clipboardData;
    }
  };
  dart.setSignature(html$.ClipboardEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ClipboardEvent, [])}),
    fields: () => ({[dartx.clipboardData]: html$.DataTransfer})
  });
  dart.registerExtension(dart.global.ClipboardEvent, html$.ClipboardEvent);
  dart.defineExtensionNames([
    'code',
    'reason',
    'wasClean'
  ]);
  html$.CloseEvent = class CloseEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.CloseEvent._create_1(type, eventInitDict_1);
      }
      return html$.CloseEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new CloseEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new CloseEvent(type);
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.reason]() {
      return this.reason;
    }
    get [dartx.wasClean]() {
      return this.wasClean;
    }
  };
  dart.setSignature(html$.CloseEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CloseEvent, []),
      new: dart.definiteFunctionType(html$.CloseEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.reason]: core.String,
      [dartx.wasClean]: core.bool
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.CloseEvent, html$.CloseEvent);
  html$.Comment = class Comment extends html$.CharacterData {
    static new(data) {
      if (data === void 0) data = null;
      if (data != null) {
        return html$.document.createComment(data);
      }
      return html$.document.createComment("");
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.Comment, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Comment, [], [core.String]),
      _: dart.definiteFunctionType(html$.Comment, [])
    })
  });
  dart.registerExtension(dart.global.Comment, html$.Comment);
  const _initCompositionEvent = Symbol('_initCompositionEvent');
  const _initUIEvent = Symbol('_initUIEvent');
  const _charCode = Symbol('_charCode');
  const _keyCode = Symbol('_keyCode');
  const _get_view = Symbol('_get_view');
  const _which = Symbol('_which');
  dart.defineExtensionNames([
    'view',
    'detail',
    'sourceDevice'
  ]);
  html$.UIEvent = class UIEvent extends html$.Event {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let detail = opts && 'detail' in opts ? opts.detail : 0;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
      e[_initUIEvent](type, canBubble, cancelable, view, detail);
      return e;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.UIEvent._create_1(type, eventInitDict_1);
      }
      return html$.UIEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new UIEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new UIEvent(type);
    }
    get [_charCode]() {
      return this.charCode;
    }
    get [dartx.detail]() {
      return this.detail;
    }
    get [_keyCode]() {
      return this.keyCode;
    }
    get [dartx.sourceDevice]() {
      return this.sourceDevice;
    }
    get [dartx.view]() {
      return html$._convertNativeToDart_Window(this[_get_view]);
    }
    get [_get_view]() {
      return this.view;
    }
    get [_which]() {
      return this.which;
    }
    [_initUIEvent](...args) {
      return this.initUIEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.UIEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.UIEvent, [core.String], {view: html$.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
      _: dart.definiteFunctionType(html$.UIEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_charCode]: core.int,
      [dartx.detail]: core.int,
      [_keyCode]: core.int,
      [dartx.sourceDevice]: html$.InputDevice,
      [_get_view]: dart.dynamic,
      [_which]: core.int
    }),
    getters: () => ({[dartx.view]: dart.definiteFunctionType(html$.WindowBase, [])}),
    methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.UIEvent, html$.UIEvent);
  dart.defineExtensionNames([
    'data'
  ]);
  html$.CompositionEvent = class CompositionEvent extends html$.UIEvent {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let view = opts && 'view' in opts ? opts.view : null;
      let data = opts && 'data' in opts ? opts.data : null;
      let locale = opts && 'locale' in opts ? opts.locale : null;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
      if (dart.test(html_common.Device.isFirefox)) {
        e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
      } else {
        e[_initCompositionEvent](type, canBubble, cancelable, view, data);
      }
      return e;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.CompositionEvent._create_1(type, eventInitDict_1);
      }
      return html$.CompositionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new CompositionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new CompositionEvent(type);
    }
    get [dartx.data]() {
      return this.data;
    }
    [_initCompositionEvent](...args) {
      return this.initCompositionEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.CompositionEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String, locale: core.String}),
      _: dart.definiteFunctionType(html$.CompositionEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.data]: core.String}),
    methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.CompositionEvent, html$.CompositionEvent);
  dart.defineExtensionNames([
    'disconnect',
    'supports',
    'opacity',
    'scrollLeft',
    'scrollTop',
    'transform'
  ]);
  html$.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(element, attributeArray) {
      return html$.CompositorProxy._create_1(element, attributeArray);
    }
    static _create_1(element, attributeArray) {
      return new CompositorProxy(element, attributeArray);
    }
    get [dartx.opacity]() {
      return this.opacity;
    }
    set [dartx.opacity](value) {
      this.opacity = value;
    }
    get [dartx.scrollLeft]() {
      return this.scrollLeft;
    }
    set [dartx.scrollLeft](value) {
      this.scrollLeft = value;
    }
    get [dartx.scrollTop]() {
      return this.scrollTop;
    }
    set [dartx.scrollTop](value) {
      this.scrollTop = value;
    }
    get [dartx.transform]() {
      return this.transform;
    }
    set [dartx.transform](value) {
      this.transform = value;
    }
    [dartx.disconnect](...args) {
      return this.disconnect.apply(this, args);
    }
    [dartx.supports](...args) {
      return this.supports.apply(this, args);
    }
  };
  dart.setSignature(html$.CompositorProxy, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CompositorProxy, []),
      new: dart.definiteFunctionType(html$.CompositorProxy, [html$.Element, ListOfString()])
    }),
    fields: () => ({
      [dartx.opacity]: core.num,
      [dartx.scrollLeft]: core.num,
      [dartx.scrollTop]: core.num,
      [dartx.transform]: html$.DomMatrix
    }),
    methods: () => ({
      [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
      [dartx.supports]: dart.definiteFunctionType(core.bool, [core.String])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorProxy, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.CompositorProxy, html$.CompositorProxy);
  dart.defineExtensionNames([
    'postMessage',
    'terminate',
    'onError',
    'onMessage'
  ]);
  html$.CompositorWorker = class CompositorWorker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(scriptUrl) {
      return html$.CompositorWorker._create_1(scriptUrl);
    }
    static _create_1(scriptUrl) {
      return new CompositorWorker(scriptUrl);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.terminate](...args) {
      return this.terminate.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.CompositorWorker.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.CompositorWorker.messageEvent.forTarget(this);
    }
  };
  html$.CompositorWorker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$.CompositorWorker, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CompositorWorker, []),
      new: dart.definiteFunctionType(html$.CompositorWorker, [core.String])
    }),
    getters: () => ({
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent()
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorWorker, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.defineLazy(html$.CompositorWorker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.CompositorWorker, html$.CompositorWorker);
  const _fetch_1 = Symbol('_fetch_1');
  const _fetch_2 = Symbol('_fetch_2');
  const _webkitRequestFileSystem = Symbol('_webkitRequestFileSystem');
  const _webkitResolveLocalFileSystemUrl = Symbol('_webkitResolveLocalFileSystemUrl');
  const _setInterval_String = Symbol('_setInterval_String');
  const _setTimeout_String = Symbol('_setTimeout_String');
  const _clearInterval = Symbol('_clearInterval');
  const _clearTimeout = Symbol('_clearTimeout');
  const _setInterval = Symbol('_setInterval');
  const _setTimeout = Symbol('_setTimeout');
  dart.defineExtensionNames([
    'close',
    'fetch',
    'importScripts',
    'webkitRequestFileSystem',
    'requestFileSystemSync',
    'resolveLocalFileSystemSyncUrl',
    'webkitResolveLocalFileSystemUrl',
    'atob',
    'btoa',
    'onError',
    'caches',
    'console',
    'crypto',
    'indexedDB',
    'location',
    'navigator',
    'performance',
    'self'
  ]);
  html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.caches]() {
      return this.caches;
    }
    get [dartx.console]() {
      return this.console;
    }
    get [dartx.crypto]() {
      return this.crypto;
    }
    get [dartx.indexedDB]() {
      return this.indexedDB;
    }
    get [dartx.location]() {
      return this.location;
    }
    get [dartx.navigator]() {
      return this.navigator;
    }
    get [dartx.performance]() {
      return this.performance;
    }
    get [dartx.self]() {
      return this.self;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.fetch](input, init) {
      if (init === void 0) init = null;
      if (init != null) {
        let init_1 = html_common.convertDartToNative_Dictionary(init);
        return this[_fetch_1](input, init_1);
      }
      return this[_fetch_2](input);
    }
    [_fetch_1](...args) {
      return this.fetch.apply(this, args);
    }
    [_fetch_2](...args) {
      return this.fetch.apply(this, args);
    }
    [dartx.importScripts](...args) {
      return this.importScripts.apply(this, args);
    }
    [_webkitRequestFileSystem](...args) {
      return this.webkitRequestFileSystem.apply(this, args);
    }
    [dartx.webkitRequestFileSystem](type, size) {
      let completer = CompleterOfFileSystem().new();
      this[_webkitRequestFileSystem](type, size, dart.fn(value => {
        completer.complete(value);
      }, FileSystemTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.requestFileSystemSync](...args) {
      return this.webkitRequestFileSystemSync.apply(this, args);
    }
    [dartx.resolveLocalFileSystemSyncUrl](...args) {
      return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
    }
    [_webkitResolveLocalFileSystemUrl](...args) {
      return this.webkitResolveLocalFileSystemURL.apply(this, args);
    }
    [dartx.webkitResolveLocalFileSystemUrl](url) {
      let completer = CompleterOfEntry().new();
      this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
        completer.complete(value);
      }, EntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.atob](...args) {
      return this.atob.apply(this, args);
    }
    [dartx.btoa](...args) {
      return this.btoa.apply(this, args);
    }
    [_setInterval_String](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout_String](...args) {
      return this.setTimeout.apply(this, args);
    }
    [_clearInterval](...args) {
      return this.clearInterval.apply(this, args);
    }
    [_clearTimeout](...args) {
      return this.clearTimeout.apply(this, args);
    }
    [_setInterval](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout](...args) {
      return this.setTimeout.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.WorkerGlobalScope.errorEvent.forTarget(this);
    }
  };
  html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
  dart.setSignature(html$.WorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerGlobalScope, [])}),
    fields: () => ({
      [dartx.caches]: html$.CacheStorage,
      [dartx.console]: html$.WorkerConsole,
      [dartx.crypto]: html$.Crypto,
      [dartx.indexedDB]: indexed_db.IdbFactory,
      [dartx.location]: html$._WorkerLocation,
      [dartx.navigator]: html$._WorkerNavigator,
      [dartx.performance]: html$.WorkerPerformance,
      [dartx.self]: html$.WorkerGlobalScope
    }),
    getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
      [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.importScripts]: dart.definiteFunctionType(dart.void, [core.String]),
      [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$._FileSystemCallback, html$._ErrorCallback]),
      [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
      [dartx.requestFileSystemSync]: dart.definiteFunctionType(html$._DOMFileSystemSync, [core.int, core.int]),
      [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html$._EntrySync, [core.String]),
      [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
      [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
      [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      PERSISTENT: core.int,
      TEMPORARY: core.int
    })
  });
  html$.WorkerGlobalScope.PERSISTENT = 1;
  html$.WorkerGlobalScope.TEMPORARY = 0;
  dart.defineLazy(html$.WorkerGlobalScope, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.registerExtension(dart.global.WorkerGlobalScope, html$.WorkerGlobalScope);
  dart.defineExtensionNames([
    'cancelAnimationFrame',
    'postMessage',
    'requestAnimationFrame',
    'onMessage'
  ]);
  html$.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cancelAnimationFrame](...args) {
      return this.cancelAnimationFrame.apply(this, args);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.requestAnimationFrame](...args) {
      return this.requestAnimationFrame.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.CompositorWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CompositorWorkerGlobalScope, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.CompositorWorkerGlobalScope, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html$.CompositorWorkerGlobalScope);
  const _isConsoleDefined = Symbol('_isConsoleDefined');
  html$.Console = class Console extends core.Object {
    _safe() {
    }
    get [_isConsoleDefined]() {
      return typeof console != "undefined";
    }
    get memory() {
      return html$.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
    }
    assertCondition(condition, arg) {
      return dart.test(this[_isConsoleDefined]) ? console.assertCondition(condition, arg) : null;
    }
    clear(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.clear(arg) : null;
    }
    count(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.count(arg) : null;
    }
    debug(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.debug(arg) : null;
    }
    dir(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.dir(arg) : null;
    }
    dirxml(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.dirxml(arg) : null;
    }
    error(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.error(arg) : null;
    }
    group(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.group(arg) : null;
    }
    groupCollapsed(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.groupCollapsed(arg) : null;
    }
    groupEnd() {
      return dart.test(this[_isConsoleDefined]) ? console.groupEnd() : null;
    }
    info(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.info(arg) : null;
    }
    log(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.log(arg) : null;
    }
    markTimeline(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.markTimeline(arg) : null;
    }
    profile(title) {
      return dart.test(this[_isConsoleDefined]) ? console.profile(title) : null;
    }
    profileEnd(title) {
      return dart.test(this[_isConsoleDefined]) ? console.profileEnd(title) : null;
    }
    table(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.table(arg) : null;
    }
    time(title) {
      return dart.test(this[_isConsoleDefined]) ? console.time(title) : null;
    }
    timeEnd(title) {
      return dart.test(this[_isConsoleDefined]) ? console.timeEnd(title) : null;
    }
    timeStamp(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.timeStamp(arg) : null;
    }
    trace(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.trace(arg) : null;
    }
    warn(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.warn(arg) : null;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.defineNamedConstructor(html$.Console, '_safe');
  dart.setSignature(html$.Console, {
    constructors: () => ({
      _safe: dart.definiteFunctionType(html$.Console, []),
      _: dart.definiteFunctionType(html$.Console, [])
    }),
    getters: () => ({
      [_isConsoleDefined]: dart.definiteFunctionType(core.bool, []),
      memory: dart.definiteFunctionType(html$.MemoryInfo, [])
    }),
    methods: () => ({
      assertCondition: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
      clear: dart.definiteFunctionType(dart.void, [core.Object]),
      count: dart.definiteFunctionType(dart.void, [core.Object]),
      debug: dart.definiteFunctionType(dart.void, [core.Object]),
      dir: dart.definiteFunctionType(dart.void, [core.Object]),
      dirxml: dart.definiteFunctionType(dart.void, [core.Object]),
      error: dart.definiteFunctionType(dart.void, [core.Object]),
      group: dart.definiteFunctionType(dart.void, [core.Object]),
      groupCollapsed: dart.definiteFunctionType(dart.void, [core.Object]),
      groupEnd: dart.definiteFunctionType(dart.void, []),
      info: dart.definiteFunctionType(dart.void, [core.Object]),
      log: dart.definiteFunctionType(dart.void, [core.Object]),
      markTimeline: dart.definiteFunctionType(dart.void, [core.Object]),
      profile: dart.definiteFunctionType(dart.void, [core.String]),
      profileEnd: dart.definiteFunctionType(dart.void, [core.String]),
      table: dart.definiteFunctionType(dart.void, [core.Object]),
      time: dart.definiteFunctionType(dart.void, [core.String]),
      timeEnd: dart.definiteFunctionType(dart.void, [core.String]),
      timeStamp: dart.definiteFunctionType(dart.void, [core.Object]),
      trace: dart.definiteFunctionType(dart.void, [core.Object]),
      warn: dart.definiteFunctionType(dart.void, [core.Object])
    }),
    sfields: () => ({_safeConsole: html$.Console})
  });
  dart.defineLazy(html$.Console, {
    get _safeConsole() {
      return dart.const(new html$.Console._safe());
    }
  });
  dart.defineExtensionNames([
    'assertCondition',
    'timeline',
    'timelineEnd'
  ]);
  html$.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.assertCondition](...args) {
      return this.assert.apply(this, args);
    }
    [dartx.timeline](...args) {
      return this.timeline.apply(this, args);
    }
    [dartx.timelineEnd](...args) {
      return this.timelineEnd.apply(this, args);
    }
  };
  dart.setSignature(html$.ConsoleBase, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ConsoleBase, [])}),
    methods: () => ({
      [dartx.assertCondition]: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
      [dartx.timeline]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.timelineEnd]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.ConsoleBase, html$.ConsoleBase);
  dart.defineExtensionNames([
    'getDistributedNodes',
    'select'
  ]);
  html$.ContentElement = class ContentElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ContentElement._check(html$.document[dartx.createElement]("content"));
    }
    created() {
      this[dartx.select] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('content');
    }
    get [dartx.select]() {
      return this.select;
    }
    set [dartx.select](value) {
      this.select = value;
    }
    [dartx.getDistributedNodes](...args) {
      return this.getDistributedNodes.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ContentElement, 'created');
  dart.setSignature(html$.ContentElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ContentElement, []),
      new: dart.definiteFunctionType(html$.ContentElement, []),
      created: dart.definiteFunctionType(html$.ContentElement, [])
    }),
    fields: () => ({[dartx.select]: core.String}),
    methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLContentElement, html$.ContentElement);
  dart.defineExtensionNames([
    'accuracy',
    'altitude',
    'altitudeAccuracy',
    'heading',
    'latitude',
    'longitude',
    'speed'
  ]);
  html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.accuracy]() {
      return this.accuracy;
    }
    get [dartx.altitude]() {
      return this.altitude;
    }
    get [dartx.altitudeAccuracy]() {
      return this.altitudeAccuracy;
    }
    get [dartx.heading]() {
      return this.heading;
    }
    get [dartx.latitude]() {
      return this.latitude;
    }
    get [dartx.longitude]() {
      return this.longitude;
    }
    get [dartx.speed]() {
      return this.speed;
    }
  };
  dart.setSignature(html$.Coordinates, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Coordinates, [])}),
    fields: () => ({
      [dartx.accuracy]: core.double,
      [dartx.altitude]: core.double,
      [dartx.altitudeAccuracy]: core.double,
      [dartx.heading]: core.double,
      [dartx.latitude]: core.double,
      [dartx.longitude]: core.double,
      [dartx.speed]: core.double
    })
  });
  dart.registerExtension(dart.global.Coordinates, html$.Coordinates);
  dart.defineExtensionNames([
    'iconUrl',
    'id',
    'name',
    'type'
  ]);
  html$.Credential = class Credential extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.iconUrl]() {
      return this.iconURL;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.Credential, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Credential, [])}),
    fields: () => ({
      [dartx.iconUrl]: core.String,
      [dartx.id]: core.String,
      [dartx.name]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.Credential, html$.Credential);
  const _request_1 = Symbol('_request_1');
  const _request_2 = Symbol('_request_2');
  dart.defineExtensionNames([
    'notifySignedIn',
    'request',
    'requireUserMediation'
  ]);
  html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.notifySignedIn](...args) {
      return this.notifySignedIn.apply(this, args);
    }
    [dartx.request](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_request_1](options_1);
      }
      return this[_request_2]();
    }
    [_request_1](...args) {
      return this.request.apply(this, args);
    }
    [_request_2](...args) {
      return this.request.apply(this, args);
    }
    [dartx.requireUserMediation](...args) {
      return this.requireUserMediation.apply(this, args);
    }
  };
  dart.setSignature(html$.CredentialsContainer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CredentialsContainer, [])}),
    methods: () => ({
      [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html$.Credential]),
      [dartx.request]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_request_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_request_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.requireUserMediation]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.CredentialsContainer, html$.CredentialsContainer);
  dart.defineExtensionNames([
    'acceptConnection',
    'client'
  ]);
  html$.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.client]() {
      return this.client;
    }
    [dartx.acceptConnection](...args) {
      return this.acceptConnection.apply(this, args);
    }
  };
  dart.setSignature(html$.CrossOriginConnectEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginConnectEvent, [])}),
    fields: () => ({[dartx.client]: html$.CrossOriginServiceWorkerClient}),
    methods: () => ({[dartx.acceptConnection]: dart.definiteFunctionType(dart.void, [async.Future])})
  });
  dart.registerExtension(dart.global.CrossOriginConnectEvent, html$.CrossOriginConnectEvent);
  dart.defineExtensionNames([
    'postMessage',
    'origin',
    'targetUrl'
  ]);
  html$.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.targetUrl]() {
      return this.targetUrl;
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
  };
  dart.setSignature(html$.CrossOriginServiceWorkerClient, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginServiceWorkerClient, [])}),
    fields: () => ({
      [dartx.origin]: core.String,
      [dartx.targetUrl]: core.String
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html$.CrossOriginServiceWorkerClient);
  const _getRandomValues = Symbol('_getRandomValues');
  dart.defineExtensionNames([
    'getRandomValues',
    'subtle'
  ]);
  html$.Crypto = class Crypto extends _interceptors.Interceptor {
    [dartx.getRandomValues](array) {
      return this[_getRandomValues](array);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!(window.crypto && window.crypto.getRandomValues);
    }
    get [dartx.subtle]() {
      return this.subtle;
    }
    [_getRandomValues](...args) {
      return this.getRandomValues.apply(this, args);
    }
  };
  dart.setSignature(html$.Crypto, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Crypto, [])}),
    fields: () => ({[dartx.subtle]: html$._SubtleCrypto}),
    methods: () => ({
      [dartx.getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData]),
      [_getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.Crypto, html$.Crypto);
  dart.defineExtensionNames([
    'algorithm',
    'extractable',
    'type',
    'usages'
  ]);
  html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.algorithm]() {
      return this.algorithm;
    }
    get [dartx.extractable]() {
      return this.extractable;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.usages]() {
      return this.usages;
    }
  };
  dart.setSignature(html$.CryptoKey, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CryptoKey, [])}),
    fields: () => ({
      [dartx.algorithm]: core.Object,
      [dartx.extractable]: core.bool,
      [dartx.type]: core.String,
      [dartx.usages]: ListOfString()
    })
  });
  dart.registerExtension(dart.global.CryptoKey, html$.CryptoKey);
  html$.Css = class Css extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.Css, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Css, [])}),
    statics: () => ({
      supports: dart.definiteFunctionType(core.bool, [core.String, core.String]),
      supportsCondition: dart.definiteFunctionType(core.bool, [core.String])
    }),
    names: ['supports', 'supportsCondition']
  });
  dart.registerExtension(dart.global.CSS, html$.Css);
  dart.defineExtensionNames([
    'cssText',
    'parentRule',
    'parentStyleSheet',
    'type'
  ]);
  html$.CssRule = class CssRule extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssText]() {
      return this.cssText;
    }
    set [dartx.cssText](value) {
      this.cssText = value;
    }
    get [dartx.parentRule]() {
      return this.parentRule;
    }
    get [dartx.parentStyleSheet]() {
      return this.parentStyleSheet;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.CssRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssRule, [])}),
    fields: () => ({
      [dartx.cssText]: core.String,
      [dartx.parentRule]: html$.CssRule,
      [dartx.parentStyleSheet]: html$.CssStyleSheet,
      [dartx.type]: core.int
    }),
    sfields: () => ({
      CHARSET_RULE: core.int,
      FONT_FACE_RULE: core.int,
      IMPORT_RULE: core.int,
      KEYFRAMES_RULE: core.int,
      KEYFRAME_RULE: core.int,
      MEDIA_RULE: core.int,
      PAGE_RULE: core.int,
      STYLE_RULE: core.int,
      SUPPORTS_RULE: core.int,
      VIEWPORT_RULE: core.int,
      WEBKIT_KEYFRAMES_RULE: core.int,
      WEBKIT_KEYFRAME_RULE: core.int
    })
  });
  html$.CssRule.CHARSET_RULE = 2;
  html$.CssRule.FONT_FACE_RULE = 5;
  html$.CssRule.IMPORT_RULE = 3;
  html$.CssRule.KEYFRAMES_RULE = 7;
  html$.CssRule.KEYFRAME_RULE = 8;
  html$.CssRule.MEDIA_RULE = 4;
  html$.CssRule.PAGE_RULE = 6;
  html$.CssRule.STYLE_RULE = 1;
  html$.CssRule.SUPPORTS_RULE = 12;
  html$.CssRule.VIEWPORT_RULE = 15;
  html$.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
  html$.CssRule.WEBKIT_KEYFRAME_RULE = 8;
  dart.registerExtension(dart.global.CSSRule, html$.CssRule);
  dart.defineExtensionNames([
    'encoding'
  ]);
  html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.encoding]() {
      return this.encoding;
    }
    set [dartx.encoding](value) {
      this.encoding = value;
    }
  };
  dart.setSignature(html$.CssCharsetRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssCharsetRule, [])}),
    fields: () => ({[dartx.encoding]: core.String})
  });
  dart.registerExtension(dart.global.CSSCharsetRule, html$.CssCharsetRule);
  dart.defineExtensionNames([
    'style'
  ]);
  html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssFontFaceRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssFontFaceRule, [])}),
    fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
  });
  dart.registerExtension(dart.global.CSSFontFaceRule, html$.CssFontFaceRule);
  dart.defineExtensionNames([
    'deleteRule',
    'insertRule',
    'cssRules'
  ]);
  html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.insertRule](...args) {
      return this.insertRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssGroupingRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssGroupingRule, [])}),
    fields: () => ({[dartx.cssRules]: ListOfCssRule()}),
    methods: () => ({
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
    })
  });
  dart.registerExtension(dart.global.CSSGroupingRule, html$.CssGroupingRule);
  dart.defineExtensionNames([
    'href',
    'media',
    'styleSheet'
  ]);
  html$.CssImportRule = class CssImportRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.href]() {
      return this.href;
    }
    get [dartx.media]() {
      return this.media;
    }
    get [dartx.styleSheet]() {
      return this.styleSheet;
    }
  };
  dart.setSignature(html$.CssImportRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssImportRule, [])}),
    fields: () => ({
      [dartx.href]: core.String,
      [dartx.media]: html$.MediaList,
      [dartx.styleSheet]: html$.CssStyleSheet
    })
  });
  dart.registerExtension(dart.global.CSSImportRule, html$.CssImportRule);
  dart.defineExtensionNames([
    'keyText',
    'style'
  ]);
  html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.keyText]() {
      return this.keyText;
    }
    set [dartx.keyText](value) {
      this.keyText = value;
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssKeyframeRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframeRule, [])}),
    fields: () => ({
      [dartx.keyText]: core.String,
      [dartx.style]: html$.CssStyleDeclaration
    })
  });
  dart.registerExtension(dart.global.CSSKeyframeRule, html$.CssKeyframeRule);
  dart.registerExtension(dart.global.MozCSSKeyframeRule, html$.CssKeyframeRule);
  dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html$.CssKeyframeRule);
  dart.defineExtensionNames([
    'appendRule',
    'deleteRule',
    'findRule',
    'cssRules',
    'name'
  ]);
  html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.appendRule](...args) {
      return this.appendRule.apply(this, args);
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.findRule](...args) {
      return this.findRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssKeyframesRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframesRule, [])}),
    fields: () => ({
      [dartx.cssRules]: ListOfCssRule(),
      [dartx.name]: core.String
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.int]),
      [dartx.appendRule]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.findRule]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.String])
    })
  });
  dart.registerExtension(dart.global.CSSKeyframesRule, html$.CssKeyframesRule);
  dart.registerExtension(dart.global.MozCSSKeyframesRule, html$.CssKeyframesRule);
  dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html$.CssKeyframesRule);
  dart.defineExtensionNames([
    'media'
  ]);
  html$.CssMediaRule = class CssMediaRule extends html$.CssGroupingRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.media]() {
      return this.media;
    }
  };
  dart.setSignature(html$.CssMediaRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssMediaRule, [])}),
    fields: () => ({[dartx.media]: html$.MediaList})
  });
  dart.registerExtension(dart.global.CSSMediaRule, html$.CssMediaRule);
  dart.defineExtensionNames([
    'selectorText',
    'style'
  ]);
  html$.CssPageRule = class CssPageRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.selectorText]() {
      return this.selectorText;
    }
    set [dartx.selectorText](value) {
      this.selectorText = value;
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssPageRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssPageRule, [])}),
    fields: () => ({
      [dartx.selectorText]: core.String,
      [dartx.style]: html$.CssStyleDeclaration
    })
  });
  dart.registerExtension(dart.global.CSSPageRule, html$.CssPageRule);
  const _getPropertyValueHelper = Symbol('_getPropertyValueHelper');
  const _supportsProperty = Symbol('_supportsProperty');
  const _getPropertyValue = Symbol('_getPropertyValue');
  const _setPropertyHelper = Symbol('_setPropertyHelper');
  const _browserPropertyName = Symbol('_browserPropertyName');
  const _background = Symbol('_background');
  const _backgroundAttachment = Symbol('_backgroundAttachment');
  const _backgroundColor = Symbol('_backgroundColor');
  const _backgroundImage = Symbol('_backgroundImage');
  const _backgroundPosition = Symbol('_backgroundPosition');
  const _backgroundRepeat = Symbol('_backgroundRepeat');
  const _border = Symbol('_border');
  const _borderBottom = Symbol('_borderBottom');
  const _borderBottomColor = Symbol('_borderBottomColor');
  const _borderBottomStyle = Symbol('_borderBottomStyle');
  const _borderBottomWidth = Symbol('_borderBottomWidth');
  const _borderCollapse = Symbol('_borderCollapse');
  const _borderColor = Symbol('_borderColor');
  const _borderLeft = Symbol('_borderLeft');
  const _borderLeftColor = Symbol('_borderLeftColor');
  const _borderLeftStyle = Symbol('_borderLeftStyle');
  const _borderLeftWidth = Symbol('_borderLeftWidth');
  const _borderRight = Symbol('_borderRight');
  const _borderRightColor = Symbol('_borderRightColor');
  const _borderRightStyle = Symbol('_borderRightStyle');
  const _borderRightWidth = Symbol('_borderRightWidth');
  const _borderSpacing = Symbol('_borderSpacing');
  const _borderStyle = Symbol('_borderStyle');
  const _borderTop = Symbol('_borderTop');
  const _borderTopColor = Symbol('_borderTopColor');
  const _borderTopStyle = Symbol('_borderTopStyle');
  const _borderTopWidth = Symbol('_borderTopWidth');
  const _borderWidth = Symbol('_borderWidth');
  const _bottom = Symbol('_bottom');
  const _captionSide = Symbol('_captionSide');
  const _clear$1 = Symbol('_clear');
  const _clip = Symbol('_clip');
  const _color = Symbol('_color');
  const _content = Symbol('_content');
  const _cursor = Symbol('_cursor');
  const _direction = Symbol('_direction');
  const _display = Symbol('_display');
  const _emptyCells = Symbol('_emptyCells');
  const _font = Symbol('_font');
  const _fontFamily = Symbol('_fontFamily');
  const _fontSize = Symbol('_fontSize');
  const _fontStyle = Symbol('_fontStyle');
  const _fontVariant = Symbol('_fontVariant');
  const _fontWeight = Symbol('_fontWeight');
  const _height$ = Symbol('_height');
  const _left = Symbol('_left');
  const _letterSpacing = Symbol('_letterSpacing');
  const _lineHeight = Symbol('_lineHeight');
  const _listStyle = Symbol('_listStyle');
  const _listStyleImage = Symbol('_listStyleImage');
  const _listStylePosition = Symbol('_listStylePosition');
  const _listStyleType = Symbol('_listStyleType');
  const _margin = Symbol('_margin');
  const _marginBottom = Symbol('_marginBottom');
  const _marginLeft = Symbol('_marginLeft');
  const _marginRight = Symbol('_marginRight');
  const _marginTop = Symbol('_marginTop');
  const _maxHeight = Symbol('_maxHeight');
  const _maxWidth = Symbol('_maxWidth');
  const _minHeight = Symbol('_minHeight');
  const _minWidth = Symbol('_minWidth');
  const _outline = Symbol('_outline');
  const _outlineColor = Symbol('_outlineColor');
  const _outlineStyle = Symbol('_outlineStyle');
  const _outlineWidth = Symbol('_outlineWidth');
  const _overflow = Symbol('_overflow');
  const _padding = Symbol('_padding');
  const _paddingBottom = Symbol('_paddingBottom');
  const _paddingLeft = Symbol('_paddingLeft');
  const _paddingRight = Symbol('_paddingRight');
  const _paddingTop = Symbol('_paddingTop');
  const _pageBreakAfter = Symbol('_pageBreakAfter');
  const _pageBreakBefore = Symbol('_pageBreakBefore');
  const _pageBreakInside = Symbol('_pageBreakInside');
  const _position$1 = Symbol('_position');
  const _quotes = Symbol('_quotes');
  const _right = Symbol('_right');
  const _tableLayout = Symbol('_tableLayout');
  const _textAlign = Symbol('_textAlign');
  const _textDecoration = Symbol('_textDecoration');
  const _textIndent = Symbol('_textIndent');
  const _textTransform = Symbol('_textTransform');
  const _top = Symbol('_top');
  const _unicodeBidi = Symbol('_unicodeBidi');
  const _verticalAlign = Symbol('_verticalAlign');
  const _visibility = Symbol('_visibility');
  const _whiteSpace = Symbol('_whiteSpace');
  const _width$ = Symbol('_width');
  const _wordSpacing = Symbol('_wordSpacing');
  const _zIndex = Symbol('_zIndex');
  dart.defineExtensionNames([
    'alignContent',
    'alignContent',
    'alignItems',
    'alignItems',
    'alignSelf',
    'alignSelf',
    'animation',
    'animation',
    'animationDelay',
    'animationDelay',
    'animationDirection',
    'animationDirection',
    'animationDuration',
    'animationDuration',
    'animationFillMode',
    'animationFillMode',
    'animationIterationCount',
    'animationIterationCount',
    'animationName',
    'animationName',
    'animationPlayState',
    'animationPlayState',
    'animationTimingFunction',
    'animationTimingFunction',
    'appRegion',
    'appRegion',
    'appearance',
    'appearance',
    'aspectRatio',
    'aspectRatio',
    'backfaceVisibility',
    'backfaceVisibility',
    'background',
    'background',
    'backgroundAttachment',
    'backgroundAttachment',
    'backgroundBlendMode',
    'backgroundBlendMode',
    'backgroundClip',
    'backgroundClip',
    'backgroundColor',
    'backgroundColor',
    'backgroundComposite',
    'backgroundComposite',
    'backgroundImage',
    'backgroundImage',
    'backgroundOrigin',
    'backgroundOrigin',
    'backgroundPosition',
    'backgroundPosition',
    'backgroundPositionX',
    'backgroundPositionX',
    'backgroundPositionY',
    'backgroundPositionY',
    'backgroundRepeat',
    'backgroundRepeat',
    'backgroundRepeatX',
    'backgroundRepeatX',
    'backgroundRepeatY',
    'backgroundRepeatY',
    'backgroundSize',
    'backgroundSize',
    'border',
    'border',
    'borderAfter',
    'borderAfter',
    'borderAfterColor',
    'borderAfterColor',
    'borderAfterStyle',
    'borderAfterStyle',
    'borderAfterWidth',
    'borderAfterWidth',
    'borderBefore',
    'borderBefore',
    'borderBeforeColor',
    'borderBeforeColor',
    'borderBeforeStyle',
    'borderBeforeStyle',
    'borderBeforeWidth',
    'borderBeforeWidth',
    'borderBottom',
    'borderBottom',
    'borderBottomColor',
    'borderBottomColor',
    'borderBottomLeftRadius',
    'borderBottomLeftRadius',
    'borderBottomRightRadius',
    'borderBottomRightRadius',
    'borderBottomStyle',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderBottomWidth',
    'borderCollapse',
    'borderCollapse',
    'borderColor',
    'borderColor',
    'borderEnd',
    'borderEnd',
    'borderEndColor',
    'borderEndColor',
    'borderEndStyle',
    'borderEndStyle',
    'borderEndWidth',
    'borderEndWidth',
    'borderFit',
    'borderFit',
    'borderHorizontalSpacing',
    'borderHorizontalSpacing',
    'borderImage',
    'borderImage',
    'borderImageOutset',
    'borderImageOutset',
    'borderImageRepeat',
    'borderImageRepeat',
    'borderImageSlice',
    'borderImageSlice',
    'borderImageSource',
    'borderImageSource',
    'borderImageWidth',
    'borderImageWidth',
    'borderLeft',
    'borderLeft',
    'borderLeftColor',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderLeftWidth',
    'borderRadius',
    'borderRadius',
    'borderRight',
    'borderRight',
    'borderRightColor',
    'borderRightColor',
    'borderRightStyle',
    'borderRightStyle',
    'borderRightWidth',
    'borderRightWidth',
    'borderSpacing',
    'borderSpacing',
    'borderStart',
    'borderStart',
    'borderStartColor',
    'borderStartColor',
    'borderStartStyle',
    'borderStartStyle',
    'borderStartWidth',
    'borderStartWidth',
    'borderStyle',
    'borderStyle',
    'borderTop',
    'borderTop',
    'borderTopColor',
    'borderTopColor',
    'borderTopLeftRadius',
    'borderTopLeftRadius',
    'borderTopRightRadius',
    'borderTopRightRadius',
    'borderTopStyle',
    'borderTopStyle',
    'borderTopWidth',
    'borderTopWidth',
    'borderVerticalSpacing',
    'borderVerticalSpacing',
    'borderWidth',
    'borderWidth',
    'bottom',
    'bottom',
    'boxAlign',
    'boxAlign',
    'boxDecorationBreak',
    'boxDecorationBreak',
    'boxDirection',
    'boxDirection',
    'boxFlex',
    'boxFlex',
    'boxFlexGroup',
    'boxFlexGroup',
    'boxLines',
    'boxLines',
    'boxOrdinalGroup',
    'boxOrdinalGroup',
    'boxOrient',
    'boxOrient',
    'boxPack',
    'boxPack',
    'boxReflect',
    'boxReflect',
    'boxShadow',
    'boxShadow',
    'boxSizing',
    'boxSizing',
    'captionSide',
    'captionSide',
    'clear',
    'clear',
    'clip',
    'clip',
    'clipPath',
    'clipPath',
    'color',
    'color',
    'columnBreakAfter',
    'columnBreakAfter',
    'columnBreakBefore',
    'columnBreakBefore',
    'columnBreakInside',
    'columnBreakInside',
    'columnCount',
    'columnCount',
    'columnFill',
    'columnFill',
    'columnGap',
    'columnGap',
    'columnRule',
    'columnRule',
    'columnRuleColor',
    'columnRuleColor',
    'columnRuleStyle',
    'columnRuleStyle',
    'columnRuleWidth',
    'columnRuleWidth',
    'columnSpan',
    'columnSpan',
    'columnWidth',
    'columnWidth',
    'columns',
    'columns',
    'content',
    'content',
    'counterIncrement',
    'counterIncrement',
    'counterReset',
    'counterReset',
    'cursor',
    'cursor',
    'direction',
    'direction',
    'display',
    'display',
    'emptyCells',
    'emptyCells',
    'filter',
    'filter',
    'flex',
    'flex',
    'flexBasis',
    'flexBasis',
    'flexDirection',
    'flexDirection',
    'flexFlow',
    'flexFlow',
    'flexGrow',
    'flexGrow',
    'flexShrink',
    'flexShrink',
    'flexWrap',
    'flexWrap',
    'float',
    'float',
    'font',
    'font',
    'fontFamily',
    'fontFamily',
    'fontFeatureSettings',
    'fontFeatureSettings',
    'fontKerning',
    'fontKerning',
    'fontSize',
    'fontSize',
    'fontSizeDelta',
    'fontSizeDelta',
    'fontSmoothing',
    'fontSmoothing',
    'fontStretch',
    'fontStretch',
    'fontStyle',
    'fontStyle',
    'fontVariant',
    'fontVariant',
    'fontVariantLigatures',
    'fontVariantLigatures',
    'fontWeight',
    'fontWeight',
    'grid',
    'grid',
    'gridArea',
    'gridArea',
    'gridAutoColumns',
    'gridAutoColumns',
    'gridAutoFlow',
    'gridAutoFlow',
    'gridAutoRows',
    'gridAutoRows',
    'gridColumn',
    'gridColumn',
    'gridColumnEnd',
    'gridColumnEnd',
    'gridColumnStart',
    'gridColumnStart',
    'gridRow',
    'gridRow',
    'gridRowEnd',
    'gridRowEnd',
    'gridRowStart',
    'gridRowStart',
    'gridTemplate',
    'gridTemplate',
    'gridTemplateAreas',
    'gridTemplateAreas',
    'gridTemplateColumns',
    'gridTemplateColumns',
    'gridTemplateRows',
    'gridTemplateRows',
    'height',
    'height',
    'highlight',
    'highlight',
    'hyphenateCharacter',
    'hyphenateCharacter',
    'imageRendering',
    'imageRendering',
    'isolation',
    'isolation',
    'justifyContent',
    'justifyContent',
    'justifySelf',
    'justifySelf',
    'left',
    'left',
    'letterSpacing',
    'letterSpacing',
    'lineBoxContain',
    'lineBoxContain',
    'lineBreak',
    'lineBreak',
    'lineClamp',
    'lineClamp',
    'lineHeight',
    'lineHeight',
    'listStyle',
    'listStyle',
    'listStyleImage',
    'listStyleImage',
    'listStylePosition',
    'listStylePosition',
    'listStyleType',
    'listStyleType',
    'locale',
    'locale',
    'logicalHeight',
    'logicalHeight',
    'logicalWidth',
    'logicalWidth',
    'margin',
    'margin',
    'marginAfter',
    'marginAfter',
    'marginAfterCollapse',
    'marginAfterCollapse',
    'marginBefore',
    'marginBefore',
    'marginBeforeCollapse',
    'marginBeforeCollapse',
    'marginBottom',
    'marginBottom',
    'marginBottomCollapse',
    'marginBottomCollapse',
    'marginCollapse',
    'marginCollapse',
    'marginEnd',
    'marginEnd',
    'marginLeft',
    'marginLeft',
    'marginRight',
    'marginRight',
    'marginStart',
    'marginStart',
    'marginTop',
    'marginTop',
    'marginTopCollapse',
    'marginTopCollapse',
    'mask',
    'mask',
    'maskBoxImage',
    'maskBoxImage',
    'maskBoxImageOutset',
    'maskBoxImageOutset',
    'maskBoxImageRepeat',
    'maskBoxImageRepeat',
    'maskBoxImageSlice',
    'maskBoxImageSlice',
    'maskBoxImageSource',
    'maskBoxImageSource',
    'maskBoxImageWidth',
    'maskBoxImageWidth',
    'maskClip',
    'maskClip',
    'maskComposite',
    'maskComposite',
    'maskImage',
    'maskImage',
    'maskOrigin',
    'maskOrigin',
    'maskPosition',
    'maskPosition',
    'maskPositionX',
    'maskPositionX',
    'maskPositionY',
    'maskPositionY',
    'maskRepeat',
    'maskRepeat',
    'maskRepeatX',
    'maskRepeatX',
    'maskRepeatY',
    'maskRepeatY',
    'maskSize',
    'maskSize',
    'maskSourceType',
    'maskSourceType',
    'maxHeight',
    'maxHeight',
    'maxLogicalHeight',
    'maxLogicalHeight',
    'maxLogicalWidth',
    'maxLogicalWidth',
    'maxWidth',
    'maxWidth',
    'maxZoom',
    'maxZoom',
    'minHeight',
    'minHeight',
    'minLogicalHeight',
    'minLogicalHeight',
    'minLogicalWidth',
    'minLogicalWidth',
    'minWidth',
    'minWidth',
    'minZoom',
    'minZoom',
    'mixBlendMode',
    'mixBlendMode',
    'objectFit',
    'objectFit',
    'objectPosition',
    'objectPosition',
    'opacity',
    'opacity',
    'order',
    'order',
    'orientation',
    'orientation',
    'orphans',
    'orphans',
    'outline',
    'outline',
    'outlineColor',
    'outlineColor',
    'outlineOffset',
    'outlineOffset',
    'outlineStyle',
    'outlineStyle',
    'outlineWidth',
    'outlineWidth',
    'overflow',
    'overflow',
    'overflowWrap',
    'overflowWrap',
    'overflowX',
    'overflowX',
    'overflowY',
    'overflowY',
    'padding',
    'padding',
    'paddingAfter',
    'paddingAfter',
    'paddingBefore',
    'paddingBefore',
    'paddingBottom',
    'paddingBottom',
    'paddingEnd',
    'paddingEnd',
    'paddingLeft',
    'paddingLeft',
    'paddingRight',
    'paddingRight',
    'paddingStart',
    'paddingStart',
    'paddingTop',
    'paddingTop',
    'page',
    'page',
    'pageBreakAfter',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakBefore',
    'pageBreakInside',
    'pageBreakInside',
    'perspective',
    'perspective',
    'perspectiveOrigin',
    'perspectiveOrigin',
    'perspectiveOriginX',
    'perspectiveOriginX',
    'perspectiveOriginY',
    'perspectiveOriginY',
    'pointerEvents',
    'pointerEvents',
    'position',
    'position',
    'printColorAdjust',
    'printColorAdjust',
    'quotes',
    'quotes',
    'resize',
    'resize',
    'right',
    'right',
    'rtlOrdering',
    'rtlOrdering',
    'rubyPosition',
    'rubyPosition',
    'scrollBehavior',
    'scrollBehavior',
    'shapeImageThreshold',
    'shapeImageThreshold',
    'shapeMargin',
    'shapeMargin',
    'shapeOutside',
    'shapeOutside',
    'size',
    'size',
    'speak',
    'speak',
    'src',
    'src',
    'tabSize',
    'tabSize',
    'tableLayout',
    'tableLayout',
    'tapHighlightColor',
    'tapHighlightColor',
    'textAlign',
    'textAlign',
    'textAlignLast',
    'textAlignLast',
    'textCombine',
    'textCombine',
    'textDecoration',
    'textDecoration',
    'textDecorationColor',
    'textDecorationColor',
    'textDecorationLine',
    'textDecorationLine',
    'textDecorationStyle',
    'textDecorationStyle',
    'textDecorationsInEffect',
    'textDecorationsInEffect',
    'textEmphasis',
    'textEmphasis',
    'textEmphasisColor',
    'textEmphasisColor',
    'textEmphasisPosition',
    'textEmphasisPosition',
    'textEmphasisStyle',
    'textEmphasisStyle',
    'textFillColor',
    'textFillColor',
    'textIndent',
    'textIndent',
    'textJustify',
    'textJustify',
    'textLineThroughColor',
    'textLineThroughColor',
    'textLineThroughMode',
    'textLineThroughMode',
    'textLineThroughStyle',
    'textLineThroughStyle',
    'textLineThroughWidth',
    'textLineThroughWidth',
    'textOrientation',
    'textOrientation',
    'textOverflow',
    'textOverflow',
    'textOverlineColor',
    'textOverlineColor',
    'textOverlineMode',
    'textOverlineMode',
    'textOverlineStyle',
    'textOverlineStyle',
    'textOverlineWidth',
    'textOverlineWidth',
    'textRendering',
    'textRendering',
    'textSecurity',
    'textSecurity',
    'textShadow',
    'textShadow',
    'textStroke',
    'textStroke',
    'textStrokeColor',
    'textStrokeColor',
    'textStrokeWidth',
    'textStrokeWidth',
    'textTransform',
    'textTransform',
    'textUnderlineColor',
    'textUnderlineColor',
    'textUnderlineMode',
    'textUnderlineMode',
    'textUnderlinePosition',
    'textUnderlinePosition',
    'textUnderlineStyle',
    'textUnderlineStyle',
    'textUnderlineWidth',
    'textUnderlineWidth',
    'top',
    'top',
    'touchAction',
    'touchAction',
    'touchActionDelay',
    'touchActionDelay',
    'transform',
    'transform',
    'transformOrigin',
    'transformOrigin',
    'transformOriginX',
    'transformOriginX',
    'transformOriginY',
    'transformOriginY',
    'transformOriginZ',
    'transformOriginZ',
    'transformStyle',
    'transformStyle',
    'transition',
    'transition',
    'transitionDelay',
    'transitionDelay',
    'transitionDuration',
    'transitionDuration',
    'transitionProperty',
    'transitionProperty',
    'transitionTimingFunction',
    'transitionTimingFunction',
    'unicodeBidi',
    'unicodeBidi',
    'unicodeRange',
    'unicodeRange',
    'userDrag',
    'userDrag',
    'userModify',
    'userModify',
    'userSelect',
    'userSelect',
    'userZoom',
    'userZoom',
    'verticalAlign',
    'verticalAlign',
    'visibility',
    'visibility',
    'whiteSpace',
    'whiteSpace',
    'widows',
    'widows',
    'width',
    'width',
    'willChange',
    'willChange',
    'wordBreak',
    'wordBreak',
    'wordSpacing',
    'wordSpacing',
    'wordWrap',
    'wordWrap',
    'wrapFlow',
    'wrapFlow',
    'wrapThrough',
    'wrapThrough',
    'writingMode',
    'writingMode',
    'zIndex',
    'zIndex',
    'zoom',
    'zoom'
  ]);
  html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
    get alignContent() {
      return this[dartx.getPropertyValue]('align-content');
    }
    set alignContent(value) {
      this[dartx.setProperty]('align-content', value, '');
    }
    get alignItems() {
      return this[dartx.getPropertyValue]('align-items');
    }
    set alignItems(value) {
      this[dartx.setProperty]('align-items', value, '');
    }
    get alignSelf() {
      return this[dartx.getPropertyValue]('align-self');
    }
    set alignSelf(value) {
      this[dartx.setProperty]('align-self', value, '');
    }
    get animation() {
      return this[dartx.getPropertyValue]('animation');
    }
    set animation(value) {
      this[dartx.setProperty]('animation', value, '');
    }
    get animationDelay() {
      return this[dartx.getPropertyValue]('animation-delay');
    }
    set animationDelay(value) {
      this[dartx.setProperty]('animation-delay', value, '');
    }
    get animationDirection() {
      return this[dartx.getPropertyValue]('animation-direction');
    }
    set animationDirection(value) {
      this[dartx.setProperty]('animation-direction', value, '');
    }
    get animationDuration() {
      return this[dartx.getPropertyValue]('animation-duration');
    }
    set animationDuration(value) {
      this[dartx.setProperty]('animation-duration', value, '');
    }
    get animationFillMode() {
      return this[dartx.getPropertyValue]('animation-fill-mode');
    }
    set animationFillMode(value) {
      this[dartx.setProperty]('animation-fill-mode', value, '');
    }
    get animationIterationCount() {
      return this[dartx.getPropertyValue]('animation-iteration-count');
    }
    set animationIterationCount(value) {
      this[dartx.setProperty]('animation-iteration-count', value, '');
    }
    get animationName() {
      return this[dartx.getPropertyValue]('animation-name');
    }
    set animationName(value) {
      this[dartx.setProperty]('animation-name', value, '');
    }
    get animationPlayState() {
      return this[dartx.getPropertyValue]('animation-play-state');
    }
    set animationPlayState(value) {
      this[dartx.setProperty]('animation-play-state', value, '');
    }
    get animationTimingFunction() {
      return this[dartx.getPropertyValue]('animation-timing-function');
    }
    set animationTimingFunction(value) {
      this[dartx.setProperty]('animation-timing-function', value, '');
    }
    get appRegion() {
      return this[dartx.getPropertyValue]('app-region');
    }
    set appRegion(value) {
      this[dartx.setProperty]('app-region', value, '');
    }
    get appearance() {
      return this[dartx.getPropertyValue]('appearance');
    }
    set appearance(value) {
      this[dartx.setProperty]('appearance', value, '');
    }
    get aspectRatio() {
      return this[dartx.getPropertyValue]('aspect-ratio');
    }
    set aspectRatio(value) {
      this[dartx.setProperty]('aspect-ratio', value, '');
    }
    get backfaceVisibility() {
      return this[dartx.getPropertyValue]('backface-visibility');
    }
    set backfaceVisibility(value) {
      this[dartx.setProperty]('backface-visibility', value, '');
    }
    get background() {
      return this[dartx.getPropertyValue]('background');
    }
    set background(value) {
      this[dartx.setProperty]('background', value, '');
    }
    get backgroundAttachment() {
      return this[dartx.getPropertyValue]('background-attachment');
    }
    set backgroundAttachment(value) {
      this[dartx.setProperty]('background-attachment', value, '');
    }
    get backgroundBlendMode() {
      return this[dartx.getPropertyValue]('background-blend-mode');
    }
    set backgroundBlendMode(value) {
      this[dartx.setProperty]('background-blend-mode', value, '');
    }
    get backgroundClip() {
      return this[dartx.getPropertyValue]('background-clip');
    }
    set backgroundClip(value) {
      this[dartx.setProperty]('background-clip', value, '');
    }
    get backgroundColor() {
      return this[dartx.getPropertyValue]('background-color');
    }
    set backgroundColor(value) {
      this[dartx.setProperty]('background-color', value, '');
    }
    get backgroundComposite() {
      return this[dartx.getPropertyValue]('background-composite');
    }
    set backgroundComposite(value) {
      this[dartx.setProperty]('background-composite', value, '');
    }
    get backgroundImage() {
      return this[dartx.getPropertyValue]('background-image');
    }
    set backgroundImage(value) {
      this[dartx.setProperty]('background-image', value, '');
    }
    get backgroundOrigin() {
      return this[dartx.getPropertyValue]('background-origin');
    }
    set backgroundOrigin(value) {
      this[dartx.setProperty]('background-origin', value, '');
    }
    get backgroundPosition() {
      return this[dartx.getPropertyValue]('background-position');
    }
    set backgroundPosition(value) {
      this[dartx.setProperty]('background-position', value, '');
    }
    get backgroundPositionX() {
      return this[dartx.getPropertyValue]('background-position-x');
    }
    set backgroundPositionX(value) {
      this[dartx.setProperty]('background-position-x', value, '');
    }
    get backgroundPositionY() {
      return this[dartx.getPropertyValue]('background-position-y');
    }
    set backgroundPositionY(value) {
      this[dartx.setProperty]('background-position-y', value, '');
    }
    get backgroundRepeat() {
      return this[dartx.getPropertyValue]('background-repeat');
    }
    set backgroundRepeat(value) {
      this[dartx.setProperty]('background-repeat', value, '');
    }
    get backgroundRepeatX() {
      return this[dartx.getPropertyValue]('background-repeat-x');
    }
    set backgroundRepeatX(value) {
      this[dartx.setProperty]('background-repeat-x', value, '');
    }
    get backgroundRepeatY() {
      return this[dartx.getPropertyValue]('background-repeat-y');
    }
    set backgroundRepeatY(value) {
      this[dartx.setProperty]('background-repeat-y', value, '');
    }
    get backgroundSize() {
      return this[dartx.getPropertyValue]('background-size');
    }
    set backgroundSize(value) {
      this[dartx.setProperty]('background-size', value, '');
    }
    get border() {
      return this[dartx.getPropertyValue]('border');
    }
    set border(value) {
      this[dartx.setProperty]('border', value, '');
    }
    get borderAfter() {
      return this[dartx.getPropertyValue]('border-after');
    }
    set borderAfter(value) {
      this[dartx.setProperty]('border-after', value, '');
    }
    get borderAfterColor() {
      return this[dartx.getPropertyValue]('border-after-color');
    }
    set borderAfterColor(value) {
      this[dartx.setProperty]('border-after-color', value, '');
    }
    get borderAfterStyle() {
      return this[dartx.getPropertyValue]('border-after-style');
    }
    set borderAfterStyle(value) {
      this[dartx.setProperty]('border-after-style', value, '');
    }
    get borderAfterWidth() {
      return this[dartx.getPropertyValue]('border-after-width');
    }
    set borderAfterWidth(value) {
      this[dartx.setProperty]('border-after-width', value, '');
    }
    get borderBefore() {
      return this[dartx.getPropertyValue]('border-before');
    }
    set borderBefore(value) {
      this[dartx.setProperty]('border-before', value, '');
    }
    get borderBeforeColor() {
      return this[dartx.getPropertyValue]('border-before-color');
    }
    set borderBeforeColor(value) {
      this[dartx.setProperty]('border-before-color', value, '');
    }
    get borderBeforeStyle() {
      return this[dartx.getPropertyValue]('border-before-style');
    }
    set borderBeforeStyle(value) {
      this[dartx.setProperty]('border-before-style', value, '');
    }
    get borderBeforeWidth() {
      return this[dartx.getPropertyValue]('border-before-width');
    }
    set borderBeforeWidth(value) {
      this[dartx.setProperty]('border-before-width', value, '');
    }
    get borderBottom() {
      return this[dartx.getPropertyValue]('border-bottom');
    }
    set borderBottom(value) {
      this[dartx.setProperty]('border-bottom', value, '');
    }
    get borderBottomColor() {
      return this[dartx.getPropertyValue]('border-bottom-color');
    }
    set borderBottomColor(value) {
      this[dartx.setProperty]('border-bottom-color', value, '');
    }
    get borderBottomLeftRadius() {
      return this[dartx.getPropertyValue]('border-bottom-left-radius');
    }
    set borderBottomLeftRadius(value) {
      this[dartx.setProperty]('border-bottom-left-radius', value, '');
    }
    get borderBottomRightRadius() {
      return this[dartx.getPropertyValue]('border-bottom-right-radius');
    }
    set borderBottomRightRadius(value) {
      this[dartx.setProperty]('border-bottom-right-radius', value, '');
    }
    get borderBottomStyle() {
      return this[dartx.getPropertyValue]('border-bottom-style');
    }
    set borderBottomStyle(value) {
      this[dartx.setProperty]('border-bottom-style', value, '');
    }
    get borderBottomWidth() {
      return this[dartx.getPropertyValue]('border-bottom-width');
    }
    set borderBottomWidth(value) {
      this[dartx.setProperty]('border-bottom-width', value, '');
    }
    get borderCollapse() {
      return this[dartx.getPropertyValue]('border-collapse');
    }
    set borderCollapse(value) {
      this[dartx.setProperty]('border-collapse', value, '');
    }
    get borderColor() {
      return this[dartx.getPropertyValue]('border-color');
    }
    set borderColor(value) {
      this[dartx.setProperty]('border-color', value, '');
    }
    get borderEnd() {
      return this[dartx.getPropertyValue]('border-end');
    }
    set borderEnd(value) {
      this[dartx.setProperty]('border-end', value, '');
    }
    get borderEndColor() {
      return this[dartx.getPropertyValue]('border-end-color');
    }
    set borderEndColor(value) {
      this[dartx.setProperty]('border-end-color', value, '');
    }
    get borderEndStyle() {
      return this[dartx.getPropertyValue]('border-end-style');
    }
    set borderEndStyle(value) {
      this[dartx.setProperty]('border-end-style', value, '');
    }
    get borderEndWidth() {
      return this[dartx.getPropertyValue]('border-end-width');
    }
    set borderEndWidth(value) {
      this[dartx.setProperty]('border-end-width', value, '');
    }
    get borderFit() {
      return this[dartx.getPropertyValue]('border-fit');
    }
    set borderFit(value) {
      this[dartx.setProperty]('border-fit', value, '');
    }
    get borderHorizontalSpacing() {
      return this[dartx.getPropertyValue]('border-horizontal-spacing');
    }
    set borderHorizontalSpacing(value) {
      this[dartx.setProperty]('border-horizontal-spacing', value, '');
    }
    get borderImage() {
      return this[dartx.getPropertyValue]('border-image');
    }
    set borderImage(value) {
      this[dartx.setProperty]('border-image', value, '');
    }
    get borderImageOutset() {
      return this[dartx.getPropertyValue]('border-image-outset');
    }
    set borderImageOutset(value) {
      this[dartx.setProperty]('border-image-outset', value, '');
    }
    get borderImageRepeat() {
      return this[dartx.getPropertyValue]('border-image-repeat');
    }
    set borderImageRepeat(value) {
      this[dartx.setProperty]('border-image-repeat', value, '');
    }
    get borderImageSlice() {
      return this[dartx.getPropertyValue]('border-image-slice');
    }
    set borderImageSlice(value) {
      this[dartx.setProperty]('border-image-slice', value, '');
    }
    get borderImageSource() {
      return this[dartx.getPropertyValue]('border-image-source');
    }
    set borderImageSource(value) {
      this[dartx.setProperty]('border-image-source', value, '');
    }
    get borderImageWidth() {
      return this[dartx.getPropertyValue]('border-image-width');
    }
    set borderImageWidth(value) {
      this[dartx.setProperty]('border-image-width', value, '');
    }
    get borderLeft() {
      return this[dartx.getPropertyValue]('border-left');
    }
    set borderLeft(value) {
      this[dartx.setProperty]('border-left', value, '');
    }
    get borderLeftColor() {
      return this[dartx.getPropertyValue]('border-left-color');
    }
    set borderLeftColor(value) {
      this[dartx.setProperty]('border-left-color', value, '');
    }
    get borderLeftStyle() {
      return this[dartx.getPropertyValue]('border-left-style');
    }
    set borderLeftStyle(value) {
      this[dartx.setProperty]('border-left-style', value, '');
    }
    get borderLeftWidth() {
      return this[dartx.getPropertyValue]('border-left-width');
    }
    set borderLeftWidth(value) {
      this[dartx.setProperty]('border-left-width', value, '');
    }
    get borderRadius() {
      return this[dartx.getPropertyValue]('border-radius');
    }
    set borderRadius(value) {
      this[dartx.setProperty]('border-radius', value, '');
    }
    get borderRight() {
      return this[dartx.getPropertyValue]('border-right');
    }
    set borderRight(value) {
      this[dartx.setProperty]('border-right', value, '');
    }
    get borderRightColor() {
      return this[dartx.getPropertyValue]('border-right-color');
    }
    set borderRightColor(value) {
      this[dartx.setProperty]('border-right-color', value, '');
    }
    get borderRightStyle() {
      return this[dartx.getPropertyValue]('border-right-style');
    }
    set borderRightStyle(value) {
      this[dartx.setProperty]('border-right-style', value, '');
    }
    get borderRightWidth() {
      return this[dartx.getPropertyValue]('border-right-width');
    }
    set borderRightWidth(value) {
      this[dartx.setProperty]('border-right-width', value, '');
    }
    get borderSpacing() {
      return this[dartx.getPropertyValue]('border-spacing');
    }
    set borderSpacing(value) {
      this[dartx.setProperty]('border-spacing', value, '');
    }
    get borderStart() {
      return this[dartx.getPropertyValue]('border-start');
    }
    set borderStart(value) {
      this[dartx.setProperty]('border-start', value, '');
    }
    get borderStartColor() {
      return this[dartx.getPropertyValue]('border-start-color');
    }
    set borderStartColor(value) {
      this[dartx.setProperty]('border-start-color', value, '');
    }
    get borderStartStyle() {
      return this[dartx.getPropertyValue]('border-start-style');
    }
    set borderStartStyle(value) {
      this[dartx.setProperty]('border-start-style', value, '');
    }
    get borderStartWidth() {
      return this[dartx.getPropertyValue]('border-start-width');
    }
    set borderStartWidth(value) {
      this[dartx.setProperty]('border-start-width', value, '');
    }
    get borderStyle() {
      return this[dartx.getPropertyValue]('border-style');
    }
    set borderStyle(value) {
      this[dartx.setProperty]('border-style', value, '');
    }
    get borderTop() {
      return this[dartx.getPropertyValue]('border-top');
    }
    set borderTop(value) {
      this[dartx.setProperty]('border-top', value, '');
    }
    get borderTopColor() {
      return this[dartx.getPropertyValue]('border-top-color');
    }
    set borderTopColor(value) {
      this[dartx.setProperty]('border-top-color', value, '');
    }
    get borderTopLeftRadius() {
      return this[dartx.getPropertyValue]('border-top-left-radius');
    }
    set borderTopLeftRadius(value) {
      this[dartx.setProperty]('border-top-left-radius', value, '');
    }
    get borderTopRightRadius() {
      return this[dartx.getPropertyValue]('border-top-right-radius');
    }
    set borderTopRightRadius(value) {
      this[dartx.setProperty]('border-top-right-radius', value, '');
    }
    get borderTopStyle() {
      return this[dartx.getPropertyValue]('border-top-style');
    }
    set borderTopStyle(value) {
      this[dartx.setProperty]('border-top-style', value, '');
    }
    get borderTopWidth() {
      return this[dartx.getPropertyValue]('border-top-width');
    }
    set borderTopWidth(value) {
      this[dartx.setProperty]('border-top-width', value, '');
    }
    get borderVerticalSpacing() {
      return this[dartx.getPropertyValue]('border-vertical-spacing');
    }
    set borderVerticalSpacing(value) {
      this[dartx.setProperty]('border-vertical-spacing', value, '');
    }
    get borderWidth() {
      return this[dartx.getPropertyValue]('border-width');
    }
    set borderWidth(value) {
      this[dartx.setProperty]('border-width', value, '');
    }
    get bottom() {
      return this[dartx.getPropertyValue]('bottom');
    }
    set bottom(value) {
      this[dartx.setProperty]('bottom', value, '');
    }
    get boxAlign() {
      return this[dartx.getPropertyValue]('box-align');
    }
    set boxAlign(value) {
      this[dartx.setProperty]('box-align', value, '');
    }
    get boxDecorationBreak() {
      return this[dartx.getPropertyValue]('box-decoration-break');
    }
    set boxDecorationBreak(value) {
      this[dartx.setProperty]('box-decoration-break', value, '');
    }
    get boxDirection() {
      return this[dartx.getPropertyValue]('box-direction');
    }
    set boxDirection(value) {
      this[dartx.setProperty]('box-direction', value, '');
    }
    get boxFlex() {
      return this[dartx.getPropertyValue]('box-flex');
    }
    set boxFlex(value) {
      this[dartx.setProperty]('box-flex', value, '');
    }
    get boxFlexGroup() {
      return this[dartx.getPropertyValue]('box-flex-group');
    }
    set boxFlexGroup(value) {
      this[dartx.setProperty]('box-flex-group', value, '');
    }
    get boxLines() {
      return this[dartx.getPropertyValue]('box-lines');
    }
    set boxLines(value) {
      this[dartx.setProperty]('box-lines', value, '');
    }
    get boxOrdinalGroup() {
      return this[dartx.getPropertyValue]('box-ordinal-group');
    }
    set boxOrdinalGroup(value) {
      this[dartx.setProperty]('box-ordinal-group', value, '');
    }
    get boxOrient() {
      return this[dartx.getPropertyValue]('box-orient');
    }
    set boxOrient(value) {
      this[dartx.setProperty]('box-orient', value, '');
    }
    get boxPack() {
      return this[dartx.getPropertyValue]('box-pack');
    }
    set boxPack(value) {
      this[dartx.setProperty]('box-pack', value, '');
    }
    get boxReflect() {
      return this[dartx.getPropertyValue]('box-reflect');
    }
    set boxReflect(value) {
      this[dartx.setProperty]('box-reflect', value, '');
    }
    get boxShadow() {
      return this[dartx.getPropertyValue]('box-shadow');
    }
    set boxShadow(value) {
      this[dartx.setProperty]('box-shadow', value, '');
    }
    get boxSizing() {
      return this[dartx.getPropertyValue]('box-sizing');
    }
    set boxSizing(value) {
      this[dartx.setProperty]('box-sizing', value, '');
    }
    get captionSide() {
      return this[dartx.getPropertyValue]('caption-side');
    }
    set captionSide(value) {
      this[dartx.setProperty]('caption-side', value, '');
    }
    get clear() {
      return this[dartx.getPropertyValue]('clear');
    }
    set clear(value) {
      this[dartx.setProperty]('clear', value, '');
    }
    get clip() {
      return this[dartx.getPropertyValue]('clip');
    }
    set clip(value) {
      this[dartx.setProperty]('clip', value, '');
    }
    get clipPath() {
      return this[dartx.getPropertyValue]('clip-path');
    }
    set clipPath(value) {
      this[dartx.setProperty]('clip-path', value, '');
    }
    get color() {
      return this[dartx.getPropertyValue]('color');
    }
    set color(value) {
      this[dartx.setProperty]('color', value, '');
    }
    get columnBreakAfter() {
      return this[dartx.getPropertyValue]('column-break-after');
    }
    set columnBreakAfter(value) {
      this[dartx.setProperty]('column-break-after', value, '');
    }
    get columnBreakBefore() {
      return this[dartx.getPropertyValue]('column-break-before');
    }
    set columnBreakBefore(value) {
      this[dartx.setProperty]('column-break-before', value, '');
    }
    get columnBreakInside() {
      return this[dartx.getPropertyValue]('column-break-inside');
    }
    set columnBreakInside(value) {
      this[dartx.setProperty]('column-break-inside', value, '');
    }
    get columnCount() {
      return this[dartx.getPropertyValue]('column-count');
    }
    set columnCount(value) {
      this[dartx.setProperty]('column-count', value, '');
    }
    get columnFill() {
      return this[dartx.getPropertyValue]('column-fill');
    }
    set columnFill(value) {
      this[dartx.setProperty]('column-fill', value, '');
    }
    get columnGap() {
      return this[dartx.getPropertyValue]('column-gap');
    }
    set columnGap(value) {
      this[dartx.setProperty]('column-gap', value, '');
    }
    get columnRule() {
      return this[dartx.getPropertyValue]('column-rule');
    }
    set columnRule(value) {
      this[dartx.setProperty]('column-rule', value, '');
    }
    get columnRuleColor() {
      return this[dartx.getPropertyValue]('column-rule-color');
    }
    set columnRuleColor(value) {
      this[dartx.setProperty]('column-rule-color', value, '');
    }
    get columnRuleStyle() {
      return this[dartx.getPropertyValue]('column-rule-style');
    }
    set columnRuleStyle(value) {
      this[dartx.setProperty]('column-rule-style', value, '');
    }
    get columnRuleWidth() {
      return this[dartx.getPropertyValue]('column-rule-width');
    }
    set columnRuleWidth(value) {
      this[dartx.setProperty]('column-rule-width', value, '');
    }
    get columnSpan() {
      return this[dartx.getPropertyValue]('column-span');
    }
    set columnSpan(value) {
      this[dartx.setProperty]('column-span', value, '');
    }
    get columnWidth() {
      return this[dartx.getPropertyValue]('column-width');
    }
    set columnWidth(value) {
      this[dartx.setProperty]('column-width', value, '');
    }
    get columns() {
      return this[dartx.getPropertyValue]('columns');
    }
    set columns(value) {
      this[dartx.setProperty]('columns', value, '');
    }
    get content() {
      return this[dartx.getPropertyValue]('content');
    }
    set content(value) {
      this[dartx.setProperty]('content', value, '');
    }
    get counterIncrement() {
      return this[dartx.getPropertyValue]('counter-increment');
    }
    set counterIncrement(value) {
      this[dartx.setProperty]('counter-increment', value, '');
    }
    get counterReset() {
      return this[dartx.getPropertyValue]('counter-reset');
    }
    set counterReset(value) {
      this[dartx.setProperty]('counter-reset', value, '');
    }
    get cursor() {
      return this[dartx.getPropertyValue]('cursor');
    }
    set cursor(value) {
      this[dartx.setProperty]('cursor', value, '');
    }
    get direction() {
      return this[dartx.getPropertyValue]('direction');
    }
    set direction(value) {
      this[dartx.setProperty]('direction', value, '');
    }
    get display() {
      return this[dartx.getPropertyValue]('display');
    }
    set display(value) {
      this[dartx.setProperty]('display', value, '');
    }
    get emptyCells() {
      return this[dartx.getPropertyValue]('empty-cells');
    }
    set emptyCells(value) {
      this[dartx.setProperty]('empty-cells', value, '');
    }
    get filter() {
      return this[dartx.getPropertyValue]('filter');
    }
    set filter(value) {
      this[dartx.setProperty]('filter', value, '');
    }
    get flex() {
      return this[dartx.getPropertyValue]('flex');
    }
    set flex(value) {
      this[dartx.setProperty]('flex', value, '');
    }
    get flexBasis() {
      return this[dartx.getPropertyValue]('flex-basis');
    }
    set flexBasis(value) {
      this[dartx.setProperty]('flex-basis', value, '');
    }
    get flexDirection() {
      return this[dartx.getPropertyValue]('flex-direction');
    }
    set flexDirection(value) {
      this[dartx.setProperty]('flex-direction', value, '');
    }
    get flexFlow() {
      return this[dartx.getPropertyValue]('flex-flow');
    }
    set flexFlow(value) {
      this[dartx.setProperty]('flex-flow', value, '');
    }
    get flexGrow() {
      return this[dartx.getPropertyValue]('flex-grow');
    }
    set flexGrow(value) {
      this[dartx.setProperty]('flex-grow', value, '');
    }
    get flexShrink() {
      return this[dartx.getPropertyValue]('flex-shrink');
    }
    set flexShrink(value) {
      this[dartx.setProperty]('flex-shrink', value, '');
    }
    get flexWrap() {
      return this[dartx.getPropertyValue]('flex-wrap');
    }
    set flexWrap(value) {
      this[dartx.setProperty]('flex-wrap', value, '');
    }
    get float() {
      return this[dartx.getPropertyValue]('float');
    }
    set float(value) {
      this[dartx.setProperty]('float', value, '');
    }
    get font() {
      return this[dartx.getPropertyValue]('font');
    }
    set font(value) {
      this[dartx.setProperty]('font', value, '');
    }
    get fontFamily() {
      return this[dartx.getPropertyValue]('font-family');
    }
    set fontFamily(value) {
      this[dartx.setProperty]('font-family', value, '');
    }
    get fontFeatureSettings() {
      return this[dartx.getPropertyValue]('font-feature-settings');
    }
    set fontFeatureSettings(value) {
      this[dartx.setProperty]('font-feature-settings', value, '');
    }
    get fontKerning() {
      return this[dartx.getPropertyValue]('font-kerning');
    }
    set fontKerning(value) {
      this[dartx.setProperty]('font-kerning', value, '');
    }
    get fontSize() {
      return this[dartx.getPropertyValue]('font-size');
    }
    set fontSize(value) {
      this[dartx.setProperty]('font-size', value, '');
    }
    get fontSizeDelta() {
      return this[dartx.getPropertyValue]('font-size-delta');
    }
    set fontSizeDelta(value) {
      this[dartx.setProperty]('font-size-delta', value, '');
    }
    get fontSmoothing() {
      return this[dartx.getPropertyValue]('font-smoothing');
    }
    set fontSmoothing(value) {
      this[dartx.setProperty]('font-smoothing', value, '');
    }
    get fontStretch() {
      return this[dartx.getPropertyValue]('font-stretch');
    }
    set fontStretch(value) {
      this[dartx.setProperty]('font-stretch', value, '');
    }
    get fontStyle() {
      return this[dartx.getPropertyValue]('font-style');
    }
    set fontStyle(value) {
      this[dartx.setProperty]('font-style', value, '');
    }
    get fontVariant() {
      return this[dartx.getPropertyValue]('font-variant');
    }
    set fontVariant(value) {
      this[dartx.setProperty]('font-variant', value, '');
    }
    get fontVariantLigatures() {
      return this[dartx.getPropertyValue]('font-variant-ligatures');
    }
    set fontVariantLigatures(value) {
      this[dartx.setProperty]('font-variant-ligatures', value, '');
    }
    get fontWeight() {
      return this[dartx.getPropertyValue]('font-weight');
    }
    set fontWeight(value) {
      this[dartx.setProperty]('font-weight', value, '');
    }
    get grid() {
      return this[dartx.getPropertyValue]('grid');
    }
    set grid(value) {
      this[dartx.setProperty]('grid', value, '');
    }
    get gridArea() {
      return this[dartx.getPropertyValue]('grid-area');
    }
    set gridArea(value) {
      this[dartx.setProperty]('grid-area', value, '');
    }
    get gridAutoColumns() {
      return this[dartx.getPropertyValue]('grid-auto-columns');
    }
    set gridAutoColumns(value) {
      this[dartx.setProperty]('grid-auto-columns', value, '');
    }
    get gridAutoFlow() {
      return this[dartx.getPropertyValue]('grid-auto-flow');
    }
    set gridAutoFlow(value) {
      this[dartx.setProperty]('grid-auto-flow', value, '');
    }
    get gridAutoRows() {
      return this[dartx.getPropertyValue]('grid-auto-rows');
    }
    set gridAutoRows(value) {
      this[dartx.setProperty]('grid-auto-rows', value, '');
    }
    get gridColumn() {
      return this[dartx.getPropertyValue]('grid-column');
    }
    set gridColumn(value) {
      this[dartx.setProperty]('grid-column', value, '');
    }
    get gridColumnEnd() {
      return this[dartx.getPropertyValue]('grid-column-end');
    }
    set gridColumnEnd(value) {
      this[dartx.setProperty]('grid-column-end', value, '');
    }
    get gridColumnStart() {
      return this[dartx.getPropertyValue]('grid-column-start');
    }
    set gridColumnStart(value) {
      this[dartx.setProperty]('grid-column-start', value, '');
    }
    get gridRow() {
      return this[dartx.getPropertyValue]('grid-row');
    }
    set gridRow(value) {
      this[dartx.setProperty]('grid-row', value, '');
    }
    get gridRowEnd() {
      return this[dartx.getPropertyValue]('grid-row-end');
    }
    set gridRowEnd(value) {
      this[dartx.setProperty]('grid-row-end', value, '');
    }
    get gridRowStart() {
      return this[dartx.getPropertyValue]('grid-row-start');
    }
    set gridRowStart(value) {
      this[dartx.setProperty]('grid-row-start', value, '');
    }
    get gridTemplate() {
      return this[dartx.getPropertyValue]('grid-template');
    }
    set gridTemplate(value) {
      this[dartx.setProperty]('grid-template', value, '');
    }
    get gridTemplateAreas() {
      return this[dartx.getPropertyValue]('grid-template-areas');
    }
    set gridTemplateAreas(value) {
      this[dartx.setProperty]('grid-template-areas', value, '');
    }
    get gridTemplateColumns() {
      return this[dartx.getPropertyValue]('grid-template-columns');
    }
    set gridTemplateColumns(value) {
      this[dartx.setProperty]('grid-template-columns', value, '');
    }
    get gridTemplateRows() {
      return this[dartx.getPropertyValue]('grid-template-rows');
    }
    set gridTemplateRows(value) {
      this[dartx.setProperty]('grid-template-rows', value, '');
    }
    get height() {
      return this[dartx.getPropertyValue]('height');
    }
    set height(value) {
      this[dartx.setProperty]('height', value, '');
    }
    get highlight() {
      return this[dartx.getPropertyValue]('highlight');
    }
    set highlight(value) {
      this[dartx.setProperty]('highlight', value, '');
    }
    get hyphenateCharacter() {
      return this[dartx.getPropertyValue]('hyphenate-character');
    }
    set hyphenateCharacter(value) {
      this[dartx.setProperty]('hyphenate-character', value, '');
    }
    get imageRendering() {
      return this[dartx.getPropertyValue]('image-rendering');
    }
    set imageRendering(value) {
      this[dartx.setProperty]('image-rendering', value, '');
    }
    get isolation() {
      return this[dartx.getPropertyValue]('isolation');
    }
    set isolation(value) {
      this[dartx.setProperty]('isolation', value, '');
    }
    get justifyContent() {
      return this[dartx.getPropertyValue]('justify-content');
    }
    set justifyContent(value) {
      this[dartx.setProperty]('justify-content', value, '');
    }
    get justifySelf() {
      return this[dartx.getPropertyValue]('justify-self');
    }
    set justifySelf(value) {
      this[dartx.setProperty]('justify-self', value, '');
    }
    get left() {
      return this[dartx.getPropertyValue]('left');
    }
    set left(value) {
      this[dartx.setProperty]('left', value, '');
    }
    get letterSpacing() {
      return this[dartx.getPropertyValue]('letter-spacing');
    }
    set letterSpacing(value) {
      this[dartx.setProperty]('letter-spacing', value, '');
    }
    get lineBoxContain() {
      return this[dartx.getPropertyValue]('line-box-contain');
    }
    set lineBoxContain(value) {
      this[dartx.setProperty]('line-box-contain', value, '');
    }
    get lineBreak() {
      return this[dartx.getPropertyValue]('line-break');
    }
    set lineBreak(value) {
      this[dartx.setProperty]('line-break', value, '');
    }
    get lineClamp() {
      return this[dartx.getPropertyValue]('line-clamp');
    }
    set lineClamp(value) {
      this[dartx.setProperty]('line-clamp', value, '');
    }
    get lineHeight() {
      return this[dartx.getPropertyValue]('line-height');
    }
    set lineHeight(value) {
      this[dartx.setProperty]('line-height', value, '');
    }
    get listStyle() {
      return this[dartx.getPropertyValue]('list-style');
    }
    set listStyle(value) {
      this[dartx.setProperty]('list-style', value, '');
    }
    get listStyleImage() {
      return this[dartx.getPropertyValue]('list-style-image');
    }
    set listStyleImage(value) {
      this[dartx.setProperty]('list-style-image', value, '');
    }
    get listStylePosition() {
      return this[dartx.getPropertyValue]('list-style-position');
    }
    set listStylePosition(value) {
      this[dartx.setProperty]('list-style-position', value, '');
    }
    get listStyleType() {
      return this[dartx.getPropertyValue]('list-style-type');
    }
    set listStyleType(value) {
      this[dartx.setProperty]('list-style-type', value, '');
    }
    get locale() {
      return this[dartx.getPropertyValue]('locale');
    }
    set locale(value) {
      this[dartx.setProperty]('locale', value, '');
    }
    get logicalHeight() {
      return this[dartx.getPropertyValue]('logical-height');
    }
    set logicalHeight(value) {
      this[dartx.setProperty]('logical-height', value, '');
    }
    get logicalWidth() {
      return this[dartx.getPropertyValue]('logical-width');
    }
    set logicalWidth(value) {
      this[dartx.setProperty]('logical-width', value, '');
    }
    get margin() {
      return this[dartx.getPropertyValue]('margin');
    }
    set margin(value) {
      this[dartx.setProperty]('margin', value, '');
    }
    get marginAfter() {
      return this[dartx.getPropertyValue]('margin-after');
    }
    set marginAfter(value) {
      this[dartx.setProperty]('margin-after', value, '');
    }
    get marginAfterCollapse() {
      return this[dartx.getPropertyValue]('margin-after-collapse');
    }
    set marginAfterCollapse(value) {
      this[dartx.setProperty]('margin-after-collapse', value, '');
    }
    get marginBefore() {
      return this[dartx.getPropertyValue]('margin-before');
    }
    set marginBefore(value) {
      this[dartx.setProperty]('margin-before', value, '');
    }
    get marginBeforeCollapse() {
      return this[dartx.getPropertyValue]('margin-before-collapse');
    }
    set marginBeforeCollapse(value) {
      this[dartx.setProperty]('margin-before-collapse', value, '');
    }
    get marginBottom() {
      return this[dartx.getPropertyValue]('margin-bottom');
    }
    set marginBottom(value) {
      this[dartx.setProperty]('margin-bottom', value, '');
    }
    get marginBottomCollapse() {
      return this[dartx.getPropertyValue]('margin-bottom-collapse');
    }
    set marginBottomCollapse(value) {
      this[dartx.setProperty]('margin-bottom-collapse', value, '');
    }
    get marginCollapse() {
      return this[dartx.getPropertyValue]('margin-collapse');
    }
    set marginCollapse(value) {
      this[dartx.setProperty]('margin-collapse', value, '');
    }
    get marginEnd() {
      return this[dartx.getPropertyValue]('margin-end');
    }
    set marginEnd(value) {
      this[dartx.setProperty]('margin-end', value, '');
    }
    get marginLeft() {
      return this[dartx.getPropertyValue]('margin-left');
    }
    set marginLeft(value) {
      this[dartx.setProperty]('margin-left', value, '');
    }
    get marginRight() {
      return this[dartx.getPropertyValue]('margin-right');
    }
    set marginRight(value) {
      this[dartx.setProperty]('margin-right', value, '');
    }
    get marginStart() {
      return this[dartx.getPropertyValue]('margin-start');
    }
    set marginStart(value) {
      this[dartx.setProperty]('margin-start', value, '');
    }
    get marginTop() {
      return this[dartx.getPropertyValue]('margin-top');
    }
    set marginTop(value) {
      this[dartx.setProperty]('margin-top', value, '');
    }
    get marginTopCollapse() {
      return this[dartx.getPropertyValue]('margin-top-collapse');
    }
    set marginTopCollapse(value) {
      this[dartx.setProperty]('margin-top-collapse', value, '');
    }
    get mask() {
      return this[dartx.getPropertyValue]('mask');
    }
    set mask(value) {
      this[dartx.setProperty]('mask', value, '');
    }
    get maskBoxImage() {
      return this[dartx.getPropertyValue]('mask-box-image');
    }
    set maskBoxImage(value) {
      this[dartx.setProperty]('mask-box-image', value, '');
    }
    get maskBoxImageOutset() {
      return this[dartx.getPropertyValue]('mask-box-image-outset');
    }
    set maskBoxImageOutset(value) {
      this[dartx.setProperty]('mask-box-image-outset', value, '');
    }
    get maskBoxImageRepeat() {
      return this[dartx.getPropertyValue]('mask-box-image-repeat');
    }
    set maskBoxImageRepeat(value) {
      this[dartx.setProperty]('mask-box-image-repeat', value, '');
    }
    get maskBoxImageSlice() {
      return this[dartx.getPropertyValue]('mask-box-image-slice');
    }
    set maskBoxImageSlice(value) {
      this[dartx.setProperty]('mask-box-image-slice', value, '');
    }
    get maskBoxImageSource() {
      return this[dartx.getPropertyValue]('mask-box-image-source');
    }
    set maskBoxImageSource(value) {
      this[dartx.setProperty]('mask-box-image-source', value, '');
    }
    get maskBoxImageWidth() {
      return this[dartx.getPropertyValue]('mask-box-image-width');
    }
    set maskBoxImageWidth(value) {
      this[dartx.setProperty]('mask-box-image-width', value, '');
    }
    get maskClip() {
      return this[dartx.getPropertyValue]('mask-clip');
    }
    set maskClip(value) {
      this[dartx.setProperty]('mask-clip', value, '');
    }
    get maskComposite() {
      return this[dartx.getPropertyValue]('mask-composite');
    }
    set maskComposite(value) {
      this[dartx.setProperty]('mask-composite', value, '');
    }
    get maskImage() {
      return this[dartx.getPropertyValue]('mask-image');
    }
    set maskImage(value) {
      this[dartx.setProperty]('mask-image', value, '');
    }
    get maskOrigin() {
      return this[dartx.getPropertyValue]('mask-origin');
    }
    set maskOrigin(value) {
      this[dartx.setProperty]('mask-origin', value, '');
    }
    get maskPosition() {
      return this[dartx.getPropertyValue]('mask-position');
    }
    set maskPosition(value) {
      this[dartx.setProperty]('mask-position', value, '');
    }
    get maskPositionX() {
      return this[dartx.getPropertyValue]('mask-position-x');
    }
    set maskPositionX(value) {
      this[dartx.setProperty]('mask-position-x', value, '');
    }
    get maskPositionY() {
      return this[dartx.getPropertyValue]('mask-position-y');
    }
    set maskPositionY(value) {
      this[dartx.setProperty]('mask-position-y', value, '');
    }
    get maskRepeat() {
      return this[dartx.getPropertyValue]('mask-repeat');
    }
    set maskRepeat(value) {
      this[dartx.setProperty]('mask-repeat', value, '');
    }
    get maskRepeatX() {
      return this[dartx.getPropertyValue]('mask-repeat-x');
    }
    set maskRepeatX(value) {
      this[dartx.setProperty]('mask-repeat-x', value, '');
    }
    get maskRepeatY() {
      return this[dartx.getPropertyValue]('mask-repeat-y');
    }
    set maskRepeatY(value) {
      this[dartx.setProperty]('mask-repeat-y', value, '');
    }
    get maskSize() {
      return this[dartx.getPropertyValue]('mask-size');
    }
    set maskSize(value) {
      this[dartx.setProperty]('mask-size', value, '');
    }
    get maskSourceType() {
      return this[dartx.getPropertyValue]('mask-source-type');
    }
    set maskSourceType(value) {
      this[dartx.setProperty]('mask-source-type', value, '');
    }
    get maxHeight() {
      return this[dartx.getPropertyValue]('max-height');
    }
    set maxHeight(value) {
      this[dartx.setProperty]('max-height', value, '');
    }
    get maxLogicalHeight() {
      return this[dartx.getPropertyValue]('max-logical-height');
    }
    set maxLogicalHeight(value) {
      this[dartx.setProperty]('max-logical-height', value, '');
    }
    get maxLogicalWidth() {
      return this[dartx.getPropertyValue]('max-logical-width');
    }
    set maxLogicalWidth(value) {
      this[dartx.setProperty]('max-logical-width', value, '');
    }
    get maxWidth() {
      return this[dartx.getPropertyValue]('max-width');
    }
    set maxWidth(value) {
      this[dartx.setProperty]('max-width', value, '');
    }
    get maxZoom() {
      return this[dartx.getPropertyValue]('max-zoom');
    }
    set maxZoom(value) {
      this[dartx.setProperty]('max-zoom', value, '');
    }
    get minHeight() {
      return this[dartx.getPropertyValue]('min-height');
    }
    set minHeight(value) {
      this[dartx.setProperty]('min-height', value, '');
    }
    get minLogicalHeight() {
      return this[dartx.getPropertyValue]('min-logical-height');
    }
    set minLogicalHeight(value) {
      this[dartx.setProperty]('min-logical-height', value, '');
    }
    get minLogicalWidth() {
      return this[dartx.getPropertyValue]('min-logical-width');
    }
    set minLogicalWidth(value) {
      this[dartx.setProperty]('min-logical-width', value, '');
    }
    get minWidth() {
      return this[dartx.getPropertyValue]('min-width');
    }
    set minWidth(value) {
      this[dartx.setProperty]('min-width', value, '');
    }
    get minZoom() {
      return this[dartx.getPropertyValue]('min-zoom');
    }
    set minZoom(value) {
      this[dartx.setProperty]('min-zoom', value, '');
    }
    get mixBlendMode() {
      return this[dartx.getPropertyValue]('mix-blend-mode');
    }
    set mixBlendMode(value) {
      this[dartx.setProperty]('mix-blend-mode', value, '');
    }
    get objectFit() {
      return this[dartx.getPropertyValue]('object-fit');
    }
    set objectFit(value) {
      this[dartx.setProperty]('object-fit', value, '');
    }
    get objectPosition() {
      return this[dartx.getPropertyValue]('object-position');
    }
    set objectPosition(value) {
      this[dartx.setProperty]('object-position', value, '');
    }
    get opacity() {
      return this[dartx.getPropertyValue]('opacity');
    }
    set opacity(value) {
      this[dartx.setProperty]('opacity', value, '');
    }
    get order() {
      return this[dartx.getPropertyValue]('order');
    }
    set order(value) {
      this[dartx.setProperty]('order', value, '');
    }
    get orientation() {
      return this[dartx.getPropertyValue]('orientation');
    }
    set orientation(value) {
      this[dartx.setProperty]('orientation', value, '');
    }
    get orphans() {
      return this[dartx.getPropertyValue]('orphans');
    }
    set orphans(value) {
      this[dartx.setProperty]('orphans', value, '');
    }
    get outline() {
      return this[dartx.getPropertyValue]('outline');
    }
    set outline(value) {
      this[dartx.setProperty]('outline', value, '');
    }
    get outlineColor() {
      return this[dartx.getPropertyValue]('outline-color');
    }
    set outlineColor(value) {
      this[dartx.setProperty]('outline-color', value, '');
    }
    get outlineOffset() {
      return this[dartx.getPropertyValue]('outline-offset');
    }
    set outlineOffset(value) {
      this[dartx.setProperty]('outline-offset', value, '');
    }
    get outlineStyle() {
      return this[dartx.getPropertyValue]('outline-style');
    }
    set outlineStyle(value) {
      this[dartx.setProperty]('outline-style', value, '');
    }
    get outlineWidth() {
      return this[dartx.getPropertyValue]('outline-width');
    }
    set outlineWidth(value) {
      this[dartx.setProperty]('outline-width', value, '');
    }
    get overflow() {
      return this[dartx.getPropertyValue]('overflow');
    }
    set overflow(value) {
      this[dartx.setProperty]('overflow', value, '');
    }
    get overflowWrap() {
      return this[dartx.getPropertyValue]('overflow-wrap');
    }
    set overflowWrap(value) {
      this[dartx.setProperty]('overflow-wrap', value, '');
    }
    get overflowX() {
      return this[dartx.getPropertyValue]('overflow-x');
    }
    set overflowX(value) {
      this[dartx.setProperty]('overflow-x', value, '');
    }
    get overflowY() {
      return this[dartx.getPropertyValue]('overflow-y');
    }
    set overflowY(value) {
      this[dartx.setProperty]('overflow-y', value, '');
    }
    get padding() {
      return this[dartx.getPropertyValue]('padding');
    }
    set padding(value) {
      this[dartx.setProperty]('padding', value, '');
    }
    get paddingAfter() {
      return this[dartx.getPropertyValue]('padding-after');
    }
    set paddingAfter(value) {
      this[dartx.setProperty]('padding-after', value, '');
    }
    get paddingBefore() {
      return this[dartx.getPropertyValue]('padding-before');
    }
    set paddingBefore(value) {
      this[dartx.setProperty]('padding-before', value, '');
    }
    get paddingBottom() {
      return this[dartx.getPropertyValue]('padding-bottom');
    }
    set paddingBottom(value) {
      this[dartx.setProperty]('padding-bottom', value, '');
    }
    get paddingEnd() {
      return this[dartx.getPropertyValue]('padding-end');
    }
    set paddingEnd(value) {
      this[dartx.setProperty]('padding-end', value, '');
    }
    get paddingLeft() {
      return this[dartx.getPropertyValue]('padding-left');
    }
    set paddingLeft(value) {
      this[dartx.setProperty]('padding-left', value, '');
    }
    get paddingRight() {
      return this[dartx.getPropertyValue]('padding-right');
    }
    set paddingRight(value) {
      this[dartx.setProperty]('padding-right', value, '');
    }
    get paddingStart() {
      return this[dartx.getPropertyValue]('padding-start');
    }
    set paddingStart(value) {
      this[dartx.setProperty]('padding-start', value, '');
    }
    get paddingTop() {
      return this[dartx.getPropertyValue]('padding-top');
    }
    set paddingTop(value) {
      this[dartx.setProperty]('padding-top', value, '');
    }
    get page() {
      return this[dartx.getPropertyValue]('page');
    }
    set page(value) {
      this[dartx.setProperty]('page', value, '');
    }
    get pageBreakAfter() {
      return this[dartx.getPropertyValue]('page-break-after');
    }
    set pageBreakAfter(value) {
      this[dartx.setProperty]('page-break-after', value, '');
    }
    get pageBreakBefore() {
      return this[dartx.getPropertyValue]('page-break-before');
    }
    set pageBreakBefore(value) {
      this[dartx.setProperty]('page-break-before', value, '');
    }
    get pageBreakInside() {
      return this[dartx.getPropertyValue]('page-break-inside');
    }
    set pageBreakInside(value) {
      this[dartx.setProperty]('page-break-inside', value, '');
    }
    get perspective() {
      return this[dartx.getPropertyValue]('perspective');
    }
    set perspective(value) {
      this[dartx.setProperty]('perspective', value, '');
    }
    get perspectiveOrigin() {
      return this[dartx.getPropertyValue]('perspective-origin');
    }
    set perspectiveOrigin(value) {
      this[dartx.setProperty]('perspective-origin', value, '');
    }
    get perspectiveOriginX() {
      return this[dartx.getPropertyValue]('perspective-origin-x');
    }
    set perspectiveOriginX(value) {
      this[dartx.setProperty]('perspective-origin-x', value, '');
    }
    get perspectiveOriginY() {
      return this[dartx.getPropertyValue]('perspective-origin-y');
    }
    set perspectiveOriginY(value) {
      this[dartx.setProperty]('perspective-origin-y', value, '');
    }
    get pointerEvents() {
      return this[dartx.getPropertyValue]('pointer-events');
    }
    set pointerEvents(value) {
      this[dartx.setProperty]('pointer-events', value, '');
    }
    get position() {
      return this[dartx.getPropertyValue]('position');
    }
    set position(value) {
      this[dartx.setProperty]('position', value, '');
    }
    get printColorAdjust() {
      return this[dartx.getPropertyValue]('print-color-adjust');
    }
    set printColorAdjust(value) {
      this[dartx.setProperty]('print-color-adjust', value, '');
    }
    get quotes() {
      return this[dartx.getPropertyValue]('quotes');
    }
    set quotes(value) {
      this[dartx.setProperty]('quotes', value, '');
    }
    get resize() {
      return this[dartx.getPropertyValue]('resize');
    }
    set resize(value) {
      this[dartx.setProperty]('resize', value, '');
    }
    get right() {
      return this[dartx.getPropertyValue]('right');
    }
    set right(value) {
      this[dartx.setProperty]('right', value, '');
    }
    get rtlOrdering() {
      return this[dartx.getPropertyValue]('rtl-ordering');
    }
    set rtlOrdering(value) {
      this[dartx.setProperty]('rtl-ordering', value, '');
    }
    get rubyPosition() {
      return this[dartx.getPropertyValue]('ruby-position');
    }
    set rubyPosition(value) {
      this[dartx.setProperty]('ruby-position', value, '');
    }
    get scrollBehavior() {
      return this[dartx.getPropertyValue]('scroll-behavior');
    }
    set scrollBehavior(value) {
      this[dartx.setProperty]('scroll-behavior', value, '');
    }
    get shapeImageThreshold() {
      return this[dartx.getPropertyValue]('shape-image-threshold');
    }
    set shapeImageThreshold(value) {
      this[dartx.setProperty]('shape-image-threshold', value, '');
    }
    get shapeMargin() {
      return this[dartx.getPropertyValue]('shape-margin');
    }
    set shapeMargin(value) {
      this[dartx.setProperty]('shape-margin', value, '');
    }
    get shapeOutside() {
      return this[dartx.getPropertyValue]('shape-outside');
    }
    set shapeOutside(value) {
      this[dartx.setProperty]('shape-outside', value, '');
    }
    get size() {
      return this[dartx.getPropertyValue]('size');
    }
    set size(value) {
      this[dartx.setProperty]('size', value, '');
    }
    get speak() {
      return this[dartx.getPropertyValue]('speak');
    }
    set speak(value) {
      this[dartx.setProperty]('speak', value, '');
    }
    get src() {
      return this[dartx.getPropertyValue]('src');
    }
    set src(value) {
      this[dartx.setProperty]('src', value, '');
    }
    get tabSize() {
      return this[dartx.getPropertyValue]('tab-size');
    }
    set tabSize(value) {
      this[dartx.setProperty]('tab-size', value, '');
    }
    get tableLayout() {
      return this[dartx.getPropertyValue]('table-layout');
    }
    set tableLayout(value) {
      this[dartx.setProperty]('table-layout', value, '');
    }
    get tapHighlightColor() {
      return this[dartx.getPropertyValue]('tap-highlight-color');
    }
    set tapHighlightColor(value) {
      this[dartx.setProperty]('tap-highlight-color', value, '');
    }
    get textAlign() {
      return this[dartx.getPropertyValue]('text-align');
    }
    set textAlign(value) {
      this[dartx.setProperty]('text-align', value, '');
    }
    get textAlignLast() {
      return this[dartx.getPropertyValue]('text-align-last');
    }
    set textAlignLast(value) {
      this[dartx.setProperty]('text-align-last', value, '');
    }
    get textCombine() {
      return this[dartx.getPropertyValue]('text-combine');
    }
    set textCombine(value) {
      this[dartx.setProperty]('text-combine', value, '');
    }
    get textDecoration() {
      return this[dartx.getPropertyValue]('text-decoration');
    }
    set textDecoration(value) {
      this[dartx.setProperty]('text-decoration', value, '');
    }
    get textDecorationColor() {
      return this[dartx.getPropertyValue]('text-decoration-color');
    }
    set textDecorationColor(value) {
      this[dartx.setProperty]('text-decoration-color', value, '');
    }
    get textDecorationLine() {
      return this[dartx.getPropertyValue]('text-decoration-line');
    }
    set textDecorationLine(value) {
      this[dartx.setProperty]('text-decoration-line', value, '');
    }
    get textDecorationStyle() {
      return this[dartx.getPropertyValue]('text-decoration-style');
    }
    set textDecorationStyle(value) {
      this[dartx.setProperty]('text-decoration-style', value, '');
    }
    get textDecorationsInEffect() {
      return this[dartx.getPropertyValue]('text-decorations-in-effect');
    }
    set textDecorationsInEffect(value) {
      this[dartx.setProperty]('text-decorations-in-effect', value, '');
    }
    get textEmphasis() {
      return this[dartx.getPropertyValue]('text-emphasis');
    }
    set textEmphasis(value) {
      this[dartx.setProperty]('text-emphasis', value, '');
    }
    get textEmphasisColor() {
      return this[dartx.getPropertyValue]('text-emphasis-color');
    }
    set textEmphasisColor(value) {
      this[dartx.setProperty]('text-emphasis-color', value, '');
    }
    get textEmphasisPosition() {
      return this[dartx.getPropertyValue]('text-emphasis-position');
    }
    set textEmphasisPosition(value) {
      this[dartx.setProperty]('text-emphasis-position', value, '');
    }
    get textEmphasisStyle() {
      return this[dartx.getPropertyValue]('text-emphasis-style');
    }
    set textEmphasisStyle(value) {
      this[dartx.setProperty]('text-emphasis-style', value, '');
    }
    get textFillColor() {
      return this[dartx.getPropertyValue]('text-fill-color');
    }
    set textFillColor(value) {
      this[dartx.setProperty]('text-fill-color', value, '');
    }
    get textIndent() {
      return this[dartx.getPropertyValue]('text-indent');
    }
    set textIndent(value) {
      this[dartx.setProperty]('text-indent', value, '');
    }
    get textJustify() {
      return this[dartx.getPropertyValue]('text-justify');
    }
    set textJustify(value) {
      this[dartx.setProperty]('text-justify', value, '');
    }
    get textLineThroughColor() {
      return this[dartx.getPropertyValue]('text-line-through-color');
    }
    set textLineThroughColor(value) {
      this[dartx.setProperty]('text-line-through-color', value, '');
    }
    get textLineThroughMode() {
      return this[dartx.getPropertyValue]('text-line-through-mode');
    }
    set textLineThroughMode(value) {
      this[dartx.setProperty]('text-line-through-mode', value, '');
    }
    get textLineThroughStyle() {
      return this[dartx.getPropertyValue]('text-line-through-style');
    }
    set textLineThroughStyle(value) {
      this[dartx.setProperty]('text-line-through-style', value, '');
    }
    get textLineThroughWidth() {
      return this[dartx.getPropertyValue]('text-line-through-width');
    }
    set textLineThroughWidth(value) {
      this[dartx.setProperty]('text-line-through-width', value, '');
    }
    get textOrientation() {
      return this[dartx.getPropertyValue]('text-orientation');
    }
    set textOrientation(value) {
      this[dartx.setProperty]('text-orientation', value, '');
    }
    get textOverflow() {
      return this[dartx.getPropertyValue]('text-overflow');
    }
    set textOverflow(value) {
      this[dartx.setProperty]('text-overflow', value, '');
    }
    get textOverlineColor() {
      return this[dartx.getPropertyValue]('text-overline-color');
    }
    set textOverlineColor(value) {
      this[dartx.setProperty]('text-overline-color', value, '');
    }
    get textOverlineMode() {
      return this[dartx.getPropertyValue]('text-overline-mode');
    }
    set textOverlineMode(value) {
      this[dartx.setProperty]('text-overline-mode', value, '');
    }
    get textOverlineStyle() {
      return this[dartx.getPropertyValue]('text-overline-style');
    }
    set textOverlineStyle(value) {
      this[dartx.setProperty]('text-overline-style', value, '');
    }
    get textOverlineWidth() {
      return this[dartx.getPropertyValue]('text-overline-width');
    }
    set textOverlineWidth(value) {
      this[dartx.setProperty]('text-overline-width', value, '');
    }
    get textRendering() {
      return this[dartx.getPropertyValue]('text-rendering');
    }
    set textRendering(value) {
      this[dartx.setProperty]('text-rendering', value, '');
    }
    get textSecurity() {
      return this[dartx.getPropertyValue]('text-security');
    }
    set textSecurity(value) {
      this[dartx.setProperty]('text-security', value, '');
    }
    get textShadow() {
      return this[dartx.getPropertyValue]('text-shadow');
    }
    set textShadow(value) {
      this[dartx.setProperty]('text-shadow', value, '');
    }
    get textStroke() {
      return this[dartx.getPropertyValue]('text-stroke');
    }
    set textStroke(value) {
      this[dartx.setProperty]('text-stroke', value, '');
    }
    get textStrokeColor() {
      return this[dartx.getPropertyValue]('text-stroke-color');
    }
    set textStrokeColor(value) {
      this[dartx.setProperty]('text-stroke-color', value, '');
    }
    get textStrokeWidth() {
      return this[dartx.getPropertyValue]('text-stroke-width');
    }
    set textStrokeWidth(value) {
      this[dartx.setProperty]('text-stroke-width', value, '');
    }
    get textTransform() {
      return this[dartx.getPropertyValue]('text-transform');
    }
    set textTransform(value) {
      this[dartx.setProperty]('text-transform', value, '');
    }
    get textUnderlineColor() {
      return this[dartx.getPropertyValue]('text-underline-color');
    }
    set textUnderlineColor(value) {
      this[dartx.setProperty]('text-underline-color', value, '');
    }
    get textUnderlineMode() {
      return this[dartx.getPropertyValue]('text-underline-mode');
    }
    set textUnderlineMode(value) {
      this[dartx.setProperty]('text-underline-mode', value, '');
    }
    get textUnderlinePosition() {
      return this[dartx.getPropertyValue]('text-underline-position');
    }
    set textUnderlinePosition(value) {
      this[dartx.setProperty]('text-underline-position', value, '');
    }
    get textUnderlineStyle() {
      return this[dartx.getPropertyValue]('text-underline-style');
    }
    set textUnderlineStyle(value) {
      this[dartx.setProperty]('text-underline-style', value, '');
    }
    get textUnderlineWidth() {
      return this[dartx.getPropertyValue]('text-underline-width');
    }
    set textUnderlineWidth(value) {
      this[dartx.setProperty]('text-underline-width', value, '');
    }
    get top() {
      return this[dartx.getPropertyValue]('top');
    }
    set top(value) {
      this[dartx.setProperty]('top', value, '');
    }
    get touchAction() {
      return this[dartx.getPropertyValue]('touch-action');
    }
    set touchAction(value) {
      this[dartx.setProperty]('touch-action', value, '');
    }
    get touchActionDelay() {
      return this[dartx.getPropertyValue]('touch-action-delay');
    }
    set touchActionDelay(value) {
      this[dartx.setProperty]('touch-action-delay', value, '');
    }
    get transform() {
      return this[dartx.getPropertyValue]('transform');
    }
    set transform(value) {
      this[dartx.setProperty]('transform', value, '');
    }
    get transformOrigin() {
      return this[dartx.getPropertyValue]('transform-origin');
    }
    set transformOrigin(value) {
      this[dartx.setProperty]('transform-origin', value, '');
    }
    get transformOriginX() {
      return this[dartx.getPropertyValue]('transform-origin-x');
    }
    set transformOriginX(value) {
      this[dartx.setProperty]('transform-origin-x', value, '');
    }
    get transformOriginY() {
      return this[dartx.getPropertyValue]('transform-origin-y');
    }
    set transformOriginY(value) {
      this[dartx.setProperty]('transform-origin-y', value, '');
    }
    get transformOriginZ() {
      return this[dartx.getPropertyValue]('transform-origin-z');
    }
    set transformOriginZ(value) {
      this[dartx.setProperty]('transform-origin-z', value, '');
    }
    get transformStyle() {
      return this[dartx.getPropertyValue]('transform-style');
    }
    set transformStyle(value) {
      this[dartx.setProperty]('transform-style', value, '');
    }
    get transition() {
      return this[dartx.getPropertyValue]('transition');
    }
    set transition(value) {
      this[dartx.setProperty]('transition', value, '');
    }
    get transitionDelay() {
      return this[dartx.getPropertyValue]('transition-delay');
    }
    set transitionDelay(value) {
      this[dartx.setProperty]('transition-delay', value, '');
    }
    get transitionDuration() {
      return this[dartx.getPropertyValue]('transition-duration');
    }
    set transitionDuration(value) {
      this[dartx.setProperty]('transition-duration', value, '');
    }
    get transitionProperty() {
      return this[dartx.getPropertyValue]('transition-property');
    }
    set transitionProperty(value) {
      this[dartx.setProperty]('transition-property', value, '');
    }
    get transitionTimingFunction() {
      return this[dartx.getPropertyValue]('transition-timing-function');
    }
    set transitionTimingFunction(value) {
      this[dartx.setProperty]('transition-timing-function', value, '');
    }
    get unicodeBidi() {
      return this[dartx.getPropertyValue]('unicode-bidi');
    }
    set unicodeBidi(value) {
      this[dartx.setProperty]('unicode-bidi', value, '');
    }
    get unicodeRange() {
      return this[dartx.getPropertyValue]('unicode-range');
    }
    set unicodeRange(value) {
      this[dartx.setProperty]('unicode-range', value, '');
    }
    get userDrag() {
      return this[dartx.getPropertyValue]('user-drag');
    }
    set userDrag(value) {
      this[dartx.setProperty]('user-drag', value, '');
    }
    get userModify() {
      return this[dartx.getPropertyValue]('user-modify');
    }
    set userModify(value) {
      this[dartx.setProperty]('user-modify', value, '');
    }
    get userSelect() {
      return this[dartx.getPropertyValue]('user-select');
    }
    set userSelect(value) {
      this[dartx.setProperty]('user-select', value, '');
    }
    get userZoom() {
      return this[dartx.getPropertyValue]('user-zoom');
    }
    set userZoom(value) {
      this[dartx.setProperty]('user-zoom', value, '');
    }
    get verticalAlign() {
      return this[dartx.getPropertyValue]('vertical-align');
    }
    set verticalAlign(value) {
      this[dartx.setProperty]('vertical-align', value, '');
    }
    get visibility() {
      return this[dartx.getPropertyValue]('visibility');
    }
    set visibility(value) {
      this[dartx.setProperty]('visibility', value, '');
    }
    get whiteSpace() {
      return this[dartx.getPropertyValue]('white-space');
    }
    set whiteSpace(value) {
      this[dartx.setProperty]('white-space', value, '');
    }
    get widows() {
      return this[dartx.getPropertyValue]('widows');
    }
    set widows(value) {
      this[dartx.setProperty]('widows', value, '');
    }
    get width() {
      return this[dartx.getPropertyValue]('width');
    }
    set width(value) {
      this[dartx.setProperty]('width', value, '');
    }
    get willChange() {
      return this[dartx.getPropertyValue]('will-change');
    }
    set willChange(value) {
      this[dartx.setProperty]('will-change', value, '');
    }
    get wordBreak() {
      return this[dartx.getPropertyValue]('word-break');
    }
    set wordBreak(value) {
      this[dartx.setProperty]('word-break', value, '');
    }
    get wordSpacing() {
      return this[dartx.getPropertyValue]('word-spacing');
    }
    set wordSpacing(value) {
      this[dartx.setProperty]('word-spacing', value, '');
    }
    get wordWrap() {
      return this[dartx.getPropertyValue]('word-wrap');
    }
    set wordWrap(value) {
      this[dartx.setProperty]('word-wrap', value, '');
    }
    get wrapFlow() {
      return this[dartx.getPropertyValue]('wrap-flow');
    }
    set wrapFlow(value) {
      this[dartx.setProperty]('wrap-flow', value, '');
    }
    get wrapThrough() {
      return this[dartx.getPropertyValue]('wrap-through');
    }
    set wrapThrough(value) {
      this[dartx.setProperty]('wrap-through', value, '');
    }
    get writingMode() {
      return this[dartx.getPropertyValue]('writing-mode');
    }
    set writingMode(value) {
      this[dartx.setProperty]('writing-mode', value, '');
    }
    get zIndex() {
      return this[dartx.getPropertyValue]('z-index');
    }
    set zIndex(value) {
      this[dartx.setProperty]('z-index', value, '');
    }
    get zoom() {
      return this[dartx.getPropertyValue]('zoom');
    }
    set zoom(value) {
      this[dartx.setProperty]('zoom', value, '');
    }
  };
  dart.setSignature(html$.CssStyleDeclarationBase, {
    getters: () => ({
      alignContent: dart.definiteFunctionType(core.String, []),
      alignItems: dart.definiteFunctionType(core.String, []),
      alignSelf: dart.definiteFunctionType(core.String, []),
      animation: dart.definiteFunctionType(core.String, []),
      animationDelay: dart.definiteFunctionType(core.String, []),
      animationDirection: dart.definiteFunctionType(core.String, []),
      animationDuration: dart.definiteFunctionType(core.String, []),
      animationFillMode: dart.definiteFunctionType(core.String, []),
      animationIterationCount: dart.definiteFunctionType(core.String, []),
      animationName: dart.definiteFunctionType(core.String, []),
      animationPlayState: dart.definiteFunctionType(core.String, []),
      animationTimingFunction: dart.definiteFunctionType(core.String, []),
      appRegion: dart.definiteFunctionType(core.String, []),
      appearance: dart.definiteFunctionType(core.String, []),
      aspectRatio: dart.definiteFunctionType(core.String, []),
      backfaceVisibility: dart.definiteFunctionType(core.String, []),
      background: dart.definiteFunctionType(core.String, []),
      backgroundAttachment: dart.definiteFunctionType(core.String, []),
      backgroundBlendMode: dart.definiteFunctionType(core.String, []),
      backgroundClip: dart.definiteFunctionType(core.String, []),
      backgroundColor: dart.definiteFunctionType(core.String, []),
      backgroundComposite: dart.definiteFunctionType(core.String, []),
      backgroundImage: dart.definiteFunctionType(core.String, []),
      backgroundOrigin: dart.definiteFunctionType(core.String, []),
      backgroundPosition: dart.definiteFunctionType(core.String, []),
      backgroundPositionX: dart.definiteFunctionType(core.String, []),
      backgroundPositionY: dart.definiteFunctionType(core.String, []),
      backgroundRepeat: dart.definiteFunctionType(core.String, []),
      backgroundRepeatX: dart.definiteFunctionType(core.String, []),
      backgroundRepeatY: dart.definiteFunctionType(core.String, []),
      backgroundSize: dart.definiteFunctionType(core.String, []),
      border: dart.definiteFunctionType(core.String, []),
      borderAfter: dart.definiteFunctionType(core.String, []),
      borderAfterColor: dart.definiteFunctionType(core.String, []),
      borderAfterStyle: dart.definiteFunctionType(core.String, []),
      borderAfterWidth: dart.definiteFunctionType(core.String, []),
      borderBefore: dart.definiteFunctionType(core.String, []),
      borderBeforeColor: dart.definiteFunctionType(core.String, []),
      borderBeforeStyle: dart.definiteFunctionType(core.String, []),
      borderBeforeWidth: dart.definiteFunctionType(core.String, []),
      borderBottom: dart.definiteFunctionType(core.String, []),
      borderBottomColor: dart.definiteFunctionType(core.String, []),
      borderBottomLeftRadius: dart.definiteFunctionType(core.String, []),
      borderBottomRightRadius: dart.definiteFunctionType(core.String, []),
      borderBottomStyle: dart.definiteFunctionType(core.String, []),
      borderBottomWidth: dart.definiteFunctionType(core.String, []),
      borderCollapse: dart.definiteFunctionType(core.String, []),
      borderColor: dart.definiteFunctionType(core.String, []),
      borderEnd: dart.definiteFunctionType(core.String, []),
      borderEndColor: dart.definiteFunctionType(core.String, []),
      borderEndStyle: dart.definiteFunctionType(core.String, []),
      borderEndWidth: dart.definiteFunctionType(core.String, []),
      borderFit: dart.definiteFunctionType(core.String, []),
      borderHorizontalSpacing: dart.definiteFunctionType(core.String, []),
      borderImage: dart.definiteFunctionType(core.String, []),
      borderImageOutset: dart.definiteFunctionType(core.String, []),
      borderImageRepeat: dart.definiteFunctionType(core.String, []),
      borderImageSlice: dart.definiteFunctionType(core.String, []),
      borderImageSource: dart.definiteFunctionType(core.String, []),
      borderImageWidth: dart.definiteFunctionType(core.String, []),
      borderLeft: dart.definiteFunctionType(core.String, []),
      borderLeftColor: dart.definiteFunctionType(core.String, []),
      borderLeftStyle: dart.definiteFunctionType(core.String, []),
      borderLeftWidth: dart.definiteFunctionType(core.String, []),
      borderRadius: dart.definiteFunctionType(core.String, []),
      borderRight: dart.definiteFunctionType(core.String, []),
      borderRightColor: dart.definiteFunctionType(core.String, []),
      borderRightStyle: dart.definiteFunctionType(core.String, []),
      borderRightWidth: dart.definiteFunctionType(core.String, []),
      borderSpacing: dart.definiteFunctionType(core.String, []),
      borderStart: dart.definiteFunctionType(core.String, []),
      borderStartColor: dart.definiteFunctionType(core.String, []),
      borderStartStyle: dart.definiteFunctionType(core.String, []),
      borderStartWidth: dart.definiteFunctionType(core.String, []),
      borderStyle: dart.definiteFunctionType(core.String, []),
      borderTop: dart.definiteFunctionType(core.String, []),
      borderTopColor: dart.definiteFunctionType(core.String, []),
      borderTopLeftRadius: dart.definiteFunctionType(core.String, []),
      borderTopRightRadius: dart.definiteFunctionType(core.String, []),
      borderTopStyle: dart.definiteFunctionType(core.String, []),
      borderTopWidth: dart.definiteFunctionType(core.String, []),
      borderVerticalSpacing: dart.definiteFunctionType(core.String, []),
      borderWidth: dart.definiteFunctionType(core.String, []),
      bottom: dart.definiteFunctionType(core.String, []),
      boxAlign: dart.definiteFunctionType(core.String, []),
      boxDecorationBreak: dart.definiteFunctionType(core.String, []),
      boxDirection: dart.definiteFunctionType(core.String, []),
      boxFlex: dart.definiteFunctionType(core.String, []),
      boxFlexGroup: dart.definiteFunctionType(core.String, []),
      boxLines: dart.definiteFunctionType(core.String, []),
      boxOrdinalGroup: dart.definiteFunctionType(core.String, []),
      boxOrient: dart.definiteFunctionType(core.String, []),
      boxPack: dart.definiteFunctionType(core.String, []),
      boxReflect: dart.definiteFunctionType(core.String, []),
      boxShadow: dart.definiteFunctionType(core.String, []),
      boxSizing: dart.definiteFunctionType(core.String, []),
      captionSide: dart.definiteFunctionType(core.String, []),
      clear: dart.definiteFunctionType(core.String, []),
      clip: dart.definiteFunctionType(core.String, []),
      clipPath: dart.definiteFunctionType(core.String, []),
      color: dart.definiteFunctionType(core.String, []),
      columnBreakAfter: dart.definiteFunctionType(core.String, []),
      columnBreakBefore: dart.definiteFunctionType(core.String, []),
      columnBreakInside: dart.definiteFunctionType(core.String, []),
      columnCount: dart.definiteFunctionType(core.String, []),
      columnFill: dart.definiteFunctionType(core.String, []),
      columnGap: dart.definiteFunctionType(core.String, []),
      columnRule: dart.definiteFunctionType(core.String, []),
      columnRuleColor: dart.definiteFunctionType(core.String, []),
      columnRuleStyle: dart.definiteFunctionType(core.String, []),
      columnRuleWidth: dart.definiteFunctionType(core.String, []),
      columnSpan: dart.definiteFunctionType(core.String, []),
      columnWidth: dart.definiteFunctionType(core.String, []),
      columns: dart.definiteFunctionType(core.String, []),
      content: dart.definiteFunctionType(core.String, []),
      counterIncrement: dart.definiteFunctionType(core.String, []),
      counterReset: dart.definiteFunctionType(core.String, []),
      cursor: dart.definiteFunctionType(core.String, []),
      direction: dart.definiteFunctionType(core.String, []),
      display: dart.definiteFunctionType(core.String, []),
      emptyCells: dart.definiteFunctionType(core.String, []),
      filter: dart.definiteFunctionType(core.String, []),
      flex: dart.definiteFunctionType(core.String, []),
      flexBasis: dart.definiteFunctionType(core.String, []),
      flexDirection: dart.definiteFunctionType(core.String, []),
      flexFlow: dart.definiteFunctionType(core.String, []),
      flexGrow: dart.definiteFunctionType(core.String, []),
      flexShrink: dart.definiteFunctionType(core.String, []),
      flexWrap: dart.definiteFunctionType(core.String, []),
      float: dart.definiteFunctionType(core.String, []),
      font: dart.definiteFunctionType(core.String, []),
      fontFamily: dart.definiteFunctionType(core.String, []),
      fontFeatureSettings: dart.definiteFunctionType(core.String, []),
      fontKerning: dart.definiteFunctionType(core.String, []),
      fontSize: dart.definiteFunctionType(core.String, []),
      fontSizeDelta: dart.definiteFunctionType(core.String, []),
      fontSmoothing: dart.definiteFunctionType(core.String, []),
      fontStretch: dart.definiteFunctionType(core.String, []),
      fontStyle: dart.definiteFunctionType(core.String, []),
      fontVariant: dart.definiteFunctionType(core.String, []),
      fontVariantLigatures: dart.definiteFunctionType(core.String, []),
      fontWeight: dart.definiteFunctionType(core.String, []),
      grid: dart.definiteFunctionType(core.String, []),
      gridArea: dart.definiteFunctionType(core.String, []),
      gridAutoColumns: dart.definiteFunctionType(core.String, []),
      gridAutoFlow: dart.definiteFunctionType(core.String, []),
      gridAutoRows: dart.definiteFunctionType(core.String, []),
      gridColumn: dart.definiteFunctionType(core.String, []),
      gridColumnEnd: dart.definiteFunctionType(core.String, []),
      gridColumnStart: dart.definiteFunctionType(core.String, []),
      gridRow: dart.definiteFunctionType(core.String, []),
      gridRowEnd: dart.definiteFunctionType(core.String, []),
      gridRowStart: dart.definiteFunctionType(core.String, []),
      gridTemplate: dart.definiteFunctionType(core.String, []),
      gridTemplateAreas: dart.definiteFunctionType(core.String, []),
      gridTemplateColumns: dart.definiteFunctionType(core.String, []),
      gridTemplateRows: dart.definiteFunctionType(core.String, []),
      height: dart.definiteFunctionType(core.String, []),
      highlight: dart.definiteFunctionType(core.String, []),
      hyphenateCharacter: dart.definiteFunctionType(core.String, []),
      imageRendering: dart.definiteFunctionType(core.String, []),
      isolation: dart.definiteFunctionType(core.String, []),
      justifyContent: dart.definiteFunctionType(core.String, []),
      justifySelf: dart.definiteFunctionType(core.String, []),
      left: dart.definiteFunctionType(core.String, []),
      letterSpacing: dart.definiteFunctionType(core.String, []),
      lineBoxContain: dart.definiteFunctionType(core.String, []),
      lineBreak: dart.definiteFunctionType(core.String, []),
      lineClamp: dart.definiteFunctionType(core.String, []),
      lineHeight: dart.definiteFunctionType(core.String, []),
      listStyle: dart.definiteFunctionType(core.String, []),
      listStyleImage: dart.definiteFunctionType(core.String, []),
      listStylePosition: dart.definiteFunctionType(core.String, []),
      listStyleType: dart.definiteFunctionType(core.String, []),
      locale: dart.definiteFunctionType(core.String, []),
      logicalHeight: dart.definiteFunctionType(core.String, []),
      logicalWidth: dart.definiteFunctionType(core.String, []),
      margin: dart.definiteFunctionType(core.String, []),
      marginAfter: dart.definiteFunctionType(core.String, []),
      marginAfterCollapse: dart.definiteFunctionType(core.String, []),
      marginBefore: dart.definiteFunctionType(core.String, []),
      marginBeforeCollapse: dart.definiteFunctionType(core.String, []),
      marginBottom: dart.definiteFunctionType(core.String, []),
      marginBottomCollapse: dart.definiteFunctionType(core.String, []),
      marginCollapse: dart.definiteFunctionType(core.String, []),
      marginEnd: dart.definiteFunctionType(core.String, []),
      marginLeft: dart.definiteFunctionType(core.String, []),
      marginRight: dart.definiteFunctionType(core.String, []),
      marginStart: dart.definiteFunctionType(core.String, []),
      marginTop: dart.definiteFunctionType(core.String, []),
      marginTopCollapse: dart.definiteFunctionType(core.String, []),
      mask: dart.definiteFunctionType(core.String, []),
      maskBoxImage: dart.definiteFunctionType(core.String, []),
      maskBoxImageOutset: dart.definiteFunctionType(core.String, []),
      maskBoxImageRepeat: dart.definiteFunctionType(core.String, []),
      maskBoxImageSlice: dart.definiteFunctionType(core.String, []),
      maskBoxImageSource: dart.definiteFunctionType(core.String, []),
      maskBoxImageWidth: dart.definiteFunctionType(core.String, []),
      maskClip: dart.definiteFunctionType(core.String, []),
      maskComposite: dart.definiteFunctionType(core.String, []),
      maskImage: dart.definiteFunctionType(core.String, []),
      maskOrigin: dart.definiteFunctionType(core.String, []),
      maskPosition: dart.definiteFunctionType(core.String, []),
      maskPositionX: dart.definiteFunctionType(core.String, []),
      maskPositionY: dart.definiteFunctionType(core.String, []),
      maskRepeat: dart.definiteFunctionType(core.String, []),
      maskRepeatX: dart.definiteFunctionType(core.String, []),
      maskRepeatY: dart.definiteFunctionType(core.String, []),
      maskSize: dart.definiteFunctionType(core.String, []),
      maskSourceType: dart.definiteFunctionType(core.String, []),
      maxHeight: dart.definiteFunctionType(core.String, []),
      maxLogicalHeight: dart.definiteFunctionType(core.String, []),
      maxLogicalWidth: dart.definiteFunctionType(core.String, []),
      maxWidth: dart.definiteFunctionType(core.String, []),
      maxZoom: dart.definiteFunctionType(core.String, []),
      minHeight: dart.definiteFunctionType(core.String, []),
      minLogicalHeight: dart.definiteFunctionType(core.String, []),
      minLogicalWidth: dart.definiteFunctionType(core.String, []),
      minWidth: dart.definiteFunctionType(core.String, []),
      minZoom: dart.definiteFunctionType(core.String, []),
      mixBlendMode: dart.definiteFunctionType(core.String, []),
      objectFit: dart.definiteFunctionType(core.String, []),
      objectPosition: dart.definiteFunctionType(core.String, []),
      opacity: dart.definiteFunctionType(core.String, []),
      order: dart.definiteFunctionType(core.String, []),
      orientation: dart.definiteFunctionType(core.String, []),
      orphans: dart.definiteFunctionType(core.String, []),
      outline: dart.definiteFunctionType(core.String, []),
      outlineColor: dart.definiteFunctionType(core.String, []),
      outlineOffset: dart.definiteFunctionType(core.String, []),
      outlineStyle: dart.definiteFunctionType(core.String, []),
      outlineWidth: dart.definiteFunctionType(core.String, []),
      overflow: dart.definiteFunctionType(core.String, []),
      overflowWrap: dart.definiteFunctionType(core.String, []),
      overflowX: dart.definiteFunctionType(core.String, []),
      overflowY: dart.definiteFunctionType(core.String, []),
      padding: dart.definiteFunctionType(core.String, []),
      paddingAfter: dart.definiteFunctionType(core.String, []),
      paddingBefore: dart.definiteFunctionType(core.String, []),
      paddingBottom: dart.definiteFunctionType(core.String, []),
      paddingEnd: dart.definiteFunctionType(core.String, []),
      paddingLeft: dart.definiteFunctionType(core.String, []),
      paddingRight: dart.definiteFunctionType(core.String, []),
      paddingStart: dart.definiteFunctionType(core.String, []),
      paddingTop: dart.definiteFunctionType(core.String, []),
      page: dart.definiteFunctionType(core.String, []),
      pageBreakAfter: dart.definiteFunctionType(core.String, []),
      pageBreakBefore: dart.definiteFunctionType(core.String, []),
      pageBreakInside: dart.definiteFunctionType(core.String, []),
      perspective: dart.definiteFunctionType(core.String, []),
      perspectiveOrigin: dart.definiteFunctionType(core.String, []),
      perspectiveOriginX: dart.definiteFunctionType(core.String, []),
      perspectiveOriginY: dart.definiteFunctionType(core.String, []),
      pointerEvents: dart.definiteFunctionType(core.String, []),
      position: dart.definiteFunctionType(core.String, []),
      printColorAdjust: dart.definiteFunctionType(core.String, []),
      quotes: dart.definiteFunctionType(core.String, []),
      resize: dart.definiteFunctionType(core.String, []),
      right: dart.definiteFunctionType(core.String, []),
      rtlOrdering: dart.definiteFunctionType(core.String, []),
      rubyPosition: dart.definiteFunctionType(core.String, []),
      scrollBehavior: dart.definiteFunctionType(core.String, []),
      shapeImageThreshold: dart.definiteFunctionType(core.String, []),
      shapeMargin: dart.definiteFunctionType(core.String, []),
      shapeOutside: dart.definiteFunctionType(core.String, []),
      size: dart.definiteFunctionType(core.String, []),
      speak: dart.definiteFunctionType(core.String, []),
      src: dart.definiteFunctionType(core.String, []),
      tabSize: dart.definiteFunctionType(core.String, []),
      tableLayout: dart.definiteFunctionType(core.String, []),
      tapHighlightColor: dart.definiteFunctionType(core.String, []),
      textAlign: dart.definiteFunctionType(core.String, []),
      textAlignLast: dart.definiteFunctionType(core.String, []),
      textCombine: dart.definiteFunctionType(core.String, []),
      textDecoration: dart.definiteFunctionType(core.String, []),
      textDecorationColor: dart.definiteFunctionType(core.String, []),
      textDecorationLine: dart.definiteFunctionType(core.String, []),
      textDecorationStyle: dart.definiteFunctionType(core.String, []),
      textDecorationsInEffect: dart.definiteFunctionType(core.String, []),
      textEmphasis: dart.definiteFunctionType(core.String, []),
      textEmphasisColor: dart.definiteFunctionType(core.String, []),
      textEmphasisPosition: dart.definiteFunctionType(core.String, []),
      textEmphasisStyle: dart.definiteFunctionType(core.String, []),
      textFillColor: dart.definiteFunctionType(core.String, []),
      textIndent: dart.definiteFunctionType(core.String, []),
      textJustify: dart.definiteFunctionType(core.String, []),
      textLineThroughColor: dart.definiteFunctionType(core.String, []),
      textLineThroughMode: dart.definiteFunctionType(core.String, []),
      textLineThroughStyle: dart.definiteFunctionType(core.String, []),
      textLineThroughWidth: dart.definiteFunctionType(core.String, []),
      textOrientation: dart.definiteFunctionType(core.String, []),
      textOverflow: dart.definiteFunctionType(core.String, []),
      textOverlineColor: dart.definiteFunctionType(core.String, []),
      textOverlineMode: dart.definiteFunctionType(core.String, []),
      textOverlineStyle: dart.definiteFunctionType(core.String, []),
      textOverlineWidth: dart.definiteFunctionType(core.String, []),
      textRendering: dart.definiteFunctionType(core.String, []),
      textSecurity: dart.definiteFunctionType(core.String, []),
      textShadow: dart.definiteFunctionType(core.String, []),
      textStroke: dart.definiteFunctionType(core.String, []),
      textStrokeColor: dart.definiteFunctionType(core.String, []),
      textStrokeWidth: dart.definiteFunctionType(core.String, []),
      textTransform: dart.definiteFunctionType(core.String, []),
      textUnderlineColor: dart.definiteFunctionType(core.String, []),
      textUnderlineMode: dart.definiteFunctionType(core.String, []),
      textUnderlinePosition: dart.definiteFunctionType(core.String, []),
      textUnderlineStyle: dart.definiteFunctionType(core.String, []),
      textUnderlineWidth: dart.definiteFunctionType(core.String, []),
      top: dart.definiteFunctionType(core.String, []),
      touchAction: dart.definiteFunctionType(core.String, []),
      touchActionDelay: dart.definiteFunctionType(core.String, []),
      transform: dart.definiteFunctionType(core.String, []),
      transformOrigin: dart.definiteFunctionType(core.String, []),
      transformOriginX: dart.definiteFunctionType(core.String, []),
      transformOriginY: dart.definiteFunctionType(core.String, []),
      transformOriginZ: dart.definiteFunctionType(core.String, []),
      transformStyle: dart.definiteFunctionType(core.String, []),
      transition: dart.definiteFunctionType(core.String, []),
      transitionDelay: dart.definiteFunctionType(core.String, []),
      transitionDuration: dart.definiteFunctionType(core.String, []),
      transitionProperty: dart.definiteFunctionType(core.String, []),
      transitionTimingFunction: dart.definiteFunctionType(core.String, []),
      unicodeBidi: dart.definiteFunctionType(core.String, []),
      unicodeRange: dart.definiteFunctionType(core.String, []),
      userDrag: dart.definiteFunctionType(core.String, []),
      userModify: dart.definiteFunctionType(core.String, []),
      userSelect: dart.definiteFunctionType(core.String, []),
      userZoom: dart.definiteFunctionType(core.String, []),
      verticalAlign: dart.definiteFunctionType(core.String, []),
      visibility: dart.definiteFunctionType(core.String, []),
      whiteSpace: dart.definiteFunctionType(core.String, []),
      widows: dart.definiteFunctionType(core.String, []),
      width: dart.definiteFunctionType(core.String, []),
      willChange: dart.definiteFunctionType(core.String, []),
      wordBreak: dart.definiteFunctionType(core.String, []),
      wordSpacing: dart.definiteFunctionType(core.String, []),
      wordWrap: dart.definiteFunctionType(core.String, []),
      wrapFlow: dart.definiteFunctionType(core.String, []),
      wrapThrough: dart.definiteFunctionType(core.String, []),
      writingMode: dart.definiteFunctionType(core.String, []),
      zIndex: dart.definiteFunctionType(core.String, []),
      zoom: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({
      alignContent: dart.definiteFunctionType(dart.void, [core.String]),
      alignItems: dart.definiteFunctionType(dart.void, [core.String]),
      alignSelf: dart.definiteFunctionType(dart.void, [core.String]),
      animation: dart.definiteFunctionType(dart.void, [core.String]),
      animationDelay: dart.definiteFunctionType(dart.void, [core.String]),
      animationDirection: dart.definiteFunctionType(dart.void, [core.String]),
      animationDuration: dart.definiteFunctionType(dart.void, [core.String]),
      animationFillMode: dart.definiteFunctionType(dart.void, [core.String]),
      animationIterationCount: dart.definiteFunctionType(dart.void, [core.String]),
      animationName: dart.definiteFunctionType(dart.void, [core.String]),
      animationPlayState: dart.definiteFunctionType(dart.void, [core.String]),
      animationTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
      appRegion: dart.definiteFunctionType(dart.void, [core.String]),
      appearance: dart.definiteFunctionType(dart.void, [core.String]),
      aspectRatio: dart.definiteFunctionType(dart.void, [core.String]),
      backfaceVisibility: dart.definiteFunctionType(dart.void, [core.String]),
      background: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundAttachment: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundClip: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundColor: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundComposite: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundImage: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundPosition: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundPositionX: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundPositionY: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundSize: dart.definiteFunctionType(dart.void, [core.String]),
      border: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfter: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfterColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfterStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfterWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderBefore: dart.definiteFunctionType(dart.void, [core.String]),
      borderBeforeColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderBeforeStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderBeforeWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottom: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      borderColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderEnd: dart.definiteFunctionType(dart.void, [core.String]),
      borderEndColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderEndStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderEndWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderFit: dart.definiteFunctionType(dart.void, [core.String]),
      borderHorizontalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      borderImage: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageSource: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeft: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeftColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeftStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeftWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderRight: dart.definiteFunctionType(dart.void, [core.String]),
      borderRightColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderRightStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderRightWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      borderStart: dart.definiteFunctionType(dart.void, [core.String]),
      borderStartColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderStartStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderStartWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderTop: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderVerticalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      borderWidth: dart.definiteFunctionType(dart.void, [core.String]),
      bottom: dart.definiteFunctionType(dart.void, [core.String]),
      boxAlign: dart.definiteFunctionType(dart.void, [core.String]),
      boxDecorationBreak: dart.definiteFunctionType(dart.void, [core.String]),
      boxDirection: dart.definiteFunctionType(dart.void, [core.String]),
      boxFlex: dart.definiteFunctionType(dart.void, [core.String]),
      boxFlexGroup: dart.definiteFunctionType(dart.void, [core.String]),
      boxLines: dart.definiteFunctionType(dart.void, [core.String]),
      boxOrdinalGroup: dart.definiteFunctionType(dart.void, [core.String]),
      boxOrient: dart.definiteFunctionType(dart.void, [core.String]),
      boxPack: dart.definiteFunctionType(dart.void, [core.String]),
      boxReflect: dart.definiteFunctionType(dart.void, [core.String]),
      boxShadow: dart.definiteFunctionType(dart.void, [core.String]),
      boxSizing: dart.definiteFunctionType(dart.void, [core.String]),
      captionSide: dart.definiteFunctionType(dart.void, [core.String]),
      clear: dart.definiteFunctionType(dart.void, [core.String]),
      clip: dart.definiteFunctionType(dart.void, [core.String]),
      clipPath: dart.definiteFunctionType(dart.void, [core.String]),
      color: dart.definiteFunctionType(dart.void, [core.String]),
      columnBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
      columnBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
      columnBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
      columnCount: dart.definiteFunctionType(dart.void, [core.String]),
      columnFill: dart.definiteFunctionType(dart.void, [core.String]),
      columnGap: dart.definiteFunctionType(dart.void, [core.String]),
      columnRule: dart.definiteFunctionType(dart.void, [core.String]),
      columnRuleColor: dart.definiteFunctionType(dart.void, [core.String]),
      columnRuleStyle: dart.definiteFunctionType(dart.void, [core.String]),
      columnRuleWidth: dart.definiteFunctionType(dart.void, [core.String]),
      columnSpan: dart.definiteFunctionType(dart.void, [core.String]),
      columnWidth: dart.definiteFunctionType(dart.void, [core.String]),
      columns: dart.definiteFunctionType(dart.void, [core.String]),
      content: dart.definiteFunctionType(dart.void, [core.String]),
      counterIncrement: dart.definiteFunctionType(dart.void, [core.String]),
      counterReset: dart.definiteFunctionType(dart.void, [core.String]),
      cursor: dart.definiteFunctionType(dart.void, [core.String]),
      direction: dart.definiteFunctionType(dart.void, [core.String]),
      display: dart.definiteFunctionType(dart.void, [core.String]),
      emptyCells: dart.definiteFunctionType(dart.void, [core.String]),
      filter: dart.definiteFunctionType(dart.void, [core.String]),
      flex: dart.definiteFunctionType(dart.void, [core.String]),
      flexBasis: dart.definiteFunctionType(dart.void, [core.String]),
      flexDirection: dart.definiteFunctionType(dart.void, [core.String]),
      flexFlow: dart.definiteFunctionType(dart.void, [core.String]),
      flexGrow: dart.definiteFunctionType(dart.void, [core.String]),
      flexShrink: dart.definiteFunctionType(dart.void, [core.String]),
      flexWrap: dart.definiteFunctionType(dart.void, [core.String]),
      float: dart.definiteFunctionType(dart.void, [core.String]),
      font: dart.definiteFunctionType(dart.void, [core.String]),
      fontFamily: dart.definiteFunctionType(dart.void, [core.String]),
      fontFeatureSettings: dart.definiteFunctionType(dart.void, [core.String]),
      fontKerning: dart.definiteFunctionType(dart.void, [core.String]),
      fontSize: dart.definiteFunctionType(dart.void, [core.String]),
      fontSizeDelta: dart.definiteFunctionType(dart.void, [core.String]),
      fontSmoothing: dart.definiteFunctionType(dart.void, [core.String]),
      fontStretch: dart.definiteFunctionType(dart.void, [core.String]),
      fontStyle: dart.definiteFunctionType(dart.void, [core.String]),
      fontVariant: dart.definiteFunctionType(dart.void, [core.String]),
      fontVariantLigatures: dart.definiteFunctionType(dart.void, [core.String]),
      fontWeight: dart.definiteFunctionType(dart.void, [core.String]),
      grid: dart.definiteFunctionType(dart.void, [core.String]),
      gridArea: dart.definiteFunctionType(dart.void, [core.String]),
      gridAutoColumns: dart.definiteFunctionType(dart.void, [core.String]),
      gridAutoFlow: dart.definiteFunctionType(dart.void, [core.String]),
      gridAutoRows: dart.definiteFunctionType(dart.void, [core.String]),
      gridColumn: dart.definiteFunctionType(dart.void, [core.String]),
      gridColumnEnd: dart.definiteFunctionType(dart.void, [core.String]),
      gridColumnStart: dart.definiteFunctionType(dart.void, [core.String]),
      gridRow: dart.definiteFunctionType(dart.void, [core.String]),
      gridRowEnd: dart.definiteFunctionType(dart.void, [core.String]),
      gridRowStart: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplate: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplateAreas: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplateColumns: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplateRows: dart.definiteFunctionType(dart.void, [core.String]),
      height: dart.definiteFunctionType(dart.void, [core.String]),
      highlight: dart.definiteFunctionType(dart.void, [core.String]),
      hyphenateCharacter: dart.definiteFunctionType(dart.void, [core.String]),
      imageRendering: dart.definiteFunctionType(dart.void, [core.String]),
      isolation: dart.definiteFunctionType(dart.void, [core.String]),
      justifyContent: dart.definiteFunctionType(dart.void, [core.String]),
      justifySelf: dart.definiteFunctionType(dart.void, [core.String]),
      left: dart.definiteFunctionType(dart.void, [core.String]),
      letterSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      lineBoxContain: dart.definiteFunctionType(dart.void, [core.String]),
      lineBreak: dart.definiteFunctionType(dart.void, [core.String]),
      lineClamp: dart.definiteFunctionType(dart.void, [core.String]),
      lineHeight: dart.definiteFunctionType(dart.void, [core.String]),
      listStyle: dart.definiteFunctionType(dart.void, [core.String]),
      listStyleImage: dart.definiteFunctionType(dart.void, [core.String]),
      listStylePosition: dart.definiteFunctionType(dart.void, [core.String]),
      listStyleType: dart.definiteFunctionType(dart.void, [core.String]),
      locale: dart.definiteFunctionType(dart.void, [core.String]),
      logicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
      logicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
      margin: dart.definiteFunctionType(dart.void, [core.String]),
      marginAfter: dart.definiteFunctionType(dart.void, [core.String]),
      marginAfterCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginBefore: dart.definiteFunctionType(dart.void, [core.String]),
      marginBeforeCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginBottom: dart.definiteFunctionType(dart.void, [core.String]),
      marginBottomCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginEnd: dart.definiteFunctionType(dart.void, [core.String]),
      marginLeft: dart.definiteFunctionType(dart.void, [core.String]),
      marginRight: dart.definiteFunctionType(dart.void, [core.String]),
      marginStart: dart.definiteFunctionType(dart.void, [core.String]),
      marginTop: dart.definiteFunctionType(dart.void, [core.String]),
      marginTopCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      mask: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImage: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageSource: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
      maskClip: dart.definiteFunctionType(dart.void, [core.String]),
      maskComposite: dart.definiteFunctionType(dart.void, [core.String]),
      maskImage: dart.definiteFunctionType(dart.void, [core.String]),
      maskOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      maskPosition: dart.definiteFunctionType(dart.void, [core.String]),
      maskPositionX: dart.definiteFunctionType(dart.void, [core.String]),
      maskPositionY: dart.definiteFunctionType(dart.void, [core.String]),
      maskRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      maskRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
      maskRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
      maskSize: dart.definiteFunctionType(dart.void, [core.String]),
      maskSourceType: dart.definiteFunctionType(dart.void, [core.String]),
      maxHeight: dart.definiteFunctionType(dart.void, [core.String]),
      maxLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
      maxLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
      maxWidth: dart.definiteFunctionType(dart.void, [core.String]),
      maxZoom: dart.definiteFunctionType(dart.void, [core.String]),
      minHeight: dart.definiteFunctionType(dart.void, [core.String]),
      minLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
      minLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
      minWidth: dart.definiteFunctionType(dart.void, [core.String]),
      minZoom: dart.definiteFunctionType(dart.void, [core.String]),
      mixBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
      objectFit: dart.definiteFunctionType(dart.void, [core.String]),
      objectPosition: dart.definiteFunctionType(dart.void, [core.String]),
      opacity: dart.definiteFunctionType(dart.void, [core.String]),
      order: dart.definiteFunctionType(dart.void, [core.String]),
      orientation: dart.definiteFunctionType(dart.void, [core.String]),
      orphans: dart.definiteFunctionType(dart.void, [core.String]),
      outline: dart.definiteFunctionType(dart.void, [core.String]),
      outlineColor: dart.definiteFunctionType(dart.void, [core.String]),
      outlineOffset: dart.definiteFunctionType(dart.void, [core.String]),
      outlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
      outlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
      overflow: dart.definiteFunctionType(dart.void, [core.String]),
      overflowWrap: dart.definiteFunctionType(dart.void, [core.String]),
      overflowX: dart.definiteFunctionType(dart.void, [core.String]),
      overflowY: dart.definiteFunctionType(dart.void, [core.String]),
      padding: dart.definiteFunctionType(dart.void, [core.String]),
      paddingAfter: dart.definiteFunctionType(dart.void, [core.String]),
      paddingBefore: dart.definiteFunctionType(dart.void, [core.String]),
      paddingBottom: dart.definiteFunctionType(dart.void, [core.String]),
      paddingEnd: dart.definiteFunctionType(dart.void, [core.String]),
      paddingLeft: dart.definiteFunctionType(dart.void, [core.String]),
      paddingRight: dart.definiteFunctionType(dart.void, [core.String]),
      paddingStart: dart.definiteFunctionType(dart.void, [core.String]),
      paddingTop: dart.definiteFunctionType(dart.void, [core.String]),
      page: dart.definiteFunctionType(dart.void, [core.String]),
      pageBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
      pageBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
      pageBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
      perspective: dart.definiteFunctionType(dart.void, [core.String]),
      perspectiveOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      perspectiveOriginX: dart.definiteFunctionType(dart.void, [core.String]),
      perspectiveOriginY: dart.definiteFunctionType(dart.void, [core.String]),
      pointerEvents: dart.definiteFunctionType(dart.void, [core.String]),
      position: dart.definiteFunctionType(dart.void, [core.String]),
      printColorAdjust: dart.definiteFunctionType(dart.void, [core.String]),
      quotes: dart.definiteFunctionType(dart.void, [core.String]),
      resize: dart.definiteFunctionType(dart.void, [core.String]),
      right: dart.definiteFunctionType(dart.void, [core.String]),
      rtlOrdering: dart.definiteFunctionType(dart.void, [core.String]),
      rubyPosition: dart.definiteFunctionType(dart.void, [core.String]),
      scrollBehavior: dart.definiteFunctionType(dart.void, [core.String]),
      shapeImageThreshold: dart.definiteFunctionType(dart.void, [core.String]),
      shapeMargin: dart.definiteFunctionType(dart.void, [core.String]),
      shapeOutside: dart.definiteFunctionType(dart.void, [core.String]),
      size: dart.definiteFunctionType(dart.void, [core.String]),
      speak: dart.definiteFunctionType(dart.void, [core.String]),
      src: dart.definiteFunctionType(dart.void, [core.String]),
      tabSize: dart.definiteFunctionType(dart.void, [core.String]),
      tableLayout: dart.definiteFunctionType(dart.void, [core.String]),
      tapHighlightColor: dart.definiteFunctionType(dart.void, [core.String]),
      textAlign: dart.definiteFunctionType(dart.void, [core.String]),
      textAlignLast: dart.definiteFunctionType(dart.void, [core.String]),
      textCombine: dart.definiteFunctionType(dart.void, [core.String]),
      textDecoration: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationColor: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationLine: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationsInEffect: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasis: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasisColor: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasisPosition: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasisStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textFillColor: dart.definiteFunctionType(dart.void, [core.String]),
      textIndent: dart.definiteFunctionType(dart.void, [core.String]),
      textJustify: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughColor: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughMode: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughWidth: dart.definiteFunctionType(dart.void, [core.String]),
      textOrientation: dart.definiteFunctionType(dart.void, [core.String]),
      textOverflow: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineColor: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineMode: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
      textRendering: dart.definiteFunctionType(dart.void, [core.String]),
      textSecurity: dart.definiteFunctionType(dart.void, [core.String]),
      textShadow: dart.definiteFunctionType(dart.void, [core.String]),
      textStroke: dart.definiteFunctionType(dart.void, [core.String]),
      textStrokeColor: dart.definiteFunctionType(dart.void, [core.String]),
      textStrokeWidth: dart.definiteFunctionType(dart.void, [core.String]),
      textTransform: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineColor: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineMode: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlinePosition: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
      top: dart.definiteFunctionType(dart.void, [core.String]),
      touchAction: dart.definiteFunctionType(dart.void, [core.String]),
      touchActionDelay: dart.definiteFunctionType(dart.void, [core.String]),
      transform: dart.definiteFunctionType(dart.void, [core.String]),
      transformOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      transformOriginX: dart.definiteFunctionType(dart.void, [core.String]),
      transformOriginY: dart.definiteFunctionType(dart.void, [core.String]),
      transformOriginZ: dart.definiteFunctionType(dart.void, [core.String]),
      transformStyle: dart.definiteFunctionType(dart.void, [core.String]),
      transition: dart.definiteFunctionType(dart.void, [core.String]),
      transitionDelay: dart.definiteFunctionType(dart.void, [core.String]),
      transitionDuration: dart.definiteFunctionType(dart.void, [core.String]),
      transitionProperty: dart.definiteFunctionType(dart.void, [core.String]),
      transitionTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
      unicodeBidi: dart.definiteFunctionType(dart.void, [core.String]),
      unicodeRange: dart.definiteFunctionType(dart.void, [core.String]),
      userDrag: dart.definiteFunctionType(dart.void, [core.String]),
      userModify: dart.definiteFunctionType(dart.void, [core.String]),
      userSelect: dart.definiteFunctionType(dart.void, [core.String]),
      userZoom: dart.definiteFunctionType(dart.void, [core.String]),
      verticalAlign: dart.definiteFunctionType(dart.void, [core.String]),
      visibility: dart.definiteFunctionType(dart.void, [core.String]),
      whiteSpace: dart.definiteFunctionType(dart.void, [core.String]),
      widows: dart.definiteFunctionType(dart.void, [core.String]),
      width: dart.definiteFunctionType(dart.void, [core.String]),
      willChange: dart.definiteFunctionType(dart.void, [core.String]),
      wordBreak: dart.definiteFunctionType(dart.void, [core.String]),
      wordSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      wordWrap: dart.definiteFunctionType(dart.void, [core.String]),
      wrapFlow: dart.definiteFunctionType(dart.void, [core.String]),
      wrapThrough: dart.definiteFunctionType(dart.void, [core.String]),
      writingMode: dart.definiteFunctionType(dart.void, [core.String]),
      zIndex: dart.definiteFunctionType(dart.void, [core.String]),
      zoom: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.defineExtensionMembers(html$.CssStyleDeclarationBase, [
    'alignContent',
    'alignContent',
    'alignItems',
    'alignItems',
    'alignSelf',
    'alignSelf',
    'animation',
    'animation',
    'animationDelay',
    'animationDelay',
    'animationDirection',
    'animationDirection',
    'animationDuration',
    'animationDuration',
    'animationFillMode',
    'animationFillMode',
    'animationIterationCount',
    'animationIterationCount',
    'animationName',
    'animationName',
    'animationPlayState',
    'animationPlayState',
    'animationTimingFunction',
    'animationTimingFunction',
    'appRegion',
    'appRegion',
    'appearance',
    'appearance',
    'aspectRatio',
    'aspectRatio',
    'backfaceVisibility',
    'backfaceVisibility',
    'background',
    'background',
    'backgroundAttachment',
    'backgroundAttachment',
    'backgroundBlendMode',
    'backgroundBlendMode',
    'backgroundClip',
    'backgroundClip',
    'backgroundColor',
    'backgroundColor',
    'backgroundComposite',
    'backgroundComposite',
    'backgroundImage',
    'backgroundImage',
    'backgroundOrigin',
    'backgroundOrigin',
    'backgroundPosition',
    'backgroundPosition',
    'backgroundPositionX',
    'backgroundPositionX',
    'backgroundPositionY',
    'backgroundPositionY',
    'backgroundRepeat',
    'backgroundRepeat',
    'backgroundRepeatX',
    'backgroundRepeatX',
    'backgroundRepeatY',
    'backgroundRepeatY',
    'backgroundSize',
    'backgroundSize',
    'border',
    'border',
    'borderAfter',
    'borderAfter',
    'borderAfterColor',
    'borderAfterColor',
    'borderAfterStyle',
    'borderAfterStyle',
    'borderAfterWidth',
    'borderAfterWidth',
    'borderBefore',
    'borderBefore',
    'borderBeforeColor',
    'borderBeforeColor',
    'borderBeforeStyle',
    'borderBeforeStyle',
    'borderBeforeWidth',
    'borderBeforeWidth',
    'borderBottom',
    'borderBottom',
    'borderBottomColor',
    'borderBottomColor',
    'borderBottomLeftRadius',
    'borderBottomLeftRadius',
    'borderBottomRightRadius',
    'borderBottomRightRadius',
    'borderBottomStyle',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderBottomWidth',
    'borderCollapse',
    'borderCollapse',
    'borderColor',
    'borderColor',
    'borderEnd',
    'borderEnd',
    'borderEndColor',
    'borderEndColor',
    'borderEndStyle',
    'borderEndStyle',
    'borderEndWidth',
    'borderEndWidth',
    'borderFit',
    'borderFit',
    'borderHorizontalSpacing',
    'borderHorizontalSpacing',
    'borderImage',
    'borderImage',
    'borderImageOutset',
    'borderImageOutset',
    'borderImageRepeat',
    'borderImageRepeat',
    'borderImageSlice',
    'borderImageSlice',
    'borderImageSource',
    'borderImageSource',
    'borderImageWidth',
    'borderImageWidth',
    'borderLeft',
    'borderLeft',
    'borderLeftColor',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderLeftWidth',
    'borderRadius',
    'borderRadius',
    'borderRight',
    'borderRight',
    'borderRightColor',
    'borderRightColor',
    'borderRightStyle',
    'borderRightStyle',
    'borderRightWidth',
    'borderRightWidth',
    'borderSpacing',
    'borderSpacing',
    'borderStart',
    'borderStart',
    'borderStartColor',
    'borderStartColor',
    'borderStartStyle',
    'borderStartStyle',
    'borderStartWidth',
    'borderStartWidth',
    'borderStyle',
    'borderStyle',
    'borderTop',
    'borderTop',
    'borderTopColor',
    'borderTopColor',
    'borderTopLeftRadius',
    'borderTopLeftRadius',
    'borderTopRightRadius',
    'borderTopRightRadius',
    'borderTopStyle',
    'borderTopStyle',
    'borderTopWidth',
    'borderTopWidth',
    'borderVerticalSpacing',
    'borderVerticalSpacing',
    'borderWidth',
    'borderWidth',
    'bottom',
    'bottom',
    'boxAlign',
    'boxAlign',
    'boxDecorationBreak',
    'boxDecorationBreak',
    'boxDirection',
    'boxDirection',
    'boxFlex',
    'boxFlex',
    'boxFlexGroup',
    'boxFlexGroup',
    'boxLines',
    'boxLines',
    'boxOrdinalGroup',
    'boxOrdinalGroup',
    'boxOrient',
    'boxOrient',
    'boxPack',
    'boxPack',
    'boxReflect',
    'boxReflect',
    'boxShadow',
    'boxShadow',
    'boxSizing',
    'boxSizing',
    'captionSide',
    'captionSide',
    'clear',
    'clear',
    'clip',
    'clip',
    'clipPath',
    'clipPath',
    'color',
    'color',
    'columnBreakAfter',
    'columnBreakAfter',
    'columnBreakBefore',
    'columnBreakBefore',
    'columnBreakInside',
    'columnBreakInside',
    'columnCount',
    'columnCount',
    'columnFill',
    'columnFill',
    'columnGap',
    'columnGap',
    'columnRule',
    'columnRule',
    'columnRuleColor',
    'columnRuleColor',
    'columnRuleStyle',
    'columnRuleStyle',
    'columnRuleWidth',
    'columnRuleWidth',
    'columnSpan',
    'columnSpan',
    'columnWidth',
    'columnWidth',
    'columns',
    'columns',
    'content',
    'content',
    'counterIncrement',
    'counterIncrement',
    'counterReset',
    'counterReset',
    'cursor',
    'cursor',
    'direction',
    'direction',
    'display',
    'display',
    'emptyCells',
    'emptyCells',
    'filter',
    'filter',
    'flex',
    'flex',
    'flexBasis',
    'flexBasis',
    'flexDirection',
    'flexDirection',
    'flexFlow',
    'flexFlow',
    'flexGrow',
    'flexGrow',
    'flexShrink',
    'flexShrink',
    'flexWrap',
    'flexWrap',
    'float',
    'float',
    'font',
    'font',
    'fontFamily',
    'fontFamily',
    'fontFeatureSettings',
    'fontFeatureSettings',
    'fontKerning',
    'fontKerning',
    'fontSize',
    'fontSize',
    'fontSizeDelta',
    'fontSizeDelta',
    'fontSmoothing',
    'fontSmoothing',
    'fontStretch',
    'fontStretch',
    'fontStyle',
    'fontStyle',
    'fontVariant',
    'fontVariant',
    'fontVariantLigatures',
    'fontVariantLigatures',
    'fontWeight',
    'fontWeight',
    'grid',
    'grid',
    'gridArea',
    'gridArea',
    'gridAutoColumns',
    'gridAutoColumns',
    'gridAutoFlow',
    'gridAutoFlow',
    'gridAutoRows',
    'gridAutoRows',
    'gridColumn',
    'gridColumn',
    'gridColumnEnd',
    'gridColumnEnd',
    'gridColumnStart',
    'gridColumnStart',
    'gridRow',
    'gridRow',
    'gridRowEnd',
    'gridRowEnd',
    'gridRowStart',
    'gridRowStart',
    'gridTemplate',
    'gridTemplate',
    'gridTemplateAreas',
    'gridTemplateAreas',
    'gridTemplateColumns',
    'gridTemplateColumns',
    'gridTemplateRows',
    'gridTemplateRows',
    'height',
    'height',
    'highlight',
    'highlight',
    'hyphenateCharacter',
    'hyphenateCharacter',
    'imageRendering',
    'imageRendering',
    'isolation',
    'isolation',
    'justifyContent',
    'justifyContent',
    'justifySelf',
    'justifySelf',
    'left',
    'left',
    'letterSpacing',
    'letterSpacing',
    'lineBoxContain',
    'lineBoxContain',
    'lineBreak',
    'lineBreak',
    'lineClamp',
    'lineClamp',
    'lineHeight',
    'lineHeight',
    'listStyle',
    'listStyle',
    'listStyleImage',
    'listStyleImage',
    'listStylePosition',
    'listStylePosition',
    'listStyleType',
    'listStyleType',
    'locale',
    'locale',
    'logicalHeight',
    'logicalHeight',
    'logicalWidth',
    'logicalWidth',
    'margin',
    'margin',
    'marginAfter',
    'marginAfter',
    'marginAfterCollapse',
    'marginAfterCollapse',
    'marginBefore',
    'marginBefore',
    'marginBeforeCollapse',
    'marginBeforeCollapse',
    'marginBottom',
    'marginBottom',
    'marginBottomCollapse',
    'marginBottomCollapse',
    'marginCollapse',
    'marginCollapse',
    'marginEnd',
    'marginEnd',
    'marginLeft',
    'marginLeft',
    'marginRight',
    'marginRight',
    'marginStart',
    'marginStart',
    'marginTop',
    'marginTop',
    'marginTopCollapse',
    'marginTopCollapse',
    'mask',
    'mask',
    'maskBoxImage',
    'maskBoxImage',
    'maskBoxImageOutset',
    'maskBoxImageOutset',
    'maskBoxImageRepeat',
    'maskBoxImageRepeat',
    'maskBoxImageSlice',
    'maskBoxImageSlice',
    'maskBoxImageSource',
    'maskBoxImageSource',
    'maskBoxImageWidth',
    'maskBoxImageWidth',
    'maskClip',
    'maskClip',
    'maskComposite',
    'maskComposite',
    'maskImage',
    'maskImage',
    'maskOrigin',
    'maskOrigin',
    'maskPosition',
    'maskPosition',
    'maskPositionX',
    'maskPositionX',
    'maskPositionY',
    'maskPositionY',
    'maskRepeat',
    'maskRepeat',
    'maskRepeatX',
    'maskRepeatX',
    'maskRepeatY',
    'maskRepeatY',
    'maskSize',
    'maskSize',
    'maskSourceType',
    'maskSourceType',
    'maxHeight',
    'maxHeight',
    'maxLogicalHeight',
    'maxLogicalHeight',
    'maxLogicalWidth',
    'maxLogicalWidth',
    'maxWidth',
    'maxWidth',
    'maxZoom',
    'maxZoom',
    'minHeight',
    'minHeight',
    'minLogicalHeight',
    'minLogicalHeight',
    'minLogicalWidth',
    'minLogicalWidth',
    'minWidth',
    'minWidth',
    'minZoom',
    'minZoom',
    'mixBlendMode',
    'mixBlendMode',
    'objectFit',
    'objectFit',
    'objectPosition',
    'objectPosition',
    'opacity',
    'opacity',
    'order',
    'order',
    'orientation',
    'orientation',
    'orphans',
    'orphans',
    'outline',
    'outline',
    'outlineColor',
    'outlineColor',
    'outlineOffset',
    'outlineOffset',
    'outlineStyle',
    'outlineStyle',
    'outlineWidth',
    'outlineWidth',
    'overflow',
    'overflow',
    'overflowWrap',
    'overflowWrap',
    'overflowX',
    'overflowX',
    'overflowY',
    'overflowY',
    'padding',
    'padding',
    'paddingAfter',
    'paddingAfter',
    'paddingBefore',
    'paddingBefore',
    'paddingBottom',
    'paddingBottom',
    'paddingEnd',
    'paddingEnd',
    'paddingLeft',
    'paddingLeft',
    'paddingRight',
    'paddingRight',
    'paddingStart',
    'paddingStart',
    'paddingTop',
    'paddingTop',
    'page',
    'page',
    'pageBreakAfter',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakBefore',
    'pageBreakInside',
    'pageBreakInside',
    'perspective',
    'perspective',
    'perspectiveOrigin',
    'perspectiveOrigin',
    'perspectiveOriginX',
    'perspectiveOriginX',
    'perspectiveOriginY',
    'perspectiveOriginY',
    'pointerEvents',
    'pointerEvents',
    'position',
    'position',
    'printColorAdjust',
    'printColorAdjust',
    'quotes',
    'quotes',
    'resize',
    'resize',
    'right',
    'right',
    'rtlOrdering',
    'rtlOrdering',
    'rubyPosition',
    'rubyPosition',
    'scrollBehavior',
    'scrollBehavior',
    'shapeImageThreshold',
    'shapeImageThreshold',
    'shapeMargin',
    'shapeMargin',
    'shapeOutside',
    'shapeOutside',
    'size',
    'size',
    'speak',
    'speak',
    'src',
    'src',
    'tabSize',
    'tabSize',
    'tableLayout',
    'tableLayout',
    'tapHighlightColor',
    'tapHighlightColor',
    'textAlign',
    'textAlign',
    'textAlignLast',
    'textAlignLast',
    'textCombine',
    'textCombine',
    'textDecoration',
    'textDecoration',
    'textDecorationColor',
    'textDecorationColor',
    'textDecorationLine',
    'textDecorationLine',
    'textDecorationStyle',
    'textDecorationStyle',
    'textDecorationsInEffect',
    'textDecorationsInEffect',
    'textEmphasis',
    'textEmphasis',
    'textEmphasisColor',
    'textEmphasisColor',
    'textEmphasisPosition',
    'textEmphasisPosition',
    'textEmphasisStyle',
    'textEmphasisStyle',
    'textFillColor',
    'textFillColor',
    'textIndent',
    'textIndent',
    'textJustify',
    'textJustify',
    'textLineThroughColor',
    'textLineThroughColor',
    'textLineThroughMode',
    'textLineThroughMode',
    'textLineThroughStyle',
    'textLineThroughStyle',
    'textLineThroughWidth',
    'textLineThroughWidth',
    'textOrientation',
    'textOrientation',
    'textOverflow',
    'textOverflow',
    'textOverlineColor',
    'textOverlineColor',
    'textOverlineMode',
    'textOverlineMode',
    'textOverlineStyle',
    'textOverlineStyle',
    'textOverlineWidth',
    'textOverlineWidth',
    'textRendering',
    'textRendering',
    'textSecurity',
    'textSecurity',
    'textShadow',
    'textShadow',
    'textStroke',
    'textStroke',
    'textStrokeColor',
    'textStrokeColor',
    'textStrokeWidth',
    'textStrokeWidth',
    'textTransform',
    'textTransform',
    'textUnderlineColor',
    'textUnderlineColor',
    'textUnderlineMode',
    'textUnderlineMode',
    'textUnderlinePosition',
    'textUnderlinePosition',
    'textUnderlineStyle',
    'textUnderlineStyle',
    'textUnderlineWidth',
    'textUnderlineWidth',
    'top',
    'top',
    'touchAction',
    'touchAction',
    'touchActionDelay',
    'touchActionDelay',
    'transform',
    'transform',
    'transformOrigin',
    'transformOrigin',
    'transformOriginX',
    'transformOriginX',
    'transformOriginY',
    'transformOriginY',
    'transformOriginZ',
    'transformOriginZ',
    'transformStyle',
    'transformStyle',
    'transition',
    'transition',
    'transitionDelay',
    'transitionDelay',
    'transitionDuration',
    'transitionDuration',
    'transitionProperty',
    'transitionProperty',
    'transitionTimingFunction',
    'transitionTimingFunction',
    'unicodeBidi',
    'unicodeBidi',
    'unicodeRange',
    'unicodeRange',
    'userDrag',
    'userDrag',
    'userModify',
    'userModify',
    'userSelect',
    'userSelect',
    'userZoom',
    'userZoom',
    'verticalAlign',
    'verticalAlign',
    'visibility',
    'visibility',
    'whiteSpace',
    'whiteSpace',
    'widows',
    'widows',
    'width',
    'width',
    'willChange',
    'willChange',
    'wordBreak',
    'wordBreak',
    'wordSpacing',
    'wordSpacing',
    'wordWrap',
    'wordWrap',
    'wrapFlow',
    'wrapFlow',
    'wrapThrough',
    'wrapThrough',
    'writingMode',
    'writingMode',
    'zIndex',
    'zIndex',
    'zoom',
    'zoom'
  ]);
  dart.defineExtensionNames([
    'getPropertyValue',
    'supportsProperty',
    'setProperty',
    'getPropertyPriority',
    'item',
    'removeProperty',
    'background',
    'background',
    'backgroundAttachment',
    'backgroundAttachment',
    'backgroundColor',
    'backgroundColor',
    'backgroundImage',
    'backgroundImage',
    'backgroundPosition',
    'backgroundPosition',
    'backgroundRepeat',
    'backgroundRepeat',
    'border',
    'border',
    'borderBottom',
    'borderBottom',
    'borderBottomColor',
    'borderBottomColor',
    'borderBottomStyle',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderBottomWidth',
    'borderCollapse',
    'borderCollapse',
    'borderColor',
    'borderColor',
    'borderLeft',
    'borderLeft',
    'borderLeftColor',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderLeftWidth',
    'borderRight',
    'borderRight',
    'borderRightColor',
    'borderRightColor',
    'borderRightStyle',
    'borderRightStyle',
    'borderRightWidth',
    'borderRightWidth',
    'borderSpacing',
    'borderSpacing',
    'borderStyle',
    'borderStyle',
    'borderTop',
    'borderTop',
    'borderTopColor',
    'borderTopColor',
    'borderTopStyle',
    'borderTopStyle',
    'borderTopWidth',
    'borderTopWidth',
    'borderWidth',
    'borderWidth',
    'bottom',
    'bottom',
    'captionSide',
    'captionSide',
    'clear',
    'clear',
    'clip',
    'clip',
    'color',
    'color',
    'content',
    'content',
    'cursor',
    'cursor',
    'direction',
    'direction',
    'display',
    'display',
    'emptyCells',
    'emptyCells',
    'font',
    'font',
    'fontFamily',
    'fontFamily',
    'fontSize',
    'fontSize',
    'fontStyle',
    'fontStyle',
    'fontVariant',
    'fontVariant',
    'fontWeight',
    'fontWeight',
    'height',
    'height',
    'left',
    'left',
    'letterSpacing',
    'letterSpacing',
    'lineHeight',
    'lineHeight',
    'listStyle',
    'listStyle',
    'listStyleImage',
    'listStyleImage',
    'listStylePosition',
    'listStylePosition',
    'listStyleType',
    'listStyleType',
    'margin',
    'margin',
    'marginBottom',
    'marginBottom',
    'marginLeft',
    'marginLeft',
    'marginRight',
    'marginRight',
    'marginTop',
    'marginTop',
    'maxHeight',
    'maxHeight',
    'maxWidth',
    'maxWidth',
    'minHeight',
    'minHeight',
    'minWidth',
    'minWidth',
    'outline',
    'outline',
    'outlineColor',
    'outlineColor',
    'outlineStyle',
    'outlineStyle',
    'outlineWidth',
    'outlineWidth',
    'overflow',
    'overflow',
    'padding',
    'padding',
    'paddingBottom',
    'paddingBottom',
    'paddingLeft',
    'paddingLeft',
    'paddingRight',
    'paddingRight',
    'paddingTop',
    'paddingTop',
    'pageBreakAfter',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakBefore',
    'pageBreakInside',
    'pageBreakInside',
    'position',
    'position',
    'quotes',
    'quotes',
    'right',
    'right',
    'tableLayout',
    'tableLayout',
    'textAlign',
    'textAlign',
    'textDecoration',
    'textDecoration',
    'textIndent',
    'textIndent',
    'textTransform',
    'textTransform',
    'top',
    'top',
    'unicodeBidi',
    'unicodeBidi',
    'verticalAlign',
    'verticalAlign',
    'visibility',
    'visibility',
    'whiteSpace',
    'whiteSpace',
    'width',
    'width',
    'wordSpacing',
    'wordSpacing',
    'zIndex',
    'zIndex',
    'cssText',
    'length',
    'parentRule'
  ]);
  html$.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html$.CssStyleDeclarationBase) {
    static new() {
      return html$.CssStyleDeclaration.css('');
    }
    static css(css) {
      let style = html$.Element.tag('div')[dartx.style];
      style[dartx.cssText] = css;
      return style;
    }
    [dartx.getPropertyValue](propertyName) {
      let propValue = this[_getPropertyValueHelper](propertyName);
      return propValue != null ? propValue : '';
    }
    [_getPropertyValueHelper](propertyName) {
      if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
        return this[_getPropertyValue](propertyName);
      } else {
        return this[_getPropertyValue](dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName));
      }
    }
    [dartx.supportsProperty](propertyName) {
      return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
    }
    [_supportsProperty](propertyName) {
      return propertyName in this;
    }
    [dartx.setProperty](propertyName, value, priority) {
      if (priority === void 0) priority = null;
      return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
    }
    [_browserPropertyName](propertyName) {
      let name = html$.CssStyleDeclaration._readCache(propertyName);
      if (typeof name == 'string') return name;
      if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
        name = propertyName;
      } else {
        name = dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName);
      }
      html$.CssStyleDeclaration._writeCache(propertyName, name);
      return name;
    }
    static _readCache(key) {
      return html$.CssStyleDeclaration._propertyCache[key];
    }
    static _writeCache(key, value) {
      html$.CssStyleDeclaration._propertyCache[key] = value;
    }
    static _camelCase(hyphenated) {
      let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
      return replacedMs.replace(/-([\da-z])/ig, (_, letter) => letter.toUpperCase());
    }
    [_setPropertyHelper](propertyName, value, priority) {
      if (priority === void 0) priority = null;
      if (value == null) value = '';
      if (priority == null) priority = '';
      this.setProperty(propertyName, value, priority);
    }
    static get supportsTransitions() {
      return html$.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssText]() {
      return this.cssText;
    }
    set [dartx.cssText](value) {
      this.cssText = value;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.parentRule]() {
      return this.parentRule;
    }
    [dartx.getPropertyPriority](...args) {
      return this.getPropertyPriority.apply(this, args);
    }
    [_getPropertyValue](...args) {
      return this.getPropertyValue.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.removeProperty](...args) {
      return this.removeProperty.apply(this, args);
    }
    get [dartx.background]() {
      return this[_background];
    }
    set [dartx.background](value) {
      this[_background] = value == null ? '' : value;
    }
    get [_background]() {
      return this.background;
    }
    set [_background](value) {
      this.background = value;
    }
    get [dartx.backgroundAttachment]() {
      return this[_backgroundAttachment];
    }
    set [dartx.backgroundAttachment](value) {
      this[_backgroundAttachment] = value == null ? '' : value;
    }
    get [_backgroundAttachment]() {
      return this.backgroundAttachment;
    }
    set [_backgroundAttachment](value) {
      this.backgroundAttachment = value;
    }
    get [dartx.backgroundColor]() {
      return this[_backgroundColor];
    }
    set [dartx.backgroundColor](value) {
      this[_backgroundColor] = value == null ? '' : value;
    }
    get [_backgroundColor]() {
      return this.backgroundColor;
    }
    set [_backgroundColor](value) {
      this.backgroundColor = value;
    }
    get [dartx.backgroundImage]() {
      return this[_backgroundImage];
    }
    set [dartx.backgroundImage](value) {
      this[_backgroundImage] = value == null ? '' : value;
    }
    get [_backgroundImage]() {
      return this.backgroundImage;
    }
    set [_backgroundImage](value) {
      this.backgroundImage = value;
    }
    get [dartx.backgroundPosition]() {
      return this[_backgroundPosition];
    }
    set [dartx.backgroundPosition](value) {
      this[_backgroundPosition] = value == null ? '' : value;
    }
    get [_backgroundPosition]() {
      return this.backgroundPosition;
    }
    set [_backgroundPosition](value) {
      this.backgroundPosition = value;
    }
    get [dartx.backgroundRepeat]() {
      return this[_backgroundRepeat];
    }
    set [dartx.backgroundRepeat](value) {
      this[_backgroundRepeat] = value == null ? '' : value;
    }
    get [_backgroundRepeat]() {
      return this.backgroundRepeat;
    }
    set [_backgroundRepeat](value) {
      this.backgroundRepeat = value;
    }
    get [dartx.border]() {
      return this[_border];
    }
    set [dartx.border](value) {
      this[_border] = value == null ? '' : value;
    }
    get [_border]() {
      return this.border;
    }
    set [_border](value) {
      this.border = value;
    }
    get [dartx.borderBottom]() {
      return this[_borderBottom];
    }
    set [dartx.borderBottom](value) {
      this[_borderBottom] = value == null ? '' : value;
    }
    get [_borderBottom]() {
      return this.borderBottom;
    }
    set [_borderBottom](value) {
      this.borderBottom = value;
    }
    get [dartx.borderBottomColor]() {
      return this[_borderBottomColor];
    }
    set [dartx.borderBottomColor](value) {
      this[_borderBottomColor] = value == null ? '' : value;
    }
    get [_borderBottomColor]() {
      return this.borderBottomColor;
    }
    set [_borderBottomColor](value) {
      this.borderBottomColor = value;
    }
    get [dartx.borderBottomStyle]() {
      return this[_borderBottomStyle];
    }
    set [dartx.borderBottomStyle](value) {
      this[_borderBottomStyle] = value == null ? '' : value;
    }
    get [_borderBottomStyle]() {
      return this.borderBottomStyle;
    }
    set [_borderBottomStyle](value) {
      this.borderBottomStyle = value;
    }
    get [dartx.borderBottomWidth]() {
      return this[_borderBottomWidth];
    }
    set [dartx.borderBottomWidth](value) {
      this[_borderBottomWidth] = value == null ? '' : value;
    }
    get [_borderBottomWidth]() {
      return this.borderBottomWidth;
    }
    set [_borderBottomWidth](value) {
      this.borderBottomWidth = value;
    }
    get [dartx.borderCollapse]() {
      return this[_borderCollapse];
    }
    set [dartx.borderCollapse](value) {
      this[_borderCollapse] = value == null ? '' : value;
    }
    get [_borderCollapse]() {
      return this.borderCollapse;
    }
    set [_borderCollapse](value) {
      this.borderCollapse = value;
    }
    get [dartx.borderColor]() {
      return this[_borderColor];
    }
    set [dartx.borderColor](value) {
      this[_borderColor] = value == null ? '' : value;
    }
    get [_borderColor]() {
      return this.borderColor;
    }
    set [_borderColor](value) {
      this.borderColor = value;
    }
    get [dartx.borderLeft]() {
      return this[_borderLeft];
    }
    set [dartx.borderLeft](value) {
      this[_borderLeft] = value == null ? '' : value;
    }
    get [_borderLeft]() {
      return this.borderLeft;
    }
    set [_borderLeft](value) {
      this.borderLeft = value;
    }
    get [dartx.borderLeftColor]() {
      return this[_borderLeftColor];
    }
    set [dartx.borderLeftColor](value) {
      this[_borderLeftColor] = value == null ? '' : value;
    }
    get [_borderLeftColor]() {
      return this.borderLeftColor;
    }
    set [_borderLeftColor](value) {
      this.borderLeftColor = value;
    }
    get [dartx.borderLeftStyle]() {
      return this[_borderLeftStyle];
    }
    set [dartx.borderLeftStyle](value) {
      this[_borderLeftStyle] = value == null ? '' : value;
    }
    get [_borderLeftStyle]() {
      return this.borderLeftStyle;
    }
    set [_borderLeftStyle](value) {
      this.borderLeftStyle = value;
    }
    get [dartx.borderLeftWidth]() {
      return this[_borderLeftWidth];
    }
    set [dartx.borderLeftWidth](value) {
      this[_borderLeftWidth] = value == null ? '' : value;
    }
    get [_borderLeftWidth]() {
      return this.borderLeftWidth;
    }
    set [_borderLeftWidth](value) {
      this.borderLeftWidth = value;
    }
    get [dartx.borderRight]() {
      return this[_borderRight];
    }
    set [dartx.borderRight](value) {
      this[_borderRight] = value == null ? '' : value;
    }
    get [_borderRight]() {
      return this.borderRight;
    }
    set [_borderRight](value) {
      this.borderRight = value;
    }
    get [dartx.borderRightColor]() {
      return this[_borderRightColor];
    }
    set [dartx.borderRightColor](value) {
      this[_borderRightColor] = value == null ? '' : value;
    }
    get [_borderRightColor]() {
      return this.borderRightColor;
    }
    set [_borderRightColor](value) {
      this.borderRightColor = value;
    }
    get [dartx.borderRightStyle]() {
      return this[_borderRightStyle];
    }
    set [dartx.borderRightStyle](value) {
      this[_borderRightStyle] = value == null ? '' : value;
    }
    get [_borderRightStyle]() {
      return this.borderRightStyle;
    }
    set [_borderRightStyle](value) {
      this.borderRightStyle = value;
    }
    get [dartx.borderRightWidth]() {
      return this[_borderRightWidth];
    }
    set [dartx.borderRightWidth](value) {
      this[_borderRightWidth] = value == null ? '' : value;
    }
    get [_borderRightWidth]() {
      return this.borderRightWidth;
    }
    set [_borderRightWidth](value) {
      this.borderRightWidth = value;
    }
    get [dartx.borderSpacing]() {
      return this[_borderSpacing];
    }
    set [dartx.borderSpacing](value) {
      this[_borderSpacing] = value == null ? '' : value;
    }
    get [_borderSpacing]() {
      return this.borderSpacing;
    }
    set [_borderSpacing](value) {
      this.borderSpacing = value;
    }
    get [dartx.borderStyle]() {
      return this[_borderStyle];
    }
    set [dartx.borderStyle](value) {
      this[_borderStyle] = value == null ? '' : value;
    }
    get [_borderStyle]() {
      return this.borderStyle;
    }
    set [_borderStyle](value) {
      this.borderStyle = value;
    }
    get [dartx.borderTop]() {
      return this[_borderTop];
    }
    set [dartx.borderTop](value) {
      this[_borderTop] = value == null ? '' : value;
    }
    get [_borderTop]() {
      return this.borderTop;
    }
    set [_borderTop](value) {
      this.borderTop = value;
    }
    get [dartx.borderTopColor]() {
      return this[_borderTopColor];
    }
    set [dartx.borderTopColor](value) {
      this[_borderTopColor] = value == null ? '' : value;
    }
    get [_borderTopColor]() {
      return this.borderTopColor;
    }
    set [_borderTopColor](value) {
      this.borderTopColor = value;
    }
    get [dartx.borderTopStyle]() {
      return this[_borderTopStyle];
    }
    set [dartx.borderTopStyle](value) {
      this[_borderTopStyle] = value == null ? '' : value;
    }
    get [_borderTopStyle]() {
      return this.borderTopStyle;
    }
    set [_borderTopStyle](value) {
      this.borderTopStyle = value;
    }
    get [dartx.borderTopWidth]() {
      return this[_borderTopWidth];
    }
    set [dartx.borderTopWidth](value) {
      this[_borderTopWidth] = value == null ? '' : value;
    }
    get [_borderTopWidth]() {
      return this.borderTopWidth;
    }
    set [_borderTopWidth](value) {
      this.borderTopWidth = value;
    }
    get [dartx.borderWidth]() {
      return this[_borderWidth];
    }
    set [dartx.borderWidth](value) {
      this[_borderWidth] = value == null ? '' : value;
    }
    get [_borderWidth]() {
      return this.borderWidth;
    }
    set [_borderWidth](value) {
      this.borderWidth = value;
    }
    get [dartx.bottom]() {
      return this[_bottom];
    }
    set [dartx.bottom](value) {
      this[_bottom] = value == null ? '' : value;
    }
    get [_bottom]() {
      return this.bottom;
    }
    set [_bottom](value) {
      this.bottom = value;
    }
    get [dartx.captionSide]() {
      return this[_captionSide];
    }
    set [dartx.captionSide](value) {
      this[_captionSide] = value == null ? '' : value;
    }
    get [_captionSide]() {
      return this.captionSide;
    }
    set [_captionSide](value) {
      this.captionSide = value;
    }
    get [dartx.clear]() {
      return this[_clear$1];
    }
    set [dartx.clear](value) {
      this[_clear$1] = value == null ? '' : value;
    }
    get [_clear$1]() {
      return this.clear;
    }
    set [_clear$1](value) {
      this.clear = value;
    }
    get [dartx.clip]() {
      return this[_clip];
    }
    set [dartx.clip](value) {
      this[_clip] = value == null ? '' : value;
    }
    get [_clip]() {
      return this.clip;
    }
    set [_clip](value) {
      this.clip = value;
    }
    get [dartx.color]() {
      return this[_color];
    }
    set [dartx.color](value) {
      this[_color] = value == null ? '' : value;
    }
    get [_color]() {
      return this.color;
    }
    set [_color](value) {
      this.color = value;
    }
    get [dartx.content]() {
      return this[_content];
    }
    set [dartx.content](value) {
      this[_content] = value == null ? '' : value;
    }
    get [_content]() {
      return this.content;
    }
    set [_content](value) {
      this.content = value;
    }
    get [dartx.cursor]() {
      return this[_cursor];
    }
    set [dartx.cursor](value) {
      this[_cursor] = value == null ? '' : value;
    }
    get [_cursor]() {
      return this.cursor;
    }
    set [_cursor](value) {
      this.cursor = value;
    }
    get [dartx.direction]() {
      return this[_direction];
    }
    set [dartx.direction](value) {
      this[_direction] = value == null ? '' : value;
    }
    get [_direction]() {
      return this.direction;
    }
    set [_direction](value) {
      this.direction = value;
    }
    get [dartx.display]() {
      return this[_display];
    }
    set [dartx.display](value) {
      this[_display] = value == null ? '' : value;
    }
    get [_display]() {
      return this.display;
    }
    set [_display](value) {
      this.display = value;
    }
    get [dartx.emptyCells]() {
      return this[_emptyCells];
    }
    set [dartx.emptyCells](value) {
      this[_emptyCells] = value == null ? '' : value;
    }
    get [_emptyCells]() {
      return this.emptyCells;
    }
    set [_emptyCells](value) {
      this.emptyCells = value;
    }
    get [dartx.font]() {
      return this[_font];
    }
    set [dartx.font](value) {
      this[_font] = value == null ? '' : value;
    }
    get [_font]() {
      return this.font;
    }
    set [_font](value) {
      this.font = value;
    }
    get [dartx.fontFamily]() {
      return this[_fontFamily];
    }
    set [dartx.fontFamily](value) {
      this[_fontFamily] = value == null ? '' : value;
    }
    get [_fontFamily]() {
      return this.fontFamily;
    }
    set [_fontFamily](value) {
      this.fontFamily = value;
    }
    get [dartx.fontSize]() {
      return this[_fontSize];
    }
    set [dartx.fontSize](value) {
      this[_fontSize] = value == null ? '' : value;
    }
    get [_fontSize]() {
      return this.fontSize;
    }
    set [_fontSize](value) {
      this.fontSize = value;
    }
    get [dartx.fontStyle]() {
      return this[_fontStyle];
    }
    set [dartx.fontStyle](value) {
      this[_fontStyle] = value == null ? '' : value;
    }
    get [_fontStyle]() {
      return this.fontStyle;
    }
    set [_fontStyle](value) {
      this.fontStyle = value;
    }
    get [dartx.fontVariant]() {
      return this[_fontVariant];
    }
    set [dartx.fontVariant](value) {
      this[_fontVariant] = value == null ? '' : value;
    }
    get [_fontVariant]() {
      return this.fontVariant;
    }
    set [_fontVariant](value) {
      this.fontVariant = value;
    }
    get [dartx.fontWeight]() {
      return this[_fontWeight];
    }
    set [dartx.fontWeight](value) {
      this[_fontWeight] = value == null ? '' : value;
    }
    get [_fontWeight]() {
      return this.fontWeight;
    }
    set [_fontWeight](value) {
      this.fontWeight = value;
    }
    get [dartx.height]() {
      return this[_height$];
    }
    set [dartx.height](value) {
      this[_height$] = value == null ? '' : value;
    }
    get [_height$]() {
      return this.height;
    }
    set [_height$](value) {
      this.height = value;
    }
    get [dartx.left]() {
      return this[_left];
    }
    set [dartx.left](value) {
      this[_left] = value == null ? '' : value;
    }
    get [_left]() {
      return this.left;
    }
    set [_left](value) {
      this.left = value;
    }
    get [dartx.letterSpacing]() {
      return this[_letterSpacing];
    }
    set [dartx.letterSpacing](value) {
      this[_letterSpacing] = value == null ? '' : value;
    }
    get [_letterSpacing]() {
      return this.letterSpacing;
    }
    set [_letterSpacing](value) {
      this.letterSpacing = value;
    }
    get [dartx.lineHeight]() {
      return this[_lineHeight];
    }
    set [dartx.lineHeight](value) {
      this[_lineHeight] = value == null ? '' : value;
    }
    get [_lineHeight]() {
      return this.lineHeight;
    }
    set [_lineHeight](value) {
      this.lineHeight = value;
    }
    get [dartx.listStyle]() {
      return this[_listStyle];
    }
    set [dartx.listStyle](value) {
      this[_listStyle] = value == null ? '' : value;
    }
    get [_listStyle]() {
      return this.listStyle;
    }
    set [_listStyle](value) {
      this.listStyle = value;
    }
    get [dartx.listStyleImage]() {
      return this[_listStyleImage];
    }
    set [dartx.listStyleImage](value) {
      this[_listStyleImage] = value == null ? '' : value;
    }
    get [_listStyleImage]() {
      return this.listStyleImage;
    }
    set [_listStyleImage](value) {
      this.listStyleImage = value;
    }
    get [dartx.listStylePosition]() {
      return this[_listStylePosition];
    }
    set [dartx.listStylePosition](value) {
      this[_listStylePosition] = value == null ? '' : value;
    }
    get [_listStylePosition]() {
      return this.listStylePosition;
    }
    set [_listStylePosition](value) {
      this.listStylePosition = value;
    }
    get [dartx.listStyleType]() {
      return this[_listStyleType];
    }
    set [dartx.listStyleType](value) {
      this[_listStyleType] = value == null ? '' : value;
    }
    get [_listStyleType]() {
      return this.listStyleType;
    }
    set [_listStyleType](value) {
      this.listStyleType = value;
    }
    get [dartx.margin]() {
      return this[_margin];
    }
    set [dartx.margin](value) {
      this[_margin] = value == null ? '' : value;
    }
    get [_margin]() {
      return this.margin;
    }
    set [_margin](value) {
      this.margin = value;
    }
    get [dartx.marginBottom]() {
      return this[_marginBottom];
    }
    set [dartx.marginBottom](value) {
      this[_marginBottom] = value == null ? '' : value;
    }
    get [_marginBottom]() {
      return this.marginBottom;
    }
    set [_marginBottom](value) {
      this.marginBottom = value;
    }
    get [dartx.marginLeft]() {
      return this[_marginLeft];
    }
    set [dartx.marginLeft](value) {
      this[_marginLeft] = value == null ? '' : value;
    }
    get [_marginLeft]() {
      return this.marginLeft;
    }
    set [_marginLeft](value) {
      this.marginLeft = value;
    }
    get [dartx.marginRight]() {
      return this[_marginRight];
    }
    set [dartx.marginRight](value) {
      this[_marginRight] = value == null ? '' : value;
    }
    get [_marginRight]() {
      return this.marginRight;
    }
    set [_marginRight](value) {
      this.marginRight = value;
    }
    get [dartx.marginTop]() {
      return this[_marginTop];
    }
    set [dartx.marginTop](value) {
      this[_marginTop] = value == null ? '' : value;
    }
    get [_marginTop]() {
      return this.marginTop;
    }
    set [_marginTop](value) {
      this.marginTop = value;
    }
    get [dartx.maxHeight]() {
      return this[_maxHeight];
    }
    set [dartx.maxHeight](value) {
      this[_maxHeight] = value == null ? '' : value;
    }
    get [_maxHeight]() {
      return this.maxHeight;
    }
    set [_maxHeight](value) {
      this.maxHeight = value;
    }
    get [dartx.maxWidth]() {
      return this[_maxWidth];
    }
    set [dartx.maxWidth](value) {
      this[_maxWidth] = value == null ? '' : value;
    }
    get [_maxWidth]() {
      return this.maxWidth;
    }
    set [_maxWidth](value) {
      this.maxWidth = value;
    }
    get [dartx.minHeight]() {
      return this[_minHeight];
    }
    set [dartx.minHeight](value) {
      this[_minHeight] = value == null ? '' : value;
    }
    get [_minHeight]() {
      return this.minHeight;
    }
    set [_minHeight](value) {
      this.minHeight = value;
    }
    get [dartx.minWidth]() {
      return this[_minWidth];
    }
    set [dartx.minWidth](value) {
      this[_minWidth] = value == null ? '' : value;
    }
    get [_minWidth]() {
      return this.minWidth;
    }
    set [_minWidth](value) {
      this.minWidth = value;
    }
    get [dartx.outline]() {
      return this[_outline];
    }
    set [dartx.outline](value) {
      this[_outline] = value == null ? '' : value;
    }
    get [_outline]() {
      return this.outline;
    }
    set [_outline](value) {
      this.outline = value;
    }
    get [dartx.outlineColor]() {
      return this[_outlineColor];
    }
    set [dartx.outlineColor](value) {
      this[_outlineColor] = value == null ? '' : value;
    }
    get [_outlineColor]() {
      return this.outlineColor;
    }
    set [_outlineColor](value) {
      this.outlineColor = value;
    }
    get [dartx.outlineStyle]() {
      return this[_outlineStyle];
    }
    set [dartx.outlineStyle](value) {
      this[_outlineStyle] = value == null ? '' : value;
    }
    get [_outlineStyle]() {
      return this.outlineStyle;
    }
    set [_outlineStyle](value) {
      this.outlineStyle = value;
    }
    get [dartx.outlineWidth]() {
      return this[_outlineWidth];
    }
    set [dartx.outlineWidth](value) {
      this[_outlineWidth] = value == null ? '' : value;
    }
    get [_outlineWidth]() {
      return this.outlineWidth;
    }
    set [_outlineWidth](value) {
      this.outlineWidth = value;
    }
    get [dartx.overflow]() {
      return this[_overflow];
    }
    set [dartx.overflow](value) {
      this[_overflow] = value == null ? '' : value;
    }
    get [_overflow]() {
      return this.overflow;
    }
    set [_overflow](value) {
      this.overflow = value;
    }
    get [dartx.padding]() {
      return this[_padding];
    }
    set [dartx.padding](value) {
      this[_padding] = value == null ? '' : value;
    }
    get [_padding]() {
      return this.padding;
    }
    set [_padding](value) {
      this.padding = value;
    }
    get [dartx.paddingBottom]() {
      return this[_paddingBottom];
    }
    set [dartx.paddingBottom](value) {
      this[_paddingBottom] = value == null ? '' : value;
    }
    get [_paddingBottom]() {
      return this.paddingBottom;
    }
    set [_paddingBottom](value) {
      this.paddingBottom = value;
    }
    get [dartx.paddingLeft]() {
      return this[_paddingLeft];
    }
    set [dartx.paddingLeft](value) {
      this[_paddingLeft] = value == null ? '' : value;
    }
    get [_paddingLeft]() {
      return this.paddingLeft;
    }
    set [_paddingLeft](value) {
      this.paddingLeft = value;
    }
    get [dartx.paddingRight]() {
      return this[_paddingRight];
    }
    set [dartx.paddingRight](value) {
      this[_paddingRight] = value == null ? '' : value;
    }
    get [_paddingRight]() {
      return this.paddingRight;
    }
    set [_paddingRight](value) {
      this.paddingRight = value;
    }
    get [dartx.paddingTop]() {
      return this[_paddingTop];
    }
    set [dartx.paddingTop](value) {
      this[_paddingTop] = value == null ? '' : value;
    }
    get [_paddingTop]() {
      return this.paddingTop;
    }
    set [_paddingTop](value) {
      this.paddingTop = value;
    }
    get [dartx.pageBreakAfter]() {
      return this[_pageBreakAfter];
    }
    set [dartx.pageBreakAfter](value) {
      this[_pageBreakAfter] = value == null ? '' : value;
    }
    get [_pageBreakAfter]() {
      return this.pageBreakAfter;
    }
    set [_pageBreakAfter](value) {
      this.pageBreakAfter = value;
    }
    get [dartx.pageBreakBefore]() {
      return this[_pageBreakBefore];
    }
    set [dartx.pageBreakBefore](value) {
      this[_pageBreakBefore] = value == null ? '' : value;
    }
    get [_pageBreakBefore]() {
      return this.pageBreakBefore;
    }
    set [_pageBreakBefore](value) {
      this.pageBreakBefore = value;
    }
    get [dartx.pageBreakInside]() {
      return this[_pageBreakInside];
    }
    set [dartx.pageBreakInside](value) {
      this[_pageBreakInside] = value == null ? '' : value;
    }
    get [_pageBreakInside]() {
      return this.pageBreakInside;
    }
    set [_pageBreakInside](value) {
      this.pageBreakInside = value;
    }
    get [dartx.position]() {
      return this[_position$1];
    }
    set [dartx.position](value) {
      this[_position$1] = value == null ? '' : value;
    }
    get [_position$1]() {
      return this.position;
    }
    set [_position$1](value) {
      this.position = value;
    }
    get [dartx.quotes]() {
      return this[_quotes];
    }
    set [dartx.quotes](value) {
      this[_quotes] = value == null ? '' : value;
    }
    get [_quotes]() {
      return this.quotes;
    }
    set [_quotes](value) {
      this.quotes = value;
    }
    get [dartx.right]() {
      return this[_right];
    }
    set [dartx.right](value) {
      this[_right] = value == null ? '' : value;
    }
    get [_right]() {
      return this.right;
    }
    set [_right](value) {
      this.right = value;
    }
    get [dartx.tableLayout]() {
      return this[_tableLayout];
    }
    set [dartx.tableLayout](value) {
      this[_tableLayout] = value == null ? '' : value;
    }
    get [_tableLayout]() {
      return this.tableLayout;
    }
    set [_tableLayout](value) {
      this.tableLayout = value;
    }
    get [dartx.textAlign]() {
      return this[_textAlign];
    }
    set [dartx.textAlign](value) {
      this[_textAlign] = value == null ? '' : value;
    }
    get [_textAlign]() {
      return this.textAlign;
    }
    set [_textAlign](value) {
      this.textAlign = value;
    }
    get [dartx.textDecoration]() {
      return this[_textDecoration];
    }
    set [dartx.textDecoration](value) {
      this[_textDecoration] = value == null ? '' : value;
    }
    get [_textDecoration]() {
      return this.textDecoration;
    }
    set [_textDecoration](value) {
      this.textDecoration = value;
    }
    get [dartx.textIndent]() {
      return this[_textIndent];
    }
    set [dartx.textIndent](value) {
      this[_textIndent] = value == null ? '' : value;
    }
    get [_textIndent]() {
      return this.textIndent;
    }
    set [_textIndent](value) {
      this.textIndent = value;
    }
    get [dartx.textTransform]() {
      return this[_textTransform];
    }
    set [dartx.textTransform](value) {
      this[_textTransform] = value == null ? '' : value;
    }
    get [_textTransform]() {
      return this.textTransform;
    }
    set [_textTransform](value) {
      this.textTransform = value;
    }
    get [dartx.top]() {
      return this[_top];
    }
    set [dartx.top](value) {
      this[_top] = value == null ? '' : value;
    }
    get [_top]() {
      return this.top;
    }
    set [_top](value) {
      this.top = value;
    }
    get [dartx.unicodeBidi]() {
      return this[_unicodeBidi];
    }
    set [dartx.unicodeBidi](value) {
      this[_unicodeBidi] = value == null ? '' : value;
    }
    get [_unicodeBidi]() {
      return this.unicodeBidi;
    }
    set [_unicodeBidi](value) {
      this.unicodeBidi = value;
    }
    get [dartx.verticalAlign]() {
      return this[_verticalAlign];
    }
    set [dartx.verticalAlign](value) {
      this[_verticalAlign] = value == null ? '' : value;
    }
    get [_verticalAlign]() {
      return this.verticalAlign;
    }
    set [_verticalAlign](value) {
      this.verticalAlign = value;
    }
    get [dartx.visibility]() {
      return this[_visibility];
    }
    set [dartx.visibility](value) {
      this[_visibility] = value == null ? '' : value;
    }
    get [_visibility]() {
      return this.visibility;
    }
    set [_visibility](value) {
      this.visibility = value;
    }
    get [dartx.whiteSpace]() {
      return this[_whiteSpace];
    }
    set [dartx.whiteSpace](value) {
      this[_whiteSpace] = value == null ? '' : value;
    }
    get [_whiteSpace]() {
      return this.whiteSpace;
    }
    set [_whiteSpace](value) {
      this.whiteSpace = value;
    }
    get [dartx.width]() {
      return this[_width$];
    }
    set [dartx.width](value) {
      this[_width$] = value == null ? '' : value;
    }
    get [_width$]() {
      return this.width;
    }
    set [_width$](value) {
      this.width = value;
    }
    get [dartx.wordSpacing]() {
      return this[_wordSpacing];
    }
    set [dartx.wordSpacing](value) {
      this[_wordSpacing] = value == null ? '' : value;
    }
    get [_wordSpacing]() {
      return this.wordSpacing;
    }
    set [_wordSpacing](value) {
      this.wordSpacing = value;
    }
    get [dartx.zIndex]() {
      return this[_zIndex];
    }
    set [dartx.zIndex](value) {
      this[_zIndex] = value == null ? '' : value;
    }
    get [_zIndex]() {
      return this.zIndex;
    }
    set [_zIndex](value) {
      this.zIndex = value;
    }
  };
  dart.setSignature(html$.CssStyleDeclaration, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.CssStyleDeclaration, []),
      css: dart.definiteFunctionType(html$.CssStyleDeclaration, [core.String]),
      _: dart.definiteFunctionType(html$.CssStyleDeclaration, [])
    }),
    fields: () => ({
      [dartx.cssText]: core.String,
      [dartx.length]: core.int,
      [dartx.parentRule]: html$.CssRule,
      [_background]: core.String,
      [_backgroundAttachment]: core.String,
      [_backgroundColor]: core.String,
      [_backgroundImage]: core.String,
      [_backgroundPosition]: core.String,
      [_backgroundRepeat]: core.String,
      [_border]: core.String,
      [_borderBottom]: core.String,
      [_borderBottomColor]: core.String,
      [_borderBottomStyle]: core.String,
      [_borderBottomWidth]: core.String,
      [_borderCollapse]: core.String,
      [_borderColor]: core.String,
      [_borderLeft]: core.String,
      [_borderLeftColor]: core.String,
      [_borderLeftStyle]: core.String,
      [_borderLeftWidth]: core.String,
      [_borderRight]: core.String,
      [_borderRightColor]: core.String,
      [_borderRightStyle]: core.String,
      [_borderRightWidth]: core.String,
      [_borderSpacing]: core.String,
      [_borderStyle]: core.String,
      [_borderTop]: core.String,
      [_borderTopColor]: core.String,
      [_borderTopStyle]: core.String,
      [_borderTopWidth]: core.String,
      [_borderWidth]: core.String,
      [_bottom]: core.String,
      [_captionSide]: core.String,
      [_clear$1]: core.String,
      [_clip]: core.String,
      [_color]: core.String,
      [_content]: core.String,
      [_cursor]: core.String,
      [_direction]: core.String,
      [_display]: core.String,
      [_emptyCells]: core.String,
      [_font]: core.String,
      [_fontFamily]: core.String,
      [_fontSize]: core.String,
      [_fontStyle]: core.String,
      [_fontVariant]: core.String,
      [_fontWeight]: core.String,
      [_height$]: core.String,
      [_left]: core.String,
      [_letterSpacing]: core.String,
      [_lineHeight]: core.String,
      [_listStyle]: core.String,
      [_listStyleImage]: core.String,
      [_listStylePosition]: core.String,
      [_listStyleType]: core.String,
      [_margin]: core.String,
      [_marginBottom]: core.String,
      [_marginLeft]: core.String,
      [_marginRight]: core.String,
      [_marginTop]: core.String,
      [_maxHeight]: core.String,
      [_maxWidth]: core.String,
      [_minHeight]: core.String,
      [_minWidth]: core.String,
      [_outline]: core.String,
      [_outlineColor]: core.String,
      [_outlineStyle]: core.String,
      [_outlineWidth]: core.String,
      [_overflow]: core.String,
      [_padding]: core.String,
      [_paddingBottom]: core.String,
      [_paddingLeft]: core.String,
      [_paddingRight]: core.String,
      [_paddingTop]: core.String,
      [_pageBreakAfter]: core.String,
      [_pageBreakBefore]: core.String,
      [_pageBreakInside]: core.String,
      [_position$1]: core.String,
      [_quotes]: core.String,
      [_right]: core.String,
      [_tableLayout]: core.String,
      [_textAlign]: core.String,
      [_textDecoration]: core.String,
      [_textIndent]: core.String,
      [_textTransform]: core.String,
      [_top]: core.String,
      [_unicodeBidi]: core.String,
      [_verticalAlign]: core.String,
      [_visibility]: core.String,
      [_whiteSpace]: core.String,
      [_width$]: core.String,
      [_wordSpacing]: core.String,
      [_zIndex]: core.String
    }),
    methods: () => ({
      [dartx.getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
      [_getPropertyValueHelper]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
      [_supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.setProperty]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
      [_browserPropertyName]: dart.definiteFunctionType(core.String, [core.String]),
      [_setPropertyHelper]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
      [dartx.getPropertyPriority]: dart.definiteFunctionType(core.String, [core.String]),
      [_getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.removeProperty]: dart.definiteFunctionType(core.String, [core.String])
    }),
    sfields: () => ({_propertyCache: dart.dynamic}),
    sgetters: () => ({supportsTransitions: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _readCache: dart.definiteFunctionType(core.String, [core.String]),
      _writeCache: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      _camelCase: dart.definiteFunctionType(core.String, [core.String])
    }),
    names: ['_readCache', '_writeCache', '_camelCase']
  });
  dart.defineLazy(html$.CssStyleDeclaration, {
    get _propertyCache() {
      return {};
    }
  });
  dart.registerExtension(dart.global.CSSStyleDeclaration, html$.CssStyleDeclaration);
  dart.registerExtension(dart.global.MSStyleCSSProperties, html$.CssStyleDeclaration);
  dart.registerExtension(dart.global.CSS2Properties, html$.CssStyleDeclaration);
  const _elementIterable = Symbol('_elementIterable');
  const _elementCssStyleDeclarationSetIterable = Symbol('_elementCssStyleDeclarationSetIterable');
  const _setAll = Symbol('_setAll');
  html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html$.CssStyleDeclarationBase) {
    new(elementIterable) {
      this[_elementIterable] = elementIterable;
      this[_elementCssStyleDeclarationSetIterable] = null;
      this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html$.CssStyleDeclaration)(dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
    }
    getPropertyValue(propertyName) {
      return this[_elementCssStyleDeclarationSetIterable][dartx.first][dartx.getPropertyValue](propertyName);
    }
    setProperty(propertyName, value, priority) {
      if (priority === void 0) priority = null;
      this[_elementCssStyleDeclarationSetIterable][dartx.forEach](dart.fn(e => e[dartx.setProperty](propertyName, value, priority), CssStyleDeclarationTovoid()));
    }
    [_setAll](propertyName, value) {
      value = value == null ? '' : value;
      for (let element of this[_elementIterable]) {
        element.style[propertyName] = value;
      }
    }
    set background(value) {
      this[_setAll]('background', value);
    }
    get background() {
      return super.background;
    }
    set backgroundAttachment(value) {
      this[_setAll]('backgroundAttachment', value);
    }
    get backgroundAttachment() {
      return super.backgroundAttachment;
    }
    set backgroundColor(value) {
      this[_setAll]('backgroundColor', value);
    }
    get backgroundColor() {
      return super.backgroundColor;
    }
    set backgroundImage(value) {
      this[_setAll]('backgroundImage', value);
    }
    get backgroundImage() {
      return super.backgroundImage;
    }
    set backgroundPosition(value) {
      this[_setAll]('backgroundPosition', value);
    }
    get backgroundPosition() {
      return super.backgroundPosition;
    }
    set backgroundRepeat(value) {
      this[_setAll]('backgroundRepeat', value);
    }
    get backgroundRepeat() {
      return super.backgroundRepeat;
    }
    set border(value) {
      this[_setAll]('border', value);
    }
    get border() {
      return super.border;
    }
    set borderBottom(value) {
      this[_setAll]('borderBottom', value);
    }
    get borderBottom() {
      return super.borderBottom;
    }
    set borderBottomColor(value) {
      this[_setAll]('borderBottomColor', value);
    }
    get borderBottomColor() {
      return super.borderBottomColor;
    }
    set borderBottomStyle(value) {
      this[_setAll]('borderBottomStyle', value);
    }
    get borderBottomStyle() {
      return super.borderBottomStyle;
    }
    set borderBottomWidth(value) {
      this[_setAll]('borderBottomWidth', value);
    }
    get borderBottomWidth() {
      return super.borderBottomWidth;
    }
    set borderCollapse(value) {
      this[_setAll]('borderCollapse', value);
    }
    get borderCollapse() {
      return super.borderCollapse;
    }
    set borderColor(value) {
      this[_setAll]('borderColor', value);
    }
    get borderColor() {
      return super.borderColor;
    }
    set borderLeft(value) {
      this[_setAll]('borderLeft', value);
    }
    get borderLeft() {
      return super.borderLeft;
    }
    set borderLeftColor(value) {
      this[_setAll]('borderLeftColor', value);
    }
    get borderLeftColor() {
      return super.borderLeftColor;
    }
    set borderLeftStyle(value) {
      this[_setAll]('borderLeftStyle', value);
    }
    get borderLeftStyle() {
      return super.borderLeftStyle;
    }
    set borderLeftWidth(value) {
      this[_setAll]('borderLeftWidth', value);
    }
    get borderLeftWidth() {
      return super.borderLeftWidth;
    }
    set borderRight(value) {
      this[_setAll]('borderRight', value);
    }
    get borderRight() {
      return super.borderRight;
    }
    set borderRightColor(value) {
      this[_setAll]('borderRightColor', value);
    }
    get borderRightColor() {
      return super.borderRightColor;
    }
    set borderRightStyle(value) {
      this[_setAll]('borderRightStyle', value);
    }
    get borderRightStyle() {
      return super.borderRightStyle;
    }
    set borderRightWidth(value) {
      this[_setAll]('borderRightWidth', value);
    }
    get borderRightWidth() {
      return super.borderRightWidth;
    }
    set borderSpacing(value) {
      this[_setAll]('borderSpacing', value);
    }
    get borderSpacing() {
      return super.borderSpacing;
    }
    set borderStyle(value) {
      this[_setAll]('borderStyle', value);
    }
    get borderStyle() {
      return super.borderStyle;
    }
    set borderTop(value) {
      this[_setAll]('borderTop', value);
    }
    get borderTop() {
      return super.borderTop;
    }
    set borderTopColor(value) {
      this[_setAll]('borderTopColor', value);
    }
    get borderTopColor() {
      return super.borderTopColor;
    }
    set borderTopStyle(value) {
      this[_setAll]('borderTopStyle', value);
    }
    get borderTopStyle() {
      return super.borderTopStyle;
    }
    set borderTopWidth(value) {
      this[_setAll]('borderTopWidth', value);
    }
    get borderTopWidth() {
      return super.borderTopWidth;
    }
    set borderWidth(value) {
      this[_setAll]('borderWidth', value);
    }
    get borderWidth() {
      return super.borderWidth;
    }
    set bottom(value) {
      this[_setAll]('bottom', value);
    }
    get bottom() {
      return super.bottom;
    }
    set captionSide(value) {
      this[_setAll]('captionSide', value);
    }
    get captionSide() {
      return super.captionSide;
    }
    set clear(value) {
      this[_setAll]('clear', value);
    }
    get clear() {
      return super.clear;
    }
    set clip(value) {
      this[_setAll]('clip', value);
    }
    get clip() {
      return super.clip;
    }
    set color(value) {
      this[_setAll]('color', value);
    }
    get color() {
      return super.color;
    }
    set content(value) {
      this[_setAll]('content', value);
    }
    get content() {
      return super.content;
    }
    set cursor(value) {
      this[_setAll]('cursor', value);
    }
    get cursor() {
      return super.cursor;
    }
    set direction(value) {
      this[_setAll]('direction', value);
    }
    get direction() {
      return super.direction;
    }
    set display(value) {
      this[_setAll]('display', value);
    }
    get display() {
      return super.display;
    }
    set emptyCells(value) {
      this[_setAll]('emptyCells', value);
    }
    get emptyCells() {
      return super.emptyCells;
    }
    set font(value) {
      this[_setAll]('font', value);
    }
    get font() {
      return super.font;
    }
    set fontFamily(value) {
      this[_setAll]('fontFamily', value);
    }
    get fontFamily() {
      return super.fontFamily;
    }
    set fontSize(value) {
      this[_setAll]('fontSize', value);
    }
    get fontSize() {
      return super.fontSize;
    }
    set fontStyle(value) {
      this[_setAll]('fontStyle', value);
    }
    get fontStyle() {
      return super.fontStyle;
    }
    set fontVariant(value) {
      this[_setAll]('fontVariant', value);
    }
    get fontVariant() {
      return super.fontVariant;
    }
    set fontWeight(value) {
      this[_setAll]('fontWeight', value);
    }
    get fontWeight() {
      return super.fontWeight;
    }
    set height(value) {
      this[_setAll]('height', value);
    }
    get height() {
      return super.height;
    }
    set left(value) {
      this[_setAll]('left', value);
    }
    get left() {
      return super.left;
    }
    set letterSpacing(value) {
      this[_setAll]('letterSpacing', value);
    }
    get letterSpacing() {
      return super.letterSpacing;
    }
    set lineHeight(value) {
      this[_setAll]('lineHeight', value);
    }
    get lineHeight() {
      return super.lineHeight;
    }
    set listStyle(value) {
      this[_setAll]('listStyle', value);
    }
    get listStyle() {
      return super.listStyle;
    }
    set listStyleImage(value) {
      this[_setAll]('listStyleImage', value);
    }
    get listStyleImage() {
      return super.listStyleImage;
    }
    set listStylePosition(value) {
      this[_setAll]('listStylePosition', value);
    }
    get listStylePosition() {
      return super.listStylePosition;
    }
    set listStyleType(value) {
      this[_setAll]('listStyleType', value);
    }
    get listStyleType() {
      return super.listStyleType;
    }
    set margin(value) {
      this[_setAll]('margin', value);
    }
    get margin() {
      return super.margin;
    }
    set marginBottom(value) {
      this[_setAll]('marginBottom', value);
    }
    get marginBottom() {
      return super.marginBottom;
    }
    set marginLeft(value) {
      this[_setAll]('marginLeft', value);
    }
    get marginLeft() {
      return super.marginLeft;
    }
    set marginRight(value) {
      this[_setAll]('marginRight', value);
    }
    get marginRight() {
      return super.marginRight;
    }
    set marginTop(value) {
      this[_setAll]('marginTop', value);
    }
    get marginTop() {
      return super.marginTop;
    }
    set maxHeight(value) {
      this[_setAll]('maxHeight', value);
    }
    get maxHeight() {
      return super.maxHeight;
    }
    set maxWidth(value) {
      this[_setAll]('maxWidth', value);
    }
    get maxWidth() {
      return super.maxWidth;
    }
    set minHeight(value) {
      this[_setAll]('minHeight', value);
    }
    get minHeight() {
      return super.minHeight;
    }
    set minWidth(value) {
      this[_setAll]('minWidth', value);
    }
    get minWidth() {
      return super.minWidth;
    }
    set outline(value) {
      this[_setAll]('outline', value);
    }
    get outline() {
      return super.outline;
    }
    set outlineColor(value) {
      this[_setAll]('outlineColor', value);
    }
    get outlineColor() {
      return super.outlineColor;
    }
    set outlineStyle(value) {
      this[_setAll]('outlineStyle', value);
    }
    get outlineStyle() {
      return super.outlineStyle;
    }
    set outlineWidth(value) {
      this[_setAll]('outlineWidth', value);
    }
    get outlineWidth() {
      return super.outlineWidth;
    }
    set overflow(value) {
      this[_setAll]('overflow', value);
    }
    get overflow() {
      return super.overflow;
    }
    set padding(value) {
      this[_setAll]('padding', value);
    }
    get padding() {
      return super.padding;
    }
    set paddingBottom(value) {
      this[_setAll]('paddingBottom', value);
    }
    get paddingBottom() {
      return super.paddingBottom;
    }
    set paddingLeft(value) {
      this[_setAll]('paddingLeft', value);
    }
    get paddingLeft() {
      return super.paddingLeft;
    }
    set paddingRight(value) {
      this[_setAll]('paddingRight', value);
    }
    get paddingRight() {
      return super.paddingRight;
    }
    set paddingTop(value) {
      this[_setAll]('paddingTop', value);
    }
    get paddingTop() {
      return super.paddingTop;
    }
    set pageBreakAfter(value) {
      this[_setAll]('pageBreakAfter', value);
    }
    get pageBreakAfter() {
      return super.pageBreakAfter;
    }
    set pageBreakBefore(value) {
      this[_setAll]('pageBreakBefore', value);
    }
    get pageBreakBefore() {
      return super.pageBreakBefore;
    }
    set pageBreakInside(value) {
      this[_setAll]('pageBreakInside', value);
    }
    get pageBreakInside() {
      return super.pageBreakInside;
    }
    set position(value) {
      this[_setAll]('position', value);
    }
    get position() {
      return super.position;
    }
    set quotes(value) {
      this[_setAll]('quotes', value);
    }
    get quotes() {
      return super.quotes;
    }
    set right(value) {
      this[_setAll]('right', value);
    }
    get right() {
      return super.right;
    }
    set tableLayout(value) {
      this[_setAll]('tableLayout', value);
    }
    get tableLayout() {
      return super.tableLayout;
    }
    set textAlign(value) {
      this[_setAll]('textAlign', value);
    }
    get textAlign() {
      return super.textAlign;
    }
    set textDecoration(value) {
      this[_setAll]('textDecoration', value);
    }
    get textDecoration() {
      return super.textDecoration;
    }
    set textIndent(value) {
      this[_setAll]('textIndent', value);
    }
    get textIndent() {
      return super.textIndent;
    }
    set textTransform(value) {
      this[_setAll]('textTransform', value);
    }
    get textTransform() {
      return super.textTransform;
    }
    set top(value) {
      this[_setAll]('top', value);
    }
    get top() {
      return super.top;
    }
    set unicodeBidi(value) {
      this[_setAll]('unicodeBidi', value);
    }
    get unicodeBidi() {
      return super.unicodeBidi;
    }
    set verticalAlign(value) {
      this[_setAll]('verticalAlign', value);
    }
    get verticalAlign() {
      return super.verticalAlign;
    }
    set visibility(value) {
      this[_setAll]('visibility', value);
    }
    get visibility() {
      return super.visibility;
    }
    set whiteSpace(value) {
      this[_setAll]('whiteSpace', value);
    }
    get whiteSpace() {
      return super.whiteSpace;
    }
    set width(value) {
      this[_setAll]('width', value);
    }
    get width() {
      return super.width;
    }
    set wordSpacing(value) {
      this[_setAll]('wordSpacing', value);
    }
    get wordSpacing() {
      return super.wordSpacing;
    }
    set zIndex(value) {
      this[_setAll]('zIndex', value);
    }
    get zIndex() {
      return super.zIndex;
    }
  };
  dart.setSignature(html$._CssStyleDeclarationSet, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CssStyleDeclarationSet, [IterableOfElement()])}),
    fields: () => ({
      [_elementIterable]: IterableOfElement(),
      [_elementCssStyleDeclarationSetIterable]: IterableOfCssStyleDeclaration()
    }),
    methods: () => ({
      getPropertyValue: dart.definiteFunctionType(core.String, [core.String]),
      setProperty: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
      [_setAll]: dart.definiteFunctionType(dart.void, [core.String, core.String])
    })
  });
  dart.defineExtensionMembers(html$._CssStyleDeclarationSet, [
    'getPropertyValue',
    'setProperty',
    'background',
    'backgroundAttachment',
    'backgroundColor',
    'backgroundImage',
    'backgroundPosition',
    'backgroundRepeat',
    'border',
    'borderBottom',
    'borderBottomColor',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderCollapse',
    'borderColor',
    'borderLeft',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderRight',
    'borderRightColor',
    'borderRightStyle',
    'borderRightWidth',
    'borderSpacing',
    'borderStyle',
    'borderTop',
    'borderTopColor',
    'borderTopStyle',
    'borderTopWidth',
    'borderWidth',
    'bottom',
    'captionSide',
    'clear',
    'clip',
    'color',
    'content',
    'cursor',
    'direction',
    'display',
    'emptyCells',
    'font',
    'fontFamily',
    'fontSize',
    'fontStyle',
    'fontVariant',
    'fontWeight',
    'height',
    'left',
    'letterSpacing',
    'lineHeight',
    'listStyle',
    'listStyleImage',
    'listStylePosition',
    'listStyleType',
    'margin',
    'marginBottom',
    'marginLeft',
    'marginRight',
    'marginTop',
    'maxHeight',
    'maxWidth',
    'minHeight',
    'minWidth',
    'outline',
    'outlineColor',
    'outlineStyle',
    'outlineWidth',
    'overflow',
    'padding',
    'paddingBottom',
    'paddingLeft',
    'paddingRight',
    'paddingTop',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakInside',
    'position',
    'quotes',
    'right',
    'tableLayout',
    'textAlign',
    'textDecoration',
    'textIndent',
    'textTransform',
    'top',
    'unicodeBidi',
    'verticalAlign',
    'visibility',
    'whiteSpace',
    'width',
    'wordSpacing',
    'zIndex'
  ]);
  dart.defineExtensionNames([
    'selectorText',
    'style'
  ]);
  html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.selectorText]() {
      return this.selectorText;
    }
    set [dartx.selectorText](value) {
      this.selectorText = value;
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssStyleRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleRule, [])}),
    fields: () => ({
      [dartx.selectorText]: core.String,
      [dartx.style]: html$.CssStyleDeclaration
    })
  });
  dart.registerExtension(dart.global.CSSStyleRule, html$.CssStyleRule);
  dart.defineExtensionNames([
    'disabled',
    'href',
    'media',
    'ownerNode',
    'parentStyleSheet',
    'title',
    'type'
  ]);
  html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    get [dartx.media]() {
      return this.media;
    }
    get [dartx.ownerNode]() {
      return this.ownerNode;
    }
    get [dartx.parentStyleSheet]() {
      return this.parentStyleSheet;
    }
    get [dartx.title]() {
      return this.title;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.StyleSheet, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StyleSheet, [])}),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.href]: core.String,
      [dartx.media]: html$.MediaList,
      [dartx.ownerNode]: html$.Node,
      [dartx.parentStyleSheet]: html$.StyleSheet,
      [dartx.title]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.StyleSheet, html$.StyleSheet);
  dart.defineExtensionNames([
    'addRule',
    'deleteRule',
    'insertRule',
    'removeRule',
    'cssRules',
    'ownerRule',
    'rules'
  ]);
  html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    get [dartx.ownerRule]() {
      return this.ownerRule;
    }
    get [dartx.rules]() {
      return this.rules;
    }
    [dartx.addRule](...args) {
      return this.addRule.apply(this, args);
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.insertRule](...args) {
      return this.insertRule.apply(this, args);
    }
    [dartx.removeRule](...args) {
      return this.removeRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssStyleSheet, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleSheet, [])}),
    fields: () => ({
      [dartx.cssRules]: ListOfCssRule(),
      [dartx.ownerRule]: html$.CssRule,
      [dartx.rules]: ListOfCssRule()
    }),
    methods: () => ({
      [dartx.addRule]: dart.definiteFunctionType(core.int, [core.String, core.String], [core.int]),
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String], [core.int]),
      [dartx.removeRule]: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  dart.registerExtension(dart.global.CSSStyleSheet, html$.CssStyleSheet);
  dart.defineExtensionNames([
    'deleteRule',
    'insertRule',
    'conditionText',
    'cssRules'
  ]);
  html$.CssSupportsRule = class CssSupportsRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.conditionText]() {
      return this.conditionText;
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.insertRule](...args) {
      return this.insertRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssSupportsRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssSupportsRule, [])}),
    fields: () => ({
      [dartx.conditionText]: core.String,
      [dartx.cssRules]: ListOfCssRule()
    }),
    methods: () => ({
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
    })
  });
  dart.registerExtension(dart.global.CSSSupportsRule, html$.CssSupportsRule);
  dart.defineExtensionNames([
    'style'
  ]);
  html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssViewportRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssViewportRule, [])}),
    fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
  });
  dart.registerExtension(dart.global.CSSViewportRule, html$.CssViewportRule);
  const _dartDetail = Symbol('_dartDetail');
  const _initCustomEvent = Symbol('_initCustomEvent');
  const _detail = Symbol('_detail');
  const _get__detail = Symbol('_get__detail');
  dart.defineExtensionNames([
    'detail'
  ]);
  html$.CustomEvent = class CustomEvent extends html$.Event {
    get [_dartDetail]() {
      return this._dartDetail;
    }
    set [_dartDetail](value) {
      this._dartDetail = value;
    }
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let detail = opts && 'detail' in opts ? opts.detail : null;
      let e = html$.CustomEvent._check(html$.document[_createEvent]('CustomEvent'));
      e[_dartDetail] = detail;
      if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
        try {
          detail = html_common.convertDartToNative_SerializedScriptValue(detail);
          e[_initCustomEvent](type, canBubble, cancelable, detail);
        } catch (_) {
          e[_initCustomEvent](type, canBubble, cancelable, null);
        }

      } else {
        e[_initCustomEvent](type, canBubble, cancelable, null);
      }
      return e;
    }
    get [dartx.detail]() {
      if (this[_dartDetail] != null) {
        return this[_dartDetail];
      }
      return this[_detail];
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.CustomEvent._create_1(type, eventInitDict_1);
      }
      return html$.CustomEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new CustomEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new CustomEvent(type);
    }
    get [_detail]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get__detail]);
    }
    get [_get__detail]() {
      return this.detail;
    }
    [_initCustomEvent](...args) {
      return this.initCustomEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.CustomEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
      _: dart.definiteFunctionType(html$.CustomEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_dartDetail]: dart.dynamic,
      [_get__detail]: dart.dynamic
    }),
    getters: () => ({
      [dartx.detail]: dart.definiteFunctionType(dart.dynamic, []),
      [_detail]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({[_initCustomEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.CustomEvent, html$.CustomEvent);
  html$.DListElement = class DListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DListElement._check(html$.document[dartx.createElement]("dl"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.DListElement, 'created');
  dart.setSignature(html$.DListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DListElement, []),
      new: dart.definiteFunctionType(html$.DListElement, []),
      created: dart.definiteFunctionType(html$.DListElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDListElement, html$.DListElement);
  dart.defineExtensionNames([
    'options'
  ]);
  html$.DataListElement = class DataListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DataListElement._check(html$.document[dartx.createElement]("datalist"));
    }
    created() {
      this[dartx.options] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('datalist');
    }
    get [dartx.options]() {
      return this.options;
    }
  };
  dart.defineNamedConstructor(html$.DataListElement, 'created');
  dart.setSignature(html$.DataListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DataListElement, []),
      new: dart.definiteFunctionType(html$.DataListElement, []),
      created: dart.definiteFunctionType(html$.DataListElement, [])
    }),
    fields: () => ({[dartx.options]: ListOfNode()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLDataListElement, html$.DataListElement);
  dart.defineExtensionNames([
    'clearData',
    'getData',
    'setData',
    'setDragImage',
    'dropEffect',
    'effectAllowed',
    'files',
    'items',
    'types'
  ]);
  html$.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.dropEffect]() {
      return this.dropEffect;
    }
    set [dartx.dropEffect](value) {
      this.dropEffect = value;
    }
    get [dartx.effectAllowed]() {
      return this.effectAllowed;
    }
    set [dartx.effectAllowed](value) {
      this.effectAllowed = value;
    }
    get [dartx.files]() {
      return this.files;
    }
    get [dartx.items]() {
      return this.items;
    }
    get [dartx.types]() {
      return this.types;
    }
    [dartx.clearData](...args) {
      return this.clearData.apply(this, args);
    }
    [dartx.getData](...args) {
      return this.getData.apply(this, args);
    }
    [dartx.setData](...args) {
      return this.setData.apply(this, args);
    }
    [dartx.setDragImage](...args) {
      return this.setDragImage.apply(this, args);
    }
  };
  dart.setSignature(html$.DataTransfer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransfer, [])}),
    fields: () => ({
      [dartx.dropEffect]: core.String,
      [dartx.effectAllowed]: core.String,
      [dartx.files]: ListOfFile(),
      [dartx.items]: html$.DataTransferItemList,
      [dartx.types]: ListOfString()
    }),
    methods: () => ({
      [dartx.clearData]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.getData]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.setData]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html$.Element, core.int, core.int])
    })
  });
  dart.registerExtension(dart.global.DataTransfer, html$.DataTransfer);
  const _getAsString = Symbol('_getAsString');
  dart.defineExtensionNames([
    'getAsFile',
    'getAsString',
    'getAsEntry',
    'kind',
    'type'
  ]);
  html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.getAsFile](...args) {
      return this.getAsFile.apply(this, args);
    }
    [_getAsString](...args) {
      return this.getAsString.apply(this, args);
    }
    [dartx.getAsString]() {
      let completer = CompleterOfString().new();
      this[_getAsString](dart.fn(value => {
        completer.complete(value);
      }, StringTovoid$()));
      return completer.future;
    }
    [dartx.getAsEntry](...args) {
      return this.webkitGetAsEntry.apply(this, args);
    }
  };
  dart.setSignature(html$.DataTransferItem, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItem, [])}),
    fields: () => ({
      [dartx.kind]: core.String,
      [dartx.type]: core.String
    }),
    methods: () => ({
      [dartx.getAsFile]: dart.definiteFunctionType(html$.Blob, []),
      [_getAsString]: dart.definiteFunctionType(dart.void, [html$._StringCallback]),
      [dartx.getAsString]: dart.definiteFunctionType(async.Future$(core.String), []),
      [dartx.getAsEntry]: dart.definiteFunctionType(html$.Entry, [])
    })
  });
  dart.registerExtension(dart.global.DataTransferItem, html$.DataTransferItem);
  dart.defineExtensionNames([
    'add',
    'addData',
    'addFile',
    'clear',
    'item',
    'remove',
    '_get',
    'length'
  ]);
  html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.addData](...args) {
      return this.add.apply(this, args);
    }
    [dartx.addFile](...args) {
      return this.add.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
    [dartx._get](index) {
      return this[index];
    }
  };
  dart.setSignature(html$.DataTransferItemList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItemList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(html$.DataTransferItem, [dart.dynamic], [core.String]),
      [dartx.addData]: dart.definiteFunctionType(html$.DataTransferItem, [core.String, core.String]),
      [dartx.addFile]: dart.definiteFunctionType(html$.DataTransferItem, [html$.File]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.item]: dart.definiteFunctionType(html$.DataTransferItem, [core.int]),
      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx._get]: dart.definiteFunctionType(html$.DataTransferItem, [core.int])
    })
  });
  dart.registerExtension(dart.global.DataTransferItemList, html$.DataTransferItemList);
  html$.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
  dart.defineExtensionNames([
    'postMessage',
    'onMessage'
  ]);
  html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.DedicatedWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DedicatedWorkerGlobalScope, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html$.DedicatedWorkerGlobalScope);
  dart.defineExtensionNames([
    'session'
  ]);
  html$.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
      }
      return html$.DefaultSessionStartEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new DefaultSessionStartEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new DefaultSessionStartEvent(type);
    }
    get [dartx.session]() {
      return this.session;
    }
  };
  dart.setSignature(html$.DefaultSessionStartEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DefaultSessionStartEvent, []),
      new: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.session]: html$.PresentationSession}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DefaultSessionStartEvent, html$.DefaultSessionStartEvent);
  dart.defineExtensionNames([
    'queryUsageAndQuota',
    'requestQuota'
  ]);
  html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.queryUsageAndQuota](...args) {
      return this.queryUsageAndQuota.apply(this, args);
    }
    [dartx.requestQuota](...args) {
      return this.requestQuota.apply(this, args);
    }
  };
  dart.setSignature(html$.DeprecatedStorageInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageInfo, [])}),
    methods: () => ({
      [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageUsageCallback, html$.StorageErrorCallback]),
      [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
    }),
    sfields: () => ({
      PERSISTENT: core.int,
      TEMPORARY: core.int
    })
  });
  html$.DeprecatedStorageInfo.PERSISTENT = 1;
  html$.DeprecatedStorageInfo.TEMPORARY = 0;
  dart.registerExtension(dart.global.DeprecatedStorageInfo, html$.DeprecatedStorageInfo);
  dart.defineExtensionNames([
    'queryUsageAndQuota',
    'requestQuota'
  ]);
  html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.queryUsageAndQuota](...args) {
      return this.queryUsageAndQuota.apply(this, args);
    }
    [dartx.requestQuota](...args) {
      return this.requestQuota.apply(this, args);
    }
  };
  dart.setSignature(html$.DeprecatedStorageQuota, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageQuota, [])}),
    methods: () => ({
      [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html$.StorageUsageCallback], [html$.StorageErrorCallback]),
      [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
    })
  });
  dart.registerExtension(dart.global.DeprecatedStorageQuota, html$.DeprecatedStorageQuota);
  dart.defineExtensionNames([
    'open'
  ]);
  html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DetailsElement._check(html$.document[dartx.createElement]("details"));
    }
    created() {
      this[dartx.open] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('details');
    }
    get [dartx.open]() {
      return this.open;
    }
    set [dartx.open](value) {
      this.open = value;
    }
  };
  dart.defineNamedConstructor(html$.DetailsElement, 'created');
  dart.setSignature(html$.DetailsElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DetailsElement, []),
      new: dart.definiteFunctionType(html$.DetailsElement, []),
      created: dart.definiteFunctionType(html$.DetailsElement, [])
    }),
    fields: () => ({[dartx.open]: core.bool}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLDetailsElement, html$.DetailsElement);
  dart.defineExtensionNames([
    'x',
    'y',
    'z'
  ]);
  html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.setSignature(html$.DeviceAcceleration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceAcceleration, [])}),
    fields: () => ({
      [dartx.x]: core.double,
      [dartx.y]: core.double,
      [dartx.z]: core.double
    })
  });
  dart.registerExtension(dart.global.DeviceAcceleration, html$.DeviceAcceleration);
  dart.defineExtensionNames([
    'value'
  ]);
  html$.DeviceLightEvent = class DeviceLightEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.DeviceLightEvent._create_1(type, eventInitDict_1);
      }
      return html$.DeviceLightEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new DeviceLightEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new DeviceLightEvent(type);
    }
    get [dartx.value]() {
      return this.value;
    }
  };
  dart.setSignature(html$.DeviceLightEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DeviceLightEvent, []),
      new: dart.definiteFunctionType(html$.DeviceLightEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.value]: core.double}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DeviceLightEvent, html$.DeviceLightEvent);
  dart.defineExtensionNames([
    'initDeviceMotionEvent',
    'acceleration',
    'accelerationIncludingGravity',
    'interval',
    'rotationRate'
  ]);
  html$.DeviceMotionEvent = class DeviceMotionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.acceleration]() {
      return this.acceleration;
    }
    get [dartx.accelerationIncludingGravity]() {
      return this.accelerationIncludingGravity;
    }
    get [dartx.interval]() {
      return this.interval;
    }
    get [dartx.rotationRate]() {
      return this.rotationRate;
    }
    [dartx.initDeviceMotionEvent](...args) {
      return this.initDeviceMotionEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.DeviceMotionEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceMotionEvent, [])}),
    fields: () => ({
      [dartx.acceleration]: html$.DeviceAcceleration,
      [dartx.accelerationIncludingGravity]: html$.DeviceAcceleration,
      [dartx.interval]: core.double,
      [dartx.rotationRate]: html$.DeviceRotationRate
    }),
    methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.DeviceAcceleration, html$.DeviceAcceleration, html$.DeviceRotationRate, core.num])})
  });
  dart.registerExtension(dart.global.DeviceMotionEvent, html$.DeviceMotionEvent);
  const _initDeviceOrientationEvent = Symbol('_initDeviceOrientationEvent');
  dart.defineExtensionNames([
    'absolute',
    'alpha',
    'beta',
    'gamma'
  ]);
  html$.DeviceOrientationEvent = class DeviceOrientationEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let alpha = opts && 'alpha' in opts ? opts.alpha : 0;
      let beta = opts && 'beta' in opts ? opts.beta : 0;
      let gamma = opts && 'gamma' in opts ? opts.gamma : 0;
      let absolute = opts && 'absolute' in opts ? opts.absolute : false;
      let e = html$.DeviceOrientationEvent._check(html$.document[_createEvent]("DeviceOrientationEvent"));
      e[_initDeviceOrientationEvent](type, canBubble, cancelable, alpha, beta, gamma, absolute);
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.absolute]() {
      return this.absolute;
    }
    get [dartx.alpha]() {
      return this.alpha;
    }
    get [dartx.beta]() {
      return this.beta;
    }
    get [dartx.gamma]() {
      return this.gamma;
    }
    [_initDeviceOrientationEvent](...args) {
      return this.initDeviceOrientationEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.DeviceOrientationEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
      _: dart.definiteFunctionType(html$.DeviceOrientationEvent, [])
    }),
    fields: () => ({
      [dartx.absolute]: core.bool,
      [dartx.alpha]: core.double,
      [dartx.beta]: core.double,
      [dartx.gamma]: core.double
    }),
    methods: () => ({[_initDeviceOrientationEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.num, core.num, core.num, core.bool])})
  });
  dart.registerExtension(dart.global.DeviceOrientationEvent, html$.DeviceOrientationEvent);
  dart.defineExtensionNames([
    'alpha',
    'beta',
    'gamma'
  ]);
  html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.alpha]() {
      return this.alpha;
    }
    get [dartx.beta]() {
      return this.beta;
    }
    get [dartx.gamma]() {
      return this.gamma;
    }
  };
  dart.setSignature(html$.DeviceRotationRate, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceRotationRate, [])}),
    fields: () => ({
      [dartx.alpha]: core.double,
      [dartx.beta]: core.double,
      [dartx.gamma]: core.double
    })
  });
  dart.registerExtension(dart.global.DeviceRotationRate, html$.DeviceRotationRate);
  dart.defineExtensionNames([
    'close',
    'show',
    'showModal',
    'open',
    'returnValue'
  ]);
  html$.DialogElement = class DialogElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.open] = null;
      this[dartx.returnValue] = null;
      super.created();
    }
    get [dartx.open]() {
      return this.open;
    }
    set [dartx.open](value) {
      this.open = value;
    }
    get [dartx.returnValue]() {
      return this.returnValue;
    }
    set [dartx.returnValue](value) {
      this.returnValue = value;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.show](...args) {
      return this.show.apply(this, args);
    }
    [dartx.showModal](...args) {
      return this.showModal.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.DialogElement, 'created');
  dart.setSignature(html$.DialogElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DialogElement, []),
      created: dart.definiteFunctionType(html$.DialogElement, [])
    }),
    fields: () => ({
      [dartx.open]: core.bool,
      [dartx.returnValue]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.show]: dart.definiteFunctionType(dart.void, []),
      [dartx.showModal]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDialogElement, html$.DialogElement);
  const _getDirectory = Symbol('_getDirectory');
  const _getFile = Symbol('_getFile');
  const __getDirectory_1 = Symbol('__getDirectory_1');
  const __getDirectory_2 = Symbol('__getDirectory_2');
  const __getDirectory_3 = Symbol('__getDirectory_3');
  const __getDirectory_4 = Symbol('__getDirectory_4');
  const __getDirectory = Symbol('__getDirectory');
  const __getFile_1 = Symbol('__getFile_1');
  const __getFile_2 = Symbol('__getFile_2');
  const __getFile_3 = Symbol('__getFile_3');
  const __getFile_4 = Symbol('__getFile_4');
  const __getFile = Symbol('__getFile');
  const _removeRecursively = Symbol('_removeRecursively');
  const _copyTo = Symbol('_copyTo');
  const _getMetadata = Symbol('_getMetadata');
  const _getParent = Symbol('_getParent');
  const _moveTo = Symbol('_moveTo');
  const _remove$ = Symbol('_remove');
  dart.defineExtensionNames([
    'copyTo',
    'getMetadata',
    'getParent',
    'moveTo',
    'remove',
    'toUrl',
    'filesystem',
    'fullPath',
    'isDirectory',
    'isFile',
    'name'
  ]);
  html$.Entry = class Entry extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.filesystem]() {
      return this.filesystem;
    }
    get [dartx.fullPath]() {
      return this.fullPath;
    }
    get [dartx.isDirectory]() {
      return this.isDirectory;
    }
    get [dartx.isFile]() {
      return this.isFile;
    }
    get [dartx.name]() {
      return this.name;
    }
    [_copyTo](...args) {
      return this.copyTo.apply(this, args);
    }
    [dartx.copyTo](parent, opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      let completer = CompleterOfEntry().new();
      this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [_getMetadata](...args) {
      return this.getMetadata.apply(this, args);
    }
    [dartx.getMetadata]() {
      let completer = CompleterOfMetadata().new();
      this[_getMetadata](dart.fn(value => {
        completer.complete(value);
      }, MetadataTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_getParent](...args) {
      return this.getParent.apply(this, args);
    }
    [dartx.getParent]() {
      let completer = CompleterOfEntry().new();
      this[_getParent](dart.fn(value => {
        completer.complete(value);
      }, EntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.moveTo](parent, opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      let completer = CompleterOfEntry().new();
      this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [_remove$](...args) {
      return this.remove.apply(this, args);
    }
    [dartx.remove]() {
      let completer = async.Completer.new();
      this[_remove$](dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.toUrl](...args) {
      return this.toURL.apply(this, args);
    }
  };
  dart.setSignature(html$.Entry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Entry, [])}),
    fields: () => ({
      [dartx.filesystem]: html$.FileSystem,
      [dartx.fullPath]: core.String,
      [dartx.isDirectory]: core.bool,
      [dartx.isFile]: core.bool,
      [dartx.name]: core.String
    }),
    methods: () => ({
      [_copyTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
      [_getMetadata]: dart.definiteFunctionType(dart.void, [html$.MetadataCallback], [html$._ErrorCallback]),
      [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html$.Metadata), []),
      [_getParent]: dart.definiteFunctionType(dart.void, [], [html$._EntryCallback, html$._ErrorCallback]),
      [dartx.getParent]: dart.definiteFunctionType(async.Future$(html$.Entry), []),
      [_moveTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
      [_remove$]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
      [dartx.remove]: dart.definiteFunctionType(async.Future, []),
      [dartx.toUrl]: dart.definiteFunctionType(core.String, [])
    })
  });
  dart.registerExtension(dart.global.Entry, html$.Entry);
  dart.defineExtensionNames([
    'createDirectory',
    'getDirectory',
    'createFile',
    'getFile',
    'createReader',
    'removeRecursively'
  ]);
  html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
    [dartx.createDirectory](path, opts) {
      let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
      return this[_getDirectory](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
    }
    [dartx.getDirectory](path) {
      return this[_getDirectory](path);
    }
    [dartx.createFile](path, opts) {
      let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
      return this[_getFile](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
    }
    [dartx.getFile](path) {
      return this[_getFile](path);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.createReader](...args) {
      return this.createReader.apply(this, args);
    }
    [__getDirectory](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      if (errorCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getDirectory_1](path, options_1, successCallback, errorCallback);
        return;
      }
      if (successCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getDirectory_2](path, options_1, successCallback);
        return;
      }
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getDirectory_3](path, options_1);
        return;
      }
      this[__getDirectory_4](path);
      return;
    }
    [__getDirectory_1](...args) {
      return this.getDirectory.apply(this, args);
    }
    [__getDirectory_2](...args) {
      return this.getDirectory.apply(this, args);
    }
    [__getDirectory_3](...args) {
      return this.getDirectory.apply(this, args);
    }
    [__getDirectory_4](...args) {
      return this.getDirectory.apply(this, args);
    }
    [_getDirectory](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let completer = CompleterOfEntry().new();
      this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [__getFile](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      if (errorCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getFile_1](path, options_1, successCallback, errorCallback);
        return;
      }
      if (successCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getFile_2](path, options_1, successCallback);
        return;
      }
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getFile_3](path, options_1);
        return;
      }
      this[__getFile_4](path);
      return;
    }
    [__getFile_1](...args) {
      return this.getFile.apply(this, args);
    }
    [__getFile_2](...args) {
      return this.getFile.apply(this, args);
    }
    [__getFile_3](...args) {
      return this.getFile.apply(this, args);
    }
    [__getFile_4](...args) {
      return this.getFile.apply(this, args);
    }
    [_getFile](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let completer = CompleterOfEntry().new();
      this[__getFile](path, {options: options, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [_removeRecursively](...args) {
      return this.removeRecursively.apply(this, args);
    }
    [dartx.removeRecursively]() {
      let completer = async.Completer.new();
      this[_removeRecursively](dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(html$.DirectoryEntry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryEntry, [])}),
    methods: () => ({
      [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
      [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.createFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
      [dartx.getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.createReader]: dart.definiteFunctionType(html$.DirectoryReader, []),
      [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
      [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
      [__getDirectory_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [__getDirectory_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
      [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
      [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
      [__getFile_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [__getFile_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
      [_removeRecursively]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
      [dartx.removeRecursively]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.DirectoryEntry, html$.DirectoryEntry);
  const _readEntries = Symbol('_readEntries');
  dart.defineExtensionNames([
    'readEntries'
  ]);
  html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_readEntries](...args) {
      return this.readEntries.apply(this, args);
    }
    [dartx.readEntries]() {
      let completer = CompleterOfListOfEntry().new();
      this[_readEntries](dart.fn(value => {
        completer.complete(value);
      }, ListOfEntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(html$.DirectoryReader, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryReader, [])}),
    methods: () => ({
      [_readEntries]: dart.definiteFunctionType(dart.void, [html$._EntriesCallback], [html$._ErrorCallback]),
      [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html$.Entry)), [])
    })
  });
  dart.registerExtension(dart.global.DirectoryReader, html$.DirectoryReader);
  html$.DivElement = class DivElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DivElement._check(html$.document[dartx.createElement]("div"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.DivElement, 'created');
  dart.setSignature(html$.DivElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DivElement, []),
      new: dart.definiteFunctionType(html$.DivElement, []),
      created: dart.definiteFunctionType(html$.DivElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDivElement, html$.DivElement);
  const _body = Symbol('_body');
  const _get_window = Symbol('_get_window');
  const _head$0 = Symbol('_head');
  const _lastModified = Symbol('_lastModified');
  const _preferredStylesheetSet = Symbol('_preferredStylesheetSet');
  const _referrer = Symbol('_referrer');
  const _selectedStylesheetSet = Symbol('_selectedStylesheetSet');
  const _styleSheets = Symbol('_styleSheets');
  const _title = Symbol('_title');
  const _visibilityState = Symbol('_visibilityState');
  const _webkitFullscreenElement = Symbol('_webkitFullscreenElement');
  const _webkitFullscreenEnabled = Symbol('_webkitFullscreenEnabled');
  const _webkitHidden = Symbol('_webkitHidden');
  const _webkitVisibilityState = Symbol('_webkitVisibilityState');
  const _caretRangeFromPoint = Symbol('_caretRangeFromPoint');
  const _createElement = Symbol('_createElement');
  const _createElementNS = Symbol('_createElementNS');
  const _createTouch_1 = Symbol('_createTouch_1');
  const _createTouch = Symbol('_createTouch');
  const _createTouchList = Symbol('_createTouchList');
  const _elementFromPoint = Symbol('_elementFromPoint');
  const _getCssCanvasContext = Symbol('_getCssCanvasContext');
  const _webkitExitFullscreen = Symbol('_webkitExitFullscreen');
  const _createElement_2 = Symbol('_createElement_2');
  const _createElementNS_2 = Symbol('_createElementNS_2');
  const _createNodeIterator = Symbol('_createNodeIterator');
  const _createTreeWalker = Symbol('_createTreeWalker');
  dart.defineExtensionNames([
    'window',
    'adoptNode',
    'createDocumentFragment',
    'createRange',
    'elementsFromPoint',
    'execCommand',
    'exitFullscreen',
    'exitPointerLock',
    'getElementsByClassName',
    'getElementsByName',
    'getElementsByTagName',
    'importNode',
    'queryCommandEnabled',
    'queryCommandIndeterm',
    'queryCommandState',
    'queryCommandSupported',
    'queryCommandValue',
    'transformDocumentToTreeView',
    'getElementById',
    'querySelector',
    'onAbort',
    'onBeforeCopy',
    'onBeforeCut',
    'onBeforePaste',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onCopy',
    'onCut',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPaste',
    'onPause',
    'onPlay',
    'onPlaying',
    'onPointerLockChange',
    'onPointerLockError',
    'onRateChange',
    'onReadyStateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSearch',
    'onSecurityPolicyViolation',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onSelectionChange',
    'onSelectStart',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onTouchCancel',
    'onTouchEnd',
    'onTouchMove',
    'onTouchStart',
    'onVolumeChange',
    'onWaiting',
    'onFullscreenChange',
    'onFullscreenError',
    'querySelectorAll',
    'query',
    'queryAll',
    'supportsRegisterElement',
    'supportsRegister',
    'createElement',
    'createElementNS',
    'visibilityState',
    'activeElement',
    'contentType',
    'cookie',
    'currentScript',
    'documentElement',
    'domain',
    'fonts',
    'fullscreenElement',
    'fullscreenEnabled',
    'hidden',
    'implementation',
    'origin',
    'pointerLockElement',
    'readyState',
    'rootElement',
    'scrollingElement',
    'timeline'
  ]);
  html$.Document = class Document extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.activeElement]() {
      return this.activeElement;
    }
    get [_body]() {
      return this.body;
    }
    set [_body](value) {
      this.body = value;
    }
    get [dartx.contentType]() {
      return this.contentType;
    }
    get [dartx.cookie]() {
      return this.cookie;
    }
    set [dartx.cookie](value) {
      this.cookie = value;
    }
    get [dartx.currentScript]() {
      return this.currentScript;
    }
    get [dartx.window]() {
      return html$._convertNativeToDart_Window(this[_get_window]);
    }
    get [_get_window]() {
      return this.defaultView;
    }
    get [dartx.documentElement]() {
      return this.documentElement;
    }
    get [dartx.domain]() {
      return this.domain;
    }
    get [dartx.fonts]() {
      return this.fonts;
    }
    get [dartx.fullscreenElement]() {
      return this.fullscreenElement;
    }
    get [dartx.fullscreenEnabled]() {
      return this.fullscreenEnabled;
    }
    get [_head$0]() {
      return this.head;
    }
    get [dartx.hidden]() {
      return this.hidden;
    }
    get [dartx.implementation]() {
      return this.implementation;
    }
    get [_lastModified]() {
      return this.lastModified;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.pointerLockElement]() {
      return this.pointerLockElement;
    }
    get [_preferredStylesheetSet]() {
      return this.preferredStylesheetSet;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [_referrer]() {
      return this.referrer;
    }
    get [dartx.rootElement]() {
      return this.rootElement;
    }
    get [dartx.scrollingElement]() {
      return this.scrollingElement;
    }
    get [_selectedStylesheetSet]() {
      return this.selectedStylesheetSet;
    }
    set [_selectedStylesheetSet](value) {
      this.selectedStylesheetSet = value;
    }
    get [_styleSheets]() {
      return this.styleSheets;
    }
    get [dartx.timeline]() {
      return this.timeline;
    }
    get [_title]() {
      return this.title;
    }
    set [_title](value) {
      this.title = value;
    }
    get [_visibilityState]() {
      return this.visibilityState;
    }
    get [_webkitFullscreenElement]() {
      return this.webkitFullscreenElement;
    }
    get [_webkitFullscreenEnabled]() {
      return this.webkitFullscreenEnabled;
    }
    get [_webkitHidden]() {
      return this.webkitHidden;
    }
    get [_webkitVisibilityState]() {
      return this.webkitVisibilityState;
    }
    [dartx.adoptNode](...args) {
      return this.adoptNode.apply(this, args);
    }
    [_caretRangeFromPoint](...args) {
      return this.caretRangeFromPoint.apply(this, args);
    }
    [dartx.createDocumentFragment](...args) {
      return this.createDocumentFragment.apply(this, args);
    }
    [_createElement](...args) {
      return this.createElement.apply(this, args);
    }
    [_createElementNS](...args) {
      return this.createElementNS.apply(this, args);
    }
    [_createEvent](...args) {
      return this.createEvent.apply(this, args);
    }
    [dartx.createRange](...args) {
      return this.createRange.apply(this, args);
    }
    [_createTextNode](...args) {
      return this.createTextNode.apply(this, args);
    }
    [_createTouch](window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
      let target_1 = html$._convertDartToNative_EventTarget(target);
      return this[_createTouch_1](window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
    }
    [_createTouch_1](...args) {
      return this.createTouch.apply(this, args);
    }
    [_createTouchList](...args) {
      return this.createTouchList.apply(this, args);
    }
    [_elementFromPoint](...args) {
      return this.elementFromPoint.apply(this, args);
    }
    [dartx.elementsFromPoint](...args) {
      return this.elementsFromPoint.apply(this, args);
    }
    [dartx.execCommand](...args) {
      return this.execCommand.apply(this, args);
    }
    [dartx.exitFullscreen](...args) {
      return this.exitFullscreen.apply(this, args);
    }
    [dartx.exitPointerLock](...args) {
      return this.exitPointerLock.apply(this, args);
    }
    [_getCssCanvasContext](...args) {
      return this.getCSSCanvasContext.apply(this, args);
    }
    [dartx.getElementsByClassName](...args) {
      return this.getElementsByClassName.apply(this, args);
    }
    [dartx.getElementsByName](...args) {
      return this.getElementsByName.apply(this, args);
    }
    [dartx.getElementsByTagName](...args) {
      return this.getElementsByTagName.apply(this, args);
    }
    [dartx.importNode](...args) {
      return this.importNode.apply(this, args);
    }
    [dartx.queryCommandEnabled](...args) {
      return this.queryCommandEnabled.apply(this, args);
    }
    [dartx.queryCommandIndeterm](...args) {
      return this.queryCommandIndeterm.apply(this, args);
    }
    [dartx.queryCommandState](...args) {
      return this.queryCommandState.apply(this, args);
    }
    [dartx.queryCommandSupported](...args) {
      return this.queryCommandSupported.apply(this, args);
    }
    [dartx.queryCommandValue](...args) {
      return this.queryCommandValue.apply(this, args);
    }
    [dartx.transformDocumentToTreeView](...args) {
      return this.transformDocumentToTreeView.apply(this, args);
    }
    [_webkitExitFullscreen](...args) {
      return this.webkitExitFullscreen.apply(this, args);
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
    get [_childElementCount]() {
      return this.childElementCount;
    }
    get [_children]() {
      return this.children;
    }
    get [_firstElementChild]() {
      return this.firstElementChild;
    }
    get [_lastElementChild]() {
      return this.lastElementChild;
    }
    [dartx.querySelector](...args) {
      return this.querySelector.apply(this, args);
    }
    [_querySelectorAll](...args) {
      return this.querySelectorAll.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.Element.abortEvent.forTarget(this);
    }
    get [dartx.onBeforeCopy]() {
      return html$.Element.beforeCopyEvent.forTarget(this);
    }
    get [dartx.onBeforeCut]() {
      return html$.Element.beforeCutEvent.forTarget(this);
    }
    get [dartx.onBeforePaste]() {
      return html$.Element.beforePasteEvent.forTarget(this);
    }
    get [dartx.onBlur]() {
      return html$.Element.blurEvent.forTarget(this);
    }
    get [dartx.onCanPlay]() {
      return html$.Element.canPlayEvent.forTarget(this);
    }
    get [dartx.onCanPlayThrough]() {
      return html$.Element.canPlayThroughEvent.forTarget(this);
    }
    get [dartx.onChange]() {
      return html$.Element.changeEvent.forTarget(this);
    }
    get [dartx.onClick]() {
      return html$.Element.clickEvent.forTarget(this);
    }
    get [dartx.onContextMenu]() {
      return html$.Element.contextMenuEvent.forTarget(this);
    }
    get [dartx.onCopy]() {
      return html$.Element.copyEvent.forTarget(this);
    }
    get [dartx.onCut]() {
      return html$.Element.cutEvent.forTarget(this);
    }
    get [dartx.onDoubleClick]() {
      return html$.Element.doubleClickEvent.forTarget(this);
    }
    get [dartx.onDrag]() {
      return html$.Element.dragEvent.forTarget(this);
    }
    get [dartx.onDragEnd]() {
      return html$.Element.dragEndEvent.forTarget(this);
    }
    get [dartx.onDragEnter]() {
      return html$.Element.dragEnterEvent.forTarget(this);
    }
    get [dartx.onDragLeave]() {
      return html$.Element.dragLeaveEvent.forTarget(this);
    }
    get [dartx.onDragOver]() {
      return html$.Element.dragOverEvent.forTarget(this);
    }
    get [dartx.onDragStart]() {
      return html$.Element.dragStartEvent.forTarget(this);
    }
    get [dartx.onDrop]() {
      return html$.Element.dropEvent.forTarget(this);
    }
    get [dartx.onDurationChange]() {
      return html$.Element.durationChangeEvent.forTarget(this);
    }
    get [dartx.onEmptied]() {
      return html$.Element.emptiedEvent.forTarget(this);
    }
    get [dartx.onEnded]() {
      return html$.Element.endedEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.Element.errorEvent.forTarget(this);
    }
    get [dartx.onFocus]() {
      return html$.Element.focusEvent.forTarget(this);
    }
    get [dartx.onInput]() {
      return html$.Element.inputEvent.forTarget(this);
    }
    get [dartx.onInvalid]() {
      return html$.Element.invalidEvent.forTarget(this);
    }
    get [dartx.onKeyDown]() {
      return html$.Element.keyDownEvent.forTarget(this);
    }
    get [dartx.onKeyPress]() {
      return html$.Element.keyPressEvent.forTarget(this);
    }
    get [dartx.onKeyUp]() {
      return html$.Element.keyUpEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.Element.loadEvent.forTarget(this);
    }
    get [dartx.onLoadedData]() {
      return html$.Element.loadedDataEvent.forTarget(this);
    }
    get [dartx.onLoadedMetadata]() {
      return html$.Element.loadedMetadataEvent.forTarget(this);
    }
    get [dartx.onMouseDown]() {
      return html$.Element.mouseDownEvent.forTarget(this);
    }
    get [dartx.onMouseEnter]() {
      return html$.Element.mouseEnterEvent.forTarget(this);
    }
    get [dartx.onMouseLeave]() {
      return html$.Element.mouseLeaveEvent.forTarget(this);
    }
    get [dartx.onMouseMove]() {
      return html$.Element.mouseMoveEvent.forTarget(this);
    }
    get [dartx.onMouseOut]() {
      return html$.Element.mouseOutEvent.forTarget(this);
    }
    get [dartx.onMouseOver]() {
      return html$.Element.mouseOverEvent.forTarget(this);
    }
    get [dartx.onMouseUp]() {
      return html$.Element.mouseUpEvent.forTarget(this);
    }
    get [dartx.onMouseWheel]() {
      return html$.Element.mouseWheelEvent.forTarget(this);
    }
    get [dartx.onPaste]() {
      return html$.Element.pasteEvent.forTarget(this);
    }
    get [dartx.onPause]() {
      return html$.Element.pauseEvent.forTarget(this);
    }
    get [dartx.onPlay]() {
      return html$.Element.playEvent.forTarget(this);
    }
    get [dartx.onPlaying]() {
      return html$.Element.playingEvent.forTarget(this);
    }
    get [dartx.onPointerLockChange]() {
      return html$.Document.pointerLockChangeEvent.forTarget(this);
    }
    get [dartx.onPointerLockError]() {
      return html$.Document.pointerLockErrorEvent.forTarget(this);
    }
    get [dartx.onRateChange]() {
      return html$.Element.rateChangeEvent.forTarget(this);
    }
    get [dartx.onReadyStateChange]() {
      return html$.Document.readyStateChangeEvent.forTarget(this);
    }
    get [dartx.onReset]() {
      return html$.Element.resetEvent.forTarget(this);
    }
    get [dartx.onResize]() {
      return html$.Element.resizeEvent.forTarget(this);
    }
    get [dartx.onScroll]() {
      return html$.Element.scrollEvent.forTarget(this);
    }
    get [dartx.onSearch]() {
      return html$.Element.searchEvent.forTarget(this);
    }
    get [dartx.onSecurityPolicyViolation]() {
      return html$.Document.securityPolicyViolationEvent.forTarget(this);
    }
    get [dartx.onSeeked]() {
      return html$.Element.seekedEvent.forTarget(this);
    }
    get [dartx.onSeeking]() {
      return html$.Element.seekingEvent.forTarget(this);
    }
    get [dartx.onSelect]() {
      return html$.Element.selectEvent.forTarget(this);
    }
    get [dartx.onSelectionChange]() {
      return html$.Document.selectionChangeEvent.forTarget(this);
    }
    get [dartx.onSelectStart]() {
      return html$.Element.selectStartEvent.forTarget(this);
    }
    get [dartx.onStalled]() {
      return html$.Element.stalledEvent.forTarget(this);
    }
    get [dartx.onSubmit]() {
      return html$.Element.submitEvent.forTarget(this);
    }
    get [dartx.onSuspend]() {
      return html$.Element.suspendEvent.forTarget(this);
    }
    get [dartx.onTimeUpdate]() {
      return html$.Element.timeUpdateEvent.forTarget(this);
    }
    get [dartx.onTouchCancel]() {
      return html$.Element.touchCancelEvent.forTarget(this);
    }
    get [dartx.onTouchEnd]() {
      return html$.Element.touchEndEvent.forTarget(this);
    }
    get [dartx.onTouchMove]() {
      return html$.Element.touchMoveEvent.forTarget(this);
    }
    get [dartx.onTouchStart]() {
      return html$.Element.touchStartEvent.forTarget(this);
    }
    get [dartx.onVolumeChange]() {
      return html$.Element.volumeChangeEvent.forTarget(this);
    }
    get [dartx.onWaiting]() {
      return html$.Element.waitingEvent.forTarget(this);
    }
    get [dartx.onFullscreenChange]() {
      return html$.Element.fullscreenChangeEvent.forTarget(this);
    }
    get [dartx.onFullscreenError]() {
      return html$.Element.fullscreenErrorEvent.forTarget(this);
    }
    [dartx.querySelectorAll](T) {
      return selectors => {
        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
      };
    }
    [dartx.query](relativeSelectors) {
      return this[dartx.querySelector](relativeSelectors);
    }
    [dartx.queryAll](T) {
      return relativeSelectors => {
        return this[dartx.querySelectorAll](T)(relativeSelectors);
      };
    }
    get [dartx.supportsRegisterElement]() {
      return "registerElement" in this;
    }
    get [dartx.supportsRegister]() {
      return this[dartx.supportsRegisterElement];
    }
    [dartx.createElement](tagName, typeExtension) {
      if (typeExtension === void 0) typeExtension = null;
      return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
    }
    [_createElement_2](tagName) {
      return this.createElement(tagName);
    }
    [_createElementNS_2](namespaceURI, qualifiedName) {
      return this.createElementNS(namespaceURI, qualifiedName);
    }
    [dartx.createElementNS](namespaceURI, qualifiedName, typeExtension) {
      if (typeExtension === void 0) typeExtension = null;
      return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
    }
    [_createNodeIterator](root, whatToShow, filter) {
      if (whatToShow === void 0) whatToShow = null;
      if (filter === void 0) filter = null;
      return this.createNodeIterator(root, whatToShow, filter, false);
    }
    [_createTreeWalker](root, whatToShow, filter) {
      if (whatToShow === void 0) whatToShow = null;
      if (filter === void 0) filter = null;
      return this.createTreeWalker(root, whatToShow, filter, false);
    }
    get [dartx.visibilityState]() {
      return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
    }
  };
  dart.setSignature(html$.Document, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Document, [])}),
    fields: () => ({
      [dartx.activeElement]: html$.Element,
      [_body]: html$.HtmlElement,
      [dartx.contentType]: core.String,
      [dartx.cookie]: core.String,
      [dartx.currentScript]: html$.ScriptElement,
      [_get_window]: dart.dynamic,
      [dartx.documentElement]: html$.Element,
      [dartx.domain]: core.String,
      [dartx.fonts]: html$.FontFaceSet,
      [dartx.fullscreenElement]: html$.Element,
      [dartx.fullscreenEnabled]: core.bool,
      [_head$0]: html$.HeadElement,
      [dartx.hidden]: core.bool,
      [dartx.implementation]: html$.DomImplementation,
      [_lastModified]: core.String,
      [dartx.origin]: core.String,
      [dartx.pointerLockElement]: html$.Element,
      [_preferredStylesheetSet]: core.String,
      [dartx.readyState]: core.String,
      [_referrer]: core.String,
      [dartx.rootElement]: svg$.SvgSvgElement,
      [dartx.scrollingElement]: html$.Element,
      [_selectedStylesheetSet]: core.String,
      [_styleSheets]: ListOfStyleSheet(),
      [dartx.timeline]: html$.AnimationTimeline,
      [_title]: core.String,
      [_visibilityState]: core.String,
      [_webkitFullscreenElement]: html$.Element,
      [_webkitFullscreenEnabled]: core.bool,
      [_webkitHidden]: core.bool,
      [_webkitVisibilityState]: core.String,
      [_childElementCount]: core.int,
      [_children]: ListOfNode(),
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    }),
    getters: () => ({
      [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
      [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
      [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
      [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html$.SecurityPolicyViolationEvent), []),
      [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.supportsRegisterElement]: dart.definiteFunctionType(core.bool, []),
      [dartx.supportsRegister]: dart.definiteFunctionType(core.bool, []),
      [dartx.visibilityState]: dart.definiteFunctionType(core.String, [])
    }),
    methods: () => ({
      [dartx.adoptNode]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [_caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
      [dartx.createDocumentFragment]: dart.definiteFunctionType(html$.DocumentFragment, []),
      [_createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
      [_createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
      [_createEvent]: dart.definiteFunctionType(html$.Event, [core.String]),
      [dartx.createRange]: dart.definiteFunctionType(html$.Range, []),
      [_createTextNode]: dart.definiteFunctionType(html$.Text, [core.String]),
      [_createTouch]: dart.definiteFunctionType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
      [_createTouch_1]: dart.definiteFunctionType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_createTouchList]: dart.definiteFunctionType(html$.TouchList, [html$.Touch]),
      [_elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
      [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
      [dartx.execCommand]: dart.definiteFunctionType(core.bool, [core.String], [core.bool, core.String]),
      [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.exitPointerLock]: dart.definiteFunctionType(dart.void, []),
      [_getCssCanvasContext]: dart.definiteFunctionType(core.Object, [core.String, core.String, core.int, core.int]),
      [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.importNode]: dart.definiteFunctionType(html$.Node, [html$.Node], [core.bool]),
      [dartx.queryCommandEnabled]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandIndeterm]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandState]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandSupported]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandValue]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.transformDocumentToTreeView]: dart.definiteFunctionType(dart.void, [core.String]),
      [_webkitExitFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
      [_createElement_2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
      [_createElementNS_2]: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      [dartx.createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
      [_createNodeIterator]: dart.definiteFunctionType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
      [_createTreeWalker]: dart.definiteFunctionType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
    }),
    sfields: () => ({
      pointerLockChangeEvent: EventStreamProviderOfEvent(),
      pointerLockErrorEvent: EventStreamProviderOfEvent(),
      readyStateChangeEvent: EventStreamProviderOfEvent(),
      securityPolicyViolationEvent: EventStreamProviderOfSecurityPolicyViolationEvent(),
      selectionChangeEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.Document, {
    get pointerLockChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pointerlockchange'));
    },
    get pointerLockErrorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pointerlockerror'));
    },
    get readyStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('readystatechange'));
    },
    get securityPolicyViolationEvent() {
      return dart.const(new (EventStreamProviderOfSecurityPolicyViolationEvent())('securitypolicyviolation'));
    },
    get selectionChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('selectionchange'));
    }
  });
  dart.registerExtension(dart.global.Document, html$.Document);
  const _docChildren = Symbol('_docChildren');
  dart.defineExtensionNames([
    'children',
    'children',
    'querySelectorAll',
    'innerHtml',
    'innerHtml',
    'setInnerHtml',
    'appendText',
    'appendHtml',
    'query',
    'queryAll',
    'getElementById',
    'querySelector'
  ]);
  html$.DocumentFragment = class DocumentFragment extends html$.Node {
    static new() {
      return html$.document[dartx.createDocumentFragment]();
    }
    static html(html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      return html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    static svg(svgContent, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      return svg$.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
    }
    get [_children]() {
      return dart.throw(new core.UnimplementedError('Use _docChildren instead'));
    }
    get [_docChildren]() {
      return this._docChildren;
    }
    set [_docChildren](value) {
      this._docChildren = value;
    }
    get [dartx.children]() {
      if (this[_docChildren] == null) {
        this[_docChildren] = new html_common.FilteredElementList(this);
      }
      return this[_docChildren];
    }
    set [dartx.children](value) {
      let copy = value[dartx.toList]();
      let children = this[dartx.children];
      children[dartx.clear]();
      children[dartx.addAll](copy);
    }
    [dartx.querySelectorAll](T) {
      return selectors => {
        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
      };
    }
    get [dartx.innerHtml]() {
      let e = html$.Element.tag("div");
      e[dartx.append](this[dartx.clone](true));
      return e[dartx.innerHtml];
    }
    set [dartx.innerHtml](value) {
      this[dartx.setInnerHtml](value);
    }
    [dartx.setInnerHtml](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.nodes][dartx.clear]();
      this[dartx.append](html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
    }
    [dartx.appendText](text) {
      this[dartx.append](html$.Text.new(text));
    }
    [dartx.appendHtml](text, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let NodeTreeSanitizer = opts && 'NodeTreeSanitizer' in opts ? opts.NodeTreeSanitizer : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: html$.NodeTreeSanitizer._check(treeSanitizer)}));
    }
    [dartx.query](relativeSelectors) {
      return this[dartx.querySelector](relativeSelectors);
    }
    [dartx.queryAll](T) {
      return relativeSelectors => {
        return this[dartx.querySelectorAll](T)(relativeSelectors);
      };
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
    get [_childElementCount]() {
      return this.childElementCount;
    }
    get [_firstElementChild]() {
      return this.firstElementChild;
    }
    get [_lastElementChild]() {
      return this.lastElementChild;
    }
    [dartx.querySelector](...args) {
      return this.querySelector.apply(this, args);
    }
    [_querySelectorAll](...args) {
      return this.querySelectorAll.apply(this, args);
    }
  };
  html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
  dart.setSignature(html$.DocumentFragment, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.DocumentFragment, []),
      html: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      svg: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      _: dart.definiteFunctionType(html$.DocumentFragment, [])
    }),
    fields: () => ({
      [_docChildren]: ListOfElement(),
      [_childElementCount]: core.int,
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    }),
    getters: () => ({
      [_children]: dart.definiteFunctionType(html$.HtmlCollection, []),
      [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
      [dartx.innerHtml]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({
      [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
      [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    methods: () => ({
      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
    })
  });
  dart.registerExtension(dart.global.DocumentFragment, html$.DocumentFragment);
  dart.defineExtensionNames([
    'message',
    'name'
  ]);
  html$.DomError = class DomError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(name, message) {
      if (message === void 0) message = null;
      if (message != null) {
        return html$.DomError._create_1(name, message);
      }
      return html$.DomError._create_2(name);
    }
    static _create_1(name, message) {
      return new DOMError(name, message);
    }
    static _create_2(name) {
      return new DOMError(name);
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.name]() {
      return this.name;
    }
  };
  dart.setSignature(html$.DomError, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomError, []),
      new: dart.definiteFunctionType(html$.DomError, [core.String], [core.String])
    }),
    fields: () => ({
      [dartx.message]: core.String,
      [dartx.name]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DomError, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DomError, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DOMError, html$.DomError);
  dart.defineExtensionNames([
    'name',
    'toString',
    'message'
  ]);
  html$.DomException = class DomException extends _interceptors.Interceptor {
    get [dartx.name]() {
      let errorName = this.name;
      if (dart.test(html_common.Device.isWebKit) && errorName == 'SECURITY_ERR') return 'SecurityError';
      if (dart.test(html_common.Device.isWebKit) && errorName == 'SYNTAX_ERR') return 'SyntaxError';
      return errorName;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.message]() {
      return this.message;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  dart.setSignature(html$.DomException, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomException, [])}),
    fields: () => ({[dartx.message]: core.String}),
    getters: () => ({[dartx.name]: dart.definiteFunctionType(core.String, [])}),
    sfields: () => ({
      INDEX_SIZE: core.String,
      HIERARCHY_REQUEST: core.String,
      WRONG_DOCUMENT: core.String,
      INVALID_CHARACTER: core.String,
      NO_MODIFICATION_ALLOWED: core.String,
      NOT_FOUND: core.String,
      NOT_SUPPORTED: core.String,
      INVALID_STATE: core.String,
      SYNTAX: core.String,
      INVALID_MODIFICATION: core.String,
      NAMESPACE: core.String,
      INVALID_ACCESS: core.String,
      TYPE_MISMATCH: core.String,
      SECURITY: core.String,
      NETWORK: core.String,
      ABORT: core.String,
      URL_MISMATCH: core.String,
      QUOTA_EXCEEDED: core.String,
      TIMEOUT: core.String,
      INVALID_NODE_TYPE: core.String,
      DATA_CLONE: core.String
    })
  });
  html$.DomException.INDEX_SIZE = 'IndexSizeError';
  html$.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
  html$.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
  html$.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
  html$.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
  html$.DomException.NOT_FOUND = 'NotFoundError';
  html$.DomException.NOT_SUPPORTED = 'NotSupportedError';
  html$.DomException.INVALID_STATE = 'InvalidStateError';
  html$.DomException.SYNTAX = 'SyntaxError';
  html$.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
  html$.DomException.NAMESPACE = 'NamespaceError';
  html$.DomException.INVALID_ACCESS = 'InvalidAccessError';
  html$.DomException.TYPE_MISMATCH = 'TypeMismatchError';
  html$.DomException.SECURITY = 'SecurityError';
  html$.DomException.NETWORK = 'NetworkError';
  html$.DomException.ABORT = 'AbortError';
  html$.DomException.URL_MISMATCH = 'URLMismatchError';
  html$.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
  html$.DomException.TIMEOUT = 'TimeoutError';
  html$.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
  html$.DomException.DATA_CLONE = 'DataCloneError';
  dart.registerExtension(dart.global.DOMException, html$.DomException);
  dart.defineExtensionNames([
    'createDocument',
    'createDocumentType',
    'createHtmlDocument',
    'hasFeature'
  ]);
  html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.createDocument](...args) {
      return this.createDocument.apply(this, args);
    }
    [dartx.createDocumentType](...args) {
      return this.createDocumentType.apply(this, args);
    }
    [dartx.createHtmlDocument](...args) {
      return this.createHTMLDocument.apply(this, args);
    }
    [dartx.hasFeature](...args) {
      return this.hasFeature.apply(this, args);
    }
  };
  dart.setSignature(html$.DomImplementation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomImplementation, [])}),
    methods: () => ({
      [dartx.createDocument]: dart.definiteFunctionType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
      [dartx.createDocumentType]: dart.definiteFunctionType(html$._DocumentType, [core.String, core.String, core.String]),
      [dartx.createHtmlDocument]: dart.definiteFunctionType(html$.HtmlDocument, [core.String]),
      [dartx.hasFeature]: dart.definiteFunctionType(core.bool, [])
    })
  });
  dart.registerExtension(dart.global.DOMImplementation, html$.DomImplementation);
  dart.defineExtensionNames([
    'next'
  ]);
  html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.next](...args) {
      return this.next.apply(this, args);
    }
  };
  dart.setSignature(html$.DomIterator, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomIterator, [])}),
    methods: () => ({[dartx.next]: dart.definiteFunctionType(core.Object, [], [core.Object])})
  });
  dart.registerExtension(dart.global.Iterator, html$.DomIterator);
  dart.defineExtensionNames([
    'a',
    'b',
    'c',
    'd',
    'e',
    'f',
    'is2D',
    'isIdentity',
    'm11',
    'm12',
    'm13',
    'm14',
    'm21',
    'm22',
    'm23',
    'm24',
    'm31',
    'm32',
    'm33',
    'm34',
    'm41',
    'm42',
    'm43',
    'm44',
    'multiply',
    'scale',
    'scale3d',
    'scaleNonUniform',
    'toFloat32Array',
    'toFloat64Array',
    'translate'
  ]);
  html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.a]() {
      return this.a;
    }
    get [dartx.b]() {
      return this.b;
    }
    get [dartx.c]() {
      return this.c;
    }
    get [dartx.d]() {
      return this.d;
    }
    get [dartx.e]() {
      return this.e;
    }
    get [dartx.f]() {
      return this.f;
    }
    get [dartx.is2D]() {
      return this.is2D;
    }
    get [dartx.isIdentity]() {
      return this.isIdentity;
    }
    get [dartx.m11]() {
      return this.m11;
    }
    get [dartx.m12]() {
      return this.m12;
    }
    get [dartx.m13]() {
      return this.m13;
    }
    get [dartx.m14]() {
      return this.m14;
    }
    get [dartx.m21]() {
      return this.m21;
    }
    get [dartx.m22]() {
      return this.m22;
    }
    get [dartx.m23]() {
      return this.m23;
    }
    get [dartx.m24]() {
      return this.m24;
    }
    get [dartx.m31]() {
      return this.m31;
    }
    get [dartx.m32]() {
      return this.m32;
    }
    get [dartx.m33]() {
      return this.m33;
    }
    get [dartx.m34]() {
      return this.m34;
    }
    get [dartx.m41]() {
      return this.m41;
    }
    get [dartx.m42]() {
      return this.m42;
    }
    get [dartx.m43]() {
      return this.m43;
    }
    get [dartx.m44]() {
      return this.m44;
    }
    [dartx.multiply](...args) {
      return this.multiply.apply(this, args);
    }
    [dartx.scale](...args) {
      return this.scale.apply(this, args);
    }
    [dartx.scale3d](...args) {
      return this.scale3d.apply(this, args);
    }
    [dartx.scaleNonUniform](...args) {
      return this.scaleNonUniform.apply(this, args);
    }
    [dartx.toFloat32Array](...args) {
      return this.toFloat32Array.apply(this, args);
    }
    [dartx.toFloat64Array](...args) {
      return this.toFloat64Array.apply(this, args);
    }
    [dartx.translate](...args) {
      return this.translate.apply(this, args);
    }
  };
  dart.setSignature(html$.DomMatrixReadOnly, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomMatrixReadOnly, [])}),
    getters: () => ({
      [dartx.a]: dart.definiteFunctionType(core.num, []),
      [dartx.b]: dart.definiteFunctionType(core.num, []),
      [dartx.c]: dart.definiteFunctionType(core.num, []),
      [dartx.d]: dart.definiteFunctionType(core.num, []),
      [dartx.e]: dart.definiteFunctionType(core.num, []),
      [dartx.f]: dart.definiteFunctionType(core.num, []),
      [dartx.is2D]: dart.definiteFunctionType(core.bool, []),
      [dartx.isIdentity]: dart.definiteFunctionType(core.bool, []),
      [dartx.m11]: dart.definiteFunctionType(core.num, []),
      [dartx.m12]: dart.definiteFunctionType(core.num, []),
      [dartx.m13]: dart.definiteFunctionType(core.num, []),
      [dartx.m14]: dart.definiteFunctionType(core.num, []),
      [dartx.m21]: dart.definiteFunctionType(core.num, []),
      [dartx.m22]: dart.definiteFunctionType(core.num, []),
      [dartx.m23]: dart.definiteFunctionType(core.num, []),
      [dartx.m24]: dart.definiteFunctionType(core.num, []),
      [dartx.m31]: dart.definiteFunctionType(core.num, []),
      [dartx.m32]: dart.definiteFunctionType(core.num, []),
      [dartx.m33]: dart.definiteFunctionType(core.num, []),
      [dartx.m34]: dart.definiteFunctionType(core.num, []),
      [dartx.m41]: dart.definiteFunctionType(core.num, []),
      [dartx.m42]: dart.definiteFunctionType(core.num, []),
      [dartx.m43]: dart.definiteFunctionType(core.num, []),
      [dartx.m44]: dart.definiteFunctionType(core.num, [])
    }),
    methods: () => ({
      [dartx.multiply]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
      [dartx.scale]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
      [dartx.scale3d]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
      [dartx.scaleNonUniform]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
      [dartx.toFloat32Array]: dart.definiteFunctionType(typed_data.Float32List, []),
      [dartx.toFloat64Array]: dart.definiteFunctionType(typed_data.Float64List, []),
      [dartx.translate]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
    })
  });
  dart.registerExtension(dart.global.DOMMatrixReadOnly, html$.DomMatrixReadOnly);
  dart.defineExtensionNames([
    'a',
    'a',
    'b',
    'b',
    'c',
    'c',
    'd',
    'd',
    'e',
    'e',
    'f',
    'f',
    'm11',
    'm11',
    'm12',
    'm12',
    'm13',
    'm13',
    'm14',
    'm14',
    'm21',
    'm21',
    'm22',
    'm22',
    'm23',
    'm23',
    'm24',
    'm24',
    'm31',
    'm31',
    'm32',
    'm32',
    'm33',
    'm33',
    'm34',
    'm34',
    'm41',
    'm41',
    'm42',
    'm42',
    'm43',
    'm43',
    'm44',
    'm44',
    'multiplySelf',
    'preMultiplySelf',
    'scale3dSelf',
    'scaleNonUniformSelf',
    'scaleSelf',
    'translateSelf'
  ]);
  html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(other) {
      if (other === void 0) other = null;
      if (other == null) {
        return html$.DomMatrix._create_1();
      }
      if (html$.DomMatrixReadOnly.is(other) || other == null) {
        return html$.DomMatrix._create_2(other);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new DOMMatrix();
    }
    static _create_2(other) {
      return new DOMMatrix(other);
    }
    get [dartx.a]() {
      return this.a;
    }
    set [dartx.a](value) {
      this.a = value;
    }
    get [dartx.b]() {
      return this.b;
    }
    set [dartx.b](value) {
      this.b = value;
    }
    get [dartx.c]() {
      return this.c;
    }
    set [dartx.c](value) {
      this.c = value;
    }
    get [dartx.d]() {
      return this.d;
    }
    set [dartx.d](value) {
      this.d = value;
    }
    get [dartx.e]() {
      return this.e;
    }
    set [dartx.e](value) {
      this.e = value;
    }
    get [dartx.f]() {
      return this.f;
    }
    set [dartx.f](value) {
      this.f = value;
    }
    get [dartx.m11]() {
      return this.m11;
    }
    set [dartx.m11](value) {
      this.m11 = value;
    }
    get [dartx.m12]() {
      return this.m12;
    }
    set [dartx.m12](value) {
      this.m12 = value;
    }
    get [dartx.m13]() {
      return this.m13;
    }
    set [dartx.m13](value) {
      this.m13 = value;
    }
    get [dartx.m14]() {
      return this.m14;
    }
    set [dartx.m14](value) {
      this.m14 = value;
    }
    get [dartx.m21]() {
      return this.m21;
    }
    set [dartx.m21](value) {
      this.m21 = value;
    }
    get [dartx.m22]() {
      return this.m22;
    }
    set [dartx.m22](value) {
      this.m22 = value;
    }
    get [dartx.m23]() {
      return this.m23;
    }
    set [dartx.m23](value) {
      this.m23 = value;
    }
    get [dartx.m24]() {
      return this.m24;
    }
    set [dartx.m24](value) {
      this.m24 = value;
    }
    get [dartx.m31]() {
      return this.m31;
    }
    set [dartx.m31](value) {
      this.m31 = value;
    }
    get [dartx.m32]() {
      return this.m32;
    }
    set [dartx.m32](value) {
      this.m32 = value;
    }
    get [dartx.m33]() {
      return this.m33;
    }
    set [dartx.m33](value) {
      this.m33 = value;
    }
    get [dartx.m34]() {
      return this.m34;
    }
    set [dartx.m34](value) {
      this.m34 = value;
    }
    get [dartx.m41]() {
      return this.m41;
    }
    set [dartx.m41](value) {
      this.m41 = value;
    }
    get [dartx.m42]() {
      return this.m42;
    }
    set [dartx.m42](value) {
      this.m42 = value;
    }
    get [dartx.m43]() {
      return this.m43;
    }
    set [dartx.m43](value) {
      this.m43 = value;
    }
    get [dartx.m44]() {
      return this.m44;
    }
    set [dartx.m44](value) {
      this.m44 = value;
    }
    [dartx.multiplySelf](...args) {
      return this.multiplySelf.apply(this, args);
    }
    [dartx.preMultiplySelf](...args) {
      return this.preMultiplySelf.apply(this, args);
    }
    [dartx.scale3dSelf](...args) {
      return this.scale3dSelf.apply(this, args);
    }
    [dartx.scaleNonUniformSelf](...args) {
      return this.scaleNonUniformSelf.apply(this, args);
    }
    [dartx.scaleSelf](...args) {
      return this.scaleSelf.apply(this, args);
    }
    [dartx.translateSelf](...args) {
      return this.translateSelf.apply(this, args);
    }
  };
  dart.setSignature(html$.DomMatrix, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomMatrix, []),
      new: dart.definiteFunctionType(html$.DomMatrix, [], [html$.DomMatrixReadOnly])
    }),
    setters: () => ({
      [dartx.a]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.b]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.c]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.d]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.e]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.f]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m11]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m12]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m13]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m14]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m21]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m22]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m23]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m24]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m31]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m32]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m33]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m34]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m41]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m42]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m43]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m44]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    methods: () => ({
      [dartx.multiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
      [dartx.preMultiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
      [dartx.scale3dSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
      [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
      [dartx.scaleSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
      [dartx.translateSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DomMatrix, []),
      _create_2: dart.definiteFunctionType(html$.DomMatrix, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DOMMatrix, html$.DomMatrix);
  dart.defineExtensionNames([
    'parseFromString'
  ]);
  html$.DomParser = class DomParser extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DomParser._create_1();
    }
    static _create_1() {
      return new DOMParser();
    }
    [dartx.parseFromString](...args) {
      return this.parseFromString.apply(this, args);
    }
  };
  dart.setSignature(html$.DomParser, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomParser, []),
      new: dart.definiteFunctionType(html$.DomParser, [])
    }),
    methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html$.Document, [core.String, core.String])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomParser, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.DOMParser, html$.DomParser);
  dart.defineExtensionNames([
    'w',
    'x',
    'y',
    'z'
  ]);
  html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(x, y, z, w) {
      return html$.DomPointReadOnly._create_1(x, y, z, w);
    }
    static _create_1(x, y, z, w) {
      return new DOMPointReadOnly(x, y, z, w);
    }
    get [dartx.w]() {
      return this.w;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.setSignature(html$.DomPointReadOnly, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomPointReadOnly, []),
      new: dart.definiteFunctionType(html$.DomPointReadOnly, [core.num, core.num, core.num, core.num])
    }),
    getters: () => ({
      [dartx.w]: dart.definiteFunctionType(core.num, []),
      [dartx.x]: dart.definiteFunctionType(core.num, []),
      [dartx.y]: dart.definiteFunctionType(core.num, []),
      [dartx.z]: dart.definiteFunctionType(core.num, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.DOMPointReadOnly, html$.DomPointReadOnly);
  dart.defineExtensionNames([
    'w',
    'w',
    'x',
    'x',
    'y',
    'y',
    'z',
    'z'
  ]);
  html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(point_OR_x, y, z, w) {
      if (point_OR_x === void 0) point_OR_x = null;
      if (y === void 0) y = null;
      if (z === void 0) z = null;
      if (w === void 0) w = null;
      if ((core.Map.is(point_OR_x) || point_OR_x == null) && y == null && z == null && w == null) {
        let point_1 = html_common.convertDartToNative_Dictionary(core.Map._check(point_OR_x));
        return html$.DomPoint._create_1(point_1);
      }
      if (point_OR_x == null && y == null && z == null && w == null) {
        return html$.DomPoint._create_2();
      }
      if ((typeof point_OR_x == 'number' || point_OR_x == null) && y == null && z == null && w == null) {
        return html$.DomPoint._create_3(point_OR_x);
      }
      if ((typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && z == null && w == null) {
        return html$.DomPoint._create_4(point_OR_x, y);
      }
      if ((typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && w == null) {
        return html$.DomPoint._create_5(point_OR_x, y, z);
      }
      if ((typeof w == 'number' || w == null) && (typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null)) {
        return html$.DomPoint._create_6(point_OR_x, y, z, w);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1(point_OR_x) {
      return new DOMPoint(point_OR_x);
    }
    static _create_2() {
      return new DOMPoint();
    }
    static _create_3(point_OR_x) {
      return new DOMPoint(point_OR_x);
    }
    static _create_4(point_OR_x, y) {
      return new DOMPoint(point_OR_x, y);
    }
    static _create_5(point_OR_x, y, z) {
      return new DOMPoint(point_OR_x, y, z);
    }
    static _create_6(point_OR_x, y, z, w) {
      return new DOMPoint(point_OR_x, y, z, w);
    }
    static get supported() {
      return !!window.DOMPoint || !!window.WebKitPoint;
    }
    get [dartx.w]() {
      return this.w;
    }
    set [dartx.w](value) {
      this.w = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.z]() {
      return this.z;
    }
    set [dartx.z](value) {
      this.z = value;
    }
  };
  dart.setSignature(html$.DomPoint, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomPoint, []),
      new: dart.definiteFunctionType(html$.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
    }),
    setters: () => ({
      [dartx.w]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.y]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.z]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DomPoint, []),
      _create_3: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_6: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6']
  });
  dart.registerExtension(dart.global.DOMPoint, html$.DomPoint);
  dart.defineExtensionNames([
    'toString',
    '==',
    'hashCode',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft',
    'bottom',
    'height',
    'left',
    'right',
    'top',
    'width',
    'x',
    'y'
  ]);
  html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
    [dartx.toString]() {
      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
    }
    [dartx['==']](other) {
      if (!RectangleOfnum().is(other)) return false;
      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
    }
    get [dartx.hashCode]() {
      return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
    }
    [dartx.intersection](other) {
      let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
      let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
        let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    [dartx.intersects](other) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    [dartx.boundingBox](other) {
      let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
      let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    [dartx.containsRectangle](another) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    [dartx.containsPoint](another) {
      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    get [dartx.topLeft]() {
      return new (PointOfnum())(this[dartx.left], this[dartx.top]);
    }
    get [dartx.topRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
    }
    get [dartx.bottomRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    get [dartx.bottomLeft]() {
      return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(x, y, width, height) {
      return html$.DomRectReadOnly._create_1(x, y, width, height);
    }
    static _create_1(x, y, width, height) {
      return new DOMRectReadOnly(x, y, width, height);
    }
    get [dartx.bottom]() {
      return this.bottom;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.left]() {
      return this.left;
    }
    get [dartx.right]() {
      return this.right;
    }
    get [dartx.top]() {
      return this.top;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
  dart.setSignature(html$.DomRectReadOnly, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomRectReadOnly, []),
      new: dart.definiteFunctionType(html$.DomRectReadOnly, [core.num, core.num, core.num, core.num])
    }),
    getters: () => ({
      [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottom]: dart.definiteFunctionType(core.num, []),
      [dartx.height]: dart.definiteFunctionType(core.num, []),
      [dartx.left]: dart.definiteFunctionType(core.num, []),
      [dartx.right]: dart.definiteFunctionType(core.num, []),
      [dartx.top]: dart.definiteFunctionType(core.num, []),
      [dartx.width]: dart.definiteFunctionType(core.num, []),
      [dartx.x]: dart.definiteFunctionType(core.num, []),
      [dartx.y]: dart.definiteFunctionType(core.num, [])
    }),
    methods: () => ({
      [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.DOMRectReadOnly, html$.DomRectReadOnly);
  dart.defineExtensionNames([
    'add',
    'contains',
    'item',
    'remove',
    'toggle',
    'length'
  ]);
  html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.contains](...args) {
      return this.contains.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
    [dartx.toggle](...args) {
      return this.toggle.apply(this, args);
    }
  };
  dart.setSignature(html$.DomTokenList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomTokenList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.toggle]: dart.definiteFunctionType(core.bool, [core.String], [core.bool])
    })
  });
  dart.registerExtension(dart.global.DOMTokenList, html$.DomTokenList);
  dart.defineExtensionNames([
    'value'
  ]);
  html$.DomSettableTokenList = class DomSettableTokenList extends html$.DomTokenList {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.setSignature(html$.DomSettableTokenList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomSettableTokenList, [])}),
    fields: () => ({[dartx.value]: core.String})
  });
  dart.registerExtension(dart.global.DOMSettableTokenList, html$.DomSettableTokenList);
  html$.ImmutableListMixin$ = dart.generic(E => {
    let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    dart.defineExtensionNames([
      'iterator',
      'add',
      'addAll',
      'sort',
      'shuffle',
      'insert',
      'insertAll',
      'setAll',
      'removeAt',
      'removeLast',
      'remove',
      'removeWhere',
      'retainWhere',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange'
    ]);
    class ImmutableListMixin extends core.Object {
      get iterator() {
        return new (FixedSizeListIteratorOfE())(this);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
      add(value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        dart.throw(new core.UnsupportedError("Cannot sort immutable List."));
      }
      shuffle(random) {
        if (random === void 0) random = null;
        dart.throw(new core.UnsupportedError("Cannot shuffle immutable List."));
      }
      insert(index, element) {
        E._check(element);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      insertAll(index, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      setAll(index, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
      }
      removeAt(pos) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      removeLast() {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      remove(object) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      removeWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      retainWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        dart.throw(new core.UnsupportedError("Cannot setRange on immutable List."));
      }
      removeRange(start, end) {
        dart.throw(new core.UnsupportedError("Cannot removeRange on immutable List."));
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
      }
      fillRange(start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
      }
    }
    dart.addTypeTests(ImmutableListMixin);
    ImmutableListMixin[dart.implements] = () => [ListOfE()];
    dart.setSignature(ImmutableListMixin, {
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
      })
    });
    dart.defineExtensionMembers(ImmutableListMixin, [
      'add',
      'addAll',
      'sort',
      'shuffle',
      'insert',
      'insertAll',
      'setAll',
      'removeAt',
      'removeLast',
      'remove',
      'removeWhere',
      'retainWhere',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange',
      'iterator'
    ]);
    return ImmutableListMixin;
  });
  html$.ImmutableListMixin = ImmutableListMixin();
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.item](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.DomStringList[dart.implements] = () => [ListOfString()];
  dart.setSignature(html$.DomStringList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomStringList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(core.String, []),
      [dartx.last]: dart.definiteFunctionType(core.String, []),
      [dartx.single]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.elementAt]: dart.definiteFunctionType(core.String, [core.int]),
      [__getter__]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
    })
  });
  dart.registerExtension(dart.global.DOMStringList, html$.DomStringList);
  html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.DomStringMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomStringMap, [])})
  });
  html$.EffectModel = class EffectModel extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.EffectModel, {
    constructors: () => ({_: dart.definiteFunctionType(html$.EffectModel, [])})
  });
  dart.registerExtension(dart.global.EffectModel, html$.EffectModel);
  const _childElements = Symbol('_childElements');
  const _element$ = Symbol('_element');
  const _filter$0 = Symbol('_filter');
  html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
    _wrap(element) {
      this[_childElements] = html$.HtmlCollection._check(element[_children]);
      this[_element$] = element;
    }
    contains(element) {
      return this[_childElements][dartx.contains](element);
    }
    get isEmpty() {
      return this[_element$][_firstElementChild] == null;
    }
    get length() {
      return this[_childElements][dartx.length];
    }
    _get(index) {
      return html$.Element._check(this[_childElements][dartx._get](index));
    }
    _set(index, value) {
      this[_element$][_replaceChild](value, this[_childElements][dartx._get](index));
      return value;
    }
    set length(newLength) {
      dart.throw(new core.UnsupportedError('Cannot resize element lists'));
    }
    add(value) {
      this[_element$][dartx.append](value);
      return value;
    }
    get iterator() {
      return this[dartx.toList]()[dartx.iterator];
    }
    addAll(iterable) {
      if (html$._ChildNodeListLazy.is(iterable)) {
        iterable = ListOfElement().from(iterable);
      }
      for (let element of iterable) {
        this[_element$][dartx.append](element);
      }
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError('Cannot sort element lists'));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError('Cannot shuffle element lists'));
    }
    removeWhere(test) {
      this[_filter$0](test, false);
    }
    retainWhere(test) {
      this[_filter$0](test, true);
    }
    [_filter$0](test, retainMatching) {
      let removed = null;
      if (dart.test(retainMatching)) {
        removed = this[_element$][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool$()));
      } else {
        removed = this[_element$][dartx.children][dartx.where](test);
      }
      for (let e of core.Iterable._check(removed))
        dart.dsend(e, 'remove');
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnimplementedError());
    }
    replaceRange(start, end, iterable) {
      dart.throw(new core.UnimplementedError());
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      dart.throw(new core.UnimplementedError());
    }
    remove(object) {
      if (html$.Element.is(object)) {
        let element = object;
        if (core.identical(element[dartx.parentNode], this[_element$])) {
          this[_element$][_removeChild](element);
          return true;
        }
      }
      return false;
    }
    insert(index, element) {
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
      if (index == this.length) {
        this[_element$][dartx.append](element);
      } else {
        this[_element$][dartx.insertBefore](element, this._get(index));
      }
    }
    setAll(index, iterable) {
      dart.throw(new core.UnimplementedError());
    }
    clear() {
      this[_element$][_clearChildren]();
    }
    removeAt(index) {
      let result = this._get(index);
      if (result != null) {
        this[_element$][_removeChild](result);
      }
      return result;
    }
    removeLast() {
      let result = this.last;
      if (result != null) {
        this[_element$][_removeChild](result);
      }
      return result;
    }
    get first() {
      let result = this[_element$][_firstElementChild];
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get last() {
      let result = this[_element$][_lastElementChild];
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get single() {
      if (dart.notNull(this.length) > 1) dart.throw(new core.StateError("More than one element"));
      return this.first;
    }
    get rawList() {
      return this[_childElements];
    }
  };
  dart.addSimpleTypeTests(html$._ChildrenElementList);
  dart.defineNamedConstructor(html$._ChildrenElementList, '_wrap');
  html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(html$._ChildrenElementList, {
    constructors: () => ({_wrap: dart.definiteFunctionType(html$._ChildrenElementList, [html$.Element])}),
    fields: () => ({
      [_element$]: html$.Element,
      [_childElements]: html$.HtmlCollection
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      iterator: dart.definiteFunctionType(core.Iterator$(html$.Element), []),
      first: dart.definiteFunctionType(html$.Element, []),
      last: dart.definiteFunctionType(html$.Element, []),
      single: dart.definiteFunctionType(html$.Element, []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      _get: dart.definiteFunctionType(html$.Element, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      add: dart.definiteFunctionType(html$.Element, [html$.Element]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfElement()]),
      sort: dart.definiteFunctionType(dart.void, [], [ElementAndElementToint()]),
      removeWhere: dart.definiteFunctionType(dart.void, [ElementTobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ElementTobool()]),
      [_filter$0]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()], [core.int]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.Element]),
      insert: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfElement()]),
      removeAt: dart.definiteFunctionType(html$.Element, [core.int]),
      removeLast: dart.definiteFunctionType(html$.Element, [])
    })
  });
  dart.defineExtensionMembers(html$._ChildrenElementList, [
    'contains',
    '_get',
    '_set',
    'add',
    'addAll',
    'sort',
    'shuffle',
    'removeWhere',
    'retainWhere',
    'setRange',
    'replaceRange',
    'fillRange',
    'remove',
    'insert',
    'setAll',
    'clear',
    'removeAt',
    'removeLast',
    'isEmpty',
    'length',
    'length',
    'iterator',
    'first',
    'last',
    'single'
  ]);
  html$.ElementList$ = dart.generic(T => {
    class ElementList extends collection.ListBase$(T) {}
    return ElementList;
  });
  html$.ElementList = ElementList();
  const _nodeList = Symbol('_nodeList');
  const _forElementList = Symbol('_forElementList');
  html$._FrozenElementList$ = dart.generic(E => {
    let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
    let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.definiteFunctionType(IterableOfString(), [E])))();
    class _FrozenElementList extends collection.ListBase$(E) {
      _wrap(nodeList) {
        this[_nodeList] = nodeList;
      }
      get length() {
        return this[_nodeList][dartx.length];
      }
      _get(index) {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx._get](index));
      }
      _set(index, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError('Cannot modify list'));
        return value;
      }
      set length(newLength) {
        dart.throw(new core.UnsupportedError('Cannot modify list'));
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        dart.throw(new core.UnsupportedError('Cannot sort list'));
      }
      shuffle(random) {
        if (random === void 0) random = null;
        dart.throw(new core.UnsupportedError('Cannot shuffle list'));
      }
      get first() {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.first]);
      }
      get last() {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.last]);
      }
      get single() {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.single]);
      }
      get classes() {
        return html$._MultiElementCssClassSet.new(this);
      }
      get style() {
        return new html$._CssStyleDeclarationSet(this);
      }
      set classes(value) {
        this[dartx.forEach](dart.fn(e => e[dartx.classes] = value, EToIterableOfString()));
      }
      get contentEdge() {
        return new html$._ContentCssListRect(this);
      }
      get paddingEdge() {
        return this.first[dartx.paddingEdge];
      }
      get borderEdge() {
        return this.first[dartx.borderEdge];
      }
      get marginEdge() {
        return this.first[dartx.marginEdge];
      }
      get rawList() {
        return this[_nodeList];
      }
      get onAbort() {
        return html$.Element.abortEvent[_forElementList](this);
      }
      get onBeforeCopy() {
        return html$.Element.beforeCopyEvent[_forElementList](this);
      }
      get onBeforeCut() {
        return html$.Element.beforeCutEvent[_forElementList](this);
      }
      get onBeforePaste() {
        return html$.Element.beforePasteEvent[_forElementList](this);
      }
      get onBlur() {
        return html$.Element.blurEvent[_forElementList](this);
      }
      get onCanPlay() {
        return html$.Element.canPlayEvent[_forElementList](this);
      }
      get onCanPlayThrough() {
        return html$.Element.canPlayThroughEvent[_forElementList](this);
      }
      get onChange() {
        return html$.Element.changeEvent[_forElementList](this);
      }
      get onClick() {
        return html$.Element.clickEvent[_forElementList](this);
      }
      get onContextMenu() {
        return html$.Element.contextMenuEvent[_forElementList](this);
      }
      get onCopy() {
        return html$.Element.copyEvent[_forElementList](this);
      }
      get onCut() {
        return html$.Element.cutEvent[_forElementList](this);
      }
      get onDoubleClick() {
        return html$.Element.doubleClickEvent[_forElementList](this);
      }
      get onDrag() {
        return html$.Element.dragEvent[_forElementList](this);
      }
      get onDragEnd() {
        return html$.Element.dragEndEvent[_forElementList](this);
      }
      get onDragEnter() {
        return html$.Element.dragEnterEvent[_forElementList](this);
      }
      get onDragLeave() {
        return html$.Element.dragLeaveEvent[_forElementList](this);
      }
      get onDragOver() {
        return html$.Element.dragOverEvent[_forElementList](this);
      }
      get onDragStart() {
        return html$.Element.dragStartEvent[_forElementList](this);
      }
      get onDrop() {
        return html$.Element.dropEvent[_forElementList](this);
      }
      get onDurationChange() {
        return html$.Element.durationChangeEvent[_forElementList](this);
      }
      get onEmptied() {
        return html$.Element.emptiedEvent[_forElementList](this);
      }
      get onEnded() {
        return html$.Element.endedEvent[_forElementList](this);
      }
      get onError() {
        return html$.Element.errorEvent[_forElementList](this);
      }
      get onFocus() {
        return html$.Element.focusEvent[_forElementList](this);
      }
      get onInput() {
        return html$.Element.inputEvent[_forElementList](this);
      }
      get onInvalid() {
        return html$.Element.invalidEvent[_forElementList](this);
      }
      get onKeyDown() {
        return html$.Element.keyDownEvent[_forElementList](this);
      }
      get onKeyPress() {
        return html$.Element.keyPressEvent[_forElementList](this);
      }
      get onKeyUp() {
        return html$.Element.keyUpEvent[_forElementList](this);
      }
      get onLoad() {
        return html$.Element.loadEvent[_forElementList](this);
      }
      get onLoadedData() {
        return html$.Element.loadedDataEvent[_forElementList](this);
      }
      get onLoadedMetadata() {
        return html$.Element.loadedMetadataEvent[_forElementList](this);
      }
      get onMouseDown() {
        return html$.Element.mouseDownEvent[_forElementList](this);
      }
      get onMouseEnter() {
        return html$.Element.mouseEnterEvent[_forElementList](this);
      }
      get onMouseLeave() {
        return html$.Element.mouseLeaveEvent[_forElementList](this);
      }
      get onMouseMove() {
        return html$.Element.mouseMoveEvent[_forElementList](this);
      }
      get onMouseOut() {
        return html$.Element.mouseOutEvent[_forElementList](this);
      }
      get onMouseOver() {
        return html$.Element.mouseOverEvent[_forElementList](this);
      }
      get onMouseUp() {
        return html$.Element.mouseUpEvent[_forElementList](this);
      }
      get onMouseWheel() {
        return html$.Element.mouseWheelEvent[_forElementList](this);
      }
      get onPaste() {
        return html$.Element.pasteEvent[_forElementList](this);
      }
      get onPause() {
        return html$.Element.pauseEvent[_forElementList](this);
      }
      get onPlay() {
        return html$.Element.playEvent[_forElementList](this);
      }
      get onPlaying() {
        return html$.Element.playingEvent[_forElementList](this);
      }
      get onRateChange() {
        return html$.Element.rateChangeEvent[_forElementList](this);
      }
      get onReset() {
        return html$.Element.resetEvent[_forElementList](this);
      }
      get onResize() {
        return html$.Element.resizeEvent[_forElementList](this);
      }
      get onScroll() {
        return html$.Element.scrollEvent[_forElementList](this);
      }
      get onSearch() {
        return html$.Element.searchEvent[_forElementList](this);
      }
      get onSeeked() {
        return html$.Element.seekedEvent[_forElementList](this);
      }
      get onSeeking() {
        return html$.Element.seekingEvent[_forElementList](this);
      }
      get onSelect() {
        return html$.Element.selectEvent[_forElementList](this);
      }
      get onSelectStart() {
        return html$.Element.selectStartEvent[_forElementList](this);
      }
      get onStalled() {
        return html$.Element.stalledEvent[_forElementList](this);
      }
      get onSubmit() {
        return html$.Element.submitEvent[_forElementList](this);
      }
      get onSuspend() {
        return html$.Element.suspendEvent[_forElementList](this);
      }
      get onTimeUpdate() {
        return html$.Element.timeUpdateEvent[_forElementList](this);
      }
      get onTouchCancel() {
        return html$.Element.touchCancelEvent[_forElementList](this);
      }
      get onTouchEnd() {
        return html$.Element.touchEndEvent[_forElementList](this);
      }
      get onTouchEnter() {
        return html$.Element.touchEnterEvent[_forElementList](this);
      }
      get onTouchLeave() {
        return html$.Element.touchLeaveEvent[_forElementList](this);
      }
      get onTouchMove() {
        return html$.Element.touchMoveEvent[_forElementList](this);
      }
      get onTouchStart() {
        return html$.Element.touchStartEvent[_forElementList](this);
      }
      get onTransitionEnd() {
        return html$.Element.transitionEndEvent[_forElementList](this);
      }
      get onVolumeChange() {
        return html$.Element.volumeChangeEvent[_forElementList](this);
      }
      get onWaiting() {
        return html$.Element.waitingEvent[_forElementList](this);
      }
      get onFullscreenChange() {
        return html$.Element.fullscreenChangeEvent[_forElementList](this);
      }
      get onFullscreenError() {
        return html$.Element.fullscreenErrorEvent[_forElementList](this);
      }
    }
    dart.defineNamedConstructor(_FrozenElementList, '_wrap');
    _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
    dart.setSignature(_FrozenElementList, {
      constructors: () => ({_wrap: dart.definiteFunctionType(html$._FrozenElementList$(E), [ListOfNode()])}),
      fields: () => ({[_nodeList]: ListOfNode()}),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, []),
        classes: dart.definiteFunctionType(html$.CssClassSet, []),
        style: dart.definiteFunctionType(html$.CssStyleDeclarationBase, []),
        contentEdge: dart.definiteFunctionType(html$.CssRect, []),
        paddingEdge: dart.definiteFunctionType(html$.CssRect, []),
        borderEdge: dart.definiteFunctionType(html$.CssRect, []),
        marginEdge: dart.definiteFunctionType(html$.CssRect, []),
        rawList: dart.definiteFunctionType(core.List$(html$.Node), []),
        onAbort: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBeforeCopy: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBeforeCut: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBeforePaste: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBlur: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onCanPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onCanPlayThrough: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onClick: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onContextMenu: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onCopy: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
        onCut: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
        onDoubleClick: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onDrag: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragEnd: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragStart: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDrop: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDurationChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onEmptied: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onEnded: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onFocus: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onInput: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onInvalid: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onKeyDown: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
        onKeyPress: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
        onKeyUp: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
        onLoad: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onLoadedData: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onLoadedMetadata: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onMouseDown: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseMove: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseOut: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseUp: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseWheel: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
        onPaste: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
        onPause: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onPlaying: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onRateChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onReset: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onResize: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onScroll: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSearch: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSeeked: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSeeking: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSelect: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSelectStart: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onStalled: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSubmit: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSuspend: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onTimeUpdate: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onTouchCancel: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchEnter: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchLeave: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchMove: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchStart: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTransitionEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
        onVolumeChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onWaiting: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onFullscreenChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onFullscreenError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
      }),
      setters: () => ({
        length: dart.definiteFunctionType(dart.void, [core.int]),
        classes: dart.definiteFunctionType(dart.void, [IterableOfString()])
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(E, [core.int]),
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()])
      })
    });
    dart.defineExtensionMembers(_FrozenElementList, [
      '_get',
      '_set',
      'sort',
      'shuffle',
      'length',
      'length',
      'first',
      'last',
      'single'
    ]);
    return _FrozenElementList;
  });
  html$._FrozenElementList = _FrozenElementList();
  html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
    static createElement_tag(tag, typeExtension) {
      if (typeExtension != null) {
        return document.createElement(tag, typeExtension);
      }
      return document.createElement(tag);
    }
  };
  dart.setSignature(html$._ElementFactoryProvider, {
    statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
    names: ['createElement_tag']
  });
  const _value$2 = Symbol('_value');
  html$.ScrollAlignment = class ScrollAlignment extends core.Object {
    _internal(value) {
      this[_value$2] = value;
    }
    toString() {
      return dart.str`ScrollAlignment.${this[_value$2]}`;
    }
  };
  dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
  dart.setSignature(html$.ScrollAlignment, {
    constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
    fields: () => ({[_value$2]: dart.dynamic}),
    sfields: () => ({
      TOP: html$.ScrollAlignment,
      CENTER: html$.ScrollAlignment,
      BOTTOM: html$.ScrollAlignment
    })
  });
  dart.defineLazy(html$.ScrollAlignment, {
    get TOP() {
      return dart.const(new html$.ScrollAlignment._internal('TOP'));
    },
    get CENTER() {
      return dart.const(new html$.ScrollAlignment._internal('CENTER'));
    },
    get BOTTOM() {
      return dart.const(new html$.ScrollAlignment._internal('BOTTOM'));
    }
  });
  const __setter__ = Symbol('__setter__');
  dart.defineExtensionNames([
    'height',
    'name',
    'src',
    'type',
    'width'
  ]);
  html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.EmbedElement._check(html$.document[dartx.createElement]("embed"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.name] = null;
      this[dartx.src] = null;
      this[dartx.type] = null;
      this[dartx.width] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('embed');
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.EmbedElement, 'created');
  dart.setSignature(html$.EmbedElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.EmbedElement, []),
      new: dart.definiteFunctionType(html$.EmbedElement, []),
      created: dart.definiteFunctionType(html$.EmbedElement, [])
    }),
    fields: () => ({
      [dartx.height]: core.String,
      [dartx.name]: core.String,
      [dartx.src]: core.String,
      [dartx.type]: core.String,
      [dartx.width]: core.String
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLEmbedElement, html$.EmbedElement);
  html$._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
  html$._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html$.Entry]));
  html$._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html$.FileError]));
  dart.defineExtensionNames([
    'colno',
    'error',
    'filename',
    'lineno',
    'message'
  ]);
  html$.ErrorEvent = class ErrorEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ErrorEvent._create_1(type, eventInitDict_1);
      }
      return html$.ErrorEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ErrorEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ErrorEvent(type);
    }
    get [dartx.colno]() {
      return this.colno;
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.filename]() {
      return this.filename;
    }
    get [dartx.lineno]() {
      return this.lineno;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(html$.ErrorEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ErrorEvent, []),
      new: dart.definiteFunctionType(html$.ErrorEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.colno]: core.int,
      [dartx.error]: core.Object,
      [dartx.filename]: core.String,
      [dartx.lineno]: core.int,
      [dartx.message]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ErrorEvent, html$.ErrorEvent);
  dart.defineExtensionNames([
    'close',
    'onError',
    'onMessage',
    'onOpen',
    'readyState',
    'url',
    'withCredentials'
  ]);
  html$.EventSource = class EventSource extends html$.EventTarget {
    static new(url, opts) {
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
      let parsedOptions = dart.map({withCredentials: withCredentials}, core.String, dart.dynamic);
      return html$.EventSource._factoryEventSource(url, parsedOptions);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static _factoryEventSource(url, eventSourceInitDict) {
      if (eventSourceInitDict === void 0) eventSourceInitDict = null;
      if (eventSourceInitDict != null) {
        let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
        return html$.EventSource._create_1(url, eventSourceInitDict_1);
      }
      return html$.EventSource._create_2(url);
    }
    static _create_1(url, eventSourceInitDict) {
      return new EventSource(url, eventSourceInitDict);
    }
    static _create_2(url) {
      return new EventSource(url);
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.url]() {
      return this.url;
    }
    get [dartx.withCredentials]() {
      return this.withCredentials;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.EventSource.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.EventSource.messageEvent.forTarget(this);
    }
    get [dartx.onOpen]() {
      return html$.EventSource.openEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.EventSource, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.EventSource, [core.String], {withCredentials: dart.dynamic}),
      _: dart.definiteFunctionType(html$.EventSource, [])
    }),
    fields: () => ({
      [dartx.readyState]: core.int,
      [dartx.url]: core.String,
      [dartx.withCredentials]: core.bool
    }),
    getters: () => ({
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      openEvent: EventStreamProviderOfEvent(),
      CLOSED: core.int,
      CONNECTING: core.int,
      OPEN: core.int
    }),
    statics: () => ({
      _factoryEventSource: dart.definiteFunctionType(html$.EventSource, [core.String], [core.Map]),
      _create_1: dart.definiteFunctionType(html$.EventSource, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.EventSource, [dart.dynamic])
    }),
    names: ['_factoryEventSource', '_create_1', '_create_2']
  });
  html$.EventSource.CLOSED = 2;
  html$.EventSource.CONNECTING = 0;
  html$.EventSource.OPEN = 1;
  dart.defineLazy(html$.EventSource, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get openEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('open'));
    }
  });
  dart.registerExtension(dart.global.EventSource, html$.EventSource);
  const _ptr = Symbol('_ptr');
  html$.Events = class Events extends core.Object {
    new(ptr) {
      this[_ptr] = ptr;
    }
    _get(type) {
      return new (_EventStreamOfEvent())(this[_ptr], type, false);
    }
  };
  dart.setSignature(html$.Events, {
    constructors: () => ({new: dart.definiteFunctionType(html$.Events, [html$.EventTarget])}),
    fields: () => ({[_ptr]: html$.EventTarget}),
    methods: () => ({_get: dart.definiteFunctionType(async.Stream, [core.String])})
  });
  html$.ElementEvents = class ElementEvents extends html$.Events {
    new(ptr) {
      super.new(ptr);
    }
    _get(type) {
      if (dart.test(html$.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
        if (dart.test(html_common.Device.isWebKit)) {
          return new (_ElementEventStreamImplOfEvent())(this[_ptr], html$.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
        }
      }
      return new (_ElementEventStreamImplOfEvent())(this[_ptr], type, false);
    }
  };
  dart.setSignature(html$.ElementEvents, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ElementEvents, [html$.Element])}),
    sfields: () => ({webkitEvents: MapOfString$String()})
  });
  dart.defineLazy(html$.ElementEvents, {
    get webkitEvents() {
      return dart.map({animationend: 'webkitAnimationEnd', animationiteration: 'webkitAnimationIteration', animationstart: 'webkitAnimationStart', fullscreenchange: 'webkitfullscreenchange', fullscreenerror: 'webkitfullscreenerror', keyadded: 'webkitkeyadded', keyerror: 'webkitkeyerror', keymessage: 'webkitkeymessage', needkey: 'webkitneedkey', pointerlockchange: 'webkitpointerlockchange', pointerlockerror: 'webkitpointerlockerror', resourcetimingbufferfull: 'webkitresourcetimingbufferfull', transitionend: 'webkitTransitionEnd', speechchange: 'webkitSpeechChange'}, core.String, core.String);
    }
  });
  dart.defineExtensionNames([
    'waitUntil'
  ]);
  html$.ExtendableEvent = class ExtendableEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ExtendableEvent._create_1(type, eventInitDict_1);
      }
      return html$.ExtendableEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ExtendableEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ExtendableEvent(type);
    }
    [dartx.waitUntil](...args) {
      return this.waitUntil.apply(this, args);
    }
  };
  dart.setSignature(html$.ExtendableEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ExtendableEvent, []),
      new: dart.definiteFunctionType(html$.ExtendableEvent, [core.String], [core.Map])
    }),
    methods: () => ({[dartx.waitUntil]: dart.definiteFunctionType(dart.void, [core.Object])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ExtendableEvent, html$.ExtendableEvent);
  dart.defineExtensionNames([
    'protocol',
    'provider'
  ]);
  html$.FederatedCredential = class FederatedCredential extends html$.Credential {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(data) {
      let data_1 = html_common.convertDartToNative_Dictionary(data);
      return html$.FederatedCredential._create_1(data_1);
    }
    static _create_1(data) {
      return new FederatedCredential(data);
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    get [dartx.provider]() {
      return this.provider;
    }
  };
  dart.setSignature(html$.FederatedCredential, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FederatedCredential, []),
      new: dart.definiteFunctionType(html$.FederatedCredential, [core.Map])
    }),
    fields: () => ({
      [dartx.protocol]: core.String,
      [dartx.provider]: core.String
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.FederatedCredential, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.FederatedCredential, html$.FederatedCredential);
  dart.defineExtensionNames([
    'respondWith',
    'isReload',
    'request'
  ]);
  html$.FetchEvent = class FetchEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.FetchEvent._create_1(type, eventInitDict_1);
      }
      return html$.FetchEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new FetchEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new FetchEvent(type);
    }
    get [dartx.isReload]() {
      return this.isReload;
    }
    get [dartx.request]() {
      return this.request;
    }
    [dartx.respondWith](...args) {
      return this.respondWith.apply(this, args);
    }
  };
  dart.setSignature(html$.FetchEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FetchEvent, []),
      new: dart.definiteFunctionType(html$.FetchEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.isReload]: core.bool,
      [dartx.request]: html$._Request
    }),
    methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(dart.void, [core.Object])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FetchEvent, html$.FetchEvent);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'disabled',
    'elements',
    'form',
    'name',
    'type',
    'validationMessage',
    'validity',
    'willValidate'
  ]);
  html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.FieldSetElement._check(html$.document[dartx.createElement]("fieldset"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.elements] = null;
      this[dartx.form] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.elements]() {
      return this.elements;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.FieldSetElement, 'created');
  dart.setSignature(html$.FieldSetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FieldSetElement, []),
      new: dart.definiteFunctionType(html$.FieldSetElement, []),
      created: dart.definiteFunctionType(html$.FieldSetElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.elements]: html$.HtmlFormControlsCollection,
      [dartx.form]: html$.FormElement,
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLFieldSetElement, html$.FieldSetElement);
  const _get_lastModifiedDate = Symbol('_get_lastModifiedDate');
  dart.defineExtensionNames([
    'lastModifiedDate',
    'lastModified',
    'name',
    'relativePath'
  ]);
  html$.File = class File extends html$.Blob {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(fileBits, fileName, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return html$.File._create_1(fileBits, fileName, options_1);
      }
      return html$.File._create_2(fileBits, fileName);
    }
    static _create_1(fileBits, fileName, options) {
      return new File(fileBits, fileName, options);
    }
    static _create_2(fileBits, fileName) {
      return new File(fileBits, fileName);
    }
    get [dartx.lastModified]() {
      return this.lastModified;
    }
    get [dartx.lastModifiedDate]() {
      return html_common.convertNativeToDart_DateTime(this[_get_lastModifiedDate]);
    }
    get [_get_lastModifiedDate]() {
      return this.lastModifiedDate;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.relativePath]() {
      return this.webkitRelativePath;
    }
  };
  dart.setSignature(html$.File, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.File, []),
      new: dart.definiteFunctionType(html$.File, [ListOfObject(), core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.lastModified]: core.int,
      [_get_lastModifiedDate]: dart.dynamic,
      [dartx.name]: core.String,
      [dartx.relativePath]: core.String
    }),
    getters: () => ({[dartx.lastModifiedDate]: dart.definiteFunctionType(core.DateTime, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.File, html$.File);
  html$._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html$.File]));
  const _createWriter = Symbol('_createWriter');
  const _file$ = Symbol('_file');
  dart.defineExtensionNames([
    'createWriter',
    'file'
  ]);
  html$.FileEntry = class FileEntry extends html$.Entry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_createWriter](...args) {
      return this.createWriter.apply(this, args);
    }
    [dartx.createWriter]() {
      let completer = CompleterOfFileWriter().new();
      this[_createWriter](dart.fn(value => {
        completer.complete(value);
      }, FileWriterTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_file$](...args) {
      return this.file.apply(this, args);
    }
    [dartx.file]() {
      let completer = CompleterOfFile$().new();
      this[_file$](dart.fn(value => {
        completer.complete(value);
      }, FileTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(html$.FileEntry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileEntry, [])}),
    methods: () => ({
      [_createWriter]: dart.definiteFunctionType(dart.void, [html$._FileWriterCallback], [html$._ErrorCallback]),
      [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html$.FileWriter), []),
      [_file$]: dart.definiteFunctionType(dart.void, [html$._FileCallback], [html$._ErrorCallback]),
      [dartx.file]: dart.definiteFunctionType(async.Future$(html$.File), [])
    })
  });
  dart.registerExtension(dart.global.FileEntry, html$.FileEntry);
  dart.defineExtensionNames([
    'code'
  ]);
  html$.FileError = class FileError extends html$.DomError {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
  };
  dart.setSignature(html$.FileError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileError, [])}),
    fields: () => ({[dartx.code]: core.int}),
    sfields: () => ({
      ABORT_ERR: core.int,
      ENCODING_ERR: core.int,
      INVALID_MODIFICATION_ERR: core.int,
      INVALID_STATE_ERR: core.int,
      NOT_FOUND_ERR: core.int,
      NOT_READABLE_ERR: core.int,
      NO_MODIFICATION_ALLOWED_ERR: core.int,
      PATH_EXISTS_ERR: core.int,
      QUOTA_EXCEEDED_ERR: core.int,
      SECURITY_ERR: core.int,
      SYNTAX_ERR: core.int,
      TYPE_MISMATCH_ERR: core.int
    })
  });
  html$.FileError.ABORT_ERR = 3;
  html$.FileError.ENCODING_ERR = 5;
  html$.FileError.INVALID_MODIFICATION_ERR = 9;
  html$.FileError.INVALID_STATE_ERR = 7;
  html$.FileError.NOT_FOUND_ERR = 1;
  html$.FileError.NOT_READABLE_ERR = 4;
  html$.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
  html$.FileError.PATH_EXISTS_ERR = 12;
  html$.FileError.QUOTA_EXCEEDED_ERR = 10;
  html$.FileError.SECURITY_ERR = 2;
  html$.FileError.SYNTAX_ERR = 8;
  html$.FileError.TYPE_MISMATCH_ERR = 11;
  dart.registerExtension(dart.global.FileError, html$.FileError);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.File), html$.ImmutableListMixin$(html$.File)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
  dart.setSignature(html$.FileList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.File, []),
      [dartx.last]: dart.definiteFunctionType(html$.File, []),
      [dartx.single]: dart.definiteFunctionType(html$.File, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.File, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.File]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.File, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.File, [core.int])
    })
  });
  dart.registerExtension(dart.global.FileList, html$.FileList);
  dart.defineExtensionNames([
    'result',
    'abort',
    'readAsArrayBuffer',
    'readAsDataUrl',
    'readAsText',
    'onAbort',
    'onError',
    'onLoad',
    'onLoadEnd',
    'onLoadStart',
    'onProgress',
    'error',
    'readyState'
  ]);
  html$.FileReader = class FileReader extends html$.EventTarget {
    get [dartx.result]() {
      let res = this.result;
      if (typed_data.ByteBuffer.is(res)) {
        return typed_data.Uint8List.view(res);
      }
      return res;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.FileReader._create_1();
    }
    static _create_1() {
      return new FileReader();
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.readAsArrayBuffer](...args) {
      return this.readAsArrayBuffer.apply(this, args);
    }
    [dartx.readAsDataUrl](...args) {
      return this.readAsDataURL.apply(this, args);
    }
    [dartx.readAsText](...args) {
      return this.readAsText.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.FileReader.abortEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.FileReader.errorEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.FileReader.loadEvent.forTarget(this);
    }
    get [dartx.onLoadEnd]() {
      return html$.FileReader.loadEndEvent.forTarget(this);
    }
    get [dartx.onLoadStart]() {
      return html$.FileReader.loadStartEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.FileReader.progressEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.FileReader, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FileReader, []),
      new: dart.definiteFunctionType(html$.FileReader, [])
    }),
    fields: () => ({
      [dartx.error]: html$.FileError,
      [dartx.readyState]: core.int
    }),
    getters: () => ({
      [dartx.result]: dart.definiteFunctionType(core.Object, []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html$.Blob], [core.String])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfProgressEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      loadEvent: EventStreamProviderOfProgressEvent(),
      loadEndEvent: EventStreamProviderOfProgressEvent(),
      loadStartEvent: EventStreamProviderOfProgressEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      DONE: core.int,
      EMPTY: core.int,
      LOADING: core.int
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.FileReader, [])}),
    names: ['_create_1']
  });
  html$.FileReader.DONE = 2;
  html$.FileReader.EMPTY = 0;
  html$.FileReader.LOADING = 1;
  dart.defineLazy(html$.FileReader, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
    },
    get loadEndEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
    },
    get loadStartEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    }
  });
  dart.registerExtension(dart.global.FileReader, html$.FileReader);
  dart.defineExtensionNames([
    'type'
  ]);
  html$.FileStream = class FileStream extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.FileStream, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileStream, [])}),
    fields: () => ({[dartx.type]: core.String})
  });
  dart.registerExtension(dart.global.Stream, html$.FileStream);
  dart.defineExtensionNames([
    'name',
    'root'
  ]);
  html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.webkitRequestFileSystem;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.root]() {
      return this.root;
    }
  };
  dart.setSignature(html$.FileSystem, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileSystem, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.root]: html$.DirectoryEntry
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.DOMFileSystem, html$.FileSystem);
  html$._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html$.FileSystem]));
  dart.defineExtensionNames([
    'abort',
    'seek',
    'truncate',
    'write',
    'onAbort',
    'onError',
    'onProgress',
    'onWrite',
    'onWriteEnd',
    'onWriteStart',
    'error',
    'length',
    'position',
    'readyState'
  ]);
  html$.FileWriter = class FileWriter extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.position]() {
      return this.position;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.seek](...args) {
      return this.seek.apply(this, args);
    }
    [dartx.truncate](...args) {
      return this.truncate.apply(this, args);
    }
    [dartx.write](...args) {
      return this.write.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.FileWriter.abortEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.FileWriter.errorEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.FileWriter.progressEvent.forTarget(this);
    }
    get [dartx.onWrite]() {
      return html$.FileWriter.writeEvent.forTarget(this);
    }
    get [dartx.onWriteEnd]() {
      return html$.FileWriter.writeEndEvent.forTarget(this);
    }
    get [dartx.onWriteStart]() {
      return html$.FileWriter.writeStartEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.FileWriter, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileWriter, [])}),
    fields: () => ({
      [dartx.error]: html$.FileError,
      [dartx.length]: core.int,
      [dartx.position]: core.int,
      [dartx.readyState]: core.int
    }),
    getters: () => ({
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.seek]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.truncate]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.write]: dart.definiteFunctionType(dart.void, [html$.Blob])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfProgressEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      writeEvent: EventStreamProviderOfProgressEvent(),
      writeEndEvent: EventStreamProviderOfProgressEvent(),
      writeStartEvent: EventStreamProviderOfProgressEvent(),
      DONE: core.int,
      INIT: core.int,
      WRITING: core.int
    })
  });
  html$.FileWriter.DONE = 2;
  html$.FileWriter.INIT = 0;
  html$.FileWriter.WRITING = 1;
  dart.defineLazy(html$.FileWriter, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    },
    get writeEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('write'));
    },
    get writeEndEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('writeend'));
    },
    get writeStartEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('writestart'));
    }
  });
  dart.registerExtension(dart.global.FileWriter, html$.FileWriter);
  html$._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html$.FileWriter]));
  const _get_relatedTarget = Symbol('_get_relatedTarget');
  dart.defineExtensionNames([
    'relatedTarget'
  ]);
  html$.FocusEvent = class FocusEvent extends html$.UIEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.FocusEvent._create_1(type, eventInitDict_1);
      }
      return html$.FocusEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new FocusEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new FocusEvent(type);
    }
    get [dartx.relatedTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
    }
    get [_get_relatedTarget]() {
      return this.relatedTarget;
    }
  };
  dart.setSignature(html$.FocusEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FocusEvent, []),
      new: dart.definiteFunctionType(html$.FocusEvent, [core.String], [core.Map])
    }),
    fields: () => ({[_get_relatedTarget]: dart.dynamic}),
    getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FocusEvent, html$.FocusEvent);
  dart.defineExtensionNames([
    'load',
    'family',
    'featureSettings',
    'loaded',
    'status',
    'stretch',
    'style',
    'unicodeRange',
    'variant',
    'weight'
  ]);
  html$.FontFace = class FontFace extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(family, source, descriptors) {
      if (descriptors === void 0) descriptors = null;
      if (descriptors != null) {
        let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
        return html$.FontFace._create_1(family, source, descriptors_1);
      }
      return html$.FontFace._create_2(family, source);
    }
    static _create_1(family, source, descriptors) {
      return new FontFace(family, source, descriptors);
    }
    static _create_2(family, source) {
      return new FontFace(family, source);
    }
    get [dartx.family]() {
      return this.family;
    }
    set [dartx.family](value) {
      this.family = value;
    }
    get [dartx.featureSettings]() {
      return this.featureSettings;
    }
    set [dartx.featureSettings](value) {
      this.featureSettings = value;
    }
    get [dartx.loaded]() {
      return this.loaded;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.stretch]() {
      return this.stretch;
    }
    set [dartx.stretch](value) {
      this.stretch = value;
    }
    get [dartx.style]() {
      return this.style;
    }
    set [dartx.style](value) {
      this.style = value;
    }
    get [dartx.unicodeRange]() {
      return this.unicodeRange;
    }
    set [dartx.unicodeRange](value) {
      this.unicodeRange = value;
    }
    get [dartx.variant]() {
      return this.variant;
    }
    set [dartx.variant](value) {
      this.variant = value;
    }
    get [dartx.weight]() {
      return this.weight;
    }
    set [dartx.weight](value) {
      this.weight = value;
    }
    [dartx.load](...args) {
      return this.load.apply(this, args);
    }
  };
  dart.setSignature(html$.FontFace, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FontFace, []),
      new: dart.definiteFunctionType(html$.FontFace, [core.String, core.Object], [core.Map])
    }),
    fields: () => ({
      [dartx.family]: core.String,
      [dartx.featureSettings]: core.String,
      [dartx.loaded]: async.Future,
      [dartx.status]: core.String,
      [dartx.stretch]: core.String,
      [dartx.style]: core.String,
      [dartx.unicodeRange]: core.String,
      [dartx.variant]: core.String,
      [dartx.weight]: core.String
    }),
    methods: () => ({[dartx.load]: dart.definiteFunctionType(async.Future, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FontFace, html$.FontFace);
  dart.defineExtensionNames([
    'add',
    'check',
    'clear',
    'delete',
    'forEach',
    'has',
    'size',
    'status'
  ]);
  html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
    get [dartx.status]() {
      return this.status;
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.check](...args) {
      return this.check.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.forEach](...args) {
      return this.forEach.apply(this, args);
    }
    [dartx.has](...args) {
      return this.has.apply(this, args);
    }
  };
  dart.setSignature(html$.FontFaceSet, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSet, [])}),
    fields: () => ({
      [dartx.size]: core.int,
      [dartx.status]: core.String
    }),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(dart.void, [html$.FontFace]),
      [dartx.check]: dart.definiteFunctionType(core.bool, [core.String], [core.String]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.delete]: dart.definiteFunctionType(core.bool, [html$.FontFace]),
      [dartx.forEach]: dart.definiteFunctionType(dart.void, [html$.FontFaceSetForEachCallback], [core.Object]),
      [dartx.has]: dart.definiteFunctionType(core.bool, [html$.FontFace])
    })
  });
  dart.registerExtension(dart.global.FontFaceSet, html$.FontFaceSet);
  html$.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet]));
  dart.defineExtensionNames([
    'fontfaces'
  ]);
  html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.fontfaces]() {
      return this.fontfaces;
    }
  };
  dart.setSignature(html$.FontFaceSetLoadEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSetLoadEvent, [])}),
    fields: () => ({[dartx.fontfaces]: ListOfFontFace()})
  });
  dart.registerExtension(dart.global.FontFaceSetLoadEvent, html$.FontFaceSetLoadEvent);
  dart.defineExtensionNames([
    'append',
    'appendBlob',
    'delete',
    'get',
    'getAll',
    'has',
    'set'
  ]);
  html$.FormData = class FormData extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(form) {
      if (form === void 0) form = null;
      if (form != null) {
        return html$.FormData._create_1(form);
      }
      return html$.FormData._create_2();
    }
    static _create_1(form) {
      return new FormData(form);
    }
    static _create_2() {
      return new FormData();
    }
    static get supported() {
      return !!window.FormData;
    }
    [dartx.append](...args) {
      return this.append.apply(this, args);
    }
    [dartx.appendBlob](...args) {
      return this.append.apply(this, args);
    }
    [dartx.delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.get](...args) {
      return this.get.apply(this, args);
    }
    [dartx.getAll](...args) {
      return this.getAll.apply(this, args);
    }
    [dartx.has](...args) {
      return this.has.apply(this, args);
    }
    [dartx.set](...args) {
      return this.set.apply(this, args);
    }
  };
  dart.setSignature(html$.FormData, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FormData, []),
      new: dart.definiteFunctionType(html$.FormData, [], [html$.FormElement])
    }),
    methods: () => ({
      [dartx.append]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html$.Blob], [core.String]),
      [dartx.delete]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.get]: dart.definiteFunctionType(core.Object, [core.String]),
      [dartx.getAll]: dart.definiteFunctionType(core.List$(core.Object), [core.String]),
      [dartx.has]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.set]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic], [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FormData, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FormData, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FormData, html$.FormData);
  const _requestAutocomplete_1 = Symbol('_requestAutocomplete_1');
  dart.defineExtensionNames([
    'checkValidity',
    'item',
    'reportValidity',
    'requestAutocomplete',
    'reset',
    'submit',
    'acceptCharset',
    'action',
    'autocomplete',
    'encoding',
    'enctype',
    'length',
    'method',
    'name',
    'noValidate',
    'target'
  ]);
  html$.FormElement = class FormElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.FormElement._check(html$.document[dartx.createElement]("form"));
    }
    created() {
      this[dartx.acceptCharset] = null;
      this[dartx.action] = null;
      this[dartx.autocomplete] = null;
      this[dartx.encoding] = null;
      this[dartx.enctype] = null;
      this[dartx.length] = null;
      this[dartx.method] = null;
      this[dartx.name] = null;
      this[dartx.noValidate] = null;
      this[dartx.target] = null;
      super.created();
    }
    get [dartx.acceptCharset]() {
      return this.acceptCharset;
    }
    set [dartx.acceptCharset](value) {
      this.acceptCharset = value;
    }
    get [dartx.action]() {
      return this.action;
    }
    set [dartx.action](value) {
      this.action = value;
    }
    get [dartx.autocomplete]() {
      return this.autocomplete;
    }
    set [dartx.autocomplete](value) {
      this.autocomplete = value;
    }
    get [dartx.encoding]() {
      return this.encoding;
    }
    set [dartx.encoding](value) {
      this.encoding = value;
    }
    get [dartx.enctype]() {
      return this.enctype;
    }
    set [dartx.enctype](value) {
      this.enctype = value;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.method]() {
      return this.method;
    }
    set [dartx.method](value) {
      this.method = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.noValidate]() {
      return this.noValidate;
    }
    set [dartx.noValidate](value) {
      this.noValidate = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.requestAutocomplete](details) {
      let details_1 = html_common.convertDartToNative_Dictionary(details);
      this[_requestAutocomplete_1](details_1);
      return;
    }
    [_requestAutocomplete_1](...args) {
      return this.requestAutocomplete.apply(this, args);
    }
    [dartx.reset](...args) {
      return this.reset.apply(this, args);
    }
    [dartx.submit](...args) {
      return this.submit.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.FormElement, 'created');
  dart.setSignature(html$.FormElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FormElement, []),
      new: dart.definiteFunctionType(html$.FormElement, []),
      created: dart.definiteFunctionType(html$.FormElement, [])
    }),
    fields: () => ({
      [dartx.acceptCharset]: core.String,
      [dartx.action]: core.String,
      [dartx.autocomplete]: core.String,
      [dartx.encoding]: core.String,
      [dartx.enctype]: core.String,
      [dartx.length]: core.int,
      [dartx.method]: core.String,
      [dartx.name]: core.String,
      [dartx.noValidate]: core.bool,
      [dartx.target]: core.String
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(core.Object, [core.String]),
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.requestAutocomplete]: dart.definiteFunctionType(dart.void, [core.Map]),
      [_requestAutocomplete_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.reset]: dart.definiteFunctionType(dart.void, []),
      [dartx.submit]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFormElement, html$.FormElement);
  html$.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
  dart.defineExtensionNames([
    'axes',
    'buttons',
    'connected',
    'id',
    'index',
    'mapping',
    'timestamp'
  ]);
  html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.axes]() {
      return this.axes;
    }
    get [dartx.buttons]() {
      return this.buttons;
    }
    get [dartx.connected]() {
      return this.connected;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.index]() {
      return this.index;
    }
    get [dartx.mapping]() {
      return this.mapping;
    }
    get [dartx.timestamp]() {
      return this.timestamp;
    }
  };
  dart.setSignature(html$.Gamepad, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Gamepad, [])}),
    fields: () => ({
      [dartx.axes]: ListOfnum(),
      [dartx.buttons]: ListOfGamepadButton(),
      [dartx.connected]: core.bool,
      [dartx.id]: core.String,
      [dartx.index]: core.int,
      [dartx.mapping]: core.String,
      [dartx.timestamp]: core.int
    })
  });
  dart.registerExtension(dart.global.Gamepad, html$.Gamepad);
  dart.defineExtensionNames([
    'pressed',
    'value'
  ]);
  html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.pressed]() {
      return this.pressed;
    }
    get [dartx.value]() {
      return this.value;
    }
  };
  dart.setSignature(html$.GamepadButton, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GamepadButton, [])}),
    fields: () => ({
      [dartx.pressed]: core.bool,
      [dartx.value]: core.double
    })
  });
  dart.registerExtension(dart.global.GamepadButton, html$.GamepadButton);
  dart.defineExtensionNames([
    'gamepad'
  ]);
  html$.GamepadEvent = class GamepadEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.GamepadEvent._create_1(type, eventInitDict_1);
      }
      return html$.GamepadEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new GamepadEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new GamepadEvent(type);
    }
    get [dartx.gamepad]() {
      return this.gamepad;
    }
  };
  dart.setSignature(html$.GamepadEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.GamepadEvent, []),
      new: dart.definiteFunctionType(html$.GamepadEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.gamepad]: html$.Gamepad}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.GamepadEvent, html$.GamepadEvent);
  dart.defineExtensionNames([
    'getRegisteredRegions',
    'registerRegion',
    'unregisterRegion'
  ]);
  html$.Geofencing = class Geofencing extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getRegisteredRegions](...args) {
      return this.getRegisteredRegions.apply(this, args);
    }
    [dartx.registerRegion](...args) {
      return this.registerRegion.apply(this, args);
    }
    [dartx.unregisterRegion](...args) {
      return this.unregisterRegion.apply(this, args);
    }
  };
  dart.setSignature(html$.Geofencing, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Geofencing, [])}),
    methods: () => ({
      [dartx.getRegisteredRegions]: dart.definiteFunctionType(async.Future, []),
      [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html$.GeofencingRegion]),
      [dartx.unregisterRegion]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.Geofencing, html$.Geofencing);
  dart.defineExtensionNames([
    'id',
    'region'
  ]);
  html$.GeofencingEvent = class GeofencingEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.region]() {
      return this.region;
    }
  };
  dart.setSignature(html$.GeofencingEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingEvent, [])}),
    fields: () => ({
      [dartx.id]: core.String,
      [dartx.region]: html$.GeofencingRegion
    })
  });
  dart.registerExtension(dart.global.GeofencingEvent, html$.GeofencingEvent);
  const _getCurrentPosition = Symbol('_getCurrentPosition');
  const _ensurePosition = Symbol('_ensurePosition');
  const _watchPosition = Symbol('_watchPosition');
  const _clearWatch = Symbol('_clearWatch');
  const _getCurrentPosition_1 = Symbol('_getCurrentPosition_1');
  const _getCurrentPosition_2 = Symbol('_getCurrentPosition_2');
  const _getCurrentPosition_3 = Symbol('_getCurrentPosition_3');
  const _watchPosition_1 = Symbol('_watchPosition_1');
  const _watchPosition_2 = Symbol('_watchPosition_2');
  const _watchPosition_3 = Symbol('_watchPosition_3');
  dart.defineExtensionNames([
    'getCurrentPosition',
    'watchPosition'
  ]);
  html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
    [dartx.getCurrentPosition](opts) {
      let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
      let timeout = opts && 'timeout' in opts ? opts.timeout : null;
      let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
      let options = dart.map();
      if (enableHighAccuracy != null) {
        options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
      }
      if (timeout != null) {
        options[dartx._set]('timeout', timeout.inMilliseconds);
      }
      if (maximumAge != null) {
        options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
      }
      let completer = CompleterOfGeoposition().new();
      try {
        this[_getCurrentPosition](dart.fn(position => {
          completer.complete(this[_ensurePosition](position));
        }, GeopositionTovoid()), dart.fn(error => {
          completer.completeError(error);
        }, PositionErrorTovoid()), options);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        completer.completeError(e, stacktrace);
      }

      return completer.future;
    }
    [dartx.watchPosition](opts) {
      let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
      let timeout = opts && 'timeout' in opts ? opts.timeout : null;
      let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
      let options = dart.map();
      if (enableHighAccuracy != null) {
        options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
      }
      if (timeout != null) {
        options[dartx._set]('timeout', timeout.inMilliseconds);
      }
      if (maximumAge != null) {
        options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
      }
      let watchId = null;
      let controller = null;
      controller = StreamControllerOfGeoposition().new({sync: true, onListen: dart.fn(() => {
          dart.assert(watchId == null);
          watchId = this[_watchPosition](dart.fn(position => {
            controller.add(this[_ensurePosition](position));
          }, GeopositionTovoid()), dart.fn(error => {
            controller.addError(error);
          }, PositionErrorTovoid()), options);
        }, VoidTovoid$()), onCancel: dart.fn(() => {
          dart.assert(watchId != null);
          this[_clearWatch](watchId);
        }, VoidTodynamic$())});
      return controller.stream;
    }
    [_ensurePosition](domPosition) {
      try {
        if (html$.Geoposition.is(domPosition)) {
          return domPosition;
        }
      } catch (e) {
      }

      return new html$._GeopositionWrapper(domPosition);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_clearWatch](...args) {
      return this.clearWatch.apply(this, args);
    }
    [_getCurrentPosition](successCallback, errorCallback, options) {
      if (errorCallback === void 0) errorCallback = null;
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[_getCurrentPosition_1](successCallback, errorCallback, options_1);
        return;
      }
      if (errorCallback != null) {
        this[_getCurrentPosition_2](successCallback, errorCallback);
        return;
      }
      this[_getCurrentPosition_3](successCallback);
      return;
    }
    [_getCurrentPosition_1](...args) {
      return this.getCurrentPosition.apply(this, args);
    }
    [_getCurrentPosition_2](...args) {
      return this.getCurrentPosition.apply(this, args);
    }
    [_getCurrentPosition_3](...args) {
      return this.getCurrentPosition.apply(this, args);
    }
    [_watchPosition](successCallback, errorCallback, options) {
      if (errorCallback === void 0) errorCallback = null;
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_watchPosition_1](successCallback, errorCallback, options_1);
      }
      if (errorCallback != null) {
        return this[_watchPosition_2](successCallback, errorCallback);
      }
      return this[_watchPosition_3](successCallback);
    }
    [_watchPosition_1](...args) {
      return this.watchPosition.apply(this, args);
    }
    [_watchPosition_2](...args) {
      return this.watchPosition.apply(this, args);
    }
    [_watchPosition_3](...args) {
      return this.watchPosition.apply(this, args);
    }
  };
  dart.setSignature(html$.Geolocation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Geolocation, [])}),
    methods: () => ({
      [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
      [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
      [_ensurePosition]: dart.definiteFunctionType(html$.Geoposition, [dart.dynamic]),
      [_clearWatch]: dart.definiteFunctionType(dart.void, [core.int]),
      [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
      [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
      [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback]),
      [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html$._PositionCallback]),
      [_watchPosition]: dart.definiteFunctionType(core.int, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
      [_watchPosition_1]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
      [_watchPosition_2]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback]),
      [_watchPosition_3]: dart.definiteFunctionType(core.int, [html$._PositionCallback])
    })
  });
  dart.registerExtension(dart.global.Geolocation, html$.Geolocation);
  html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
    new(ptr) {
      this[_ptr] = ptr;
    }
    get coords() {
      return this[_ptr].coords;
    }
    get timestamp() {
      return this[_ptr].timestamp;
    }
  };
  html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
  dart.setSignature(html$._GeopositionWrapper, {
    constructors: () => ({new: dart.definiteFunctionType(html$._GeopositionWrapper, [dart.dynamic])}),
    fields: () => ({[_ptr]: dart.dynamic}),
    getters: () => ({
      coords: dart.definiteFunctionType(html$.Coordinates, []),
      timestamp: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.defineExtensionNames([
    'coords',
    'timestamp'
  ]);
  html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.coords]() {
      return this.coords;
    }
    get [dartx.timestamp]() {
      return this.timestamp;
    }
  };
  dart.setSignature(html$.Geoposition, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Geoposition, [])}),
    fields: () => ({
      [dartx.coords]: html$.Coordinates,
      [dartx.timestamp]: core.int
    })
  });
  dart.registerExtension(dart.global.Geoposition, html$.Geoposition);
  dart.defineExtensionNames([
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onVolumeChange',
    'onWaiting'
  ]);
  html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onAbort() {
      return html$.GlobalEventHandlers.abortEvent.forTarget(this);
    }
    get onBlur() {
      return html$.GlobalEventHandlers.blurEvent.forTarget(this);
    }
    get onCanPlay() {
      return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
    }
    get onCanPlayThrough() {
      return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
    }
    get onChange() {
      return html$.GlobalEventHandlers.changeEvent.forTarget(this);
    }
    get onClick() {
      return html$.GlobalEventHandlers.clickEvent.forTarget(this);
    }
    get onContextMenu() {
      return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
    }
    get onDoubleClick() {
      return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
    }
    get onDrag() {
      return html$.GlobalEventHandlers.dragEvent.forTarget(this);
    }
    get onDragEnd() {
      return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
    }
    get onDragEnter() {
      return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
    }
    get onDragLeave() {
      return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
    }
    get onDragOver() {
      return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
    }
    get onDragStart() {
      return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
    }
    get onDrop() {
      return html$.GlobalEventHandlers.dropEvent.forTarget(this);
    }
    get onDurationChange() {
      return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
    }
    get onEmptied() {
      return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
    }
    get onEnded() {
      return html$.GlobalEventHandlers.endedEvent.forTarget(this);
    }
    get onError() {
      return html$.GlobalEventHandlers.errorEvent.forTarget(this);
    }
    get onFocus() {
      return html$.GlobalEventHandlers.focusEvent.forTarget(this);
    }
    get onInput() {
      return html$.GlobalEventHandlers.inputEvent.forTarget(this);
    }
    get onInvalid() {
      return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
    }
    get onKeyDown() {
      return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
    }
    get onKeyPress() {
      return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
    }
    get onKeyUp() {
      return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
    }
    get onLoad() {
      return html$.GlobalEventHandlers.loadEvent.forTarget(this);
    }
    get onLoadedData() {
      return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
    }
    get onLoadedMetadata() {
      return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
    }
    get onMouseDown() {
      return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
    }
    get onMouseEnter() {
      return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
    }
    get onMouseLeave() {
      return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
    }
    get onMouseMove() {
      return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
    }
    get onMouseOut() {
      return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
    }
    get onMouseOver() {
      return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
    }
    get onMouseUp() {
      return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
    }
    get onMouseWheel() {
      return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
    }
    get onPause() {
      return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
    }
    get onPlay() {
      return html$.GlobalEventHandlers.playEvent.forTarget(this);
    }
    get onPlaying() {
      return html$.GlobalEventHandlers.playingEvent.forTarget(this);
    }
    get onRateChange() {
      return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
    }
    get onReset() {
      return html$.GlobalEventHandlers.resetEvent.forTarget(this);
    }
    get onResize() {
      return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
    }
    get onScroll() {
      return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
    }
    get onSeeked() {
      return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
    }
    get onSeeking() {
      return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
    }
    get onSelect() {
      return html$.GlobalEventHandlers.selectEvent.forTarget(this);
    }
    get onStalled() {
      return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
    }
    get onSubmit() {
      return html$.GlobalEventHandlers.submitEvent.forTarget(this);
    }
    get onSuspend() {
      return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
    }
    get onTimeUpdate() {
      return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
    }
    get onVolumeChange() {
      return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
    }
    get onWaiting() {
      return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
    }
  };
  html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
  dart.setSignature(html$.GlobalEventHandlers, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GlobalEventHandlers, [])}),
    getters: () => ({
      onAbort: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onBlur: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onCanPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onClick: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onContextMenu: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDoubleClick: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onDrag: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragEnd: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragStart: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDrop: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDurationChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onEmptied: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onEnded: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onError: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onFocus: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onInput: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onInvalid: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onKeyDown: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      onKeyPress: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      onKeyUp: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      onLoad: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onLoadedData: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onMouseDown: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseMove: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseOut: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseUp: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseWheel: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
      onPause: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onPlaying: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onRateChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onReset: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onResize: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onScroll: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSeeked: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSeeking: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSelect: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onStalled: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSubmit: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSuspend: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onTimeUpdate: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onVolumeChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onWaiting: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfEvent(),
      blurEvent: EventStreamProviderOfEvent(),
      canPlayEvent: EventStreamProviderOfEvent(),
      canPlayThroughEvent: EventStreamProviderOfEvent(),
      changeEvent: EventStreamProviderOfEvent(),
      clickEvent: EventStreamProviderOfMouseEvent(),
      contextMenuEvent: EventStreamProviderOfMouseEvent(),
      doubleClickEvent: EventStreamProviderOfEvent(),
      dragEvent: EventStreamProviderOfMouseEvent(),
      dragEndEvent: EventStreamProviderOfMouseEvent(),
      dragEnterEvent: EventStreamProviderOfMouseEvent(),
      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
      dragOverEvent: EventStreamProviderOfMouseEvent(),
      dragStartEvent: EventStreamProviderOfMouseEvent(),
      dropEvent: EventStreamProviderOfMouseEvent(),
      durationChangeEvent: EventStreamProviderOfEvent(),
      emptiedEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      inputEvent: EventStreamProviderOfEvent(),
      invalidEvent: EventStreamProviderOfEvent(),
      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      loadedDataEvent: EventStreamProviderOfEvent(),
      loadedMetadataEvent: EventStreamProviderOfEvent(),
      mouseDownEvent: EventStreamProviderOfMouseEvent(),
      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
      mouseOutEvent: EventStreamProviderOfMouseEvent(),
      mouseOverEvent: EventStreamProviderOfMouseEvent(),
      mouseUpEvent: EventStreamProviderOfMouseEvent(),
      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      playEvent: EventStreamProviderOfEvent(),
      playingEvent: EventStreamProviderOfEvent(),
      rateChangeEvent: EventStreamProviderOfEvent(),
      resetEvent: EventStreamProviderOfEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      seekedEvent: EventStreamProviderOfEvent(),
      seekingEvent: EventStreamProviderOfEvent(),
      selectEvent: EventStreamProviderOfEvent(),
      stalledEvent: EventStreamProviderOfEvent(),
      submitEvent: EventStreamProviderOfEvent(),
      suspendEvent: EventStreamProviderOfEvent(),
      timeUpdateEvent: EventStreamProviderOfEvent(),
      volumeChangeEvent: EventStreamProviderOfEvent(),
      waitingEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineExtensionMembers(html$.GlobalEventHandlers, [
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onVolumeChange',
    'onWaiting'
  ]);
  dart.defineLazy(html$.GlobalEventHandlers, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get canPlayEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
    },
    get canPlayThroughEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    },
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
    },
    get contextMenuEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
    },
    get doubleClickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
    },
    get dragEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
    },
    get dragEndEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
    },
    get dragEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
    },
    get dragLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
    },
    get dragOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
    },
    get dragStartEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
    },
    get dropEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
    },
    get durationChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
    },
    get emptiedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get inputEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('input'));
    },
    get invalidEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
    },
    get keyDownEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
    },
    get keyPressEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
    },
    get keyUpEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get loadedDataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
    },
    get loadedMetadataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
    },
    get mouseDownEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
    },
    get mouseEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
    },
    get mouseLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
    },
    get mouseMoveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
    },
    get mouseOutEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
    },
    get mouseOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
    },
    get mouseUpEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
    },
    get mouseWheelEvent() {
      return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get playEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('play'));
    },
    get playingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('playing'));
    },
    get rateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
    },
    get resetEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('reset'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get seekedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
    },
    get seekingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
    },
    get selectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('select'));
    },
    get stalledEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
    },
    get submitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('submit'));
    },
    get suspendEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
    },
    get timeUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
    },
    get volumeChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
    },
    get waitingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
    }
  });
  dart.defineExtensionNames([
    'color'
  ]);
  html$.HRElement = class HRElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HRElement._check(html$.document[dartx.createElement]("hr"));
    }
    created() {
      this[dartx.color] = null;
      super.created();
    }
    get [dartx.color]() {
      return this.color;
    }
    set [dartx.color](value) {
      this.color = value;
    }
  };
  dart.defineNamedConstructor(html$.HRElement, 'created');
  dart.setSignature(html$.HRElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HRElement, []),
      new: dart.definiteFunctionType(html$.HRElement, []),
      created: dart.definiteFunctionType(html$.HRElement, [])
    }),
    fields: () => ({[dartx.color]: core.String})
  });
  dart.registerExtension(dart.global.HTMLHRElement, html$.HRElement);
  const _initHashChangeEvent = Symbol('_initHashChangeEvent');
  dart.defineExtensionNames([
    'newUrl',
    'oldUrl'
  ]);
  html$.HashChangeEvent = class HashChangeEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let oldUrl = opts && 'oldUrl' in opts ? opts.oldUrl : null;
      let newUrl = opts && 'newUrl' in opts ? opts.newUrl : null;
      let options = dart.map({canBubble: canBubble, cancelable: cancelable, oldURL: oldUrl, newURL: newUrl}, core.String, core.Object);
      return new HashChangeEvent(type, html_common.convertDartToNative_Dictionary(options));
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.HashChangeEvent._create_1(type, eventInitDict_1);
      }
      return html$.HashChangeEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new HashChangeEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new HashChangeEvent(type);
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('HashChangeEvent');
    }
    get [dartx.newUrl]() {
      return this.newURL;
    }
    get [dartx.oldUrl]() {
      return this.oldURL;
    }
    [_initHashChangeEvent](...args) {
      return this.initHashChangeEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.HashChangeEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
      _: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.newUrl]: core.String,
      [dartx.oldUrl]: core.String
    }),
    methods: () => ({[_initHashChangeEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.HashChangeEvent, html$.HashChangeEvent);
  html$.HeadElement = class HeadElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HeadElement._check(html$.document[dartx.createElement]("head"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HeadElement, 'created');
  dart.setSignature(html$.HeadElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HeadElement, []),
      new: dart.definiteFunctionType(html$.HeadElement, []),
      created: dart.definiteFunctionType(html$.HeadElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLHeadElement, html$.HeadElement);
  html$.Headers = class Headers extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(input) {
      if (input === void 0) input = null;
      if (input == null) {
        return html$.Headers._create_1();
      }
      if (html$.Headers.is(input)) {
        return html$.Headers._create_2(input);
      }
      if (core.Map.is(input)) {
        let input_1 = html_common.convertDartToNative_Dictionary(input);
        return html$.Headers._create_3(input_1);
      }
      if (ListOfObject().is(input)) {
        return html$.Headers._create_4(input);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new Headers();
    }
    static _create_2(input) {
      return new Headers(input);
    }
    static _create_3(input) {
      return new Headers(input);
    }
    static _create_4(input) {
      return new Headers(input);
    }
  };
  dart.setSignature(html$.Headers, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Headers, []),
      new: dart.definiteFunctionType(html$.Headers, [], [dart.dynamic])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.Headers, []),
      _create_2: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.Headers, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4']
  });
  dart.registerExtension(dart.global.Headers, html$.Headers);
  html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static h1() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h1"));
    }
    static h2() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h2"));
    }
    static h3() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h3"));
    }
    static h4() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h4"));
    }
    static h5() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h5"));
    }
    static h6() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h6"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HeadingElement, 'created');
  dart.setSignature(html$.HeadingElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HeadingElement, []),
      h1: dart.definiteFunctionType(html$.HeadingElement, []),
      h2: dart.definiteFunctionType(html$.HeadingElement, []),
      h3: dart.definiteFunctionType(html$.HeadingElement, []),
      h4: dart.definiteFunctionType(html$.HeadingElement, []),
      h5: dart.definiteFunctionType(html$.HeadingElement, []),
      h6: dart.definiteFunctionType(html$.HeadingElement, []),
      created: dart.definiteFunctionType(html$.HeadingElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLHeadingElement, html$.HeadingElement);
  const _get_options = Symbol('_get_options');
  const _get_state = Symbol('_get_state');
  const _pushState_1 = Symbol('_pushState_1');
  const _pushState_2 = Symbol('_pushState_2');
  const _replaceState_1 = Symbol('_replaceState_1');
  const _replaceState_2 = Symbol('_replaceState_2');
  dart.defineExtensionNames([
    'options',
    'state',
    'back',
    'forward',
    'go',
    'pushState',
    'replaceState',
    'length'
  ]);
  html$.History = class History extends _interceptors.Interceptor {
    static get supportsState() {
      return !!window.history.pushState;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.options]() {
      return html_common.convertNativeToDart_Dictionary(this[_get_options]);
    }
    get [_get_options]() {
      return this.options;
    }
    get [dartx.state]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
    }
    get [_get_state]() {
      return this.state;
    }
    [dartx.back](...args) {
      return this.back.apply(this, args);
    }
    [dartx.forward](...args) {
      return this.forward.apply(this, args);
    }
    [dartx.go](...args) {
      return this.go.apply(this, args);
    }
    [dartx.pushState](data, title, url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
        let options_2 = html_common.convertDartToNative_Dictionary(options);
        this[_pushState_1](data_1, title, url, options_2);
        return;
      }
      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
      this[_pushState_2](data_1, title, url);
      return;
    }
    [_pushState_1](...args) {
      return this.pushState.apply(this, args);
    }
    [_pushState_2](...args) {
      return this.pushState.apply(this, args);
    }
    [dartx.replaceState](data, title, url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
        let options_2 = html_common.convertDartToNative_Dictionary(options);
        this[_replaceState_1](data_1, title, url, options_2);
        return;
      }
      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
      this[_replaceState_2](data_1, title, url);
      return;
    }
    [_replaceState_1](...args) {
      return this.replaceState.apply(this, args);
    }
    [_replaceState_2](...args) {
      return this.replaceState.apply(this, args);
    }
  };
  html$.History[dart.implements] = () => [html$.HistoryBase];
  dart.setSignature(html$.History, {
    constructors: () => ({_: dart.definiteFunctionType(html$.History, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [_get_options]: dart.dynamic,
      [_get_state]: dart.dynamic
    }),
    getters: () => ({
      [dartx.options]: dart.definiteFunctionType(core.Map, []),
      [dartx.state]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({
      [dartx.back]: dart.definiteFunctionType(dart.void, []),
      [dartx.forward]: dart.definiteFunctionType(dart.void, []),
      [dartx.go]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [dartx.pushState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
      [_pushState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_pushState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.replaceState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
      [_replaceState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_replaceState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    sgetters: () => ({supportsState: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.History, html$.History);
  dart.defineExtensionNames([
    'deviceId',
    'deviceName',
    'hardwareUnitId'
  ]);
  html$.VRDevice = class VRDevice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.deviceId]() {
      return this.deviceId;
    }
    get [dartx.deviceName]() {
      return this.deviceName;
    }
    get [dartx.hardwareUnitId]() {
      return this.hardwareUnitId;
    }
  };
  dart.setSignature(html$.VRDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VRDevice, [])}),
    fields: () => ({
      [dartx.deviceId]: core.String,
      [dartx.deviceName]: core.String,
      [dartx.hardwareUnitId]: core.String
    })
  });
  dart.registerExtension(dart.global.VRDevice, html$.VRDevice);
  dart.defineExtensionNames([
    'getEyeParameters',
    'setFieldOfView'
  ]);
  html$.HmdvrDevice = class HmdvrDevice extends html$.VRDevice {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getEyeParameters](...args) {
      return this.getEyeParameters.apply(this, args);
    }
    [dartx.setFieldOfView](...args) {
      return this.setFieldOfView.apply(this, args);
    }
  };
  dart.setSignature(html$.HmdvrDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HmdvrDevice, [])}),
    methods: () => ({
      [dartx.getEyeParameters]: dart.definiteFunctionType(html$.VREyeParameters, [core.String]),
      [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html$.VRFieldOfView, html$.VRFieldOfView])
    })
  });
  dart.registerExtension(dart.global.HMDVRDevice, html$.HmdvrDevice);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item',
    'namedItem'
  ]);
  html$.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  html$.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
  dart.setSignature(html$.HtmlCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlCollection, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Node, []),
      [dartx.last]: dart.definiteFunctionType(html$.Node, []),
      [dartx.single]: dart.definiteFunctionType(html$.Node, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(core.Object, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLCollection, html$.HtmlCollection);
  dart.defineExtensionNames([
    'caretRangeFromPoint',
    'elementFromPoint',
    'getCssCanvasContext',
    'head',
    'lastModified',
    'preferredStylesheetSet',
    'referrer',
    'selectedStylesheetSet',
    'selectedStylesheetSet',
    'styleSheets',
    'title',
    'title',
    'exitFullscreen',
    'registerElement',
    'register',
    'onVisibilityChange',
    'createElementUpgrader',
    'body'
  ]);
  html$.HtmlDocument = class HtmlDocument extends html$.Document {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.body]() {
      return this.body;
    }
    set [dartx.body](value) {
      this.body = value;
    }
    [dartx.caretRangeFromPoint](x, y) {
      return this[_caretRangeFromPoint](x, y);
    }
    [dartx.elementFromPoint](x, y) {
      return this[_elementFromPoint](x, y);
    }
    static get supportsCssCanvasContext() {
      return !!document.getCSSCanvasContext;
    }
    [dartx.getCssCanvasContext](contextId, name, width, height) {
      return html$.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
    }
    get [dartx.head]() {
      return this[_head$0];
    }
    get [dartx.lastModified]() {
      return this[_lastModified];
    }
    get [dartx.preferredStylesheetSet]() {
      return this[_preferredStylesheetSet];
    }
    get [dartx.referrer]() {
      return this[_referrer];
    }
    get [dartx.selectedStylesheetSet]() {
      return this[_selectedStylesheetSet];
    }
    set [dartx.selectedStylesheetSet](value) {
      this[_selectedStylesheetSet] = value;
    }
    get [dartx.styleSheets]() {
      return this[_styleSheets];
    }
    get [dartx.title]() {
      return this[_title];
    }
    set [dartx.title](value) {
      this[_title] = value;
    }
    [dartx.exitFullscreen]() {
      this[_webkitExitFullscreen]();
    }
    [dartx.registerElement](tag, customElementClass, opts) {
      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
      html$._registerCustomElement(window, this, tag, customElementClass, extendsTag);
    }
    [dartx.register](tag, customElementClass, opts) {
      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
      return this[dartx.registerElement](tag, customElementClass, {extendsTag: extendsTag});
    }
    static _determineVisibilityChangeEventType(e) {
      if (typeof e.hidden !== "undefined") {
        return 'visibilitychange';
      } else if (typeof e.mozHidden !== "undefined") {
        return 'mozvisibilitychange';
      } else if (typeof e.msHidden !== "undefined") {
        return 'msvisibilitychange';
      } else if (typeof e.webkitHidden !== "undefined") {
        return 'webkitvisibilitychange';
      }
      return 'visibilitychange';
    }
    get [dartx.onVisibilityChange]() {
      return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
    }
    [dartx.createElementUpgrader](type, opts) {
      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
      return new html$._JSElementUpgrader(this, type, extendsTag);
    }
  };
  dart.setSignature(html$.HtmlDocument, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlDocument, [])}),
    fields: () => ({[dartx.body]: html$.BodyElement}),
    getters: () => ({
      [dartx.head]: dart.definiteFunctionType(html$.HeadElement, []),
      [dartx.lastModified]: dart.definiteFunctionType(core.String, []),
      [dartx.preferredStylesheetSet]: dart.definiteFunctionType(core.String, []),
      [dartx.referrer]: dart.definiteFunctionType(core.String, []),
      [dartx.selectedStylesheetSet]: dart.definiteFunctionType(core.String, []),
      [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html$.StyleSheet), []),
      [dartx.title]: dart.definiteFunctionType(core.String, []),
      [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    setters: () => ({
      [dartx.selectedStylesheetSet]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.title]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    methods: () => ({
      [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
      [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
      [dartx.getCssCanvasContext]: dart.definiteFunctionType(html$.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
      [dartx.registerElement]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
      [dartx.register]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
      [dartx.createElementUpgrader]: dart.definiteFunctionType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
    }),
    sfields: () => ({visibilityChangeEvent: EventStreamProviderOfEvent()}),
    sgetters: () => ({supportsCssCanvasContext: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])}),
    names: ['_determineVisibilityChangeEventType']
  });
  dart.defineLazy(html$.HtmlDocument, {
    get visibilityChangeEvent() {
      return dart.const(new (_CustomEventStreamProviderOfEvent())(html$.HtmlDocument._determineVisibilityChangeEventType));
    }
  });
  dart.registerExtension(dart.global.HTMLDocument, html$.HtmlDocument);
  dart.defineExtensionNames([
    'item',
    'namedItem'
  ]);
  html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  dart.setSignature(html$.HtmlFormControlsCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlFormControlsCollection, [])})
  });
  dart.registerExtension(dart.global.HTMLFormControlsCollection, html$.HtmlFormControlsCollection);
  html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HtmlHtmlElement._check(html$.document[dartx.createElement]("html"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HtmlHtmlElement, 'created');
  dart.setSignature(html$.HtmlHtmlElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
      new: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
      created: dart.definiteFunctionType(html$.HtmlHtmlElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLHtmlElement, html$.HtmlHtmlElement);
  const _item = Symbol('_item');
  html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.HtmlOptionsCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlOptionsCollection, [])}),
    methods: () => ({[_item]: dart.definiteFunctionType(html$.Node, [core.int])})
  });
  dart.registerExtension(dart.global.HTMLOptionsCollection, html$.HtmlOptionsCollection);
  const _get_response = Symbol('_get_response');
  dart.defineExtensionNames([
    'onAbort',
    'onError',
    'onLoad',
    'onLoadEnd',
    'onLoadStart',
    'onProgress',
    'onTimeout'
  ]);
  html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.onAbort]() {
      return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
    }
    get [dartx.onLoadEnd]() {
      return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
    }
    get [dartx.onLoadStart]() {
      return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
    }
    get [dartx.onTimeout]() {
      return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.HttpRequestEventTarget, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestEventTarget, [])}),
    getters: () => ({
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfProgressEvent(),
      errorEvent: EventStreamProviderOfProgressEvent(),
      loadEvent: EventStreamProviderOfProgressEvent(),
      loadEndEvent: EventStreamProviderOfProgressEvent(),
      loadStartEvent: EventStreamProviderOfProgressEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      timeoutEvent: EventStreamProviderOfProgressEvent()
    })
  });
  dart.defineLazy(html$.HttpRequestEventTarget, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('error'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
    },
    get loadEndEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
    },
    get loadStartEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    },
    get timeoutEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('timeout'));
    }
  });
  dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html$.HttpRequestEventTarget);
  dart.defineExtensionNames([
    'responseHeaders',
    'open',
    'response',
    'abort',
    'getAllResponseHeaders',
    'getResponseHeader',
    'overrideMimeType',
    'send',
    'setRequestHeader',
    'onReadyStateChange',
    'readyState',
    'responseText',
    'responseType',
    'responseUrl',
    'responseXml',
    'status',
    'statusText',
    'timeout',
    'upload',
    'withCredentials'
  ]);
  html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
    static getString(url, opts) {
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
      return html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
    }
    static postFormData(url, data, opts) {
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
      let responseType = opts && 'responseType' in opts ? opts.responseType : null;
      let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
      let parts = [];
      data[dartx.forEach](dart.fn((key, value) => {
        parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
      }, StringAndStringTovoid$()));
      let formData = parts[dartx.join]('&');
      if (requestHeaders == null) {
        requestHeaders = dart.map({}, core.String, core.String);
      }
      requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString$()));
      return html$.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
    }
    static request(url, opts) {
      let method = opts && 'method' in opts ? opts.method : null;
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
      let responseType = opts && 'responseType' in opts ? opts.responseType : null;
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
      let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
      let sendData = opts && 'sendData' in opts ? opts.sendData : null;
      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
      let completer = CompleterOfHttpRequest().new();
      let xhr = html$.HttpRequest.new();
      if (method == null) {
        method = 'GET';
      }
      xhr[dartx.open](method, url, {async: true});
      if (withCredentials != null) {
        xhr[dartx.withCredentials] = withCredentials;
      }
      if (responseType != null) {
        xhr[dartx.responseType] = responseType;
      }
      if (mimeType != null) {
        xhr[dartx.overrideMimeType](mimeType);
      }
      if (requestHeaders != null) {
        requestHeaders[dartx.forEach](dart.fn((header, value) => {
          xhr[dartx.setRequestHeader](header, value);
        }, StringAndStringTovoid$()));
      }
      if (onProgress != null) {
        xhr[dartx.onProgress].listen(onProgress);
      }
      xhr[dartx.onLoad].listen(dart.fn(e => {
        let accepted = dart.notNull(xhr[dartx.status]) >= 200 && dart.notNull(xhr[dartx.status]) < 300;
        let fileUri = xhr[dartx.status] == 0;
        let notModified = xhr[dartx.status] == 304;
        let unknownRedirect = dart.notNull(xhr[dartx.status]) > 307 && dart.notNull(xhr[dartx.status]) < 400;
        if (accepted || fileUri || notModified || unknownRedirect) {
          completer.complete(xhr);
        } else {
          completer.completeError(e);
        }
      }, ProgressEventTovoid$()));
      xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
      if (sendData != null) {
        xhr[dartx.send](sendData);
      } else {
        xhr[dartx.send]();
      }
      return completer.future;
    }
    static get supportsProgressEvent() {
      let xhr = html$.HttpRequest.new();
      return "onprogress" in xhr;
    }
    static get supportsCrossOrigin() {
      let xhr = html$.HttpRequest.new();
      return "withCredentials" in xhr;
    }
    static get supportsLoadEndEvent() {
      let xhr = html$.HttpRequest.new();
      return "onloadend" in xhr;
    }
    static get supportsOverrideMimeType() {
      let xhr = html$.HttpRequest.new();
      return "overrideMimeType" in xhr;
    }
    static requestCrossOrigin(url, opts) {
      let method = opts && 'method' in opts ? opts.method : null;
      let sendData = opts && 'sendData' in opts ? opts.sendData : null;
      if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
        return html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
      }
      let completer = CompleterOfString().new();
      if (method == null) {
        method = 'GET';
      }
      let xhr = new XDomainRequest();
      xhr.open(method, url);
      xhr.onload = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
        let response = xhr.responseText;
        completer.complete(response);
      }, dynamicTodynamic$()), 1);
      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
        completer.completeError(e);
      }, dynamicTodynamic$()), 1);
      xhr.onprogress = {};
      xhr.ontimeout = {};
      xhr.timeout = Number.MAX_VALUE;
      if (sendData != null) {
        xhr.send(sendData);
      } else {
        xhr.send();
      }
      return completer.future;
    }
    get [dartx.responseHeaders]() {
      let headers = dart.map({}, core.String, core.String);
      let headersString = this[dartx.getAllResponseHeaders]();
      if (headersString == null) {
        return headers;
      }
      let headersList = headersString[dartx.split]('\r\n');
      for (let header of headersList) {
        if (dart.test(header[dartx.isEmpty])) {
          continue;
        }
        let splitIdx = header[dartx.indexOf](': ');
        if (splitIdx == -1) {
          continue;
        }
        let key = header[dartx.substring](0, splitIdx)[dartx.toLowerCase]();
        let value = header[dartx.substring](dart.notNull(splitIdx) + 2);
        if (dart.test(headers[dartx.containsKey](key))) {
          headers[dartx._set](key, dart.str`${headers[dartx._get](key)}, ${value}`);
        } else {
          headers[dartx._set](key, value);
        }
      }
      return headers;
    }
    [dartx.open](...args) {
      return this.open.apply(this, args);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HttpRequest._create_1();
    }
    static _create_1() {
      return new XMLHttpRequest();
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.response]() {
      return html$._convertNativeToDart_XHR_Response(this[_get_response]);
    }
    get [_get_response]() {
      return this.response;
    }
    get [dartx.responseText]() {
      return this.responseText;
    }
    get [dartx.responseType]() {
      return this.responseType;
    }
    set [dartx.responseType](value) {
      this.responseType = value;
    }
    get [dartx.responseUrl]() {
      return this.responseURL;
    }
    get [dartx.responseXml]() {
      return this.responseXML;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.statusText]() {
      return this.statusText;
    }
    get [dartx.timeout]() {
      return this.timeout;
    }
    set [dartx.timeout](value) {
      this.timeout = value;
    }
    get [dartx.upload]() {
      return this.upload;
    }
    get [dartx.withCredentials]() {
      return this.withCredentials;
    }
    set [dartx.withCredentials](value) {
      this.withCredentials = value;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.getAllResponseHeaders](...args) {
      return this.getAllResponseHeaders.apply(this, args);
    }
    [dartx.getResponseHeader](...args) {
      return this.getResponseHeader.apply(this, args);
    }
    [dartx.overrideMimeType](...args) {
      return this.overrideMimeType.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    [dartx.setRequestHeader](...args) {
      return this.setRequestHeader.apply(this, args);
    }
    get [dartx.onReadyStateChange]() {
      return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.HttpRequest, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HttpRequest, []),
      new: dart.definiteFunctionType(html$.HttpRequest, [])
    }),
    fields: () => ({
      [dartx.readyState]: core.int,
      [_get_response]: dart.dynamic,
      [dartx.responseText]: core.String,
      [dartx.responseType]: core.String,
      [dartx.responseUrl]: core.String,
      [dartx.responseXml]: html$.Document,
      [dartx.status]: core.int,
      [dartx.statusText]: core.String,
      [dartx.timeout]: core.int,
      [dartx.upload]: html$.HttpRequestUpload,
      [dartx.withCredentials]: core.bool
    }),
    getters: () => ({
      [dartx.responseHeaders]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      [dartx.response]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    methods: () => ({
      [dartx.open]: dart.definiteFunctionType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.getAllResponseHeaders]: dart.definiteFunctionType(core.String, []),
      [dartx.getResponseHeader]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.overrideMimeType]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.send]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
      [dartx.setRequestHeader]: dart.definiteFunctionType(dart.void, [core.String, core.String])
    }),
    sfields: () => ({
      readyStateChangeEvent: EventStreamProviderOfProgressEvent(),
      DONE: core.int,
      HEADERS_RECEIVED: core.int,
      LOADING: core.int,
      OPENED: core.int,
      UNSENT: core.int
    }),
    sgetters: () => ({
      supportsProgressEvent: dart.definiteFunctionType(core.bool, []),
      supportsCrossOrigin: dart.definiteFunctionType(core.bool, []),
      supportsLoadEndEvent: dart.definiteFunctionType(core.bool, []),
      supportsOverrideMimeType: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      getString: dart.definiteFunctionType(async.Future$(core.String), [core.String], {withCredentials: core.bool, onProgress: ProgressEventTovoid()}),
      postFormData: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
      request: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
      requestCrossOrigin: dart.definiteFunctionType(async.Future$(core.String), [core.String], {method: core.String, sendData: core.String}),
      _create_1: dart.definiteFunctionType(html$.HttpRequest, [])
    }),
    names: ['getString', 'postFormData', 'request', 'requestCrossOrigin', '_create_1']
  });
  html$.HttpRequest.DONE = 4;
  html$.HttpRequest.HEADERS_RECEIVED = 2;
  html$.HttpRequest.LOADING = 3;
  html$.HttpRequest.OPENED = 1;
  html$.HttpRequest.UNSENT = 0;
  dart.defineLazy(html$.HttpRequest, {
    get readyStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('readystatechange'));
    }
  });
  dart.registerExtension(dart.global.XMLHttpRequest, html$.HttpRequest);
  html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.HttpRequestUpload, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestUpload, [])})
  });
  dart.registerExtension(dart.global.XMLHttpRequestUpload, html$.HttpRequestUpload);
  const _get_contentWindow = Symbol('_get_contentWindow');
  dart.defineExtensionNames([
    'contentWindow',
    'allowFullscreen',
    'height',
    'name',
    'sandbox',
    'src',
    'srcdoc',
    'width'
  ]);
  html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.IFrameElement._check(html$.document[dartx.createElement]("iframe"));
    }
    created() {
      this[dartx.allowFullscreen] = null;
      this[_get_contentWindow] = null;
      this[dartx.height] = null;
      this[dartx.name] = null;
      this[dartx.sandbox] = null;
      this[dartx.src] = null;
      this[dartx.srcdoc] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.allowFullscreen]() {
      return this.allowFullscreen;
    }
    set [dartx.allowFullscreen](value) {
      this.allowFullscreen = value;
    }
    get [dartx.contentWindow]() {
      return html$._convertNativeToDart_Window(this[_get_contentWindow]);
    }
    get [_get_contentWindow]() {
      return this.contentWindow;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.sandbox]() {
      return this.sandbox;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srcdoc]() {
      return this.srcdoc;
    }
    set [dartx.srcdoc](value) {
      this.srcdoc = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
  };
  dart.defineNamedConstructor(html$.IFrameElement, 'created');
  dart.setSignature(html$.IFrameElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.IFrameElement, []),
      new: dart.definiteFunctionType(html$.IFrameElement, []),
      created: dart.definiteFunctionType(html$.IFrameElement, [])
    }),
    fields: () => ({
      [dartx.allowFullscreen]: core.bool,
      [_get_contentWindow]: dart.dynamic,
      [dartx.height]: core.String,
      [dartx.name]: core.String,
      [dartx.sandbox]: html$.DomSettableTokenList,
      [dartx.src]: core.String,
      [dartx.srcdoc]: core.String,
      [dartx.width]: core.String
    }),
    getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html$.WindowBase, [])})
  });
  dart.registerExtension(dart.global.HTMLIFrameElement, html$.IFrameElement);
  dart.defineExtensionNames([
    'height',
    'width'
  ]);
  html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.ImageBitmap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ImageBitmap, [])}),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.width]: core.int
    })
  });
  dart.registerExtension(dart.global.ImageBitmap, html$.ImageBitmap);
  dart.defineExtensionNames([
    'data',
    'height',
    'width'
  ]);
  html$.ImageData = class ImageData extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(data_OR_sw, sh_OR_sw, sh) {
      if (sh === void 0) sh = null;
      if (typeof sh_OR_sw == 'number' && typeof data_OR_sw == 'number' && sh == null) {
        return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
      }
      if (typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
        return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
      }
      if (typeof sh == 'number' && typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw)) {
        return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1(data_OR_sw, sh_OR_sw) {
      return new ImageData(data_OR_sw, sh_OR_sw);
    }
    static _create_2(data_OR_sw, sh_OR_sw) {
      return new ImageData(data_OR_sw, sh_OR_sw);
    }
    static _create_3(data_OR_sw, sh_OR_sw, sh) {
      return new ImageData(data_OR_sw, sh_OR_sw, sh);
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.ImageData, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ImageData, []),
      new: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, core.int], [core.int])
    }),
    fields: () => ({
      [dartx.data]: typed_data.Uint8ClampedList,
      [dartx.height]: core.int,
      [dartx.width]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.ImageData, html$.ImageData);
  dart.defineExtensionNames([
    'alt',
    'complete',
    'crossOrigin',
    'currentSrc',
    'height',
    'isMap',
    'naturalHeight',
    'naturalWidth',
    'sizes',
    'src',
    'srcset',
    'useMap',
    'width'
  ]);
  html$.ImageElement = class ImageElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(opts) {
      let src = opts && 'src' in opts ? opts.src : null;
      let width = opts && 'width' in opts ? opts.width : null;
      let height = opts && 'height' in opts ? opts.height : null;
      let e = html$.ImageElement._check(html$.document[dartx.createElement]("img"));
      if (src != null) e[dartx.src] = src;
      if (width != null) e[dartx.width] = width;
      if (height != null) e[dartx.height] = height;
      return e;
    }
    created() {
      this[dartx.alt] = null;
      this[dartx.complete] = null;
      this[dartx.crossOrigin] = null;
      this[dartx.currentSrc] = null;
      this[dartx.height] = null;
      this[dartx.isMap] = null;
      this[dartx.naturalHeight] = null;
      this[dartx.naturalWidth] = null;
      this[dartx.sizes] = null;
      this[dartx.src] = null;
      this[dartx.srcset] = null;
      this[dartx.useMap] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.alt]() {
      return this.alt;
    }
    set [dartx.alt](value) {
      this.alt = value;
    }
    get [dartx.complete]() {
      return this.complete;
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.currentSrc]() {
      return this.currentSrc;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.isMap]() {
      return this.isMap;
    }
    set [dartx.isMap](value) {
      this.isMap = value;
    }
    get [dartx.naturalHeight]() {
      return this.naturalHeight;
    }
    get [dartx.naturalWidth]() {
      return this.naturalWidth;
    }
    get [dartx.sizes]() {
      return this.sizes;
    }
    set [dartx.sizes](value) {
      this.sizes = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srcset]() {
      return this.srcset;
    }
    set [dartx.srcset](value) {
      this.srcset = value;
    }
    get [dartx.useMap]() {
      return this.useMap;
    }
    set [dartx.useMap](value) {
      this.useMap = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
  };
  dart.defineNamedConstructor(html$.ImageElement, 'created');
  html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
  dart.setSignature(html$.ImageElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ImageElement, []),
      new: dart.definiteFunctionType(html$.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
      created: dart.definiteFunctionType(html$.ImageElement, [])
    }),
    fields: () => ({
      [dartx.alt]: core.String,
      [dartx.complete]: core.bool,
      [dartx.crossOrigin]: core.String,
      [dartx.currentSrc]: core.String,
      [dartx.height]: core.int,
      [dartx.isMap]: core.bool,
      [dartx.naturalHeight]: core.int,
      [dartx.naturalWidth]: core.int,
      [dartx.sizes]: core.String,
      [dartx.src]: core.String,
      [dartx.srcset]: core.String,
      [dartx.useMap]: core.String,
      [dartx.width]: core.int
    })
  });
  dart.registerExtension(dart.global.HTMLImageElement, html$.ImageElement);
  dart.defineExtensionNames([
    'inspect'
  ]);
  html$.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.inspect](...args) {
      return this.inspect.apply(this, args);
    }
  };
  dart.setSignature(html$.InjectedScriptHost, {
    constructors: () => ({_: dart.definiteFunctionType(html$.InjectedScriptHost, [])}),
    methods: () => ({[dartx.inspect]: dart.definiteFunctionType(dart.void, [core.Object, core.Object])})
  });
  dart.registerExtension(dart.global.InjectedScriptHost, html$.InjectedScriptHost);
  dart.defineExtensionNames([
    'firesTouchEvents'
  ]);
  html$.InputDevice = class InputDevice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(deviceInitDict) {
      if (deviceInitDict === void 0) deviceInitDict = null;
      if (deviceInitDict != null) {
        let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
        return html$.InputDevice._create_1(deviceInitDict_1);
      }
      return html$.InputDevice._create_2();
    }
    static _create_1(deviceInitDict) {
      return new InputDevice(deviceInitDict);
    }
    static _create_2() {
      return new InputDevice();
    }
    get [dartx.firesTouchEvents]() {
      return this.firesTouchEvents;
    }
  };
  dart.setSignature(html$.InputDevice, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.InputDevice, []),
      new: dart.definiteFunctionType(html$.InputDevice, [], [core.Map])
    }),
    fields: () => ({[dartx.firesTouchEvents]: core.bool}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.InputDevice, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.InputDevice, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.InputDevice, html$.InputDevice);
  const _get_valueAsDate = Symbol('_get_valueAsDate');
  const _set_valueAsDate = Symbol('_set_valueAsDate');
  dart.defineExtensionNames([
    'valueAsDate',
    'valueAsDate',
    'checkValidity',
    'reportValidity',
    'select',
    'setCustomValidity',
    'setRangeText',
    'setSelectionRange',
    'stepDown',
    'stepUp',
    'accept',
    'alt',
    'autocapitalize',
    'autocomplete',
    'autofocus',
    'capture',
    'checked',
    'defaultChecked',
    'defaultValue',
    'dirName',
    'disabled',
    'files',
    'form',
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget',
    'height',
    'incremental',
    'indeterminate',
    'inputMode',
    'labels',
    'list',
    'max',
    'maxLength',
    'min',
    'minLength',
    'multiple',
    'name',
    'pattern',
    'placeholder',
    'readOnly',
    'required',
    'selectionDirection',
    'selectionEnd',
    'selectionStart',
    'size',
    'src',
    'step',
    'type',
    'validationMessage',
    'validity',
    'value',
    'valueAsNumber',
    'entries',
    'directory',
    'width',
    'willValidate'
  ]);
  html$.InputElement = class InputElement extends html$.HtmlElement {
    static new(opts) {
      let type = opts && 'type' in opts ? opts.type : null;
      let e = html$.InputElement._check(html$.document[dartx.createElement]("input"));
      if (type != null) {
        try {
          e[dartx.type] = type;
        } catch (_) {
        }

      }
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.accept] = null;
      this[dartx.alt] = null;
      this[dartx.autocapitalize] = null;
      this[dartx.autocomplete] = null;
      this[dartx.autofocus] = null;
      this[dartx.capture] = null;
      this[dartx.checked] = null;
      this[dartx.defaultChecked] = null;
      this[dartx.defaultValue] = null;
      this[dartx.dirName] = null;
      this[dartx.disabled] = null;
      this[dartx.files] = null;
      this[dartx.form] = null;
      this[dartx.formAction] = null;
      this[dartx.formEnctype] = null;
      this[dartx.formMethod] = null;
      this[dartx.formNoValidate] = null;
      this[dartx.formTarget] = null;
      this[dartx.height] = null;
      this[dartx.incremental] = null;
      this[dartx.indeterminate] = null;
      this[dartx.inputMode] = null;
      this[dartx.labels] = null;
      this[dartx.list] = null;
      this[dartx.max] = null;
      this[dartx.maxLength] = null;
      this[dartx.min] = null;
      this[dartx.minLength] = null;
      this[dartx.multiple] = null;
      this[dartx.name] = null;
      this[dartx.pattern] = null;
      this[dartx.placeholder] = null;
      this[dartx.readOnly] = null;
      this[dartx.required] = null;
      this[dartx.selectionDirection] = null;
      this[dartx.selectionEnd] = null;
      this[dartx.selectionStart] = null;
      this[dartx.size] = null;
      this[dartx.src] = null;
      this[dartx.step] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[_get_valueAsDate] = null;
      this[dartx.valueAsNumber] = null;
      this[dartx.entries] = null;
      this[dartx.directory] = null;
      this[dartx.width] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.accept]() {
      return this.accept;
    }
    set [dartx.accept](value) {
      this.accept = value;
    }
    get [dartx.alt]() {
      return this.alt;
    }
    set [dartx.alt](value) {
      this.alt = value;
    }
    get [dartx.autocapitalize]() {
      return this.autocapitalize;
    }
    set [dartx.autocapitalize](value) {
      this.autocapitalize = value;
    }
    get [dartx.autocomplete]() {
      return this.autocomplete;
    }
    set [dartx.autocomplete](value) {
      this.autocomplete = value;
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.capture]() {
      return this.capture;
    }
    set [dartx.capture](value) {
      this.capture = value;
    }
    get [dartx.checked]() {
      return this.checked;
    }
    set [dartx.checked](value) {
      this.checked = value;
    }
    get [dartx.defaultChecked]() {
      return this.defaultChecked;
    }
    set [dartx.defaultChecked](value) {
      this.defaultChecked = value;
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    set [dartx.defaultValue](value) {
      this.defaultValue = value;
    }
    get [dartx.dirName]() {
      return this.dirName;
    }
    set [dartx.dirName](value) {
      this.dirName = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.files]() {
      return this.files;
    }
    set [dartx.files](value) {
      this.files = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.formAction]() {
      return this.formAction;
    }
    set [dartx.formAction](value) {
      this.formAction = value;
    }
    get [dartx.formEnctype]() {
      return this.formEnctype;
    }
    set [dartx.formEnctype](value) {
      this.formEnctype = value;
    }
    get [dartx.formMethod]() {
      return this.formMethod;
    }
    set [dartx.formMethod](value) {
      this.formMethod = value;
    }
    get [dartx.formNoValidate]() {
      return this.formNoValidate;
    }
    set [dartx.formNoValidate](value) {
      this.formNoValidate = value;
    }
    get [dartx.formTarget]() {
      return this.formTarget;
    }
    set [dartx.formTarget](value) {
      this.formTarget = value;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.incremental]() {
      return this.incremental;
    }
    set [dartx.incremental](value) {
      this.incremental = value;
    }
    get [dartx.indeterminate]() {
      return this.indeterminate;
    }
    set [dartx.indeterminate](value) {
      this.indeterminate = value;
    }
    get [dartx.inputMode]() {
      return this.inputMode;
    }
    set [dartx.inputMode](value) {
      this.inputMode = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.list]() {
      return this.list;
    }
    get [dartx.max]() {
      return this.max;
    }
    set [dartx.max](value) {
      this.max = value;
    }
    get [dartx.maxLength]() {
      return this.maxLength;
    }
    set [dartx.maxLength](value) {
      this.maxLength = value;
    }
    get [dartx.min]() {
      return this.min;
    }
    set [dartx.min](value) {
      this.min = value;
    }
    get [dartx.minLength]() {
      return this.minLength;
    }
    set [dartx.minLength](value) {
      this.minLength = value;
    }
    get [dartx.multiple]() {
      return this.multiple;
    }
    set [dartx.multiple](value) {
      this.multiple = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.pattern]() {
      return this.pattern;
    }
    set [dartx.pattern](value) {
      this.pattern = value;
    }
    get [dartx.placeholder]() {
      return this.placeholder;
    }
    set [dartx.placeholder](value) {
      this.placeholder = value;
    }
    get [dartx.readOnly]() {
      return this.readOnly;
    }
    set [dartx.readOnly](value) {
      this.readOnly = value;
    }
    get [dartx.required]() {
      return this.required;
    }
    set [dartx.required](value) {
      this.required = value;
    }
    get [dartx.selectionDirection]() {
      return this.selectionDirection;
    }
    set [dartx.selectionDirection](value) {
      this.selectionDirection = value;
    }
    get [dartx.selectionEnd]() {
      return this.selectionEnd;
    }
    set [dartx.selectionEnd](value) {
      this.selectionEnd = value;
    }
    get [dartx.selectionStart]() {
      return this.selectionStart;
    }
    set [dartx.selectionStart](value) {
      this.selectionStart = value;
    }
    get [dartx.size]() {
      return this.size;
    }
    set [dartx.size](value) {
      this.size = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.step]() {
      return this.step;
    }
    set [dartx.step](value) {
      this.step = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.valueAsDate]() {
      return html_common.convertNativeToDart_DateTime(this[_get_valueAsDate]);
    }
    get [_get_valueAsDate]() {
      return this.valueAsDate;
    }
    set [dartx.valueAsDate](value) {
      this[_set_valueAsDate] = html_common.convertDartToNative_DateTime(value);
    }
    set [_set_valueAsDate](value) {
      this.valueAsDate = value;
    }
    get [dartx.valueAsNumber]() {
      return this.valueAsNumber;
    }
    set [dartx.valueAsNumber](value) {
      this.valueAsNumber = value;
    }
    get [dartx.entries]() {
      return this.webkitEntries;
    }
    get [dartx.directory]() {
      return this.webkitdirectory;
    }
    set [dartx.directory](value) {
      this.webkitdirectory = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.select](...args) {
      return this.select.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
    [dartx.setRangeText](...args) {
      return this.setRangeText.apply(this, args);
    }
    [dartx.setSelectionRange](...args) {
      return this.setSelectionRange.apply(this, args);
    }
    [dartx.stepDown](...args) {
      return this.stepDown.apply(this, args);
    }
    [dartx.stepUp](...args) {
      return this.stepUp.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.InputElement, 'created');
  html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
  dart.setSignature(html$.InputElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.InputElement, [], {type: core.String}),
      _: dart.definiteFunctionType(html$.InputElement, []),
      created: dart.definiteFunctionType(html$.InputElement, [])
    }),
    fields: () => ({
      [dartx.accept]: core.String,
      [dartx.alt]: core.String,
      [dartx.autocapitalize]: core.String,
      [dartx.autocomplete]: core.String,
      [dartx.autofocus]: core.bool,
      [dartx.capture]: core.bool,
      [dartx.checked]: core.bool,
      [dartx.defaultChecked]: core.bool,
      [dartx.defaultValue]: core.String,
      [dartx.dirName]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.files]: ListOfFile(),
      [dartx.form]: html$.FormElement,
      [dartx.formAction]: core.String,
      [dartx.formEnctype]: core.String,
      [dartx.formMethod]: core.String,
      [dartx.formNoValidate]: core.bool,
      [dartx.formTarget]: core.String,
      [dartx.height]: core.int,
      [dartx.incremental]: core.bool,
      [dartx.indeterminate]: core.bool,
      [dartx.inputMode]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.list]: html$.HtmlElement,
      [dartx.max]: core.String,
      [dartx.maxLength]: core.int,
      [dartx.min]: core.String,
      [dartx.minLength]: core.int,
      [dartx.multiple]: core.bool,
      [dartx.name]: core.String,
      [dartx.pattern]: core.String,
      [dartx.placeholder]: core.String,
      [dartx.readOnly]: core.bool,
      [dartx.required]: core.bool,
      [dartx.selectionDirection]: core.String,
      [dartx.selectionEnd]: core.int,
      [dartx.selectionStart]: core.int,
      [dartx.size]: core.int,
      [dartx.src]: core.String,
      [dartx.step]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [_get_valueAsDate]: dart.dynamic,
      [dartx.valueAsNumber]: core.num,
      [dartx.entries]: ListOfEntry(),
      [dartx.directory]: core.bool,
      [dartx.width]: core.int,
      [dartx.willValidate]: core.bool
    }),
    getters: () => ({[dartx.valueAsDate]: dart.definiteFunctionType(core.DateTime, [])}),
    setters: () => ({
      [dartx.valueAsDate]: dart.definiteFunctionType(dart.void, [core.DateTime]),
      [_set_valueAsDate]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.select]: dart.definiteFunctionType(dart.void, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
      [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String]),
      [dartx.stepDown]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [dartx.stepUp]: dart.definiteFunctionType(dart.void, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLInputElement, html$.InputElement);
  dart.defineExtensionNames([
    'autofocus',
    'disabled',
    'incremental',
    'indeterminate',
    'name',
    'value'
  ]);
  html$.InputElementBase = class InputElementBase extends core.Object {
    new() {
      this[autofocus] = null;
      this[disabled] = null;
      this[incremental] = null;
      this[indeterminate] = null;
      this[name] = null;
      this[value$] = null;
    }
    get autofocus() {
      return this[autofocus];
    }
    set autofocus(value) {
      this[autofocus] = value;
    }
    get disabled() {
      return this[disabled];
    }
    set disabled(value) {
      this[disabled] = value;
    }
    get incremental() {
      return this[incremental];
    }
    set incremental(value) {
      this[incremental] = value;
    }
    get indeterminate() {
      return this[indeterminate];
    }
    set indeterminate(value) {
      this[indeterminate] = value;
    }
    get name() {
      return this[name];
    }
    set name(value) {
      this[name] = value;
    }
    get value() {
      return this[value$];
    }
    set value(value) {
      this[value$] = value;
    }
  };
  const autofocus = Symbol(html$.InputElementBase.name + "." + 'autofocus'.toString());
  const disabled = Symbol(html$.InputElementBase.name + "." + 'disabled'.toString());
  const incremental = Symbol(html$.InputElementBase.name + "." + 'incremental'.toString());
  const indeterminate = Symbol(html$.InputElementBase.name + "." + 'indeterminate'.toString());
  const name = Symbol(html$.InputElementBase.name + "." + 'name'.toString());
  const value$ = Symbol(html$.InputElementBase.name + "." + 'value'.toString());
  html$.InputElementBase[dart.implements] = () => [html$.Element];
  dart.setSignature(html$.InputElementBase, {
    fields: () => ({
      autofocus: core.bool,
      disabled: core.bool,
      incremental: core.bool,
      indeterminate: core.bool,
      name: core.String,
      value: core.String
    })
  });
  dart.defineExtensionMembers(html$.InputElementBase, [
    'autofocus',
    'autofocus',
    'disabled',
    'disabled',
    'incremental',
    'incremental',
    'indeterminate',
    'indeterminate',
    'name',
    'name',
    'value',
    'value'
  ]);
  html$.HiddenInputElement = class HiddenInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'hidden'});
    }
  };
  html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.HiddenInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.HiddenInputElement, [])})
  });
  dart.defineExtensionNames([
    'autocomplete',
    'maxLength',
    'pattern',
    'placeholder',
    'readOnly',
    'required',
    'size',
    'selectionDirection',
    'selectionEnd',
    'selectionStart'
  ]);
  html$.TextInputElementBase = class TextInputElementBase extends core.Object {
    new() {
      this[autocomplete] = null;
      this[maxLength] = null;
      this[pattern] = null;
      this[placeholder] = null;
      this[readOnly] = null;
      this[required] = null;
      this[size] = null;
      this[selectionDirection] = null;
      this[selectionEnd] = null;
      this[selectionStart] = null;
    }
    get autocomplete() {
      return this[autocomplete];
    }
    set autocomplete(value) {
      this[autocomplete] = value;
    }
    get maxLength() {
      return this[maxLength];
    }
    set maxLength(value) {
      this[maxLength] = value;
    }
    get pattern() {
      return this[pattern];
    }
    set pattern(value) {
      this[pattern] = value;
    }
    get placeholder() {
      return this[placeholder];
    }
    set placeholder(value) {
      this[placeholder] = value;
    }
    get readOnly() {
      return this[readOnly];
    }
    set readOnly(value) {
      this[readOnly] = value;
    }
    get required() {
      return this[required];
    }
    set required(value) {
      this[required] = value;
    }
    get size() {
      return this[size];
    }
    set size(value) {
      this[size] = value;
    }
    get selectionDirection() {
      return this[selectionDirection];
    }
    set selectionDirection(value) {
      this[selectionDirection] = value;
    }
    get selectionEnd() {
      return this[selectionEnd];
    }
    set selectionEnd(value) {
      this[selectionEnd] = value;
    }
    get selectionStart() {
      return this[selectionStart];
    }
    set selectionStart(value) {
      this[selectionStart] = value;
    }
  };
  const autocomplete = Symbol(html$.TextInputElementBase.name + "." + 'autocomplete'.toString());
  const maxLength = Symbol(html$.TextInputElementBase.name + "." + 'maxLength'.toString());
  const pattern = Symbol(html$.TextInputElementBase.name + "." + 'pattern'.toString());
  const placeholder = Symbol(html$.TextInputElementBase.name + "." + 'placeholder'.toString());
  const readOnly = Symbol(html$.TextInputElementBase.name + "." + 'readOnly'.toString());
  const required = Symbol(html$.TextInputElementBase.name + "." + 'required'.toString());
  const size = Symbol(html$.TextInputElementBase.name + "." + 'size'.toString());
  const selectionDirection = Symbol(html$.TextInputElementBase.name + "." + 'selectionDirection'.toString());
  const selectionEnd = Symbol(html$.TextInputElementBase.name + "." + 'selectionEnd'.toString());
  const selectionStart = Symbol(html$.TextInputElementBase.name + "." + 'selectionStart'.toString());
  html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.TextInputElementBase, {
    fields: () => ({
      autocomplete: core.String,
      maxLength: core.int,
      pattern: core.String,
      placeholder: core.String,
      readOnly: core.bool,
      required: core.bool,
      size: core.int,
      selectionDirection: core.String,
      selectionEnd: core.int,
      selectionStart: core.int
    })
  });
  dart.defineExtensionMembers(html$.TextInputElementBase, [
    'autocomplete',
    'autocomplete',
    'maxLength',
    'maxLength',
    'pattern',
    'pattern',
    'placeholder',
    'placeholder',
    'readOnly',
    'readOnly',
    'required',
    'required',
    'size',
    'size',
    'selectionDirection',
    'selectionDirection',
    'selectionEnd',
    'selectionEnd',
    'selectionStart',
    'selectionStart'
  ]);
  dart.defineExtensionNames([
    'dirName'
  ]);
  html$.SearchInputElement = class SearchInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'search'});
    }
    get dirName() {
      return this[dirName];
    }
    set dirName(value) {
      this[dirName] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'search'})[dartx.type] == 'search';
    }
  };
  const dirName = Symbol(html$.SearchInputElement.name + "." + 'dirName'.toString());
  html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.SearchInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.SearchInputElement, [])}),
    fields: () => ({dirName: core.String}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.SearchInputElement, ['dirName', 'dirName']);
  dart.defineExtensionNames([
    'dirName'
  ]);
  html$.TextInputElement = class TextInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'text'});
    }
    get dirName() {
      return this[dirName$];
    }
    set dirName(value) {
      this[dirName$] = value;
    }
  };
  const dirName$ = Symbol(html$.TextInputElement.name + "." + 'dirName'.toString());
  html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.TextInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.TextInputElement, [])}),
    fields: () => ({dirName: core.String})
  });
  dart.defineExtensionMembers(html$.TextInputElement, ['dirName', 'dirName']);
  html$.UrlInputElement = class UrlInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'url'});
    }
    static get supported() {
      return html$.InputElement.new({type: 'url'})[dartx.type] == 'url';
    }
  };
  html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.UrlInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.UrlInputElement, [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'tel'});
    }
    static get supported() {
      return html$.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
    }
  };
  html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.TelephoneInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.TelephoneInputElement, [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionNames([
    'autocomplete',
    'autofocus',
    'maxLength',
    'multiple',
    'pattern',
    'placeholder',
    'readOnly',
    'required',
    'size'
  ]);
  html$.EmailInputElement = class EmailInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'email'});
    }
    get autocomplete() {
      return this[autocomplete$];
    }
    set autocomplete(value) {
      this[autocomplete$] = value;
    }
    get autofocus() {
      return this[autofocus$];
    }
    set autofocus(value) {
      this[autofocus$] = value;
    }
    get maxLength() {
      return this[maxLength$];
    }
    set maxLength(value) {
      this[maxLength$] = value;
    }
    get multiple() {
      return this[multiple];
    }
    set multiple(value) {
      this[multiple] = value;
    }
    get pattern() {
      return this[pattern$];
    }
    set pattern(value) {
      this[pattern$] = value;
    }
    get placeholder() {
      return this[placeholder$];
    }
    set placeholder(value) {
      this[placeholder$] = value;
    }
    get readOnly() {
      return this[readOnly$];
    }
    set readOnly(value) {
      this[readOnly$] = value;
    }
    get required() {
      return this[required$];
    }
    set required(value) {
      this[required$] = value;
    }
    get size() {
      return this[size$];
    }
    set size(value) {
      this[size$] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'email'})[dartx.type] == 'email';
    }
  };
  const autocomplete$ = Symbol(html$.EmailInputElement.name + "." + 'autocomplete'.toString());
  const autofocus$ = Symbol(html$.EmailInputElement.name + "." + 'autofocus'.toString());
  const maxLength$ = Symbol(html$.EmailInputElement.name + "." + 'maxLength'.toString());
  const multiple = Symbol(html$.EmailInputElement.name + "." + 'multiple'.toString());
  const pattern$ = Symbol(html$.EmailInputElement.name + "." + 'pattern'.toString());
  const placeholder$ = Symbol(html$.EmailInputElement.name + "." + 'placeholder'.toString());
  const readOnly$ = Symbol(html$.EmailInputElement.name + "." + 'readOnly'.toString());
  const required$ = Symbol(html$.EmailInputElement.name + "." + 'required'.toString());
  const size$ = Symbol(html$.EmailInputElement.name + "." + 'size'.toString());
  html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.EmailInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.EmailInputElement, [])}),
    fields: () => ({
      autocomplete: core.String,
      autofocus: core.bool,
      maxLength: core.int,
      multiple: core.bool,
      pattern: core.String,
      placeholder: core.String,
      readOnly: core.bool,
      required: core.bool,
      size: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.EmailInputElement, [
    'autocomplete',
    'autocomplete',
    'autofocus',
    'autofocus',
    'maxLength',
    'maxLength',
    'multiple',
    'multiple',
    'pattern',
    'pattern',
    'placeholder',
    'placeholder',
    'readOnly',
    'readOnly',
    'required',
    'required',
    'size',
    'size'
  ]);
  html$.PasswordInputElement = class PasswordInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'password'});
    }
  };
  html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.PasswordInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.PasswordInputElement, [])})
  });
  dart.defineExtensionNames([
    'max',
    'min',
    'step',
    'valueAsNumber'
  ]);
  html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
    new() {
      this[max] = null;
      this[min] = null;
      this[step] = null;
      this[valueAsNumber] = null;
    }
    get max() {
      return this[max];
    }
    set max(value) {
      this[max] = value;
    }
    get min() {
      return this[min];
    }
    set min(value) {
      this[min] = value;
    }
    get step() {
      return this[step];
    }
    set step(value) {
      this[step] = value;
    }
    get valueAsNumber() {
      return this[valueAsNumber];
    }
    set valueAsNumber(value) {
      this[valueAsNumber] = value;
    }
  };
  const max = Symbol(html$.RangeInputElementBase.name + "." + 'max'.toString());
  const min = Symbol(html$.RangeInputElementBase.name + "." + 'min'.toString());
  const step = Symbol(html$.RangeInputElementBase.name + "." + 'step'.toString());
  const valueAsNumber = Symbol(html$.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
  html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.RangeInputElementBase, {
    fields: () => ({
      max: core.String,
      min: core.String,
      step: core.String,
      valueAsNumber: core.num
    })
  });
  dart.defineExtensionMembers(html$.RangeInputElementBase, [
    'max',
    'max',
    'min',
    'min',
    'step',
    'step',
    'valueAsNumber',
    'valueAsNumber'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.DateInputElement = class DateInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'date'});
    }
    get valueAsDate() {
      return this[valueAsDate];
    }
    set valueAsDate(value) {
      this[valueAsDate] = value;
    }
    get readOnly() {
      return this[readOnly$0];
    }
    set readOnly(value) {
      this[readOnly$0] = value;
    }
    get required() {
      return this[required$0];
    }
    set required(value) {
      this[required$0] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'date'})[dartx.type] == 'date';
    }
  };
  const valueAsDate = Symbol(html$.DateInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$0 = Symbol(html$.DateInputElement.name + "." + 'readOnly'.toString());
  const required$0 = Symbol(html$.DateInputElement.name + "." + 'required'.toString());
  html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.DateInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.DateInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.DateInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.MonthInputElement = class MonthInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'month'});
    }
    get valueAsDate() {
      return this[valueAsDate$];
    }
    set valueAsDate(value) {
      this[valueAsDate$] = value;
    }
    get readOnly() {
      return this[readOnly$1];
    }
    set readOnly(value) {
      this[readOnly$1] = value;
    }
    get required() {
      return this[required$1];
    }
    set required(value) {
      this[required$1] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'month'})[dartx.type] == 'month';
    }
  };
  const valueAsDate$ = Symbol(html$.MonthInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$1 = Symbol(html$.MonthInputElement.name + "." + 'readOnly'.toString());
  const required$1 = Symbol(html$.MonthInputElement.name + "." + 'required'.toString());
  html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.MonthInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.MonthInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.MonthInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.WeekInputElement = class WeekInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'week'});
    }
    get valueAsDate() {
      return this[valueAsDate$0];
    }
    set valueAsDate(value) {
      this[valueAsDate$0] = value;
    }
    get readOnly() {
      return this[readOnly$2];
    }
    set readOnly(value) {
      this[readOnly$2] = value;
    }
    get required() {
      return this[required$2];
    }
    set required(value) {
      this[required$2] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'week'})[dartx.type] == 'week';
    }
  };
  const valueAsDate$0 = Symbol(html$.WeekInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$2 = Symbol(html$.WeekInputElement.name + "." + 'readOnly'.toString());
  const required$2 = Symbol(html$.WeekInputElement.name + "." + 'required'.toString());
  html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.WeekInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.WeekInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.WeekInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.TimeInputElement = class TimeInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'time'});
    }
    get valueAsDate() {
      return this[valueAsDate$1];
    }
    set valueAsDate(value) {
      this[valueAsDate$1] = value;
    }
    get readOnly() {
      return this[readOnly$3];
    }
    set readOnly(value) {
      this[readOnly$3] = value;
    }
    get required() {
      return this[required$3];
    }
    set required(value) {
      this[required$3] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'time'})[dartx.type] == 'time';
    }
  };
  const valueAsDate$1 = Symbol(html$.TimeInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$3 = Symbol(html$.TimeInputElement.name + "." + 'readOnly'.toString());
  const required$3 = Symbol(html$.TimeInputElement.name + "." + 'required'.toString());
  html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.TimeInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.TimeInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.TimeInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'readOnly',
    'required'
  ]);
  html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'datetime-local'});
    }
    get readOnly() {
      return this[readOnly$4];
    }
    set readOnly(value) {
      this[readOnly$4] = value;
    }
    get required() {
      return this[required$4];
    }
    set required(value) {
      this[required$4] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
    }
  };
  const readOnly$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
  const required$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'required'.toString());
  html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.LocalDateTimeInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.LocalDateTimeInputElement, [])}),
    fields: () => ({
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
  dart.defineExtensionNames([
    'placeholder',
    'readOnly',
    'required'
  ]);
  html$.NumberInputElement = class NumberInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'number'});
    }
    get placeholder() {
      return this[placeholder$0];
    }
    set placeholder(value) {
      this[placeholder$0] = value;
    }
    get readOnly() {
      return this[readOnly$5];
    }
    set readOnly(value) {
      this[readOnly$5] = value;
    }
    get required() {
      return this[required$5];
    }
    set required(value) {
      this[required$5] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'number'})[dartx.type] == 'number';
    }
  };
  const placeholder$0 = Symbol(html$.NumberInputElement.name + "." + 'placeholder'.toString());
  const readOnly$5 = Symbol(html$.NumberInputElement.name + "." + 'readOnly'.toString());
  const required$5 = Symbol(html$.NumberInputElement.name + "." + 'required'.toString());
  html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.NumberInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.NumberInputElement, [])}),
    fields: () => ({
      placeholder: core.String,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.NumberInputElement, [
    'placeholder',
    'placeholder',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  html$.RangeInputElement = class RangeInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'range'});
    }
    static get supported() {
      return html$.InputElement.new({type: 'range'})[dartx.type] == 'range';
    }
  };
  html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.RangeInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.RangeInputElement, [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionNames([
    'checked',
    'required'
  ]);
  html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'checkbox'});
    }
    get checked() {
      return this[checked];
    }
    set checked(value) {
      this[checked] = value;
    }
    get required() {
      return this[required$6];
    }
    set required(value) {
      this[required$6] = value;
    }
  };
  const checked = Symbol(html$.CheckboxInputElement.name + "." + 'checked'.toString());
  const required$6 = Symbol(html$.CheckboxInputElement.name + "." + 'required'.toString());
  html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.CheckboxInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.CheckboxInputElement, [])}),
    fields: () => ({
      checked: core.bool,
      required: core.bool
    })
  });
  dart.defineExtensionMembers(html$.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
  dart.defineExtensionNames([
    'checked',
    'required'
  ]);
  html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'radio'});
    }
    get checked() {
      return this[checked$];
    }
    set checked(value) {
      this[checked$] = value;
    }
    get required() {
      return this[required$7];
    }
    set required(value) {
      this[required$7] = value;
    }
  };
  const checked$ = Symbol(html$.RadioButtonInputElement.name + "." + 'checked'.toString());
  const required$7 = Symbol(html$.RadioButtonInputElement.name + "." + 'required'.toString());
  html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.RadioButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.RadioButtonInputElement, [])}),
    fields: () => ({
      checked: core.bool,
      required: core.bool
    })
  });
  dart.defineExtensionMembers(html$.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
  dart.defineExtensionNames([
    'accept',
    'multiple',
    'required',
    'files'
  ]);
  html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'file'});
    }
    get accept() {
      return this[accept];
    }
    set accept(value) {
      this[accept] = value;
    }
    get multiple() {
      return this[multiple$];
    }
    set multiple(value) {
      this[multiple$] = value;
    }
    get required() {
      return this[required$8];
    }
    set required(value) {
      this[required$8] = value;
    }
    get files() {
      return this[files];
    }
    set files(value) {
      this[files] = value;
    }
  };
  const accept = Symbol(html$.FileUploadInputElement.name + "." + 'accept'.toString());
  const multiple$ = Symbol(html$.FileUploadInputElement.name + "." + 'multiple'.toString());
  const required$8 = Symbol(html$.FileUploadInputElement.name + "." + 'required'.toString());
  const files = Symbol(html$.FileUploadInputElement.name + "." + 'files'.toString());
  html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.FileUploadInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.FileUploadInputElement, [])}),
    fields: () => ({
      accept: core.String,
      multiple: core.bool,
      required: core.bool,
      files: ListOfFile()
    })
  });
  dart.defineExtensionMembers(html$.FileUploadInputElement, [
    'accept',
    'accept',
    'multiple',
    'multiple',
    'required',
    'required',
    'files',
    'files'
  ]);
  dart.defineExtensionNames([
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget'
  ]);
  html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'submit'});
    }
    get formAction() {
      return this[formAction];
    }
    set formAction(value) {
      this[formAction] = value;
    }
    get formEnctype() {
      return this[formEnctype];
    }
    set formEnctype(value) {
      this[formEnctype] = value;
    }
    get formMethod() {
      return this[formMethod];
    }
    set formMethod(value) {
      this[formMethod] = value;
    }
    get formNoValidate() {
      return this[formNoValidate];
    }
    set formNoValidate(value) {
      this[formNoValidate] = value;
    }
    get formTarget() {
      return this[formTarget];
    }
    set formTarget(value) {
      this[formTarget] = value;
    }
  };
  const formAction = Symbol(html$.SubmitButtonInputElement.name + "." + 'formAction'.toString());
  const formEnctype = Symbol(html$.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
  const formMethod = Symbol(html$.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
  const formNoValidate = Symbol(html$.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
  const formTarget = Symbol(html$.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
  html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.SubmitButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.SubmitButtonInputElement, [])}),
    fields: () => ({
      formAction: core.String,
      formEnctype: core.String,
      formMethod: core.String,
      formNoValidate: core.bool,
      formTarget: core.String
    })
  });
  dart.defineExtensionMembers(html$.SubmitButtonInputElement, [
    'formAction',
    'formAction',
    'formEnctype',
    'formEnctype',
    'formMethod',
    'formMethod',
    'formNoValidate',
    'formNoValidate',
    'formTarget',
    'formTarget'
  ]);
  dart.defineExtensionNames([
    'alt',
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget',
    'height',
    'src',
    'width'
  ]);
  html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'image'});
    }
    get alt() {
      return this[alt];
    }
    set alt(value) {
      this[alt] = value;
    }
    get formAction() {
      return this[formAction$];
    }
    set formAction(value) {
      this[formAction$] = value;
    }
    get formEnctype() {
      return this[formEnctype$];
    }
    set formEnctype(value) {
      this[formEnctype$] = value;
    }
    get formMethod() {
      return this[formMethod$];
    }
    set formMethod(value) {
      this[formMethod$] = value;
    }
    get formNoValidate() {
      return this[formNoValidate$];
    }
    set formNoValidate(value) {
      this[formNoValidate$] = value;
    }
    get formTarget() {
      return this[formTarget$];
    }
    set formTarget(value) {
      this[formTarget$] = value;
    }
    get height() {
      return this[height];
    }
    set height(value) {
      this[height] = value;
    }
    get src() {
      return this[src];
    }
    set src(value) {
      this[src] = value;
    }
    get width() {
      return this[width];
    }
    set width(value) {
      this[width] = value;
    }
  };
  const alt = Symbol(html$.ImageButtonInputElement.name + "." + 'alt'.toString());
  const formAction$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formAction'.toString());
  const formEnctype$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
  const formMethod$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formMethod'.toString());
  const formNoValidate$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
  const formTarget$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formTarget'.toString());
  const height = Symbol(html$.ImageButtonInputElement.name + "." + 'height'.toString());
  const src = Symbol(html$.ImageButtonInputElement.name + "." + 'src'.toString());
  const width = Symbol(html$.ImageButtonInputElement.name + "." + 'width'.toString());
  html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.ImageButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ImageButtonInputElement, [])}),
    fields: () => ({
      alt: core.String,
      formAction: core.String,
      formEnctype: core.String,
      formMethod: core.String,
      formNoValidate: core.bool,
      formTarget: core.String,
      height: core.int,
      src: core.String,
      width: core.int
    })
  });
  dart.defineExtensionMembers(html$.ImageButtonInputElement, [
    'alt',
    'alt',
    'formAction',
    'formAction',
    'formEnctype',
    'formEnctype',
    'formMethod',
    'formMethod',
    'formNoValidate',
    'formNoValidate',
    'formTarget',
    'formTarget',
    'height',
    'height',
    'src',
    'src',
    'width',
    'width'
  ]);
  html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'reset'});
    }
  };
  html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.ResetButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ResetButtonInputElement, [])})
  });
  html$.ButtonInputElement = class ButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'button'});
    }
  };
  html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.ButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ButtonInputElement, [])})
  });
  const _initKeyboardEvent = Symbol('_initKeyboardEvent');
  const _keyIdentifier = Symbol('_keyIdentifier');
  dart.defineExtensionNames([
    'keyCode',
    'charCode',
    'which',
    'getModifierState',
    'altKey',
    'code',
    'ctrlKey',
    'key',
    'keyLocation',
    'location',
    'metaKey',
    'repeat',
    'shiftKey'
  ]);
  html$.KeyboardEvent = class KeyboardEvent extends html$.UIEvent {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
      e[_initKeyboardEvent](type, canBubble, cancelable, view, "", keyLocation, ctrlKey, altKey, shiftKey, metaKey);
      return e;
    }
    [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
      if (typeof this.initKeyEvent == "function") {
        this.initKeyEvent(type, canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, 0, 0);
      } else {
        this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
      }
    }
    get [dartx.keyCode]() {
      return this[_keyCode];
    }
    get [dartx.charCode]() {
      return this[_charCode];
    }
    get [dartx.which]() {
      return this[_which];
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.KeyboardEvent._create_1(type, eventInitDict_1);
      }
      return html$.KeyboardEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new KeyboardEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new KeyboardEvent(type);
    }
    get [dartx.altKey]() {
      return this.altKey;
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.ctrlKey]() {
      return this.ctrlKey;
    }
    get [dartx.key]() {
      return this.key;
    }
    get [_keyIdentifier]() {
      return this.keyIdentifier;
    }
    get [dartx.keyLocation]() {
      return this.keyLocation;
    }
    get [dartx.location]() {
      return this.location;
    }
    get [dartx.metaKey]() {
      return this.metaKey;
    }
    get [dartx.repeat]() {
      return this.repeat;
    }
    get [dartx.shiftKey]() {
      return this.shiftKey;
    }
    [dartx.getModifierState](...args) {
      return this.getModifierState.apply(this, args);
    }
  };
  dart.setSignature(html$.KeyboardEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
      _: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.altKey]: core.bool,
      [dartx.code]: core.String,
      [dartx.ctrlKey]: core.bool,
      [dartx.key]: core.String,
      [_keyIdentifier]: core.String,
      [dartx.keyLocation]: core.int,
      [dartx.location]: core.int,
      [dartx.metaKey]: core.bool,
      [dartx.repeat]: core.bool,
      [dartx.shiftKey]: core.bool
    }),
    getters: () => ({
      [dartx.keyCode]: dart.definiteFunctionType(core.int, []),
      [dartx.charCode]: dart.definiteFunctionType(core.int, []),
      [dartx.which]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
      [dartx.getModifierState]: dart.definiteFunctionType(core.bool, [core.String])
    }),
    sfields: () => ({
      DOM_KEY_LOCATION_LEFT: core.int,
      DOM_KEY_LOCATION_NUMPAD: core.int,
      DOM_KEY_LOCATION_RIGHT: core.int,
      DOM_KEY_LOCATION_STANDARD: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
  html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
  html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
  html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
  dart.registerExtension(dart.global.KeyboardEvent, html$.KeyboardEvent);
  html$.KeyframeEffect = class KeyframeEffect extends html$.AnimationEffectReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(target, keyframes, timing) {
      if (timing === void 0) timing = null;
      if (ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null) && timing == null) {
        return html$.KeyframeEffect._create_1(target, keyframes);
      }
      if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
        return html$.KeyframeEffect._create_2(target, keyframes, timing);
      }
      if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
        let timing_1 = html_common.convertDartToNative_Dictionary(timing);
        return html$.KeyframeEffect._create_3(target, keyframes, timing_1);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1(target, keyframes) {
      return new KeyframeEffect(target, keyframes);
    }
    static _create_2(target, keyframes, timing) {
      return new KeyframeEffect(target, keyframes, timing);
    }
    static _create_3(target, keyframes, timing) {
      return new KeyframeEffect(target, keyframes, timing);
    }
  };
  dart.setSignature(html$.KeyframeEffect, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.KeyframeEffect, []),
      new: dart.definiteFunctionType(html$.KeyframeEffect, [html$.Element, ListOfMap()], [dart.dynamic])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.KeyframeEffect, html$.KeyframeEffect);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'autofocus',
    'challenge',
    'disabled',
    'form',
    'keytype',
    'labels',
    'name',
    'type',
    'validationMessage',
    'validity',
    'willValidate'
  ]);
  html$.KeygenElement = class KeygenElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.KeygenElement._check(html$.document[dartx.createElement]("keygen"));
    }
    created() {
      this[dartx.autofocus] = null;
      this[dartx.challenge] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.keytype] = null;
      this[dartx.labels] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    static get supported() {
      return dart.test(html$.Element.isTagSupported('keygen')) && html$.KeygenElement.is(html$.Element.tag('keygen'));
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.challenge]() {
      return this.challenge;
    }
    set [dartx.challenge](value) {
      this.challenge = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.keytype]() {
      return this.keytype;
    }
    set [dartx.keytype](value) {
      this.keytype = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.KeygenElement, 'created');
  dart.setSignature(html$.KeygenElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.KeygenElement, []),
      new: dart.definiteFunctionType(html$.KeygenElement, []),
      created: dart.definiteFunctionType(html$.KeygenElement, [])
    }),
    fields: () => ({
      [dartx.autofocus]: core.bool,
      [dartx.challenge]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.keytype]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLKeygenElement, html$.KeygenElement);
  dart.defineExtensionNames([
    'value'
  ]);
  html$.LIElement = class LIElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LIElement._check(html$.document[dartx.createElement]("li"));
    }
    created() {
      this[dartx.value] = null;
      super.created();
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.LIElement, 'created');
  dart.setSignature(html$.LIElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LIElement, []),
      new: dart.definiteFunctionType(html$.LIElement, []),
      created: dart.definiteFunctionType(html$.LIElement, [])
    }),
    fields: () => ({[dartx.value]: core.int})
  });
  dart.registerExtension(dart.global.HTMLLIElement, html$.LIElement);
  dart.defineExtensionNames([
    'control',
    'form',
    'htmlFor'
  ]);
  html$.LabelElement = class LabelElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LabelElement._check(html$.document[dartx.createElement]("label"));
    }
    created() {
      this[dartx.control] = null;
      this[dartx.form] = null;
      this[dartx.htmlFor] = null;
      super.created();
    }
    get [dartx.control]() {
      return this.control;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.htmlFor]() {
      return this.htmlFor;
    }
    set [dartx.htmlFor](value) {
      this.htmlFor = value;
    }
  };
  dart.defineNamedConstructor(html$.LabelElement, 'created');
  dart.setSignature(html$.LabelElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LabelElement, []),
      new: dart.definiteFunctionType(html$.LabelElement, []),
      created: dart.definiteFunctionType(html$.LabelElement, [])
    }),
    fields: () => ({
      [dartx.control]: html$.HtmlElement,
      [dartx.form]: html$.FormElement,
      [dartx.htmlFor]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLLabelElement, html$.LabelElement);
  dart.defineExtensionNames([
    'form'
  ]);
  html$.LegendElement = class LegendElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LegendElement._check(html$.document[dartx.createElement]("legend"));
    }
    created() {
      this[dartx.form] = null;
      super.created();
    }
    get [dartx.form]() {
      return this.form;
    }
  };
  dart.defineNamedConstructor(html$.LegendElement, 'created');
  dart.setSignature(html$.LegendElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LegendElement, []),
      new: dart.definiteFunctionType(html$.LegendElement, []),
      created: dart.definiteFunctionType(html$.LegendElement, [])
    }),
    fields: () => ({[dartx.form]: html$.FormElement})
  });
  dart.registerExtension(dart.global.HTMLLegendElement, html$.LegendElement);
  dart.defineExtensionNames([
    'supportsImport',
    'crossOrigin',
    'disabled',
    'href',
    'hreflang',
    'import',
    'integrity',
    'media',
    'rel',
    'sheet',
    'sizes',
    'type'
  ]);
  html$.LinkElement = class LinkElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LinkElement._check(html$.document[dartx.createElement]("link"));
    }
    created() {
      this[dartx.crossOrigin] = null;
      this[dartx.disabled] = null;
      this[dartx.href] = null;
      this[dartx.hreflang] = null;
      this[dartx.import] = null;
      this[dartx.integrity] = null;
      this[dartx.media] = null;
      this[dartx.rel] = null;
      this[dartx.sheet] = null;
      this[dartx.sizes] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.hreflang]() {
      return this.hreflang;
    }
    set [dartx.hreflang](value) {
      this.hreflang = value;
    }
    get [dartx.import]() {
      return this.import;
    }
    get [dartx.integrity]() {
      return this.integrity;
    }
    set [dartx.integrity](value) {
      this.integrity = value;
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.rel]() {
      return this.rel;
    }
    set [dartx.rel](value) {
      this.rel = value;
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.sizes]() {
      return this.sizes;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.supportsImport]() {
      return "import" in this;
    }
  };
  dart.defineNamedConstructor(html$.LinkElement, 'created');
  dart.setSignature(html$.LinkElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LinkElement, []),
      new: dart.definiteFunctionType(html$.LinkElement, []),
      created: dart.definiteFunctionType(html$.LinkElement, [])
    }),
    fields: () => ({
      [dartx.crossOrigin]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.href]: core.String,
      [dartx.hreflang]: core.String,
      [dartx.import]: html$.Document,
      [dartx.integrity]: core.String,
      [dartx.media]: core.String,
      [dartx.rel]: core.String,
      [dartx.sheet]: html$.StyleSheet,
      [dartx.sizes]: html$.DomSettableTokenList,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.supportsImport]: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLLinkElement, html$.LinkElement);
  dart.defineExtensionNames([
    'assign',
    'reload',
    'replace',
    'origin',
    'toString',
    'ancestorOrigins',
    'hash',
    'host',
    'hostname',
    'href',
    'pathname',
    'port',
    'protocol',
    'search'
  ]);
  html$.Location = class Location extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.ancestorOrigins]() {
      return this.ancestorOrigins;
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    [dartx.assign](...args) {
      return this.assign.apply(this, args);
    }
    [dartx.reload](...args) {
      return this.reload.apply(this, args);
    }
    [dartx.replace](...args) {
      return this.replace.apply(this, args);
    }
    get [dartx.origin]() {
      if ("origin" in this) {
        return this.origin;
      }
      return dart.str`${this[dartx.protocol]}//${this[dartx.host]}`;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  html$.Location[dart.implements] = () => [html$.LocationBase];
  dart.setSignature(html$.Location, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Location, [])}),
    fields: () => ({
      [dartx.ancestorOrigins]: ListOfString(),
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String
    }),
    getters: () => ({[dartx.origin]: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({
      [dartx.assign]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.reload]: dart.definiteFunctionType(dart.void, []),
      [dartx.replace]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.Location, html$.Location);
  dart.defineExtensionNames([
    'areas',
    'name'
  ]);
  html$.MapElement = class MapElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MapElement._check(html$.document[dartx.createElement]("map"));
    }
    created() {
      this[dartx.areas] = null;
      this[dartx.name] = null;
      super.created();
    }
    get [dartx.areas]() {
      return this.areas;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
  };
  dart.defineNamedConstructor(html$.MapElement, 'created');
  dart.setSignature(html$.MapElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MapElement, []),
      new: dart.definiteFunctionType(html$.MapElement, []),
      created: dart.definiteFunctionType(html$.MapElement, [])
    }),
    fields: () => ({
      [dartx.areas]: ListOfNode(),
      [dartx.name]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMapElement, html$.MapElement);
  dart.defineExtensionNames([
    'pause',
    'play',
    'unpause',
    'buffered',
    'currentTime',
    'defaultPlaybackRate',
    'duration',
    'muted',
    'paused',
    'playbackRate',
    'playbackState',
    'played',
    'seekable',
    'volume'
  ]);
  html$.MediaController = class MediaController extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MediaController._create_1();
    }
    static _create_1() {
      return new MediaController();
    }
    get [dartx.buffered]() {
      return this.buffered;
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.defaultPlaybackRate]() {
      return this.defaultPlaybackRate;
    }
    set [dartx.defaultPlaybackRate](value) {
      this.defaultPlaybackRate = value;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.muted]() {
      return this.muted;
    }
    set [dartx.muted](value) {
      this.muted = value;
    }
    get [dartx.paused]() {
      return this.paused;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    get [dartx.playbackState]() {
      return this.playbackState;
    }
    get [dartx.played]() {
      return this.played;
    }
    get [dartx.seekable]() {
      return this.seekable;
    }
    get [dartx.volume]() {
      return this.volume;
    }
    set [dartx.volume](value) {
      this.volume = value;
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
    [dartx.unpause](...args) {
      return this.unpause.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaController, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaController, []),
      new: dart.definiteFunctionType(html$.MediaController, [])
    }),
    fields: () => ({
      [dartx.buffered]: html$.TimeRanges,
      [dartx.currentTime]: core.num,
      [dartx.defaultPlaybackRate]: core.num,
      [dartx.duration]: core.double,
      [dartx.muted]: core.bool,
      [dartx.paused]: core.bool,
      [dartx.playbackRate]: core.num,
      [dartx.playbackState]: core.String,
      [dartx.played]: html$.TimeRanges,
      [dartx.seekable]: html$.TimeRanges,
      [dartx.volume]: core.num
    }),
    methods: () => ({
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.play]: dart.definiteFunctionType(dart.void, []),
      [dartx.unpause]: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaController, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.MediaController, html$.MediaController);
  dart.defineExtensionNames([
    'deviceId',
    'groupId',
    'kind',
    'label'
  ]);
  html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.deviceId]() {
      return this.deviceId;
    }
    get [dartx.groupId]() {
      return this.groupId;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
  };
  dart.setSignature(html$.MediaDeviceInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaDeviceInfo, [])}),
    fields: () => ({
      [dartx.deviceId]: core.String,
      [dartx.groupId]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String
    })
  });
  dart.registerExtension(dart.global.MediaDeviceInfo, html$.MediaDeviceInfo);
  const _getUserMedia_1 = Symbol('_getUserMedia_1');
  dart.defineExtensionNames([
    'enumerateDevices',
    'getUserMedia'
  ]);
  html$.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.enumerateDevices](...args) {
      return this.enumerateDevices.apply(this, args);
    }
    [dartx.getUserMedia](options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_getUserMedia_1](options_1);
    }
    [_getUserMedia_1](...args) {
      return this.getUserMedia.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaDevices, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaDevices, [])}),
    methods: () => ({
      [dartx.enumerateDevices]: dart.definiteFunctionType(async.Future, []),
      [dartx.getUserMedia]: dart.definiteFunctionType(async.Future, [core.Map]),
      [_getUserMedia_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.MediaDevices, html$.MediaDevices);
  dart.defineExtensionNames([
    'initData',
    'initDataType'
  ]);
  html$.MediaEncryptedEvent = class MediaEncryptedEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaEncryptedEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaEncryptedEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaEncryptedEvent(type);
    }
    get [dartx.initData]() {
      return this.initData;
    }
    get [dartx.initDataType]() {
      return this.initDataType;
    }
  };
  dart.setSignature(html$.MediaEncryptedEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaEncryptedEvent, []),
      new: dart.definiteFunctionType(html$.MediaEncryptedEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.initData]: typed_data.ByteBuffer,
      [dartx.initDataType]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaEncryptedEvent, html$.MediaEncryptedEvent);
  dart.defineExtensionNames([
    'code'
  ]);
  html$.MediaError = class MediaError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
  };
  dart.setSignature(html$.MediaError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaError, [])}),
    fields: () => ({[dartx.code]: core.int}),
    sfields: () => ({
      MEDIA_ERR_ABORTED: core.int,
      MEDIA_ERR_DECODE: core.int,
      MEDIA_ERR_NETWORK: core.int,
      MEDIA_ERR_SRC_NOT_SUPPORTED: core.int
    })
  });
  html$.MediaError.MEDIA_ERR_ABORTED = 1;
  html$.MediaError.MEDIA_ERR_DECODE = 3;
  html$.MediaError.MEDIA_ERR_NETWORK = 2;
  html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
  dart.registerExtension(dart.global.MediaError, html$.MediaError);
  dart.defineExtensionNames([
    'code',
    'systemCode'
  ]);
  html$.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.systemCode]() {
      return this.systemCode;
    }
  };
  dart.setSignature(html$.MediaKeyError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyError, [])}),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.systemCode]: core.int
    }),
    sfields: () => ({
      MEDIA_KEYERR_CLIENT: core.int,
      MEDIA_KEYERR_DOMAIN: core.int,
      MEDIA_KEYERR_HARDWARECHANGE: core.int,
      MEDIA_KEYERR_OUTPUT: core.int,
      MEDIA_KEYERR_SERVICE: core.int,
      MEDIA_KEYERR_UNKNOWN: core.int
    })
  });
  html$.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
  html$.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
  html$.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
  html$.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
  html$.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
  html$.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
  dart.registerExtension(dart.global.MediaKeyError, html$.MediaKeyError);
  dart.defineExtensionNames([
    'defaultUrl',
    'errorCode',
    'initData',
    'keySystem',
    'message',
    'sessionId',
    'systemCode'
  ]);
  html$.MediaKeyEvent = class MediaKeyEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaKeyEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaKeyEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaKeyEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaKeyEvent(type);
    }
    get [dartx.defaultUrl]() {
      return this.defaultURL;
    }
    get [dartx.errorCode]() {
      return this.errorCode;
    }
    get [dartx.initData]() {
      return this.initData;
    }
    get [dartx.keySystem]() {
      return this.keySystem;
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.sessionId]() {
      return this.sessionId;
    }
    get [dartx.systemCode]() {
      return this.systemCode;
    }
  };
  dart.setSignature(html$.MediaKeyEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaKeyEvent, []),
      new: dart.definiteFunctionType(html$.MediaKeyEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.defaultUrl]: core.String,
      [dartx.errorCode]: html$.MediaKeyError,
      [dartx.initData]: typed_data.Uint8List,
      [dartx.keySystem]: core.String,
      [dartx.message]: typed_data.Uint8List,
      [dartx.sessionId]: core.String,
      [dartx.systemCode]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaKeyEvent, html$.MediaKeyEvent);
  dart.defineExtensionNames([
    'message',
    'messageType'
  ]);
  html$.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaKeyMessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaKeyMessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaKeyMessageEvent(type);
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.messageType]() {
      return this.messageType;
    }
  };
  dart.setSignature(html$.MediaKeyMessageEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaKeyMessageEvent, []),
      new: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.message]: typed_data.ByteBuffer,
      [dartx.messageType]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaKeyMessageEvent, html$.MediaKeyMessageEvent);
  const _update$ = Symbol('_update');
  dart.defineExtensionNames([
    'close',
    'generateRequest',
    'load',
    'remove',
    'closed',
    'expiration',
    'keyStatuses',
    'sessionId'
  ]);
  html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.closed]() {
      return this.closed;
    }
    get [dartx.expiration]() {
      return this.expiration;
    }
    get [dartx.keyStatuses]() {
      return this.keyStatuses;
    }
    get [dartx.sessionId]() {
      return this.sessionId;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.generateRequest](...args) {
      return this.generateRequest.apply(this, args);
    }
    [dartx.load](...args) {
      return this.load.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
    [_update$](...args) {
      return this.update.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaKeySession, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySession, [])}),
    fields: () => ({
      [dartx.closed]: async.Future,
      [dartx.expiration]: core.double,
      [dartx.keyStatuses]: html$.MediaKeyStatusMap,
      [dartx.sessionId]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(async.Future, []),
      [dartx.generateRequest]: dart.definiteFunctionType(async.Future, [core.String, dart.dynamic]),
      [dartx.load]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.remove]: dart.definiteFunctionType(async.Future, []),
      [_update$]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.MediaKeySession, html$.MediaKeySession);
  dart.defineExtensionNames([
    'size'
  ]);
  html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.MediaKeyStatusMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyStatusMap, [])}),
    fields: () => ({[dartx.size]: core.int})
  });
  dart.registerExtension(dart.global.MediaKeyStatusMap, html$.MediaKeyStatusMap);
  const _getConfiguration_1 = Symbol('_getConfiguration_1');
  dart.defineExtensionNames([
    'createMediaKeys',
    'getConfiguration',
    'keySystem'
  ]);
  html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.keySystem]() {
      return this.keySystem;
    }
    [dartx.createMediaKeys](...args) {
      return this.createMediaKeys.apply(this, args);
    }
    [dartx.getConfiguration]() {
      return html_common.convertNativeToDart_Dictionary(this[_getConfiguration_1]());
    }
    [_getConfiguration_1](...args) {
      return this.getConfiguration.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaKeySystemAccess, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySystemAccess, [])}),
    fields: () => ({[dartx.keySystem]: core.String}),
    methods: () => ({
      [dartx.createMediaKeys]: dart.definiteFunctionType(async.Future, []),
      [dartx.getConfiguration]: dart.definiteFunctionType(core.Map, []),
      [_getConfiguration_1]: dart.definiteFunctionType(dart.dynamic, [])
    })
  });
  dart.registerExtension(dart.global.MediaKeySystemAccess, html$.MediaKeySystemAccess);
  const _createSession = Symbol('_createSession');
  dart.defineExtensionNames([
    'setServerCertificate'
  ]);
  html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_createSession](...args) {
      return this.createSession.apply(this, args);
    }
    [dartx.setServerCertificate](...args) {
      return this.setServerCertificate.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaKeys, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeys, [])}),
    methods: () => ({
      [_createSession]: dart.definiteFunctionType(html$.MediaKeySession, [], [core.String]),
      [dartx.setServerCertificate]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.MediaKeys, html$.MediaKeys);
  dart.defineExtensionNames([
    'appendMedium',
    'deleteMedium',
    'item',
    'length',
    'mediaText'
  ]);
  html$.MediaList = class MediaList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.mediaText]() {
      return this.mediaText;
    }
    set [dartx.mediaText](value) {
      this.mediaText = value;
    }
    [dartx.appendMedium](...args) {
      return this.appendMedium.apply(this, args);
    }
    [dartx.deleteMedium](...args) {
      return this.deleteMedium.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaList, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [dartx.mediaText]: core.String
    }),
    methods: () => ({
      [dartx.appendMedium]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.deleteMedium]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
    })
  });
  dart.registerExtension(dart.global.MediaList, html$.MediaList);
  dart.defineExtensionNames([
    'addListener',
    'removeListener',
    'onChange',
    'matches',
    'media'
  ]);
  html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.matches]() {
      return this.matches;
    }
    get [dartx.media]() {
      return this.media;
    }
    [dartx.addListener](...args) {
      return this.addListener.apply(this, args);
    }
    [dartx.removeListener](...args) {
      return this.removeListener.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.MediaQueryList.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MediaQueryList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaQueryList, [])}),
    fields: () => ({
      [dartx.matches]: core.bool,
      [dartx.media]: core.String
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.addListener]: dart.definiteFunctionType(dart.void, [html$.EventListener]),
      [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.MediaQueryList, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.MediaQueryList, html$.MediaQueryList);
  dart.defineExtensionNames([
    'matches',
    'media'
  ]);
  html$.MediaQueryListEvent = class MediaQueryListEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaQueryListEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaQueryListEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaQueryListEvent(type);
    }
    get [dartx.matches]() {
      return this.matches;
    }
    get [dartx.media]() {
      return this.media;
    }
  };
  dart.setSignature(html$.MediaQueryListEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaQueryListEvent, []),
      new: dart.definiteFunctionType(html$.MediaQueryListEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.matches]: core.bool,
      [dartx.media]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaQueryListEvent, html$.MediaQueryListEvent);
  dart.defineExtensionNames([
    'activate',
    'deactivate'
  ]);
  html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MediaSession._create_1();
    }
    static _create_1() {
      return new MediaSession();
    }
    [dartx.activate](...args) {
      return this.activate.apply(this, args);
    }
    [dartx.deactivate](...args) {
      return this.deactivate.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaSession, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaSession, []),
      new: dart.definiteFunctionType(html$.MediaSession, [])
    }),
    methods: () => ({
      [dartx.activate]: dart.definiteFunctionType(dart.void, []),
      [dartx.deactivate]: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaSession, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.MediaSession, html$.MediaSession);
  dart.defineExtensionNames([
    'addSourceBuffer',
    'endOfStream',
    'removeSourceBuffer',
    'activeSourceBuffers',
    'duration',
    'readyState',
    'sourceBuffers'
  ]);
  html$.MediaSource = class MediaSource extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MediaSource._create_1();
    }
    static _create_1() {
      return new MediaSource();
    }
    static get supported() {
      return !!window.MediaSource;
    }
    get [dartx.activeSourceBuffers]() {
      return this.activeSourceBuffers;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    set [dartx.duration](value) {
      this.duration = value;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.sourceBuffers]() {
      return this.sourceBuffers;
    }
    [dartx.addSourceBuffer](...args) {
      return this.addSourceBuffer.apply(this, args);
    }
    [dartx.endOfStream](...args) {
      return this.endOfStream.apply(this, args);
    }
    [dartx.removeSourceBuffer](...args) {
      return this.removeSourceBuffer.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaSource, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaSource, []),
      new: dart.definiteFunctionType(html$.MediaSource, [])
    }),
    fields: () => ({
      [dartx.activeSourceBuffers]: html$.SourceBufferList,
      [dartx.duration]: core.num,
      [dartx.readyState]: core.String,
      [dartx.sourceBuffers]: html$.SourceBufferList
    }),
    methods: () => ({
      [dartx.addSourceBuffer]: dart.definiteFunctionType(html$.SourceBuffer, [core.String]),
      [dartx.endOfStream]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html$.SourceBuffer])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaSource, []),
      isTypeSupported: dart.definiteFunctionType(core.bool, [core.String])
    }),
    names: ['_create_1', 'isTypeSupported']
  });
  dart.registerExtension(dart.global.MediaSource, html$.MediaSource);
  dart.defineExtensionNames([
    'addTrack',
    'clone',
    'getAudioTracks',
    'getTrackById',
    'getTracks',
    'getVideoTracks',
    'removeTrack',
    'stop',
    'onAddTrack',
    'onEnded',
    'onRemoveTrack',
    'active',
    'ended',
    'id',
    'label'
  ]);
  html$.MediaStream = class MediaStream extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(stream_OR_tracks) {
      if (stream_OR_tracks === void 0) stream_OR_tracks = null;
      if (stream_OR_tracks == null) {
        return html$.MediaStream._create_1();
      }
      if (html$.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
        return html$.MediaStream._create_2(stream_OR_tracks);
      }
      if (ListOfMediaStreamTrack().is(stream_OR_tracks) || stream_OR_tracks == null) {
        return html$.MediaStream._create_3(stream_OR_tracks);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new MediaStream();
    }
    static _create_2(stream_OR_tracks) {
      return new MediaStream(stream_OR_tracks);
    }
    static _create_3(stream_OR_tracks) {
      return new MediaStream(stream_OR_tracks);
    }
    get [dartx.active]() {
      return this.active;
    }
    get [dartx.ended]() {
      return this.ended;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.label]() {
      return this.label;
    }
    [dartx.addTrack](...args) {
      return this.addTrack.apply(this, args);
    }
    [dartx.clone](...args) {
      return this.clone.apply(this, args);
    }
    [dartx.getAudioTracks](...args) {
      return this.getAudioTracks.apply(this, args);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    [dartx.getTracks](...args) {
      return this.getTracks.apply(this, args);
    }
    [dartx.getVideoTracks](...args) {
      return this.getVideoTracks.apply(this, args);
    }
    [dartx.removeTrack](...args) {
      return this.removeTrack.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onAddTrack]() {
      return html$.MediaStream.addTrackEvent.forTarget(this);
    }
    get [dartx.onEnded]() {
      return html$.MediaStream.endedEvent.forTarget(this);
    }
    get [dartx.onRemoveTrack]() {
      return html$.MediaStream.removeTrackEvent.forTarget(this);
    }
    static get supported() {
      return !!(html$.window[dartx.navigator].getUserMedia || html$.window[dartx.navigator].webkitGetUserMedia || html$.window[dartx.navigator].mozGetUserMedia || html$.window[dartx.navigator].msGetUserMedia);
    }
  };
  dart.setSignature(html$.MediaStream, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaStream, []),
      new: dart.definiteFunctionType(html$.MediaStream, [], [dart.dynamic])
    }),
    fields: () => ({
      [dartx.active]: core.bool,
      [dartx.ended]: core.bool,
      [dartx.id]: core.String,
      [dartx.label]: core.String
    }),
    getters: () => ({
      [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
      [dartx.clone]: dart.definiteFunctionType(html$.MediaStream, []),
      [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.MediaStreamTrack, [core.String]),
      [dartx.getTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
      [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
      [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      addTrackEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      removeTrackEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaStream, []),
      _create_2: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.defineLazy(html$.MediaStream, {
    get addTrackEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('addtrack'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get removeTrackEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('removetrack'));
    }
  });
  dart.registerExtension(dart.global.MediaStream, html$.MediaStream);
  dart.defineExtensionNames([
    'stream'
  ]);
  html$.MediaStreamEvent = class MediaStreamEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaStreamEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaStreamEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaStreamEvent(type);
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('MediaStreamEvent');
    }
    get [dartx.stream]() {
      return this.stream;
    }
  };
  dart.setSignature(html$.MediaStreamEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaStreamEvent, []),
      new: dart.definiteFunctionType(html$.MediaStreamEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.stream]: html$.MediaStream}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaStreamEvent, html$.MediaStreamEvent);
  dart.defineExtensionNames([
    'clone',
    'stop',
    'onEnded',
    'onMute',
    'onUnmute',
    'enabled',
    'id',
    'kind',
    'label',
    'muted',
    'readyState'
  ]);
  html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.enabled]() {
      return this.enabled;
    }
    set [dartx.enabled](value) {
      this.enabled = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.muted]() {
      return this.muted;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    [dartx.clone](...args) {
      return this.clone.apply(this, args);
    }
    static getSources() {
      let completer = CompleterOfListOfSourceInfo().new();
      html$.MediaStreamTrack._getSources(dart.fn(value => {
        completer.complete(value);
      }, ListOfSourceInfoTovoid()));
      return completer.future;
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onEnded]() {
      return html$.MediaStreamTrack.endedEvent.forTarget(this);
    }
    get [dartx.onMute]() {
      return html$.MediaStreamTrack.muteEvent.forTarget(this);
    }
    get [dartx.onUnmute]() {
      return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MediaStreamTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrack, [])}),
    fields: () => ({
      [dartx.enabled]: core.bool,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.muted]: core.bool,
      [dartx.readyState]: core.String
    }),
    getters: () => ({
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.clone]: dart.definiteFunctionType(html$.MediaStreamTrack, []),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      endedEvent: EventStreamProviderOfEvent(),
      muteEvent: EventStreamProviderOfEvent(),
      unmuteEvent: EventStreamProviderOfEvent()
    }),
    statics: () => ({
      _getSources: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrackSourcesCallback]),
      getSources: dart.definiteFunctionType(async.Future$(core.List$(html$.SourceInfo)), [])
    }),
    names: ['_getSources', 'getSources']
  });
  dart.defineLazy(html$.MediaStreamTrack, {
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get muteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('mute'));
    },
    get unmuteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unmute'));
    }
  });
  dart.registerExtension(dart.global.MediaStreamTrack, html$.MediaStreamTrack);
  dart.defineExtensionNames([
    'track'
  ]);
  html$.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('MediaStreamTrackEvent');
    }
    get [dartx.track]() {
      return this.track;
    }
  };
  dart.setSignature(html$.MediaStreamTrackEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrackEvent, [])}),
    fields: () => ({[dartx.track]: html$.MediaStreamTrack}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.MediaStreamTrackEvent, html$.MediaStreamTrackEvent);
  html$.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
  dart.defineExtensionNames([
    'jsHeapSizeLimit',
    'totalJSHeapSize',
    'usedJSHeapSize'
  ]);
  html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.jsHeapSizeLimit]() {
      return this.jsHeapSizeLimit;
    }
    get [dartx.totalJSHeapSize]() {
      return this.totalJSHeapSize;
    }
    get [dartx.usedJSHeapSize]() {
      return this.usedJSHeapSize;
    }
  };
  dart.setSignature(html$.MemoryInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MemoryInfo, [])}),
    fields: () => ({
      [dartx.jsHeapSizeLimit]: core.int,
      [dartx.totalJSHeapSize]: core.int,
      [dartx.usedJSHeapSize]: core.int
    })
  });
  dart.registerExtension(dart.global.MemoryInfo, html$.MemoryInfo);
  dart.defineExtensionNames([
    'label',
    'type'
  ]);
  html$.MenuElement = class MenuElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MenuElement._check(html$.document[dartx.createElement]("menu"));
    }
    created() {
      this[dartx.label] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.MenuElement, 'created');
  dart.setSignature(html$.MenuElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MenuElement, []),
      new: dart.definiteFunctionType(html$.MenuElement, []),
      created: dart.definiteFunctionType(html$.MenuElement, [])
    }),
    fields: () => ({
      [dartx.label]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMenuElement, html$.MenuElement);
  dart.defineExtensionNames([
    'checked',
    'defaultValue',
    'disabled',
    'icon',
    'label',
    'radiogroup',
    'type'
  ]);
  html$.MenuItemElement = class MenuItemElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.checked] = null;
      this[dartx.defaultValue] = null;
      this[dartx.disabled] = null;
      this[dartx.icon] = null;
      this[dartx.label] = null;
      this[dartx.radiogroup] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.checked]() {
      return this.checked;
    }
    set [dartx.checked](value) {
      this.checked = value;
    }
    get [dartx.defaultValue]() {
      return this.default;
    }
    set [dartx.defaultValue](value) {
      this.default = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.icon]() {
      return this.icon;
    }
    set [dartx.icon](value) {
      this.icon = value;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.radiogroup]() {
      return this.radiogroup;
    }
    set [dartx.radiogroup](value) {
      this.radiogroup = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.MenuItemElement, 'created');
  dart.setSignature(html$.MenuItemElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MenuItemElement, []),
      created: dart.definiteFunctionType(html$.MenuItemElement, [])
    }),
    fields: () => ({
      [dartx.checked]: core.bool,
      [dartx.defaultValue]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.icon]: core.String,
      [dartx.label]: core.String,
      [dartx.radiogroup]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMenuItemElement, html$.MenuItemElement);
  dart.defineExtensionNames([
    'port1',
    'port2'
  ]);
  html$.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.port1]() {
      return this.port1;
    }
    get [dartx.port2]() {
      return this.port2;
    }
  };
  dart.setSignature(html$.MessageChannel, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MessageChannel, [])}),
    fields: () => ({
      [dartx.port1]: html$.MessagePort,
      [dartx.port2]: html$.MessagePort
    })
  });
  dart.registerExtension(dart.global.MessageChannel, html$.MessageChannel);
  const _initMessageEvent = Symbol('_initMessageEvent');
  const _get_data = Symbol('_get_data');
  const _get_source = Symbol('_get_source');
  dart.defineExtensionNames([
    'data',
    'source',
    'lastEventId',
    'origin'
  ]);
  html$.MessageEvent = class MessageEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let data = opts && 'data' in opts ? opts.data : null;
      let origin = opts && 'origin' in opts ? opts.origin : null;
      let lastEventId = opts && 'lastEventId' in opts ? opts.lastEventId : null;
      let source = opts && 'source' in opts ? opts.source : null;
      let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : null;
      if (source == null) {
        source = html$.window;
      }
      if (!dart.test(html_common.Device.isIE)) {
        return new MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
      }
      let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
      event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
      return event;
    }
    get [dartx.data]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
    }
    get [_get_data]() {
      return this.data;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.MessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MessageEvent(type);
    }
    get [dartx.lastEventId]() {
      return this.lastEventId;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.source]() {
      return html$._convertNativeToDart_EventTarget(this[_get_source]);
    }
    get [_get_source]() {
      return this.source;
    }
    [_initMessageEvent](...args) {
      return this.initMessageEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.MessageEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html$.Window, messagePorts: ListOfMessagePort()}),
      _: dart.definiteFunctionType(html$.MessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_get_data]: dart.dynamic,
      [dartx.lastEventId]: core.String,
      [dartx.origin]: core.String,
      [_get_source]: dart.dynamic
    }),
    getters: () => ({
      [dartx.data]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.source]: dart.definiteFunctionType(html$.EventTarget, [])
    }),
    methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.Window, ListOfMessagePort()])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MessageEvent, html$.MessageEvent);
  dart.defineExtensionNames([
    'close',
    'postMessage',
    'start',
    'onMessage'
  ]);
  html$.MessagePort = class MessagePort extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.MessagePort.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MessagePort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MessagePort, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.start]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.MessagePort, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.MessagePort, html$.MessagePort);
  dart.defineExtensionNames([
    'content',
    'httpEquiv',
    'name'
  ]);
  html$.MetaElement = class MetaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MetaElement._check(html$.document[dartx.createElement]("meta"));
    }
    created() {
      this[dartx.content] = null;
      this[dartx.httpEquiv] = null;
      this[dartx.name] = null;
      super.created();
    }
    get [dartx.content]() {
      return this.content;
    }
    set [dartx.content](value) {
      this.content = value;
    }
    get [dartx.httpEquiv]() {
      return this.httpEquiv;
    }
    set [dartx.httpEquiv](value) {
      this.httpEquiv = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
  };
  dart.defineNamedConstructor(html$.MetaElement, 'created');
  dart.setSignature(html$.MetaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MetaElement, []),
      new: dart.definiteFunctionType(html$.MetaElement, []),
      created: dart.definiteFunctionType(html$.MetaElement, [])
    }),
    fields: () => ({
      [dartx.content]: core.String,
      [dartx.httpEquiv]: core.String,
      [dartx.name]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMetaElement, html$.MetaElement);
  const _get_modificationTime = Symbol('_get_modificationTime');
  dart.defineExtensionNames([
    'modificationTime',
    'size'
  ]);
  html$.Metadata = class Metadata extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.modificationTime]() {
      return html_common.convertNativeToDart_DateTime(this[_get_modificationTime]);
    }
    get [_get_modificationTime]() {
      return this.modificationTime;
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.Metadata, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Metadata, [])}),
    fields: () => ({
      [_get_modificationTime]: dart.dynamic,
      [dartx.size]: core.int
    }),
    getters: () => ({[dartx.modificationTime]: dart.definiteFunctionType(core.DateTime, [])})
  });
  dart.registerExtension(dart.global.Metadata, html$.Metadata);
  html$.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html$.Metadata]));
  dart.defineExtensionNames([
    'high',
    'labels',
    'low',
    'max',
    'min',
    'optimum',
    'value'
  ]);
  html$.MeterElement = class MeterElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MeterElement._check(html$.document[dartx.createElement]("meter"));
    }
    created() {
      this[dartx.high] = null;
      this[dartx.labels] = null;
      this[dartx.low] = null;
      this[dartx.max] = null;
      this[dartx.min] = null;
      this[dartx.optimum] = null;
      this[dartx.value] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('meter');
    }
    get [dartx.high]() {
      return this.high;
    }
    set [dartx.high](value) {
      this.high = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.low]() {
      return this.low;
    }
    set [dartx.low](value) {
      this.low = value;
    }
    get [dartx.max]() {
      return this.max;
    }
    set [dartx.max](value) {
      this.max = value;
    }
    get [dartx.min]() {
      return this.min;
    }
    set [dartx.min](value) {
      this.min = value;
    }
    get [dartx.optimum]() {
      return this.optimum;
    }
    set [dartx.optimum](value) {
      this.optimum = value;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.MeterElement, 'created');
  dart.setSignature(html$.MeterElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MeterElement, []),
      new: dart.definiteFunctionType(html$.MeterElement, []),
      created: dart.definiteFunctionType(html$.MeterElement, [])
    }),
    fields: () => ({
      [dartx.high]: core.num,
      [dartx.labels]: ListOfNode(),
      [dartx.low]: core.num,
      [dartx.max]: core.num,
      [dartx.min]: core.num,
      [dartx.optimum]: core.num,
      [dartx.value]: core.num
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLMeterElement, html$.MeterElement);
  dart.defineExtensionNames([
    'inputs',
    'outputs',
    'sysexEnabled'
  ]);
  html$.MidiAccess = class MidiAccess extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.inputs]() {
      return this.inputs;
    }
    get [dartx.outputs]() {
      return this.outputs;
    }
    get [dartx.sysexEnabled]() {
      return this.sysexEnabled;
    }
  };
  dart.setSignature(html$.MidiAccess, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiAccess, [])}),
    fields: () => ({
      [dartx.inputs]: html$.MidiInputMap,
      [dartx.outputs]: html$.MidiOutputMap,
      [dartx.sysexEnabled]: core.bool
    })
  });
  dart.registerExtension(dart.global.MIDIAccess, html$.MidiAccess);
  dart.defineExtensionNames([
    'port'
  ]);
  html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
      }
      return html$.MidiConnectionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MIDIConnectionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MIDIConnectionEvent(type);
    }
    get [dartx.port]() {
      return this.port;
    }
  };
  dart.setSignature(html$.MidiConnectionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MidiConnectionEvent, []),
      new: dart.definiteFunctionType(html$.MidiConnectionEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.port]: html$.MidiPort}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MIDIConnectionEvent, html$.MidiConnectionEvent);
  dart.defineExtensionNames([
    'close',
    'open',
    'connection',
    'id',
    'manufacturer',
    'name',
    'state',
    'type',
    'version'
  ]);
  html$.MidiPort = class MidiPort extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connection]() {
      return this.connection;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.manufacturer]() {
      return this.manufacturer;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.state]() {
      return this.state;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.version]() {
      return this.version;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.open](...args) {
      return this.open.apply(this, args);
    }
  };
  dart.setSignature(html$.MidiPort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiPort, [])}),
    fields: () => ({
      [dartx.connection]: core.String,
      [dartx.id]: core.String,
      [dartx.manufacturer]: core.String,
      [dartx.name]: core.String,
      [dartx.state]: core.String,
      [dartx.type]: core.String,
      [dartx.version]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(async.Future, []),
      [dartx.open]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.MIDIPort, html$.MidiPort);
  dart.defineExtensionNames([
    'onMidiMessage'
  ]);
  html$.MidiInput = class MidiInput extends html$.MidiPort {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.onMidiMessage]() {
      return html$.MidiInput.midiMessageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MidiInput, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiInput, [])}),
    getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html$.MidiMessageEvent), [])}),
    sfields: () => ({midiMessageEvent: EventStreamProviderOfMidiMessageEvent()})
  });
  dart.defineLazy(html$.MidiInput, {
    get midiMessageEvent() {
      return dart.const(new (EventStreamProviderOfMidiMessageEvent())('midimessage'));
    }
  });
  dart.registerExtension(dart.global.MIDIInput, html$.MidiInput);
  dart.defineExtensionNames([
    'size'
  ]);
  html$.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.MidiInputMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiInputMap, [])}),
    fields: () => ({[dartx.size]: core.int})
  });
  dart.registerExtension(dart.global.MIDIInputMap, html$.MidiInputMap);
  dart.defineExtensionNames([
    'data',
    'receivedTime'
  ]);
  html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.MidiMessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MIDIMessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MIDIMessageEvent(type);
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.receivedTime]() {
      return this.receivedTime;
    }
  };
  dart.setSignature(html$.MidiMessageEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MidiMessageEvent, []),
      new: dart.definiteFunctionType(html$.MidiMessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.data]: typed_data.Uint8List,
      [dartx.receivedTime]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MIDIMessageEvent, html$.MidiMessageEvent);
  dart.defineExtensionNames([
    'send'
  ]);
  html$.MidiOutput = class MidiOutput extends html$.MidiPort {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
  };
  dart.setSignature(html$.MidiOutput, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutput, [])}),
    methods: () => ({[dartx.send]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List], [core.num])})
  });
  dart.registerExtension(dart.global.MIDIOutput, html$.MidiOutput);
  dart.defineExtensionNames([
    'size'
  ]);
  html$.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.MidiOutputMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutputMap, [])}),
    fields: () => ({[dartx.size]: core.int})
  });
  dart.registerExtension(dart.global.MIDIOutputMap, html$.MidiOutputMap);
  dart.defineExtensionNames([
    'description',
    'enabledPlugin',
    'suffixes',
    'type'
  ]);
  html$.MimeType = class MimeType extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.description]() {
      return this.description;
    }
    get [dartx.enabledPlugin]() {
      return this.enabledPlugin;
    }
    get [dartx.suffixes]() {
      return this.suffixes;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.MimeType, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MimeType, [])}),
    fields: () => ({
      [dartx.description]: core.String,
      [dartx.enabledPlugin]: html$.Plugin,
      [dartx.suffixes]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.MimeType, html$.MimeType);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item',
    'namedItem'
  ]);
  html$.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.MimeType), html$.ImmutableListMixin$(html$.MimeType)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  html$.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
  dart.setSignature(html$.MimeTypeArray, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MimeTypeArray, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.MimeType, []),
      [dartx.last]: dart.definiteFunctionType(html$.MimeType, []),
      [dartx.single]: dart.definiteFunctionType(html$.MimeType, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.MimeType]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
    })
  });
  dart.registerExtension(dart.global.MimeTypeArray, html$.MimeTypeArray);
  dart.defineExtensionNames([
    'cite',
    'dateTime'
  ]);
  html$.ModElement = class ModElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.cite] = null;
      this[dartx.dateTime] = null;
      super.created();
    }
    get [dartx.cite]() {
      return this.cite;
    }
    set [dartx.cite](value) {
      this.cite = value;
    }
    get [dartx.dateTime]() {
      return this.dateTime;
    }
    set [dartx.dateTime](value) {
      this.dateTime = value;
    }
  };
  dart.defineNamedConstructor(html$.ModElement, 'created');
  dart.setSignature(html$.ModElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ModElement, []),
      created: dart.definiteFunctionType(html$.ModElement, [])
    }),
    fields: () => ({
      [dartx.cite]: core.String,
      [dartx.dateTime]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLModElement, html$.ModElement);
  const _initMouseEvent = Symbol('_initMouseEvent');
  const _clientX = Symbol('_clientX');
  const _clientY = Symbol('_clientY');
  const _layerX = Symbol('_layerX');
  const _layerY = Symbol('_layerY');
  const _movementX = Symbol('_movementX');
  const _movementY = Symbol('_movementY');
  const _pageX = Symbol('_pageX');
  const _pageY = Symbol('_pageY');
  const _screenX = Symbol('_screenX');
  const _screenY = Symbol('_screenY');
  const _webkitMovementX = Symbol('_webkitMovementX');
  const _webkitMovementY = Symbol('_webkitMovementY');
  const _initMouseEvent_1 = Symbol('_initMouseEvent_1');
  dart.defineExtensionNames([
    'relatedTarget',
    'client',
    'movement',
    'offset',
    'screen',
    'layer',
    'page',
    'altKey',
    'button',
    'buttons',
    'ctrlKey',
    'dataTransfer',
    'fromElement',
    'metaKey',
    'region',
    'shiftKey',
    'toElement'
  ]);
  html$.MouseEvent = class MouseEvent extends html$.UIEvent {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let detail = opts && 'detail' in opts ? opts.detail : 0;
      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
      let button = opts && 'button' in opts ? opts.button : 0;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
      if (view == null) {
        view = html$.window;
      }
      let event = html$.MouseEvent._check(html$.document[_createEvent]('MouseEvent'));
      event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
      return event;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MouseEvent._create_1(type, eventInitDict_1);
      }
      return html$.MouseEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MouseEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MouseEvent(type);
    }
    get [dartx.altKey]() {
      return this.altKey;
    }
    get [dartx.button]() {
      return this.button;
    }
    get [dartx.buttons]() {
      return this.buttons;
    }
    get [_clientX]() {
      return this.clientX;
    }
    get [_clientY]() {
      return this.clientY;
    }
    get [dartx.ctrlKey]() {
      return this.ctrlKey;
    }
    get [dartx.dataTransfer]() {
      return this.dataTransfer;
    }
    get [dartx.fromElement]() {
      return this.fromElement;
    }
    get [_layerX]() {
      return this.layerX;
    }
    get [_layerY]() {
      return this.layerY;
    }
    get [dartx.metaKey]() {
      return this.metaKey;
    }
    get [_movementX]() {
      return this.movementX;
    }
    get [_movementY]() {
      return this.movementY;
    }
    get [_pageX]() {
      return this.pageX;
    }
    get [_pageY]() {
      return this.pageY;
    }
    get [dartx.region]() {
      return this.region;
    }
    get [dartx.relatedTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
    }
    get [_get_relatedTarget]() {
      return this.relatedTarget;
    }
    get [_screenX]() {
      return this.screenX;
    }
    get [_screenY]() {
      return this.screenY;
    }
    get [dartx.shiftKey]() {
      return this.shiftKey;
    }
    get [dartx.toElement]() {
      return this.toElement;
    }
    get [_webkitMovementX]() {
      return this.webkitMovementX;
    }
    get [_webkitMovementY]() {
      return this.webkitMovementY;
    }
    [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
      let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
      this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
      return;
    }
    [_initMouseEvent_1](...args) {
      return this.initMouseEvent.apply(this, args);
    }
    get [dartx.client]() {
      return new (PointOfnum())(this[_clientX], this[_clientY]);
    }
    get [dartx.movement]() {
      return new (PointOfnum())(this[_webkitMovementX], this[_webkitMovementY]);
    }
    get [dartx.offset]() {
      if (!!this.offsetX) {
        let x = this.offsetX;
        let y = this.offsetY;
        return new (PointOfnum())(x, y);
      } else {
        if (!html$.Element.is(this[dartx.target])) {
          dart.throw(new core.UnsupportedError('offsetX is only supported on elements'));
        }
        let target = html$.Element._check(this[dartx.target]);
        let point = this[dartx.client]['-'](target[dartx.getBoundingClientRect]()[dartx.topLeft]);
        return new (PointOfnum())(point.x[dartx.toInt](), point.y[dartx.toInt]());
      }
    }
    get [dartx.screen]() {
      return new (PointOfnum())(this[_screenX], this[_screenY]);
    }
    get [dartx.layer]() {
      return new (PointOfnum())(this[_layerX], this[_layerY]);
    }
    get [dartx.page]() {
      return new (PointOfnum())(this[_pageX], this[_pageY]);
    }
  };
  dart.setSignature(html$.MouseEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.MouseEvent, [core.String], {view: html$.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
      _: dart.definiteFunctionType(html$.MouseEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.altKey]: core.bool,
      [dartx.button]: core.int,
      [dartx.buttons]: core.int,
      [_clientX]: core.int,
      [_clientY]: core.int,
      [dartx.ctrlKey]: core.bool,
      [dartx.dataTransfer]: html$.DataTransfer,
      [dartx.fromElement]: html$.Node,
      [_layerX]: core.int,
      [_layerY]: core.int,
      [dartx.metaKey]: core.bool,
      [_movementX]: core.int,
      [_movementY]: core.int,
      [_pageX]: core.int,
      [_pageY]: core.int,
      [dartx.region]: core.String,
      [_get_relatedTarget]: dart.dynamic,
      [_screenX]: core.int,
      [_screenY]: core.int,
      [dartx.shiftKey]: core.bool,
      [dartx.toElement]: html$.Node,
      [_webkitMovementX]: core.int,
      [_webkitMovementY]: core.int
    }),
    getters: () => ({
      [dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, []),
      [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.movement]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.offset]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.layer]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), [])
    }),
    methods: () => ({
      [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
      [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MouseEvent, html$.MouseEvent);
  dart.registerExtension(dart.global.DragEvent, html$.MouseEvent);
  html$.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html$.MutationObserver]));
  const _observe_1 = Symbol('_observe_1');
  const _observe = Symbol('_observe');
  const _call = Symbol('_call');
  dart.defineExtensionNames([
    'disconnect',
    'takeRecords',
    'observe'
  ]);
  html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
    [dartx.disconnect](...args) {
      return this.disconnect.apply(this, args);
    }
    [_observe](target, options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_observe_1](target, options_1);
      return;
    }
    [_observe_1](...args) {
      return this.observe.apply(this, args);
    }
    [dartx.takeRecords](...args) {
      return this.takeRecords.apply(this, args);
    }
    static get supported() {
      return !!(window.MutationObserver || window.WebKitMutationObserver);
    }
    [dartx.observe](target, opts) {
      let childList = opts && 'childList' in opts ? opts.childList : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let characterData = opts && 'characterData' in opts ? opts.characterData : null;
      let subtree = opts && 'subtree' in opts ? opts.subtree : null;
      let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
      let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
      let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
      let parsedOptions = html$.MutationObserver._createDict();
      function override(key, value) {
        if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
      }
      dart.fn(override, dynamicAnddynamicTodynamic$());
      override('childList', childList);
      override('attributes', attributes);
      override('characterData', characterData);
      override('subtree', subtree);
      override('attributeOldValue', attributeOldValue);
      override('characterDataOldValue', characterDataOldValue);
      if (attributeFilter != null) {
        override('attributeFilter', html$.MutationObserver._fixupList(attributeFilter));
      }
      this[_call](target, parsedOptions);
    }
    static _createDict() {
      return {};
    }
    static _add(m, key, value) {
      m[key] = value;
    }
    static _fixupList(list) {
      return list;
    }
    [_call](...args) {
      return this.observe.apply(this, args);
    }
    static new(callback) {
      0;
      return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(html$._wrapZoneBinaryCallback)(html$._wrapBinaryZone(dart.dynamic, dart.dynamic, dart.dynamic)(callback), 2));
    }
  };
  dart.setSignature(html$.MutationObserver, {
    constructors: () => ({new: dart.definiteFunctionType(html$.MutationObserver, [html$.MutationCallback])}),
    methods: () => ({
      [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
      [_observe]: dart.definiteFunctionType(dart.void, [html$.Node, core.Map]),
      [_observe_1]: dart.definiteFunctionType(dart.void, [html$.Node, dart.dynamic]),
      [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html$.MutationRecord), []),
      [dartx.observe]: dart.definiteFunctionType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
      [_call]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
    }),
    sfields: () => ({_boolKeys: MapOfString$bool()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _createDict: dart.definiteFunctionType(dart.dynamic, []),
      _add: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
      _fixupList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    }),
    names: ['_createDict', '_add', '_fixupList']
  });
  html$.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
  dart.registerExtension(dart.global.MutationObserver, html$.MutationObserver);
  dart.registerExtension(dart.global.WebKitMutationObserver, html$.MutationObserver);
  dart.defineExtensionNames([
    'addedNodes',
    'attributeName',
    'attributeNamespace',
    'nextSibling',
    'oldValue',
    'previousSibling',
    'removedNodes',
    'target',
    'type'
  ]);
  html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.addedNodes]() {
      return this.addedNodes;
    }
    get [dartx.attributeName]() {
      return this.attributeName;
    }
    get [dartx.attributeNamespace]() {
      return this.attributeNamespace;
    }
    get [dartx.nextSibling]() {
      return this.nextSibling;
    }
    get [dartx.oldValue]() {
      return this.oldValue;
    }
    get [dartx.previousSibling]() {
      return this.previousSibling;
    }
    get [dartx.removedNodes]() {
      return this.removedNodes;
    }
    get [dartx.target]() {
      return this.target;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.MutationRecord, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MutationRecord, [])}),
    fields: () => ({
      [dartx.addedNodes]: ListOfNode(),
      [dartx.attributeName]: core.String,
      [dartx.attributeNamespace]: core.String,
      [dartx.nextSibling]: html$.Node,
      [dartx.oldValue]: core.String,
      [dartx.previousSibling]: html$.Node,
      [dartx.removedNodes]: ListOfNode(),
      [dartx.target]: html$.Node,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.MutationRecord, html$.MutationRecord);
  const _ensureGetUserMedia = Symbol('_ensureGetUserMedia');
  const _getUserMedia = Symbol('_getUserMedia');
  const _requestMidiAccess_1 = Symbol('_requestMidiAccess_1');
  const _requestMidiAccess_2 = Symbol('_requestMidiAccess_2');
  dart.defineExtensionNames([
    'language',
    'getUserMedia',
    'getBattery',
    'getGamepads',
    'getVRDevices',
    'registerProtocolHandler',
    'requestMidiAccess',
    'requestMediaKeySystemAccess',
    'sendBeacon',
    'getStorageUpdates',
    'bluetooth',
    'connection',
    'credentials',
    'doNotTrack',
    'geolocation',
    'maxTouchPoints',
    'mediaDevices',
    'mimeTypes',
    'permissions',
    'presentation',
    'productSub',
    'serviceWorker',
    'services',
    'storageQuota',
    'vendor',
    'vendorSub',
    'persistentStorage',
    'temporaryStorage',
    'hardwareConcurrency',
    'appCodeName',
    'appName',
    'appVersion',
    'dartEnabled',
    'platform',
    'product',
    'userAgent',
    'languages',
    'onLine',
    'cookieEnabled'
  ]);
  html$.Navigator = class Navigator extends _interceptors.Interceptor {
    get [dartx.language]() {
      return this.language || this.userLanguage;
    }
    [dartx.getUserMedia](opts) {
      let audio = opts && 'audio' in opts ? opts.audio : false;
      let video = opts && 'video' in opts ? opts.video : false;
      let completer = CompleterOfMediaStream().new();
      let options = dart.map({audio: audio, video: video}, core.String, dart.dynamic);
      this[_ensureGetUserMedia]();
      this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
        completer.complete(stream);
      }, MediaStreamTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, NavigatorUserMediaErrorTovoid()));
      return completer.future;
    }
    [_ensureGetUserMedia]() {
      if (!this.getUserMedia) {
        this.getUserMedia = this.getUserMedia || this.webkitGetUserMedia || this.mozGetUserMedia || this.msGetUserMedia;
      }
    }
    [_getUserMedia](...args) {
      return this.getUserMedia.apply(this, args);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bluetooth]() {
      return this.bluetooth;
    }
    get [dartx.connection]() {
      return this.connection;
    }
    get [dartx.credentials]() {
      return this.credentials;
    }
    get [dartx.doNotTrack]() {
      return this.doNotTrack;
    }
    get [dartx.geolocation]() {
      return this.geolocation;
    }
    get [dartx.maxTouchPoints]() {
      return this.maxTouchPoints;
    }
    get [dartx.mediaDevices]() {
      return this.mediaDevices;
    }
    get [dartx.mimeTypes]() {
      return this.mimeTypes;
    }
    get [dartx.permissions]() {
      return this.permissions;
    }
    get [dartx.presentation]() {
      return this.presentation;
    }
    get [dartx.productSub]() {
      return this.productSub;
    }
    get [dartx.serviceWorker]() {
      return this.serviceWorker;
    }
    get [dartx.services]() {
      return this.services;
    }
    get [dartx.storageQuota]() {
      return this.storageQuota;
    }
    get [dartx.vendor]() {
      return this.vendor;
    }
    get [dartx.vendorSub]() {
      return this.vendorSub;
    }
    get [dartx.persistentStorage]() {
      return this.webkitPersistentStorage;
    }
    get [dartx.temporaryStorage]() {
      return this.webkitTemporaryStorage;
    }
    [dartx.getBattery](...args) {
      return this.getBattery.apply(this, args);
    }
    [dartx.getGamepads](...args) {
      return this.getGamepads.apply(this, args);
    }
    [dartx.getVRDevices](...args) {
      return this.getVRDevices.apply(this, args);
    }
    [dartx.registerProtocolHandler](...args) {
      return this.registerProtocolHandler.apply(this, args);
    }
    [dartx.requestMidiAccess](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_requestMidiAccess_1](options_1);
      }
      return this[_requestMidiAccess_2]();
    }
    [_requestMidiAccess_1](...args) {
      return this.requestMIDIAccess.apply(this, args);
    }
    [_requestMidiAccess_2](...args) {
      return this.requestMIDIAccess.apply(this, args);
    }
    [dartx.requestMediaKeySystemAccess](...args) {
      return this.requestMediaKeySystemAccess.apply(this, args);
    }
    [dartx.sendBeacon](...args) {
      return this.sendBeacon.apply(this, args);
    }
    get [dartx.hardwareConcurrency]() {
      return this.hardwareConcurrency;
    }
    get [dartx.appCodeName]() {
      return this.appCodeName;
    }
    get [dartx.appName]() {
      return this.appName;
    }
    get [dartx.appVersion]() {
      return this.appVersion;
    }
    get [dartx.dartEnabled]() {
      return this.dartEnabled;
    }
    get [dartx.platform]() {
      return this.platform;
    }
    get [dartx.product]() {
      return this.product;
    }
    get [dartx.userAgent]() {
      return this.userAgent;
    }
    get [dartx.languages]() {
      return this.languages;
    }
    get [dartx.onLine]() {
      return this.onLine;
    }
    get [dartx.cookieEnabled]() {
      return this.cookieEnabled;
    }
    [dartx.getStorageUpdates](...args) {
      return this.getStorageUpdates.apply(this, args);
    }
  };
  html$.Navigator[dart.implements] = () => [html$.NavigatorStorageUtils, html$.NavigatorCpu, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorID];
  dart.setSignature(html$.Navigator, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Navigator, [])}),
    fields: () => ({
      [dartx.bluetooth]: html$.Bluetooth,
      [dartx.connection]: html$.NetworkInformation,
      [dartx.credentials]: html$.CredentialsContainer,
      [dartx.doNotTrack]: core.String,
      [dartx.geolocation]: html$.Geolocation,
      [dartx.maxTouchPoints]: core.int,
      [dartx.mediaDevices]: html$.MediaDevices,
      [dartx.mimeTypes]: html$.MimeTypeArray,
      [dartx.permissions]: html$.Permissions,
      [dartx.presentation]: html$.Presentation,
      [dartx.productSub]: core.String,
      [dartx.serviceWorker]: html$.ServiceWorkerContainer,
      [dartx.services]: html$.ServicePortCollection,
      [dartx.storageQuota]: html$.StorageQuota,
      [dartx.vendor]: core.String,
      [dartx.vendorSub]: core.String,
      [dartx.persistentStorage]: html$.DeprecatedStorageQuota,
      [dartx.temporaryStorage]: html$.DeprecatedStorageQuota,
      [dartx.hardwareConcurrency]: core.int,
      [dartx.appCodeName]: core.String,
      [dartx.appName]: core.String,
      [dartx.appVersion]: core.String,
      [dartx.dartEnabled]: core.bool,
      [dartx.platform]: core.String,
      [dartx.product]: core.String,
      [dartx.userAgent]: core.String,
      [dartx.languages]: ListOfString(),
      [dartx.onLine]: core.bool,
      [dartx.cookieEnabled]: core.bool
    }),
    getters: () => ({[dartx.language]: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({
      [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
      [_ensureGetUserMedia]: dart.definiteFunctionType(dart.dynamic, []),
      [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$._NavigatorUserMediaSuccessCallback, html$._NavigatorUserMediaErrorCallback]),
      [dartx.getBattery]: dart.definiteFunctionType(async.Future, []),
      [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html$.Gamepad), []),
      [dartx.getVRDevices]: dart.definiteFunctionType(async.Future, []),
      [dartx.registerProtocolHandler]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.requestMidiAccess]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_requestMidiAccess_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_requestMidiAccess_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.requestMediaKeySystemAccess]: dart.definiteFunctionType(async.Future, [core.String, ListOfMap()]),
      [dartx.sendBeacon]: dart.definiteFunctionType(core.bool, [core.String, core.Object]),
      [dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.Navigator, html$.Navigator);
  dart.defineExtensionNames([
    'hardwareConcurrency'
  ]);
  html$.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get hardwareConcurrency() {
      return this[hardwareConcurrency];
    }
    set hardwareConcurrency(value) {
      super.hardwareConcurrency = value;
    }
  };
  const hardwareConcurrency = Symbol(html$.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
  dart.setSignature(html$.NavigatorCpu, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorCpu, [])}),
    fields: () => ({hardwareConcurrency: core.int})
  });
  dart.defineExtensionMembers(html$.NavigatorCpu, ['hardwareConcurrency']);
  dart.defineExtensionNames([
    'appCodeName',
    'appName',
    'appVersion',
    'dartEnabled',
    'platform',
    'product',
    'userAgent'
  ]);
  html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get appCodeName() {
      return this[appCodeName];
    }
    set appCodeName(value) {
      super.appCodeName = value;
    }
    get appName() {
      return this[appName];
    }
    set appName(value) {
      super.appName = value;
    }
    get appVersion() {
      return this[appVersion];
    }
    set appVersion(value) {
      super.appVersion = value;
    }
    get dartEnabled() {
      return this[dartEnabled];
    }
    set dartEnabled(value) {
      super.dartEnabled = value;
    }
    get platform() {
      return this[platform];
    }
    set platform(value) {
      super.platform = value;
    }
    get product() {
      return this[product];
    }
    set product(value) {
      super.product = value;
    }
    get userAgent() {
      return this[userAgent];
    }
    set userAgent(value) {
      super.userAgent = value;
    }
  };
  const appCodeName = Symbol(html$.NavigatorID.name + "." + 'appCodeName'.toString());
  const appName = Symbol(html$.NavigatorID.name + "." + 'appName'.toString());
  const appVersion = Symbol(html$.NavigatorID.name + "." + 'appVersion'.toString());
  const dartEnabled = Symbol(html$.NavigatorID.name + "." + 'dartEnabled'.toString());
  const platform = Symbol(html$.NavigatorID.name + "." + 'platform'.toString());
  const product = Symbol(html$.NavigatorID.name + "." + 'product'.toString());
  const userAgent = Symbol(html$.NavigatorID.name + "." + 'userAgent'.toString());
  dart.setSignature(html$.NavigatorID, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorID, [])}),
    fields: () => ({
      appCodeName: core.String,
      appName: core.String,
      appVersion: core.String,
      dartEnabled: core.bool,
      platform: core.String,
      product: core.String,
      userAgent: core.String
    })
  });
  dart.defineExtensionMembers(html$.NavigatorID, [
    'appCodeName',
    'appName',
    'appVersion',
    'dartEnabled',
    'platform',
    'product',
    'userAgent'
  ]);
  dart.defineExtensionNames([
    'language',
    'languages'
  ]);
  html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get language() {
      return this[language];
    }
    set language(value) {
      super.language = value;
    }
    get languages() {
      return this[languages];
    }
    set languages(value) {
      super.languages = value;
    }
  };
  const language = Symbol(html$.NavigatorLanguage.name + "." + 'language'.toString());
  const languages = Symbol(html$.NavigatorLanguage.name + "." + 'languages'.toString());
  dart.setSignature(html$.NavigatorLanguage, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorLanguage, [])}),
    fields: () => ({
      language: core.String,
      languages: ListOfString()
    })
  });
  dart.defineExtensionMembers(html$.NavigatorLanguage, ['language', 'languages']);
  dart.defineExtensionNames([
    'onLine'
  ]);
  html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onLine() {
      return this[onLine];
    }
    set onLine(value) {
      super.onLine = value;
    }
  };
  const onLine = Symbol(html$.NavigatorOnLine.name + "." + 'onLine'.toString());
  dart.setSignature(html$.NavigatorOnLine, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorOnLine, [])}),
    fields: () => ({onLine: core.bool})
  });
  dart.defineExtensionMembers(html$.NavigatorOnLine, ['onLine']);
  dart.defineExtensionNames([
    'getStorageUpdates',
    'cookieEnabled'
  ]);
  html$.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cookieEnabled]() {
      return this.cookieEnabled;
    }
    [dartx.getStorageUpdates](...args) {
      return this.getStorageUpdates.apply(this, args);
    }
  };
  dart.setSignature(html$.NavigatorStorageUtils, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorStorageUtils, [])}),
    fields: () => ({[dartx.cookieEnabled]: core.bool}),
    methods: () => ({[dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])})
  });
  dart.registerExtension(dart.global.NavigatorStorageUtils, html$.NavigatorStorageUtils);
  dart.defineExtensionNames([
    'constraintName',
    'message',
    'name'
  ]);
  html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.constraintName]() {
      return this.constraintName;
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.name]() {
      return this.name;
    }
  };
  dart.setSignature(html$.NavigatorUserMediaError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorUserMediaError, [])}),
    fields: () => ({
      [dartx.constraintName]: core.String,
      [dartx.message]: core.String,
      [dartx.name]: core.String
    })
  });
  dart.registerExtension(dart.global.NavigatorUserMediaError, html$.NavigatorUserMediaError);
  html$._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html$.NavigatorUserMediaError]));
  html$._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html$.MediaStream]));
  dart.defineExtensionNames([
    'type'
  ]);
  html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.NetworkInformation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NetworkInformation, [])}),
    fields: () => ({[dartx.type]: core.String})
  });
  dart.registerExtension(dart.global.NetworkInformation, html$.NetworkInformation);
  html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
    new(this$) {
      this[_this] = this$;
    }
    get first() {
      let result = this[_this].firstChild;
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get last() {
      let result = this[_this].lastChild;
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get single() {
      let l = this.length;
      if (l == 0) dart.throw(new core.StateError("No elements"));
      if (dart.notNull(l) > 1) dart.throw(new core.StateError("More than one element"));
      return this[_this].firstChild;
    }
    add(value) {
      this[_this][dartx.append](value);
    }
    addAll(iterable) {
      if (html$._ChildNodeListLazy.is(iterable)) {
        let otherList = iterable;
        if (!core.identical(otherList[_this], this[_this])) {
          for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
            this[_this][dartx.append](otherList[_this][dartx.firstChild]);
          }
        }
        return;
      }
      for (let node of iterable) {
        this[_this][dartx.append](node);
      }
    }
    insert(index, node) {
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
      if (index == this.length) {
        this[_this][dartx.append](node);
      } else {
        this[_this][dartx.insertBefore](node, this._get(index));
      }
    }
    insertAll(index, iterable) {
      if (index == this.length) {
        this.addAll(iterable);
      } else {
        let item = this._get(index);
        this[_this][dartx.insertAllBefore](iterable, item);
      }
    }
    setAll(index, iterable) {
      dart.throw(new core.UnsupportedError("Cannot setAll on Node list"));
    }
    removeLast() {
      let result = this.last;
      if (result != null) {
        this[_this][_removeChild](result);
      }
      return result;
    }
    removeAt(index) {
      let result = this._get(index);
      if (result != null) {
        this[_this][_removeChild](result);
      }
      return result;
    }
    remove(object) {
      if (!html$.Node.is(object)) return false;
      let node = html$.Node._check(object);
      if (!core.identical(this[_this], node[dartx.parentNode])) return false;
      this[_this][_removeChild](node);
      return true;
    }
    [_filter$0](test, removeMatching) {
      let child = this[_this][dartx.firstChild];
      while (child != null) {
        let nextChild = child[dartx.nextNode];
        if (test(child) == removeMatching) {
          this[_this][_removeChild](child);
        }
        child = nextChild;
      }
    }
    removeWhere(test) {
      this[_filter$0](test, true);
    }
    retainWhere(test) {
      this[_filter$0](test, false);
    }
    clear() {
      this[_this][_clearChildren]();
    }
    _set(index, value) {
      this[_this][_replaceChild](value, this._get(index));
      return value;
    }
    get iterator() {
      return this[_this][dartx.childNodes][dartx.iterator];
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError("Cannot sort Node list"));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError("Cannot shuffle Node list"));
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError("Cannot setRange on Node list"));
    }
    fillRange(start, end, fill) {
      if (fill === void 0) fill = null;
      dart.throw(new core.UnsupportedError("Cannot fillRange on Node list"));
    }
    get length() {
      return this[_this][dartx.childNodes][dartx.length];
    }
    set length(value) {
      dart.throw(new core.UnsupportedError("Cannot set length on immutable List."));
    }
    _get(index) {
      return this[_this][dartx.childNodes][dartx._get](index);
    }
    get rawList() {
      return this[_this][dartx.childNodes];
    }
  };
  dart.addSimpleTypeTests(html$._ChildNodeListLazy);
  html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(html$._ChildNodeListLazy, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ChildNodeListLazy, [html$.Node])}),
    fields: () => ({[_this]: html$.Node}),
    getters: () => ({
      first: dart.definiteFunctionType(html$.Node, []),
      last: dart.definiteFunctionType(html$.Node, []),
      single: dart.definiteFunctionType(html$.Node, []),
      iterator: dart.definiteFunctionType(core.Iterator$(html$.Node), []),
      length: dart.definiteFunctionType(core.int, []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [html$.Node]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfNode()]),
      insert: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfNode()]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfNode()]),
      removeLast: dart.definiteFunctionType(html$.Node, []),
      removeAt: dart.definiteFunctionType(html$.Node, [core.int]),
      [_filter$0]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
      removeWhere: dart.definiteFunctionType(dart.void, [NodeTobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [NodeTobool()]),
      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfNode()]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfNode()], [core.int]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.Node]),
      _get: dart.definiteFunctionType(html$.Node, [core.int])
    })
  });
  dart.defineExtensionMembers(html$._ChildNodeListLazy, [
    'add',
    'addAll',
    'insert',
    'insertAll',
    'setAll',
    'removeLast',
    'removeAt',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    '_set',
    'sort',
    'shuffle',
    'setRange',
    'fillRange',
    '_get',
    'first',
    'last',
    'single',
    'iterator',
    'length',
    'length'
  ]);
  html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.NodeFilter, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NodeFilter, [])}),
    sfields: () => ({
      FILTER_ACCEPT: core.int,
      FILTER_REJECT: core.int,
      FILTER_SKIP: core.int,
      SHOW_ALL: core.int,
      SHOW_COMMENT: core.int,
      SHOW_DOCUMENT: core.int,
      SHOW_DOCUMENT_FRAGMENT: core.int,
      SHOW_DOCUMENT_TYPE: core.int,
      SHOW_ELEMENT: core.int,
      SHOW_PROCESSING_INSTRUCTION: core.int,
      SHOW_TEXT: core.int
    })
  });
  html$.NodeFilter.FILTER_ACCEPT = 1;
  html$.NodeFilter.FILTER_REJECT = 2;
  html$.NodeFilter.FILTER_SKIP = 3;
  html$.NodeFilter.SHOW_ALL = 4294967295;
  html$.NodeFilter.SHOW_COMMENT = 128;
  html$.NodeFilter.SHOW_DOCUMENT = 256;
  html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
  html$.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
  html$.NodeFilter.SHOW_ELEMENT = 1;
  html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
  html$.NodeFilter.SHOW_TEXT = 4;
  dart.registerExtension(dart.global.NodeFilter, html$.NodeFilter);
  dart.defineExtensionNames([
    'detach',
    'nextNode',
    'previousNode',
    'pointerBeforeReferenceNode',
    'referenceNode',
    'root',
    'whatToShow'
  ]);
  html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
    static new(root, whatToShow) {
      return html$.document[_createNodeIterator](root, whatToShow, null);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.pointerBeforeReferenceNode]() {
      return this.pointerBeforeReferenceNode;
    }
    get [dartx.referenceNode]() {
      return this.referenceNode;
    }
    get [dartx.root]() {
      return this.root;
    }
    get [dartx.whatToShow]() {
      return this.whatToShow;
    }
    [dartx.detach](...args) {
      return this.detach.apply(this, args);
    }
    [dartx.nextNode](...args) {
      return this.nextNode.apply(this, args);
    }
    [dartx.previousNode](...args) {
      return this.previousNode.apply(this, args);
    }
  };
  dart.setSignature(html$.NodeIterator, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.NodeIterator, [html$.Node, core.int]),
      _: dart.definiteFunctionType(html$.NodeIterator, [])
    }),
    fields: () => ({
      [dartx.pointerBeforeReferenceNode]: core.bool,
      [dartx.referenceNode]: html$.Node,
      [dartx.root]: html$.Node,
      [dartx.whatToShow]: core.int
    }),
    methods: () => ({
      [dartx.detach]: dart.definiteFunctionType(dart.void, []),
      [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.previousNode]: dart.definiteFunctionType(html$.Node, [])
    })
  });
  dart.registerExtension(dart.global.NodeIterator, html$.NodeIterator);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt'
  ]);
  html$.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [_item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
  dart.setSignature(html$.NodeList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NodeList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Node, []),
      [dartx.last]: dart.definiteFunctionType(html$.Node, []),
      [dartx.single]: dart.definiteFunctionType(html$.Node, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Node, [core.int]),
      [_item]: dart.definiteFunctionType(html$.Node, [core.int])
    })
  });
  dart.registerExtension(dart.global.NodeList, html$.NodeList);
  dart.registerExtension(dart.global.RadioNodeList, html$.NodeList);
  dart.defineExtensionNames([
    'nextElementSibling',
    'previousElementSibling'
  ]);
  html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.nextElementSibling]() {
      return this.nextElementSibling;
    }
    get [dartx.previousElementSibling]() {
      return this.previousElementSibling;
    }
  };
  dart.setSignature(html$.NonDocumentTypeChildNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NonDocumentTypeChildNode, [])}),
    fields: () => ({
      [dartx.nextElementSibling]: html$.Element,
      [dartx.previousElementSibling]: html$.Element
    })
  });
  dart.registerExtension(dart.global.NonDocumentTypeChildNode, html$.NonDocumentTypeChildNode);
  dart.defineExtensionNames([
    'getElementById'
  ]);
  html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
  };
  dart.setSignature(html$.NonElementParentNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NonElementParentNode, [])}),
    methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String])})
  });
  dart.registerExtension(dart.global.NonElementParentNode, html$.NonElementParentNode);
  dart.defineExtensionNames([
    'close',
    'onClick',
    'onClose',
    'onError',
    'onShow',
    'body',
    'data',
    'dir',
    'icon',
    'lang',
    'permission',
    'silent',
    'tag',
    'title',
    'vibrate'
  ]);
  html$.Notification = class Notification extends html$.EventTarget {
    static new(title, opts) {
      let dir = opts && 'dir' in opts ? opts.dir : null;
      let body = opts && 'body' in opts ? opts.body : null;
      let lang = opts && 'lang' in opts ? opts.lang : null;
      let tag = opts && 'tag' in opts ? opts.tag : null;
      let icon = opts && 'icon' in opts ? opts.icon : null;
      let parsedOptions = dart.map();
      if (dir != null) parsedOptions[dartx._set]('dir', dir);
      if (body != null) parsedOptions[dartx._set]('body', body);
      if (lang != null) parsedOptions[dartx._set]('lang', lang);
      if (tag != null) parsedOptions[dartx._set]('tag', tag);
      if (icon != null) parsedOptions[dartx._set]('icon', icon);
      return html$.Notification._factoryNotification(title, parsedOptions);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static _factoryNotification(title, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return html$.Notification._create_1(title, options_1);
      }
      return html$.Notification._create_2(title);
    }
    static _create_1(title, options) {
      return new Notification(title, options);
    }
    static _create_2(title) {
      return new Notification(title);
    }
    static get supported() {
      return !!window.Notification;
    }
    get [dartx.body]() {
      return this.body;
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.dir]() {
      return this.dir;
    }
    get [dartx.icon]() {
      return this.icon;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    get [dartx.permission]() {
      return this.permission;
    }
    get [dartx.silent]() {
      return this.silent;
    }
    get [dartx.tag]() {
      return this.tag;
    }
    get [dartx.title]() {
      return this.title;
    }
    get [dartx.vibrate]() {
      return this.vibrate;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    static requestPermission() {
      let completer = CompleterOfString().new();
      html$.Notification._requestPermission(dart.fn(value => {
        completer.complete(value);
      }, StringTovoid$()));
      return completer.future;
    }
    get [dartx.onClick]() {
      return html$.Notification.clickEvent.forTarget(this);
    }
    get [dartx.onClose]() {
      return html$.Notification.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.Notification.errorEvent.forTarget(this);
    }
    get [dartx.onShow]() {
      return html$.Notification.showEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.Notification, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
      _: dart.definiteFunctionType(html$.Notification, [])
    }),
    fields: () => ({
      [dartx.body]: core.String,
      [dartx.data]: core.Object,
      [dartx.dir]: core.String,
      [dartx.icon]: core.String,
      [dartx.lang]: core.String,
      [dartx.permission]: core.String,
      [dartx.silent]: core.bool,
      [dartx.tag]: core.String,
      [dartx.title]: core.String,
      [dartx.vibrate]: ListOfint()
    }),
    getters: () => ({
      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
    sfields: () => ({
      clickEvent: EventStreamProviderOfEvent(),
      closeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      showEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _factoryNotification: dart.definiteFunctionType(html$.Notification, [core.String], [core.Map]),
      _create_1: dart.definiteFunctionType(html$.Notification, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.Notification, [dart.dynamic]),
      _requestPermission: dart.definiteFunctionType(dart.void, [], [html$._NotificationPermissionCallback]),
      requestPermission: dart.definiteFunctionType(async.Future$(core.String), [])
    }),
    names: ['_factoryNotification', '_create_1', '_create_2', '_requestPermission', 'requestPermission']
  });
  dart.defineLazy(html$.Notification, {
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('click'));
    },
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get showEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('show'));
    }
  });
  dart.registerExtension(dart.global.Notification, html$.Notification);
  dart.defineExtensionNames([
    'notification'
  ]);
  html$.NotificationEvent = class NotificationEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.NotificationEvent._create_1(type, eventInitDict_1);
      }
      return html$.NotificationEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new NotificationEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new NotificationEvent(type);
    }
    get [dartx.notification]() {
      return this.notification;
    }
  };
  dart.setSignature(html$.NotificationEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.NotificationEvent, []),
      new: dart.definiteFunctionType(html$.NotificationEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.notification]: html$.Notification}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.NotificationEvent, html$.NotificationEvent);
  html$._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
  dart.defineExtensionNames([
    'reversed',
    'start',
    'type'
  ]);
  html$.OListElement = class OListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.OListElement._check(html$.document[dartx.createElement]("ol"));
    }
    created() {
      this[dartx.reversed] = null;
      this[dartx.start] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.reversed]() {
      return this.reversed;
    }
    set [dartx.reversed](value) {
      this.reversed = value;
    }
    get [dartx.start]() {
      return this.start;
    }
    set [dartx.start](value) {
      this.start = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.OListElement, 'created');
  dart.setSignature(html$.OListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.OListElement, []),
      new: dart.definiteFunctionType(html$.OListElement, []),
      created: dart.definiteFunctionType(html$.OListElement, [])
    }),
    fields: () => ({
      [dartx.reversed]: core.bool,
      [dartx.start]: core.int,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLOListElement, html$.OListElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'data',
    'form',
    'height',
    'name',
    'type',
    'useMap',
    'validationMessage',
    'validity',
    'width',
    'willValidate'
  ]);
  html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ObjectElement._check(html$.document[dartx.createElement]("object"));
    }
    created() {
      this[dartx.data] = null;
      this[dartx.form] = null;
      this[dartx.height] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.useMap] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.width] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('object');
    }
    get [dartx.data]() {
      return this.data;
    }
    set [dartx.data](value) {
      this.data = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.useMap]() {
      return this.useMap;
    }
    set [dartx.useMap](value) {
      this.useMap = value;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ObjectElement, 'created');
  dart.setSignature(html$.ObjectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ObjectElement, []),
      new: dart.definiteFunctionType(html$.ObjectElement, []),
      created: dart.definiteFunctionType(html$.ObjectElement, [])
    }),
    fields: () => ({
      [dartx.data]: core.String,
      [dartx.form]: html$.FormElement,
      [dartx.height]: core.String,
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.useMap]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.width]: core.String,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLObjectElement, html$.ObjectElement);
  dart.defineExtensionNames([
    'disabled',
    'label'
  ]);
  html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.OptGroupElement._check(html$.document[dartx.createElement]("optgroup"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.label] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
  };
  dart.defineNamedConstructor(html$.OptGroupElement, 'created');
  dart.setSignature(html$.OptGroupElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.OptGroupElement, []),
      new: dart.definiteFunctionType(html$.OptGroupElement, []),
      created: dart.definiteFunctionType(html$.OptGroupElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.label]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLOptGroupElement, html$.OptGroupElement);
  dart.defineExtensionNames([
    'defaultSelected',
    'disabled',
    'form',
    'index',
    'label',
    'selected',
    'value'
  ]);
  html$.OptionElement = class OptionElement extends html$.HtmlElement {
    static new(opts) {
      let data = opts && 'data' in opts ? opts.data : '';
      let value = opts && 'value' in opts ? opts.value : '';
      let selected = opts && 'selected' in opts ? opts.selected : false;
      return html$.OptionElement._(data, value, null, selected);
    }
    static _(data, value, defaultSelected, selected) {
      if (data === void 0) data = null;
      if (value === void 0) value = null;
      if (defaultSelected === void 0) defaultSelected = null;
      if (selected === void 0) selected = null;
      if (selected != null) {
        return html$.OptionElement._create_1(data, value, defaultSelected, selected);
      }
      if (defaultSelected != null) {
        return html$.OptionElement._create_2(data, value, defaultSelected);
      }
      if (value != null) {
        return html$.OptionElement._create_3(data, value);
      }
      if (data != null) {
        return html$.OptionElement._create_4(data);
      }
      return html$.OptionElement._create_5();
    }
    static _create_1(data, value, defaultSelected, selected) {
      return new Option(data, value, defaultSelected, selected);
    }
    static _create_2(data, value, defaultSelected) {
      return new Option(data, value, defaultSelected);
    }
    static _create_3(data, value) {
      return new Option(data, value);
    }
    static _create_4(data) {
      return new Option(data);
    }
    static _create_5() {
      return new Option();
    }
    created() {
      this[dartx.defaultSelected] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.index] = null;
      this[dartx.label] = null;
      this[dartx.selected] = null;
      this[dartx.value] = null;
      super.created();
    }
    get [dartx.defaultSelected]() {
      return this.defaultSelected;
    }
    set [dartx.defaultSelected](value) {
      this.defaultSelected = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.index]() {
      return this.index;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.selected]() {
      return this.selected;
    }
    set [dartx.selected](value) {
      this.selected = value;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.OptionElement, 'created');
  dart.setSignature(html$.OptionElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
      _: dart.definiteFunctionType(html$.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
      created: dart.definiteFunctionType(html$.OptionElement, [])
    }),
    fields: () => ({
      [dartx.defaultSelected]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.index]: core.int,
      [dartx.label]: core.String,
      [dartx.selected]: core.bool,
      [dartx.value]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$.OptionElement, [])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
  });
  dart.registerExtension(dart.global.HTMLOptionElement, html$.OptionElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'defaultValue',
    'form',
    'htmlFor',
    'labels',
    'name',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate'
  ]);
  html$.OutputElement = class OutputElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.OutputElement._check(html$.document[dartx.createElement]("output"));
    }
    created() {
      this[dartx.defaultValue] = null;
      this[dartx.form] = null;
      this[dartx.htmlFor] = null;
      this[dartx.labels] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('output');
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    set [dartx.defaultValue](value) {
      this.defaultValue = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.htmlFor]() {
      return this.htmlFor;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.OutputElement, 'created');
  dart.setSignature(html$.OutputElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.OutputElement, []),
      new: dart.definiteFunctionType(html$.OutputElement, []),
      created: dart.definiteFunctionType(html$.OutputElement, [])
    }),
    fields: () => ({
      [dartx.defaultValue]: core.String,
      [dartx.form]: html$.FormElement,
      [dartx.htmlFor]: html$.DomSettableTokenList,
      [dartx.labels]: ListOfNode(),
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLOutputElement, html$.OutputElement);
  dart.defineExtensionNames([
    'persisted'
  ]);
  html$.PageTransitionEvent = class PageTransitionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
      }
      return html$.PageTransitionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PageTransitionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PageTransitionEvent(type);
    }
    get [dartx.persisted]() {
      return this.persisted;
    }
  };
  dart.setSignature(html$.PageTransitionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PageTransitionEvent, []),
      new: dart.definiteFunctionType(html$.PageTransitionEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.persisted]: core.bool}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PageTransitionEvent, html$.PageTransitionEvent);
  html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ParagraphElement._check(html$.document[dartx.createElement]("p"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.ParagraphElement, 'created');
  dart.setSignature(html$.ParagraphElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ParagraphElement, []),
      new: dart.definiteFunctionType(html$.ParagraphElement, []),
      created: dart.definiteFunctionType(html$.ParagraphElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLParagraphElement, html$.ParagraphElement);
  dart.defineExtensionNames([
    'name',
    'value'
  ]);
  html$.ParamElement = class ParamElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ParamElement._check(html$.document[dartx.createElement]("param"));
    }
    created() {
      this[dartx.name] = null;
      this[dartx.value] = null;
      super.created();
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.ParamElement, 'created');
  dart.setSignature(html$.ParamElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ParamElement, []),
      new: dart.definiteFunctionType(html$.ParamElement, []),
      created: dart.definiteFunctionType(html$.ParamElement, [])
    }),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.value]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLParamElement, html$.ParamElement);
  html$.ParentNode = class ParentNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.ParentNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ParentNode, [])}),
    fields: () => ({
      [_childElementCount]: core.int,
      [_children]: ListOfNode(),
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    })
  });
  dart.defineExtensionNames([
    'formData',
    'password'
  ]);
  html$.PasswordCredential = class PasswordCredential extends html$.Credential {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(id, password, name, iconURL) {
      if (name === void 0) name = null;
      if (iconURL === void 0) iconURL = null;
      if (iconURL != null) {
        return html$.PasswordCredential._create_1(id, password, name, iconURL);
      }
      if (name != null) {
        return html$.PasswordCredential._create_2(id, password, name);
      }
      return html$.PasswordCredential._create_3(id, password);
    }
    static _create_1(id, password, name, iconURL) {
      return new PasswordCredential(id, password, name, iconURL);
    }
    static _create_2(id, password, name) {
      return new PasswordCredential(id, password, name);
    }
    static _create_3(id, password) {
      return new PasswordCredential(id, password);
    }
    get [dartx.formData]() {
      return this.formData;
    }
    get [dartx.password]() {
      return this.password;
    }
  };
  dart.setSignature(html$.PasswordCredential, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PasswordCredential, []),
      new: dart.definiteFunctionType(html$.PasswordCredential, [core.String, core.String], [core.String, core.String])
    }),
    fields: () => ({
      [dartx.formData]: html$.FormData,
      [dartx.password]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.PasswordCredential, html$.PasswordCredential);
  dart.defineExtensionNames([
    'addPath',
    'arc',
    'arcTo',
    'bezierCurveTo',
    'closePath',
    'ellipse',
    'lineTo',
    'moveTo',
    'quadraticCurveTo',
    'rect'
  ]);
  html$.Path2D = class Path2D extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(path_OR_text) {
      if (path_OR_text === void 0) path_OR_text = null;
      if (path_OR_text == null) {
        return html$.Path2D._create_1();
      }
      if (html$.Path2D.is(path_OR_text) || path_OR_text == null) {
        return html$.Path2D._create_2(path_OR_text);
      }
      if (typeof path_OR_text == 'string' || path_OR_text == null) {
        return html$.Path2D._create_3(path_OR_text);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new Path2D();
    }
    static _create_2(path_OR_text) {
      return new Path2D(path_OR_text);
    }
    static _create_3(path_OR_text) {
      return new Path2D(path_OR_text);
    }
    [dartx.addPath](...args) {
      return this.addPath.apply(this, args);
    }
    [dartx.arc](...args) {
      return this.arc.apply(this, args);
    }
    [dartx.arcTo](...args) {
      return this.arcTo.apply(this, args);
    }
    [dartx.bezierCurveTo](...args) {
      return this.bezierCurveTo.apply(this, args);
    }
    [dartx.closePath](...args) {
      return this.closePath.apply(this, args);
    }
    [dartx.ellipse](...args) {
      return this.ellipse.apply(this, args);
    }
    [dartx.lineTo](...args) {
      return this.lineTo.apply(this, args);
    }
    [dartx.moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.quadraticCurveTo](...args) {
      return this.quadraticCurveTo.apply(this, args);
    }
    [dartx.rect](...args) {
      return this.rect.apply(this, args);
    }
  };
  html$.Path2D[dart.implements] = () => [html$._CanvasPathMethods];
  dart.setSignature(html$.Path2D, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Path2D, []),
      new: dart.definiteFunctionType(html$.Path2D, [], [dart.dynamic])
    }),
    methods: () => ({
      [dartx.addPath]: dart.definiteFunctionType(dart.void, [html$.Path2D], [svg$.Matrix]),
      [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
      [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
      [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.Path2D, []),
      _create_2: dart.definiteFunctionType(html$.Path2D, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.Path2D, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.Path2D, html$.Path2D);
  dart.defineExtensionNames([
    'clearFrameTimings',
    'clearMarks',
    'clearMeasures',
    'getEntries',
    'getEntriesByName',
    'getEntriesByType',
    'mark',
    'measure',
    'now',
    'setFrameTimingBufferSize',
    'clearResourceTimings',
    'setResourceTimingBufferSize',
    'onResourceTimingBufferFull',
    'memory',
    'navigation',
    'timing'
  ]);
  html$.Performance = class Performance extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.performance;
    }
    get [dartx.memory]() {
      return this.memory;
    }
    get [dartx.navigation]() {
      return this.navigation;
    }
    get [dartx.timing]() {
      return this.timing;
    }
    [dartx.clearFrameTimings](...args) {
      return this.clearFrameTimings.apply(this, args);
    }
    [dartx.clearMarks](...args) {
      return this.clearMarks.apply(this, args);
    }
    [dartx.clearMeasures](...args) {
      return this.clearMeasures.apply(this, args);
    }
    [dartx.getEntries](...args) {
      return this.getEntries.apply(this, args);
    }
    [dartx.getEntriesByName](...args) {
      return this.getEntriesByName.apply(this, args);
    }
    [dartx.getEntriesByType](...args) {
      return this.getEntriesByType.apply(this, args);
    }
    [dartx.mark](...args) {
      return this.mark.apply(this, args);
    }
    [dartx.measure](...args) {
      return this.measure.apply(this, args);
    }
    [dartx.now](...args) {
      return this.now.apply(this, args);
    }
    [dartx.setFrameTimingBufferSize](...args) {
      return this.setFrameTimingBufferSize.apply(this, args);
    }
    [dartx.clearResourceTimings](...args) {
      return this.webkitClearResourceTimings.apply(this, args);
    }
    [dartx.setResourceTimingBufferSize](...args) {
      return this.webkitSetResourceTimingBufferSize.apply(this, args);
    }
    get [dartx.onResourceTimingBufferFull]() {
      return html$.Performance.resourceTimingBufferFullEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.Performance, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Performance, [])}),
    fields: () => ({
      [dartx.memory]: html$.MemoryInfo,
      [dartx.navigation]: html$.PerformanceNavigation,
      [dartx.timing]: html$.PerformanceTiming
    }),
    getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.clearFrameTimings]: dart.definiteFunctionType(dart.void, []),
      [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
      [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
      [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
      [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.now]: dart.definiteFunctionType(core.double, []),
      [dartx.setFrameTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
      [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
    }),
    sfields: () => ({resourceTimingBufferFullEvent: EventStreamProviderOfEvent()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineLazy(html$.Performance, {
    get resourceTimingBufferFullEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('webkitresourcetimingbufferfull'));
    }
  });
  dart.registerExtension(dart.global.Performance, html$.Performance);
  dart.defineExtensionNames([
    'duration',
    'entryType',
    'name',
    'startTime'
  ]);
  html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.entryType]() {
      return this.entryType;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.startTime]() {
      return this.startTime;
    }
  };
  dart.setSignature(html$.PerformanceEntry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceEntry, [])}),
    fields: () => ({
      [dartx.duration]: core.double,
      [dartx.entryType]: core.String,
      [dartx.name]: core.String,
      [dartx.startTime]: core.double
    })
  });
  dart.registerExtension(dart.global.PerformanceEntry, html$.PerformanceEntry);
  dart.defineExtensionNames([
    'sourceFrame'
  ]);
  html$.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sourceFrame]() {
      return this.sourceFrame;
    }
  };
  dart.setSignature(html$.PerformanceCompositeTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceCompositeTiming, [])}),
    fields: () => ({[dartx.sourceFrame]: core.int})
  });
  dart.registerExtension(dart.global.PerformanceCompositeTiming, html$.PerformanceCompositeTiming);
  html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.PerformanceMark, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMark, [])})
  });
  dart.registerExtension(dart.global.PerformanceMark, html$.PerformanceMark);
  html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.PerformanceMeasure, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMeasure, [])})
  });
  dart.registerExtension(dart.global.PerformanceMeasure, html$.PerformanceMeasure);
  dart.defineExtensionNames([
    'redirectCount',
    'type'
  ]);
  html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.redirectCount]() {
      return this.redirectCount;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.PerformanceNavigation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceNavigation, [])}),
    fields: () => ({
      [dartx.redirectCount]: core.int,
      [dartx.type]: core.int
    }),
    sfields: () => ({
      TYPE_BACK_FORWARD: core.int,
      TYPE_NAVIGATE: core.int,
      TYPE_RELOAD: core.int,
      TYPE_RESERVED: core.int
    })
  });
  html$.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
  html$.PerformanceNavigation.TYPE_NAVIGATE = 0;
  html$.PerformanceNavigation.TYPE_RELOAD = 1;
  html$.PerformanceNavigation.TYPE_RESERVED = 255;
  dart.registerExtension(dart.global.PerformanceNavigation, html$.PerformanceNavigation);
  dart.defineExtensionNames([
    'sourceFrame'
  ]);
  html$.PerformanceRenderTiming = class PerformanceRenderTiming extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sourceFrame]() {
      return this.sourceFrame;
    }
  };
  dart.setSignature(html$.PerformanceRenderTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceRenderTiming, [])}),
    fields: () => ({[dartx.sourceFrame]: core.int})
  });
  dart.registerExtension(dart.global.PerformanceRenderTiming, html$.PerformanceRenderTiming);
  dart.defineExtensionNames([
    'connectEnd',
    'connectStart',
    'domainLookupEnd',
    'domainLookupStart',
    'fetchStart',
    'initiatorType',
    'redirectEnd',
    'redirectStart',
    'requestStart',
    'responseEnd',
    'responseStart',
    'secureConnectionStart',
    'workerStart'
  ]);
  html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connectEnd]() {
      return this.connectEnd;
    }
    get [dartx.connectStart]() {
      return this.connectStart;
    }
    get [dartx.domainLookupEnd]() {
      return this.domainLookupEnd;
    }
    get [dartx.domainLookupStart]() {
      return this.domainLookupStart;
    }
    get [dartx.fetchStart]() {
      return this.fetchStart;
    }
    get [dartx.initiatorType]() {
      return this.initiatorType;
    }
    get [dartx.redirectEnd]() {
      return this.redirectEnd;
    }
    get [dartx.redirectStart]() {
      return this.redirectStart;
    }
    get [dartx.requestStart]() {
      return this.requestStart;
    }
    get [dartx.responseEnd]() {
      return this.responseEnd;
    }
    get [dartx.responseStart]() {
      return this.responseStart;
    }
    get [dartx.secureConnectionStart]() {
      return this.secureConnectionStart;
    }
    get [dartx.workerStart]() {
      return this.workerStart;
    }
  };
  dart.setSignature(html$.PerformanceResourceTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceResourceTiming, [])}),
    fields: () => ({
      [dartx.connectEnd]: core.double,
      [dartx.connectStart]: core.double,
      [dartx.domainLookupEnd]: core.double,
      [dartx.domainLookupStart]: core.double,
      [dartx.fetchStart]: core.double,
      [dartx.initiatorType]: core.String,
      [dartx.redirectEnd]: core.double,
      [dartx.redirectStart]: core.double,
      [dartx.requestStart]: core.double,
      [dartx.responseEnd]: core.double,
      [dartx.responseStart]: core.double,
      [dartx.secureConnectionStart]: core.double,
      [dartx.workerStart]: core.double
    })
  });
  dart.registerExtension(dart.global.PerformanceResourceTiming, html$.PerformanceResourceTiming);
  dart.defineExtensionNames([
    'connectEnd',
    'connectStart',
    'domComplete',
    'domContentLoadedEventEnd',
    'domContentLoadedEventStart',
    'domInteractive',
    'domLoading',
    'domainLookupEnd',
    'domainLookupStart',
    'fetchStart',
    'loadEventEnd',
    'loadEventStart',
    'navigationStart',
    'redirectEnd',
    'redirectStart',
    'requestStart',
    'responseEnd',
    'responseStart',
    'secureConnectionStart',
    'unloadEventEnd',
    'unloadEventStart'
  ]);
  html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connectEnd]() {
      return this.connectEnd;
    }
    get [dartx.connectStart]() {
      return this.connectStart;
    }
    get [dartx.domComplete]() {
      return this.domComplete;
    }
    get [dartx.domContentLoadedEventEnd]() {
      return this.domContentLoadedEventEnd;
    }
    get [dartx.domContentLoadedEventStart]() {
      return this.domContentLoadedEventStart;
    }
    get [dartx.domInteractive]() {
      return this.domInteractive;
    }
    get [dartx.domLoading]() {
      return this.domLoading;
    }
    get [dartx.domainLookupEnd]() {
      return this.domainLookupEnd;
    }
    get [dartx.domainLookupStart]() {
      return this.domainLookupStart;
    }
    get [dartx.fetchStart]() {
      return this.fetchStart;
    }
    get [dartx.loadEventEnd]() {
      return this.loadEventEnd;
    }
    get [dartx.loadEventStart]() {
      return this.loadEventStart;
    }
    get [dartx.navigationStart]() {
      return this.navigationStart;
    }
    get [dartx.redirectEnd]() {
      return this.redirectEnd;
    }
    get [dartx.redirectStart]() {
      return this.redirectStart;
    }
    get [dartx.requestStart]() {
      return this.requestStart;
    }
    get [dartx.responseEnd]() {
      return this.responseEnd;
    }
    get [dartx.responseStart]() {
      return this.responseStart;
    }
    get [dartx.secureConnectionStart]() {
      return this.secureConnectionStart;
    }
    get [dartx.unloadEventEnd]() {
      return this.unloadEventEnd;
    }
    get [dartx.unloadEventStart]() {
      return this.unloadEventStart;
    }
  };
  dart.setSignature(html$.PerformanceTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceTiming, [])}),
    fields: () => ({
      [dartx.connectEnd]: core.int,
      [dartx.connectStart]: core.int,
      [dartx.domComplete]: core.int,
      [dartx.domContentLoadedEventEnd]: core.int,
      [dartx.domContentLoadedEventStart]: core.int,
      [dartx.domInteractive]: core.int,
      [dartx.domLoading]: core.int,
      [dartx.domainLookupEnd]: core.int,
      [dartx.domainLookupStart]: core.int,
      [dartx.fetchStart]: core.int,
      [dartx.loadEventEnd]: core.int,
      [dartx.loadEventStart]: core.int,
      [dartx.navigationStart]: core.int,
      [dartx.redirectEnd]: core.int,
      [dartx.redirectStart]: core.int,
      [dartx.requestStart]: core.int,
      [dartx.responseEnd]: core.int,
      [dartx.responseStart]: core.int,
      [dartx.secureConnectionStart]: core.int,
      [dartx.unloadEventEnd]: core.int,
      [dartx.unloadEventStart]: core.int
    })
  });
  dart.registerExtension(dart.global.PerformanceTiming, html$.PerformanceTiming);
  dart.defineExtensionNames([
    'registration'
  ]);
  html$.PeriodicSyncEvent = class PeriodicSyncEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, init) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$.PeriodicSyncEvent._create_1(type, init_1);
    }
    static _create_1(type, init) {
      return new PeriodicSyncEvent(type, init);
    }
    get [dartx.registration]() {
      return this.registration;
    }
  };
  dart.setSignature(html$.PeriodicSyncEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PeriodicSyncEvent, []),
      new: dart.definiteFunctionType(html$.PeriodicSyncEvent, [core.String, core.Map])
    }),
    fields: () => ({[dartx.registration]: html$.PeriodicSyncRegistration}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.PeriodicSyncEvent, html$.PeriodicSyncEvent);
  const _register_1 = Symbol('_register_1');
  const _register_2 = Symbol('_register_2');
  dart.defineExtensionNames([
    'getRegistration',
    'getRegistrations',
    'permissionState',
    'register',
    'minPossiblePeriod'
  ]);
  html$.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.minPossiblePeriod]() {
      return this.minPossiblePeriod;
    }
    [dartx.getRegistration](...args) {
      return this.getRegistration.apply(this, args);
    }
    [dartx.getRegistrations](...args) {
      return this.getRegistrations.apply(this, args);
    }
    [dartx.permissionState](...args) {
      return this.permissionState.apply(this, args);
    }
    [dartx.register](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_register_1](options_1);
      }
      return this[_register_2]();
    }
    [_register_1](...args) {
      return this.register.apply(this, args);
    }
    [_register_2](...args) {
      return this.register.apply(this, args);
    }
  };
  dart.setSignature(html$.PeriodicSyncManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncManager, [])}),
    fields: () => ({[dartx.minPossiblePeriod]: core.int}),
    methods: () => ({
      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
      [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
      [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_register_2]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.PeriodicSyncManager, html$.PeriodicSyncManager);
  dart.defineExtensionNames([
    'unregister',
    'minPeriod',
    'networkState',
    'powerState',
    'tag'
  ]);
  html$.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.minPeriod]() {
      return this.minPeriod;
    }
    get [dartx.networkState]() {
      return this.networkState;
    }
    get [dartx.powerState]() {
      return this.powerState;
    }
    get [dartx.tag]() {
      return this.tag;
    }
    [dartx.unregister](...args) {
      return this.unregister.apply(this, args);
    }
  };
  dart.setSignature(html$.PeriodicSyncRegistration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncRegistration, [])}),
    fields: () => ({
      [dartx.minPeriod]: core.int,
      [dartx.networkState]: core.String,
      [dartx.powerState]: core.String,
      [dartx.tag]: core.String
    }),
    methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.PeriodicSyncRegistration, html$.PeriodicSyncRegistration);
  dart.defineExtensionNames([
    'onChange',
    'state',
    'status'
  ]);
  html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.state]() {
      return this.state;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.onChange]() {
      return html$.PermissionStatus.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.PermissionStatus, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PermissionStatus, [])}),
    fields: () => ({
      [dartx.state]: core.String,
      [dartx.status]: core.String
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.PermissionStatus, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.PermissionStatus, html$.PermissionStatus);
  dart.defineExtensionNames([
    'query'
  ]);
  html$.Permissions = class Permissions extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.query](...args) {
      return this.query.apply(this, args);
    }
  };
  dart.setSignature(html$.Permissions, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Permissions, [])}),
    methods: () => ({[dartx.query]: dart.definiteFunctionType(async.Future, [core.Object])})
  });
  dart.registerExtension(dart.global.Permissions, html$.Permissions);
  html$.PictureElement = class PictureElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.PictureElement, 'created');
  dart.setSignature(html$.PictureElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PictureElement, []),
      created: dart.definiteFunctionType(html$.PictureElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLPictureElement, html$.PictureElement);
  dart.defineExtensionNames([
    'item',
    'namedItem',
    'description',
    'filename',
    'length',
    'name'
  ]);
  html$.Plugin = class Plugin extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.description]() {
      return this.description;
    }
    get [dartx.filename]() {
      return this.filename;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.name]() {
      return this.name;
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  dart.setSignature(html$.Plugin, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Plugin, [])}),
    fields: () => ({
      [dartx.description]: core.String,
      [dartx.filename]: core.String,
      [dartx.length]: core.int,
      [dartx.name]: core.String
    }),
    methods: () => ({
      [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
    })
  });
  dart.registerExtension(dart.global.Plugin, html$.Plugin);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item',
    'namedItem',
    'refresh'
  ]);
  html$.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Plugin), html$.ImmutableListMixin$(html$.Plugin)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
    [dartx.refresh](...args) {
      return this.refresh.apply(this, args);
    }
  };
  html$.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
  dart.setSignature(html$.PluginArray, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PluginArray, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Plugin, []),
      [dartx.last]: dart.definiteFunctionType(html$.Plugin, []),
      [dartx.single]: dart.definiteFunctionType(html$.Plugin, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Plugin, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Plugin]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Plugin, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Plugin, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.Plugin, [core.String]),
      [dartx.refresh]: dart.definiteFunctionType(dart.void, [core.bool])
    })
  });
  dart.registerExtension(dart.global.PluginArray, html$.PluginArray);
  dart.defineExtensionNames([
    'createdCallback',
    'closeable',
    'message'
  ]);
  html$.PluginPlaceholderElement = class PluginPlaceholderElement extends html$.DivElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.closeable] = null;
      this[dartx.message] = null;
      super.created();
    }
    get [dartx.closeable]() {
      return this.closeable;
    }
    set [dartx.closeable](value) {
      this.closeable = value;
    }
    get [dartx.message]() {
      return this.message;
    }
    set [dartx.message](value) {
      this.message = value;
    }
    [dartx.createdCallback](...args) {
      return this.createdCallback.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.PluginPlaceholderElement, 'created');
  dart.setSignature(html$.PluginPlaceholderElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PluginPlaceholderElement, []),
      created: dart.definiteFunctionType(html$.PluginPlaceholderElement, [])
    }),
    fields: () => ({
      [dartx.closeable]: core.bool,
      [dartx.message]: core.String
    }),
    methods: () => ({[dartx.createdCallback]: dart.definiteFunctionType(dart.void, [])})
  });
  dart.registerExtension(dart.global.PluginPlaceholderElement, html$.PluginPlaceholderElement);
  dart.defineExtensionNames([
    'height',
    'isPrimary',
    'pointerId',
    'pointerType',
    'pressure',
    'tiltX',
    'tiltY',
    'width'
  ]);
  html$.PointerEvent = class PointerEvent extends html$.MouseEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PointerEvent._create_1(type, eventInitDict_1);
      }
      return html$.PointerEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PointerEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PointerEvent(type);
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.isPrimary]() {
      return this.isPrimary;
    }
    get [dartx.pointerId]() {
      return this.pointerId;
    }
    get [dartx.pointerType]() {
      return this.pointerType;
    }
    get [dartx.pressure]() {
      return this.pressure;
    }
    get [dartx.tiltX]() {
      return this.tiltX;
    }
    get [dartx.tiltY]() {
      return this.tiltY;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.PointerEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PointerEvent, []),
      new: dart.definiteFunctionType(html$.PointerEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.height]: core.double,
      [dartx.isPrimary]: core.bool,
      [dartx.pointerId]: core.int,
      [dartx.pointerType]: core.String,
      [dartx.pressure]: core.double,
      [dartx.tiltX]: core.int,
      [dartx.tiltY]: core.int,
      [dartx.width]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PointerEvent, html$.PointerEvent);
  dart.defineExtensionNames([
    'state'
  ]);
  html$.PopStateEvent = class PopStateEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PopStateEvent._create_1(type, eventInitDict_1);
      }
      return html$.PopStateEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PopStateEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PopStateEvent(type);
    }
    get [dartx.state]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
    }
    get [_get_state]() {
      return this.state;
    }
  };
  dart.setSignature(html$.PopStateEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PopStateEvent, []),
      new: dart.definiteFunctionType(html$.PopStateEvent, [core.String], [core.Map])
    }),
    fields: () => ({[_get_state]: dart.dynamic}),
    getters: () => ({[dartx.state]: dart.definiteFunctionType(dart.dynamic, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PopStateEvent, html$.PopStateEvent);
  html$._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html$.Geoposition]));
  dart.defineExtensionNames([
    'code',
    'message'
  ]);
  html$.PositionError = class PositionError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(html$.PositionError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PositionError, [])}),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.message]: core.String
    }),
    sfields: () => ({
      PERMISSION_DENIED: core.int,
      POSITION_UNAVAILABLE: core.int,
      TIMEOUT: core.int
    })
  });
  html$.PositionError.PERMISSION_DENIED = 1;
  html$.PositionError.POSITION_UNAVAILABLE = 2;
  html$.PositionError.TIMEOUT = 3;
  dart.registerExtension(dart.global.PositionError, html$.PositionError);
  html$._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html$.PositionError]));
  dart.defineExtensionNames([
    'getImmediateState',
    'getState',
    'resetSensor'
  ]);
  html$.PositionSensorVRDevice = class PositionSensorVRDevice extends html$.VRDevice {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getImmediateState](...args) {
      return this.getImmediateState.apply(this, args);
    }
    [dartx.getState](...args) {
      return this.getState.apply(this, args);
    }
    [dartx.resetSensor](...args) {
      return this.resetSensor.apply(this, args);
    }
  };
  dart.setSignature(html$.PositionSensorVRDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PositionSensorVRDevice, [])}),
    methods: () => ({
      [dartx.getImmediateState]: dart.definiteFunctionType(html$.VRPositionState, []),
      [dartx.getState]: dart.definiteFunctionType(html$.VRPositionState, []),
      [dartx.resetSensor]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.PositionSensorVRDevice, html$.PositionSensorVRDevice);
  html$.PreElement = class PreElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.PreElement._check(html$.document[dartx.createElement]("pre"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.PreElement, 'created');
  dart.setSignature(html$.PreElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PreElement, []),
      new: dart.definiteFunctionType(html$.PreElement, []),
      created: dart.definiteFunctionType(html$.PreElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLPreElement, html$.PreElement);
  dart.defineExtensionNames([
    'getAvailability',
    'joinSession',
    'startSession',
    'session'
  ]);
  html$.Presentation = class Presentation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.session]() {
      return this.session;
    }
    [dartx.getAvailability](...args) {
      return this.getAvailability.apply(this, args);
    }
    [dartx.joinSession](...args) {
      return this.joinSession.apply(this, args);
    }
    [dartx.startSession](...args) {
      return this.startSession.apply(this, args);
    }
  };
  dart.setSignature(html$.Presentation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Presentation, [])}),
    fields: () => ({[dartx.session]: html$.PresentationSession}),
    methods: () => ({
      [dartx.getAvailability]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.joinSession]: dart.definiteFunctionType(async.Future, [core.String, core.String]),
      [dartx.startSession]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.Presentation, html$.Presentation);
  dart.defineExtensionNames([
    'onChange',
    'value'
  ]);
  html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return this.value;
    }
    get [dartx.onChange]() {
      return html$.PresentationAvailability.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.PresentationAvailability, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PresentationAvailability, [])}),
    fields: () => ({[dartx.value]: core.bool}),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.PresentationAvailability, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.PresentationAvailability, html$.PresentationAvailability);
  dart.defineExtensionNames([
    'close',
    'send',
    'onMessage',
    'binaryType',
    'id',
    'state'
  ]);
  html$.PresentationSession = class PresentationSession extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.binaryType]() {
      return this.binaryType;
    }
    set [dartx.binaryType](value) {
      this.binaryType = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.state]() {
      return this.state;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.PresentationSession.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.PresentationSession, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PresentationSession, [])}),
    fields: () => ({
      [dartx.binaryType]: core.String,
      [dartx.id]: core.String,
      [dartx.state]: core.String
    }),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.PresentationSession, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.PresentationSession, html$.PresentationSession);
  dart.defineExtensionNames([
    'sheet',
    'target'
  ]);
  html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.target]() {
      return this.target;
    }
  };
  dart.setSignature(html$.ProcessingInstruction, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ProcessingInstruction, [])}),
    fields: () => ({
      [dartx.sheet]: html$.StyleSheet,
      [dartx.target]: core.String
    })
  });
  dart.registerExtension(dart.global.ProcessingInstruction, html$.ProcessingInstruction);
  dart.defineExtensionNames([
    'labels',
    'max',
    'position',
    'value'
  ]);
  html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ProgressElement._check(html$.document[dartx.createElement]("progress"));
    }
    created() {
      this[dartx.labels] = null;
      this[dartx.max] = null;
      this[dartx.position] = null;
      this[dartx.value] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('progress');
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.max]() {
      return this.max;
    }
    set [dartx.max](value) {
      this.max = value;
    }
    get [dartx.position]() {
      return this.position;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.ProgressElement, 'created');
  dart.setSignature(html$.ProgressElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ProgressElement, []),
      new: dart.definiteFunctionType(html$.ProgressElement, []),
      created: dart.definiteFunctionType(html$.ProgressElement, [])
    }),
    fields: () => ({
      [dartx.labels]: ListOfNode(),
      [dartx.max]: core.num,
      [dartx.position]: core.double,
      [dartx.value]: core.num
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLProgressElement, html$.ProgressElement);
  dart.defineExtensionNames([
    'lengthComputable',
    'loaded',
    'total'
  ]);
  html$.ProgressEvent = class ProgressEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ProgressEvent._create_1(type, eventInitDict_1);
      }
      return html$.ProgressEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ProgressEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ProgressEvent(type);
    }
    get [dartx.lengthComputable]() {
      return this.lengthComputable;
    }
    get [dartx.loaded]() {
      return this.loaded;
    }
    get [dartx.total]() {
      return this.total;
    }
  };
  dart.setSignature(html$.ProgressEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ProgressEvent, []),
      new: dart.definiteFunctionType(html$.ProgressEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.lengthComputable]: core.bool,
      [dartx.loaded]: core.int,
      [dartx.total]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ProgressEvent, html$.ProgressEvent);
  dart.defineExtensionNames([
    'promise',
    'reason'
  ]);
  html$.PromiseRejectionEvent = class PromiseRejectionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
      }
      return html$.PromiseRejectionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PromiseRejectionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PromiseRejectionEvent(type);
    }
    get [dartx.promise]() {
      return this.promise;
    }
    get [dartx.reason]() {
      return this.reason;
    }
  };
  dart.setSignature(html$.PromiseRejectionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PromiseRejectionEvent, []),
      new: dart.definiteFunctionType(html$.PromiseRejectionEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.promise]: async.Future,
      [dartx.reason]: core.Object
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PromiseRejectionEvent, html$.PromiseRejectionEvent);
  dart.defineExtensionNames([
    'data'
  ]);
  html$.PushEvent = class PushEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PushEvent._create_1(type, eventInitDict_1);
      }
      return html$.PushEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PushEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PushEvent(type);
    }
    get [dartx.data]() {
      return this.data;
    }
  };
  dart.setSignature(html$.PushEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PushEvent, []),
      new: dart.definiteFunctionType(html$.PushEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.data]: html$.PushMessageData}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PushEvent, html$.PushEvent);
  const _permissionState_1 = Symbol('_permissionState_1');
  const _permissionState_2 = Symbol('_permissionState_2');
  const _subscribe_1 = Symbol('_subscribe_1');
  const _subscribe_2 = Symbol('_subscribe_2');
  dart.defineExtensionNames([
    'getSubscription',
    'permissionState',
    'subscribe'
  ]);
  html$.PushManager = class PushManager extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getSubscription](...args) {
      return this.getSubscription.apply(this, args);
    }
    [dartx.permissionState](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_permissionState_1](options_1);
      }
      return this[_permissionState_2]();
    }
    [_permissionState_1](...args) {
      return this.permissionState.apply(this, args);
    }
    [_permissionState_2](...args) {
      return this.permissionState.apply(this, args);
    }
    [dartx.subscribe](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_subscribe_1](options_1);
      }
      return this[_subscribe_2]();
    }
    [_subscribe_1](...args) {
      return this.subscribe.apply(this, args);
    }
    [_subscribe_2](...args) {
      return this.subscribe.apply(this, args);
    }
  };
  dart.setSignature(html$.PushManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PushManager, [])}),
    methods: () => ({
      [dartx.getSubscription]: dart.definiteFunctionType(async.Future, []),
      [dartx.permissionState]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_permissionState_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_permissionState_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.subscribe]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_subscribe_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_subscribe_2]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.PushManager, html$.PushManager);
  dart.defineExtensionNames([
    'arrayBuffer',
    'blob',
    'json',
    'text'
  ]);
  html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(message) {
      return html$.PushMessageData._create_1(message);
    }
    static _create_1(message) {
      return new PushMessageData(message);
    }
    [dartx.arrayBuffer](...args) {
      return this.arrayBuffer.apply(this, args);
    }
    [dartx.blob](...args) {
      return this.blob.apply(this, args);
    }
    [dartx.json](...args) {
      return this.json.apply(this, args);
    }
    [dartx.text](...args) {
      return this.text.apply(this, args);
    }
  };
  dart.setSignature(html$.PushMessageData, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PushMessageData, []),
      new: dart.definiteFunctionType(html$.PushMessageData, [core.String])
    }),
    methods: () => ({
      [dartx.arrayBuffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      [dartx.blob]: dart.definiteFunctionType(html$.Blob, []),
      [dartx.json]: dart.definiteFunctionType(core.Object, []),
      [dartx.text]: dart.definiteFunctionType(core.String, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.PushMessageData, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.PushMessageData, html$.PushMessageData);
  dart.defineExtensionNames([
    'unsubscribe',
    'endpoint'
  ]);
  html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.endpoint]() {
      return this.endpoint;
    }
    [dartx.unsubscribe](...args) {
      return this.unsubscribe.apply(this, args);
    }
  };
  dart.setSignature(html$.PushSubscription, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PushSubscription, [])}),
    fields: () => ({[dartx.endpoint]: core.String}),
    methods: () => ({[dartx.unsubscribe]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.PushSubscription, html$.PushSubscription);
  dart.defineExtensionNames([
    'cite'
  ]);
  html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.QuoteElement._check(html$.document[dartx.createElement]("q"));
    }
    created() {
      this[dartx.cite] = null;
      super.created();
    }
    get [dartx.cite]() {
      return this.cite;
    }
    set [dartx.cite](value) {
      this.cite = value;
    }
  };
  dart.defineNamedConstructor(html$.QuoteElement, 'created');
  dart.setSignature(html$.QuoteElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.QuoteElement, []),
      new: dart.definiteFunctionType(html$.QuoteElement, []),
      created: dart.definiteFunctionType(html$.QuoteElement, [])
    }),
    fields: () => ({[dartx.cite]: core.String})
  });
  dart.registerExtension(dart.global.HTMLQuoteElement, html$.QuoteElement);
  html$._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
  html$._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html$.RtcSessionDescription]));
  html$.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html$.RtcStatsResponse]));
  dart.defineExtensionNames([
    'cloneContents',
    'cloneRange',
    'collapse',
    'compareBoundaryPoints',
    'comparePoint',
    'createContextualFragment',
    'deleteContents',
    'detach',
    'expand',
    'extractContents',
    'getBoundingClientRect',
    'getClientRects',
    'insertNode',
    'isPointInRange',
    'selectNode',
    'selectNodeContents',
    'setEnd',
    'setEndAfter',
    'setEndBefore',
    'setStart',
    'setStartAfter',
    'setStartBefore',
    'surroundContents',
    'collapsed',
    'commonAncestorContainer',
    'endContainer',
    'endOffset',
    'startContainer',
    'startOffset'
  ]);
  html$.Range = class Range extends _interceptors.Interceptor {
    static new() {
      return html$.document[dartx.createRange]();
    }
    static fromPoint(point) {
      return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.collapsed]() {
      return this.collapsed;
    }
    get [dartx.commonAncestorContainer]() {
      return this.commonAncestorContainer;
    }
    get [dartx.endContainer]() {
      return this.endContainer;
    }
    get [dartx.endOffset]() {
      return this.endOffset;
    }
    get [dartx.startContainer]() {
      return this.startContainer;
    }
    get [dartx.startOffset]() {
      return this.startOffset;
    }
    [dartx.cloneContents](...args) {
      return this.cloneContents.apply(this, args);
    }
    [dartx.cloneRange](...args) {
      return this.cloneRange.apply(this, args);
    }
    [dartx.collapse](...args) {
      return this.collapse.apply(this, args);
    }
    [dartx.compareBoundaryPoints](...args) {
      return this.compareBoundaryPoints.apply(this, args);
    }
    [dartx.comparePoint](...args) {
      return this.comparePoint.apply(this, args);
    }
    [dartx.createContextualFragment](...args) {
      return this.createContextualFragment.apply(this, args);
    }
    [dartx.deleteContents](...args) {
      return this.deleteContents.apply(this, args);
    }
    [dartx.detach](...args) {
      return this.detach.apply(this, args);
    }
    [dartx.expand](...args) {
      return this.expand.apply(this, args);
    }
    [dartx.extractContents](...args) {
      return this.extractContents.apply(this, args);
    }
    [dartx.getBoundingClientRect](...args) {
      return this.getBoundingClientRect.apply(this, args);
    }
    [dartx.getClientRects](...args) {
      return this.getClientRects.apply(this, args);
    }
    [dartx.insertNode](...args) {
      return this.insertNode.apply(this, args);
    }
    [dartx.isPointInRange](...args) {
      return this.isPointInRange.apply(this, args);
    }
    [dartx.selectNode](...args) {
      return this.selectNode.apply(this, args);
    }
    [dartx.selectNodeContents](...args) {
      return this.selectNodeContents.apply(this, args);
    }
    [dartx.setEnd](...args) {
      return this.setEnd.apply(this, args);
    }
    [dartx.setEndAfter](...args) {
      return this.setEndAfter.apply(this, args);
    }
    [dartx.setEndBefore](...args) {
      return this.setEndBefore.apply(this, args);
    }
    [dartx.setStart](...args) {
      return this.setStart.apply(this, args);
    }
    [dartx.setStartAfter](...args) {
      return this.setStartAfter.apply(this, args);
    }
    [dartx.setStartBefore](...args) {
      return this.setStartBefore.apply(this, args);
    }
    [dartx.surroundContents](...args) {
      return this.surroundContents.apply(this, args);
    }
    static get supportsCreateContextualFragment() {
      return "createContextualFragment" in window.Range.prototype;
    }
  };
  dart.setSignature(html$.Range, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Range, []),
      fromPoint: dart.definiteFunctionType(html$.Range, [PointOfnum()]),
      _: dart.definiteFunctionType(html$.Range, [])
    }),
    fields: () => ({
      [dartx.collapsed]: core.bool,
      [dartx.commonAncestorContainer]: html$.Node,
      [dartx.endContainer]: html$.Node,
      [dartx.endOffset]: core.int,
      [dartx.startContainer]: html$.Node,
      [dartx.startOffset]: core.int
    }),
    methods: () => ({
      [dartx.cloneContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
      [dartx.cloneRange]: dart.definiteFunctionType(html$.Range, []),
      [dartx.collapse]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html$.Range]),
      [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html$.Node, core.int]),
      [dartx.createContextualFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String]),
      [dartx.deleteContents]: dart.definiteFunctionType(dart.void, []),
      [dartx.detach]: dart.definiteFunctionType(dart.void, []),
      [dartx.expand]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.extractContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
      [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
      [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html$.Node, core.int]),
      [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
      [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setStart]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
      [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html$.Node])
    }),
    sfields: () => ({
      END_TO_END: core.int,
      END_TO_START: core.int,
      START_TO_END: core.int,
      START_TO_START: core.int
    }),
    sgetters: () => ({supportsCreateContextualFragment: dart.definiteFunctionType(core.bool, [])})
  });
  html$.Range.END_TO_END = 2;
  html$.Range.END_TO_START = 3;
  html$.Range.START_TO_END = 1;
  html$.Range.START_TO_START = 0;
  dart.registerExtension(dart.global.Range, html$.Range);
  dart.defineExtensionNames([
    'cancel',
    'getReader'
  ]);
  html$.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.getReader](...args) {
      return this.getReader.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableByteStream, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStream, [])}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.getReader]: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])
    })
  });
  dart.registerExtension(dart.global.ReadableByteStream, html$.ReadableByteStream);
  dart.defineExtensionNames([
    'cancel',
    'read',
    'releaseLock',
    'closed'
  ]);
  html$.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.closed]() {
      return this.closed;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.read](...args) {
      return this.read.apply(this, args);
    }
    [dartx.releaseLock](...args) {
      return this.releaseLock.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableByteStreamReader, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])}),
    fields: () => ({[dartx.closed]: async.Future}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.read]: dart.definiteFunctionType(async.Future, []),
      [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.ReadableByteStreamReader, html$.ReadableByteStreamReader);
  dart.defineExtensionNames([
    'cancel',
    'getReader'
  ]);
  html$.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.getReader](...args) {
      return this.getReader.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableStream, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStream, [])}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.getReader]: dart.definiteFunctionType(html$.ReadableStreamReader, [])
    })
  });
  dart.registerExtension(dart.global.ReadableStream, html$.ReadableStream);
  dart.defineExtensionNames([
    'cancel',
    'read',
    'releaseLock',
    'closed'
  ]);
  html$.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.closed]() {
      return this.closed;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.read](...args) {
      return this.read.apply(this, args);
    }
    [dartx.releaseLock](...args) {
      return this.releaseLock.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableStreamReader, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStreamReader, [])}),
    fields: () => ({[dartx.closed]: async.Future}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.read]: dart.definiteFunctionType(async.Future, []),
      [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.ReadableStreamReader, html$.ReadableStreamReader);
  dart.defineExtensionNames([
    'relatedTarget'
  ]);
  html$.RelatedEvent = class RelatedEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.RelatedEvent._create_1(type, eventInitDict_1);
      }
      return html$.RelatedEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new RelatedEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new RelatedEvent(type);
    }
    get [dartx.relatedTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
    }
    get [_get_relatedTarget]() {
      return this.relatedTarget;
    }
  };
  dart.setSignature(html$.RelatedEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.RelatedEvent, []),
      new: dart.definiteFunctionType(html$.RelatedEvent, [core.String], [core.Map])
    }),
    fields: () => ({[_get_relatedTarget]: dart.dynamic}),
    getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.RelatedEvent, html$.RelatedEvent);
  html$.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
  dart.defineExtensionNames([
    'url'
  ]);
  html$.ResourceProgressEvent = class ResourceProgressEvent extends html$.ProgressEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.url]() {
      return this.url;
    }
  };
  dart.setSignature(html$.ResourceProgressEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ResourceProgressEvent, [])}),
    fields: () => ({[dartx.url]: core.String})
  });
  dart.registerExtension(dart.global.ResourceProgressEvent, html$.ResourceProgressEvent);
  dart.defineExtensionNames([
    'close',
    'send',
    'sendBlob',
    'sendByteBuffer',
    'sendString',
    'sendTypedData',
    'onClose',
    'onError',
    'onMessage',
    'onOpen',
    'binaryType',
    'bufferedAmount',
    'id',
    'label',
    'maxRetransmitTime',
    'maxRetransmits',
    'negotiated',
    'ordered',
    'protocol',
    'readyState',
    'reliable'
  ]);
  html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.binaryType]() {
      return this.binaryType;
    }
    set [dartx.binaryType](value) {
      this.binaryType = value;
    }
    get [dartx.bufferedAmount]() {
      return this.bufferedAmount;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.maxRetransmitTime]() {
      return this.maxRetransmitTime;
    }
    get [dartx.maxRetransmits]() {
      return this.maxRetransmits;
    }
    get [dartx.negotiated]() {
      return this.negotiated;
    }
    get [dartx.ordered]() {
      return this.ordered;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.reliable]() {
      return this.reliable;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendBlob](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendByteBuffer](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendString](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendTypedData](...args) {
      return this.send.apply(this, args);
    }
    get [dartx.onClose]() {
      return html$.RtcDataChannel.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.RtcDataChannel.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.RtcDataChannel.messageEvent.forTarget(this);
    }
    get [dartx.onOpen]() {
      return html$.RtcDataChannel.openEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.RtcDataChannel, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannel, [])}),
    fields: () => ({
      [dartx.binaryType]: core.String,
      [dartx.bufferedAmount]: core.int,
      [dartx.id]: core.int,
      [dartx.label]: core.String,
      [dartx.maxRetransmitTime]: core.int,
      [dartx.maxRetransmits]: core.int,
      [dartx.negotiated]: core.bool,
      [dartx.ordered]: core.bool,
      [dartx.protocol]: core.String,
      [dartx.readyState]: core.String,
      [dartx.reliable]: core.bool
    }),
    getters: () => ({
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
      [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
    }),
    sfields: () => ({
      closeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      openEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.RtcDataChannel, {
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get openEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('open'));
    }
  });
  dart.registerExtension(dart.global.RTCDataChannel, html$.RtcDataChannel);
  dart.registerExtension(dart.global.DataChannel, html$.RtcDataChannel);
  dart.defineExtensionNames([
    'channel'
  ]);
  html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.channel]() {
      return this.channel;
    }
  };
  dart.setSignature(html$.RtcDataChannelEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannelEvent, [])}),
    fields: () => ({[dartx.channel]: html$.RtcDataChannel})
  });
  dart.registerExtension(dart.global.RTCDataChannelEvent, html$.RtcDataChannelEvent);
  dart.defineExtensionNames([
    'insertDtmf',
    'onToneChange',
    'canInsertDtmf',
    'duration',
    'interToneGap',
    'toneBuffer',
    'track'
  ]);
  html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.canInsertDtmf]() {
      return this.canInsertDTMF;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.interToneGap]() {
      return this.interToneGap;
    }
    get [dartx.toneBuffer]() {
      return this.toneBuffer;
    }
    get [dartx.track]() {
      return this.track;
    }
    [dartx.insertDtmf](...args) {
      return this.insertDTMF.apply(this, args);
    }
    get [dartx.onToneChange]() {
      return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.RtcDtmfSender, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDtmfSender, [])}),
    fields: () => ({
      [dartx.canInsertDtmf]: core.bool,
      [dartx.duration]: core.int,
      [dartx.interToneGap]: core.int,
      [dartx.toneBuffer]: core.String,
      [dartx.track]: html$.MediaStreamTrack
    }),
    getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html$.RtcDtmfToneChangeEvent), [])}),
    methods: () => ({[dartx.insertDtmf]: dart.definiteFunctionType(dart.void, [core.String], [core.int, core.int])}),
    sfields: () => ({toneChangeEvent: EventStreamProviderOfRtcDtmfToneChangeEvent()})
  });
  dart.defineLazy(html$.RtcDtmfSender, {
    get toneChangeEvent() {
      return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent())('tonechange'));
    }
  });
  dart.registerExtension(dart.global.RTCDTMFSender, html$.RtcDtmfSender);
  dart.defineExtensionNames([
    'tone'
  ]);
  html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
    }
    static _create_1(type, eventInitDict) {
      return new RTCDTMFToneChangeEvent(type, eventInitDict);
    }
    get [dartx.tone]() {
      return this.tone;
    }
  };
  dart.setSignature(html$.RtcDtmfToneChangeEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, []),
      new: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [core.String, core.Map])
    }),
    fields: () => ({[dartx.tone]: core.String}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html$.RtcDtmfToneChangeEvent);
  dart.defineExtensionNames([
    'candidate',
    'sdpMLineIndex',
    'sdpMid'
  ]);
  html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
    static new(dictionary) {
      let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCIceCandidate` : 'RTCIceCandidate'];
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.candidate]() {
      return this.candidate;
    }
    set [dartx.candidate](value) {
      this.candidate = value;
    }
    get [dartx.sdpMLineIndex]() {
      return this.sdpMLineIndex;
    }
    set [dartx.sdpMLineIndex](value) {
      this.sdpMLineIndex = value;
    }
    get [dartx.sdpMid]() {
      return this.sdpMid;
    }
    set [dartx.sdpMid](value) {
      this.sdpMid = value;
    }
  };
  dart.setSignature(html$.RtcIceCandidate, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.RtcIceCandidate, [core.Map]),
      _: dart.definiteFunctionType(html$.RtcIceCandidate, [])
    }),
    fields: () => ({
      [dartx.candidate]: core.String,
      [dartx.sdpMLineIndex]: core.int,
      [dartx.sdpMid]: core.String
    })
  });
  dart.registerExtension(dart.global.RTCIceCandidate, html$.RtcIceCandidate);
  dart.registerExtension(dart.global.mozRTCIceCandidate, html$.RtcIceCandidate);
  dart.defineExtensionNames([
    'candidate'
  ]);
  html$.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.candidate]() {
      return this.candidate;
    }
  };
  dart.setSignature(html$.RtcIceCandidateEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcIceCandidateEvent, [])}),
    fields: () => ({[dartx.candidate]: html$.RtcIceCandidate})
  });
  dart.registerExtension(dart.global.RTCIceCandidateEvent, html$.RtcIceCandidateEvent);
  dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html$.RtcIceCandidateEvent);
  const _createOffer = Symbol('_createOffer');
  const _createAnswer = Symbol('_createAnswer');
  const _getStats = Symbol('_getStats');
  const _addStream_1 = Symbol('_addStream_1');
  const _addStream_2 = Symbol('_addStream_2');
  const _createAnswer_1 = Symbol('_createAnswer_1');
  const _createAnswer_2 = Symbol('_createAnswer_2');
  const _createDataChannel_1 = Symbol('_createDataChannel_1');
  const _createDataChannel_2 = Symbol('_createDataChannel_2');
  const _createOffer_1 = Symbol('_createOffer_1');
  const _createOffer_2 = Symbol('_createOffer_2');
  const _setLocalDescription = Symbol('_setLocalDescription');
  const _setRemoteDescription = Symbol('_setRemoteDescription');
  const _updateIce_1 = Symbol('_updateIce_1');
  const _updateIce_2 = Symbol('_updateIce_2');
  const _updateIce_3 = Symbol('_updateIce_3');
  dart.defineExtensionNames([
    'createOffer',
    'createAnswer',
    'getStats',
    'addIceCandidate',
    'addStream',
    'close',
    'createDtmfSender',
    'createDataChannel',
    'getLocalStreams',
    'getRemoteStreams',
    'getStreamById',
    'removeStream',
    'setLocalDescription',
    'setRemoteDescription',
    'updateIce',
    'onAddStream',
    'onDataChannel',
    'onIceCandidate',
    'onIceConnectionStateChange',
    'onNegotiationNeeded',
    'onRemoveStream',
    'onSignalingStateChange',
    'iceConnectionState',
    'iceGatheringState',
    'localDescription',
    'remoteDescription',
    'signalingState'
  ]);
  html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
    static new(rtcIceServers, mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      let constructorName = window[dart.str`${html_common.Device.propertyPrefix}RTCPeerConnection`];
      if (mediaConstraints != null) {
        return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers), html_common.convertDartToNative_SerializedScriptValue(mediaConstraints));
      } else {
        return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers));
      }
    }
    static get supported() {
      try {
        html$.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
        return true;
      } catch (_) {
        return false;
      }

      return false;
    }
    [dartx.createOffer](mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      let completer = CompleterOfRtcSessionDescription().new();
      this[_createOffer](dart.fn(value => {
        completer.complete(value);
      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()), mediaConstraints);
      return completer.future;
    }
    [dartx.createAnswer](mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      let completer = CompleterOfRtcSessionDescription().new();
      this[_createAnswer](dart.fn(value => {
        completer.complete(value);
      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()), mediaConstraints);
      return completer.future;
    }
    [dartx.getStats](selector) {
      let completer = CompleterOfRtcStatsResponse().new();
      this[_getStats](dart.fn(value => {
        completer.complete(value);
      }, RtcStatsResponseTovoid()), selector);
      return completer.future;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.iceConnectionState]() {
      return this.iceConnectionState;
    }
    get [dartx.iceGatheringState]() {
      return this.iceGatheringState;
    }
    get [dartx.localDescription]() {
      return this.localDescription;
    }
    get [dartx.remoteDescription]() {
      return this.remoteDescription;
    }
    get [dartx.signalingState]() {
      return this.signalingState;
    }
    [dartx.addIceCandidate](...args) {
      return this.addIceCandidate.apply(this, args);
    }
    [dartx.addStream](stream, mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      if (mediaConstraints != null) {
        let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
        this[_addStream_1](stream, mediaConstraints_1);
        return;
      }
      this[_addStream_2](stream);
      return;
    }
    [_addStream_1](...args) {
      return this.addStream.apply(this, args);
    }
    [_addStream_2](...args) {
      return this.addStream.apply(this, args);
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [_createAnswer](successCallback, failureCallback, mediaConstraints) {
      if (failureCallback === void 0) failureCallback = null;
      if (mediaConstraints === void 0) mediaConstraints = null;
      if (mediaConstraints != null) {
        let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
        this[_createAnswer_1](successCallback, failureCallback, mediaConstraints_1);
        return;
      }
      this[_createAnswer_2](successCallback, failureCallback);
      return;
    }
    [_createAnswer_1](...args) {
      return this.createAnswer.apply(this, args);
    }
    [_createAnswer_2](...args) {
      return this.createAnswer.apply(this, args);
    }
    [dartx.createDtmfSender](...args) {
      return this.createDTMFSender.apply(this, args);
    }
    [dartx.createDataChannel](label, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_createDataChannel_1](label, options_1);
      }
      return this[_createDataChannel_2](label);
    }
    [_createDataChannel_1](...args) {
      return this.createDataChannel.apply(this, args);
    }
    [_createDataChannel_2](...args) {
      return this.createDataChannel.apply(this, args);
    }
    [_createOffer](successCallback, failureCallback, rtcOfferOptions) {
      if (failureCallback === void 0) failureCallback = null;
      if (rtcOfferOptions === void 0) rtcOfferOptions = null;
      if (rtcOfferOptions != null) {
        let rtcOfferOptions_1 = html_common.convertDartToNative_Dictionary(rtcOfferOptions);
        this[_createOffer_1](successCallback, failureCallback, rtcOfferOptions_1);
        return;
      }
      this[_createOffer_2](successCallback, failureCallback);
      return;
    }
    [_createOffer_1](...args) {
      return this.createOffer.apply(this, args);
    }
    [_createOffer_2](...args) {
      return this.createOffer.apply(this, args);
    }
    [dartx.getLocalStreams](...args) {
      return this.getLocalStreams.apply(this, args);
    }
    [dartx.getRemoteStreams](...args) {
      return this.getRemoteStreams.apply(this, args);
    }
    [_getStats](...args) {
      return this.getStats.apply(this, args);
    }
    [dartx.getStreamById](...args) {
      return this.getStreamById.apply(this, args);
    }
    [dartx.removeStream](...args) {
      return this.removeStream.apply(this, args);
    }
    [_setLocalDescription](...args) {
      return this.setLocalDescription.apply(this, args);
    }
    [dartx.setLocalDescription](description) {
      let completer = async.Completer.new();
      this[_setLocalDescription](description, dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()));
      return completer.future;
    }
    [_setRemoteDescription](...args) {
      return this.setRemoteDescription.apply(this, args);
    }
    [dartx.setRemoteDescription](description) {
      let completer = async.Completer.new();
      this[_setRemoteDescription](description, dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()));
      return completer.future;
    }
    [dartx.updateIce](configuration, mediaConstraints) {
      if (configuration === void 0) configuration = null;
      if (mediaConstraints === void 0) mediaConstraints = null;
      if (mediaConstraints != null) {
        let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
        let mediaConstraints_2 = html_common.convertDartToNative_Dictionary(mediaConstraints);
        this[_updateIce_1](configuration_1, mediaConstraints_2);
        return;
      }
      if (configuration != null) {
        let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
        this[_updateIce_2](configuration_1);
        return;
      }
      this[_updateIce_3]();
      return;
    }
    [_updateIce_1](...args) {
      return this.updateIce.apply(this, args);
    }
    [_updateIce_2](...args) {
      return this.updateIce.apply(this, args);
    }
    [_updateIce_3](...args) {
      return this.updateIce.apply(this, args);
    }
    get [dartx.onAddStream]() {
      return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
    }
    get [dartx.onDataChannel]() {
      return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
    }
    get [dartx.onIceCandidate]() {
      return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
    }
    get [dartx.onIceConnectionStateChange]() {
      return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
    }
    get [dartx.onNegotiationNeeded]() {
      return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
    }
    get [dartx.onRemoveStream]() {
      return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
    }
    get [dartx.onSignalingStateChange]() {
      return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.RtcPeerConnection, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.RtcPeerConnection, [core.Map], [core.Map]),
      _: dart.definiteFunctionType(html$.RtcPeerConnection, [])
    }),
    fields: () => ({
      [dartx.iceConnectionState]: core.String,
      [dartx.iceGatheringState]: core.String,
      [dartx.localDescription]: html$.RtcSessionDescription,
      [dartx.remoteDescription]: html$.RtcSessionDescription,
      [dartx.signalingState]: core.String
    }),
    getters: () => ({
      [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
      [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html$.RtcDataChannelEvent), []),
      [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html$.RtcIceCandidateEvent), []),
      [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
      [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
      [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
      [dartx.getStats]: dart.definiteFunctionType(async.Future$(html$.RtcStatsResponse), [html$.MediaStreamTrack]),
      [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html$.RtcIceCandidate, html$.VoidCallback, html$._RtcErrorCallback]),
      [dartx.addStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream], [core.Map]),
      [_addStream_1]: dart.definiteFunctionType(dart.void, [html$.MediaStream, dart.dynamic]),
      [_addStream_2]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [_createAnswer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
      [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
      [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
      [dartx.createDtmfSender]: dart.definiteFunctionType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
      [dartx.createDataChannel]: dart.definiteFunctionType(html$.RtcDataChannel, [core.String], [core.Map]),
      [_createDataChannel_1]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
      [_createDataChannel_2]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic]),
      [_createOffer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
      [_createOffer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
      [_createOffer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
      [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
      [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
      [_getStats]: dart.definiteFunctionType(dart.void, [html$.RtcStatsCallback, html$.MediaStreamTrack]),
      [dartx.getStreamById]: dart.definiteFunctionType(html$.MediaStream, [core.String]),
      [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
      [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
      [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
      [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
      [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
      [dartx.updateIce]: dart.definiteFunctionType(dart.void, [], [core.Map, core.Map]),
      [_updateIce_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [_updateIce_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_updateIce_3]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      addStreamEvent: EventStreamProviderOfMediaStreamEvent(),
      dataChannelEvent: EventStreamProviderOfRtcDataChannelEvent(),
      iceCandidateEvent: EventStreamProviderOfRtcIceCandidateEvent(),
      iceConnectionStateChangeEvent: EventStreamProviderOfEvent(),
      negotiationNeededEvent: EventStreamProviderOfEvent(),
      removeStreamEvent: EventStreamProviderOfMediaStreamEvent(),
      signalingStateChangeEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineLazy(html$.RtcPeerConnection, {
    get addStreamEvent() {
      return dart.const(new (EventStreamProviderOfMediaStreamEvent())('addstream'));
    },
    get dataChannelEvent() {
      return dart.const(new (EventStreamProviderOfRtcDataChannelEvent())('datachannel'));
    },
    get iceCandidateEvent() {
      return dart.const(new (EventStreamProviderOfRtcIceCandidateEvent())('icecandidate'));
    },
    get iceConnectionStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('iceconnectionstatechange'));
    },
    get negotiationNeededEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('negotiationneeded'));
    },
    get removeStreamEvent() {
      return dart.const(new (EventStreamProviderOfMediaStreamEvent())('removestream'));
    },
    get signalingStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('signalingstatechange'));
    }
  });
  dart.registerExtension(dart.global.RTCPeerConnection, html$.RtcPeerConnection);
  dart.registerExtension(dart.global.mozRTCPeerConnection, html$.RtcPeerConnection);
  dart.defineExtensionNames([
    'sdp',
    'type'
  ]);
  html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
    static new(dictionary) {
      let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCSessionDescription` : 'RTCSessionDescription'];
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sdp]() {
      return this.sdp;
    }
    set [dartx.sdp](value) {
      this.sdp = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.setSignature(html$.RtcSessionDescription, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.RtcSessionDescription, [core.Map]),
      _: dart.definiteFunctionType(html$.RtcSessionDescription, [])
    }),
    fields: () => ({
      [dartx.sdp]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.RTCSessionDescription, html$.RtcSessionDescription);
  dart.registerExtension(dart.global.mozRTCSessionDescription, html$.RtcSessionDescription);
  const _get_timestamp = Symbol('_get_timestamp');
  dart.defineExtensionNames([
    'timestamp',
    'names',
    'stat',
    'id',
    'type'
  ]);
  html$.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.timestamp]() {
      return html_common.convertNativeToDart_DateTime(this[_get_timestamp]);
    }
    get [_get_timestamp]() {
      return this.timestamp;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.names](...args) {
      return this.names.apply(this, args);
    }
    [dartx.stat](...args) {
      return this.stat.apply(this, args);
    }
  };
  dart.setSignature(html$.RtcStatsReport, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsReport, [])}),
    fields: () => ({
      [dartx.id]: core.String,
      [_get_timestamp]: dart.dynamic,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.timestamp]: dart.definiteFunctionType(core.DateTime, [])}),
    methods: () => ({
      [dartx.names]: dart.definiteFunctionType(core.List$(core.String), []),
      [dartx.stat]: dart.definiteFunctionType(core.String, [core.String])
    })
  });
  dart.registerExtension(dart.global.RTCStatsReport, html$.RtcStatsReport);
  dart.defineExtensionNames([
    'namedItem',
    'result'
  ]);
  html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
    [dartx.result](...args) {
      return this.result.apply(this, args);
    }
  };
  dart.setSignature(html$.RtcStatsResponse, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsResponse, [])}),
    methods: () => ({
      [dartx.namedItem]: dart.definiteFunctionType(html$.RtcStatsReport, [core.String]),
      [dartx.result]: dart.definiteFunctionType(core.List$(html$.RtcStatsReport), [])
    })
  });
  dart.registerExtension(dart.global.RTCStatsResponse, html$.RtcStatsResponse);
  const _availLeft = Symbol('_availLeft');
  const _availTop = Symbol('_availTop');
  const _availWidth = Symbol('_availWidth');
  const _availHeight = Symbol('_availHeight');
  dart.defineExtensionNames([
    'available',
    'colorDepth',
    'height',
    'orientation',
    'pixelDepth',
    'width'
  ]);
  html$.Screen = class Screen extends _interceptors.Interceptor {
    get [dartx.available]() {
      return new (RectangleOfint())(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [_availHeight]() {
      return this.availHeight;
    }
    get [_availLeft]() {
      return this.availLeft;
    }
    get [_availTop]() {
      return this.availTop;
    }
    get [_availWidth]() {
      return this.availWidth;
    }
    get [dartx.colorDepth]() {
      return this.colorDepth;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.orientation]() {
      return this.orientation;
    }
    get [dartx.pixelDepth]() {
      return this.pixelDepth;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.Screen, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Screen, [])}),
    fields: () => ({
      [_availHeight]: core.int,
      [_availLeft]: core.int,
      [_availTop]: core.int,
      [_availWidth]: core.int,
      [dartx.colorDepth]: core.int,
      [dartx.height]: core.int,
      [dartx.orientation]: html$.ScreenOrientation,
      [dartx.pixelDepth]: core.int,
      [dartx.width]: core.int
    }),
    getters: () => ({[dartx.available]: dart.definiteFunctionType(math.Rectangle$(core.num), [])})
  });
  dart.registerExtension(dart.global.Screen, html$.Screen);
  dart.defineExtensionNames([
    'lock',
    'unlock',
    'onChange',
    'angle',
    'type'
  ]);
  html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.lock](...args) {
      return this.lock.apply(this, args);
    }
    [dartx.unlock](...args) {
      return this.unlock.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.ScreenOrientation.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ScreenOrientation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ScreenOrientation, [])}),
    fields: () => ({
      [dartx.angle]: core.int,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.lock]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.unlock]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.ScreenOrientation, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.ScreenOrientation, html$.ScreenOrientation);
  dart.defineExtensionNames([
    'async',
    'charset',
    'crossOrigin',
    'defer',
    'integrity',
    'nonce',
    'src',
    'type'
  ]);
  html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ScriptElement._check(html$.document[dartx.createElement]("script"));
    }
    created() {
      this[dartx.async] = null;
      this[dartx.charset] = null;
      this[dartx.crossOrigin] = null;
      this[dartx.defer] = null;
      this[dartx.integrity] = null;
      this[dartx.nonce] = null;
      this[dartx.src] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.async]() {
      return this.async;
    }
    set [dartx.async](value) {
      this.async = value;
    }
    get [dartx.charset]() {
      return this.charset;
    }
    set [dartx.charset](value) {
      this.charset = value;
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.defer]() {
      return this.defer;
    }
    set [dartx.defer](value) {
      this.defer = value;
    }
    get [dartx.integrity]() {
      return this.integrity;
    }
    set [dartx.integrity](value) {
      this.integrity = value;
    }
    get [dartx.nonce]() {
      return this.nonce;
    }
    set [dartx.nonce](value) {
      this.nonce = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.ScriptElement, 'created');
  dart.setSignature(html$.ScriptElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ScriptElement, []),
      new: dart.definiteFunctionType(html$.ScriptElement, []),
      created: dart.definiteFunctionType(html$.ScriptElement, [])
    }),
    fields: () => ({
      [dartx.async]: core.bool,
      [dartx.charset]: core.String,
      [dartx.crossOrigin]: core.String,
      [dartx.defer]: core.bool,
      [dartx.integrity]: core.String,
      [dartx.nonce]: core.String,
      [dartx.src]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLScriptElement, html$.ScriptElement);
  dart.defineExtensionNames([
    'consumeDelta',
    'deltaGranularity',
    'deltaX',
    'deltaY',
    'fromUserInput',
    'inInertialPhase',
    'isBeginning',
    'isEnding',
    'shouldPropagate',
    'velocityX',
    'velocityY'
  ]);
  html$.ScrollState = class ScrollState extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
      if (deltaX === void 0) deltaX = null;
      if (deltaY === void 0) deltaY = null;
      if (deltaGranularity === void 0) deltaGranularity = null;
      if (velocityX === void 0) velocityX = null;
      if (velocityY === void 0) velocityY = null;
      if (inInertialPhase === void 0) inInertialPhase = null;
      if (isBeginning === void 0) isBeginning = null;
      if (isEnding === void 0) isEnding = null;
      if (isEnding != null) {
        return html$.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
      }
      if (isBeginning != null) {
        return html$.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
      }
      if (inInertialPhase != null) {
        return html$.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
      }
      if (velocityY != null) {
        return html$.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
      }
      if (velocityX != null) {
        return html$.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
      }
      if (deltaGranularity != null) {
        return html$.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
      }
      if (deltaY != null) {
        return html$.ScrollState._create_7(deltaX, deltaY);
      }
      if (deltaX != null) {
        return html$.ScrollState._create_8(deltaX);
      }
      return html$.ScrollState._create_9();
    }
    static _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
    }
    static _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
    }
    static _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
    }
    static _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
    }
    static _create_5(deltaX, deltaY, deltaGranularity, velocityX) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX);
    }
    static _create_6(deltaX, deltaY, deltaGranularity) {
      return new ScrollState(deltaX, deltaY, deltaGranularity);
    }
    static _create_7(deltaX, deltaY) {
      return new ScrollState(deltaX, deltaY);
    }
    static _create_8(deltaX) {
      return new ScrollState(deltaX);
    }
    static _create_9() {
      return new ScrollState();
    }
    get [dartx.deltaGranularity]() {
      return this.deltaGranularity;
    }
    get [dartx.deltaX]() {
      return this.deltaX;
    }
    get [dartx.deltaY]() {
      return this.deltaY;
    }
    get [dartx.fromUserInput]() {
      return this.fromUserInput;
    }
    get [dartx.inInertialPhase]() {
      return this.inInertialPhase;
    }
    get [dartx.isBeginning]() {
      return this.isBeginning;
    }
    get [dartx.isEnding]() {
      return this.isEnding;
    }
    get [dartx.shouldPropagate]() {
      return this.shouldPropagate;
    }
    get [dartx.velocityX]() {
      return this.velocityX;
    }
    get [dartx.velocityY]() {
      return this.velocityY;
    }
    [dartx.consumeDelta](...args) {
      return this.consumeDelta.apply(this, args);
    }
  };
  dart.setSignature(html$.ScrollState, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ScrollState, []),
      new: dart.definiteFunctionType(html$.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
    }),
    fields: () => ({
      [dartx.deltaGranularity]: core.double,
      [dartx.deltaX]: core.double,
      [dartx.deltaY]: core.double,
      [dartx.fromUserInput]: core.bool,
      [dartx.inInertialPhase]: core.bool,
      [dartx.isBeginning]: core.bool,
      [dartx.isEnding]: core.bool,
      [dartx.shouldPropagate]: core.bool,
      [dartx.velocityX]: core.double,
      [dartx.velocityY]: core.double
    }),
    methods: () => ({[dartx.consumeDelta]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_6: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_7: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic]),
      _create_8: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic]),
      _create_9: dart.definiteFunctionType(html$.ScrollState, [])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6', '_create_7', '_create_8', '_create_9']
  });
  dart.registerExtension(dart.global.ScrollState, html$.ScrollState);
  dart.defineExtensionNames([
    'blockedUri',
    'columnNumber',
    'documentUri',
    'effectiveDirective',
    'lineNumber',
    'originalPolicy',
    'referrer',
    'sourceFile',
    'statusCode',
    'violatedDirective'
  ]);
  html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
      }
      return html$.SecurityPolicyViolationEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new SecurityPolicyViolationEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new SecurityPolicyViolationEvent(type);
    }
    get [dartx.blockedUri]() {
      return this.blockedURI;
    }
    get [dartx.columnNumber]() {
      return this.columnNumber;
    }
    get [dartx.documentUri]() {
      return this.documentURI;
    }
    get [dartx.effectiveDirective]() {
      return this.effectiveDirective;
    }
    get [dartx.lineNumber]() {
      return this.lineNumber;
    }
    get [dartx.originalPolicy]() {
      return this.originalPolicy;
    }
    get [dartx.referrer]() {
      return this.referrer;
    }
    get [dartx.sourceFile]() {
      return this.sourceFile;
    }
    get [dartx.statusCode]() {
      return this.statusCode;
    }
    get [dartx.violatedDirective]() {
      return this.violatedDirective;
    }
  };
  dart.setSignature(html$.SecurityPolicyViolationEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, []),
      new: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.blockedUri]: core.String,
      [dartx.columnNumber]: core.int,
      [dartx.documentUri]: core.String,
      [dartx.effectiveDirective]: core.String,
      [dartx.lineNumber]: core.int,
      [dartx.originalPolicy]: core.String,
      [dartx.referrer]: core.String,
      [dartx.sourceFile]: core.String,
      [dartx.statusCode]: core.int,
      [dartx.violatedDirective]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html$.SecurityPolicyViolationEvent);
  dart.defineExtensionNames([
    'add',
    'checkValidity',
    'item',
    'namedItem',
    'reportValidity',
    'setCustomValidity',
    'options',
    'selectedOptions',
    'autofocus',
    'disabled',
    'form',
    'labels',
    'length',
    'multiple',
    'name',
    'required',
    'selectedIndex',
    'size',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate'
  ]);
  html$.SelectElement = class SelectElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SelectElement._check(html$.document[dartx.createElement]("select"));
    }
    created() {
      this[dartx.autofocus] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.labels] = null;
      this[dartx.length] = null;
      this[dartx.multiple] = null;
      this[dartx.name] = null;
      this[dartx.required] = null;
      this[dartx.selectedIndex] = null;
      this[dartx.size] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](value) {
      this.length = value;
    }
    get [dartx.multiple]() {
      return this.multiple;
    }
    set [dartx.multiple](value) {
      this.multiple = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.required]() {
      return this.required;
    }
    set [dartx.required](value) {
      this.required = value;
    }
    get [dartx.selectedIndex]() {
      return this.selectedIndex;
    }
    set [dartx.selectedIndex](value) {
      this.selectedIndex = value;
    }
    get [dartx.size]() {
      return this.size;
    }
    set [dartx.size](value) {
      this.size = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
    get [dartx.options]() {
      let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html$.Element)('option'));
      return new (UnmodifiableListViewOfOptionElement())(options);
    }
    get [dartx.selectedOptions]() {
      if (dart.test(this[dartx.multiple])) {
        let options = this[dartx.options][dartx.where](dart.fn(o => o[dartx.selected], OptionElementTobool()))[dartx.toList]();
        return new (UnmodifiableListViewOfOptionElement())(options);
      } else {
        return JSArrayOfOptionElement().of([this[dartx.options][dartx._get](this[dartx.selectedIndex])]);
      }
    }
  };
  dart.defineNamedConstructor(html$.SelectElement, 'created');
  dart.setSignature(html$.SelectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SelectElement, []),
      new: dart.definiteFunctionType(html$.SelectElement, []),
      created: dart.definiteFunctionType(html$.SelectElement, [])
    }),
    fields: () => ({
      [dartx.autofocus]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.labels]: ListOfNode(),
      [dartx.length]: core.int,
      [dartx.multiple]: core.bool,
      [dartx.name]: core.String,
      [dartx.required]: core.bool,
      [dartx.selectedIndex]: core.int,
      [dartx.size]: core.int,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool
    }),
    getters: () => ({
      [dartx.options]: dart.definiteFunctionType(core.List$(html$.OptionElement), []),
      [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html$.OptionElement), [])
    }),
    methods: () => ({
      [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html$.OptionElement]),
      [dartx.add]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.OptionElement, [core.String]),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLSelectElement, html$.SelectElement);
  dart.defineExtensionNames([
    'addRange',
    'collapse',
    'collapseToEnd',
    'collapseToStart',
    'containsNode',
    'deleteFromDocument',
    'empty',
    'extend',
    'getRangeAt',
    'modify',
    'removeAllRanges',
    'selectAllChildren',
    'setBaseAndExtent',
    'setPosition',
    'anchorNode',
    'anchorOffset',
    'baseNode',
    'baseOffset',
    'extentNode',
    'extentOffset',
    'focusNode',
    'focusOffset',
    'isCollapsed',
    'rangeCount',
    'type'
  ]);
  html$.Selection = class Selection extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.anchorNode]() {
      return this.anchorNode;
    }
    get [dartx.anchorOffset]() {
      return this.anchorOffset;
    }
    get [dartx.baseNode]() {
      return this.baseNode;
    }
    get [dartx.baseOffset]() {
      return this.baseOffset;
    }
    get [dartx.extentNode]() {
      return this.extentNode;
    }
    get [dartx.extentOffset]() {
      return this.extentOffset;
    }
    get [dartx.focusNode]() {
      return this.focusNode;
    }
    get [dartx.focusOffset]() {
      return this.focusOffset;
    }
    get [dartx.isCollapsed]() {
      return this.isCollapsed;
    }
    get [dartx.rangeCount]() {
      return this.rangeCount;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.addRange](...args) {
      return this.addRange.apply(this, args);
    }
    [dartx.collapse](...args) {
      return this.collapse.apply(this, args);
    }
    [dartx.collapseToEnd](...args) {
      return this.collapseToEnd.apply(this, args);
    }
    [dartx.collapseToStart](...args) {
      return this.collapseToStart.apply(this, args);
    }
    [dartx.containsNode](...args) {
      return this.containsNode.apply(this, args);
    }
    [dartx.deleteFromDocument](...args) {
      return this.deleteFromDocument.apply(this, args);
    }
    [dartx.empty](...args) {
      return this.empty.apply(this, args);
    }
    [dartx.extend](...args) {
      return this.extend.apply(this, args);
    }
    [dartx.getRangeAt](...args) {
      return this.getRangeAt.apply(this, args);
    }
    [dartx.modify](...args) {
      return this.modify.apply(this, args);
    }
    [dartx.removeAllRanges](...args) {
      return this.removeAllRanges.apply(this, args);
    }
    [dartx.selectAllChildren](...args) {
      return this.selectAllChildren.apply(this, args);
    }
    [dartx.setBaseAndExtent](...args) {
      return this.setBaseAndExtent.apply(this, args);
    }
    [dartx.setPosition](...args) {
      return this.setPosition.apply(this, args);
    }
  };
  dart.setSignature(html$.Selection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Selection, [])}),
    fields: () => ({
      [dartx.anchorNode]: html$.Node,
      [dartx.anchorOffset]: core.int,
      [dartx.baseNode]: html$.Node,
      [dartx.baseOffset]: core.int,
      [dartx.extentNode]: html$.Node,
      [dartx.extentOffset]: core.int,
      [dartx.focusNode]: html$.Node,
      [dartx.focusOffset]: core.int,
      [dartx.isCollapsed]: core.bool,
      [dartx.rangeCount]: core.int,
      [dartx.type]: core.String
    }),
    methods: () => ({
      [dartx.addRange]: dart.definiteFunctionType(dart.void, [html$.Range]),
      [dartx.collapse]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
      [dartx.collapseToEnd]: dart.definiteFunctionType(dart.void, []),
      [dartx.collapseToStart]: dart.definiteFunctionType(dart.void, []),
      [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html$.Node, core.bool]),
      [dartx.deleteFromDocument]: dart.definiteFunctionType(dart.void, []),
      [dartx.empty]: dart.definiteFunctionType(dart.void, []),
      [dartx.extend]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
      [dartx.getRangeAt]: dart.definiteFunctionType(html$.Range, [core.int]),
      [dartx.modify]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.removeAllRanges]: dart.definiteFunctionType(dart.void, []),
      [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int])
    })
  });
  dart.registerExtension(dart.global.Selection, html$.Selection);
  dart.defineExtensionNames([
    'close',
    'postMessage',
    'data',
    'name',
    'targetUrl'
  ]);
  html$.ServicePort = class ServicePort extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.targetUrl]() {
      return this.targetURL;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
  };
  dart.setSignature(html$.ServicePort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServicePort, [])}),
    fields: () => ({
      [dartx.data]: core.Object,
      [dartx.name]: core.String,
      [dartx.targetUrl]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.ServicePort, html$.ServicePort);
  const _connect_1 = Symbol('_connect_1');
  const _connect_2 = Symbol('_connect_2');
  dart.defineExtensionNames([
    'connect',
    'match',
    'matchAll',
    'onMessage'
  ]);
  html$.ServicePortCollection = class ServicePortCollection extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.connect](url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_connect_1](url, options_1);
      }
      return this[_connect_2](url);
    }
    [_connect_1](...args) {
      return this.connect.apply(this, args);
    }
    [_connect_2](...args) {
      return this.connect.apply(this, args);
    }
    [dartx.match](options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_match_1](options_1);
    }
    [_match_1](...args) {
      return this.match.apply(this, args);
    }
    [dartx.matchAll](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_matchAll_1](options_1);
      }
      return this[_matchAll_2]();
    }
    [_matchAll_1](...args) {
      return this.matchAll.apply(this, args);
    }
    [_matchAll_2](...args) {
      return this.matchAll.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.ServicePortCollection.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ServicePortCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServicePortCollection, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.connect]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
      [_connect_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_connect_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.match]: dart.definiteFunctionType(async.Future, [core.Map]),
      [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_matchAll_2]: dart.definiteFunctionType(async.Future, [])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.ServicePortCollection, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.ServicePortCollection, html$.ServicePortCollection);
  dart.defineExtensionNames([
    'respondWith',
    'origin',
    'targetUrl'
  ]);
  html$.ServicePortConnectEvent = class ServicePortConnectEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ServicePortConnectEvent._create_1(type, eventInitDict_1);
      }
      return html$.ServicePortConnectEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ServicePortConnectEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ServicePortConnectEvent(type);
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.targetUrl]() {
      return this.targetURL;
    }
    [dartx.respondWith](...args) {
      return this.respondWith.apply(this, args);
    }
  };
  dart.setSignature(html$.ServicePortConnectEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ServicePortConnectEvent, []),
      new: dart.definiteFunctionType(html$.ServicePortConnectEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.origin]: core.String,
      [dartx.targetUrl]: core.String
    }),
    methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(async.Future, [async.Future])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ServicePortConnectEvent, html$.ServicePortConnectEvent);
  dart.defineExtensionNames([
    'getRegistration',
    'getRegistrations',
    'register',
    'onMessage',
    'controller',
    'ready'
  ]);
  html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.controller]() {
      return this.controller;
    }
    get [dartx.ready]() {
      return this.ready;
    }
    [dartx.getRegistration](...args) {
      return this.getRegistration.apply(this, args);
    }
    [dartx.getRegistrations](...args) {
      return this.getRegistrations.apply(this, args);
    }
    [dartx.register](url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_register_1](url, options_1);
      }
      return this[_register_2](url);
    }
    [_register_1](...args) {
      return this.register.apply(this, args);
    }
    [_register_2](...args) {
      return this.register.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ServiceWorkerContainer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerContainer, [])}),
    fields: () => ({
      [dartx.controller]: html$._ServiceWorker,
      [dartx.ready]: async.Future
    }),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [], [core.String]),
      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
      [dartx.register]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_register_2]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.ServiceWorkerContainer, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.ServiceWorkerContainer, html$.ServiceWorkerContainer);
  dart.defineExtensionNames([
    'skipWaiting',
    'onMessage',
    'clients',
    'ports',
    'registration'
  ]);
  html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.clients]() {
      return this.clients;
    }
    get [dartx.ports]() {
      return this.ports;
    }
    get [dartx.registration]() {
      return this.registration;
    }
    [dartx.skipWaiting](...args) {
      return this.skipWaiting.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ServiceWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerGlobalScope, [])}),
    fields: () => ({
      [dartx.clients]: html$.Clients,
      [dartx.ports]: html$.StashedPortCollection,
      [dartx.registration]: html$.ServiceWorkerRegistration
    }),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({[dartx.skipWaiting]: dart.definiteFunctionType(async.Future, [])}),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.ServiceWorkerGlobalScope, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html$.ServiceWorkerGlobalScope);
  dart.defineExtensionNames([
    'data',
    'lastEventId',
    'origin',
    'ports',
    'source'
  ]);
  html$.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html$.Event {
    get [dartx.data]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
    }
    get [_get_data]() {
      return this.data;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.ServiceWorkerMessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ServiceWorkerMessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ServiceWorkerMessageEvent(type);
    }
    get [dartx.lastEventId]() {
      return this.lastEventId;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.ports]() {
      return this.ports;
    }
    get [dartx.source]() {
      return this.source;
    }
  };
  dart.setSignature(html$.ServiceWorkerMessageEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, []),
      new: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_get_data]: dart.dynamic,
      [dartx.lastEventId]: core.String,
      [dartx.origin]: core.String,
      [dartx.ports]: ListOfMessagePort(),
      [dartx.source]: core.Object
    }),
    getters: () => ({[dartx.data]: dart.definiteFunctionType(dart.dynamic, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html$.ServiceWorkerMessageEvent);
  const _getNotifications_1 = Symbol('_getNotifications_1');
  const _getNotifications_2 = Symbol('_getNotifications_2');
  const _showNotification_1 = Symbol('_showNotification_1');
  const _showNotification_2 = Symbol('_showNotification_2');
  dart.defineExtensionNames([
    'getNotifications',
    'showNotification',
    'unregister',
    'update',
    'active',
    'geofencing',
    'installing',
    'periodicSync',
    'pushManager',
    'scope',
    'sync',
    'waiting'
  ]);
  html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.active]() {
      return this.active;
    }
    get [dartx.geofencing]() {
      return this.geofencing;
    }
    get [dartx.installing]() {
      return this.installing;
    }
    get [dartx.periodicSync]() {
      return this.periodicSync;
    }
    get [dartx.pushManager]() {
      return this.pushManager;
    }
    get [dartx.scope]() {
      return this.scope;
    }
    get [dartx.sync]() {
      return this.sync;
    }
    get [dartx.waiting]() {
      return this.waiting;
    }
    [dartx.getNotifications](filter) {
      if (filter === void 0) filter = null;
      if (filter != null) {
        let filter_1 = html_common.convertDartToNative_Dictionary(filter);
        return this[_getNotifications_1](filter_1);
      }
      return this[_getNotifications_2]();
    }
    [_getNotifications_1](...args) {
      return this.getNotifications.apply(this, args);
    }
    [_getNotifications_2](...args) {
      return this.getNotifications.apply(this, args);
    }
    [dartx.showNotification](title, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_showNotification_1](title, options_1);
      }
      return this[_showNotification_2](title);
    }
    [_showNotification_1](...args) {
      return this.showNotification.apply(this, args);
    }
    [_showNotification_2](...args) {
      return this.showNotification.apply(this, args);
    }
    [dartx.unregister](...args) {
      return this.unregister.apply(this, args);
    }
    [dartx.update](...args) {
      return this.update.apply(this, args);
    }
  };
  dart.setSignature(html$.ServiceWorkerRegistration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerRegistration, [])}),
    fields: () => ({
      [dartx.active]: html$._ServiceWorker,
      [dartx.geofencing]: html$.Geofencing,
      [dartx.installing]: html$._ServiceWorker,
      [dartx.periodicSync]: html$.PeriodicSyncManager,
      [dartx.pushManager]: html$.PushManager,
      [dartx.scope]: core.String,
      [dartx.sync]: html$.SyncManager,
      [dartx.waiting]: html$._ServiceWorker
    }),
    methods: () => ({
      [dartx.getNotifications]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_getNotifications_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_getNotifications_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.showNotification]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
      [_showNotification_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_showNotification_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.unregister]: dart.definiteFunctionType(async.Future, []),
      [dartx.update]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.ServiceWorkerRegistration, html$.ServiceWorkerRegistration);
  dart.defineExtensionNames([
    'getDistributedNodes'
  ]);
  html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ShadowElement._check(html$.document[dartx.createElement]("shadow"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('shadow');
    }
    [dartx.getDistributedNodes](...args) {
      return this.getDistributedNodes.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ShadowElement, 'created');
  dart.setSignature(html$.ShadowElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ShadowElement, []),
      new: dart.definiteFunctionType(html$.ShadowElement, []),
      created: dart.definiteFunctionType(html$.ShadowElement, [])
    }),
    methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLShadowElement, html$.ShadowElement);
  dart.defineExtensionNames([
    'clone',
    'elementFromPoint',
    'elementsFromPoint',
    'getSelection',
    'resetStyleInheritance',
    'resetStyleInheritance',
    'applyAuthorStyles',
    'applyAuthorStyles',
    'activeElement',
    'delegatesFocus',
    'host',
    'innerHtml',
    'olderShadowRoot',
    'styleSheets'
  ]);
  html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.activeElement]() {
      return this.activeElement;
    }
    get [dartx.delegatesFocus]() {
      return this.delegatesFocus;
    }
    get [dartx.host]() {
      return this.host;
    }
    get [dartx.innerHtml]() {
      return this.innerHTML;
    }
    set [dartx.innerHtml](value) {
      this.innerHTML = value;
    }
    get [dartx.olderShadowRoot]() {
      return this.olderShadowRoot;
    }
    get [dartx.styleSheets]() {
      return this.styleSheets;
    }
    [dartx.clone](...args) {
      return this.cloneNode.apply(this, args);
    }
    [dartx.elementFromPoint](...args) {
      return this.elementFromPoint.apply(this, args);
    }
    [dartx.elementsFromPoint](...args) {
      return this.elementsFromPoint.apply(this, args);
    }
    [dartx.getSelection](...args) {
      return this.getSelection.apply(this, args);
    }
    static get supported() {
      return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
    }
    static _shadowRootDeprecationReport() {
      if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
        html$.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
        html$.ShadowRoot._shadowRootDeprecationReported = true;
      }
    }
    get [dartx.resetStyleInheritance]() {
      html$.ShadowRoot._shadowRootDeprecationReport();
      return false;
    }
    set [dartx.resetStyleInheritance](value) {
      html$.ShadowRoot._shadowRootDeprecationReport();
    }
    get [dartx.applyAuthorStyles]() {
      html$.ShadowRoot._shadowRootDeprecationReport();
      return false;
    }
    set [dartx.applyAuthorStyles](value) {
      html$.ShadowRoot._shadowRootDeprecationReport();
    }
  };
  const innerHtml = Symbol(html$.ShadowRoot.name + "." + dartx.innerHtml.toString());
  dart.setSignature(html$.ShadowRoot, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ShadowRoot, [])}),
    fields: () => ({
      [dartx.activeElement]: html$.Element,
      [dartx.delegatesFocus]: core.bool,
      [dartx.host]: html$.Element,
      [dartx.innerHtml]: core.String,
      [dartx.olderShadowRoot]: html$.ShadowRoot,
      [dartx.styleSheets]: ListOfStyleSheet()
    }),
    getters: () => ({
      [dartx.resetStyleInheritance]: dart.definiteFunctionType(core.bool, []),
      [dartx.applyAuthorStyles]: dart.definiteFunctionType(core.bool, [])
    }),
    setters: () => ({
      [dartx.resetStyleInheritance]: dart.definiteFunctionType(dart.void, [core.bool]),
      [dartx.applyAuthorStyles]: dart.definiteFunctionType(dart.void, [core.bool])
    }),
    methods: () => ({
      [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
      [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
      [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, [])
    }),
    sfields: () => ({_shadowRootDeprecationReported: core.bool}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_shadowRootDeprecationReport: dart.definiteFunctionType(dart.void, [])}),
    names: ['_shadowRootDeprecationReport']
  });
  html$.ShadowRoot._shadowRootDeprecationReported = false;
  dart.registerExtension(dart.global.ShadowRoot, html$.ShadowRoot);
  dart.defineExtensionNames([
    'byteLength'
  ]);
  html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.byteLength]() {
      return this.byteLength;
    }
  };
  dart.setSignature(html$.SharedArrayBuffer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SharedArrayBuffer, [])}),
    fields: () => ({[dartx.byteLength]: core.int})
  });
  dart.registerExtension(dart.global.SharedArrayBuffer, html$.SharedArrayBuffer);
  dart.defineExtensionNames([
    'onError',
    'port',
    'workerStart'
  ]);
  html$.SharedWorker = class SharedWorker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(scriptURL, name) {
      if (name === void 0) name = null;
      if (name != null) {
        return html$.SharedWorker._create_1(scriptURL, name);
      }
      return html$.SharedWorker._create_2(scriptURL);
    }
    static _create_1(scriptURL, name) {
      return new SharedWorker(scriptURL, name);
    }
    static _create_2(scriptURL) {
      return new SharedWorker(scriptURL);
    }
    get [dartx.port]() {
      return this.port;
    }
    get [dartx.workerStart]() {
      return this.workerStart;
    }
    get [dartx.onError]() {
      return html$.SharedWorker.errorEvent.forTarget(this);
    }
  };
  html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$.SharedWorker, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SharedWorker, []),
      new: dart.definiteFunctionType(html$.SharedWorker, [core.String], [core.String])
    }),
    fields: () => ({
      [dartx.port]: html$.MessagePort,
      [dartx.workerStart]: core.double
    }),
    getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({errorEvent: EventStreamProviderOfEvent()}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.defineLazy(html$.SharedWorker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.registerExtension(dart.global.SharedWorker, html$.SharedWorker);
  dart.defineExtensionNames([
    'onConnect',
    'name'
  ]);
  html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.onConnect]() {
      return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.SharedWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SharedWorkerGlobalScope, [])}),
    fields: () => ({[dartx.name]: core.String}),
    getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({connectEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.SharedWorkerGlobalScope, {
    get connectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('connect'));
    }
  });
  dart.registerExtension(dart.global.SharedWorkerGlobalScope, html$.SharedWorkerGlobalScope);
  dart.defineExtensionNames([
    'abort',
    'appendBuffer',
    'appendStream',
    'appendTypedData',
    'remove',
    'appendWindowEnd',
    'appendWindowStart',
    'buffered',
    'mode',
    'timestampOffset',
    'trackDefaults',
    'updating'
  ]);
  html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.appendWindowEnd]() {
      return this.appendWindowEnd;
    }
    set [dartx.appendWindowEnd](value) {
      this.appendWindowEnd = value;
    }
    get [dartx.appendWindowStart]() {
      return this.appendWindowStart;
    }
    set [dartx.appendWindowStart](value) {
      this.appendWindowStart = value;
    }
    get [dartx.buffered]() {
      return this.buffered;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    set [dartx.mode](value) {
      this.mode = value;
    }
    get [dartx.timestampOffset]() {
      return this.timestampOffset;
    }
    set [dartx.timestampOffset](value) {
      this.timestampOffset = value;
    }
    get [dartx.trackDefaults]() {
      return this.trackDefaults;
    }
    set [dartx.trackDefaults](value) {
      this.trackDefaults = value;
    }
    get [dartx.updating]() {
      return this.updating;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.appendBuffer](...args) {
      return this.appendBuffer.apply(this, args);
    }
    [dartx.appendStream](...args) {
      return this.appendStream.apply(this, args);
    }
    [dartx.appendTypedData](...args) {
      return this.appendBuffer.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
  };
  dart.setSignature(html$.SourceBuffer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SourceBuffer, [])}),
    fields: () => ({
      [dartx.appendWindowEnd]: core.num,
      [dartx.appendWindowStart]: core.num,
      [dartx.buffered]: html$.TimeRanges,
      [dartx.mode]: core.String,
      [dartx.timestampOffset]: core.num,
      [dartx.trackDefaults]: html$.TrackDefaultList,
      [dartx.updating]: core.bool
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.appendBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
      [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html$.FileStream], [core.int]),
      [dartx.appendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData]),
      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.SourceBuffer, html$.SourceBuffer);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.SourceBufferList = class SourceBufferList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.SourceBuffer), html$.ImmutableListMixin$(html$.SourceBuffer)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
  dart.setSignature(html$.SourceBufferList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SourceBufferList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.SourceBuffer, []),
      [dartx.last]: dart.definiteFunctionType(html$.SourceBuffer, []),
      [dartx.single]: dart.definiteFunctionType(html$.SourceBuffer, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SourceBuffer]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.SourceBuffer, [core.int])
    })
  });
  dart.registerExtension(dart.global.SourceBufferList, html$.SourceBufferList);
  dart.defineExtensionNames([
    'media',
    'sizes',
    'src',
    'srcset',
    'type'
  ]);
  html$.SourceElement = class SourceElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SourceElement._check(html$.document[dartx.createElement]("source"));
    }
    created() {
      this[dartx.media] = null;
      this[dartx.sizes] = null;
      this[dartx.src] = null;
      this[dartx.srcset] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.sizes]() {
      return this.sizes;
    }
    set [dartx.sizes](value) {
      this.sizes = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srcset]() {
      return this.srcset;
    }
    set [dartx.srcset](value) {
      this.srcset = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.SourceElement, 'created');
  dart.setSignature(html$.SourceElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SourceElement, []),
      new: dart.definiteFunctionType(html$.SourceElement, []),
      created: dart.definiteFunctionType(html$.SourceElement, [])
    }),
    fields: () => ({
      [dartx.media]: core.String,
      [dartx.sizes]: core.String,
      [dartx.src]: core.String,
      [dartx.srcset]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLSourceElement, html$.SourceElement);
  dart.defineExtensionNames([
    'facing',
    'id',
    'kind',
    'label'
  ]);
  html$.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.facing]() {
      return this.facing;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
  };
  dart.setSignature(html$.SourceInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SourceInfo, [])}),
    fields: () => ({
      [dartx.facing]: core.String,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String
    })
  });
  dart.registerExtension(dart.global.SourceInfo, html$.SourceInfo);
  html$.SpanElement = class SpanElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SpanElement._check(html$.document[dartx.createElement]("span"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.SpanElement, 'created');
  dart.setSignature(html$.SpanElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpanElement, []),
      new: dart.definiteFunctionType(html$.SpanElement, []),
      created: dart.definiteFunctionType(html$.SpanElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLSpanElement, html$.SpanElement);
  dart.defineExtensionNames([
    'src',
    'weight'
  ]);
  html$.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SpeechGrammar._create_1();
    }
    static _create_1() {
      return new SpeechGrammar();
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.weight]() {
      return this.weight;
    }
    set [dartx.weight](value) {
      this.weight = value;
    }
  };
  dart.setSignature(html$.SpeechGrammar, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechGrammar, []),
      new: dart.definiteFunctionType(html$.SpeechGrammar, [])
    }),
    fields: () => ({
      [dartx.src]: core.String,
      [dartx.weight]: core.num
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammar, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.SpeechGrammar, html$.SpeechGrammar);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'addFromString',
    'addFromUri',
    'item'
  ]);
  html$.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechGrammar), html$.ImmutableListMixin$(html$.SpeechGrammar)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SpeechGrammarList._create_1();
    }
    static _create_1() {
      return new SpeechGrammarList();
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.addFromString](...args) {
      return this.addFromString.apply(this, args);
    }
    [dartx.addFromUri](...args) {
      return this.addFromUri.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
  dart.setSignature(html$.SpeechGrammarList, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechGrammarList, []),
      new: dart.definiteFunctionType(html$.SpeechGrammarList, [])
    }),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.SpeechGrammar, []),
      [dartx.last]: dart.definiteFunctionType(html$.SpeechGrammar, []),
      [dartx.single]: dart.definiteFunctionType(html$.SpeechGrammar, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechGrammar]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
      [dartx.addFromString]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
      [dartx.addFromUri]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
      [dartx.item]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammarList, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.SpeechGrammarList, html$.SpeechGrammarList);
  dart.defineExtensionNames([
    'abort',
    'start',
    'stop',
    'onAudioEnd',
    'onAudioStart',
    'onEnd',
    'onError',
    'onNoMatch',
    'onResult',
    'onSoundEnd',
    'onSoundStart',
    'onSpeechEnd',
    'onSpeechStart',
    'onStart',
    'audioTrack',
    'continuous',
    'grammars',
    'interimResults',
    'lang',
    'maxAlternatives',
    'serviceUri'
  ]);
  html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
    }
    get [dartx.audioTrack]() {
      return this.audioTrack;
    }
    set [dartx.audioTrack](value) {
      this.audioTrack = value;
    }
    get [dartx.continuous]() {
      return this.continuous;
    }
    set [dartx.continuous](value) {
      this.continuous = value;
    }
    get [dartx.grammars]() {
      return this.grammars;
    }
    set [dartx.grammars](value) {
      this.grammars = value;
    }
    get [dartx.interimResults]() {
      return this.interimResults;
    }
    set [dartx.interimResults](value) {
      this.interimResults = value;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    set [dartx.lang](value) {
      this.lang = value;
    }
    get [dartx.maxAlternatives]() {
      return this.maxAlternatives;
    }
    set [dartx.maxAlternatives](value) {
      this.maxAlternatives = value;
    }
    get [dartx.serviceUri]() {
      return this.serviceURI;
    }
    set [dartx.serviceUri](value) {
      this.serviceURI = value;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onAudioEnd]() {
      return html$.SpeechRecognition.audioEndEvent.forTarget(this);
    }
    get [dartx.onAudioStart]() {
      return html$.SpeechRecognition.audioStartEvent.forTarget(this);
    }
    get [dartx.onEnd]() {
      return html$.SpeechRecognition.endEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.SpeechRecognition.errorEvent.forTarget(this);
    }
    get [dartx.onNoMatch]() {
      return html$.SpeechRecognition.noMatchEvent.forTarget(this);
    }
    get [dartx.onResult]() {
      return html$.SpeechRecognition.resultEvent.forTarget(this);
    }
    get [dartx.onSoundEnd]() {
      return html$.SpeechRecognition.soundEndEvent.forTarget(this);
    }
    get [dartx.onSoundStart]() {
      return html$.SpeechRecognition.soundStartEvent.forTarget(this);
    }
    get [dartx.onSpeechEnd]() {
      return html$.SpeechRecognition.speechEndEvent.forTarget(this);
    }
    get [dartx.onSpeechStart]() {
      return html$.SpeechRecognition.speechStartEvent.forTarget(this);
    }
    get [dartx.onStart]() {
      return html$.SpeechRecognition.startEvent.forTarget(this);
    }
    static new() {
      return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
    }
  };
  dart.setSignature(html$.SpeechRecognition, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechRecognition, []),
      new: dart.definiteFunctionType(html$.SpeechRecognition, [])
    }),
    fields: () => ({
      [dartx.audioTrack]: html$.MediaStreamTrack,
      [dartx.continuous]: core.bool,
      [dartx.grammars]: html$.SpeechGrammarList,
      [dartx.interimResults]: core.bool,
      [dartx.lang]: core.String,
      [dartx.maxAlternatives]: core.int,
      [dartx.serviceUri]: core.String
    }),
    getters: () => ({
      [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionError), []),
      [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
      [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
      [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.start]: dart.definiteFunctionType(dart.void, []),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      audioEndEvent: EventStreamProviderOfEvent(),
      audioStartEvent: EventStreamProviderOfEvent(),
      endEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfSpeechRecognitionError(),
      noMatchEvent: EventStreamProviderOfSpeechRecognitionEvent(),
      resultEvent: EventStreamProviderOfSpeechRecognitionEvent(),
      soundEndEvent: EventStreamProviderOfEvent(),
      soundStartEvent: EventStreamProviderOfEvent(),
      speechEndEvent: EventStreamProviderOfEvent(),
      speechStartEvent: EventStreamProviderOfEvent(),
      startEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineLazy(html$.SpeechRecognition, {
    get audioEndEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('audioend'));
    },
    get audioStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('audiostart'));
    },
    get endEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('end'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfSpeechRecognitionError())('error'));
    },
    get noMatchEvent() {
      return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('nomatch'));
    },
    get resultEvent() {
      return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('result'));
    },
    get soundEndEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('soundend'));
    },
    get soundStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('soundstart'));
    },
    get speechEndEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('speechend'));
    },
    get speechStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('speechstart'));
    },
    get startEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('start'));
    }
  });
  dart.registerExtension(dart.global.SpeechRecognition, html$.SpeechRecognition);
  dart.defineExtensionNames([
    'confidence',
    'transcript'
  ]);
  html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.confidence]() {
      return this.confidence;
    }
    get [dartx.transcript]() {
      return this.transcript;
    }
  };
  dart.setSignature(html$.SpeechRecognitionAlternative, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [])}),
    fields: () => ({
      [dartx.confidence]: core.double,
      [dartx.transcript]: core.String
    })
  });
  dart.registerExtension(dart.global.SpeechRecognitionAlternative, html$.SpeechRecognitionAlternative);
  dart.defineExtensionNames([
    'error',
    'message'
  ]);
  html$.SpeechRecognitionError = class SpeechRecognitionError extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, initDict) {
      if (initDict === void 0) initDict = null;
      if (initDict != null) {
        let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
        return html$.SpeechRecognitionError._create_1(type, initDict_1);
      }
      return html$.SpeechRecognitionError._create_2(type);
    }
    static _create_1(type, initDict) {
      return new SpeechRecognitionError(type, initDict);
    }
    static _create_2(type) {
      return new SpeechRecognitionError(type);
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(html$.SpeechRecognitionError, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechRecognitionError, []),
      new: dart.definiteFunctionType(html$.SpeechRecognitionError, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.error]: core.String,
      [dartx.message]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.SpeechRecognitionError, html$.SpeechRecognitionError);
  dart.defineExtensionNames([
    'emma',
    'interpretation',
    'resultIndex',
    'results'
  ]);
  html$.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, initDict) {
      if (initDict === void 0) initDict = null;
      if (initDict != null) {
        let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
        return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
      }
      return html$.SpeechRecognitionEvent._create_2(type);
    }
    static _create_1(type, initDict) {
      return new SpeechRecognitionEvent(type, initDict);
    }
    static _create_2(type) {
      return new SpeechRecognitionEvent(type);
    }
    get [dartx.emma]() {
      return this.emma;
    }
    get [dartx.interpretation]() {
      return this.interpretation;
    }
    get [dartx.resultIndex]() {
      return this.resultIndex;
    }
    get [dartx.results]() {
      return this.results;
    }
  };
  dart.setSignature(html$.SpeechRecognitionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechRecognitionEvent, []),
      new: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.emma]: html$.Document,
      [dartx.interpretation]: html$.Document,
      [dartx.resultIndex]: core.int,
      [dartx.results]: ListOfSpeechRecognitionResult()
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.SpeechRecognitionEvent, html$.SpeechRecognitionEvent);
  dart.defineExtensionNames([
    'item',
    'isFinal',
    'length'
  ]);
  html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.isFinal]() {
      return this.isFinal;
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.SpeechRecognitionResult, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])}),
    fields: () => ({
      [dartx.isFinal]: core.bool,
      [dartx.length]: core.int
    }),
    methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [core.int])})
  });
  dart.registerExtension(dart.global.SpeechRecognitionResult, html$.SpeechRecognitionResult);
  dart.defineExtensionNames([
    'cancel',
    'getVoices',
    'pause',
    'resume',
    'speak',
    'paused',
    'pending',
    'speaking'
  ]);
  html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.paused]() {
      return this.paused;
    }
    get [dartx.pending]() {
      return this.pending;
    }
    get [dartx.speaking]() {
      return this.speaking;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.getVoices](...args) {
      return this.getVoices.apply(this, args);
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.resume](...args) {
      return this.resume.apply(this, args);
    }
    [dartx.speak](...args) {
      return this.speak.apply(this, args);
    }
  };
  dart.setSignature(html$.SpeechSynthesis, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesis, [])}),
    fields: () => ({
      [dartx.paused]: core.bool,
      [dartx.pending]: core.bool,
      [dartx.speaking]: core.bool
    }),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
      [dartx.getVoices]: dart.definiteFunctionType(core.List$(html$.SpeechSynthesisVoice), []),
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.resume]: dart.definiteFunctionType(dart.void, []),
      [dartx.speak]: dart.definiteFunctionType(dart.void, [html$.SpeechSynthesisUtterance])
    })
  });
  dart.registerExtension(dart.global.SpeechSynthesis, html$.SpeechSynthesis);
  dart.defineExtensionNames([
    'charIndex',
    'elapsedTime',
    'name',
    'utterance'
  ]);
  html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.charIndex]() {
      return this.charIndex;
    }
    get [dartx.elapsedTime]() {
      return this.elapsedTime;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.utterance]() {
      return this.utterance;
    }
  };
  dart.setSignature(html$.SpeechSynthesisEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisEvent, [])}),
    fields: () => ({
      [dartx.charIndex]: core.int,
      [dartx.elapsedTime]: core.double,
      [dartx.name]: core.String,
      [dartx.utterance]: html$.SpeechSynthesisUtterance
    })
  });
  dart.registerExtension(dart.global.SpeechSynthesisEvent, html$.SpeechSynthesisEvent);
  dart.defineExtensionNames([
    'onBoundary',
    'onEnd',
    'onError',
    'onMark',
    'onPause',
    'onResume',
    'onStart',
    'lang',
    'pitch',
    'rate',
    'text',
    'voice',
    'volume'
  ]);
  html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(text) {
      if (text === void 0) text = null;
      if (text != null) {
        return html$.SpeechSynthesisUtterance._create_1(text);
      }
      return html$.SpeechSynthesisUtterance._create_2();
    }
    static _create_1(text) {
      return new SpeechSynthesisUtterance(text);
    }
    static _create_2() {
      return new SpeechSynthesisUtterance();
    }
    get [dartx.lang]() {
      return this.lang;
    }
    set [dartx.lang](value) {
      this.lang = value;
    }
    get [dartx.pitch]() {
      return this.pitch;
    }
    set [dartx.pitch](value) {
      this.pitch = value;
    }
    get [dartx.rate]() {
      return this.rate;
    }
    set [dartx.rate](value) {
      this.rate = value;
    }
    get [dartx.text]() {
      return this.text;
    }
    set [dartx.text](value) {
      this.text = value;
    }
    get [dartx.voice]() {
      return this.voice;
    }
    set [dartx.voice](value) {
      this.voice = value;
    }
    get [dartx.volume]() {
      return this.volume;
    }
    set [dartx.volume](value) {
      this.volume = value;
    }
    get [dartx.onBoundary]() {
      return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
    }
    get [dartx.onEnd]() {
      return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
    }
    get [dartx.onMark]() {
      return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
    }
    get [dartx.onPause]() {
      return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
    }
    get [dartx.onResume]() {
      return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
    }
    get [dartx.onStart]() {
      return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.SpeechSynthesisUtterance, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, []),
      new: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [], [core.String])
    }),
    fields: () => ({
      [dartx.lang]: core.String,
      [dartx.pitch]: core.num,
      [dartx.rate]: core.num,
      [dartx.text]: core.String,
      [dartx.voice]: html$.SpeechSynthesisVoice,
      [dartx.volume]: core.num
    }),
    getters: () => ({
      [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), [])
    }),
    sfields: () => ({
      boundaryEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      endEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      markEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      resumeEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      startEvent: EventStreamProviderOfSpeechSynthesisEvent()
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.defineLazy(html$.SpeechSynthesisUtterance, {
    get boundaryEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('boundary'));
    },
    get endEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('end'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get markEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('mark'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get resumeEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('resume'));
    },
    get startEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('start'));
    }
  });
  dart.registerExtension(dart.global.SpeechSynthesisUtterance, html$.SpeechSynthesisUtterance);
  dart.defineExtensionNames([
    'defaultValue',
    'lang',
    'localService',
    'name',
    'voiceUri'
  ]);
  html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.defaultValue]() {
      return this.default;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    get [dartx.localService]() {
      return this.localService;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.voiceUri]() {
      return this.voiceURI;
    }
  };
  dart.setSignature(html$.SpeechSynthesisVoice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisVoice, [])}),
    fields: () => ({
      [dartx.defaultValue]: core.bool,
      [dartx.lang]: core.String,
      [dartx.localService]: core.bool,
      [dartx.name]: core.String,
      [dartx.voiceUri]: core.String
    })
  });
  dart.registerExtension(dart.global.SpeechSynthesisVoice, html$.SpeechSynthesisVoice);
  dart.defineExtensionNames([
    'name'
  ]);
  html$.StashedMessagePort = class StashedMessagePort extends html$.MessagePort {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
  };
  dart.setSignature(html$.StashedMessagePort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StashedMessagePort, [])}),
    fields: () => ({[dartx.name]: core.String})
  });
  dart.registerExtension(dart.global.StashedMessagePort, html$.StashedMessagePort);
  dart.defineExtensionNames([
    'add',
    'onMessage'
  ]);
  html$.StashedPortCollection = class StashedPortCollection extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.StashedPortCollection.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.StashedPortCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StashedPortCollection, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({[dartx.add]: dart.definiteFunctionType(html$.StashedMessagePort, [core.String, html$.MessagePort])}),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.StashedPortCollection, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.StashedPortCollection, html$.StashedPortCollection);
  const _getItem = Symbol('_getItem');
  const _setItem = Symbol('_setItem');
  const _removeItem = Symbol('_removeItem');
  const _key = Symbol('_key');
  const _length$3 = Symbol('_length');
  const __delete__ = Symbol('__delete__');
  dart.defineExtensionNames([
    'addAll',
    'containsValue',
    'containsKey',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  html$.Storage = class Storage extends _interceptors.Interceptor {
    [dartx.addAll](other) {
      other[dartx.forEach](dart.fn((k, v) => {
        this[dartx._set](k, v);
      }, StringAndStringTovoid$()));
    }
    [dartx.containsValue](value) {
      return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
    }
    [dartx.containsKey](key) {
      return this[_getItem](core.String._check(key)) != null;
    }
    [dartx._get](key) {
      return this[_getItem](core.String._check(key));
    }
    [dartx._set](key, value) {
      this[_setItem](key, value);
      return value;
    }
    [dartx.putIfAbsent](key, ifAbsent) {
      if (!dart.test(this[dartx.containsKey](key))) this[dartx._set](key, ifAbsent());
      return this[dartx._get](key);
    }
    [dartx.remove](key) {
      let value = this[dartx._get](key);
      this[_removeItem](core.String._check(key));
      return value;
    }
    [dartx.clear]() {
      return this[_clear$1]();
    }
    [dartx.forEach](f) {
      for (let i = 0; true; i++) {
        let key = this[_key](i);
        if (key == null) return;
        f(key, this[dartx._get](key));
      }
    }
    get [dartx.keys]() {
      let keys = JSArrayOfString().of([]);
      this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid$()));
      return keys;
    }
    get [dartx.values]() {
      let values = JSArrayOfString().of([]);
      this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid$()));
      return values;
    }
    get [dartx.length]() {
      return this[_length$3];
    }
    get [dartx.isEmpty]() {
      return this[_key](0) == null;
    }
    get [dartx.isNotEmpty]() {
      return !dart.test(this[dartx.isEmpty]);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [_length$3]() {
      return this.length;
    }
    [__delete__](...args) {
      return this.__delete__.apply(this, args);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
    [_clear$1](...args) {
      return this.clear.apply(this, args);
    }
    [_getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [_key](...args) {
      return this.key.apply(this, args);
    }
    [_removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [_setItem](...args) {
      return this.setItem.apply(this, args);
    }
  };
  html$.Storage[dart.implements] = () => [MapOfString$String()];
  dart.setSignature(html$.Storage, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Storage, [])}),
    fields: () => ({[_length$3]: core.int}),
    getters: () => ({
      [dartx.keys]: dart.definiteFunctionType(core.Iterable$(core.String), []),
      [dartx.values]: dart.definiteFunctionType(core.Iterable$(core.String), []),
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [dartx.addAll]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      [dartx.containsValue]: dart.definiteFunctionType(core.bool, [core.Object]),
      [dartx.containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
      [dartx._get]: dart.definiteFunctionType(core.String, [core.Object]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.putIfAbsent]: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
      [dartx.remove]: dart.definiteFunctionType(core.String, [core.Object]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.forEach]: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
      [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
      [_clear$1]: dart.definiteFunctionType(dart.void, []),
      [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
      [_key]: dart.definiteFunctionType(core.String, [core.int]),
      [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
      [_setItem]: dart.definiteFunctionType(dart.void, [core.String, core.String])
    })
  });
  dart.registerExtension(dart.global.Storage, html$.Storage);
  html$.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html$.DomError]));
  const _initStorageEvent = Symbol('_initStorageEvent');
  dart.defineExtensionNames([
    'key',
    'newValue',
    'oldValue',
    'storageArea',
    'url'
  ]);
  html$.StorageEvent = class StorageEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let key = opts && 'key' in opts ? opts.key : null;
      let oldValue = opts && 'oldValue' in opts ? opts.oldValue : null;
      let newValue = opts && 'newValue' in opts ? opts.newValue : null;
      let url = opts && 'url' in opts ? opts.url : null;
      let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
      let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
      e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
      return e;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.StorageEvent._create_1(type, eventInitDict_1);
      }
      return html$.StorageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new StorageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new StorageEvent(type);
    }
    get [dartx.key]() {
      return this.key;
    }
    get [dartx.newValue]() {
      return this.newValue;
    }
    get [dartx.oldValue]() {
      return this.oldValue;
    }
    get [dartx.storageArea]() {
      return this.storageArea;
    }
    get [dartx.url]() {
      return this.url;
    }
    [_initStorageEvent](...args) {
      return this.initStorageEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.StorageEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html$.Storage}),
      _: dart.definiteFunctionType(html$.StorageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.key]: core.String,
      [dartx.newValue]: core.String,
      [dartx.oldValue]: core.String,
      [dartx.storageArea]: html$.Storage,
      [dartx.url]: core.String
    }),
    methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.StorageEvent, html$.StorageEvent);
  dart.defineExtensionNames([
    'quota',
    'usage'
  ]);
  html$.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.quota]() {
      return this.quota;
    }
    get [dartx.usage]() {
      return this.usage;
    }
  };
  dart.setSignature(html$.StorageInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StorageInfo, [])}),
    fields: () => ({
      [dartx.quota]: core.int,
      [dartx.usage]: core.int
    })
  });
  dart.registerExtension(dart.global.StorageInfo, html$.StorageInfo);
  dart.defineExtensionNames([
    'queryInfo',
    'requestPersistentQuota',
    'supportedTypes'
  ]);
  html$.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.supportedTypes]() {
      return this.supportedTypes;
    }
    [dartx.queryInfo](...args) {
      return this.queryInfo.apply(this, args);
    }
    [dartx.requestPersistentQuota](...args) {
      return this.requestPersistentQuota.apply(this, args);
    }
  };
  dart.setSignature(html$.StorageQuota, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StorageQuota, [])}),
    fields: () => ({[dartx.supportedTypes]: ListOfString()}),
    methods: () => ({
      [dartx.queryInfo]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.requestPersistentQuota]: dart.definiteFunctionType(async.Future, [core.int])
    })
  });
  dart.registerExtension(dart.global.StorageQuota, html$.StorageQuota);
  html$.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
  html$.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
  html$._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
  dart.defineExtensionNames([
    'disabled',
    'media',
    'sheet',
    'type'
  ]);
  html$.StyleElement = class StyleElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.StyleElement._check(html$.document[dartx.createElement]("style"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.media] = null;
      this[dartx.sheet] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.StyleElement, 'created');
  dart.setSignature(html$.StyleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.StyleElement, []),
      new: dart.definiteFunctionType(html$.StyleElement, []),
      created: dart.definiteFunctionType(html$.StyleElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.media]: core.String,
      [dartx.sheet]: html$.StyleSheet,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLStyleElement, html$.StyleElement);
  dart.defineExtensionNames([
    'matchMedium',
    'type'
  ]);
  html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.matchMedium](...args) {
      return this.matchMedium.apply(this, args);
    }
  };
  dart.setSignature(html$.StyleMedia, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StyleMedia, [])}),
    fields: () => ({[dartx.type]: core.String}),
    methods: () => ({[dartx.matchMedium]: dart.definiteFunctionType(core.bool, [core.String])})
  });
  dart.registerExtension(dart.global.StyleMedia, html$.StyleMedia);
  dart.defineExtensionNames([
    'registration'
  ]);
  html$.SyncEvent = class SyncEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, init) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$.SyncEvent._create_1(type, init_1);
    }
    static _create_1(type, init) {
      return new SyncEvent(type, init);
    }
    get [dartx.registration]() {
      return this.registration;
    }
  };
  dart.setSignature(html$.SyncEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SyncEvent, []),
      new: dart.definiteFunctionType(html$.SyncEvent, [core.String, core.Map])
    }),
    fields: () => ({[dartx.registration]: html$.SyncRegistration}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.SyncEvent, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.SyncEvent, html$.SyncEvent);
  dart.defineExtensionNames([
    'getRegistration',
    'getRegistrations',
    'permissionState',
    'register'
  ]);
  html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getRegistration](...args) {
      return this.getRegistration.apply(this, args);
    }
    [dartx.getRegistrations](...args) {
      return this.getRegistrations.apply(this, args);
    }
    [dartx.permissionState](...args) {
      return this.permissionState.apply(this, args);
    }
    [dartx.register](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_register_1](options_1);
      }
      return this[_register_2]();
    }
    [_register_1](...args) {
      return this.register.apply(this, args);
    }
    [_register_2](...args) {
      return this.register.apply(this, args);
    }
  };
  dart.setSignature(html$.SyncManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SyncManager, [])}),
    methods: () => ({
      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
      [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
      [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_register_2]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.SyncManager, html$.SyncManager);
  dart.defineExtensionNames([
    'unregister',
    'tag'
  ]);
  html$.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.tag]() {
      return this.tag;
    }
    [dartx.unregister](...args) {
      return this.unregister.apply(this, args);
    }
  };
  dart.setSignature(html$.SyncRegistration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SyncRegistration, [])}),
    fields: () => ({[dartx.tag]: core.String}),
    methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.SyncRegistration, html$.SyncRegistration);
  html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableCaptionElement._check(html$.document[dartx.createElement]("caption"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.TableCaptionElement, 'created');
  dart.setSignature(html$.TableCaptionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableCaptionElement, []),
      new: dart.definiteFunctionType(html$.TableCaptionElement, []),
      created: dart.definiteFunctionType(html$.TableCaptionElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLTableCaptionElement, html$.TableCaptionElement);
  dart.defineExtensionNames([
    'cellIndex',
    'colSpan',
    'headers',
    'rowSpan'
  ]);
  html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableCellElement._check(html$.document[dartx.createElement]("td"));
    }
    created() {
      this[dartx.cellIndex] = null;
      this[dartx.colSpan] = null;
      this[dartx.headers] = null;
      this[dartx.rowSpan] = null;
      super.created();
    }
    get [dartx.cellIndex]() {
      return this.cellIndex;
    }
    get [dartx.colSpan]() {
      return this.colSpan;
    }
    set [dartx.colSpan](value) {
      this.colSpan = value;
    }
    get [dartx.headers]() {
      return this.headers;
    }
    set [dartx.headers](value) {
      this.headers = value;
    }
    get [dartx.rowSpan]() {
      return this.rowSpan;
    }
    set [dartx.rowSpan](value) {
      this.rowSpan = value;
    }
  };
  dart.defineNamedConstructor(html$.TableCellElement, 'created');
  dart.setSignature(html$.TableCellElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableCellElement, []),
      new: dart.definiteFunctionType(html$.TableCellElement, []),
      created: dart.definiteFunctionType(html$.TableCellElement, [])
    }),
    fields: () => ({
      [dartx.cellIndex]: core.int,
      [dartx.colSpan]: core.int,
      [dartx.headers]: core.String,
      [dartx.rowSpan]: core.int
    })
  });
  dart.registerExtension(dart.global.HTMLTableCellElement, html$.TableCellElement);
  dart.registerExtension(dart.global.HTMLTableDataCellElement, html$.TableCellElement);
  dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html$.TableCellElement);
  dart.defineExtensionNames([
    'span'
  ]);
  html$.TableColElement = class TableColElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableColElement._check(html$.document[dartx.createElement]("col"));
    }
    created() {
      this[dartx.span] = null;
      super.created();
    }
    get [dartx.span]() {
      return this.span;
    }
    set [dartx.span](value) {
      this.span = value;
    }
  };
  dart.defineNamedConstructor(html$.TableColElement, 'created');
  dart.setSignature(html$.TableColElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableColElement, []),
      new: dart.definiteFunctionType(html$.TableColElement, []),
      created: dart.definiteFunctionType(html$.TableColElement, [])
    }),
    fields: () => ({[dartx.span]: core.int})
  });
  dart.registerExtension(dart.global.HTMLTableColElement, html$.TableColElement);
  const _tBodies = Symbol('_tBodies');
  const _rows = Symbol('_rows');
  const _createCaption = Symbol('_createCaption');
  const _createTBody = Symbol('_createTBody');
  const _createTFoot = Symbol('_createTFoot');
  const _createTHead = Symbol('_createTHead');
  const _insertRow = Symbol('_insertRow');
  const _nativeCreateTBody = Symbol('_nativeCreateTBody');
  dart.defineExtensionNames([
    'tBodies',
    'rows',
    'addRow',
    'createCaption',
    'createTBody',
    'createTFoot',
    'createTHead',
    'insertRow',
    'createFragment',
    'deleteCaption',
    'deleteRow',
    'deleteTFoot',
    'deleteTHead',
    'caption',
    'tFoot',
    'tHead'
  ]);
  html$.TableElement = class TableElement extends html$.HtmlElement {
    get [dartx.tBodies]() {
      return new (_WrappedListOfTableSectionElement())(this[_tBodies]);
    }
    get [dartx.rows]() {
      return new (_WrappedListOfTableRowElement())(this[_rows]);
    }
    [dartx.addRow]() {
      return this[dartx.insertRow](-1);
    }
    [dartx.createCaption]() {
      return html$.TableCaptionElement._check(this[_createCaption]());
    }
    [dartx.createTBody]() {
      return this[_createTBody]();
    }
    [dartx.createTFoot]() {
      return html$.TableSectionElement._check(this[_createTFoot]());
    }
    [dartx.createTHead]() {
      return html$.TableSectionElement._check(this[_createTHead]());
    }
    [dartx.insertRow](index) {
      return html$.TableRowElement._check(this[_insertRow](index));
    }
    [_createTBody]() {
      if (!!this.createTBody) {
        return this[_nativeCreateTBody]();
      }
      let tbody = html$.Element.tag('tbody');
      this[dartx.children][dartx.add](tbody);
      return html$.TableSectionElement._check(tbody);
    }
    [_nativeCreateTBody](...args) {
      return this.createTBody.apply(this, args);
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      }
      let contextualHtml = dart.str`<table>${html}</table>`;
      let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
      let fragment = html$.DocumentFragment.new();
      fragment[dartx.nodes][dartx.addAll](table[dartx.nodes]);
      return fragment;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableElement._check(html$.document[dartx.createElement]("table"));
    }
    created() {
      this[dartx.caption] = null;
      this[_rows] = null;
      this[_tBodies] = null;
      this[dartx.tFoot] = null;
      this[dartx.tHead] = null;
      super.created();
    }
    get [dartx.caption]() {
      return this.caption;
    }
    set [dartx.caption](value) {
      this.caption = value;
    }
    get [_rows]() {
      return this.rows;
    }
    get [_tBodies]() {
      return this.tBodies;
    }
    get [dartx.tFoot]() {
      return this.tFoot;
    }
    set [dartx.tFoot](value) {
      this.tFoot = value;
    }
    get [dartx.tHead]() {
      return this.tHead;
    }
    set [dartx.tHead](value) {
      this.tHead = value;
    }
    [_createCaption](...args) {
      return this.createCaption.apply(this, args);
    }
    [_createTFoot](...args) {
      return this.createTFoot.apply(this, args);
    }
    [_createTHead](...args) {
      return this.createTHead.apply(this, args);
    }
    [dartx.deleteCaption](...args) {
      return this.deleteCaption.apply(this, args);
    }
    [dartx.deleteRow](...args) {
      return this.deleteRow.apply(this, args);
    }
    [dartx.deleteTFoot](...args) {
      return this.deleteTFoot.apply(this, args);
    }
    [dartx.deleteTHead](...args) {
      return this.deleteTHead.apply(this, args);
    }
    [_insertRow](...args) {
      return this.insertRow.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TableElement, 'created');
  dart.setSignature(html$.TableElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableElement, []),
      new: dart.definiteFunctionType(html$.TableElement, []),
      created: dart.definiteFunctionType(html$.TableElement, [])
    }),
    fields: () => ({
      [dartx.caption]: html$.TableCaptionElement,
      [_rows]: ListOfNode(),
      [_tBodies]: ListOfNode(),
      [dartx.tFoot]: html$.TableSectionElement,
      [dartx.tHead]: html$.TableSectionElement
    }),
    getters: () => ({
      [dartx.tBodies]: dart.definiteFunctionType(core.List$(html$.TableSectionElement), []),
      [dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])
    }),
    methods: () => ({
      [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
      [dartx.createCaption]: dart.definiteFunctionType(html$.TableCaptionElement, []),
      [dartx.createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [dartx.createTFoot]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [dartx.createTHead]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
      [_createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [_nativeCreateTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [_createCaption]: dart.definiteFunctionType(html$.HtmlElement, []),
      [_createTFoot]: dart.definiteFunctionType(html$.HtmlElement, []),
      [_createTHead]: dart.definiteFunctionType(html$.HtmlElement, []),
      [dartx.deleteCaption]: dart.definiteFunctionType(dart.void, []),
      [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.deleteTFoot]: dart.definiteFunctionType(dart.void, []),
      [dartx.deleteTHead]: dart.definiteFunctionType(dart.void, []),
      [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLTableElement, html$.TableElement);
  const _cells = Symbol('_cells');
  const _insertCell = Symbol('_insertCell');
  dart.defineExtensionNames([
    'cells',
    'addCell',
    'insertCell',
    'createFragment',
    'deleteCell',
    'rowIndex',
    'sectionRowIndex'
  ]);
  html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
    get [dartx.cells]() {
      return new (_WrappedListOfTableCellElement())(this[_cells]);
    }
    [dartx.addCell]() {
      return this[dartx.insertCell](-1);
    }
    [dartx.insertCell](index) {
      return html$.TableCellElement._check(this[_insertCell](index));
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      }
      let fragment = html$.DocumentFragment.new();
      let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
      let row = section[dartx.nodes][dartx.single];
      fragment[dartx.nodes][dartx.addAll](row[dartx.nodes]);
      return fragment;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableRowElement._check(html$.document[dartx.createElement]("tr"));
    }
    created() {
      this[_cells] = null;
      this[dartx.rowIndex] = null;
      this[dartx.sectionRowIndex] = null;
      super.created();
    }
    get [_cells]() {
      return this.cells;
    }
    get [dartx.rowIndex]() {
      return this.rowIndex;
    }
    get [dartx.sectionRowIndex]() {
      return this.sectionRowIndex;
    }
    [dartx.deleteCell](...args) {
      return this.deleteCell.apply(this, args);
    }
    [_insertCell](...args) {
      return this.insertCell.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TableRowElement, 'created');
  dart.setSignature(html$.TableRowElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableRowElement, []),
      new: dart.definiteFunctionType(html$.TableRowElement, []),
      created: dart.definiteFunctionType(html$.TableRowElement, [])
    }),
    fields: () => ({
      [_cells]: ListOfNode(),
      [dartx.rowIndex]: core.int,
      [dartx.sectionRowIndex]: core.int
    }),
    getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html$.TableCellElement), [])}),
    methods: () => ({
      [dartx.addCell]: dart.definiteFunctionType(html$.TableCellElement, []),
      [dartx.insertCell]: dart.definiteFunctionType(html$.TableCellElement, [core.int]),
      [dartx.deleteCell]: dart.definiteFunctionType(dart.void, [core.int]),
      [_insertCell]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLTableRowElement, html$.TableRowElement);
  dart.defineExtensionNames([
    'rows',
    'addRow',
    'insertRow',
    'createFragment',
    'deleteRow'
  ]);
  html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
    get [dartx.rows]() {
      return new (_WrappedListOfTableRowElement())(this[_rows]);
    }
    [dartx.addRow]() {
      return this[dartx.insertRow](-1);
    }
    [dartx.insertRow](index) {
      return html$.TableRowElement._check(this[_insertRow](index));
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      }
      let fragment = html$.DocumentFragment.new();
      let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
      fragment[dartx.nodes][dartx.addAll](section[dartx.nodes]);
      return fragment;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[_rows] = null;
      super.created();
    }
    get [_rows]() {
      return this.rows;
    }
    [dartx.deleteRow](...args) {
      return this.deleteRow.apply(this, args);
    }
    [_insertRow](...args) {
      return this.insertRow.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TableSectionElement, 'created');
  dart.setSignature(html$.TableSectionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableSectionElement, []),
      created: dart.definiteFunctionType(html$.TableSectionElement, [])
    }),
    fields: () => ({[_rows]: ListOfNode()}),
    getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])}),
    methods: () => ({
      [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
      [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
      [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
      [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLTableSectionElement, html$.TableSectionElement);
  dart.defineExtensionNames([
    'setInnerHtml',
    'content'
  ]);
  html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TemplateElement._check(html$.document[dartx.createElement]("template"));
    }
    created() {
      this[dartx.content] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('template');
    }
    get [dartx.content]() {
      return this.content;
    }
    [dartx.setInnerHtml](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.text] = null;
      let fragment = this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      this[dartx.content][dartx.append](fragment);
    }
  };
  dart.defineNamedConstructor(html$.TemplateElement, 'created');
  dart.setSignature(html$.TemplateElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TemplateElement, []),
      new: dart.definiteFunctionType(html$.TemplateElement, []),
      created: dart.definiteFunctionType(html$.TemplateElement, [])
    }),
    fields: () => ({[dartx.content]: html$.DocumentFragment}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLTemplateElement, html$.TemplateElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'select',
    'setCustomValidity',
    'setRangeText',
    'setSelectionRange',
    'autocapitalize',
    'autofocus',
    'cols',
    'defaultValue',
    'dirName',
    'disabled',
    'form',
    'inputMode',
    'labels',
    'maxLength',
    'minLength',
    'name',
    'placeholder',
    'readOnly',
    'required',
    'rows',
    'selectionDirection',
    'selectionEnd',
    'selectionStart',
    'textLength',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate',
    'wrap'
  ]);
  html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TextAreaElement._check(html$.document[dartx.createElement]("textarea"));
    }
    created() {
      this[dartx.autocapitalize] = null;
      this[dartx.autofocus] = null;
      this[dartx.cols] = null;
      this[dartx.defaultValue] = null;
      this[dartx.dirName] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.inputMode] = null;
      this[dartx.labels] = null;
      this[dartx.maxLength] = null;
      this[dartx.minLength] = null;
      this[dartx.name] = null;
      this[dartx.placeholder] = null;
      this[dartx.readOnly] = null;
      this[dartx.required] = null;
      this[dartx.rows] = null;
      this[dartx.selectionDirection] = null;
      this[dartx.selectionEnd] = null;
      this[dartx.selectionStart] = null;
      this[dartx.textLength] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      this[dartx.wrap] = null;
      super.created();
    }
    get [dartx.autocapitalize]() {
      return this.autocapitalize;
    }
    set [dartx.autocapitalize](value) {
      this.autocapitalize = value;
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.cols]() {
      return this.cols;
    }
    set [dartx.cols](value) {
      this.cols = value;
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    set [dartx.defaultValue](value) {
      this.defaultValue = value;
    }
    get [dartx.dirName]() {
      return this.dirName;
    }
    set [dartx.dirName](value) {
      this.dirName = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.inputMode]() {
      return this.inputMode;
    }
    set [dartx.inputMode](value) {
      this.inputMode = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.maxLength]() {
      return this.maxLength;
    }
    set [dartx.maxLength](value) {
      this.maxLength = value;
    }
    get [dartx.minLength]() {
      return this.minLength;
    }
    set [dartx.minLength](value) {
      this.minLength = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.placeholder]() {
      return this.placeholder;
    }
    set [dartx.placeholder](value) {
      this.placeholder = value;
    }
    get [dartx.readOnly]() {
      return this.readOnly;
    }
    set [dartx.readOnly](value) {
      this.readOnly = value;
    }
    get [dartx.required]() {
      return this.required;
    }
    set [dartx.required](value) {
      this.required = value;
    }
    get [dartx.rows]() {
      return this.rows;
    }
    set [dartx.rows](value) {
      this.rows = value;
    }
    get [dartx.selectionDirection]() {
      return this.selectionDirection;
    }
    set [dartx.selectionDirection](value) {
      this.selectionDirection = value;
    }
    get [dartx.selectionEnd]() {
      return this.selectionEnd;
    }
    set [dartx.selectionEnd](value) {
      this.selectionEnd = value;
    }
    get [dartx.selectionStart]() {
      return this.selectionStart;
    }
    set [dartx.selectionStart](value) {
      this.selectionStart = value;
    }
    get [dartx.textLength]() {
      return this.textLength;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    get [dartx.wrap]() {
      return this.wrap;
    }
    set [dartx.wrap](value) {
      this.wrap = value;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.select](...args) {
      return this.select.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
    [dartx.setRangeText](...args) {
      return this.setRangeText.apply(this, args);
    }
    [dartx.setSelectionRange](...args) {
      return this.setSelectionRange.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TextAreaElement, 'created');
  dart.setSignature(html$.TextAreaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TextAreaElement, []),
      new: dart.definiteFunctionType(html$.TextAreaElement, []),
      created: dart.definiteFunctionType(html$.TextAreaElement, [])
    }),
    fields: () => ({
      [dartx.autocapitalize]: core.String,
      [dartx.autofocus]: core.bool,
      [dartx.cols]: core.int,
      [dartx.defaultValue]: core.String,
      [dartx.dirName]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.inputMode]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.maxLength]: core.int,
      [dartx.minLength]: core.int,
      [dartx.name]: core.String,
      [dartx.placeholder]: core.String,
      [dartx.readOnly]: core.bool,
      [dartx.required]: core.bool,
      [dartx.rows]: core.int,
      [dartx.selectionDirection]: core.String,
      [dartx.selectionEnd]: core.int,
      [dartx.selectionStart]: core.int,
      [dartx.textLength]: core.int,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool,
      [dartx.wrap]: core.String
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.select]: dart.definiteFunctionType(dart.void, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
      [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLTextAreaElement, html$.TextAreaElement);
  const _initTextEvent = Symbol('_initTextEvent');
  dart.defineExtensionNames([
    'data'
  ]);
  html$.TextEvent = class TextEvent extends html$.UIEvent {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let view = opts && 'view' in opts ? opts.view : null;
      let data = opts && 'data' in opts ? opts.data : null;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
      e[_initTextEvent](type, canBubble, cancelable, view, data);
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.data]() {
      return this.data;
    }
    [_initTextEvent](...args) {
      return this.initTextEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.TextEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String}),
      _: dart.definiteFunctionType(html$.TextEvent, [])
    }),
    fields: () => ({[dartx.data]: core.String}),
    methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])})
  });
  dart.registerExtension(dart.global.TextEvent, html$.TextEvent);
  dart.defineExtensionNames([
    'actualBoundingBoxAscent',
    'actualBoundingBoxDescent',
    'actualBoundingBoxLeft',
    'actualBoundingBoxRight',
    'alphabeticBaseline',
    'emHeightAscent',
    'emHeightDescent',
    'fontBoundingBoxAscent',
    'fontBoundingBoxDescent',
    'hangingBaseline',
    'ideographicBaseline',
    'width'
  ]);
  html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.actualBoundingBoxAscent]() {
      return this.actualBoundingBoxAscent;
    }
    get [dartx.actualBoundingBoxDescent]() {
      return this.actualBoundingBoxDescent;
    }
    get [dartx.actualBoundingBoxLeft]() {
      return this.actualBoundingBoxLeft;
    }
    get [dartx.actualBoundingBoxRight]() {
      return this.actualBoundingBoxRight;
    }
    get [dartx.alphabeticBaseline]() {
      return this.alphabeticBaseline;
    }
    get [dartx.emHeightAscent]() {
      return this.emHeightAscent;
    }
    get [dartx.emHeightDescent]() {
      return this.emHeightDescent;
    }
    get [dartx.fontBoundingBoxAscent]() {
      return this.fontBoundingBoxAscent;
    }
    get [dartx.fontBoundingBoxDescent]() {
      return this.fontBoundingBoxDescent;
    }
    get [dartx.hangingBaseline]() {
      return this.hangingBaseline;
    }
    get [dartx.ideographicBaseline]() {
      return this.ideographicBaseline;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.TextMetrics, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextMetrics, [])}),
    fields: () => ({
      [dartx.actualBoundingBoxAscent]: core.double,
      [dartx.actualBoundingBoxDescent]: core.double,
      [dartx.actualBoundingBoxLeft]: core.double,
      [dartx.actualBoundingBoxRight]: core.double,
      [dartx.alphabeticBaseline]: core.double,
      [dartx.emHeightAscent]: core.double,
      [dartx.emHeightDescent]: core.double,
      [dartx.fontBoundingBoxAscent]: core.double,
      [dartx.fontBoundingBoxDescent]: core.double,
      [dartx.hangingBaseline]: core.double,
      [dartx.ideographicBaseline]: core.double,
      [dartx.width]: core.double
    })
  });
  dart.registerExtension(dart.global.TextMetrics, html$.TextMetrics);
  dart.defineExtensionNames([
    'addCue',
    'addRegion',
    'removeCue',
    'removeRegion',
    'onCueChange',
    'activeCues',
    'cues',
    'id',
    'kind',
    'label',
    'language',
    'mode',
    'regions'
  ]);
  html$.TextTrack = class TextTrack extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.activeCues]() {
      return this.activeCues;
    }
    get [dartx.cues]() {
      return this.cues;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    set [dartx.mode](value) {
      this.mode = value;
    }
    get [dartx.regions]() {
      return this.regions;
    }
    [dartx.addCue](...args) {
      return this.addCue.apply(this, args);
    }
    [dartx.addRegion](...args) {
      return this.addRegion.apply(this, args);
    }
    [dartx.removeCue](...args) {
      return this.removeCue.apply(this, args);
    }
    [dartx.removeRegion](...args) {
      return this.removeRegion.apply(this, args);
    }
    get [dartx.onCueChange]() {
      return html$.TextTrack.cueChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.TextTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrack, [])}),
    fields: () => ({
      [dartx.activeCues]: html$.TextTrackCueList,
      [dartx.cues]: html$.TextTrackCueList,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.language]: core.String,
      [dartx.mode]: core.String,
      [dartx.regions]: html$.VttRegionList
    }),
    getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.addCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
      [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion]),
      [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
      [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion])
    }),
    sfields: () => ({cueChangeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.TextTrack, {
    get cueChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('cuechange'));
    }
  });
  dart.registerExtension(dart.global.TextTrack, html$.TextTrack);
  dart.defineExtensionNames([
    'onEnter',
    'onExit',
    'endTime',
    'id',
    'pauseOnExit',
    'startTime',
    'track'
  ]);
  html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.endTime]() {
      return this.endTime;
    }
    set [dartx.endTime](value) {
      this.endTime = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    set [dartx.id](value) {
      this.id = value;
    }
    get [dartx.pauseOnExit]() {
      return this.pauseOnExit;
    }
    set [dartx.pauseOnExit](value) {
      this.pauseOnExit = value;
    }
    get [dartx.startTime]() {
      return this.startTime;
    }
    set [dartx.startTime](value) {
      this.startTime = value;
    }
    get [dartx.track]() {
      return this.track;
    }
    get [dartx.onEnter]() {
      return html$.TextTrackCue.enterEvent.forTarget(this);
    }
    get [dartx.onExit]() {
      return html$.TextTrackCue.exitEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.TextTrackCue, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCue, [])}),
    fields: () => ({
      [dartx.endTime]: core.num,
      [dartx.id]: core.String,
      [dartx.pauseOnExit]: core.bool,
      [dartx.startTime]: core.num,
      [dartx.track]: html$.TextTrack
    }),
    getters: () => ({
      [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      enterEvent: EventStreamProviderOfEvent(),
      exitEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.TextTrackCue, {
    get enterEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('enter'));
    },
    get exitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('exit'));
    }
  });
  dart.registerExtension(dart.global.TextTrackCue, html$.TextTrackCue);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'getCueById',
    'item'
  ]);
  html$.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.TextTrackCue), html$.ImmutableListMixin$(html$.TextTrackCue)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.getCueById](...args) {
      return this.getCueById.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
  dart.setSignature(html$.TextTrackCueList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCueList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.TextTrackCue, []),
      [dartx.last]: dart.definiteFunctionType(html$.TextTrackCue, []),
      [dartx.single]: dart.definiteFunctionType(html$.TextTrackCue, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrackCue]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
      [dartx.getCueById]: dart.definiteFunctionType(html$.TextTrackCue, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.TextTrackCue, [core.int])
    })
  });
  dart.registerExtension(dart.global.TextTrackCueList, html$.TextTrackCueList);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'getTrackById',
    'item',
    'onAddTrack',
    'onChange'
  ]);
  html$.TextTrackList = class TextTrackList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.TextTrack), html$.ImmutableListMixin$(html$.TextTrack)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    get [dartx.onAddTrack]() {
      return html$.TextTrackList.addTrackEvent.forTarget(this);
    }
    get [dartx.onChange]() {
      return html$.TextTrackList.changeEvent.forTarget(this);
    }
  };
  html$.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
  dart.setSignature(html$.TextTrackList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.TextTrack, []),
      [dartx.last]: dart.definiteFunctionType(html$.TextTrack, []),
      [dartx.single]: dart.definiteFunctionType(html$.TextTrack, []),
      [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.TrackEvent), []),
      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrack]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.TextTrack, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.TextTrack, [core.int])
    }),
    sfields: () => ({
      addTrackEvent: EventStreamProviderOfTrackEvent(),
      changeEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.TextTrackList, {
    get addTrackEvent() {
      return dart.const(new (EventStreamProviderOfTrackEvent())('addtrack'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.TextTrackList, html$.TextTrackList);
  dart.defineExtensionNames([
    'end',
    'start',
    'length'
  ]);
  html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.end](...args) {
      return this.end.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
  };
  dart.setSignature(html$.TimeRanges, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TimeRanges, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.end]: dart.definiteFunctionType(core.double, [core.int]),
      [dartx.start]: dart.definiteFunctionType(core.double, [core.int])
    })
  });
  dart.registerExtension(dart.global.TimeRanges, html$.TimeRanges);
  html$.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
  html$.TitleElement = class TitleElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TitleElement._check(html$.document[dartx.createElement]("title"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.TitleElement, 'created');
  dart.setSignature(html$.TitleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TitleElement, []),
      new: dart.definiteFunctionType(html$.TitleElement, []),
      created: dart.definiteFunctionType(html$.TitleElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLTitleElement, html$.TitleElement);
  const _radiusX = Symbol('_radiusX');
  const _radiusY = Symbol('_radiusY');
  const __clientX = Symbol('__clientX');
  const __clientY = Symbol('__clientY');
  const __screenX = Symbol('__screenX');
  const __screenY = Symbol('__screenY');
  const __pageX = Symbol('__pageX');
  const __pageY = Symbol('__pageY');
  const __radiusX = Symbol('__radiusX');
  const __radiusY = Symbol('__radiusY');
  dart.defineExtensionNames([
    'target',
    'client',
    'page',
    'screen',
    'radiusX',
    'radiusY',
    'force',
    'identifier',
    'rotationAngle'
  ]);
  html$.Touch = class Touch extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [_clientX]() {
      return this.clientX;
    }
    get [_clientY]() {
      return this.clientY;
    }
    get [dartx.force]() {
      return this.force;
    }
    get [dartx.identifier]() {
      return this.identifier;
    }
    get [_pageX]() {
      return this.pageX;
    }
    get [_pageY]() {
      return this.pageY;
    }
    get [_radiusX]() {
      return this.radiusX;
    }
    get [_radiusY]() {
      return this.radiusY;
    }
    get [dartx.rotationAngle]() {
      return this.rotationAngle;
    }
    get [_screenX]() {
      return this.screenX;
    }
    get [_screenY]() {
      return this.screenY;
    }
    get [dartx.target]() {
      return html$._convertNativeToDart_EventTarget(this[_get_target]);
    }
    get [_get_target]() {
      return this.target;
    }
    get [__clientX]() {
      return this.clientX[dartx.round]();
    }
    get [__clientY]() {
      return this.clientY[dartx.round]();
    }
    get [__screenX]() {
      return this.screenX[dartx.round]();
    }
    get [__screenY]() {
      return this.screenY[dartx.round]();
    }
    get [__pageX]() {
      return this.pageX[dartx.round]();
    }
    get [__pageY]() {
      return this.pageY[dartx.round]();
    }
    get [__radiusX]() {
      return this.radiusX[dartx.round]();
    }
    get [__radiusY]() {
      return this.radiusY[dartx.round]();
    }
    get [dartx.client]() {
      return new (PointOfnum())(this[__clientX], this[__clientY]);
    }
    get [dartx.page]() {
      return new (PointOfnum())(this[__pageX], this[__pageY]);
    }
    get [dartx.screen]() {
      return new (PointOfnum())(this[__screenX], this[__screenY]);
    }
    get [dartx.radiusX]() {
      return this[__radiusX];
    }
    get [dartx.radiusY]() {
      return this[__radiusY];
    }
  };
  dart.setSignature(html$.Touch, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Touch, [])}),
    fields: () => ({
      [_clientX]: core.double,
      [_clientY]: core.double,
      [dartx.force]: core.double,
      [dartx.identifier]: core.int,
      [_pageX]: core.double,
      [_pageY]: core.double,
      [_radiusX]: core.double,
      [_radiusY]: core.double,
      [dartx.rotationAngle]: core.double,
      [_screenX]: core.double,
      [_screenY]: core.double,
      [_get_target]: dart.dynamic
    }),
    getters: () => ({
      [dartx.target]: dart.definiteFunctionType(html$.EventTarget, []),
      [__clientX]: dart.definiteFunctionType(core.int, []),
      [__clientY]: dart.definiteFunctionType(core.int, []),
      [__screenX]: dart.definiteFunctionType(core.int, []),
      [__screenY]: dart.definiteFunctionType(core.int, []),
      [__pageX]: dart.definiteFunctionType(core.int, []),
      [__pageY]: dart.definiteFunctionType(core.int, []),
      [__radiusX]: dart.definiteFunctionType(core.int, []),
      [__radiusY]: dart.definiteFunctionType(core.int, []),
      [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.radiusX]: dart.definiteFunctionType(core.int, []),
      [dartx.radiusY]: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.registerExtension(dart.global.Touch, html$.Touch);
  const _initTouchEvent = Symbol('_initTouchEvent');
  dart.defineExtensionNames([
    'altKey',
    'changedTouches',
    'ctrlKey',
    'metaKey',
    'shiftKey',
    'targetTouches',
    'touches'
  ]);
  html$.TouchEvent = class TouchEvent extends html$.UIEvent {
    static new(touches, targetTouches, changedTouches, type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.TouchEvent._check(html$.document[_createEvent]("TouchEvent"));
      e[_initTouchEvent](touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.altKey]() {
      return this.altKey;
    }
    get [dartx.changedTouches]() {
      return this.changedTouches;
    }
    get [dartx.ctrlKey]() {
      return this.ctrlKey;
    }
    get [dartx.metaKey]() {
      return this.metaKey;
    }
    get [dartx.shiftKey]() {
      return this.shiftKey;
    }
    get [dartx.targetTouches]() {
      return this.targetTouches;
    }
    get [dartx.touches]() {
      return this.touches;
    }
    [_initTouchEvent](...args) {
      return this.initTouchEvent.apply(this, args);
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('TouchEvent');
    }
  };
  dart.setSignature(html$.TouchEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TouchEvent, [html$.TouchList, html$.TouchList, html$.TouchList, core.String], {view: html$.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
      _: dart.definiteFunctionType(html$.TouchEvent, [])
    }),
    fields: () => ({
      [dartx.altKey]: core.bool,
      [dartx.changedTouches]: html$.TouchList,
      [dartx.ctrlKey]: core.bool,
      [dartx.metaKey]: core.bool,
      [dartx.shiftKey]: core.bool,
      [dartx.targetTouches]: html$.TouchList,
      [dartx.touches]: html$.TouchList
    }),
    methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html$.TouchList, html$.TouchList, html$.TouchList, core.String, html$.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.TouchEvent, html$.TouchEvent);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Touch), html$.ImmutableListMixin$(html$.Touch)) {
    static new() {
      return null;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!document.createTouchList;
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
  dart.setSignature(html$.TouchList, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TouchList, []),
      _: dart.definiteFunctionType(html$.TouchList, [])
    }),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Touch, []),
      [dartx.last]: dart.definiteFunctionType(html$.Touch, []),
      [dartx.single]: dart.definiteFunctionType(html$.Touch, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Touch, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Touch]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Touch, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Touch, [core.int])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.TouchList, html$.TouchList);
  dart.defineExtensionNames([
    'byteStreamTrackID',
    'kinds',
    'label',
    'language',
    'type'
  ]);
  html$.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, language, label, kinds, byteStreamTrackID) {
      if (byteStreamTrackID === void 0) byteStreamTrackID = null;
      if (byteStreamTrackID != null) {
        let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
        return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
      }
      let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
      return html$.TrackDefault._create_2(type, language, label, kinds_1);
    }
    static _create_1(type, language, label, kinds, byteStreamTrackID) {
      return new TrackDefault(type, language, label, kinds, byteStreamTrackID);
    }
    static _create_2(type, language, label, kinds) {
      return new TrackDefault(type, language, label, kinds);
    }
    get [dartx.byteStreamTrackID]() {
      return this.byteStreamTrackID;
    }
    get [dartx.kinds]() {
      return this.kinds;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.TrackDefault, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackDefault, []),
      new: dart.definiteFunctionType(html$.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
    }),
    fields: () => ({
      [dartx.byteStreamTrackID]: core.String,
      [dartx.kinds]: ListOfString(),
      [dartx.label]: core.String,
      [dartx.language]: core.String,
      [dartx.type]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TrackDefault, html$.TrackDefault);
  dart.defineExtensionNames([
    'item',
    'length'
  ]);
  html$.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(trackDefaults) {
      if (trackDefaults === void 0) trackDefaults = null;
      if (trackDefaults != null) {
        return html$.TrackDefaultList._create_1(trackDefaults);
      }
      return html$.TrackDefaultList._create_2();
    }
    static _create_1(trackDefaults) {
      return new TrackDefaultList(trackDefaults);
    }
    static _create_2() {
      return new TrackDefaultList();
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.TrackDefaultList, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackDefaultList, []),
      new: dart.definiteFunctionType(html$.TrackDefaultList, [], [ListOfTrackDefault()])
    }),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.TrackDefault, [core.int])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TrackDefaultList, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TrackDefaultList, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TrackDefaultList, html$.TrackDefaultList);
  dart.defineExtensionNames([
    'defaultValue',
    'kind',
    'label',
    'readyState',
    'src',
    'srclang',
    'track'
  ]);
  html$.TrackElement = class TrackElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TrackElement._check(html$.document[dartx.createElement]("track"));
    }
    created() {
      this[dartx.defaultValue] = null;
      this[dartx.kind] = null;
      this[dartx.label] = null;
      this[dartx.readyState] = null;
      this[dartx.src] = null;
      this[dartx.srclang] = null;
      this[dartx.track] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('track');
    }
    get [dartx.defaultValue]() {
      return this.default;
    }
    set [dartx.defaultValue](value) {
      this.default = value;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    set [dartx.kind](value) {
      this.kind = value;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srclang]() {
      return this.srclang;
    }
    set [dartx.srclang](value) {
      this.srclang = value;
    }
    get [dartx.track]() {
      return this.track;
    }
  };
  dart.defineNamedConstructor(html$.TrackElement, 'created');
  dart.setSignature(html$.TrackElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackElement, []),
      new: dart.definiteFunctionType(html$.TrackElement, []),
      created: dart.definiteFunctionType(html$.TrackElement, [])
    }),
    fields: () => ({
      [dartx.defaultValue]: core.bool,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.readyState]: core.int,
      [dartx.src]: core.String,
      [dartx.srclang]: core.String,
      [dartx.track]: html$.TextTrack
    }),
    sfields: () => ({
      ERROR: core.int,
      LOADED: core.int,
      LOADING: core.int,
      NONE: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  html$.TrackElement.ERROR = 3;
  html$.TrackElement.LOADED = 2;
  html$.TrackElement.LOADING = 1;
  html$.TrackElement.NONE = 0;
  dart.registerExtension(dart.global.HTMLTrackElement, html$.TrackElement);
  dart.defineExtensionNames([
    'track'
  ]);
  html$.TrackEvent = class TrackEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.TrackEvent._create_1(type, eventInitDict_1);
      }
      return html$.TrackEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new TrackEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new TrackEvent(type);
    }
    get [dartx.track]() {
      return this.track;
    }
  };
  dart.setSignature(html$.TrackEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackEvent, []),
      new: dart.definiteFunctionType(html$.TrackEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.track]: core.Object}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TrackEvent, html$.TrackEvent);
  dart.defineExtensionNames([
    'elapsedTime',
    'propertyName',
    'pseudoElement'
  ]);
  html$.TransitionEvent = class TransitionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.TransitionEvent._create_1(type, eventInitDict_1);
      }
      return html$.TransitionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new TransitionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new TransitionEvent(type);
    }
    get [dartx.elapsedTime]() {
      return this.elapsedTime;
    }
    get [dartx.propertyName]() {
      return this.propertyName;
    }
    get [dartx.pseudoElement]() {
      return this.pseudoElement;
    }
  };
  dart.setSignature(html$.TransitionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TransitionEvent, []),
      new: dart.definiteFunctionType(html$.TransitionEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.elapsedTime]: core.double,
      [dartx.propertyName]: core.String,
      [dartx.pseudoElement]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TransitionEvent, html$.TransitionEvent);
  dart.registerExtension(dart.global.WebKitTransitionEvent, html$.TransitionEvent);
  dart.defineExtensionNames([
    'firstChild',
    'lastChild',
    'nextNode',
    'nextSibling',
    'parentNode',
    'previousNode',
    'previousSibling',
    'currentNode',
    'filter',
    'root',
    'whatToShow'
  ]);
  html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
    static new(root, whatToShow) {
      return html$.document[_createTreeWalker](root, whatToShow, null);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.currentNode]() {
      return this.currentNode;
    }
    set [dartx.currentNode](value) {
      this.currentNode = value;
    }
    get [dartx.filter]() {
      return this.filter;
    }
    get [dartx.root]() {
      return this.root;
    }
    get [dartx.whatToShow]() {
      return this.whatToShow;
    }
    [dartx.firstChild](...args) {
      return this.firstChild.apply(this, args);
    }
    [dartx.lastChild](...args) {
      return this.lastChild.apply(this, args);
    }
    [dartx.nextNode](...args) {
      return this.nextNode.apply(this, args);
    }
    [dartx.nextSibling](...args) {
      return this.nextSibling.apply(this, args);
    }
    [dartx.parentNode](...args) {
      return this.parentNode.apply(this, args);
    }
    [dartx.previousNode](...args) {
      return this.previousNode.apply(this, args);
    }
    [dartx.previousSibling](...args) {
      return this.previousSibling.apply(this, args);
    }
  };
  dart.setSignature(html$.TreeWalker, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TreeWalker, [html$.Node, core.int]),
      _: dart.definiteFunctionType(html$.TreeWalker, [])
    }),
    fields: () => ({
      [dartx.currentNode]: html$.Node,
      [dartx.filter]: html$.NodeFilter,
      [dartx.root]: html$.Node,
      [dartx.whatToShow]: core.int
    }),
    methods: () => ({
      [dartx.firstChild]: dart.definiteFunctionType(html$.Node, []),
      [dartx.lastChild]: dart.definiteFunctionType(html$.Node, []),
      [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.nextSibling]: dart.definiteFunctionType(html$.Node, []),
      [dartx.parentNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.previousNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.previousSibling]: dart.definiteFunctionType(html$.Node, [])
    })
  });
  dart.registerExtension(dart.global.TreeWalker, html$.TreeWalker);
  html$.UListElement = class UListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.UListElement._check(html$.document[dartx.createElement]("ul"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.UListElement, 'created');
  dart.setSignature(html$.UListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.UListElement, []),
      new: dart.definiteFunctionType(html$.UListElement, []),
      created: dart.definiteFunctionType(html$.UListElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLUListElement, html$.UListElement);
  html$.UnknownElement = class UnknownElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.UnknownElement, 'created');
  dart.setSignature(html$.UnknownElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.UnknownElement, []),
      created: dart.definiteFunctionType(html$.UnknownElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLUnknownElement, html$.UnknownElement);
  dart.defineExtensionNames([
    'toString',
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.Url = class Url extends _interceptors.Interceptor {
    static createObjectUrl(blob_OR_source_OR_stream) {
      return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
    }
    static createObjectUrlFromSource(source) {
      return (self.URL || self.webkitURL).createObjectURL(source);
    }
    static createObjectUrlFromStream(stream) {
      return (self.URL || self.webkitURL).createObjectURL(stream);
    }
    static createObjectUrlFromBlob(blob) {
      return (self.URL || self.webkitURL).createObjectURL(blob);
    }
    static revokeObjectUrl(url) {
      return (self.URL || self.webkitURL).revokeObjectURL(url);
    }
    [dartx.toString]() {
      return String(this);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.password]() {
      return this.password;
    }
    set [dartx.password](value) {
      this.password = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    get [dartx.username]() {
      return this.username;
    }
    set [dartx.username](value) {
      this.username = value;
    }
  };
  html$.Url[dart.implements] = () => [html$.UrlUtils];
  dart.setSignature(html$.Url, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Url, [])}),
    fields: () => ({
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.origin]: core.String,
      [dartx.password]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String,
      [dartx.username]: core.String
    }),
    statics: () => ({
      createObjectUrl: dart.definiteFunctionType(core.String, [dart.dynamic]),
      createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html$.MediaSource]),
      createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html$.MediaStream]),
      createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html$.Blob]),
      revokeObjectUrl: dart.definiteFunctionType(dart.void, [core.String])
    }),
    names: ['createObjectUrl', 'createObjectUrlFromSource', 'createObjectUrlFromStream', 'createObjectUrlFromBlob', 'revokeObjectUrl']
  });
  dart.registerExtension(dart.global.URL, html$.Url);
  dart.defineExtensionNames([
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get hash() {
      return this[hash];
    }
    set hash(value) {
      this[hash] = value;
    }
    get host() {
      return this[host];
    }
    set host(value) {
      this[host] = value;
    }
    get hostname() {
      return this[hostname];
    }
    set hostname(value) {
      this[hostname] = value;
    }
    get href() {
      return this[href];
    }
    set href(value) {
      this[href] = value;
    }
    get origin() {
      return this[origin];
    }
    set origin(value) {
      super.origin = value;
    }
    get password() {
      return this[password];
    }
    set password(value) {
      this[password] = value;
    }
    get pathname() {
      return this[pathname];
    }
    set pathname(value) {
      this[pathname] = value;
    }
    get port() {
      return this[port];
    }
    set port(value) {
      this[port] = value;
    }
    get protocol() {
      return this[protocol];
    }
    set protocol(value) {
      this[protocol] = value;
    }
    get search() {
      return this[search];
    }
    set search(value) {
      this[search] = value;
    }
    get username() {
      return this[username];
    }
    set username(value) {
      this[username] = value;
    }
  };
  const hash = Symbol(html$.UrlUtils.name + "." + 'hash'.toString());
  const host = Symbol(html$.UrlUtils.name + "." + 'host'.toString());
  const hostname = Symbol(html$.UrlUtils.name + "." + 'hostname'.toString());
  const href = Symbol(html$.UrlUtils.name + "." + 'href'.toString());
  const origin = Symbol(html$.UrlUtils.name + "." + 'origin'.toString());
  const password = Symbol(html$.UrlUtils.name + "." + 'password'.toString());
  const pathname = Symbol(html$.UrlUtils.name + "." + 'pathname'.toString());
  const port = Symbol(html$.UrlUtils.name + "." + 'port'.toString());
  const protocol = Symbol(html$.UrlUtils.name + "." + 'protocol'.toString());
  const search = Symbol(html$.UrlUtils.name + "." + 'search'.toString());
  const username = Symbol(html$.UrlUtils.name + "." + 'username'.toString());
  dart.setSignature(html$.UrlUtils, {
    constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtils, [])}),
    fields: () => ({
      hash: core.String,
      host: core.String,
      hostname: core.String,
      href: core.String,
      origin: core.String,
      password: core.String,
      pathname: core.String,
      port: core.String,
      protocol: core.String,
      search: core.String,
      username: core.String
    })
  });
  dart.defineExtensionMembers(html$.UrlUtils, [
    'hash',
    'hash',
    'host',
    'host',
    'hostname',
    'hostname',
    'href',
    'href',
    'origin',
    'password',
    'password',
    'pathname',
    'pathname',
    'port',
    'port',
    'protocol',
    'protocol',
    'search',
    'search',
    'username',
    'username'
  ]);
  dart.defineExtensionNames([
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'pathname',
    'port',
    'protocol',
    'search'
  ]);
  html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get hash() {
      return this[hash$];
    }
    set hash(value) {
      super.hash = value;
    }
    get host() {
      return this[host$];
    }
    set host(value) {
      super.host = value;
    }
    get hostname() {
      return this[hostname$];
    }
    set hostname(value) {
      super.hostname = value;
    }
    get href() {
      return this[href$];
    }
    set href(value) {
      super.href = value;
    }
    get origin() {
      return this[origin$];
    }
    set origin(value) {
      super.origin = value;
    }
    get pathname() {
      return this[pathname$];
    }
    set pathname(value) {
      super.pathname = value;
    }
    get port() {
      return this[port$];
    }
    set port(value) {
      super.port = value;
    }
    get protocol() {
      return this[protocol$];
    }
    set protocol(value) {
      super.protocol = value;
    }
    get search() {
      return this[search$];
    }
    set search(value) {
      super.search = value;
    }
  };
  const hash$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hash'.toString());
  const host$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'host'.toString());
  const hostname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
  const href$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'href'.toString());
  const origin$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'origin'.toString());
  const pathname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
  const port$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'port'.toString());
  const protocol$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
  const search$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'search'.toString());
  dart.setSignature(html$.UrlUtilsReadOnly, {
    constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtilsReadOnly, [])}),
    fields: () => ({
      hash: core.String,
      host: core.String,
      hostname: core.String,
      href: core.String,
      origin: core.String,
      pathname: core.String,
      port: core.String,
      protocol: core.String,
      search: core.String
    })
  });
  dart.defineExtensionMembers(html$.UrlUtilsReadOnly, [
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'pathname',
    'port',
    'protocol',
    'search'
  ]);
  dart.defineExtensionNames([
    'currentFieldOfView',
    'eyeTranslation',
    'maximumFieldOfView',
    'minimumFieldOfView',
    'recommendedFieldOfView',
    'renderRect'
  ]);
  html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.currentFieldOfView]() {
      return this.currentFieldOfView;
    }
    get [dartx.eyeTranslation]() {
      return this.eyeTranslation;
    }
    get [dartx.maximumFieldOfView]() {
      return this.maximumFieldOfView;
    }
    get [dartx.minimumFieldOfView]() {
      return this.minimumFieldOfView;
    }
    get [dartx.recommendedFieldOfView]() {
      return this.recommendedFieldOfView;
    }
    get [dartx.renderRect]() {
      return this.renderRect;
    }
  };
  dart.setSignature(html$.VREyeParameters, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VREyeParameters, [])}),
    fields: () => ({
      [dartx.currentFieldOfView]: html$.VRFieldOfView,
      [dartx.eyeTranslation]: html$.DomPoint,
      [dartx.maximumFieldOfView]: html$.VRFieldOfView,
      [dartx.minimumFieldOfView]: html$.VRFieldOfView,
      [dartx.recommendedFieldOfView]: html$.VRFieldOfView,
      [dartx.renderRect]: html$._DomRect
    })
  });
  dart.registerExtension(dart.global.VREyeParameters, html$.VREyeParameters);
  dart.defineExtensionNames([
    'downDegrees',
    'leftDegrees',
    'rightDegrees',
    'upDegrees'
  ]);
  html$.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(fov) {
      if (fov === void 0) fov = null;
      if (fov != null) {
        let fov_1 = html_common.convertDartToNative_Dictionary(fov);
        return html$.VRFieldOfView._create_1(fov_1);
      }
      return html$.VRFieldOfView._create_2();
    }
    static _create_1(fov) {
      return new VRFieldOfView(fov);
    }
    static _create_2() {
      return new VRFieldOfView();
    }
    get [dartx.downDegrees]() {
      return this.downDegrees;
    }
    set [dartx.downDegrees](value) {
      this.downDegrees = value;
    }
    get [dartx.leftDegrees]() {
      return this.leftDegrees;
    }
    set [dartx.leftDegrees](value) {
      this.leftDegrees = value;
    }
    get [dartx.rightDegrees]() {
      return this.rightDegrees;
    }
    set [dartx.rightDegrees](value) {
      this.rightDegrees = value;
    }
    get [dartx.upDegrees]() {
      return this.upDegrees;
    }
    set [dartx.upDegrees](value) {
      this.upDegrees = value;
    }
  };
  dart.setSignature(html$.VRFieldOfView, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VRFieldOfView, []),
      new: dart.definiteFunctionType(html$.VRFieldOfView, [], [core.Map])
    }),
    fields: () => ({
      [dartx.downDegrees]: core.num,
      [dartx.leftDegrees]: core.num,
      [dartx.rightDegrees]: core.num,
      [dartx.upDegrees]: core.num
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.VRFieldOfView, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.VRFieldOfView, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.VRFieldOfView, html$.VRFieldOfView);
  dart.defineExtensionNames([
    'angularAcceleration',
    'angularVelocity',
    'linearAcceleration',
    'linearVelocity',
    'orientation',
    'position',
    'timeStamp'
  ]);
  html$.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angularAcceleration]() {
      return this.angularAcceleration;
    }
    get [dartx.angularVelocity]() {
      return this.angularVelocity;
    }
    get [dartx.linearAcceleration]() {
      return this.linearAcceleration;
    }
    get [dartx.linearVelocity]() {
      return this.linearVelocity;
    }
    get [dartx.orientation]() {
      return this.orientation;
    }
    get [dartx.position]() {
      return this.position;
    }
    get [dartx.timeStamp]() {
      return this.timeStamp;
    }
  };
  dart.setSignature(html$.VRPositionState, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VRPositionState, [])}),
    fields: () => ({
      [dartx.angularAcceleration]: html$.DomPoint,
      [dartx.angularVelocity]: html$.DomPoint,
      [dartx.linearAcceleration]: html$.DomPoint,
      [dartx.linearVelocity]: html$.DomPoint,
      [dartx.orientation]: html$.DomPoint,
      [dartx.position]: html$.DomPoint,
      [dartx.timeStamp]: core.double
    })
  });
  dart.registerExtension(dart.global.VRPositionState, html$.VRPositionState);
  dart.defineExtensionNames([
    'badInput',
    'customError',
    'patternMismatch',
    'rangeOverflow',
    'rangeUnderflow',
    'stepMismatch',
    'tooLong',
    'tooShort',
    'typeMismatch',
    'valid',
    'valueMissing'
  ]);
  html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.badInput]() {
      return this.badInput;
    }
    get [dartx.customError]() {
      return this.customError;
    }
    get [dartx.patternMismatch]() {
      return this.patternMismatch;
    }
    get [dartx.rangeOverflow]() {
      return this.rangeOverflow;
    }
    get [dartx.rangeUnderflow]() {
      return this.rangeUnderflow;
    }
    get [dartx.stepMismatch]() {
      return this.stepMismatch;
    }
    get [dartx.tooLong]() {
      return this.tooLong;
    }
    get [dartx.tooShort]() {
      return this.tooShort;
    }
    get [dartx.typeMismatch]() {
      return this.typeMismatch;
    }
    get [dartx.valid]() {
      return this.valid;
    }
    get [dartx.valueMissing]() {
      return this.valueMissing;
    }
  };
  dart.setSignature(html$.ValidityState, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ValidityState, [])}),
    fields: () => ({
      [dartx.badInput]: core.bool,
      [dartx.customError]: core.bool,
      [dartx.patternMismatch]: core.bool,
      [dartx.rangeOverflow]: core.bool,
      [dartx.rangeUnderflow]: core.bool,
      [dartx.stepMismatch]: core.bool,
      [dartx.tooLong]: core.bool,
      [dartx.tooShort]: core.bool,
      [dartx.typeMismatch]: core.bool,
      [dartx.valid]: core.bool,
      [dartx.valueMissing]: core.bool
    })
  });
  dart.registerExtension(dart.global.ValidityState, html$.ValidityState);
  dart.defineExtensionNames([
    'getVideoPlaybackQuality',
    'enterFullscreen',
    'exitFullscreen',
    'height',
    'poster',
    'videoHeight',
    'videoWidth',
    'decodedFrameCount',
    'droppedFrameCount',
    'width'
  ]);
  html$.VideoElement = class VideoElement extends html$.MediaElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.VideoElement._check(html$.document[dartx.createElement]("video"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.poster] = null;
      this[dartx.videoHeight] = null;
      this[dartx.videoWidth] = null;
      this[dartx.decodedFrameCount] = null;
      this[dartx.droppedFrameCount] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.poster]() {
      return this.poster;
    }
    set [dartx.poster](value) {
      this.poster = value;
    }
    get [dartx.videoHeight]() {
      return this.videoHeight;
    }
    get [dartx.videoWidth]() {
      return this.videoWidth;
    }
    get [dartx.decodedFrameCount]() {
      return this.webkitDecodedFrameCount;
    }
    get [dartx.droppedFrameCount]() {
      return this.webkitDroppedFrameCount;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    [dartx.getVideoPlaybackQuality](...args) {
      return this.getVideoPlaybackQuality.apply(this, args);
    }
    [dartx.enterFullscreen](...args) {
      return this.webkitEnterFullscreen.apply(this, args);
    }
    [dartx.exitFullscreen](...args) {
      return this.webkitExitFullscreen.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.VideoElement, 'created');
  html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
  dart.setSignature(html$.VideoElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VideoElement, []),
      new: dart.definiteFunctionType(html$.VideoElement, []),
      created: dart.definiteFunctionType(html$.VideoElement, [])
    }),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.poster]: core.String,
      [dartx.videoHeight]: core.int,
      [dartx.videoWidth]: core.int,
      [dartx.decodedFrameCount]: core.int,
      [dartx.droppedFrameCount]: core.int,
      [dartx.width]: core.int
    }),
    methods: () => ({
      [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html$.VideoPlaybackQuality, []),
      [dartx.enterFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.HTMLVideoElement, html$.VideoElement);
  dart.defineExtensionNames([
    'corruptedVideoFrames',
    'creationTime',
    'droppedVideoFrames',
    'totalVideoFrames'
  ]);
  html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.corruptedVideoFrames]() {
      return this.corruptedVideoFrames;
    }
    get [dartx.creationTime]() {
      return this.creationTime;
    }
    get [dartx.droppedVideoFrames]() {
      return this.droppedVideoFrames;
    }
    get [dartx.totalVideoFrames]() {
      return this.totalVideoFrames;
    }
  };
  dart.setSignature(html$.VideoPlaybackQuality, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VideoPlaybackQuality, [])}),
    fields: () => ({
      [dartx.corruptedVideoFrames]: core.int,
      [dartx.creationTime]: core.double,
      [dartx.droppedVideoFrames]: core.int,
      [dartx.totalVideoFrames]: core.int
    })
  });
  dart.registerExtension(dart.global.VideoPlaybackQuality, html$.VideoPlaybackQuality);
  dart.defineExtensionNames([
    'id',
    'kind',
    'label',
    'language',
    'selected'
  ]);
  html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
    get [dartx.selected]() {
      return this.selected;
    }
    set [dartx.selected](value) {
      this.selected = value;
    }
  };
  dart.setSignature(html$.VideoTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrack, [])}),
    fields: () => ({
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.language]: core.String,
      [dartx.selected]: core.bool
    })
  });
  dart.registerExtension(dart.global.VideoTrack, html$.VideoTrack);
  dart.defineExtensionNames([
    'getTrackById',
    'onChange',
    'length',
    'selectedIndex'
  ]);
  html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.selectedIndex]() {
      return this.selectedIndex;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.VideoTrackList.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.VideoTrackList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrackList, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [dartx.selectedIndex]: core.int
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(html$.VideoTrack, [core.int]),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.VideoTrack, [core.String])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.VideoTrackList, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.VideoTrackList, html$.VideoTrackList);
  html$.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
  dart.defineExtensionNames([
    'getCueAsHtml',
    'align',
    'line',
    'position',
    'regionId',
    'size',
    'snapToLines',
    'text',
    'vertical'
  ]);
  html$.VttCue = class VttCue extends html$.TextTrackCue {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(startTime, endTime, text) {
      return html$.VttCue._create_1(startTime, endTime, text);
    }
    static _create_1(startTime, endTime, text) {
      return new VTTCue(startTime, endTime, text);
    }
    get [dartx.align]() {
      return this.align;
    }
    set [dartx.align](value) {
      this.align = value;
    }
    get [dartx.line]() {
      return this.line;
    }
    set [dartx.line](value) {
      this.line = value;
    }
    get [dartx.position]() {
      return this.position;
    }
    set [dartx.position](value) {
      this.position = value;
    }
    get [dartx.regionId]() {
      return this.regionId;
    }
    set [dartx.regionId](value) {
      this.regionId = value;
    }
    get [dartx.size]() {
      return this.size;
    }
    set [dartx.size](value) {
      this.size = value;
    }
    get [dartx.snapToLines]() {
      return this.snapToLines;
    }
    set [dartx.snapToLines](value) {
      this.snapToLines = value;
    }
    get [dartx.text]() {
      return this.text;
    }
    set [dartx.text](value) {
      this.text = value;
    }
    get [dartx.vertical]() {
      return this.vertical;
    }
    set [dartx.vertical](value) {
      this.vertical = value;
    }
    [dartx.getCueAsHtml](...args) {
      return this.getCueAsHTML.apply(this, args);
    }
  };
  dart.setSignature(html$.VttCue, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VttCue, []),
      new: dart.definiteFunctionType(html$.VttCue, [core.num, core.num, core.String])
    }),
    fields: () => ({
      [dartx.align]: core.String,
      [dartx.line]: core.Object,
      [dartx.position]: core.Object,
      [dartx.regionId]: core.String,
      [dartx.size]: core.num,
      [dartx.snapToLines]: core.bool,
      [dartx.text]: core.String,
      [dartx.vertical]: core.String
    }),
    methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html$.DocumentFragment, [])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.VTTCue, html$.VttCue);
  dart.defineExtensionNames([
    'height',
    'id',
    'regionAnchorX',
    'regionAnchorY',
    'scroll',
    'track',
    'viewportAnchorX',
    'viewportAnchorY',
    'width'
  ]);
  html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.VttRegion._create_1();
    }
    static _create_1() {
      return new VTTRegion();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    set [dartx.id](value) {
      this.id = value;
    }
    get [dartx.regionAnchorX]() {
      return this.regionAnchorX;
    }
    set [dartx.regionAnchorX](value) {
      this.regionAnchorX = value;
    }
    get [dartx.regionAnchorY]() {
      return this.regionAnchorY;
    }
    set [dartx.regionAnchorY](value) {
      this.regionAnchorY = value;
    }
    get [dartx.scroll]() {
      return this.scroll;
    }
    set [dartx.scroll](value) {
      this.scroll = value;
    }
    get [dartx.track]() {
      return this.track;
    }
    get [dartx.viewportAnchorX]() {
      return this.viewportAnchorX;
    }
    set [dartx.viewportAnchorX](value) {
      this.viewportAnchorX = value;
    }
    get [dartx.viewportAnchorY]() {
      return this.viewportAnchorY;
    }
    set [dartx.viewportAnchorY](value) {
      this.viewportAnchorY = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
  };
  dart.setSignature(html$.VttRegion, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VttRegion, []),
      new: dart.definiteFunctionType(html$.VttRegion, [])
    }),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.id]: core.String,
      [dartx.regionAnchorX]: core.num,
      [dartx.regionAnchorY]: core.num,
      [dartx.scroll]: core.String,
      [dartx.track]: html$.TextTrack,
      [dartx.viewportAnchorX]: core.num,
      [dartx.viewportAnchorY]: core.num,
      [dartx.width]: core.num
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.VttRegion, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.VTTRegion, html$.VttRegion);
  dart.defineExtensionNames([
    'getRegionById',
    'item',
    'length'
  ]);
  html$.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.getRegionById](...args) {
      return this.getRegionById.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.VttRegionList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VttRegionList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.getRegionById]: dart.definiteFunctionType(html$.VttRegion, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.VttRegion, [core.int])
    })
  });
  dart.registerExtension(dart.global.VTTRegionList, html$.VttRegionList);
  dart.defineExtensionNames([
    'close',
    'send',
    'sendBlob',
    'sendByteBuffer',
    'sendString',
    'sendTypedData',
    'onClose',
    'onError',
    'onMessage',
    'onOpen',
    'binaryType',
    'bufferedAmount',
    'extensions',
    'protocol',
    'readyState',
    'url'
  ]);
  html$.WebSocket = class WebSocket extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(url, protocols) {
      if (protocols === void 0) protocols = null;
      if (protocols != null) {
        return html$.WebSocket._create_1(url, protocols);
      }
      return html$.WebSocket._create_2(url);
    }
    static _create_1(url, protocols) {
      return new WebSocket(url, protocols);
    }
    static _create_2(url) {
      return new WebSocket(url);
    }
    static get supported() {
      return typeof window.WebSocket != "undefined";
    }
    get [dartx.binaryType]() {
      return this.binaryType;
    }
    set [dartx.binaryType](value) {
      this.binaryType = value;
    }
    get [dartx.bufferedAmount]() {
      return this.bufferedAmount;
    }
    get [dartx.extensions]() {
      return this.extensions;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.url]() {
      return this.url;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendBlob](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendByteBuffer](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendString](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendTypedData](...args) {
      return this.send.apply(this, args);
    }
    get [dartx.onClose]() {
      return html$.WebSocket.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.WebSocket.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.WebSocket.messageEvent.forTarget(this);
    }
    get [dartx.onOpen]() {
      return html$.WebSocket.openEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.WebSocket, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.WebSocket, []),
      new: dart.definiteFunctionType(html$.WebSocket, [core.String], [core.Object])
    }),
    fields: () => ({
      [dartx.binaryType]: core.String,
      [dartx.bufferedAmount]: core.int,
      [dartx.extensions]: core.String,
      [dartx.protocol]: core.String,
      [dartx.readyState]: core.int,
      [dartx.url]: core.String
    }),
    getters: () => ({
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.CloseEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
      [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
    }),
    sfields: () => ({
      closeEvent: EventStreamProviderOfCloseEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      openEvent: EventStreamProviderOfEvent(),
      CLOSED: core.int,
      CLOSING: core.int,
      CONNECTING: core.int,
      OPEN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.WebSocket.CLOSED = 3;
  html$.WebSocket.CLOSING = 2;
  html$.WebSocket.CONNECTING = 0;
  html$.WebSocket.OPEN = 1;
  dart.defineLazy(html$.WebSocket, {
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfCloseEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get openEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('open'));
    }
  });
  dart.registerExtension(dart.global.WebSocket, html$.WebSocket);
  const _deltaX = Symbol('_deltaX');
  const _deltaY = Symbol('_deltaY');
  const _wheelDelta = Symbol('_wheelDelta');
  const _wheelDeltaX = Symbol('_wheelDeltaX');
  const _hasInitMouseScrollEvent = Symbol('_hasInitMouseScrollEvent');
  const _initMouseScrollEvent = Symbol('_initMouseScrollEvent');
  const _hasInitWheelEvent = Symbol('_hasInitWheelEvent');
  const _initWheelEvent = Symbol('_initWheelEvent');
  dart.defineExtensionNames([
    'deltaY',
    'deltaX',
    'deltaMode',
    'deltaZ'
  ]);
  html$.WheelEvent = class WheelEvent extends html$.MouseEvent {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
      let deltaY = opts && 'deltaY' in opts ? opts.deltaY : 0;
      let deltaZ = opts && 'deltaZ' in opts ? opts.deltaZ : 0;
      let deltaMode = opts && 'deltaMode' in opts ? opts.deltaMode : 0;
      let detail = opts && 'detail' in opts ? opts.detail : 0;
      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
      let button = opts && 'button' in opts ? opts.button : 0;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
      let options = dart.map({view: view, deltaMode: deltaMode, deltaX: deltaX, deltaY: deltaY, deltaZ: deltaZ, detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, button: button, bubbles: canBubble, cancelable: cancelable, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, relatedTarget: relatedTarget}, core.String, core.Object);
      if (view == null) {
        view = html$.window;
      }
      return new WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.WheelEvent._create_1(type, eventInitDict_1);
      }
      return html$.WheelEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new WheelEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new WheelEvent(type);
    }
    get [_deltaX]() {
      return this.deltaX;
    }
    get [_deltaY]() {
      return this.deltaY;
    }
    get [dartx.deltaZ]() {
      return this.deltaZ;
    }
    get [dartx.deltaY]() {
      if (this.deltaY !== undefined) {
        return this[_deltaY];
      }
      dart.throw(new core.UnsupportedError('deltaY is not supported'));
    }
    get [dartx.deltaX]() {
      if (this.deltaX !== undefined) {
        return this[_deltaX];
      }
      dart.throw(new core.UnsupportedError('deltaX is not supported'));
    }
    get [dartx.deltaMode]() {
      if (!!this.deltaMode) {
        return this.deltaMode;
      }
      return 0;
    }
    get [_wheelDelta]() {
      return this.wheelDelta;
    }
    get [_wheelDeltaX]() {
      return this.wheelDeltaX;
    }
    get [_detail]() {
      return this.detail;
    }
    get [_hasInitMouseScrollEvent]() {
      return !!this.initMouseScrollEvent;
    }
    [_initMouseScrollEvent](...args) {
      return this.initMouseScrollEvent.apply(this, args);
    }
    get [_hasInitWheelEvent]() {
      return !!this.initWheelEvent;
    }
    [_initWheelEvent](...args) {
      return this.initWheelEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.WheelEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.WheelEvent, [core.String], {view: html$.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
      _: dart.definiteFunctionType(html$.WheelEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_deltaX]: core.double,
      [_deltaY]: core.double,
      [dartx.deltaZ]: core.double
    }),
    getters: () => ({
      [dartx.deltaY]: dart.definiteFunctionType(core.num, []),
      [dartx.deltaX]: dart.definiteFunctionType(core.num, []),
      [dartx.deltaMode]: dart.definiteFunctionType(core.int, []),
      [_wheelDelta]: dart.definiteFunctionType(core.num, []),
      [_wheelDeltaX]: dart.definiteFunctionType(core.num, []),
      [_detail]: dart.definiteFunctionType(core.num, []),
      [_hasInitMouseScrollEvent]: dart.definiteFunctionType(core.bool, []),
      [_hasInitWheelEvent]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
      [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
    }),
    sfields: () => ({
      DOM_DELTA_LINE: core.int,
      DOM_DELTA_PAGE: core.int,
      DOM_DELTA_PIXEL: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.WheelEvent.DOM_DELTA_LINE = 1;
  html$.WheelEvent.DOM_DELTA_PAGE = 2;
  html$.WheelEvent.DOM_DELTA_PIXEL = 0;
  dart.registerExtension(dart.global.WheelEvent, html$.WheelEvent);
  const _open2 = Symbol('_open2');
  const _open3 = Symbol('_open3');
  const _location = Symbol('_location');
  const _ensureRequestAnimationFrame = Symbol('_ensureRequestAnimationFrame');
  const _requestAnimationFrame = Symbol('_requestAnimationFrame');
  const _cancelAnimationFrame = Symbol('_cancelAnimationFrame');
  const _requestFileSystem = Symbol('_requestFileSystem');
  const _get_opener = Symbol('_get_opener');
  const _pageXOffset = Symbol('_pageXOffset');
  const _pageYOffset = Symbol('_pageYOffset');
  const _get_parent = Symbol('_get_parent');
  const _get_self = Symbol('_get_self');
  const _get_top = Symbol('_get_top');
  const __getter___1 = Symbol('__getter___1');
  const __getter___2 = Symbol('__getter___2');
  const _scroll_4 = Symbol('_scroll_4');
  const _scroll_5 = Symbol('_scroll_5');
  const _scrollBy_4 = Symbol('_scrollBy_4');
  const _scrollBy_5 = Symbol('_scrollBy_5');
  const _scrollTo_4 = Symbol('_scrollTo_4');
  const _scrollTo_5 = Symbol('_scrollTo_5');
  const __requestFileSystem = Symbol('__requestFileSystem');
  const _resolveLocalFileSystemUrl = Symbol('_resolveLocalFileSystemUrl');
  dart.defineExtensionNames([
    'animationFrame',
    'document',
    'open',
    'location',
    'location',
    'requestAnimationFrame',
    'cancelAnimationFrame',
    'indexedDB',
    'console',
    'requestFileSystem',
    'opener',
    'opener',
    'parent',
    'self',
    'top',
    'window',
    'alert',
    'close',
    'confirm',
    'fetch',
    'find',
    'getMatchedCssRules',
    'getSelection',
    'matchMedia',
    'moveBy',
    'openDatabase',
    'postMessage',
    'print',
    'resizeBy',
    'resizeTo',
    'scroll',
    'scrollBy',
    'scrollTo',
    'stop',
    'resolveLocalFileSystemUrl',
    'atob',
    'btoa',
    'onContentLoaded',
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDeviceMotion',
    'onDeviceOrientation',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onHashChange',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onLoadStart',
    'onMessage',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onOffline',
    'onOnline',
    'onPageHide',
    'onPageShow',
    'onPause',
    'onPlay',
    'onPlaying',
    'onPopState',
    'onProgress',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSearch',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onStorage',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onTouchCancel',
    'onTouchEnd',
    'onTouchMove',
    'onTouchStart',
    'onTransitionEnd',
    'onUnload',
    'onVolumeChange',
    'onWaiting',
    'onAnimationEnd',
    'onAnimationIteration',
    'onAnimationStart',
    'onBeforeUnload',
    'moveTo',
    'pageXOffset',
    'pageYOffset',
    'scrollX',
    'scrollY',
    'applicationCache',
    'caches',
    'closed',
    'crypto',
    'defaultStatus',
    'defaultstatus',
    'devicePixelRatio',
    'history',
    'innerHeight',
    'innerWidth',
    'localStorage',
    'locationbar',
    'menubar',
    'name',
    'navigator',
    'offscreenBuffering',
    'orientation',
    'outerHeight',
    'outerWidth',
    'performance',
    'screen',
    'screenLeft',
    'screenTop',
    'screenX',
    'screenY',
    'scrollbars',
    'sessionStorage',
    'speechSynthesis',
    'status',
    'statusbar',
    'styleMedia',
    'toolbar'
  ]);
  html$.Window = class Window extends html$.EventTarget {
    get [dartx.animationFrame]() {
      let completer = CompleterOfnum().sync();
      this[dartx.requestAnimationFrame](dart.fn(time => {
        completer.complete(time);
      }, numTovoid()));
      return completer.future;
    }
    get [dartx.document]() {
      return this.document;
    }
    [_open2](url, name) {
      return this.open(url, name);
    }
    [_open3](url, name, options) {
      return this.open(url, name, options);
    }
    [dartx.open](url, name, options) {
      if (options === void 0) options = null;
      if (options == null) {
        return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
      } else {
        return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
      }
    }
    get [dartx.location]() {
      return html$.Location._check(this[_location]);
    }
    set [dartx.location](value) {
      this[_location] = value;
    }
    get [_location]() {
      return this.location;
    }
    set [_location](value) {
      this.location = value;
    }
    [dartx.requestAnimationFrame](callback) {
      this[_ensureRequestAnimationFrame]();
      return this[_requestAnimationFrame](html$._wrapZone(core.num, dart.dynamic)(callback));
    }
    [dartx.cancelAnimationFrame](id) {
      this[_ensureRequestAnimationFrame]();
      this[_cancelAnimationFrame](id);
    }
    [_requestAnimationFrame](...args) {
      return this.requestAnimationFrame.apply(this, args);
    }
    [_cancelAnimationFrame](...args) {
      return this.cancelAnimationFrame.apply(this, args);
    }
    [_ensureRequestAnimationFrame]() {
      if (!!(this.requestAnimationFrame && this.cancelAnimationFrame)) return;
      (function($this) {
        var vendors = ['ms', 'moz', 'webkit', 'o'];
        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
        }
        if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
        $this.requestAnimationFrame = function(callback) {
          return window.setTimeout(function() {
            callback(Date.now());
          }, 16);
        };
        $this.cancelAnimationFrame = function(id) {
          clearTimeout(id);
        };
      })(this);
    }
    get [dartx.indexedDB]() {
      return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
    }
    get [dartx.console]() {
      return html$.Console._safeConsole;
    }
    [dartx.requestFileSystem](size, opts) {
      let persistent = opts && 'persistent' in opts ? opts.persistent : false;
      return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
    }
    static get supportsPointConversions() {
      return html$.DomPoint.supported;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.applicationCache]() {
      return this.applicationCache;
    }
    get [dartx.caches]() {
      return this.caches;
    }
    get [dartx.closed]() {
      return this.closed;
    }
    get [dartx.crypto]() {
      return this.crypto;
    }
    get [dartx.defaultStatus]() {
      return this.defaultStatus;
    }
    set [dartx.defaultStatus](value) {
      this.defaultStatus = value;
    }
    get [dartx.defaultstatus]() {
      return this.defaultstatus;
    }
    set [dartx.defaultstatus](value) {
      this.defaultstatus = value;
    }
    get [dartx.devicePixelRatio]() {
      return this.devicePixelRatio;
    }
    get [dartx.history]() {
      return this.history;
    }
    get [dartx.innerHeight]() {
      return this.innerHeight;
    }
    get [dartx.innerWidth]() {
      return this.innerWidth;
    }
    get [dartx.localStorage]() {
      return this.localStorage;
    }
    get [dartx.locationbar]() {
      return this.locationbar;
    }
    get [dartx.menubar]() {
      return this.menubar;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.navigator]() {
      return this.navigator;
    }
    get [dartx.offscreenBuffering]() {
      return this.offscreenBuffering;
    }
    get [dartx.opener]() {
      return html$._convertNativeToDart_Window(this[_get_opener]);
    }
    get [_get_opener]() {
      return this.opener;
    }
    set [dartx.opener](value) {
      this.opener = value;
    }
    get [dartx.orientation]() {
      return this.orientation;
    }
    get [dartx.outerHeight]() {
      return this.outerHeight;
    }
    get [dartx.outerWidth]() {
      return this.outerWidth;
    }
    get [_pageXOffset]() {
      return this.pageXOffset;
    }
    get [_pageYOffset]() {
      return this.pageYOffset;
    }
    get [dartx.parent]() {
      return html$._convertNativeToDart_Window(this[_get_parent]);
    }
    get [_get_parent]() {
      return this.parent;
    }
    get [dartx.performance]() {
      return this.performance;
    }
    get [dartx.screen]() {
      return this.screen;
    }
    get [dartx.screenLeft]() {
      return this.screenLeft;
    }
    get [dartx.screenTop]() {
      return this.screenTop;
    }
    get [dartx.screenX]() {
      return this.screenX;
    }
    get [dartx.screenY]() {
      return this.screenY;
    }
    get [dartx.scrollbars]() {
      return this.scrollbars;
    }
    get [dartx.self]() {
      return html$._convertNativeToDart_Window(this[_get_self]);
    }
    get [_get_self]() {
      return this.self;
    }
    get [dartx.sessionStorage]() {
      return this.sessionStorage;
    }
    get [dartx.speechSynthesis]() {
      return this.speechSynthesis;
    }
    get [dartx.status]() {
      return this.status;
    }
    set [dartx.status](value) {
      this.status = value;
    }
    get [dartx.statusbar]() {
      return this.statusbar;
    }
    get [dartx.styleMedia]() {
      return this.styleMedia;
    }
    get [dartx.toolbar]() {
      return this.toolbar;
    }
    get [dartx.top]() {
      return html$._convertNativeToDart_Window(this[_get_top]);
    }
    get [_get_top]() {
      return this.top;
    }
    get [dartx.window]() {
      return html$._convertNativeToDart_Window(this[_get_window]);
    }
    get [_get_window]() {
      return this.window;
    }
    [__getter__](index_OR_name) {
      if (typeof index_OR_name == 'number') {
        return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
      }
      if (typeof index_OR_name == 'string') {
        return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [__getter___1](...args) {
      return this.__getter__.apply(this, args);
    }
    [__getter___2](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.alert](...args) {
      return this.alert.apply(this, args);
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.confirm](...args) {
      return this.confirm.apply(this, args);
    }
    [dartx.fetch](input, init) {
      if (init === void 0) init = null;
      if (init != null) {
        let init_1 = html_common.convertDartToNative_Dictionary(init);
        return this[_fetch_1](input, init_1);
      }
      return this[_fetch_2](input);
    }
    [_fetch_1](...args) {
      return this.fetch.apply(this, args);
    }
    [_fetch_2](...args) {
      return this.fetch.apply(this, args);
    }
    [dartx.find](...args) {
      return this.find.apply(this, args);
    }
    [_getComputedStyle](...args) {
      return this.getComputedStyle.apply(this, args);
    }
    [dartx.getMatchedCssRules](...args) {
      return this.getMatchedCSSRules.apply(this, args);
    }
    [dartx.getSelection](...args) {
      return this.getSelection.apply(this, args);
    }
    [dartx.matchMedia](...args) {
      return this.matchMedia.apply(this, args);
    }
    [dartx.moveBy](...args) {
      return this.moveBy.apply(this, args);
    }
    [_moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.openDatabase](...args) {
      return this.openDatabase.apply(this, args);
    }
    [dartx.postMessage](message, targetOrigin, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, targetOrigin, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1, targetOrigin);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.print](...args) {
      return this.print.apply(this, args);
    }
    [dartx.resizeBy](...args) {
      return this.resizeBy.apply(this, args);
    }
    [dartx.resizeTo](...args) {
      return this.resizeTo.apply(this, args);
    }
    [dartx.scroll](options_OR_x, y, scrollOptions) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (scrollOptions === void 0) scrollOptions = null;
      if (options_OR_x == null && y == null && scrollOptions == null) {
        this[_scroll_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scroll_2](options_1);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scroll_3](options_OR_x, y);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scroll_4](options_OR_x, y);
        return;
      }
      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
        this[_scroll_5](options_OR_x, y, scrollOptions_1);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scroll_1](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_2](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_3](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_4](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_5](...args) {
      return this.scroll.apply(this, args);
    }
    [dartx.scrollBy](options_OR_x, y, scrollOptions) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (scrollOptions === void 0) scrollOptions = null;
      if (options_OR_x == null && y == null && scrollOptions == null) {
        this[_scrollBy_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollBy_2](options_1);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollBy_3](options_OR_x, y);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollBy_4](options_OR_x, y);
        return;
      }
      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
        this[_scrollBy_5](options_OR_x, y, scrollOptions_1);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollBy_1](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_2](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_3](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_4](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_5](...args) {
      return this.scrollBy.apply(this, args);
    }
    [dartx.scrollTo](options_OR_x, y, scrollOptions) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (scrollOptions === void 0) scrollOptions = null;
      if (options_OR_x == null && y == null && scrollOptions == null) {
        this[_scrollTo_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollTo_2](options_1);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollTo_3](options_OR_x, y);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollTo_4](options_OR_x, y);
        return;
      }
      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
        this[_scrollTo_5](options_OR_x, y, scrollOptions_1);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollTo_1](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_2](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_3](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_4](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_5](...args) {
      return this.scrollTo.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    [__requestFileSystem](...args) {
      return this.webkitRequestFileSystem.apply(this, args);
    }
    [_requestFileSystem](type, size) {
      let completer = CompleterOfFileSystem().new();
      this[__requestFileSystem](type, size, dart.fn(value => {
        completer.complete(value);
      }, FileSystemTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_resolveLocalFileSystemUrl](...args) {
      return this.webkitResolveLocalFileSystemURL.apply(this, args);
    }
    [dartx.resolveLocalFileSystemUrl](url) {
      let completer = CompleterOfEntry().new();
      this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
        completer.complete(value);
      }, EntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.atob](...args) {
      return this.atob.apply(this, args);
    }
    [dartx.btoa](...args) {
      return this.btoa.apply(this, args);
    }
    [_setInterval_String](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout_String](...args) {
      return this.setTimeout.apply(this, args);
    }
    [_clearInterval](...args) {
      return this.clearInterval.apply(this, args);
    }
    [_clearTimeout](...args) {
      return this.clearTimeout.apply(this, args);
    }
    [_setInterval](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout](...args) {
      return this.setTimeout.apply(this, args);
    }
    get [dartx.onContentLoaded]() {
      return html$.Window.contentLoadedEvent.forTarget(this);
    }
    get [dartx.onAbort]() {
      return html$.Element.abortEvent.forTarget(this);
    }
    get [dartx.onBlur]() {
      return html$.Element.blurEvent.forTarget(this);
    }
    get [dartx.onCanPlay]() {
      return html$.Element.canPlayEvent.forTarget(this);
    }
    get [dartx.onCanPlayThrough]() {
      return html$.Element.canPlayThroughEvent.forTarget(this);
    }
    get [dartx.onChange]() {
      return html$.Element.changeEvent.forTarget(this);
    }
    get [dartx.onClick]() {
      return html$.Element.clickEvent.forTarget(this);
    }
    get [dartx.onContextMenu]() {
      return html$.Element.contextMenuEvent.forTarget(this);
    }
    get [dartx.onDoubleClick]() {
      return html$.Element.doubleClickEvent.forTarget(this);
    }
    get [dartx.onDeviceMotion]() {
      return html$.Window.deviceMotionEvent.forTarget(this);
    }
    get [dartx.onDeviceOrientation]() {
      return html$.Window.deviceOrientationEvent.forTarget(this);
    }
    get [dartx.onDrag]() {
      return html$.Element.dragEvent.forTarget(this);
    }
    get [dartx.onDragEnd]() {
      return html$.Element.dragEndEvent.forTarget(this);
    }
    get [dartx.onDragEnter]() {
      return html$.Element.dragEnterEvent.forTarget(this);
    }
    get [dartx.onDragLeave]() {
      return html$.Element.dragLeaveEvent.forTarget(this);
    }
    get [dartx.onDragOver]() {
      return html$.Element.dragOverEvent.forTarget(this);
    }
    get [dartx.onDragStart]() {
      return html$.Element.dragStartEvent.forTarget(this);
    }
    get [dartx.onDrop]() {
      return html$.Element.dropEvent.forTarget(this);
    }
    get [dartx.onDurationChange]() {
      return html$.Element.durationChangeEvent.forTarget(this);
    }
    get [dartx.onEmptied]() {
      return html$.Element.emptiedEvent.forTarget(this);
    }
    get [dartx.onEnded]() {
      return html$.Element.endedEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.Element.errorEvent.forTarget(this);
    }
    get [dartx.onFocus]() {
      return html$.Element.focusEvent.forTarget(this);
    }
    get [dartx.onHashChange]() {
      return html$.Window.hashChangeEvent.forTarget(this);
    }
    get [dartx.onInput]() {
      return html$.Element.inputEvent.forTarget(this);
    }
    get [dartx.onInvalid]() {
      return html$.Element.invalidEvent.forTarget(this);
    }
    get [dartx.onKeyDown]() {
      return html$.Element.keyDownEvent.forTarget(this);
    }
    get [dartx.onKeyPress]() {
      return html$.Element.keyPressEvent.forTarget(this);
    }
    get [dartx.onKeyUp]() {
      return html$.Element.keyUpEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.Element.loadEvent.forTarget(this);
    }
    get [dartx.onLoadedData]() {
      return html$.Element.loadedDataEvent.forTarget(this);
    }
    get [dartx.onLoadedMetadata]() {
      return html$.Element.loadedMetadataEvent.forTarget(this);
    }
    get [dartx.onLoadStart]() {
      return html$.Window.loadStartEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.Window.messageEvent.forTarget(this);
    }
    get [dartx.onMouseDown]() {
      return html$.Element.mouseDownEvent.forTarget(this);
    }
    get [dartx.onMouseEnter]() {
      return html$.Element.mouseEnterEvent.forTarget(this);
    }
    get [dartx.onMouseLeave]() {
      return html$.Element.mouseLeaveEvent.forTarget(this);
    }
    get [dartx.onMouseMove]() {
      return html$.Element.mouseMoveEvent.forTarget(this);
    }
    get [dartx.onMouseOut]() {
      return html$.Element.mouseOutEvent.forTarget(this);
    }
    get [dartx.onMouseOver]() {
      return html$.Element.mouseOverEvent.forTarget(this);
    }
    get [dartx.onMouseUp]() {
      return html$.Element.mouseUpEvent.forTarget(this);
    }
    get [dartx.onMouseWheel]() {
      return html$.Element.mouseWheelEvent.forTarget(this);
    }
    get [dartx.onOffline]() {
      return html$.Window.offlineEvent.forTarget(this);
    }
    get [dartx.onOnline]() {
      return html$.Window.onlineEvent.forTarget(this);
    }
    get [dartx.onPageHide]() {
      return html$.Window.pageHideEvent.forTarget(this);
    }
    get [dartx.onPageShow]() {
      return html$.Window.pageShowEvent.forTarget(this);
    }
    get [dartx.onPause]() {
      return html$.Element.pauseEvent.forTarget(this);
    }
    get [dartx.onPlay]() {
      return html$.Element.playEvent.forTarget(this);
    }
    get [dartx.onPlaying]() {
      return html$.Element.playingEvent.forTarget(this);
    }
    get [dartx.onPopState]() {
      return html$.Window.popStateEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.Window.progressEvent.forTarget(this);
    }
    get [dartx.onRateChange]() {
      return html$.Element.rateChangeEvent.forTarget(this);
    }
    get [dartx.onReset]() {
      return html$.Element.resetEvent.forTarget(this);
    }
    get [dartx.onResize]() {
      return html$.Element.resizeEvent.forTarget(this);
    }
    get [dartx.onScroll]() {
      return html$.Element.scrollEvent.forTarget(this);
    }
    get [dartx.onSearch]() {
      return html$.Element.searchEvent.forTarget(this);
    }
    get [dartx.onSeeked]() {
      return html$.Element.seekedEvent.forTarget(this);
    }
    get [dartx.onSeeking]() {
      return html$.Element.seekingEvent.forTarget(this);
    }
    get [dartx.onSelect]() {
      return html$.Element.selectEvent.forTarget(this);
    }
    get [dartx.onStalled]() {
      return html$.Element.stalledEvent.forTarget(this);
    }
    get [dartx.onStorage]() {
      return html$.Window.storageEvent.forTarget(this);
    }
    get [dartx.onSubmit]() {
      return html$.Element.submitEvent.forTarget(this);
    }
    get [dartx.onSuspend]() {
      return html$.Element.suspendEvent.forTarget(this);
    }
    get [dartx.onTimeUpdate]() {
      return html$.Element.timeUpdateEvent.forTarget(this);
    }
    get [dartx.onTouchCancel]() {
      return html$.Element.touchCancelEvent.forTarget(this);
    }
    get [dartx.onTouchEnd]() {
      return html$.Element.touchEndEvent.forTarget(this);
    }
    get [dartx.onTouchMove]() {
      return html$.Element.touchMoveEvent.forTarget(this);
    }
    get [dartx.onTouchStart]() {
      return html$.Element.touchStartEvent.forTarget(this);
    }
    get [dartx.onTransitionEnd]() {
      return html$.Element.transitionEndEvent.forTarget(this);
    }
    get [dartx.onUnload]() {
      return html$.Window.unloadEvent.forTarget(this);
    }
    get [dartx.onVolumeChange]() {
      return html$.Element.volumeChangeEvent.forTarget(this);
    }
    get [dartx.onWaiting]() {
      return html$.Element.waitingEvent.forTarget(this);
    }
    get [dartx.onAnimationEnd]() {
      return html$.Window.animationEndEvent.forTarget(this);
    }
    get [dartx.onAnimationIteration]() {
      return html$.Window.animationIterationEvent.forTarget(this);
    }
    get [dartx.onAnimationStart]() {
      return html$.Window.animationStartEvent.forTarget(this);
    }
    get [dartx.onBeforeUnload]() {
      return html$.Window.beforeUnloadEvent.forTarget(this);
    }
    [dartx.moveTo](p) {
      this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
    }
    get [dartx.pageXOffset]() {
      return this.pageXOffset[dartx.round]();
    }
    get [dartx.pageYOffset]() {
      return this.pageYOffset[dartx.round]();
    }
    get [dartx.scrollX]() {
      return "scrollX" in this ? this.scrollX[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollLeft];
    }
    get [dartx.scrollY]() {
      return "scrollY" in this ? this.scrollY[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollTop];
    }
  };
  html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
  dart.setSignature(html$.Window, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Window, [])}),
    fields: () => ({
      [dartx.applicationCache]: html$.ApplicationCache,
      [dartx.caches]: html$.CacheStorage,
      [dartx.closed]: core.bool,
      [dartx.crypto]: html$.Crypto,
      [dartx.defaultStatus]: core.String,
      [dartx.defaultstatus]: core.String,
      [dartx.devicePixelRatio]: core.double,
      [dartx.history]: html$.History,
      [dartx.innerHeight]: core.int,
      [dartx.innerWidth]: core.int,
      [dartx.localStorage]: html$.Storage,
      [dartx.locationbar]: html$.BarProp,
      [dartx.menubar]: html$.BarProp,
      [dartx.name]: core.String,
      [dartx.navigator]: html$.Navigator,
      [dartx.offscreenBuffering]: core.bool,
      [_get_opener]: dart.dynamic,
      [dartx.orientation]: core.int,
      [dartx.outerHeight]: core.int,
      [dartx.outerWidth]: core.int,
      [_pageXOffset]: core.double,
      [_pageYOffset]: core.double,
      [_get_parent]: dart.dynamic,
      [dartx.performance]: html$.Performance,
      [dartx.screen]: html$.Screen,
      [dartx.screenLeft]: core.int,
      [dartx.screenTop]: core.int,
      [dartx.screenX]: core.int,
      [dartx.screenY]: core.int,
      [dartx.scrollbars]: html$.BarProp,
      [_get_self]: dart.dynamic,
      [dartx.sessionStorage]: html$.Storage,
      [dartx.speechSynthesis]: html$.SpeechSynthesis,
      [dartx.status]: core.String,
      [dartx.statusbar]: html$.BarProp,
      [dartx.styleMedia]: html$.StyleMedia,
      [dartx.toolbar]: html$.BarProp,
      [_get_top]: dart.dynamic,
      [_get_window]: dart.dynamic
    }),
    getters: () => ({
      [dartx.animationFrame]: dart.definiteFunctionType(async.Future$(core.num), []),
      [dartx.document]: dart.definiteFunctionType(html$.Document, []),
      [dartx.location]: dart.definiteFunctionType(html$.Location, []),
      [_location]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.indexedDB]: dart.definiteFunctionType(indexed_db.IdbFactory, []),
      [dartx.console]: dart.definiteFunctionType(html$.Console, []),
      [dartx.opener]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.parent]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.self]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.top]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html$.DeviceMotionEvent), []),
      [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html$.DeviceOrientationEvent), []),
      [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
      [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
      [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html$.TransitionEvent), []),
      [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
      [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
      [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
      [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.pageXOffset]: dart.definiteFunctionType(core.int, []),
      [dartx.pageYOffset]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollX]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollY]: dart.definiteFunctionType(core.int, [])
    }),
    setters: () => ({
      [dartx.location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.opener]: dart.definiteFunctionType(dart.void, [html$.Window])
    }),
    methods: () => ({
      [_open2]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
      [_open3]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.open]: dart.definiteFunctionType(html$.WindowBase, [core.String, core.String], [core.String]),
      [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
      [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
      [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
      [_cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
      [_ensureRequestAnimationFrame]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
      [__getter__]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic]),
      [__getter___1]: dart.definiteFunctionType(dart.dynamic, [core.int]),
      [__getter___2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
      [dartx.alert]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.confirm]: dart.definiteFunctionType(core.bool, [], [core.String]),
      [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
      [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.find]: dart.definiteFunctionType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
      [_getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [html$.Element, core.String]),
      [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html$.CssRule), [html$.Element, core.String]),
      [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, []),
      [dartx.matchMedia]: dart.definiteFunctionType(html$.MediaQueryList, [core.String]),
      [dartx.moveBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_moveTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html$.DatabaseCallback]),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [dartx.print]: dart.definiteFunctionType(dart.void, []),
      [dartx.resizeBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.resizeTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
      [_scroll_1]: dart.definiteFunctionType(dart.void, []),
      [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_scroll_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_scroll_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
      [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_scrollBy_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_scrollBy_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
      [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_scrollTo_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_scrollTo_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, []),
      [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html$._FileSystemCallback], [html$._ErrorCallback]),
      [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
      [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
      [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
      [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [PointOfnum()])
    }),
    sfields: () => ({
      contentLoadedEvent: EventStreamProviderOfEvent(),
      deviceMotionEvent: EventStreamProviderOfDeviceMotionEvent(),
      deviceOrientationEvent: EventStreamProviderOfDeviceOrientationEvent(),
      hashChangeEvent: EventStreamProviderOfEvent(),
      loadStartEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      offlineEvent: EventStreamProviderOfEvent(),
      onlineEvent: EventStreamProviderOfEvent(),
      pageHideEvent: EventStreamProviderOfEvent(),
      pageShowEvent: EventStreamProviderOfEvent(),
      popStateEvent: EventStreamProviderOfPopStateEvent(),
      progressEvent: EventStreamProviderOfEvent(),
      storageEvent: EventStreamProviderOfStorageEvent(),
      unloadEvent: EventStreamProviderOfEvent(),
      animationEndEvent: EventStreamProviderOfAnimationEvent(),
      animationIterationEvent: EventStreamProviderOfAnimationEvent(),
      animationStartEvent: EventStreamProviderOfAnimationEvent(),
      PERSISTENT: core.int,
      TEMPORARY: core.int,
      beforeUnloadEvent: EventStreamProviderOfBeforeUnloadEvent()
    }),
    sgetters: () => ({supportsPointConversions: dart.definiteFunctionType(core.bool, [])})
  });
  html$.Window.PERSISTENT = 1;
  html$.Window.TEMPORARY = 0;
  dart.defineLazy(html$.Window, {
    get contentLoadedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('DOMContentLoaded'));
    },
    get deviceMotionEvent() {
      return dart.const(new (EventStreamProviderOfDeviceMotionEvent())('devicemotion'));
    },
    get deviceOrientationEvent() {
      return dart.const(new (EventStreamProviderOfDeviceOrientationEvent())('deviceorientation'));
    },
    get hashChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
    },
    get loadStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadstart'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get offlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('offline'));
    },
    get onlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('online'));
    },
    get pageHideEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pagehide'));
    },
    get pageShowEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pageshow'));
    },
    get popStateEvent() {
      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('progress'));
    },
    get storageEvent() {
      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
    },
    get unloadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unload'));
    },
    get animationEndEvent() {
      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationEnd'));
    },
    get animationIterationEvent() {
      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationIteration'));
    },
    get animationStartEvent() {
      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationStart'));
    },
    get beforeUnloadEvent() {
      return dart.const(new html$._BeforeUnloadEventStreamProvider('beforeunload'));
    }
  });
  dart.registerExtension(dart.global.Window, html$.Window);
  dart.registerExtension(dart.global.DOMWindow, html$.Window);
  const _returnValue = Symbol('_returnValue');
  html$._WrappedEvent = class _WrappedEvent extends core.Object {
    new(wrapped) {
      this.wrapped = wrapped;
      this[_selector] = null;
    }
    get bubbles() {
      return this.wrapped[dartx.bubbles];
    }
    get cancelable() {
      return this.wrapped[dartx.cancelable];
    }
    get currentTarget() {
      return this.wrapped[dartx.currentTarget];
    }
    get defaultPrevented() {
      return this.wrapped[dartx.defaultPrevented];
    }
    get eventPhase() {
      return this.wrapped[dartx.eventPhase];
    }
    get target() {
      return this.wrapped[dartx.target];
    }
    get timeStamp() {
      return this.wrapped[dartx.timeStamp];
    }
    get type() {
      return this.wrapped[dartx.type];
    }
    [_initEvent](eventTypeArg, canBubbleArg, cancelableArg) {
      dart.throw(new core.UnsupportedError('Cannot initialize this Event.'));
    }
    preventDefault() {
      this.wrapped[dartx.preventDefault]();
    }
    stopImmediatePropagation() {
      this.wrapped[dartx.stopImmediatePropagation]();
    }
    stopPropagation() {
      this.wrapped[dartx.stopPropagation]();
    }
    get matchingTarget() {
      if (this[_selector] == null) {
        dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
      }
      let currentTarget = html$.Element._check(this.currentTarget);
      let target = html$.Element._check(this.target);
      let matchedTarget = null;
      do {
        if (dart.test(target[dartx.matches](this[_selector]))) return target;
        target = target[dartx.parent];
      } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
      dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
    }
    get path() {
      return ListOfNode()._check(this.wrapped[dartx.path]);
    }
    get [_get_currentTarget]() {
      return this.wrapped[_get_currentTarget];
    }
    get [_get_target]() {
      return this.wrapped[_get_target];
    }
  };
  html$._WrappedEvent[dart.implements] = () => [html$.Event];
  dart.setSignature(html$._WrappedEvent, {
    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedEvent, [html$.Event])}),
    fields: () => ({
      wrapped: html$.Event,
      [_selector]: core.String
    }),
    getters: () => ({
      bubbles: dart.definiteFunctionType(core.bool, []),
      cancelable: dart.definiteFunctionType(core.bool, []),
      currentTarget: dart.definiteFunctionType(html$.EventTarget, []),
      defaultPrevented: dart.definiteFunctionType(core.bool, []),
      eventPhase: dart.definiteFunctionType(core.int, []),
      target: dart.definiteFunctionType(html$.EventTarget, []),
      timeStamp: dart.definiteFunctionType(core.int, []),
      type: dart.definiteFunctionType(core.String, []),
      matchingTarget: dart.definiteFunctionType(html$.Element, []),
      path: dart.definiteFunctionType(core.List$(html$.Node), []),
      [_get_currentTarget]: dart.definiteFunctionType(dart.dynamic, []),
      [_get_target]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({
      [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
      preventDefault: dart.definiteFunctionType(dart.void, []),
      stopImmediatePropagation: dart.definiteFunctionType(dart.void, []),
      stopPropagation: dart.definiteFunctionType(dart.void, [])
    })
  });
  html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
    new(base) {
      this[_returnValue] = null;
      super.new(base);
    }
    get returnValue() {
      return this[_returnValue];
    }
    set returnValue(value) {
      this[_returnValue] = value;
      if ("returnValue" in this.wrapped) {
        this.wrapped.returnValue = value;
      }
    }
  };
  html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
  dart.setSignature(html$._BeforeUnloadEvent, {
    constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEvent, [html$.Event])}),
    fields: () => ({[_returnValue]: core.String}),
    getters: () => ({returnValue: dart.definiteFunctionType(core.String, [])}),
    setters: () => ({returnValue: dart.definiteFunctionType(dart.void, [core.String])})
  });
  const _eventType = Symbol('_eventType');
  html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
    new(eventType) {
      this[_eventType] = eventType;
    }
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      let stream = new (_EventStreamOfEvent())(e, this[_eventType], useCapture);
      let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
      stream.listen(dart.fn(event => {
        let wrapped = new html$._BeforeUnloadEvent(event);
        controller.add(wrapped);
      }, EventTovoid$()));
      return controller.stream;
    }
    getEventType(target) {
      return this[_eventType];
    }
    forElement(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
    }
    [_forElementList](e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementListEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
    }
  };
  html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
  dart.setSignature(html$._BeforeUnloadEventStreamProvider, {
    constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEventStreamProvider, [core.String])}),
    fields: () => ({[_eventType]: core.String}),
    methods: () => ({
      forTarget: dart.definiteFunctionType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
      forElement: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
    })
  });
  html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.WindowBase64, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WindowBase64, [])})
  });
  dart.defineExtensionNames([
    'focus',
    'focused',
    'visibilityState'
  ]);
  html$.WindowClient = class WindowClient extends html$.Client {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.focused]() {
      return this.focused;
    }
    get [dartx.visibilityState]() {
      return this.visibilityState;
    }
    [dartx.focus](...args) {
      return this.focus.apply(this, args);
    }
  };
  dart.setSignature(html$.WindowClient, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WindowClient, [])}),
    fields: () => ({
      [dartx.focused]: core.bool,
      [dartx.visibilityState]: core.String
    }),
    methods: () => ({[dartx.focus]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.WindowClient, html$.WindowClient);
  dart.defineExtensionNames([
    'onHashChange',
    'onMessage',
    'onOffline',
    'onOnline',
    'onPopState',
    'onStorage',
    'onUnload'
  ]);
  html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onHashChange() {
      return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
    }
    get onMessage() {
      return html$.WindowEventHandlers.messageEvent.forTarget(this);
    }
    get onOffline() {
      return html$.WindowEventHandlers.offlineEvent.forTarget(this);
    }
    get onOnline() {
      return html$.WindowEventHandlers.onlineEvent.forTarget(this);
    }
    get onPopState() {
      return html$.WindowEventHandlers.popStateEvent.forTarget(this);
    }
    get onStorage() {
      return html$.WindowEventHandlers.storageEvent.forTarget(this);
    }
    get onUnload() {
      return html$.WindowEventHandlers.unloadEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.WindowEventHandlers, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WindowEventHandlers, [])}),
    getters: () => ({
      onHashChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onMessage: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      onOffline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onOnline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onPopState: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
      onStorage: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
      onUnload: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      hashChangeEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      offlineEvent: EventStreamProviderOfEvent(),
      onlineEvent: EventStreamProviderOfEvent(),
      popStateEvent: EventStreamProviderOfPopStateEvent(),
      storageEvent: EventStreamProviderOfStorageEvent(),
      unloadEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineExtensionMembers(html$.WindowEventHandlers, [
    'onHashChange',
    'onMessage',
    'onOffline',
    'onOnline',
    'onPopState',
    'onStorage',
    'onUnload'
  ]);
  dart.defineLazy(html$.WindowEventHandlers, {
    get hashChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get offlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('offline'));
    },
    get onlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('online'));
    },
    get popStateEvent() {
      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
    },
    get storageEvent() {
      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
    },
    get unloadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unload'));
    }
  });
  dart.defineExtensionNames([
    'postMessage',
    'terminate',
    'onError',
    'onMessage'
  ]);
  html$.Worker = class Worker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(scriptUrl) {
      return html$.Worker._create_1(scriptUrl);
    }
    static _create_1(scriptUrl) {
      return new Worker(scriptUrl);
    }
    static get supported() {
      return typeof window.Worker != "undefined";
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.terminate](...args) {
      return this.terminate.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.Worker.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.Worker.messageEvent.forTarget(this);
    }
  };
  html$.Worker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$.Worker, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Worker, []),
      new: dart.definiteFunctionType(html$.Worker, [core.String])
    }),
    getters: () => ({
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.Worker, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.defineLazy(html$.Worker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.Worker, html$.Worker);
  html$.WorkerConsole = class WorkerConsole extends html$.ConsoleBase {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.WorkerConsole, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerConsole, [])})
  });
  dart.registerExtension(dart.global.WorkerConsole, html$.WorkerConsole);
  dart.defineExtensionNames([
    'clearMarks',
    'clearMeasures',
    'getEntries',
    'getEntriesByName',
    'getEntriesByType',
    'mark',
    'measure',
    'now',
    'clearResourceTimings',
    'setResourceTimingBufferSize',
    'memory'
  ]);
  html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.memory]() {
      return this.memory;
    }
    [dartx.clearMarks](...args) {
      return this.clearMarks.apply(this, args);
    }
    [dartx.clearMeasures](...args) {
      return this.clearMeasures.apply(this, args);
    }
    [dartx.getEntries](...args) {
      return this.getEntries.apply(this, args);
    }
    [dartx.getEntriesByName](...args) {
      return this.getEntriesByName.apply(this, args);
    }
    [dartx.getEntriesByType](...args) {
      return this.getEntriesByType.apply(this, args);
    }
    [dartx.mark](...args) {
      return this.mark.apply(this, args);
    }
    [dartx.measure](...args) {
      return this.measure.apply(this, args);
    }
    [dartx.now](...args) {
      return this.now.apply(this, args);
    }
    [dartx.clearResourceTimings](...args) {
      return this.webkitClearResourceTimings.apply(this, args);
    }
    [dartx.setResourceTimingBufferSize](...args) {
      return this.webkitSetResourceTimingBufferSize.apply(this, args);
    }
  };
  dart.setSignature(html$.WorkerPerformance, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerPerformance, [])}),
    fields: () => ({[dartx.memory]: html$.MemoryInfo}),
    methods: () => ({
      [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
      [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
      [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
      [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.now]: dart.definiteFunctionType(core.double, []),
      [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
      [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  dart.registerExtension(dart.global.WorkerPerformance, html$.WorkerPerformance);
  dart.defineExtensionNames([
    'createExpression',
    'createNSResolver',
    'evaluate'
  ]);
  html$.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.XPathEvaluator._create_1();
    }
    static _create_1() {
      return new XPathEvaluator();
    }
    [dartx.createExpression](...args) {
      return this.createExpression.apply(this, args);
    }
    [dartx.createNSResolver](...args) {
      return this.createNSResolver.apply(this, args);
    }
    [dartx.evaluate](...args) {
      return this.evaluate.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathEvaluator, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.XPathEvaluator, []),
      new: dart.definiteFunctionType(html$.XPathEvaluator, [])
    }),
    methods: () => ({
      [dartx.createExpression]: dart.definiteFunctionType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
      [dartx.createNSResolver]: dart.definiteFunctionType(html$.XPathNSResolver, [html$.Node]),
      [dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.XPathEvaluator, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.XPathEvaluator, html$.XPathEvaluator);
  dart.defineExtensionNames([
    'evaluate'
  ]);
  html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.evaluate](...args) {
      return this.evaluate.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathExpression, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XPathExpression, [])}),
    methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [html$.Node], [core.int, core.Object])})
  });
  dart.registerExtension(dart.global.XPathExpression, html$.XPathExpression);
  dart.defineExtensionNames([
    'lookupNamespaceUri'
  ]);
  html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.lookupNamespaceUri](...args) {
      return this.lookupNamespaceURI.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathNSResolver, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XPathNSResolver, [])}),
    methods: () => ({[dartx.lookupNamespaceUri]: dart.definiteFunctionType(core.String, [core.String])})
  });
  dart.registerExtension(dart.global.XPathNSResolver, html$.XPathNSResolver);
  dart.defineExtensionNames([
    'iterateNext',
    'snapshotItem',
    'booleanValue',
    'invalidIteratorState',
    'numberValue',
    'resultType',
    'singleNodeValue',
    'snapshotLength',
    'stringValue'
  ]);
  html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.booleanValue]() {
      return this.booleanValue;
    }
    get [dartx.invalidIteratorState]() {
      return this.invalidIteratorState;
    }
    get [dartx.numberValue]() {
      return this.numberValue;
    }
    get [dartx.resultType]() {
      return this.resultType;
    }
    get [dartx.singleNodeValue]() {
      return this.singleNodeValue;
    }
    get [dartx.snapshotLength]() {
      return this.snapshotLength;
    }
    get [dartx.stringValue]() {
      return this.stringValue;
    }
    [dartx.iterateNext](...args) {
      return this.iterateNext.apply(this, args);
    }
    [dartx.snapshotItem](...args) {
      return this.snapshotItem.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathResult, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XPathResult, [])}),
    fields: () => ({
      [dartx.booleanValue]: core.bool,
      [dartx.invalidIteratorState]: core.bool,
      [dartx.numberValue]: core.double,
      [dartx.resultType]: core.int,
      [dartx.singleNodeValue]: html$.Node,
      [dartx.snapshotLength]: core.int,
      [dartx.stringValue]: core.String
    }),
    methods: () => ({
      [dartx.iterateNext]: dart.definiteFunctionType(html$.Node, []),
      [dartx.snapshotItem]: dart.definiteFunctionType(html$.Node, [core.int])
    }),
    sfields: () => ({
      ANY_TYPE: core.int,
      ANY_UNORDERED_NODE_TYPE: core.int,
      BOOLEAN_TYPE: core.int,
      FIRST_ORDERED_NODE_TYPE: core.int,
      NUMBER_TYPE: core.int,
      ORDERED_NODE_ITERATOR_TYPE: core.int,
      ORDERED_NODE_SNAPSHOT_TYPE: core.int,
      STRING_TYPE: core.int,
      UNORDERED_NODE_ITERATOR_TYPE: core.int,
      UNORDERED_NODE_SNAPSHOT_TYPE: core.int
    })
  });
  html$.XPathResult.ANY_TYPE = 0;
  html$.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
  html$.XPathResult.BOOLEAN_TYPE = 3;
  html$.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
  html$.XPathResult.NUMBER_TYPE = 1;
  html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
  html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
  html$.XPathResult.STRING_TYPE = 2;
  html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
  html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  dart.registerExtension(dart.global.XPathResult, html$.XPathResult);
  html$.XmlDocument = class XmlDocument extends html$.Document {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.XmlDocument, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XmlDocument, [])})
  });
  dart.registerExtension(dart.global.XMLDocument, html$.XmlDocument);
  dart.defineExtensionNames([
    'serializeToString'
  ]);
  html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.XmlSerializer._create_1();
    }
    static _create_1() {
      return new XMLSerializer();
    }
    [dartx.serializeToString](...args) {
      return this.serializeToString.apply(this, args);
    }
  };
  dart.setSignature(html$.XmlSerializer, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.XmlSerializer, []),
      new: dart.definiteFunctionType(html$.XmlSerializer, [])
    }),
    methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html$.Node])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.XmlSerializer, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.XMLSerializer, html$.XmlSerializer);
  dart.defineExtensionNames([
    'clearParameters',
    'getParameter',
    'importStylesheet',
    'removeParameter',
    'reset',
    'setParameter',
    'transformToDocument',
    'transformToFragment'
  ]);
  html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.XsltProcessor._create_1();
    }
    static _create_1() {
      return new XSLTProcessor();
    }
    static get supported() {
      return !!window.XSLTProcessor;
    }
    [dartx.clearParameters](...args) {
      return this.clearParameters.apply(this, args);
    }
    [dartx.getParameter](...args) {
      return this.getParameter.apply(this, args);
    }
    [dartx.importStylesheet](...args) {
      return this.importStylesheet.apply(this, args);
    }
    [dartx.removeParameter](...args) {
      return this.removeParameter.apply(this, args);
    }
    [dartx.reset](...args) {
      return this.reset.apply(this, args);
    }
    [dartx.setParameter](...args) {
      return this.setParameter.apply(this, args);
    }
    [dartx.transformToDocument](...args) {
      return this.transformToDocument.apply(this, args);
    }
    [dartx.transformToFragment](...args) {
      return this.transformToFragment.apply(this, args);
    }
  };
  dart.setSignature(html$.XsltProcessor, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.XsltProcessor, []),
      new: dart.definiteFunctionType(html$.XsltProcessor, [])
    }),
    methods: () => ({
      [dartx.clearParameters]: dart.definiteFunctionType(dart.void, []),
      [dartx.getParameter]: dart.definiteFunctionType(core.String, [core.String, core.String]),
      [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.removeParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.reset]: dart.definiteFunctionType(dart.void, []),
      [dartx.setParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.transformToDocument]: dart.definiteFunctionType(html$.Document, [html$.Node]),
      [dartx.transformToFragment]: dart.definiteFunctionType(html$.DocumentFragment, [html$.Node, html$.Document])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.XsltProcessor, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.XSLTProcessor, html$.XsltProcessor);
  dart.defineExtensionNames([
    'name',
    'value'
  ]);
  html$._Attr = class _Attr extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.setSignature(html$._Attr, {
    constructors: () => ({_: dart.definiteFunctionType(html$._Attr, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.value]: core.String
    })
  });
  dart.registerExtension(dart.global.Attr, html$._Attr);
  html$._Cache = class _Cache extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._Cache, {
    constructors: () => ({_: dart.definiteFunctionType(html$._Cache, [])})
  });
  dart.registerExtension(dart.global.Cache, html$._Cache);
  html$._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._CanvasPathMethods, {
    constructors: () => ({_: dart.definiteFunctionType(html$._CanvasPathMethods, [])})
  });
  dart.defineExtensionNames([
    'toString',
    '==',
    'hashCode',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft',
    'bottom',
    'height',
    'left',
    'right',
    'top',
    'width'
  ]);
  html$._ClientRect = class _ClientRect extends _interceptors.Interceptor {
    [dartx.toString]() {
      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
    }
    [dartx['==']](other) {
      if (!RectangleOfnum().is(other)) return false;
      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
    }
    get [dartx.hashCode]() {
      return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
    }
    [dartx.intersection](other) {
      let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
      let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
        let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    [dartx.intersects](other) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    [dartx.boundingBox](other) {
      let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
      let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    [dartx.containsRectangle](another) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    [dartx.containsPoint](another) {
      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    get [dartx.topLeft]() {
      return new (PointOfnum())(this[dartx.left], this[dartx.top]);
    }
    get [dartx.topRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
    }
    get [dartx.bottomRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    get [dartx.bottomLeft]() {
      return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bottom]() {
      return this.bottom;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.left]() {
      return this.left;
    }
    get [dartx.right]() {
      return this.right;
    }
    get [dartx.top]() {
      return this.top;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  html$._ClientRect[dart.implements] = () => [RectangleOfnum()];
  dart.setSignature(html$._ClientRect, {
    constructors: () => ({_: dart.definiteFunctionType(html$._ClientRect, [])}),
    fields: () => ({
      [dartx.bottom]: core.double,
      [dartx.height]: core.double,
      [dartx.left]: core.double,
      [dartx.right]: core.double,
      [dartx.top]: core.double,
      [dartx.width]: core.double
    }),
    getters: () => ({
      [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), [])
    }),
    methods: () => ({
      [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
    })
  });
  dart.registerExtension(dart.global.ClientRect, html$._ClientRect);
  html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
    static combine(hash, value) {
      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
      return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
    }
    static finish(hash) {
      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
    }
    static hash2(a, b) {
      return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
    }
    static hash4(a, b, c, d) {
      return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
    }
  };
  dart.setSignature(html$._JenkinsSmiHash, {
    statics: () => ({
      combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
      finish: dart.definiteFunctionType(core.int, [core.int]),
      hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
      hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['combine', 'finish', 'hash2', 'hash4']
  });
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html$.ImmutableListMixin$(math.Rectangle$(core.num))) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.item](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
  dart.setSignature(html$._ClientRectList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._ClientRectList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.last]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.single]: dart.definiteFunctionType(math.Rectangle$(core.num), [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, RectangleOfnum()]),
      [dartx.elementAt]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
      [__getter__]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
      [dartx.item]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int])
    })
  });
  dart.registerExtension(dart.global.ClientRectList, html$._ClientRectList);
  dart.registerExtension(dart.global.DOMRectList, html$._ClientRectList);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.CssRule), html$.ImmutableListMixin$(html$.CssRule)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
  dart.setSignature(html$._CssRuleList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._CssRuleList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.CssRule, []),
      [dartx.last]: dart.definiteFunctionType(html$.CssRule, []),
      [dartx.single]: dart.definiteFunctionType(html$.CssRule, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.CssRule, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.CssRule]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.CssRule, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.CssRule, [core.int])
    })
  });
  dart.registerExtension(dart.global.CSSRuleList, html$._CssRuleList);
  html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._DOMFileSystemSync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DOMFileSystemSync, [])})
  });
  dart.registerExtension(dart.global.DOMFileSystemSync, html$._DOMFileSystemSync);
  html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._EntrySync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._EntrySync, [])})
  });
  dart.registerExtension(dart.global.EntrySync, html$._EntrySync);
  html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._DirectoryEntrySync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryEntrySync, [])})
  });
  dart.registerExtension(dart.global.DirectoryEntrySync, html$._DirectoryEntrySync);
  html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._DirectoryReaderSync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryReaderSync, [])})
  });
  dart.registerExtension(dart.global.DirectoryReaderSync, html$._DirectoryReaderSync);
  html$._DocumentType = class _DocumentType extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._DocumentType[dart.implements] = () => [html$.ChildNode];
  dart.setSignature(html$._DocumentType, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DocumentType, [])})
  });
  dart.registerExtension(dart.global.DocumentType, html$._DocumentType);
  dart.defineExtensionNames([
    'height',
    'height',
    'width',
    'width',
    'x',
    'x',
    'y',
    'y'
  ]);
  html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(x, y, width, height) {
      if (x === void 0) x = null;
      if (y === void 0) y = null;
      if (width === void 0) width = null;
      if (height === void 0) height = null;
      if (height != null) {
        return html$._DomRect._create_1(x, y, width, height);
      }
      if (width != null) {
        return html$._DomRect._create_2(x, y, width);
      }
      if (y != null) {
        return html$._DomRect._create_3(x, y);
      }
      if (x != null) {
        return html$._DomRect._create_4(x);
      }
      return html$._DomRect._create_5();
    }
    static _create_1(x, y, width, height) {
      return new DOMRect(x, y, width, height);
    }
    static _create_2(x, y, width) {
      return new DOMRect(x, y, width);
    }
    static _create_3(x, y) {
      return new DOMRect(x, y);
    }
    static _create_4(x) {
      return new DOMRect(x);
    }
    static _create_5() {
      return new DOMRect();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(html$._DomRect, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._DomRect, []),
      new: dart.definiteFunctionType(html$._DomRect, [], [core.num, core.num, core.num, core.num])
    }),
    setters: () => ({
      [dartx.height]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.width]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.y]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$._DomRect, [dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$._DomRect, [])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
  });
  dart.registerExtension(dart.global.DOMRect, html$._DomRect);
  html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._FileEntrySync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._FileEntrySync, [])})
  });
  dart.registerExtension(dart.global.FileEntrySync, html$._FileEntrySync);
  html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$._FileReaderSync._create_1();
    }
    static _create_1() {
      return new FileReaderSync();
    }
  };
  dart.setSignature(html$._FileReaderSync, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._FileReaderSync, []),
      new: dart.definiteFunctionType(html$._FileReaderSync, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$._FileReaderSync, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.FileReaderSync, html$._FileReaderSync);
  html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._FileWriterSync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._FileWriterSync, [])})
  });
  dart.registerExtension(dart.global.FileWriterSync, html$._FileWriterSync);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Gamepad), html$.ImmutableListMixin$(html$.Gamepad)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
  dart.setSignature(html$._GamepadList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._GamepadList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Gamepad, []),
      [dartx.last]: dart.definiteFunctionType(html$.Gamepad, []),
      [dartx.single]: dart.definiteFunctionType(html$.Gamepad, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Gamepad]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Gamepad, [core.int])
    })
  });
  dart.registerExtension(dart.global.GamepadList, html$._GamepadList);
  html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$._HTMLAllCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$._HTMLAllCollection, [])}),
    methods: () => ({[_item]: dart.definiteFunctionType(html$.Element, [core.int])})
  });
  dart.registerExtension(dart.global.HTMLAllCollection, html$._HTMLAllCollection);
  html$._HTMLAppletElement = class _HTMLAppletElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLAppletElement, 'created');
  dart.setSignature(html$._HTMLAppletElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLAppletElement, []),
      created: dart.definiteFunctionType(html$._HTMLAppletElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLAppletElement, html$._HTMLAppletElement);
  html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLDirectoryElement, 'created');
  dart.setSignature(html$._HTMLDirectoryElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLDirectoryElement, []),
      created: dart.definiteFunctionType(html$._HTMLDirectoryElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDirectoryElement, html$._HTMLDirectoryElement);
  html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLFontElement, 'created');
  dart.setSignature(html$._HTMLFontElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLFontElement, []),
      created: dart.definiteFunctionType(html$._HTMLFontElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFontElement, html$._HTMLFontElement);
  html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLFrameElement, 'created');
  dart.setSignature(html$._HTMLFrameElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLFrameElement, []),
      created: dart.definiteFunctionType(html$._HTMLFrameElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFrameElement, html$._HTMLFrameElement);
  html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLFrameSetElement, 'created');
  html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
  dart.setSignature(html$._HTMLFrameSetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLFrameSetElement, []),
      created: dart.definiteFunctionType(html$._HTMLFrameSetElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFrameSetElement, html$._HTMLFrameSetElement);
  html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLMarqueeElement, 'created');
  dart.setSignature(html$._HTMLMarqueeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLMarqueeElement, []),
      created: dart.definiteFunctionType(html$._HTMLMarqueeElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLMarqueeElement, html$._HTMLMarqueeElement);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'getNamedItem',
    'getNamedItemNS',
    'item',
    'removeNamedItem',
    'removeNamedItemNS',
    'setNamedItem',
    'setNamedItemNS'
  ]);
  html$._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.getNamedItem](...args) {
      return this.getNamedItem.apply(this, args);
    }
    [dartx.getNamedItemNS](...args) {
      return this.getNamedItemNS.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.removeNamedItem](...args) {
      return this.removeNamedItem.apply(this, args);
    }
    [dartx.removeNamedItemNS](...args) {
      return this.removeNamedItemNS.apply(this, args);
    }
    [dartx.setNamedItem](...args) {
      return this.setNamedItem.apply(this, args);
    }
    [dartx.setNamedItemNS](...args) {
      return this.setNamedItemNS.apply(this, args);
    }
  };
  html$._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
  dart.setSignature(html$._NamedNodeMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$._NamedNodeMap, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Node, []),
      [dartx.last]: dart.definiteFunctionType(html$.Node, []),
      [dartx.single]: dart.definiteFunctionType(html$.Node, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx.getNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
      [dartx.getNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
      [dartx.item]: dart.definiteFunctionType(html$._Attr, [core.int]),
      [dartx.removeNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
      [dartx.removeNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
      [dartx.setNamedItem]: dart.definiteFunctionType(html$._Attr, [html$._Attr]),
      [dartx.setNamedItemNS]: dart.definiteFunctionType(html$._Attr, [html$._Attr])
    })
  });
  dart.registerExtension(dart.global.NamedNodeMap, html$._NamedNodeMap);
  dart.registerExtension(dart.global.MozNamedAttrMap, html$._NamedNodeMap);
  html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._PagePopupController, {
    constructors: () => ({_: dart.definiteFunctionType(html$._PagePopupController, [])})
  });
  dart.registerExtension(dart.global.PagePopupController, html$._PagePopupController);
  dart.defineExtensionNames([
    'clone',
    'context',
    'credentials',
    'headers',
    'mode',
    'referrer',
    'url'
  ]);
  html$._Request = class _Request extends html$.Body {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(input, requestInitDict) {
      if (requestInitDict === void 0) requestInitDict = null;
      if (requestInitDict != null) {
        let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
        return html$._Request._create_1(input, requestInitDict_1);
      }
      return html$._Request._create_2(input);
    }
    static _create_1(input, requestInitDict) {
      return new Request(input, requestInitDict);
    }
    static _create_2(input) {
      return new Request(input);
    }
    get [dartx.context]() {
      return this.context;
    }
    get [dartx.credentials]() {
      return this.credentials;
    }
    get [dartx.headers]() {
      return this.headers;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    get [dartx.referrer]() {
      return this.referrer;
    }
    get [dartx.url]() {
      return this.url;
    }
    [dartx.clone](...args) {
      return this.clone.apply(this, args);
    }
  };
  dart.setSignature(html$._Request, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._Request, []),
      new: dart.definiteFunctionType(html$._Request, [core.Object], [core.Map])
    }),
    fields: () => ({
      [dartx.context]: core.String,
      [dartx.credentials]: core.String,
      [dartx.headers]: html$.Headers,
      [dartx.mode]: core.String,
      [dartx.referrer]: core.String,
      [dartx.url]: core.String
    }),
    methods: () => ({[dartx.clone]: dart.definiteFunctionType(html$._Request, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._Request, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._Request, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.Request, html$._Request);
  html$._Response = class _Response extends html$.Body {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(body, responseInitDict) {
      if (body === void 0) body = null;
      if (responseInitDict === void 0) responseInitDict = null;
      if (responseInitDict != null) {
        let responseInitDict_1 = html_common.convertDartToNative_Dictionary(responseInitDict);
        return html$._Response._create_1(body, responseInitDict_1);
      }
      if (body != null) {
        return html$._Response._create_2(body);
      }
      return html$._Response._create_3();
    }
    static _create_1(body, responseInitDict) {
      return new Response(body, responseInitDict);
    }
    static _create_2(body) {
      return new Response(body);
    }
    static _create_3() {
      return new Response();
    }
  };
  dart.setSignature(html$._Response, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._Response, []),
      new: dart.definiteFunctionType(html$._Response, [], [core.Object, core.Map])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._Response, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._Response, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$._Response, [])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.Response, html$._Response);
  html$._ServiceWorker = class _ServiceWorker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$._ServiceWorker, {
    constructors: () => ({_: dart.definiteFunctionType(html$._ServiceWorker, [])})
  });
  dart.registerExtension(dart.global.ServiceWorker, html$._ServiceWorker);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechRecognitionResult), html$.ImmutableListMixin$(html$.SpeechRecognitionResult)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
  dart.setSignature(html$._SpeechRecognitionResultList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._SpeechRecognitionResultList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.SpeechRecognitionResult, []),
      [dartx.last]: dart.definiteFunctionType(html$.SpeechRecognitionResult, []),
      [dartx.single]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechRecognitionResult]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int])
    })
  });
  dart.registerExtension(dart.global.SpeechRecognitionResultList, html$._SpeechRecognitionResultList);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.StyleSheet), html$.ImmutableListMixin$(html$.StyleSheet)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
  dart.setSignature(html$._StyleSheetList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._StyleSheetList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.StyleSheet, []),
      [dartx.last]: dart.definiteFunctionType(html$.StyleSheet, []),
      [dartx.single]: dart.definiteFunctionType(html$.StyleSheet, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.StyleSheet]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
      [__getter__]: dart.definiteFunctionType(html$.CssStyleSheet, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.StyleSheet, [core.int])
    })
  });
  dart.registerExtension(dart.global.StyleSheetList, html$._StyleSheetList);
  html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._SubtleCrypto, {
    constructors: () => ({_: dart.definiteFunctionType(html$._SubtleCrypto, [])})
  });
  dart.registerExtension(dart.global.SubtleCrypto, html$._SubtleCrypto);
  html$._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(cssValue) {
      if (cssValue === void 0) cssValue = null;
      if (cssValue != null) {
        return html$._WebKitCSSMatrix._create_1(cssValue);
      }
      return html$._WebKitCSSMatrix._create_2();
    }
    static _create_1(cssValue) {
      return new WebKitCSSMatrix(cssValue);
    }
    static _create_2() {
      return new WebKitCSSMatrix();
    }
  };
  dart.setSignature(html$._WebKitCSSMatrix, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._WebKitCSSMatrix, []),
      new: dart.definiteFunctionType(html$._WebKitCSSMatrix, [], [core.String])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._WebKitCSSMatrix, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._WebKitCSSMatrix, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.WebKitCSSMatrix, html$._WebKitCSSMatrix);
  html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._WindowTimers, {
    constructors: () => ({_: dart.definiteFunctionType(html$._WindowTimers, [])})
  });
  html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
  dart.setSignature(html$._WorkerLocation, {
    constructors: () => ({_: dart.definiteFunctionType(html$._WorkerLocation, [])})
  });
  dart.registerExtension(dart.global.WorkerLocation, html$._WorkerLocation);
  html$._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorCpu, html$.NavigatorOnLine, html$.NavigatorID];
  dart.setSignature(html$._WorkerNavigator, {
    constructors: () => ({_: dart.definiteFunctionType(html$._WorkerNavigator, [])})
  });
  dart.registerExtension(dart.global.WorkerNavigator, html$._WorkerNavigator);
  html$._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html$.ProgressEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._XMLHttpRequestProgressEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$._XMLHttpRequestProgressEvent, [])})
  });
  dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html$._XMLHttpRequestProgressEvent);
  const _matches = Symbol('_matches');
  html$._AttributeMap = class _AttributeMap extends core.Object {
    new(element) {
      this[_element$] = element;
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((k, v) => {
        this._set(k, v);
      }, StringAndStringTovoid$()));
    }
    containsValue(value) {
      for (let v of this.values) {
        if (dart.equals(value, v)) {
          return true;
        }
      }
      return false;
    }
    putIfAbsent(key, ifAbsent) {
      if (!dart.test(this[dartx.containsKey](key))) {
        this._set(key, ifAbsent());
      }
      return this._get(key);
    }
    clear() {
      for (let key of this.keys) {
        this[dartx.remove](key);
      }
    }
    forEach(f) {
      for (let key of this.keys) {
        let value = this._get(key);
        f(key, value);
      }
    }
    get keys() {
      let attributes = this[_element$][_attributes$];
      let keys = JSArrayOfString().of([]);
      for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
        let attr = html$._Attr._check(attributes[dartx._get](i));
        if (dart.test(this[_matches](attr))) {
          keys[dartx.add](attr[dartx.name]);
        }
      }
      return keys;
    }
    get values() {
      let attributes = this[_element$][_attributes$];
      let values = JSArrayOfString().of([]);
      for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
        let attr = html$._Attr._check(attributes[dartx._get](i));
        if (dart.test(this[_matches](attr))) {
          values[dartx.add](attr[dartx.value]);
        }
      }
      return values;
    }
    get isEmpty() {
      return this[dartx.length] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
  };
  html$._AttributeMap[dart.implements] = () => [MapOfString$String()];
  dart.setSignature(html$._AttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._AttributeMap, [html$.Element])}),
    fields: () => ({[_element$]: html$.Element}),
    getters: () => ({
      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
      values: dart.definiteFunctionType(core.Iterable$(core.String), []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()])
    })
  });
  dart.defineExtensionMembers(html$._AttributeMap, [
    'addAll',
    'containsValue',
    'putIfAbsent',
    'clear',
    'forEach',
    'keys',
    'values',
    'isEmpty',
    'isNotEmpty'
  ]);
  html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
    new(element) {
      super.new(element);
    }
    containsKey(key) {
      return this[_element$][_hasAttribute](core.String._check(key));
    }
    _get(key) {
      return this[_element$][dartx.getAttribute](core.String._check(key));
    }
    _set(key, value) {
      this[_element$][dartx.setAttribute](key, value);
      return value;
    }
    remove(key) {
      let value = this[_element$][dartx.getAttribute](core.String._check(key));
      this[_element$][_removeAttribute](core.String._check(key));
      return value;
    }
    get length() {
      return this.keys[dartx.length];
    }
    [_matches](node) {
      return node[_namespaceUri] == null;
    }
  };
  dart.setSignature(html$._ElementAttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ElementAttributeMap, [html$.Element])}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(core.String, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      remove: dart.definiteFunctionType(core.String, [core.Object]),
      [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
    })
  });
  dart.defineExtensionMembers(html$._ElementAttributeMap, [
    'containsKey',
    '_get',
    '_set',
    'remove',
    'length'
  ]);
  const _namespace = Symbol('_namespace');
  html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
    new(element, namespace) {
      this[_namespace] = namespace;
      super.new(element);
    }
    containsKey(key) {
      return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
    }
    _get(key) {
      return this[_element$][dartx.getAttributeNS](this[_namespace], core.String._check(key));
    }
    _set(key, value) {
      this[_element$][dartx.setAttributeNS](this[_namespace], key, value);
      return value;
    }
    remove(key) {
      let value = this._get(key);
      this[_element$][_removeAttributeNS](this[_namespace], core.String._check(key));
      return value;
    }
    get length() {
      return this.keys[dartx.length];
    }
    [_matches](node) {
      return node[_namespaceUri] == this[_namespace];
    }
  };
  dart.setSignature(html$._NamespacedAttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._NamespacedAttributeMap, [html$.Element, core.String])}),
    fields: () => ({[_namespace]: core.String}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(core.String, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      remove: dart.definiteFunctionType(core.String, [core.Object]),
      [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
    })
  });
  dart.defineExtensionMembers(html$._NamespacedAttributeMap, [
    'containsKey',
    '_get',
    '_set',
    'remove',
    'length'
  ]);
  const _attr = Symbol('_attr');
  const _strip = Symbol('_strip');
  const _toHyphenedName = Symbol('_toHyphenedName');
  const _toCamelCase = Symbol('_toCamelCase');
  html$._DataAttributeMap = class _DataAttributeMap extends core.Object {
    new(attributes) {
      this[_attributes$] = attributes;
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((k, v) => {
        this._set(k, v);
      }, StringAndStringTovoid$()));
    }
    containsValue(value) {
      return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
    }
    containsKey(key) {
      return this[_attributes$][dartx.containsKey](this[_attr](core.String._check(key)));
    }
    _get(key) {
      return this[_attributes$][dartx._get](this[_attr](core.String._check(key)));
    }
    _set(key, value) {
      this[_attributes$][dartx._set](this[_attr](key), value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      return this[_attributes$][dartx.putIfAbsent](this[_attr](key), ifAbsent);
    }
    remove(key) {
      return this[_attributes$][dartx.remove](this[_attr](core.String._check(key)));
    }
    clear() {
      for (let key of this.keys) {
        this.remove(key);
      }
    }
    forEach(f) {
      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
        if (dart.test(this[_matches](key))) {
          f(this[_strip](key), value);
        }
      }, StringAndStringTovoid$()));
    }
    get keys() {
      let keys = JSArrayOfString().of([]);
      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
        if (dart.test(this[_matches](key))) {
          keys[dartx.add](this[_strip](key));
        }
      }, StringAndStringTovoid$()));
      return keys;
    }
    get values() {
      let values = JSArrayOfString().of([]);
      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
        if (dart.test(this[_matches](key))) {
          values[dartx.add](value);
        }
      }, StringAndStringTovoid$()));
      return values;
    }
    get length() {
      return this.keys[dartx.length];
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    [_attr](key) {
      return dart.str`data-${this[_toHyphenedName](key)}`;
    }
    [_matches](key) {
      return key[dartx.startsWith]('data-');
    }
    [_strip](key) {
      return this[_toCamelCase](key[dartx.substring](5));
    }
    [_toCamelCase](hyphenedName, opts) {
      let startUppercase = opts && 'startUppercase' in opts ? opts.startUppercase : false;
      let segments = hyphenedName[dartx.split]('-');
      let start = dart.test(startUppercase) ? 0 : 1;
      for (let i = start; i < dart.notNull(segments[dartx.length]); i++) {
        let segment = segments[dartx._get](i);
        if (dart.notNull(segment[dartx.length]) > 0) {
          segments[dartx._set](i, dart.str`${segment[dartx._get](0)[dartx.toUpperCase]()}${segment[dartx.substring](1)}`);
        }
      }
      return segments[dartx.join]('');
    }
    [_toHyphenedName](word) {
      let sb = new core.StringBuffer();
      for (let i = 0; i < dart.notNull(word[dartx.length]); i++) {
        let lower = word[dartx._get](i)[dartx.toLowerCase]();
        if (word[dartx._get](i) != lower && i > 0) sb.write('-');
        sb.write(lower);
      }
      return sb.toString();
    }
  };
  html$._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
  dart.setSignature(html$._DataAttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._DataAttributeMap, [MapOfString$String()])}),
    fields: () => ({[_attributes$]: MapOfString$String()}),
    getters: () => ({
      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
      values: dart.definiteFunctionType(core.Iterable$(core.String), []),
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(core.String, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
      remove: dart.definiteFunctionType(core.String, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
      [_attr]: dart.definiteFunctionType(core.String, [core.String]),
      [_matches]: dart.definiteFunctionType(core.bool, [core.String]),
      [_strip]: dart.definiteFunctionType(core.String, [core.String]),
      [_toCamelCase]: dart.definiteFunctionType(core.String, [core.String], {startUppercase: core.bool}),
      [_toHyphenedName]: dart.definiteFunctionType(core.String, [core.String])
    })
  });
  dart.defineExtensionMembers(html$._DataAttributeMap, [
    'addAll',
    'containsValue',
    'containsKey',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
  html$.WindowBase = class WindowBase extends core.Object {};
  html$.WindowBase[dart.implements] = () => [html$.EventTarget];
  html$.LocationBase = class LocationBase extends core.Object {};
  html$.HistoryBase = class HistoryBase extends core.Object {};
  html$.CssClassSet = class CssClassSet extends core.Object {};
  html$.CssClassSet[dart.implements] = () => [SetOfString()];
  const _addOrSubtractToBoxModel = Symbol('_addOrSubtractToBoxModel');
  html$.CssRect = class CssRect extends core.Object {
    new(element) {
      this[_element$] = element;
    }
    set height(newHeight) {
      dart.throw(new core.UnsupportedError("Can only set height for content rect."));
    }
    set width(newWidth) {
      dart.throw(new core.UnsupportedError("Can only set width for content rect."));
    }
    [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
      let styles = this[_element$][dartx.getComputedStyle]();
      let val = 0;
      for (let measurement of dimensions) {
        if (augmentingMeasurement == html$._MARGIN) {
          val = dart.notNull(val) + dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
        }
        if (augmentingMeasurement == html$._CONTENT) {
          val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html$._PADDING}-${measurement}`)).value);
        }
        if (augmentingMeasurement != html$._MARGIN) {
          val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
        }
      }
      return val;
    }
    get right() {
      return dart.notNull(this.left) + dart.notNull(this.width);
    }
    get bottom() {
      return dart.notNull(this.top) + dart.notNull(this.height);
    }
    toString() {
      return dart.str`Rectangle (${this.left}, ${this.top}) ${this.width} x ${this.height}`;
    }
    ['=='](other) {
      if (!RectangleOfnum().is(other)) return false;
      return dart.equals(this.left, dart.dload(other, 'left')) && dart.equals(this.top, dart.dload(other, 'top')) && dart.equals(this.right, dart.dload(other, 'right')) && dart.equals(this.bottom, dart.dload(other, 'bottom'));
    }
    get hashCode() {
      return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
    }
    intersection(other) {
      let x0 = math.max(core.num)(this.left, other[dartx.left]);
      let x1 = math.min(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(core.num)(this.top, other[dartx.top]);
        let y1 = math.min(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    intersects(other) {
      return dart.notNull(this.left) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(this.top) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this.top) + dart.notNull(this.height);
    }
    boundingBox(other) {
      let right = math.max(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(core.num)(this.left, other[dartx.left]);
      let top = math.min(core.num)(this.top, other[dartx.top]);
      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    containsRectangle(another) {
      return dart.notNull(this.left) <= dart.notNull(another[dartx.left]) && dart.notNull(this.left) + dart.notNull(this.width) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this.top) <= dart.notNull(another[dartx.top]) && dart.notNull(this.top) + dart.notNull(this.height) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    containsPoint(another) {
      return dart.notNull(another.x) >= dart.notNull(this.left) && dart.notNull(another.x) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(another.y) >= dart.notNull(this.top) && dart.notNull(another.y) <= dart.notNull(this.top) + dart.notNull(this.height);
    }
    get topLeft() {
      return new (PointOfnum())(this.left, this.top);
    }
    get topRight() {
      return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), this.top);
    }
    get bottomRight() {
      return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(this.top) + dart.notNull(this.height));
    }
    get bottomLeft() {
      return new (PointOfnum())(this.left, dart.notNull(this.top) + dart.notNull(this.height));
    }
  };
  html$.CssRect[dart.implements] = () => [RectangleOfnum()];
  dart.setSignature(html$.CssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$.CssRect, [html$.Element])}),
    fields: () => ({[_element$]: html$.Element}),
    getters: () => ({
      right: dart.definiteFunctionType(core.num, []),
      bottom: dart.definiteFunctionType(core.num, []),
      topLeft: dart.definiteFunctionType(math.Point$(core.num), []),
      topRight: dart.definiteFunctionType(math.Point$(core.num), []),
      bottomRight: dart.definiteFunctionType(math.Point$(core.num), []),
      bottomLeft: dart.definiteFunctionType(math.Point$(core.num), [])
    }),
    setters: () => ({
      height: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      width: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    methods: () => ({
      [_addOrSubtractToBoxModel]: dart.definiteFunctionType(core.num, [ListOfString(), core.String]),
      intersection: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      boundingBox: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
    })
  });
  dart.defineExtensionMembers(html$.CssRect, [
    'toString',
    '==',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'right',
    'bottom',
    'hashCode',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft'
  ]);
  html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
    new(element) {
      super.new(element);
    }
    get height() {
      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
    }
    get width() {
      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
    }
    set height(newHeight) {
      if (html$.Dimension.is(newHeight)) {
        if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html$.Dimension.px(0);
        this[_element$][dartx.style][dartx.height] = dart.toString(newHeight);
      } else if (typeof newHeight == 'number') {
        if (dart.test(dart.dsend(newHeight, '<', 0))) newHeight = 0;
        this[_element$][dartx.style][dartx.height] = dart.str`${newHeight}px`;
      } else {
        dart.throw(new core.ArgumentError("newHeight is not a Dimension or num"));
      }
    }
    set width(newWidth) {
      if (html$.Dimension.is(newWidth)) {
        if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html$.Dimension.px(0);
        this[_element$][dartx.style][dartx.width] = dart.toString(newWidth);
      } else if (typeof newWidth == 'number') {
        if (dart.test(dart.dsend(newWidth, '<', 0))) newWidth = 0;
        this[_element$][dartx.style][dartx.width] = dart.str`${newWidth}px`;
      } else {
        dart.throw(new core.ArgumentError("newWidth is not a Dimension or num"));
      }
    }
    get left() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._CONTENT));
    }
    get top() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._CONTENT));
    }
  };
  dart.setSignature(html$._ContentCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssRect, [html$.Element])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
  const _elementList = Symbol('_elementList');
  html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
    new(elementList) {
      this[_elementList] = null;
      super.new(elementList[dartx.first]);
      this[_elementList] = elementList;
    }
    set height(newHeight) {
      this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid$()));
    }
    get height() {
      return super.height;
    }
    set width(newWidth) {
      this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid$()));
    }
    get width() {
      return super.width;
    }
  };
  dart.setSignature(html$._ContentCssListRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssListRect, [ListOfElement()])}),
    fields: () => ({[_elementList]: ListOfElement()})
  });
  html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
    new(element) {
      super.new(html$.Element._check(element));
    }
    get height() {
      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
    }
    set height(value) {
      super.height = value;
    }
    get width() {
      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
    }
    set width(value) {
      super.width = value;
    }
    get left() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._PADDING));
    }
    get top() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._PADDING));
    }
  };
  dart.setSignature(html$._PaddingCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._PaddingCssRect, [dart.dynamic])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
  html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
    new(element) {
      super.new(html$.Element._check(element));
    }
    get height() {
      return this[_element$][dartx.offsetHeight];
    }
    set height(value) {
      super.height = value;
    }
    get width() {
      return this[_element$][dartx.offsetWidth];
    }
    set width(value) {
      super.width = value;
    }
    get left() {
      return this[_element$][dartx.getBoundingClientRect]()[dartx.left];
    }
    get top() {
      return this[_element$][dartx.getBoundingClientRect]()[dartx.top];
    }
  };
  dart.setSignature(html$._BorderCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._BorderCssRect, [dart.dynamic])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
  html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
    new(element) {
      super.new(html$.Element._check(element));
    }
    get height() {
      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
    }
    set height(value) {
      super.height = value;
    }
    get width() {
      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
    }
    set width(value) {
      super.width = value;
    }
    get left() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._MARGIN));
    }
    get top() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._MARGIN));
    }
  };
  dart.setSignature(html$._MarginCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._MarginCssRect, [dart.dynamic])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
  dart.defineLazy(html$, {
    get _HEIGHT() {
      return JSArrayOfString().of(['top', 'bottom']);
    }
  });
  dart.defineLazy(html$, {
    get _WIDTH() {
      return JSArrayOfString().of(['right', 'left']);
    }
  });
  html$._CONTENT = 'content';
  html$._PADDING = 'padding';
  html$._MARGIN = 'margin';
  const _sets = Symbol('_sets');
  const _validateToken = Symbol('_validateToken');
  html_common.CssClassSetImpl = class CssClassSetImpl extends core.Object {
    [_validateToken](value) {
      if (dart.test(html_common.CssClassSetImpl._validTokenRE.hasMatch(value))) return value;
      dart.throw(new core.ArgumentError.value(value, 'value', 'Not a valid class token'));
    }
    toString() {
      return this.readClasses().join(' ');
    }
    toggle(value, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      this[_validateToken](value);
      let s = this.readClasses();
      let result = false;
      if (shouldAdd == null) shouldAdd = !dart.test(s.contains(value));
      if (dart.test(shouldAdd)) {
        s.add(value);
        result = true;
      } else {
        s.remove(value);
      }
      this.writeClasses(s);
      return result;
    }
    get frozen() {
      return false;
    }
    get iterator() {
      return this.readClasses().iterator;
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
    forEach(f) {
      this.readClasses().forEach(f);
    }
    join(separator) {
      if (separator === void 0) separator = "";
      return this.readClasses().join(separator);
    }
    map(T) {
      return f => {
        return this.readClasses().map(T)(f);
      };
    }
    where(f) {
      return this.readClasses().where(f);
    }
    expand(T) {
      return f => {
        return this.readClasses().expand(T)(f);
      };
    }
    every(f) {
      return this.readClasses().every(f);
    }
    any(f) {
      return this.readClasses().any(f);
    }
    get isEmpty() {
      return this.readClasses().isEmpty;
    }
    get isNotEmpty() {
      return this.readClasses().isNotEmpty;
    }
    get length() {
      return this.readClasses().length;
    }
    reduce(combine) {
      return this.readClasses().reduce(combine);
    }
    fold(T) {
      return (initialValue, combine) => {
        return this.readClasses().fold(T)(initialValue, combine);
      };
    }
    contains(value) {
      if (!(typeof value == 'string')) return false;
      this[_validateToken](core.String._check(value));
      return this.readClasses().contains(value);
    }
    lookup(value) {
      return core.String._check(dart.test(this.contains(value)) ? value : null);
    }
    add(value) {
      this[_validateToken](value);
      return core.bool._check(this.modify(dart.fn(s => s.add(value), SetOfStringTobool())));
    }
    remove(value) {
      this[_validateToken](core.String._check(value));
      if (!(typeof value == 'string')) return false;
      let s = this.readClasses();
      let result = s.remove(value);
      this.writeClasses(s);
      return result;
    }
    addAll(iterable) {
      this.modify(dart.fn(s => s.addAll(iterable[dartx.map](core.String)(dart.bind(this, _validateToken))), SetOfStringTovoid()));
    }
    removeAll(iterable) {
      this.modify(dart.fn(s => s.removeAll(iterable), SetOfStringTovoid()));
    }
    toggleAll(iterable, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool$()));
    }
    retainAll(iterable) {
      this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
    }
    removeWhere(test) {
      this.modify(dart.fn(s => s.removeWhere(test), SetOfStringTovoid()));
    }
    retainWhere(test) {
      this.modify(dart.fn(s => s.retainWhere(test), SetOfStringTovoid()));
    }
    containsAll(collection) {
      return this.readClasses().containsAll(collection);
    }
    intersection(other) {
      return this.readClasses().intersection(other);
    }
    union(other) {
      return this.readClasses().union(other);
    }
    difference(other) {
      return this.readClasses().difference(other);
    }
    get first() {
      return this.readClasses().first;
    }
    get last() {
      return this.readClasses().last;
    }
    get single() {
      return this.readClasses().single;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return this.readClasses().toList({growable: growable});
    }
    toSet() {
      return this.readClasses().toSet();
    }
    take(n) {
      return this.readClasses().take(n);
    }
    takeWhile(test) {
      return this.readClasses().takeWhile(test);
    }
    skip(n) {
      return this.readClasses().skip(n);
    }
    skipWhile(test) {
      return this.readClasses().skipWhile(test);
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      return this.readClasses().firstWhere(test, {orElse: orElse});
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      return this.readClasses().lastWhere(test, {orElse: orElse});
    }
    singleWhere(test) {
      return this.readClasses().singleWhere(test);
    }
    elementAt(index) {
      return this.readClasses().elementAt(index);
    }
    clear() {
      this.modify(dart.fn(s => s.clear(), SetOfStringTovoid()));
    }
    modify(f) {
      let s = this.readClasses();
      let ret = f(s);
      this.writeClasses(s);
      return ret;
    }
  };
  html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
  dart.setSignature(html_common.CssClassSetImpl, {
    getters: () => ({
      frozen: dart.definiteFunctionType(core.bool, []),
      iterator: dart.definiteFunctionType(core.Iterator$(core.String), []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      length: dart.definiteFunctionType(core.int, []),
      first: dart.definiteFunctionType(core.String, []),
      last: dart.definiteFunctionType(core.String, []),
      single: dart.definiteFunctionType(core.String, [])
    }),
    methods: () => ({
      [_validateToken]: dart.definiteFunctionType(core.String, [core.String]),
      toggle: dart.definiteFunctionType(core.bool, [core.String], [core.bool]),
      forEach: dart.definiteFunctionType(dart.void, [StringTovoid()]),
      join: dart.definiteFunctionType(core.String, [], [core.String]),
      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [core.String])]]),
      where: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [core.String])]]),
      every: dart.definiteFunctionType(core.bool, [StringTobool()]),
      any: dart.definiteFunctionType(core.bool, [StringTobool()]),
      reduce: dart.definiteFunctionType(core.String, [StringAndStringToString()]),
      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, core.String])]]),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      lookup: dart.definiteFunctionType(core.String, [core.Object]),
      add: dart.definiteFunctionType(core.bool, [core.String]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfString()]),
      removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
      toggleAll: dart.definiteFunctionType(dart.void, [IterableOfString()], [core.bool]),
      retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
      removeWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
      containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
      intersection: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
      union: dart.definiteFunctionType(core.Set$(core.String), [SetOfString()]),
      difference: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
      toList: dart.definiteFunctionType(core.List$(core.String), [], {growable: core.bool}),
      toSet: dart.definiteFunctionType(core.Set$(core.String), []),
      take: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
      takeWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
      skip: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
      skipWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
      firstWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
      lastWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
      singleWhere: dart.definiteFunctionType(core.String, [StringTobool()]),
      elementAt: dart.definiteFunctionType(core.String, [core.int]),
      clear: dart.definiteFunctionType(dart.void, []),
      modify: dart.definiteFunctionType(dart.dynamic, [SetOfStringTodynamic()])
    }),
    sfields: () => ({_validTokenRE: core.RegExp})
  });
  dart.defineExtensionMembers(html_common.CssClassSetImpl, [
    'toString',
    'forEach',
    'join',
    'map',
    'where',
    'expand',
    'every',
    'any',
    'reduce',
    'fold',
    'contains',
    'toList',
    'toSet',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'iterator',
    'isEmpty',
    'isNotEmpty',
    'length',
    'first',
    'last',
    'single'
  ]);
  dart.defineLazy(html_common.CssClassSetImpl, {
    get _validTokenRE() {
      return core.RegExp.new('^\\S+$');
    }
  });
  html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
    static new(elements) {
      return new html$._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html$.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
    }
    _(elementIterable, sets) {
      this[_elementIterable] = elementIterable;
      this[_sets] = sets;
    }
    readClasses() {
      let s = LinkedHashSetOfString().new();
      this[_sets][dartx.forEach](dart.fn(e => s.addAll(e.readClasses()), CssClassSetImplTovoid()));
      return s;
    }
    writeClasses(s) {
      let classes = s.join(' ');
      for (let e of this[_elementIterable]) {
        e[dartx.className] = classes;
      }
    }
    modify(f) {
      this[_sets][dartx.forEach](dart.fn(e => e.modify(f), CssClassSetImplTovoid()));
    }
    toggle(value, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.toggle(value, shouldAdd)) || dart.test(changed), boolAndCssClassSetImplTobool()));
    }
    remove(value) {
      return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool()));
    }
  };
  dart.defineNamedConstructor(html$._MultiElementCssClassSet, '_');
  dart.setSignature(html$._MultiElementCssClassSet, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement()]),
      _: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
    }),
    fields: () => ({
      [_elementIterable]: IterableOfElement(),
      [_sets]: ListOfCssClassSetImpl()
    }),
    methods: () => ({
      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
      writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
    })
  });
  html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
    new(element) {
      this[_element$] = element;
    }
    readClasses() {
      let s = LinkedHashSetOfString().new();
      let classname = this[_element$][dartx.className];
      for (let name of classname[dartx.split](' ')) {
        let trimmed = name[dartx.trim]();
        if (!dart.test(trimmed[dartx.isEmpty])) {
          s.add(trimmed);
        }
      }
      return s;
    }
    writeClasses(s) {
      this[_element$][dartx.className] = s.join(' ');
    }
    get length() {
      return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return this.length != 0;
    }
    clear() {
      this[_element$][dartx.className] = '';
    }
    contains(value) {
      return html$._ElementCssClassSet._contains(this[_element$], value);
    }
    add(value) {
      return html$._ElementCssClassSet._add(this[_element$], value);
    }
    remove(value) {
      return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
    }
    toggle(value, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
    }
    addAll(iterable) {
      html$._ElementCssClassSet._addAll(this[_element$], iterable);
    }
    removeAll(iterable) {
      html$._ElementCssClassSet._removeAll(this[_element$], IterableOfString()._check(iterable));
    }
    retainAll(iterable) {
      html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[dartx.toSet](), 'contains'), false);
    }
    removeWhere(test) {
      html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
    }
    retainWhere(test) {
      html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
    }
    static _contains(_element, value) {
      return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
    }
    static _add(_element, value) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
      html$._ElementCssClassSet._classListAdd(list, value);
      return added;
    }
    static _remove(_element, value) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
      html$._ElementCssClassSet._classListRemove(list, value);
      return removed;
    }
    static _toggle(_element, value, shouldAdd) {
      return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
    }
    static _toggleDefault(_element, value) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      return html$._ElementCssClassSet._classListToggle1(list, value);
    }
    static _toggleOnOff(_element, value, shouldAdd) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      if (dart.test(shouldAdd)) {
        html$._ElementCssClassSet._classListAdd(list, value);
        return true;
      } else {
        html$._ElementCssClassSet._classListRemove(list, value);
        return false;
      }
    }
    static _addAll(_element, iterable) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      for (let value of iterable) {
        html$._ElementCssClassSet._classListAdd(list, value);
      }
    }
    static _removeAll(_element, iterable) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      for (let value of iterable) {
        html$._ElementCssClassSet._classListRemove(list, value);
      }
    }
    static _removeWhere(_element, test, doRemove) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      let i = 0;
      while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
        let item = list[dartx.item](i);
        if (doRemove == test(item)) {
          html$._ElementCssClassSet._classListRemove(list, item);
        } else {
          ++i;
        }
      }
    }
    static _classListOf(e) {
      return e.classList;
    }
    static _classListLength(list) {
      return list.length;
    }
    static _classListContains(list, value) {
      return list.contains(value);
    }
    static _classListContainsBeforeAddOrRemove(list, value) {
      return list.contains(value);
    }
    static _classListAdd(list, value) {
      list.add(value);
    }
    static _classListRemove(list, value) {
      list.remove(value);
    }
    static _classListToggle1(list, value) {
      return list.toggle(value);
    }
    static _classListToggle2(list, value, shouldAdd) {
      return list.toggle(value, shouldAdd);
    }
  };
  dart.setSignature(html$._ElementCssClassSet, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ElementCssClassSet, [html$.Element])}),
    fields: () => ({[_element$]: html$.Element}),
    methods: () => ({
      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
      writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
    }),
    statics: () => ({
      _contains: dart.definiteFunctionType(core.bool, [html$.Element, core.Object]),
      _add: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
      _remove: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
      _toggle: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
      _toggleDefault: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
      _toggleOnOff: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
      _addAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
      _removeAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
      _removeWhere: dart.definiteFunctionType(dart.void, [html$.Element, StringTobool(), core.bool]),
      _classListOf: dart.definiteFunctionType(html$.DomTokenList, [html$.Element]),
      _classListLength: dart.definiteFunctionType(core.int, [html$.DomTokenList]),
      _classListContains: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
      _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
      _classListAdd: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
      _classListRemove: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
      _classListToggle1: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
      _classListToggle2: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String, core.bool])
    }),
    names: ['_contains', '_add', '_remove', '_toggle', '_toggleDefault', '_toggleOnOff', '_addAll', '_removeAll', '_removeWhere', '_classListOf', '_classListLength', '_classListContains', '_classListContainsBeforeAddOrRemove', '_classListAdd', '_classListRemove', '_classListToggle1', '_classListToggle2']
  });
  dart.defineExtensionMembers(html$._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
  const _unit = Symbol('_unit');
  html$.Dimension = class Dimension extends core.Object {
    percent(value) {
      this[_value$2] = value;
      this[_unit] = '%';
    }
    px(value) {
      this[_value$2] = value;
      this[_unit] = 'px';
    }
    pc(value) {
      this[_value$2] = value;
      this[_unit] = 'pc';
    }
    pt(value) {
      this[_value$2] = value;
      this[_unit] = 'pt';
    }
    inch(value) {
      this[_value$2] = value;
      this[_unit] = 'in';
    }
    cm(value) {
      this[_value$2] = value;
      this[_unit] = 'cm';
    }
    mm(value) {
      this[_value$2] = value;
      this[_unit] = 'mm';
    }
    em(value) {
      this[_value$2] = value;
      this[_unit] = 'em';
    }
    ex(value) {
      this[_value$2] = value;
      this[_unit] = 'ex';
    }
    css(cssValue) {
      this[_value$2] = null;
      this[_unit] = null;
      if (cssValue == '') cssValue = '0px';
      if (dart.test(cssValue[dartx.endsWith]('%'))) {
        this[_unit] = '%';
      } else {
        this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
      }
      if (dart.test(cssValue[dartx.contains]('.'))) {
        this[_value$2] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
      } else {
        this[_value$2] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
      }
    }
    toString() {
      return dart.str`${this[_value$2]}${this[_unit]}`;
    }
    get value() {
      return this[_value$2];
    }
  };
  dart.defineNamedConstructor(html$.Dimension, 'percent');
  dart.defineNamedConstructor(html$.Dimension, 'px');
  dart.defineNamedConstructor(html$.Dimension, 'pc');
  dart.defineNamedConstructor(html$.Dimension, 'pt');
  dart.defineNamedConstructor(html$.Dimension, 'inch');
  dart.defineNamedConstructor(html$.Dimension, 'cm');
  dart.defineNamedConstructor(html$.Dimension, 'mm');
  dart.defineNamedConstructor(html$.Dimension, 'em');
  dart.defineNamedConstructor(html$.Dimension, 'ex');
  dart.defineNamedConstructor(html$.Dimension, 'css');
  dart.setSignature(html$.Dimension, {
    constructors: () => ({
      percent: dart.definiteFunctionType(html$.Dimension, [core.num]),
      px: dart.definiteFunctionType(html$.Dimension, [core.num]),
      pc: dart.definiteFunctionType(html$.Dimension, [core.num]),
      pt: dart.definiteFunctionType(html$.Dimension, [core.num]),
      inch: dart.definiteFunctionType(html$.Dimension, [core.num]),
      cm: dart.definiteFunctionType(html$.Dimension, [core.num]),
      mm: dart.definiteFunctionType(html$.Dimension, [core.num]),
      em: dart.definiteFunctionType(html$.Dimension, [core.num]),
      ex: dart.definiteFunctionType(html$.Dimension, [core.num]),
      css: dart.definiteFunctionType(html$.Dimension, [core.String])
    }),
    fields: () => ({
      [_value$2]: core.num,
      [_unit]: core.String
    }),
    getters: () => ({value: dart.definiteFunctionType(core.num, [])})
  });
  html$.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html$.Event]));
  html$.EventStreamProvider$ = dart.generic(T => {
    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
    let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
    let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
    class EventStreamProvider extends core.Object {
      new(eventType) {
        this[_eventType] = eventType;
      }
      forTarget(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_EventStreamOfT())(e, this[_eventType], useCapture);
      }
      forElement(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementEventStreamImplOfT())(e, this[_eventType], useCapture);
      }
      [_forElementList](e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementListEventStreamImplOfT())(e, this[_eventType], useCapture);
      }
      getEventType(target) {
        return this[_eventType];
      }
    }
    dart.addTypeTests(EventStreamProvider);
    dart.setSignature(EventStreamProvider, {
      constructors: () => ({new: dart.definiteFunctionType(html$.EventStreamProvider$(T), [core.String])}),
      fields: () => ({[_eventType]: core.String}),
      methods: () => ({
        forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
        forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
        [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
        getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
      })
    });
    return EventStreamProvider;
  });
  html$.EventStreamProvider = EventStreamProvider();
  html$.ElementStream$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class ElementStream extends core.Object {}
    dart.addTypeTests(ElementStream);
    ElementStream[dart.implements] = () => [StreamOfT()];
    return ElementStream;
  });
  html$.ElementStream = ElementStream();
  const _target$0 = Symbol('_target');
  const _useCapture = Symbol('_useCapture');
  html$._EventStream$ = dart.generic(T => {
    let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _EventStream extends async.Stream$(T) {
      new(target, eventType, useCapture) {
        this[_target$0] = target;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        super.new();
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this;
      }
      get isBroadcast() {
        return true;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, this[_useCapture]);
      }
    }
    dart.setSignature(_EventStream, {
      constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
      fields: () => ({
        [_target$0]: html$.EventTarget,
        [_eventType]: core.String,
        [_useCapture]: core.bool
      }),
      methods: () => ({
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})
      })
    });
    return _EventStream;
  });
  html$._EventStream = _EventStream();
  html$._matchesWithAncestors = function(event, selector) {
    let target = event[dartx.target];
    return html$.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
  };
  dart.fn(html$._matchesWithAncestors, EventAndStringTobool());
  html$._ElementEventStreamImpl$ = dart.generic(T => {
    let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
    let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
    let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
    class _ElementEventStreamImpl extends html$._EventStream$(T) {
      new(target, eventType, useCapture) {
        super.new(html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
      }
      matches(selector) {
        return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
          e[_selector] = selector;
          return e;
        }, TToT()));
      }
      capture(onData) {
        return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, true);
      }
    }
    _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
    dart.setSignature(_ElementEventStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(html$._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
      methods: () => ({
        matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
        capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
      })
    });
    return _ElementEventStreamImpl;
  });
  html$._ElementEventStreamImpl = _ElementEventStreamImpl();
  const _targetList = Symbol('_targetList');
  html$._ElementListEventStreamImpl$ = dart.generic(T => {
    let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
    let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
    let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
    class _ElementListEventStreamImpl extends async.Stream$(T) {
      new(targetList, eventType, useCapture) {
        this[_targetList] = targetList;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        super.new();
      }
      matches(selector) {
        return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
          e[_selector] = selector;
          return e;
        }, TToT()));
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        let pool = new (_StreamPoolOfT()).broadcast();
        for (let target of this[_targetList]) {
          pool.add(new (_EventStreamOfT())(target, this[_eventType], this[_useCapture]));
        }
        return pool.stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
      capture(onData) {
        let pool = new (_StreamPoolOfT()).broadcast();
        for (let target of this[_targetList]) {
          pool.add(new (_EventStreamOfT())(target, this[_eventType], true));
        }
        return pool.stream.listen(onData);
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this;
      }
      get isBroadcast() {
        return true;
      }
    }
    _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
    dart.setSignature(_ElementListEventStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(html$._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
      fields: () => ({
        [_targetList]: IterableOfElement(),
        [_useCapture]: core.bool,
        [_eventType]: core.String
      }),
      methods: () => ({
        matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()]),
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()})
      })
    });
    return _ElementListEventStreamImpl;
  });
  html$._ElementListEventStreamImpl = _ElementListEventStreamImpl();
  html$._EventListener$ = dart.generic(T => {
    const _EventListener = dart.typedef('_EventListener', () => dart.functionType(dart.dynamic, [T]));
    return _EventListener;
  });
  html$._EventListener = _EventListener();
  const _onData$0 = Symbol('_onData');
  const _pauseCount$0 = Symbol('_pauseCount');
  const _tryResume = Symbol('_tryResume');
  const _canceled = Symbol('_canceled');
  const _unlisten = Symbol('_unlisten');
  html$._EventStreamSubscription$ = dart.generic(T => {
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _EventStreamSubscription extends async.StreamSubscription$(T) {
      new(target, eventType, onData, useCapture) {
        this[_target$0] = target;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        this[_onData$0] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(onData));
        this[_pauseCount$0] = 0;
        this[_tryResume]();
      }
      cancel() {
        if (dart.test(this[_canceled])) return null;
        this[_unlisten]();
        this[_target$0] = null;
        this[_onData$0] = null;
        return null;
      }
      get [_canceled]() {
        return this[_target$0] == null;
      }
      onData(handleData) {
        if (dart.test(this[_canceled])) {
          dart.throw(new core.StateError("Subscription has been canceled."));
        }
        this[_unlisten]();
        this[_onData$0] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
        this[_tryResume]();
      }
      onError(handleError) {}
      onDone(handleDone) {}
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        if (dart.test(this[_canceled])) return;
        this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) + 1;
        this[_unlisten]();
        if (resumeSignal != null) {
          resumeSignal.whenComplete(dart.bind(this, 'resume'));
        }
      }
      get isPaused() {
        return dart.notNull(this[_pauseCount$0]) > 0;
      }
      resume() {
        if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
        this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) - 1;
        this[_tryResume]();
      }
      [_tryResume]() {
        if (this[_onData$0] != null && !dart.test(this.isPaused)) {
          this[_target$0][dartx.addEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
        }
      }
      [_unlisten]() {
        if (this[_onData$0] != null) {
          this[_target$0][dartx.removeEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
        }
      }
      asFuture(futureValue) {
        if (futureValue === void 0) futureValue = null;
        let completer = async.Completer.new();
        return completer.future;
      }
    }
    dart.setSignature(_EventStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(html$._EventStreamSubscription$(T), [html$.EventTarget, core.String, TTovoid(), core.bool])}),
      fields: () => ({
        [_pauseCount$0]: core.int,
        [_target$0]: html$.EventTarget,
        [_eventType]: core.String,
        [_onData$0]: html$.EventListener,
        [_useCapture]: core.bool
      }),
      getters: () => ({
        [_canceled]: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        cancel: dart.definiteFunctionType(async.Future, []),
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        [_tryResume]: dart.definiteFunctionType(dart.void, []),
        [_unlisten]: dart.definiteFunctionType(dart.void, []),
        asFuture: dart.definiteFunctionType(async.Future, [], [dart.dynamic])
      })
    });
    return _EventStreamSubscription;
  });
  html$._EventStreamSubscription = _EventStreamSubscription();
  html$.CustomStream$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class CustomStream extends core.Object {}
    dart.addTypeTests(CustomStream);
    CustomStream[dart.implements] = () => [StreamOfT()];
    return CustomStream;
  });
  html$.CustomStream = CustomStream();
  const _streamController = Symbol('_streamController');
  const _type$ = Symbol('_type');
  html$._CustomEventStreamImpl$ = dart.generic(T => {
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    class _CustomEventStreamImpl extends async.Stream$(T) {
      new(type) {
        this[_streamController] = null;
        this[_type$] = null;
        super.new();
        this[_type$] = type;
        this[_streamController] = StreamControllerOfT().broadcast({sync: true});
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return this[_streamController].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this[_streamController].stream;
      }
      get isBroadcast() {
        return true;
      }
      add(event) {
        T._check(event);
        if (event[dartx.type] == this[_type$]) this[_streamController].add(event);
      }
    }
    _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
    dart.setSignature(_CustomEventStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamImpl$(T), [core.String])}),
      fields: () => ({
        [_streamController]: StreamControllerOfT(),
        [_type$]: core.String
      }),
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        add: dart.definiteFunctionType(dart.void, [T])
      })
    });
    return _CustomEventStreamImpl;
  });
  html$._CustomEventStreamImpl = _CustomEventStreamImpl();
  const _parent$ = Symbol('_parent');
  const _shadowKeyCode = Symbol('_shadowKeyCode');
  const _shadowCharCode = Symbol('_shadowCharCode');
  const _shadowAltKey = Symbol('_shadowAltKey');
  const _realKeyCode = Symbol('_realKeyCode');
  const _realCharCode = Symbol('_realCharCode');
  const _realAltKey = Symbol('_realAltKey');
  const _currentTarget = Symbol('_currentTarget');
  const _shadowKeyIdentifier = Symbol('_shadowKeyIdentifier');
  html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
    get keyCode() {
      return this[_shadowKeyCode];
    }
    get charCode() {
      return this.type == 'keypress' ? this[_shadowCharCode] : 0;
    }
    get altKey() {
      return this[_shadowAltKey];
    }
    get which() {
      return this.keyCode;
    }
    get [_realKeyCode]() {
      return this[_parent$].keyCode;
    }
    get [_realCharCode]() {
      return this[_parent$].charCode;
    }
    get [_realAltKey]() {
      return this[_parent$].altKey;
    }
    static _makeRecord() {
      let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
      return _js_helper.makeLeafDispatchRecord(interceptor);
    }
    wrap(parent) {
      this[_parent$] = null;
      this[_shadowAltKey] = null;
      this[_shadowCharCode] = null;
      this[_shadowKeyCode] = null;
      this[_currentTarget] = null;
      super.new(parent);
      this[_parent$] = parent;
      this[_shadowAltKey] = this[_realAltKey];
      this[_shadowCharCode] = this[_realCharCode];
      this[_shadowKeyCode] = this[_realKeyCode];
      this[_currentTarget] = this[_parent$][dartx.currentTarget];
    }
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let keyCode = opts && 'keyCode' in opts ? opts.keyCode : 0;
      let charCode = opts && 'charCode' in opts ? opts.charCode : 0;
      let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
      if (view == null) {
        view = html$.window;
      }
      let eventObj = null;
      if (dart.test(html$.KeyEvent.canUseDispatchEvent)) {
        eventObj = html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
        eventObj.keyCode = keyCode;
        eventObj.which = keyCode;
        eventObj.charCode = charCode;
        eventObj.keyLocation = keyLocation;
        eventObj.ctrlKey = ctrlKey;
        eventObj.altKey = altKey;
        eventObj.shiftKey = shiftKey;
        eventObj.metaKey = metaKey;
      } else {
        eventObj = html$.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
        Object.defineProperty(eventObj, 'keyCode', {
          get: function() {
            return this.keyCodeVal;
          }
        });
        Object.defineProperty(eventObj, 'which', {
          get: function() {
            return this.keyCodeVal;
          }
        });
        Object.defineProperty(eventObj, 'charCode', {
          get: function() {
            return this.charCodeVal;
          }
        });
        let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
        dart.dsend(eventObj, _initKeyboardEvent, type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
        eventObj.keyCodeVal = keyCode;
        eventObj.charCodeVal = charCode;
      }
      _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
      let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
      if (keyEvent[_currentTarget] == null) {
        keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
      }
      return keyEvent;
    }
    static get canUseDispatchEvent() {
      return typeof document.body.dispatchEvent == "function" && document.body.dispatchEvent.length > 0;
    }
    get currentTarget() {
      return this[_currentTarget];
    }
    static _convertToHexString(charCode, keyCode) {
      if (charCode != -1) {
        let hex = charCode[dartx.toRadixString](16);
        let sb = new core.StringBuffer('U+');
        for (let i = 0; i < 4 - dart.notNull(hex[dartx.length]); i++)
          sb.write('0');
        sb.write(hex);
        return sb.toString();
      } else {
        return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
      }
    }
    get code() {
      return this[_parent$][dartx.code];
    }
    get ctrlKey() {
      return this[_parent$][dartx.ctrlKey];
    }
    get detail() {
      return this[_parent$][dartx.detail];
    }
    get key() {
      return this[_parent$][dartx.key];
    }
    get keyLocation() {
      return this[_parent$][dartx.keyLocation];
    }
    get metaKey() {
      return this[_parent$][dartx.metaKey];
    }
    get shiftKey() {
      return this[_parent$][dartx.shiftKey];
    }
    get sourceDevice() {
      return this[_parent$][dartx.sourceDevice];
    }
    get view() {
      return html$.Window._check(this[_parent$][dartx.view]);
    }
    [_initUIEvent](type, canBubble, cancelable, view, detail) {
      dart.throw(new core.UnsupportedError("Cannot initialize a UI Event from a KeyEvent."));
    }
    get [_shadowKeyIdentifier]() {
      return this[_parent$].keyIdentifier;
    }
    get [_charCode]() {
      return this.charCode;
    }
    get [_keyCode]() {
      return this.keyCode;
    }
    get [_which]() {
      return this.which;
    }
    get [_keyIdentifier]() {
      dart.throw(new core.UnsupportedError("keyIdentifier is unsupported."));
    }
    [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
      dart.throw(new core.UnsupportedError("Cannot initialize a KeyboardEvent from a KeyEvent."));
    }
    getModifierState(keyArgument) {
      return dart.throw(new core.UnimplementedError());
    }
    get location() {
      return dart.throw(new core.UnimplementedError());
    }
    get repeat() {
      return dart.throw(new core.UnimplementedError());
    }
    get [_get_view]() {
      return dart.throw(new core.UnimplementedError());
    }
  };
  dart.defineNamedConstructor(html$.KeyEvent, 'wrap');
  html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
  dart.setSignature(html$.KeyEvent, {
    constructors: () => ({
      wrap: dart.definiteFunctionType(html$.KeyEvent, [html$.KeyboardEvent]),
      new: dart.definiteFunctionType(html$.KeyEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html$.EventTarget})
    }),
    fields: () => ({
      [_parent$]: html$.KeyboardEvent,
      [_shadowAltKey]: core.bool,
      [_shadowCharCode]: core.int,
      [_shadowKeyCode]: core.int,
      [_currentTarget]: html$.EventTarget
    }),
    getters: () => ({
      keyCode: dart.definiteFunctionType(core.int, []),
      charCode: dart.definiteFunctionType(core.int, []),
      altKey: dart.definiteFunctionType(core.bool, []),
      which: dart.definiteFunctionType(core.int, []),
      [_realKeyCode]: dart.definiteFunctionType(core.int, []),
      [_realCharCode]: dart.definiteFunctionType(core.int, []),
      [_realAltKey]: dart.definiteFunctionType(core.bool, []),
      code: dart.definiteFunctionType(core.String, []),
      ctrlKey: dart.definiteFunctionType(core.bool, []),
      detail: dart.definiteFunctionType(core.int, []),
      key: dart.definiteFunctionType(core.String, []),
      keyLocation: dart.definiteFunctionType(core.int, []),
      metaKey: dart.definiteFunctionType(core.bool, []),
      shiftKey: dart.definiteFunctionType(core.bool, []),
      sourceDevice: dart.definiteFunctionType(html$.InputDevice, []),
      view: dart.definiteFunctionType(html$.Window, []),
      [_shadowKeyIdentifier]: dart.definiteFunctionType(core.String, []),
      [_charCode]: dart.definiteFunctionType(core.int, []),
      [_keyCode]: dart.definiteFunctionType(core.int, []),
      [_which]: dart.definiteFunctionType(core.int, []),
      [_keyIdentifier]: dart.definiteFunctionType(core.String, []),
      location: dart.definiteFunctionType(core.int, []),
      repeat: dart.definiteFunctionType(core.bool, []),
      [_get_view]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({
      [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
      [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
      getModifierState: dart.definiteFunctionType(core.bool, [core.String])
    }),
    sfields: () => ({
      _keyboardEventDispatchRecord: dart.dynamic,
      keyDownEvent: EventStreamProviderOfKeyEvent(),
      keyUpEvent: EventStreamProviderOfKeyEvent(),
      keyPressEvent: EventStreamProviderOfKeyEvent()
    }),
    sgetters: () => ({canUseDispatchEvent: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _makeRecord: dart.definiteFunctionType(dart.dynamic, []),
      _convertToHexString: dart.definiteFunctionType(core.String, [core.int, core.int])
    }),
    names: ['_makeRecord', '_convertToHexString']
  });
  dart.defineLazy(html$.KeyEvent, {
    get _keyboardEventDispatchRecord() {
      return html$.KeyEvent._makeRecord();
    },
    get keyDownEvent() {
      return new html$._KeyboardEventHandler('keydown');
    },
    set keyDownEvent(_) {},
    get keyUpEvent() {
      return new html$._KeyboardEventHandler('keyup');
    },
    set keyUpEvent(_) {},
    get keyPressEvent() {
      return new html$._KeyboardEventHandler('keypress');
    },
    set keyPressEvent(_) {}
  });
  html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
    new(type) {
      super.new(type);
    }
    add(event) {
      if (event.type == this[_type$]) {
        event.currentTarget[dartx.dispatchEvent](event[_parent$]);
        this[_streamController].add(event);
      }
    }
  };
  dart.addSimpleTypeTests(html$._CustomKeyEventStreamImpl);
  html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
  dart.setSignature(html$._CustomKeyEventStreamImpl, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CustomKeyEventStreamImpl, [core.String])}),
    methods: () => ({add: dart.definiteFunctionType(dart.void, [html$.KeyEvent])})
  });
  const _subscriptions = Symbol('_subscriptions');
  const _controller$1 = Symbol('_controller');
  html$._StreamPool$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    class _StreamPool extends core.Object {
      broadcast() {
        this[_subscriptions] = MapOfStreamOfT$StreamSubscriptionOfT().new();
        this[_controller$1] = null;
        this[_controller$1] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
      }
      get stream() {
        return this[_controller$1].stream;
      }
      add(stream) {
        StreamOfT()._check(stream);
        if (dart.test(this[_subscriptions][dartx.containsKey](stream))) return;
        this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller$1], 'add'), {onError: dart.bind(this[_controller$1], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid$())}));
      }
      remove(stream) {
        StreamOfT()._check(stream);
        let subscription = this[_subscriptions][dartx.remove](stream);
        if (subscription != null) subscription.cancel();
      }
      close() {
        for (let subscription of this[_subscriptions][dartx.values]) {
          subscription.cancel();
        }
        this[_subscriptions][dartx.clear]();
        this[_controller$1].close();
      }
    }
    dart.addTypeTests(_StreamPool);
    dart.defineNamedConstructor(_StreamPool, 'broadcast');
    dart.setSignature(_StreamPool, {
      constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
      fields: () => ({
        [_controller$1]: StreamControllerOfT(),
        [_subscriptions]: MapOfStreamOfT$StreamSubscriptionOfT()
      }),
      getters: () => ({stream: dart.definiteFunctionType(async.Stream$(T), [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [StreamOfT()]),
        remove: dart.definiteFunctionType(dart.void, [StreamOfT()]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _StreamPool;
  });
  html$._StreamPool = _StreamPool();
  const _eventTypeGetter = Symbol('_eventTypeGetter');
  html$._CustomEventStreamProvider$ = dart.generic(T => {
    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
    let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
    let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
    let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
    class _CustomEventStreamProvider extends core.Object {
      new(eventTypeGetter) {
        this[_eventTypeGetter] = eventTypeGetter;
      }
      forTarget(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_EventStreamOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
      }
      forElement(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementEventStreamImplOfT())(e, dart.dcall(this[_eventTypeGetter], e), useCapture);
      }
      [_forElementList](e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementListEventStreamImplOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
      }
      getEventType(target) {
        return core.String._check(dart.dcall(this[_eventTypeGetter], target));
      }
      get [_eventType]() {
        return dart.throw(new core.UnsupportedError('Access type through getEventType method.'));
      }
    }
    dart.addTypeTests(_CustomEventStreamProvider);
    _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
    dart.setSignature(_CustomEventStreamProvider, {
      constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamProvider$(T), [dart.dynamic])}),
      fields: () => ({[_eventTypeGetter]: dart.dynamic}),
      getters: () => ({[_eventType]: dart.definiteFunctionType(core.String, [])}),
      methods: () => ({
        forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
        forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
        [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
        getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
      })
    });
    return _CustomEventStreamProvider;
  });
  html$._CustomEventStreamProvider = _CustomEventStreamProvider();
  html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
    new(opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
      if (dart.test(html$._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
        for (let attr of html$._Html5NodeValidator._standardAttributes) {
          html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._standardAttributeValidator);
        }
        for (let attr of html$._Html5NodeValidator._uriAttributes) {
          html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._uriAttributeValidator);
        }
      }
    }
    allowsElement(element) {
      return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
    }
    allowsAttribute(element, attributeName, value) {
      let tagName = html$.Element._safeTagName(element);
      let validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
      if (validator == null) {
        validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
      }
      if (validator == null) {
        return false;
      }
      return core.bool._check(dart.dcall(validator, element, attributeName, value, this));
    }
    static _standardAttributeValidator(element, attributeName, value, context) {
      return true;
    }
    static _uriAttributeValidator(element, attributeName, value, context) {
      return context.uriPolicy.allowsUri(value);
    }
  };
  html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._Html5NodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._Html5NodeValidator, [], {uriPolicy: html$.UriPolicy})}),
    fields: () => ({uriPolicy: html$.UriPolicy}),
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    }),
    sfields: () => ({
      _allowedElements: SetOfString(),
      _standardAttributes: ListOfString(),
      _uriAttributes: ListOfString(),
      _attributeValidators: MapOfString$Function()
    }),
    statics: () => ({
      _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator]),
      _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])
    }),
    names: ['_standardAttributeValidator', '_uriAttributeValidator']
  });
  html$._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
  html$._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
  dart.defineLazy(html$._Html5NodeValidator, {
    get _allowedElements() {
      return SetOfString().from(JSArrayOfString().of(['A', 'ABBR', 'ACRONYM', 'ADDRESS', 'AREA', 'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BDI', 'BDO', 'BIG', 'BLOCKQUOTE', 'BR', 'BUTTON', 'CANVAS', 'CAPTION', 'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATA', 'DATALIST', 'DD', 'DEL', 'DETAILS', 'DFN', 'DIR', 'DIV', 'DL', 'DT', 'EM', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HGROUP', 'HR', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS', 'KBD', 'LABEL', 'LEGEND', 'LI', 'MAP', 'MARK', 'MENU', 'METER', 'NAV', 'NOBR', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PRE', 'PROGRESS', 'Q', 'S', 'SAMP', 'SECTION', 'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TIME', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR', 'VIDEO', 'WBR']));
    },
    get _attributeValidators() {
      return dart.map({}, core.String, core.Function);
    }
  });
  html$.KeyCode = class KeyCode extends core.Object {
    static isCharacterKey(keyCode) {
      if (dart.notNull(keyCode) >= html$.KeyCode.ZERO && dart.notNull(keyCode) <= html$.KeyCode.NINE || dart.notNull(keyCode) >= html$.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html$.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html$.KeyCode.A && dart.notNull(keyCode) <= html$.KeyCode.Z) {
        return true;
      }
      if (dart.test(html_common.Device.isWebKit) && keyCode == 0) {
        return true;
      }
      return keyCode == html$.KeyCode.SPACE || keyCode == html$.KeyCode.QUESTION_MARK || keyCode == html$.KeyCode.NUM_PLUS || keyCode == html$.KeyCode.NUM_MINUS || keyCode == html$.KeyCode.NUM_PERIOD || keyCode == html$.KeyCode.NUM_DIVISION || keyCode == html$.KeyCode.SEMICOLON || keyCode == html$.KeyCode.FF_SEMICOLON || keyCode == html$.KeyCode.DASH || keyCode == html$.KeyCode.EQUALS || keyCode == html$.KeyCode.FF_EQUALS || keyCode == html$.KeyCode.COMMA || keyCode == html$.KeyCode.PERIOD || keyCode == html$.KeyCode.SLASH || keyCode == html$.KeyCode.APOSTROPHE || keyCode == html$.KeyCode.SINGLE_QUOTE || keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html$.KeyCode.BACKSLASH || keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET;
    }
    static _convertKeyCodeToKeyName(keyCode) {
      switch (keyCode) {
        case html$.KeyCode.ALT:
        {
          return html$._KeyName.ALT;
        }
        case html$.KeyCode.BACKSPACE:
        {
          return html$._KeyName.BACKSPACE;
        }
        case html$.KeyCode.CAPS_LOCK:
        {
          return html$._KeyName.CAPS_LOCK;
        }
        case html$.KeyCode.CTRL:
        {
          return html$._KeyName.CONTROL;
        }
        case html$.KeyCode.DELETE:
        {
          return html$._KeyName.DEL;
        }
        case html$.KeyCode.DOWN:
        {
          return html$._KeyName.DOWN;
        }
        case html$.KeyCode.END:
        {
          return html$._KeyName.END;
        }
        case html$.KeyCode.ENTER:
        {
          return html$._KeyName.ENTER;
        }
        case html$.KeyCode.ESC:
        {
          return html$._KeyName.ESC;
        }
        case html$.KeyCode.F1:
        {
          return html$._KeyName.F1;
        }
        case html$.KeyCode.F2:
        {
          return html$._KeyName.F2;
        }
        case html$.KeyCode.F3:
        {
          return html$._KeyName.F3;
        }
        case html$.KeyCode.F4:
        {
          return html$._KeyName.F4;
        }
        case html$.KeyCode.F5:
        {
          return html$._KeyName.F5;
        }
        case html$.KeyCode.F6:
        {
          return html$._KeyName.F6;
        }
        case html$.KeyCode.F7:
        {
          return html$._KeyName.F7;
        }
        case html$.KeyCode.F8:
        {
          return html$._KeyName.F8;
        }
        case html$.KeyCode.F9:
        {
          return html$._KeyName.F9;
        }
        case html$.KeyCode.F10:
        {
          return html$._KeyName.F10;
        }
        case html$.KeyCode.F11:
        {
          return html$._KeyName.F11;
        }
        case html$.KeyCode.F12:
        {
          return html$._KeyName.F12;
        }
        case html$.KeyCode.HOME:
        {
          return html$._KeyName.HOME;
        }
        case html$.KeyCode.INSERT:
        {
          return html$._KeyName.INSERT;
        }
        case html$.KeyCode.LEFT:
        {
          return html$._KeyName.LEFT;
        }
        case html$.KeyCode.META:
        {
          return html$._KeyName.META;
        }
        case html$.KeyCode.NUMLOCK:
        {
          return html$._KeyName.NUM_LOCK;
        }
        case html$.KeyCode.PAGE_DOWN:
        {
          return html$._KeyName.PAGE_DOWN;
        }
        case html$.KeyCode.PAGE_UP:
        {
          return html$._KeyName.PAGE_UP;
        }
        case html$.KeyCode.PAUSE:
        {
          return html$._KeyName.PAUSE;
        }
        case html$.KeyCode.PRINT_SCREEN:
        {
          return html$._KeyName.PRINT_SCREEN;
        }
        case html$.KeyCode.RIGHT:
        {
          return html$._KeyName.RIGHT;
        }
        case html$.KeyCode.SCROLL_LOCK:
        {
          return html$._KeyName.SCROLL;
        }
        case html$.KeyCode.SHIFT:
        {
          return html$._KeyName.SHIFT;
        }
        case html$.KeyCode.SPACE:
        {
          return html$._KeyName.SPACEBAR;
        }
        case html$.KeyCode.TAB:
        {
          return html$._KeyName.TAB;
        }
        case html$.KeyCode.UP:
        {
          return html$._KeyName.UP;
        }
        case html$.KeyCode.WIN_IME:
        case html$.KeyCode.WIN_KEY:
        case html$.KeyCode.WIN_KEY_LEFT:
        case html$.KeyCode.WIN_KEY_RIGHT:
        {
          return html$._KeyName.WIN;
        }
        default:
        {
          return html$._KeyName.UNIDENTIFIED;
        }
      }
      return html$._KeyName.UNIDENTIFIED;
    }
  };
  dart.setSignature(html$.KeyCode, {
    sfields: () => ({
      WIN_KEY_FF_LINUX: core.int,
      MAC_ENTER: core.int,
      BACKSPACE: core.int,
      TAB: core.int,
      NUM_CENTER: core.int,
      ENTER: core.int,
      SHIFT: core.int,
      CTRL: core.int,
      ALT: core.int,
      PAUSE: core.int,
      CAPS_LOCK: core.int,
      ESC: core.int,
      SPACE: core.int,
      PAGE_UP: core.int,
      PAGE_DOWN: core.int,
      END: core.int,
      HOME: core.int,
      LEFT: core.int,
      UP: core.int,
      RIGHT: core.int,
      DOWN: core.int,
      NUM_NORTH_EAST: core.int,
      NUM_SOUTH_EAST: core.int,
      NUM_SOUTH_WEST: core.int,
      NUM_NORTH_WEST: core.int,
      NUM_WEST: core.int,
      NUM_NORTH: core.int,
      NUM_EAST: core.int,
      NUM_SOUTH: core.int,
      PRINT_SCREEN: core.int,
      INSERT: core.int,
      NUM_INSERT: core.int,
      DELETE: core.int,
      NUM_DELETE: core.int,
      ZERO: core.int,
      ONE: core.int,
      TWO: core.int,
      THREE: core.int,
      FOUR: core.int,
      FIVE: core.int,
      SIX: core.int,
      SEVEN: core.int,
      EIGHT: core.int,
      NINE: core.int,
      FF_SEMICOLON: core.int,
      FF_EQUALS: core.int,
      QUESTION_MARK: core.int,
      A: core.int,
      B: core.int,
      C: core.int,
      D: core.int,
      E: core.int,
      F: core.int,
      G: core.int,
      H: core.int,
      I: core.int,
      J: core.int,
      K: core.int,
      L: core.int,
      M: core.int,
      N: core.int,
      O: core.int,
      P: core.int,
      Q: core.int,
      R: core.int,
      S: core.int,
      T: core.int,
      U: core.int,
      V: core.int,
      W: core.int,
      X: core.int,
      Y: core.int,
      Z: core.int,
      META: core.int,
      WIN_KEY_LEFT: core.int,
      WIN_KEY_RIGHT: core.int,
      CONTEXT_MENU: core.int,
      NUM_ZERO: core.int,
      NUM_ONE: core.int,
      NUM_TWO: core.int,
      NUM_THREE: core.int,
      NUM_FOUR: core.int,
      NUM_FIVE: core.int,
      NUM_SIX: core.int,
      NUM_SEVEN: core.int,
      NUM_EIGHT: core.int,
      NUM_NINE: core.int,
      NUM_MULTIPLY: core.int,
      NUM_PLUS: core.int,
      NUM_MINUS: core.int,
      NUM_PERIOD: core.int,
      NUM_DIVISION: core.int,
      F1: core.int,
      F2: core.int,
      F3: core.int,
      F4: core.int,
      F5: core.int,
      F6: core.int,
      F7: core.int,
      F8: core.int,
      F9: core.int,
      F10: core.int,
      F11: core.int,
      F12: core.int,
      NUMLOCK: core.int,
      SCROLL_LOCK: core.int,
      FIRST_MEDIA_KEY: core.int,
      LAST_MEDIA_KEY: core.int,
      SEMICOLON: core.int,
      DASH: core.int,
      EQUALS: core.int,
      COMMA: core.int,
      PERIOD: core.int,
      SLASH: core.int,
      APOSTROPHE: core.int,
      TILDE: core.int,
      SINGLE_QUOTE: core.int,
      OPEN_SQUARE_BRACKET: core.int,
      BACKSLASH: core.int,
      CLOSE_SQUARE_BRACKET: core.int,
      WIN_KEY: core.int,
      MAC_FF_META: core.int,
      WIN_IME: core.int,
      UNKNOWN: core.int
    }),
    statics: () => ({
      isCharacterKey: dart.definiteFunctionType(core.bool, [core.int]),
      _convertKeyCodeToKeyName: dart.definiteFunctionType(core.String, [core.int])
    }),
    names: ['isCharacterKey', '_convertKeyCodeToKeyName']
  });
  html$.KeyCode.WIN_KEY_FF_LINUX = 0;
  html$.KeyCode.MAC_ENTER = 3;
  html$.KeyCode.BACKSPACE = 8;
  html$.KeyCode.TAB = 9;
  html$.KeyCode.NUM_CENTER = 12;
  html$.KeyCode.ENTER = 13;
  html$.KeyCode.SHIFT = 16;
  html$.KeyCode.CTRL = 17;
  html$.KeyCode.ALT = 18;
  html$.KeyCode.PAUSE = 19;
  html$.KeyCode.CAPS_LOCK = 20;
  html$.KeyCode.ESC = 27;
  html$.KeyCode.SPACE = 32;
  html$.KeyCode.PAGE_UP = 33;
  html$.KeyCode.PAGE_DOWN = 34;
  html$.KeyCode.END = 35;
  html$.KeyCode.HOME = 36;
  html$.KeyCode.LEFT = 37;
  html$.KeyCode.UP = 38;
  html$.KeyCode.RIGHT = 39;
  html$.KeyCode.DOWN = 40;
  html$.KeyCode.NUM_NORTH_EAST = 33;
  html$.KeyCode.NUM_SOUTH_EAST = 34;
  html$.KeyCode.NUM_SOUTH_WEST = 35;
  html$.KeyCode.NUM_NORTH_WEST = 36;
  html$.KeyCode.NUM_WEST = 37;
  html$.KeyCode.NUM_NORTH = 38;
  html$.KeyCode.NUM_EAST = 39;
  html$.KeyCode.NUM_SOUTH = 40;
  html$.KeyCode.PRINT_SCREEN = 44;
  html$.KeyCode.INSERT = 45;
  html$.KeyCode.NUM_INSERT = 45;
  html$.KeyCode.DELETE = 46;
  html$.KeyCode.NUM_DELETE = 46;
  html$.KeyCode.ZERO = 48;
  html$.KeyCode.ONE = 49;
  html$.KeyCode.TWO = 50;
  html$.KeyCode.THREE = 51;
  html$.KeyCode.FOUR = 52;
  html$.KeyCode.FIVE = 53;
  html$.KeyCode.SIX = 54;
  html$.KeyCode.SEVEN = 55;
  html$.KeyCode.EIGHT = 56;
  html$.KeyCode.NINE = 57;
  html$.KeyCode.FF_SEMICOLON = 59;
  html$.KeyCode.FF_EQUALS = 61;
  html$.KeyCode.QUESTION_MARK = 63;
  html$.KeyCode.A = 65;
  html$.KeyCode.B = 66;
  html$.KeyCode.C = 67;
  html$.KeyCode.D = 68;
  html$.KeyCode.E = 69;
  html$.KeyCode.F = 70;
  html$.KeyCode.G = 71;
  html$.KeyCode.H = 72;
  html$.KeyCode.I = 73;
  html$.KeyCode.J = 74;
  html$.KeyCode.K = 75;
  html$.KeyCode.L = 76;
  html$.KeyCode.M = 77;
  html$.KeyCode.N = 78;
  html$.KeyCode.O = 79;
  html$.KeyCode.P = 80;
  html$.KeyCode.Q = 81;
  html$.KeyCode.R = 82;
  html$.KeyCode.S = 83;
  html$.KeyCode.T = 84;
  html$.KeyCode.U = 85;
  html$.KeyCode.V = 86;
  html$.KeyCode.W = 87;
  html$.KeyCode.X = 88;
  html$.KeyCode.Y = 89;
  html$.KeyCode.Z = 90;
  html$.KeyCode.META = 91;
  html$.KeyCode.WIN_KEY_LEFT = 91;
  html$.KeyCode.WIN_KEY_RIGHT = 92;
  html$.KeyCode.CONTEXT_MENU = 93;
  html$.KeyCode.NUM_ZERO = 96;
  html$.KeyCode.NUM_ONE = 97;
  html$.KeyCode.NUM_TWO = 98;
  html$.KeyCode.NUM_THREE = 99;
  html$.KeyCode.NUM_FOUR = 100;
  html$.KeyCode.NUM_FIVE = 101;
  html$.KeyCode.NUM_SIX = 102;
  html$.KeyCode.NUM_SEVEN = 103;
  html$.KeyCode.NUM_EIGHT = 104;
  html$.KeyCode.NUM_NINE = 105;
  html$.KeyCode.NUM_MULTIPLY = 106;
  html$.KeyCode.NUM_PLUS = 107;
  html$.KeyCode.NUM_MINUS = 109;
  html$.KeyCode.NUM_PERIOD = 110;
  html$.KeyCode.NUM_DIVISION = 111;
  html$.KeyCode.F1 = 112;
  html$.KeyCode.F2 = 113;
  html$.KeyCode.F3 = 114;
  html$.KeyCode.F4 = 115;
  html$.KeyCode.F5 = 116;
  html$.KeyCode.F6 = 117;
  html$.KeyCode.F7 = 118;
  html$.KeyCode.F8 = 119;
  html$.KeyCode.F9 = 120;
  html$.KeyCode.F10 = 121;
  html$.KeyCode.F11 = 122;
  html$.KeyCode.F12 = 123;
  html$.KeyCode.NUMLOCK = 144;
  html$.KeyCode.SCROLL_LOCK = 145;
  html$.KeyCode.FIRST_MEDIA_KEY = 166;
  html$.KeyCode.LAST_MEDIA_KEY = 183;
  html$.KeyCode.SEMICOLON = 186;
  html$.KeyCode.DASH = 189;
  html$.KeyCode.EQUALS = 187;
  html$.KeyCode.COMMA = 188;
  html$.KeyCode.PERIOD = 190;
  html$.KeyCode.SLASH = 191;
  html$.KeyCode.APOSTROPHE = 192;
  html$.KeyCode.TILDE = 192;
  html$.KeyCode.SINGLE_QUOTE = 222;
  html$.KeyCode.OPEN_SQUARE_BRACKET = 219;
  html$.KeyCode.BACKSLASH = 220;
  html$.KeyCode.CLOSE_SQUARE_BRACKET = 221;
  html$.KeyCode.WIN_KEY = 224;
  html$.KeyCode.MAC_FF_META = 224;
  html$.KeyCode.WIN_IME = 229;
  html$.KeyCode.UNKNOWN = -1;
  html$.KeyLocation = class KeyLocation extends core.Object {};
  dart.setSignature(html$.KeyLocation, {
    sfields: () => ({
      STANDARD: core.int,
      LEFT: core.int,
      RIGHT: core.int,
      NUMPAD: core.int,
      MOBILE: core.int,
      JOYSTICK: core.int
    })
  });
  html$.KeyLocation.STANDARD = 0;
  html$.KeyLocation.LEFT = 1;
  html$.KeyLocation.RIGHT = 2;
  html$.KeyLocation.NUMPAD = 3;
  html$.KeyLocation.MOBILE = 4;
  html$.KeyLocation.JOYSTICK = 5;
  html$._KeyName = class _KeyName extends core.Object {};
  dart.setSignature(html$._KeyName, {
    sfields: () => ({
      ACCEPT: core.String,
      ADD: core.String,
      AGAIN: core.String,
      ALL_CANDIDATES: core.String,
      ALPHANUMERIC: core.String,
      ALT: core.String,
      ALT_GRAPH: core.String,
      APPS: core.String,
      ATTN: core.String,
      BROWSER_BACK: core.String,
      BROWSER_FAVORTIES: core.String,
      BROWSER_FORWARD: core.String,
      BROWSER_NAME: core.String,
      BROWSER_REFRESH: core.String,
      BROWSER_SEARCH: core.String,
      BROWSER_STOP: core.String,
      CAMERA: core.String,
      CAPS_LOCK: core.String,
      CLEAR: core.String,
      CODE_INPUT: core.String,
      COMPOSE: core.String,
      CONTROL: core.String,
      CRSEL: core.String,
      CONVERT: core.String,
      COPY: core.String,
      CUT: core.String,
      DECIMAL: core.String,
      DIVIDE: core.String,
      DOWN: core.String,
      DOWN_LEFT: core.String,
      DOWN_RIGHT: core.String,
      EJECT: core.String,
      END: core.String,
      ENTER: core.String,
      ERASE_EOF: core.String,
      EXECUTE: core.String,
      EXSEL: core.String,
      FN: core.String,
      F1: core.String,
      F2: core.String,
      F3: core.String,
      F4: core.String,
      F5: core.String,
      F6: core.String,
      F7: core.String,
      F8: core.String,
      F9: core.String,
      F10: core.String,
      F11: core.String,
      F12: core.String,
      F13: core.String,
      F14: core.String,
      F15: core.String,
      F16: core.String,
      F17: core.String,
      F18: core.String,
      F19: core.String,
      F20: core.String,
      F21: core.String,
      F22: core.String,
      F23: core.String,
      F24: core.String,
      FINAL_MODE: core.String,
      FIND: core.String,
      FULL_WIDTH: core.String,
      HALF_WIDTH: core.String,
      HANGUL_MODE: core.String,
      HANJA_MODE: core.String,
      HELP: core.String,
      HIRAGANA: core.String,
      HOME: core.String,
      INSERT: core.String,
      JAPANESE_HIRAGANA: core.String,
      JAPANESE_KATAKANA: core.String,
      JAPANESE_ROMAJI: core.String,
      JUNJA_MODE: core.String,
      KANA_MODE: core.String,
      KANJI_MODE: core.String,
      KATAKANA: core.String,
      LAUNCH_APPLICATION_1: core.String,
      LAUNCH_APPLICATION_2: core.String,
      LAUNCH_MAIL: core.String,
      LEFT: core.String,
      MENU: core.String,
      META: core.String,
      MEDIA_NEXT_TRACK: core.String,
      MEDIA_PAUSE_PLAY: core.String,
      MEDIA_PREVIOUS_TRACK: core.String,
      MEDIA_STOP: core.String,
      MODE_CHANGE: core.String,
      NEXT_CANDIDATE: core.String,
      NON_CONVERT: core.String,
      NUM_LOCK: core.String,
      PAGE_DOWN: core.String,
      PAGE_UP: core.String,
      PASTE: core.String,
      PAUSE: core.String,
      PLAY: core.String,
      POWER: core.String,
      PREVIOUS_CANDIDATE: core.String,
      PRINT_SCREEN: core.String,
      PROCESS: core.String,
      PROPS: core.String,
      RIGHT: core.String,
      ROMAN_CHARACTERS: core.String,
      SCROLL: core.String,
      SELECT: core.String,
      SELECT_MEDIA: core.String,
      SEPARATOR: core.String,
      SHIFT: core.String,
      SOFT_1: core.String,
      SOFT_2: core.String,
      SOFT_3: core.String,
      SOFT_4: core.String,
      STOP: core.String,
      SUBTRACT: core.String,
      SYMBOL_LOCK: core.String,
      UP: core.String,
      UP_LEFT: core.String,
      UP_RIGHT: core.String,
      UNDO: core.String,
      VOLUME_DOWN: core.String,
      VOLUMN_MUTE: core.String,
      VOLUMN_UP: core.String,
      WIN: core.String,
      ZOOM: core.String,
      BACKSPACE: core.String,
      TAB: core.String,
      CANCEL: core.String,
      ESC: core.String,
      SPACEBAR: core.String,
      DEL: core.String,
      DEAD_GRAVE: core.String,
      DEAD_EACUTE: core.String,
      DEAD_CIRCUMFLEX: core.String,
      DEAD_TILDE: core.String,
      DEAD_MACRON: core.String,
      DEAD_BREVE: core.String,
      DEAD_ABOVE_DOT: core.String,
      DEAD_UMLAUT: core.String,
      DEAD_ABOVE_RING: core.String,
      DEAD_DOUBLEACUTE: core.String,
      DEAD_CARON: core.String,
      DEAD_CEDILLA: core.String,
      DEAD_OGONEK: core.String,
      DEAD_IOTA: core.String,
      DEAD_VOICED_SOUND: core.String,
      DEC_SEMIVOICED_SOUND: core.String,
      UNIDENTIFIED: core.String
    })
  });
  html$._KeyName.ACCEPT = "Accept";
  html$._KeyName.ADD = "Add";
  html$._KeyName.AGAIN = "Again";
  html$._KeyName.ALL_CANDIDATES = "AllCandidates";
  html$._KeyName.ALPHANUMERIC = "Alphanumeric";
  html$._KeyName.ALT = "Alt";
  html$._KeyName.ALT_GRAPH = "AltGraph";
  html$._KeyName.APPS = "Apps";
  html$._KeyName.ATTN = "Attn";
  html$._KeyName.BROWSER_BACK = "BrowserBack";
  html$._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
  html$._KeyName.BROWSER_FORWARD = "BrowserForward";
  html$._KeyName.BROWSER_NAME = "BrowserHome";
  html$._KeyName.BROWSER_REFRESH = "BrowserRefresh";
  html$._KeyName.BROWSER_SEARCH = "BrowserSearch";
  html$._KeyName.BROWSER_STOP = "BrowserStop";
  html$._KeyName.CAMERA = "Camera";
  html$._KeyName.CAPS_LOCK = "CapsLock";
  html$._KeyName.CLEAR = "Clear";
  html$._KeyName.CODE_INPUT = "CodeInput";
  html$._KeyName.COMPOSE = "Compose";
  html$._KeyName.CONTROL = "Control";
  html$._KeyName.CRSEL = "Crsel";
  html$._KeyName.CONVERT = "Convert";
  html$._KeyName.COPY = "Copy";
  html$._KeyName.CUT = "Cut";
  html$._KeyName.DECIMAL = "Decimal";
  html$._KeyName.DIVIDE = "Divide";
  html$._KeyName.DOWN = "Down";
  html$._KeyName.DOWN_LEFT = "DownLeft";
  html$._KeyName.DOWN_RIGHT = "DownRight";
  html$._KeyName.EJECT = "Eject";
  html$._KeyName.END = "End";
  html$._KeyName.ENTER = "Enter";
  html$._KeyName.ERASE_EOF = "EraseEof";
  html$._KeyName.EXECUTE = "Execute";
  html$._KeyName.EXSEL = "Exsel";
  html$._KeyName.FN = "Fn";
  html$._KeyName.F1 = "F1";
  html$._KeyName.F2 = "F2";
  html$._KeyName.F3 = "F3";
  html$._KeyName.F4 = "F4";
  html$._KeyName.F5 = "F5";
  html$._KeyName.F6 = "F6";
  html$._KeyName.F7 = "F7";
  html$._KeyName.F8 = "F8";
  html$._KeyName.F9 = "F9";
  html$._KeyName.F10 = "F10";
  html$._KeyName.F11 = "F11";
  html$._KeyName.F12 = "F12";
  html$._KeyName.F13 = "F13";
  html$._KeyName.F14 = "F14";
  html$._KeyName.F15 = "F15";
  html$._KeyName.F16 = "F16";
  html$._KeyName.F17 = "F17";
  html$._KeyName.F18 = "F18";
  html$._KeyName.F19 = "F19";
  html$._KeyName.F20 = "F20";
  html$._KeyName.F21 = "F21";
  html$._KeyName.F22 = "F22";
  html$._KeyName.F23 = "F23";
  html$._KeyName.F24 = "F24";
  html$._KeyName.FINAL_MODE = "FinalMode";
  html$._KeyName.FIND = "Find";
  html$._KeyName.FULL_WIDTH = "FullWidth";
  html$._KeyName.HALF_WIDTH = "HalfWidth";
  html$._KeyName.HANGUL_MODE = "HangulMode";
  html$._KeyName.HANJA_MODE = "HanjaMode";
  html$._KeyName.HELP = "Help";
  html$._KeyName.HIRAGANA = "Hiragana";
  html$._KeyName.HOME = "Home";
  html$._KeyName.INSERT = "Insert";
  html$._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
  html$._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
  html$._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
  html$._KeyName.JUNJA_MODE = "JunjaMode";
  html$._KeyName.KANA_MODE = "KanaMode";
  html$._KeyName.KANJI_MODE = "KanjiMode";
  html$._KeyName.KATAKANA = "Katakana";
  html$._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
  html$._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
  html$._KeyName.LAUNCH_MAIL = "LaunchMail";
  html$._KeyName.LEFT = "Left";
  html$._KeyName.MENU = "Menu";
  html$._KeyName.META = "Meta";
  html$._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
  html$._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
  html$._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
  html$._KeyName.MEDIA_STOP = "MediaStop";
  html$._KeyName.MODE_CHANGE = "ModeChange";
  html$._KeyName.NEXT_CANDIDATE = "NextCandidate";
  html$._KeyName.NON_CONVERT = "Nonconvert";
  html$._KeyName.NUM_LOCK = "NumLock";
  html$._KeyName.PAGE_DOWN = "PageDown";
  html$._KeyName.PAGE_UP = "PageUp";
  html$._KeyName.PASTE = "Paste";
  html$._KeyName.PAUSE = "Pause";
  html$._KeyName.PLAY = "Play";
  html$._KeyName.POWER = "Power";
  html$._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
  html$._KeyName.PRINT_SCREEN = "PrintScreen";
  html$._KeyName.PROCESS = "Process";
  html$._KeyName.PROPS = "Props";
  html$._KeyName.RIGHT = "Right";
  html$._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
  html$._KeyName.SCROLL = "Scroll";
  html$._KeyName.SELECT = "Select";
  html$._KeyName.SELECT_MEDIA = "SelectMedia";
  html$._KeyName.SEPARATOR = "Separator";
  html$._KeyName.SHIFT = "Shift";
  html$._KeyName.SOFT_1 = "Soft1";
  html$._KeyName.SOFT_2 = "Soft2";
  html$._KeyName.SOFT_3 = "Soft3";
  html$._KeyName.SOFT_4 = "Soft4";
  html$._KeyName.STOP = "Stop";
  html$._KeyName.SUBTRACT = "Subtract";
  html$._KeyName.SYMBOL_LOCK = "SymbolLock";
  html$._KeyName.UP = "Up";
  html$._KeyName.UP_LEFT = "UpLeft";
  html$._KeyName.UP_RIGHT = "UpRight";
  html$._KeyName.UNDO = "Undo";
  html$._KeyName.VOLUME_DOWN = "VolumeDown";
  html$._KeyName.VOLUMN_MUTE = "VolumeMute";
  html$._KeyName.VOLUMN_UP = "VolumeUp";
  html$._KeyName.WIN = "Win";
  html$._KeyName.ZOOM = "Zoom";
  html$._KeyName.BACKSPACE = "Backspace";
  html$._KeyName.TAB = "Tab";
  html$._KeyName.CANCEL = "Cancel";
  html$._KeyName.ESC = "Esc";
  html$._KeyName.SPACEBAR = "Spacebar";
  html$._KeyName.DEL = "Del";
  html$._KeyName.DEAD_GRAVE = "DeadGrave";
  html$._KeyName.DEAD_EACUTE = "DeadEacute";
  html$._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
  html$._KeyName.DEAD_TILDE = "DeadTilde";
  html$._KeyName.DEAD_MACRON = "DeadMacron";
  html$._KeyName.DEAD_BREVE = "DeadBreve";
  html$._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
  html$._KeyName.DEAD_UMLAUT = "DeadUmlaut";
  html$._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
  html$._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
  html$._KeyName.DEAD_CARON = "DeadCaron";
  html$._KeyName.DEAD_CEDILLA = "DeadCedilla";
  html$._KeyName.DEAD_OGONEK = "DeadOgonek";
  html$._KeyName.DEAD_IOTA = "DeadIota";
  html$._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
  html$._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
  html$._KeyName.UNIDENTIFIED = "Unidentified";
  const _stream$0 = Symbol('_stream');
  const _keyDownList = Symbol('_keyDownList');
  const _capsLockOn = Symbol('_capsLockOn');
  const _determineKeyCodeForKeypress = Symbol('_determineKeyCodeForKeypress');
  const _findCharCodeKeyDown = Symbol('_findCharCodeKeyDown');
  const _firesKeyPressEvent = Symbol('_firesKeyPressEvent');
  const _normalizeKeyCodes = Symbol('_normalizeKeyCodes');
  html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type$], e);
      return handler[_stream$0];
    }
    new(type) {
      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
      this[_type$] = type;
      this[_stream$0] = new html$._CustomKeyEventStreamImpl('event');
      this[_target$0] = null;
      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
    }
    initializeAllEventListeners(type, target) {
      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
      this[_type$] = type;
      this[_target$0] = target;
      this[_stream$0] = null;
      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
      html$.Element.keyDownEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
      html$.Element.keyPressEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
      html$.Element.keyUpEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
      this[_stream$0] = new html$._CustomKeyEventStreamImpl(this[_type$]);
    }
    get [_capsLockOn]() {
      return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
    }
    [_determineKeyCodeForKeypress](event) {
      for (let prevEvent of this[_keyDownList]) {
        if (prevEvent[_shadowCharCode] == event[dartx.charCode]) {
          return prevEvent.keyCode;
        }
        if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
          return prevEvent.keyCode;
        }
      }
      return html$.KeyCode.UNKNOWN;
    }
    [_findCharCodeKeyDown](event) {
      if (event[dartx.keyLocation] == 3) {
        switch (event[dartx.keyCode]) {
          case html$.KeyCode.NUM_ZERO:
          {
            return html$.KeyCode.ZERO;
          }
          case html$.KeyCode.NUM_ONE:
          {
            return html$.KeyCode.ONE;
          }
          case html$.KeyCode.NUM_TWO:
          {
            return html$.KeyCode.TWO;
          }
          case html$.KeyCode.NUM_THREE:
          {
            return html$.KeyCode.THREE;
          }
          case html$.KeyCode.NUM_FOUR:
          {
            return html$.KeyCode.FOUR;
          }
          case html$.KeyCode.NUM_FIVE:
          {
            return html$.KeyCode.FIVE;
          }
          case html$.KeyCode.NUM_SIX:
          {
            return html$.KeyCode.SIX;
          }
          case html$.KeyCode.NUM_SEVEN:
          {
            return html$.KeyCode.SEVEN;
          }
          case html$.KeyCode.NUM_EIGHT:
          {
            return html$.KeyCode.EIGHT;
          }
          case html$.KeyCode.NUM_NINE:
          {
            return html$.KeyCode.NINE;
          }
          case html$.KeyCode.NUM_MULTIPLY:
          {
            return 42;
          }
          case html$.KeyCode.NUM_PLUS:
          {
            return 43;
          }
          case html$.KeyCode.NUM_MINUS:
          {
            return 45;
          }
          case html$.KeyCode.NUM_PERIOD:
          {
            return 46;
          }
          case html$.KeyCode.NUM_DIVISION:
          {
            return 47;
          }
        }
      } else if (dart.notNull(event[dartx.keyCode]) >= 65 && dart.notNull(event[dartx.keyCode]) <= 90) {
        return dart.notNull(event[dartx.keyCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
      }
      switch (event[dartx.keyCode]) {
        case html$.KeyCode.SEMICOLON:
        {
          return html$.KeyCode.FF_SEMICOLON;
        }
        case html$.KeyCode.EQUALS:
        {
          return html$.KeyCode.FF_EQUALS;
        }
        case html$.KeyCode.COMMA:
        {
          return 44;
        }
        case html$.KeyCode.DASH:
        {
          return 45;
        }
        case html$.KeyCode.PERIOD:
        {
          return 46;
        }
        case html$.KeyCode.SLASH:
        {
          return 47;
        }
        case html$.KeyCode.APOSTROPHE:
        {
          return 96;
        }
        case html$.KeyCode.OPEN_SQUARE_BRACKET:
        {
          return 91;
        }
        case html$.KeyCode.BACKSLASH:
        {
          return 92;
        }
        case html$.KeyCode.CLOSE_SQUARE_BRACKET:
        {
          return 93;
        }
        case html$.KeyCode.SINGLE_QUOTE:
        {
          return 39;
        }
      }
      return event[dartx.keyCode];
    }
    [_firesKeyPressEvent](event) {
      if (!dart.test(html_common.Device.isIE) && !dart.test(html_common.Device.isWebKit)) {
        return true;
      }
      if (dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && dart.test(event.altKey)) {
        return html$.KeyCode.isCharacterKey(event.keyCode);
      }
      if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
        return false;
      }
      if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META)) {
        return false;
      }
      if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html$.KeyCode.BACKSLASH || event.keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html$.KeyCode.TILDE || event.keyCode == html$.KeyCode.SEMICOLON || event.keyCode == html$.KeyCode.DASH || event.keyCode == html$.KeyCode.EQUALS || event.keyCode == html$.KeyCode.COMMA || event.keyCode == html$.KeyCode.PERIOD || event.keyCode == html$.KeyCode.SLASH || event.keyCode == html$.KeyCode.APOSTROPHE || event.keyCode == html$.KeyCode.SINGLE_QUOTE)) {
        return false;
      }
      switch (event.keyCode) {
        case html$.KeyCode.ENTER:
        {
          return !dart.test(html_common.Device.isIE);
        }
        case html$.KeyCode.ESC:
        {
          return !dart.test(html_common.Device.isWebKit);
        }
      }
      return html$.KeyCode.isCharacterKey(event.keyCode);
    }
    [_normalizeKeyCodes](event) {
      if (dart.test(html_common.Device.isFirefox)) {
        switch (event[dartx.keyCode]) {
          case html$.KeyCode.FF_EQUALS:
          {
            return html$.KeyCode.EQUALS;
          }
          case html$.KeyCode.FF_SEMICOLON:
          {
            return html$.KeyCode.SEMICOLON;
          }
          case html$.KeyCode.MAC_FF_META:
          {
            return html$.KeyCode.META;
          }
          case html$.KeyCode.WIN_KEY_FF_LINUX:
          {
            return html$.KeyCode.WIN_KEY;
          }
        }
      }
      return event[dartx.keyCode];
    }
    processKeyDown(e) {
      if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
        this[_keyDownList][dartx.clear]();
      }
      let event = new html$.KeyEvent.wrap(e);
      event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
      event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
      if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && event.keyCode != this[_keyDownList][dartx.last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
        this.processKeyPress(e);
      }
      this[_keyDownList][dartx.add](event);
      this[_stream$0].add(event);
    }
    processKeyPress(event) {
      let e = new html$.KeyEvent.wrap(event);
      if (dart.test(html_common.Device.isIE)) {
        if (e.keyCode == html$.KeyCode.ENTER || e.keyCode == html$.KeyCode.ESC) {
          e[_shadowCharCode] = 0;
        } else {
          e[_shadowCharCode] = e.keyCode;
        }
      } else if (dart.test(html_common.Device.isOpera)) {
        e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
      }
      e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
      if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
        e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
      }
      e[_shadowAltKey] = this[_keyDownList][dartx.any](dart.fn(element => element.altKey, KeyEventTobool()));
      this[_stream$0].add(e);
    }
    processKeyUp(event) {
      let e = new html$.KeyEvent.wrap(event);
      let toRemove = null;
      for (let key of this[_keyDownList]) {
        if (key.keyCode == e.keyCode) {
          toRemove = key;
        }
      }
      if (toRemove != null) {
        this[_keyDownList][dartx.removeWhere](dart.fn(element => dart.equals(element, toRemove), KeyEventTobool()));
      } else if (dart.notNull(this[_keyDownList][dartx.length]) > 0) {
        this[_keyDownList][dartx.removeLast]();
      }
      this[_stream$0].add(e);
    }
  };
  dart.addSimpleTypeTests(html$._KeyboardEventHandler);
  dart.defineNamedConstructor(html$._KeyboardEventHandler, 'initializeAllEventListeners');
  dart.setSignature(html$._KeyboardEventHandler, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String]),
      initializeAllEventListeners: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String, html$.EventTarget])
    }),
    fields: () => ({
      [_keyDownList]: ListOfKeyEvent(),
      [_type$]: core.String,
      [_target$0]: html$.EventTarget,
      [_stream$0]: html$._CustomKeyEventStreamImpl
    }),
    getters: () => ({[_capsLockOn]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      forTarget: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
      [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
      [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
      [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html$.KeyEvent]),
      [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
      processKeyDown: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
      processKeyPress: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
      processKeyUp: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent])
    }),
    sfields: () => ({
      _ROMAN_ALPHABET_OFFSET: core.int,
      _EVENT_TYPE: core.String,
      _keyIdentifier: MapOfString$int()
    })
  });
  html$._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
  html$._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html$.KeyCode.UP, Down: html$.KeyCode.DOWN, Left: html$.KeyCode.LEFT, Right: html$.KeyCode.RIGHT, Enter: html$.KeyCode.ENTER, F1: html$.KeyCode.F1, F2: html$.KeyCode.F2, F3: html$.KeyCode.F3, F4: html$.KeyCode.F4, F5: html$.KeyCode.F5, F6: html$.KeyCode.F6, F7: html$.KeyCode.F7, F8: html$.KeyCode.F8, F9: html$.KeyCode.F9, F10: html$.KeyCode.F10, F11: html$.KeyCode.F11, F12: html$.KeyCode.F12, 'U+007F': html$.KeyCode.DELETE, Home: html$.KeyCode.HOME, End: html$.KeyCode.END, PageUp: html$.KeyCode.PAGE_UP, PageDown: html$.KeyCode.PAGE_DOWN, Insert: html$.KeyCode.INSERT}, core.String, core.int));
  dart.defineLazy(html$._KeyboardEventHandler, {
    get _ROMAN_ALPHABET_OFFSET() {
      return dart.notNull("a"[dartx.codeUnits][dartx._get](0)) - dart.notNull("A"[dartx.codeUnits][dartx._get](0));
    }
  });
  html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
    static onKeyPress(target) {
      return new html$._KeyboardEventHandler('keypress').forTarget(target);
    }
    static onKeyUp(target) {
      return new html$._KeyboardEventHandler('keyup').forTarget(target);
    }
    static onKeyDown(target) {
      return new html$._KeyboardEventHandler('keydown').forTarget(target);
    }
  };
  dart.setSignature(html$.KeyboardEventStream, {
    statics: () => ({
      onKeyPress: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
      onKeyUp: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
      onKeyDown: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget])
    }),
    names: ['onKeyPress', 'onKeyUp', 'onKeyDown']
  });
  const _validators = Symbol('_validators');
  html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
    new() {
      this[_validators] = JSArrayOfNodeValidator().of([]);
    }
    common() {
      this[_validators] = JSArrayOfNodeValidator().of([]);
      this.allowHtml5();
      this.allowTemplating();
    }
    allowNavigation(uriPolicy) {
      if (uriPolicy === void 0) uriPolicy = null;
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
    }
    allowImages(uriPolicy) {
      if (uriPolicy === void 0) uriPolicy = null;
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
    }
    allowTextElements() {
      this.add(html$._SimpleNodeValidator.allowTextElements());
    }
    allowInlineStyles(opts) {
      let tagName = opts && 'tagName' in opts ? opts.tagName : null;
      if (tagName == null) {
        tagName = '*';
      } else {
        tagName = tagName[dartx.toUpperCase]();
      }
      this.add(new html$._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
    }
    allowHtml5(opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      this.add(new html$._Html5NodeValidator({uriPolicy: uriPolicy}));
    }
    allowSvg() {
      this.add(new html$._SvgNodeValidator());
    }
    allowCustomElement(tagName, opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
      let tagNameUpper = tagName[dartx.toUpperCase]();
      let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
    }
    allowTagExtension(tagName, baseName, opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
      let baseNameUpper = baseName[dartx.toUpperCase]();
      let tagNameUpper = tagName[dartx.toUpperCase]();
      let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
    }
    allowElement(tagName, opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
      this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
    }
    allowTemplating() {
      this.add(new html$._TemplatingNodeValidator());
    }
    add(validator) {
      this[_validators][dartx.add](validator);
    }
    allowsElement(element) {
      return this[_validators][dartx.any](dart.fn(v => v.allowsElement(element), NodeValidatorTobool()));
    }
    allowsAttribute(element, attributeName, value) {
      return this[_validators][dartx.any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
    }
  };
  dart.defineNamedConstructor(html$.NodeValidatorBuilder, 'common');
  html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$.NodeValidatorBuilder, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.NodeValidatorBuilder, []),
      common: dart.definiteFunctionType(html$.NodeValidatorBuilder, [])
    }),
    fields: () => ({[_validators]: ListOfNodeValidator()}),
    methods: () => ({
      allowNavigation: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
      allowImages: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
      allowTextElements: dart.definiteFunctionType(dart.void, []),
      allowInlineStyles: dart.definiteFunctionType(dart.void, [], {tagName: core.String}),
      allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html$.UriPolicy}),
      allowSvg: dart.definiteFunctionType(dart.void, []),
      allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
      allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
      allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
      allowTemplating: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [html$.NodeValidator]),
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  let const$83;
  let const$84;
  let const$85;
  let const$86;
  let const$87;
  let const$88;
  let const$89;
  let const$90;
  let const$91;
  let const$92;
  html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
    static allowNavigation(uriPolicy) {
      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
    }
    static allowImages(uriPolicy) {
      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
    }
    static allowTextElements() {
      return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
    }
    new(uriPolicy, opts) {
      let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
      let allowedAttributes = opts && 'allowedAttributes' in opts ? opts.allowedAttributes : null;
      let allowedUriAttributes = opts && 'allowedUriAttributes' in opts ? opts.allowedUriAttributes : null;
      this.allowedElements = SetOfString().new();
      this.allowedAttributes = SetOfString().new();
      this.allowedUriAttributes = SetOfString().new();
      this.uriPolicy = uriPolicy;
      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
      let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
      let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
      this.allowedAttributes.addAll(legalAttributes);
      this.allowedUriAttributes.addAll(allowedUriAttributes);
      this.allowedUriAttributes.addAll(extraUriAttributes);
    }
    allowsElement(element) {
      return this.allowedElements.contains(html$.Element._safeTagName(element));
    }
    allowsAttribute(element, attributeName, value) {
      let tagName = html$.Element._safeTagName(element);
      if (dart.test(this.allowedUriAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
        return this.uriPolicy.allowsUri(value);
      } else if (dart.test(this.allowedUriAttributes.contains(dart.str`*::${attributeName}`))) {
        return this.uriPolicy.allowsUri(value);
      } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
        return true;
      } else if (dart.test(this.allowedAttributes.contains(dart.str`*::${attributeName}`))) {
        return true;
      } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::*`))) {
        return true;
      } else if (dart.test(this.allowedAttributes.contains('*::*'))) {
        return true;
      }
      return false;
    }
  };
  html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._SimpleNodeValidator, {
    constructors: () => ({
      allowNavigation: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
      allowImages: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
      allowTextElements: dart.definiteFunctionType(html$._SimpleNodeValidator, []),
      new: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
    }),
    fields: () => ({
      allowedElements: SetOfString(),
      allowedAttributes: SetOfString(),
      allowedUriAttributes: SetOfString(),
      uriPolicy: html$.UriPolicy
    }),
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
    new(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
      this.allowTypeExtension = allowTypeExtension == true;
      this.allowCustomTag = allowCustomTag == true;
      super.new(uriPolicy, {allowedElements: allowedElements, allowedAttributes: allowedAttributes, allowedUriAttributes: allowedUriAttributes});
    }
    allowsElement(element) {
      if (dart.test(this.allowTypeExtension)) {
        let isAttr = element[dartx.attributes][dartx._get]('is');
        if (isAttr != null) {
          return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
        }
      }
      return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
    }
    allowsAttribute(element, attributeName, value) {
      if (dart.test(this.allowsElement(element))) {
        if (dart.test(this.allowTypeExtension) && attributeName == 'is' && dart.test(this.allowedElements.contains(value[dartx.toUpperCase]()))) {
          return true;
        }
        return super.allowsAttribute(element, attributeName, value);
      }
      return false;
    }
  };
  dart.setSignature(html$._CustomElementNodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CustomElementNodeValidator, [html$.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
    fields: () => ({
      allowTypeExtension: core.bool,
      allowCustomTag: core.bool
    })
  });
  const _templateAttrs = Symbol('_templateAttrs');
  html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
    new() {
      this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
      super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html$._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString$()))});
    }
    allowsAttribute(element, attributeName, value) {
      if (dart.test(super.allowsAttribute(element, attributeName, value))) {
        return true;
      }
      if (attributeName == 'template' && value == "") {
        return true;
      }
      if (element[dartx.attributes][dartx._get]('template') == "") {
        return this[_templateAttrs].contains(attributeName);
      }
      return false;
    }
  };
  dart.setSignature(html$._TemplatingNodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._TemplatingNodeValidator, [])}),
    fields: () => ({[_templateAttrs]: SetOfString()}),
    sfields: () => ({_TEMPLATE_ATTRS: ListOfString()})
  });
  html$._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
  html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
    allowsElement(element) {
      if (svg$.ScriptElement.is(element)) {
        return false;
      }
      if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) == 'foreignObject') {
        return false;
      }
      if (svg$.SvgElement.is(element)) {
        return true;
      }
      return false;
    }
    allowsAttribute(element, attributeName, value) {
      if (attributeName == 'is' || dart.test(attributeName[dartx.startsWith]('on'))) {
        return false;
      }
      return this.allowsElement(element);
    }
  };
  html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._SvgNodeValidator, {
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  html$.ReadyState = class ReadyState extends core.Object {};
  dart.setSignature(html$.ReadyState, {
    sfields: () => ({
      LOADING: core.String,
      INTERACTIVE: core.String,
      COMPLETE: core.String
    })
  });
  html$.ReadyState.LOADING = "loading";
  html$.ReadyState.INTERACTIVE = "interactive";
  html$.ReadyState.COMPLETE = "complete";
  const _list$ = Symbol('_list');
  html$._WrappedList$ = dart.generic(E => {
    let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    class _WrappedList extends collection.ListBase$(E) {
      new(list) {
        this[_list$] = list;
      }
      get iterator() {
        return new (_WrappedIteratorOfE())(this[_list$][dartx.iterator]);
      }
      get length() {
        return this[_list$][dartx.length];
      }
      add(element) {
        E._check(element);
        this[_list$][dartx.add](element);
      }
      remove(element) {
        return this[_list$][dartx.remove](element);
      }
      clear() {
        this[_list$][dartx.clear]();
      }
      _get(index) {
        return html$._downcast(html$.Node, E)(this[_list$][dartx._get](index));
      }
      _set(index, value) {
        E._check(value);
        this[_list$][dartx._set](index, value);
        return value;
      }
      set length(newLength) {
        this[_list$][dartx.length] = newLength;
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        this[_list$][dartx.sort](dart.fn((a, b) => compare(html$._downcast(html$.Node, E)(a), html$._downcast(html$.Node, E)(b)), NodeAndNodeToint()));
      }
      indexOf(element, start) {
        if (start === void 0) start = 0;
        return this[_list$][dartx.indexOf](html$.Node._check(element), start);
      }
      lastIndexOf(element, start) {
        if (start === void 0) start = null;
        return this[_list$][dartx.lastIndexOf](html$.Node._check(element), start);
      }
      insert(index, element) {
        E._check(element);
        return this[_list$][dartx.insert](index, element);
      }
      removeAt(index) {
        return html$._downcast(html$.Node, E)(this[_list$][dartx.removeAt](index));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        this[_list$][dartx.setRange](start, end, iterable, skipCount);
      }
      removeRange(start, end) {
        this[_list$][dartx.removeRange](start, end);
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        this[_list$][dartx.replaceRange](start, end, iterable);
      }
      fillRange(start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        this[_list$][dartx.fillRange](start, end, fillValue);
      }
      get rawList() {
        return this[_list$];
      }
    }
    _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
    dart.setSignature(_WrappedList, {
      constructors: () => ({new: dart.definiteFunctionType(html$._WrappedList$(E), [ListOfNode()])}),
      fields: () => ({[_list$]: ListOfNode()}),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        length: dart.definiteFunctionType(core.int, []),
        rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
      }),
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [E]),
        _get: dart.definiteFunctionType(E, [core.int]),
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
      })
    });
    dart.defineExtensionMembers(_WrappedList, [
      'add',
      'remove',
      'clear',
      '_get',
      '_set',
      'sort',
      'indexOf',
      'lastIndexOf',
      'insert',
      'removeAt',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange',
      'iterator',
      'length',
      'length'
    ]);
    return _WrappedList;
  });
  html$._WrappedList = _WrappedList();
  const _iterator$1 = Symbol('_iterator');
  html$._WrappedIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class _WrappedIterator extends core.Object {
      new(iterator) {
        this[_iterator$1] = iterator;
      }
      moveNext() {
        return this[_iterator$1].moveNext();
      }
      get current() {
        return html$._downcast(html$.Node, E)(this[_iterator$1].current);
      }
    }
    dart.addTypeTests(_WrappedIterator);
    _WrappedIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_WrappedIterator, {
      constructors: () => ({new: dart.definiteFunctionType(html$._WrappedIterator$(E), [IteratorOfNode()])}),
      fields: () => ({[_iterator$1]: IteratorOfNode()}),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _WrappedIterator;
  });
  html$._WrappedIterator = _WrappedIterator();
  html$._downcast = function(From, To) {
    return x => {
      return To._check(x);
    };
  };
  dart.fn(html$._downcast, FromToTo());
  html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
    static get(url, onComplete, withCredentials) {
      let request = html$.HttpRequest.new();
      request[dartx.open]('GET', url, {async: true});
      request[dartx.withCredentials] = withCredentials;
      request[dartx.onReadyStateChange].listen(dart.fn(e => {
        if (request[dartx.readyState] == html$.HttpRequest.DONE) {
          onComplete(request);
        }
      }, ProgressEventTovoid$()));
      request[dartx.send]();
      return request;
    }
  };
  dart.setSignature(html$._HttpRequestUtils, {
    statics: () => ({get: dart.definiteFunctionType(html$.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
    names: ['get']
  });
  const _array = Symbol('_array');
  const _current$4 = Symbol('_current');
  html$.FixedSizeListIterator$ = dart.generic(T => {
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    class FixedSizeListIterator extends core.Object {
      new(array) {
        this[_array] = array;
        this[_position$1] = -1;
        this[_length$3] = array[dartx.length];
        this[_current$4] = null;
      }
      moveNext() {
        let nextPosition = dart.notNull(this[_position$1]) + 1;
        if (nextPosition < dart.notNull(this[_length$3])) {
          this[_current$4] = this[_array][dartx._get](nextPosition);
          this[_position$1] = nextPosition;
          return true;
        }
        this[_current$4] = null;
        this[_position$1] = this[_length$3];
        return false;
      }
      get current() {
        return this[_current$4];
      }
    }
    dart.addTypeTests(FixedSizeListIterator);
    FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(FixedSizeListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(html$.FixedSizeListIterator$(T), [ListOfT()])}),
      fields: () => ({
        [_array]: ListOfT(),
        [_length$3]: core.int,
        [_position$1]: core.int,
        [_current$4]: T
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return FixedSizeListIterator;
  });
  html$.FixedSizeListIterator = FixedSizeListIterator();
  html$._VariableSizeListIterator$ = dart.generic(T => {
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    class _VariableSizeListIterator extends core.Object {
      new(array) {
        this[_array] = array;
        this[_position$1] = -1;
        this[_current$4] = null;
      }
      moveNext() {
        let nextPosition = dart.notNull(this[_position$1]) + 1;
        if (nextPosition < dart.notNull(this[_array][dartx.length])) {
          this[_current$4] = this[_array][dartx._get](nextPosition);
          this[_position$1] = nextPosition;
          return true;
        }
        this[_current$4] = null;
        this[_position$1] = this[_array][dartx.length];
        return false;
      }
      get current() {
        return this[_current$4];
      }
    }
    dart.addTypeTests(_VariableSizeListIterator);
    _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(_VariableSizeListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(html$._VariableSizeListIterator$(T), [ListOfT()])}),
      fields: () => ({
        [_array]: ListOfT(),
        [_position$1]: core.int,
        [_current$4]: T
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _VariableSizeListIterator;
  });
  html$._VariableSizeListIterator = _VariableSizeListIterator();
  html$._convertNativeToDart_Window = function(win) {
    if (win == null) return null;
    return html$._DOMWindowCrossFrame._createSafe(win);
  };
  dart.fn(html$._convertNativeToDart_Window, dynamicToWindowBase());
  html$._convertNativeToDart_EventTarget = function(e) {
    if (e == null) {
      return null;
    }
    if ("postMessage" in e) {
      let window = html$._DOMWindowCrossFrame._createSafe(e);
      if (html$.EventTarget.is(window)) {
        return window;
      }
      return null;
    } else
      return html$.EventTarget._check(e);
  };
  dart.fn(html$._convertNativeToDart_EventTarget, dynamicToEventTarget());
  const _window = Symbol('_window');
  html$._convertDartToNative_EventTarget = function(e) {
    if (html$._DOMWindowCrossFrame.is(e)) {
      return html$.EventTarget._check(e[_window]);
    } else {
      return html$.EventTarget._check(e);
    }
  };
  dart.fn(html$._convertDartToNative_EventTarget, dynamicToEventTarget());
  html$._convertNativeToDart_XHR_Response = function(o) {
    if (html$.Document.is(o)) {
      return o;
    }
    return html_common.convertNativeToDart_SerializedScriptValue(o);
  };
  dart.fn(html$._convertNativeToDart_XHR_Response, dynamicTodynamic$());
  html$._callConstructor = function(constructor, interceptor) {
    return dart.fn(receiver => {
      _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
      receiver.constructor = receiver.__proto__.constructor;
      return constructor(receiver);
    }, dynamicTodynamic$());
  };
  dart.fn(html$._callConstructor, dynamicAnddynamicTodynamic$());
  html$._callAttached = function(receiver) {
    return dart.dsend(receiver, 'attached');
  };
  dart.fn(html$._callAttached, dynamicTodynamic$());
  html$._callDetached = function(receiver) {
    return dart.dsend(receiver, 'detached');
  };
  dart.fn(html$._callDetached, dynamicTodynamic$());
  html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
    return dart.dsend(receiver, 'attributeChanged', name, oldValue, newValue);
  };
  dart.fn(html$._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
  html$._makeCallbackMethod = function(callback) {
    return (function(invokeCallback) {
      return function() {
        return invokeCallback(this);
      };
    })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 1));
  };
  dart.fn(html$._makeCallbackMethod, dynamicTodynamic$());
  html$._makeCallbackMethod3 = function(callback) {
    return (function(invokeCallback) {
      return function(arg1, arg2, arg3) {
        return invokeCallback(this, arg1, arg2, arg3);
      };
    })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 4));
  };
  dart.fn(html$._makeCallbackMethod3, dynamicTodynamic$());
  html$._registerCustomElement = function(context, document, tag, type, extendsTagName) {
    let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
    if (interceptorClass == null) {
      dart.throw(new core.ArgumentError(type));
    }
    let interceptor = interceptorClass.prototype;
    let constructor = _interceptors.findConstructorForNativeSubclassType(type, 'created');
    if (constructor == null) {
      dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
    }
    _interceptors.getNativeInterceptor(html$.Element.tag('article'));
    let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
    if (baseClassName == null) {
      dart.throw(new core.ArgumentError(type));
    }
    if (extendsTagName == null) {
      if (baseClassName != 'HTMLElement') {
        dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
      }
    } else {
      if (!(document.createElement(extendsTagName) instanceof window[baseClassName])) {
        dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
      }
    }
    let baseConstructor = context[baseClassName];
    let properties = {};
    properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
    properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
    properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
    properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
    let baseProto = baseConstructor.prototype;
    let proto = Object.create(baseProto, properties);
    _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
    let options = {prototype: proto};
    if (extendsTagName != null) {
      options.extends = extendsTagName;
    }
    document.registerElement(tag, options);
  };
  dart.fn(html$._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
  html$._initializeCustomElement = function(e) {
  };
  dart.fn(html$._initializeCustomElement, ElementTovoid$());
  const _interceptor = Symbol('_interceptor');
  const _constructor = Symbol('_constructor');
  const _nativeType = Symbol('_nativeType');
  html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
    new(document, type, extendsTag) {
      this[_interceptor] = null;
      this[_constructor] = null;
      this[_nativeType] = null;
      let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
      if (interceptorClass == null) {
        dart.throw(new core.ArgumentError(type));
      }
      this[_constructor] = _interceptors.findConstructorForNativeSubclassType(type, 'created');
      if (this[_constructor] == null) {
        dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
      }
      _interceptors.getNativeInterceptor(html$.Element.tag('article'));
      let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
      if (baseClassName == null) {
        dart.throw(new core.ArgumentError(type));
      }
      if (extendsTag == null) {
        if (!dart.equals(baseClassName, 'HTMLElement')) {
          dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
        }
        this[_nativeType] = dart.wrapType(html$.HtmlElement);
      } else {
        let element = document[dartx.createElement](extendsTag);
        if (!(element instanceof window[baseClassName])) {
          dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
        }
        this[_nativeType] = dart.runtimeType(element);
      }
      this[_interceptor] = interceptorClass.prototype;
    }
    upgrade(element) {
      if (!dart.equals(dart.runtimeType(element), this[_nativeType])) {
        dart.throw(new core.ArgumentError(dart.str`element is not subclass of ${this[_nativeType]}`));
      }
      _js_helper.setNativeSubclassDispatchRecord(element, this[_interceptor]);
      this[_constructor](element);
      return element;
    }
  };
  html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
  dart.setSignature(html$._JSElementUpgrader, {
    constructors: () => ({new: dart.definiteFunctionType(html$._JSElementUpgrader, [html$.Document, core.Type, core.String])}),
    fields: () => ({
      [_interceptor]: dart.dynamic,
      [_constructor]: dart.dynamic,
      [_nativeType]: dart.dynamic
    }),
    methods: () => ({upgrade: dart.definiteFunctionType(html$.Element, [html$.Element])})
  });
  html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
    get history() {
      return html$._HistoryCrossFrame._createSafe(this[_window].history);
    }
    get location() {
      return html$._LocationCrossFrame._createSafe(this[_window].location);
    }
    get closed() {
      return this[_window].closed;
    }
    get opener() {
      return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
    }
    get parent() {
      return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
    }
    get top() {
      return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
    }
    close() {
      return this[_window].close();
    }
    postMessage(message, targetOrigin, messagePorts) {
      if (messagePorts === void 0) messagePorts = null;
      if (messagePorts == null) {
        this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin);
      } else {
        this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
      }
    }
    new(window) {
      this[_window] = window;
    }
    static _createSafe(w) {
      if (core.identical(w, html$.window)) {
        return html$.WindowBase._check(w);
      } else {
        return new html$._DOMWindowCrossFrame(w);
      }
    }
    get on() {
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    [_addEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    addEventListener(type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    dispatchEvent(event) {
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    [_removeEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    removeEventListener(type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
  };
  html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
  dart.setSignature(html$._DOMWindowCrossFrame, {
    constructors: () => ({new: dart.definiteFunctionType(html$._DOMWindowCrossFrame, [dart.dynamic])}),
    fields: () => ({[_window]: dart.dynamic}),
    getters: () => ({
      history: dart.definiteFunctionType(html$.HistoryBase, []),
      location: dart.definiteFunctionType(html$.LocationBase, []),
      closed: dart.definiteFunctionType(core.bool, []),
      opener: dart.definiteFunctionType(html$.WindowBase, []),
      parent: dart.definiteFunctionType(html$.WindowBase, []),
      top: dart.definiteFunctionType(html$.WindowBase, []),
      on: dart.definiteFunctionType(html$.Events, [])
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [core.List]),
      [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      addEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      dispatchEvent: dart.definiteFunctionType(core.bool, [html$.Event]),
      [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
    }),
    statics: () => ({_createSafe: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])}),
    names: ['_createSafe']
  });
  dart.defineExtensionMembers(html$._DOMWindowCrossFrame, [
    'close',
    'postMessage',
    'history',
    'location',
    'closed',
    'opener',
    'parent',
    'top'
  ]);
  html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
    set href(val) {
      return html$._LocationCrossFrame._setHref(this[_location], val);
    }
    static _setHref(location, val) {
      location.href = val;
    }
    new(location) {
      this[_location] = location;
    }
    static _createSafe(location) {
      if (core.identical(location, html$.window[dartx.location])) {
        return html$.LocationBase._check(location);
      } else {
        return new html$._LocationCrossFrame(location);
      }
    }
  };
  html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
  dart.setSignature(html$._LocationCrossFrame, {
    constructors: () => ({new: dart.definiteFunctionType(html$._LocationCrossFrame, [dart.dynamic])}),
    fields: () => ({[_location]: dart.dynamic}),
    setters: () => ({href: dart.definiteFunctionType(dart.void, [core.String])}),
    statics: () => ({
      _setHref: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      _createSafe: dart.definiteFunctionType(html$.LocationBase, [dart.dynamic])
    }),
    names: ['_setHref', '_createSafe']
  });
  dart.defineExtensionMembers(html$._LocationCrossFrame, ['href']);
  const _history = Symbol('_history');
  html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
    back() {
      return this[_history].back();
    }
    forward() {
      return this[_history].forward();
    }
    go(distance) {
      return this[_history].go(distance);
    }
    new(history) {
      this[_history] = history;
    }
    static _createSafe(h) {
      if (core.identical(h, html$.window[dartx.history])) {
        return html$.HistoryBase._check(h);
      } else {
        return new html$._HistoryCrossFrame(h);
      }
    }
  };
  html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
  dart.setSignature(html$._HistoryCrossFrame, {
    constructors: () => ({new: dart.definiteFunctionType(html$._HistoryCrossFrame, [dart.dynamic])}),
    fields: () => ({[_history]: dart.dynamic}),
    methods: () => ({
      back: dart.definiteFunctionType(dart.void, []),
      forward: dart.definiteFunctionType(dart.void, []),
      go: dart.definiteFunctionType(dart.void, [core.int])
    }),
    statics: () => ({_createSafe: dart.definiteFunctionType(html$.HistoryBase, [dart.dynamic])}),
    names: ['_createSafe']
  });
  dart.defineExtensionMembers(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
  html$.Platform = class Platform extends core.Object {};
  dart.setSignature(html$.Platform, {
    sfields: () => ({
      supportsTypedData: core.bool,
      supportsSimd: core.bool
    })
  });
  html$.Platform.supportsSimd = false;
  dart.defineLazy(html$.Platform, {
    get supportsTypedData() {
      return !!window.ArrayBuffer;
    }
  });
  html$._wrapZoneCallback$ = dart.generic((A, R) => {
    const _wrapZoneCallback = dart.typedef('_wrapZoneCallback', () => dart.functionType(R, [A]));
    return _wrapZoneCallback;
  });
  html$._wrapZoneCallback = _wrapZoneCallback();
  html$._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
    const _wrapZoneBinaryCallback = dart.typedef('_wrapZoneBinaryCallback', () => dart.functionType(R, [A, B]));
    return _wrapZoneBinaryCallback;
  });
  html$._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
  html$._wrapZone = function(A, R) {
    return callback => {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
      if (callback == null) return null;
      return async.Zone.current.bindUnaryCallback(R, A)(callback, {runGuarded: true});
    };
  };
  dart.fn(html$._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
  html$._wrapBinaryZone = function(A, B, R) {
    return callback => {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
      if (callback == null) return null;
      return async.Zone.current.bindBinaryCallback(R, A, B)(callback, {runGuarded: true});
    };
  };
  dart.fn(html$._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
  html$.query = function(relativeSelectors) {
    return html$.document[dartx.query](relativeSelectors);
  };
  dart.fn(html$.query, StringToElement());
  html$.queryAll = function(relativeSelectors) {
    return html$.document[dartx.queryAll](html$.Element)(relativeSelectors);
  };
  dart.fn(html$.queryAll, StringToElementListOfElement());
  html$.querySelector = function(selectors) {
    return html$.document[dartx.querySelector](selectors);
  };
  dart.fn(html$.querySelector, StringToElement());
  html$.querySelectorAll = function(selectors) {
    return html$.document[dartx.querySelectorAll](html$.Element)(selectors);
  };
  dart.fn(html$.querySelectorAll, StringToElementListOfElement());
  html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
  html$.NodeValidator = class NodeValidator extends core.Object {
    static new(opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      return new html$._Html5NodeValidator({uriPolicy: uriPolicy});
    }
    static throws(base) {
      return new html$._ThrowsNodeValidator(base);
    }
  };
  dart.setSignature(html$.NodeValidator, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.NodeValidator, [], {uriPolicy: html$.UriPolicy}),
      throws: dart.definiteFunctionType(html$.NodeValidator, [html$.NodeValidator])
    })
  });
  html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
    static new(validator) {
      return new html$._ValidatingTreeSanitizer(validator);
    }
  };
  dart.setSignature(html$.NodeTreeSanitizer, {
    constructors: () => ({new: dart.definiteFunctionType(html$.NodeTreeSanitizer, [html$.NodeValidator])}),
    sfields: () => ({trusted: html$._TrustedHtmlTreeSanitizer})
  });
  dart.defineLazy(html$.NodeTreeSanitizer, {
    get trusted() {
      return dart.const(new html$._TrustedHtmlTreeSanitizer());
    }
  });
  html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
    new() {
    }
    sanitizeTree(node) {}
  };
  html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
  dart.setSignature(html$._TrustedHtmlTreeSanitizer, {
    constructors: () => ({new: dart.definiteFunctionType(html$._TrustedHtmlTreeSanitizer, [])}),
    methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node])})
  });
  html$.UriPolicy = class UriPolicy extends core.Object {
    static new() {
      return new html$._SameOriginUriPolicy();
    }
  };
  dart.setSignature(html$.UriPolicy, {
    constructors: () => ({new: dart.definiteFunctionType(html$.UriPolicy, [])})
  });
  const _hiddenAnchor = Symbol('_hiddenAnchor');
  const _loc = Symbol('_loc');
  html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
    new() {
      this[_hiddenAnchor] = html$.AnchorElement.new();
      this[_loc] = html$.window[dartx.location];
    }
    allowsUri(uri) {
      this[_hiddenAnchor][dartx.href] = uri;
      return this[_hiddenAnchor][dartx.hostname] == this[_loc][dartx.hostname] && this[_hiddenAnchor][dartx.port] == this[_loc][dartx.port] && this[_hiddenAnchor][dartx.protocol] == this[_loc][dartx.protocol] || this[_hiddenAnchor][dartx.hostname] == '' && this[_hiddenAnchor][dartx.port] == '' && (this[_hiddenAnchor][dartx.protocol] == ':' || this[_hiddenAnchor][dartx.protocol] == '');
    }
  };
  html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
  dart.setSignature(html$._SameOriginUriPolicy, {
    fields: () => ({
      [_hiddenAnchor]: html$.AnchorElement,
      [_loc]: html$.Location
    }),
    methods: () => ({allowsUri: dart.definiteFunctionType(core.bool, [core.String])})
  });
  html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
    new(validator) {
      this.validator = validator;
    }
    allowsElement(element) {
      if (!dart.test(this.validator.allowsElement(element))) {
        dart.throw(new core.ArgumentError(html$.Element._safeTagName(element)));
      }
      return true;
    }
    allowsAttribute(element, attributeName, value) {
      if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
        dart.throw(new core.ArgumentError(dart.str`${html$.Element._safeTagName(element)}[${attributeName}="${value}"]`));
      }
    }
  };
  html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._ThrowsNodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ThrowsNodeValidator, [html$.NodeValidator])}),
    fields: () => ({validator: html$.NodeValidator}),
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  const _removeNode = Symbol('_removeNode');
  const _sanitizeElement = Symbol('_sanitizeElement');
  const _sanitizeUntrustedElement = Symbol('_sanitizeUntrustedElement');
  html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
    new(validator) {
      this.validator = validator;
    }
    sanitizeTree(node) {
      const walk = (function(node, parent) {
        this.sanitizeNode(node, parent);
        let child = node[dartx.lastChild];
        while (child != null) {
          let nextChild = child[dartx.previousNode];
          walk(child, node);
          child = nextChild;
        }
      }).bind(this);
      dart.fn(walk, NodeAndNodeTovoid());
      walk(node, null);
    }
    [_removeNode](node, parent) {
      if (parent == null) {
        node[dartx.remove]();
      } else {
        parent[_removeChild](node);
      }
    }
    [_sanitizeUntrustedElement](element, parent) {
      let corrupted = true;
      let attrs = null;
      let isAttr = null;
      try {
        attrs = dart.dload(element, 'attributes');
        isAttr = dart.dindex(attrs, 'is');
        let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
        corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
      } catch (e) {
      }

      let elementText = 'element unprintable';
      try {
        elementText = dart.toString(element);
      } catch (e) {
      }

      try {
        let elementTagName = html$.Element._safeTagName(element);
        this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
      } catch (e$) {
        if (core.ArgumentError.is(e$)) {
          throw e$;
        } else {
          let e = e$;
          this[_removeNode](html$.Node._check(element), parent);
          html$.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
        }
      }

    }
    [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
      if (false != corrupted) {
        this[_removeNode](element, parent);
        html$.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
        return;
      }
      if (!dart.test(this.validator.allowsElement(element))) {
        this[_removeNode](element, parent);
        html$.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
        return;
      }
      if (isAttr != null) {
        if (!dart.test(this.validator.allowsAttribute(element, 'is', isAttr))) {
          this[_removeNode](element, parent);
          html$.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
          return;
        }
      }
      let keys = attrs[dartx.keys][dartx.toList]();
      for (let i = dart.notNull(attrs[dartx.length]) - 1; i >= 0; --i) {
        let name = keys[dartx._get](i);
        if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase')), core.String._check(attrs[dartx._get](name))))) {
          html$.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
          attrs[dartx.remove](name);
        }
      }
      if (html$.TemplateElement.is(element)) {
        let template = element;
        this.sanitizeTree(template[dartx.content]);
      }
    }
    sanitizeNode(node, parent) {
      switch (node[dartx.nodeType]) {
        case html$.Node.ELEMENT_NODE:
        {
          this[_sanitizeUntrustedElement](node, parent);
          break;
        }
        case html$.Node.COMMENT_NODE:
        case html$.Node.DOCUMENT_FRAGMENT_NODE:
        case html$.Node.TEXT_NODE:
        case html$.Node.CDATA_SECTION_NODE:
        {
          break;
        }
        default:
        {
          this[_removeNode](node, parent);
        }
      }
    }
  };
  html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
  dart.setSignature(html$._ValidatingTreeSanitizer, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ValidatingTreeSanitizer, [html$.NodeValidator])}),
    fields: () => ({validator: html$.NodeValidator}),
    methods: () => ({
      sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node]),
      [_removeNode]: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node]),
      [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
      [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
      sanitizeNode: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])
    })
  });
  html_common.convertDartToNative_SerializedScriptValue = function(value) {
    return html_common.convertDartToNative_PrepareForStructuredClone(value);
  };
  dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic$());
  html_common.convertNativeToDart_SerializedScriptValue = function(object) {
    return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
  };
  dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic$());
  html_common._StructuredClone = class _StructuredClone extends core.Object {
    new() {
      this.values = [];
      this.copies = [];
    }
    findSlot(value) {
      let length = this.values[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (core.identical(this.values[dartx._get](i), value)) return i;
      }
      this.values[dartx.add](value);
      this.copies[dartx.add](null);
      return length;
    }
    readSlot(i) {
      return this.copies[dartx._get](i);
    }
    writeSlot(i, x) {
      this.copies[dartx._set](i, x);
    }
    cleanupSlots() {}
    walk(e) {
      if (e == null) return e;
      if (typeof e == 'boolean') return e;
      if (typeof e == 'number') return e;
      if (typeof e == 'string') return e;
      if (core.DateTime.is(e)) {
        return html_common.convertDartToNative_DateTime(e);
      }
      if (core.RegExp.is(e)) {
        dart.throw(new core.UnimplementedError('structured clone of RegExp'));
      }
      if (html$.File.is(e)) return e;
      if (html$.Blob.is(e)) return e;
      if (html$.FileList.is(e)) return e;
      if (html$.ImageData.is(e)) return e;
      if (dart.test(this.cloneNotRequired(e))) return e;
      if (core.Map.is(e)) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        copy = this.newJsMap();
        this.writeSlot(slot, copy);
        e[dartx.forEach](dart.fn((key, value) => {
          this.putIntoMap(copy, key, this.walk(value));
        }, dynamicAnddynamicTovoid$()));
        return copy;
      }
      if (core.List.is(e)) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        copy = this.copyList(e, slot);
        return copy;
      }
      dart.throw(new core.UnimplementedError('structured clone of other type'));
    }
    copyList(e, slot) {
      let i = 0;
      let length = e[dartx.length];
      let copy = this.newJsList(length);
      this.writeSlot(slot, copy);
      for (; i < dart.notNull(length); i++) {
        dart.dsetindex(copy, i, this.walk(e[dartx._get](i)));
      }
      return copy;
    }
    convertDartToNative_PrepareForStructuredClone(value) {
      let copy = this.walk(value);
      this.cleanupSlots();
      return copy;
    }
  };
  dart.setSignature(html_common._StructuredClone, {
    fields: () => ({
      values: core.List,
      copies: core.List
    }),
    methods: () => ({
      findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
      readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
      writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
      cleanupSlots: dart.definiteFunctionType(dart.dynamic, []),
      walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      copyList: dart.definiteFunctionType(dart.dynamic, [core.List, core.int]),
      convertDartToNative_PrepareForStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  html_common._AcceptStructuredClone = class _AcceptStructuredClone extends core.Object {
    new() {
      this.values = [];
      this.copies = [];
      this.mustCopy = false;
    }
    findSlot(value) {
      let length = this.values[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.test(this.identicalInJs(this.values[dartx._get](i), value))) return i;
      }
      this.values[dartx.add](value);
      this.copies[dartx.add](null);
      return length;
    }
    readSlot(i) {
      return this.copies[dartx._get](i);
    }
    writeSlot(i, x) {
      this.copies[dartx._set](i, x);
    }
    walk(e) {
      if (e == null) return e;
      if (typeof e == 'boolean') return e;
      if (typeof e == 'number') return e;
      if (typeof e == 'string') return e;
      if (dart.test(html_common.isJavaScriptDate(e))) {
        return html_common.convertNativeToDart_DateTime(e);
      }
      if (dart.test(html_common.isJavaScriptRegExp(e))) {
        dart.throw(new core.UnimplementedError('structured clone of RegExp'));
      }
      if (dart.test(html_common.isJavaScriptPromise(e))) {
        return html_common.convertNativePromiseToDartFuture(e);
      }
      if (dart.test(html_common.isJavaScriptSimpleObject(e))) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        copy = dart.map();
        this.writeSlot(slot, copy);
        this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic$()));
        return copy;
      }
      if (dart.test(html_common.isJavaScriptArray(e))) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        let length = core.int._check(dart.dload(e, 'length'));
        copy = dart.test(this.mustCopy) ? this.newDartList(length) : e;
        this.writeSlot(slot, copy);
        for (let i = 0; i < dart.notNull(length); i++) {
          dart.dsetindex(copy, i, this.walk(dart.dindex(e, i)));
        }
        return copy;
      }
      return e;
    }
    convertNativeToDart_AcceptStructuredClone(object, opts) {
      let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
      this.mustCopy = core.bool._check(mustCopy);
      let copy = this.walk(object);
      return copy;
    }
  };
  dart.setSignature(html_common._AcceptStructuredClone, {
    fields: () => ({
      values: core.List,
      copies: core.List,
      mustCopy: core.bool
    }),
    methods: () => ({
      findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
      readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
      writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
      walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      convertNativeToDart_AcceptStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})
    })
  });
  html_common.ContextAttributes = class ContextAttributes extends core.Object {
    new(alpha, antialias, depth, failIfMajorPerformanceCaveat, premultipliedAlpha, preserveDrawingBuffer, stencil) {
      this.alpha = alpha;
      this.antialias = antialias;
      this.depth = depth;
      this.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
      this.premultipliedAlpha = premultipliedAlpha;
      this.preserveDrawingBuffer = preserveDrawingBuffer;
      this.stencil = stencil;
    }
  };
  dart.setSignature(html_common.ContextAttributes, {
    constructors: () => ({new: dart.definiteFunctionType(html_common.ContextAttributes, [core.bool, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool])}),
    fields: () => ({
      alpha: core.bool,
      antialias: core.bool,
      depth: core.bool,
      premultipliedAlpha: core.bool,
      preserveDrawingBuffer: core.bool,
      stencil: core.bool,
      failIfMajorPerformanceCaveat: core.bool
    })
  });
  html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
    return new html_common.ContextAttributes(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
  };
  dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic$());
  html_common._TypedImageData = class _TypedImageData extends core.Object {
    new(data, height, width) {
      this.data = data;
      this.height = height;
      this.width = width;
    }
  };
  html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
  dart.setSignature(html_common._TypedImageData, {
    constructors: () => ({new: dart.definiteFunctionType(html_common._TypedImageData, [typed_data.Uint8ClampedList, core.int, core.int])}),
    fields: () => ({
      data: typed_data.Uint8ClampedList,
      height: core.int,
      width: core.int
    })
  });
  html_common.convertNativeToDart_ImageData = function(nativeImageData) {
    0;
    if (html$.ImageData.is(nativeImageData)) {
      let data = nativeImageData[dartx.data];
      if (data.constructor === Array) {
        if (typeof CanvasPixelArray !== "undefined") {
          data.constructor = CanvasPixelArray;
          data.BYTES_PER_ELEMENT = 1;
        }
      }
      return nativeImageData;
    }
    return new html_common._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
  };
  dart.fn(html_common.convertNativeToDart_ImageData, dynamicToImageData());
  html_common.convertDartToNative_ImageData = function(imageData) {
    if (html_common._TypedImageData.is(imageData)) {
      return {data: imageData.data, height: imageData.height, width: imageData.width};
    }
    return imageData;
  };
  dart.fn(html_common.convertDartToNative_ImageData, ImageDataTodynamic());
  html_common._serializedScriptValue = 'num|String|bool|' + 'JSExtendableArray|=Object|' + 'Blob|File|NativeByteBuffer|NativeTypedData';
  html_common.annotation_Creates_SerializedScriptValue = dart.const(new _js_helper.Creates(html_common._serializedScriptValue));
  html_common.annotation_Returns_SerializedScriptValue = dart.const(new _js_helper.Returns(html_common._serializedScriptValue));
  html_common.convertNativeToDart_Dictionary = function(object) {
    if (object == null) return null;
    let dict = dart.map();
    let keys = Object.getOwnPropertyNames(object);
    for (let key of core.Iterable._check(keys)) {
      dict[dartx._set](key, object[key]);
    }
    return dict;
  };
  dart.fn(html_common.convertNativeToDart_Dictionary, dynamicToMap());
  html_common.convertDartToNative_Dictionary = function(dict, postCreate) {
    if (postCreate === void 0) postCreate = null;
    if (dict == null) return null;
    let object = {};
    if (postCreate != null) {
      dart.dcall(postCreate, object);
    }
    dict[dartx.forEach](dart.fn((key, value) => {
      object[key] = value;
    }, StringAnddynamicTovoid()));
    return object;
  };
  dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
  html_common.convertDartToNative_StringArray = function(input) {
    return input;
  };
  dart.fn(html_common.convertDartToNative_StringArray, ListOfStringToList());
  html_common.convertNativeToDart_DateTime = function(date) {
    let millisSinceEpoch = date.getTime();
    return new core.DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, {isUtc: true});
  };
  dart.fn(html_common.convertNativeToDart_DateTime, dynamicToDateTime());
  html_common.convertDartToNative_DateTime = function(date) {
    return new Date(date.millisecondsSinceEpoch);
  };
  dart.fn(html_common.convertDartToNative_DateTime, DateTimeTodynamic());
  html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
    return new html_common._StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
  };
  dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic$());
  html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
    let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
    return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
  };
  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic$0());
  html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
    new() {
      super.new();
    }
    newJsMap() {
      return {};
    }
    putIntoMap(map, key, value) {
      return map[key] = value;
    }
    newJsList(length) {
      return new Array(length);
    }
    cloneNotRequired(e) {
      return _native_typed_data.NativeByteBuffer.is(e) || _native_typed_data.NativeTypedData.is(e);
    }
  };
  dart.setSignature(html_common._StructuredCloneDart2Js, {
    methods: () => ({
      newJsMap: dart.definiteFunctionType(dart.dynamic, []),
      putIntoMap: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      newJsList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      cloneNotRequired: dart.definiteFunctionType(core.bool, [dart.dynamic])
    })
  });
  html_common._AcceptStructuredCloneDart2Js = class _AcceptStructuredCloneDart2Js extends html_common._AcceptStructuredClone {
    new() {
      super.new();
    }
    newJsList(length) {
      return new Array(length);
    }
    newDartList(length) {
      return this.newJsList(length);
    }
    identicalInJs(a, b) {
      return core.identical(a, b);
    }
    forEachJsField(object, action) {
      for (let key of Object.keys(object)) {
        dart.dcall(action, key, object[key]);
      }
    }
  };
  dart.setSignature(html_common._AcceptStructuredCloneDart2Js, {
    methods: () => ({
      newJsList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      newDartList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      identicalInJs: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      forEachJsField: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
    })
  });
  html_common.isJavaScriptDate = function(value) {
    return value instanceof Date;
  };
  dart.fn(html_common.isJavaScriptDate, dynamicTobool$());
  html_common.isJavaScriptRegExp = function(value) {
    return value instanceof RegExp;
  };
  dart.fn(html_common.isJavaScriptRegExp, dynamicTobool$());
  html_common.isJavaScriptArray = function(value) {
    return value instanceof Array;
  };
  dart.fn(html_common.isJavaScriptArray, dynamicTobool$());
  html_common.isJavaScriptSimpleObject = function(value) {
    let proto = Object.getPrototypeOf(value);
    return proto === Object.prototype || proto === null;
  };
  dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool$());
  html_common.isImmutableJavaScriptArray = function(value) {
    return !!value.immutable$list;
  };
  dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool$());
  html_common.isJavaScriptPromise = function(value) {
    return typeof Promise != "undefined" && value instanceof Promise;
  };
  dart.fn(html_common.isJavaScriptPromise, dynamicTobool$());
  html_common.convertNativePromiseToDartFuture = function(promise) {
    let completer = async.Completer.new();
    let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid$()), 1);
    let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid$()), 1);
    let newPromise = promise.then(then).catch(error);
    return completer.future;
  };
  dart.fn(html_common.convertNativePromiseToDartFuture, dynamicToFuture());
  html_common.Device = class Device extends core.Object {
    static get userAgent() {
      return html$.window[dartx.navigator][dartx.userAgent];
    }
    static get isOpera() {
      if (html_common.Device._isOpera == null) {
        html_common.Device._isOpera = html_common.Device.userAgent[dartx.contains]("Opera", 0);
      }
      return html_common.Device._isOpera;
    }
    static get isIE() {
      if (html_common.Device._isIE == null) {
        html_common.Device._isIE = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("Trident/", 0));
      }
      return html_common.Device._isIE;
    }
    static get isFirefox() {
      if (html_common.Device._isFirefox == null) {
        html_common.Device._isFirefox = html_common.Device.userAgent[dartx.contains]("Firefox", 0);
      }
      return html_common.Device._isFirefox;
    }
    static get isWebKit() {
      if (html_common.Device._isWebKit == null) {
        html_common.Device._isWebKit = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("WebKit", 0));
      }
      return html_common.Device._isWebKit;
    }
    static get cssPrefix() {
      let prefix = html_common.Device._cachedCssPrefix;
      if (prefix != null) return prefix;
      if (dart.test(html_common.Device.isFirefox)) {
        prefix = '-moz-';
      } else if (dart.test(html_common.Device.isIE)) {
        prefix = '-ms-';
      } else if (dart.test(html_common.Device.isOpera)) {
        prefix = '-o-';
      } else {
        prefix = '-webkit-';
      }
      return html_common.Device._cachedCssPrefix = prefix;
    }
    static get propertyPrefix() {
      let prefix = html_common.Device._cachedPropertyPrefix;
      if (prefix != null) return prefix;
      if (dart.test(html_common.Device.isFirefox)) {
        prefix = 'moz';
      } else if (dart.test(html_common.Device.isIE)) {
        prefix = 'ms';
      } else if (dart.test(html_common.Device.isOpera)) {
        prefix = 'o';
      } else {
        prefix = 'webkit';
      }
      return html_common.Device._cachedPropertyPrefix = prefix;
    }
    static isEventTypeSupported(eventType) {
      try {
        let e = html$.Event.eventType(eventType, '');
        return html$.Event.is(e);
      } catch (_) {
      }

      return false;
    }
  };
  dart.setSignature(html_common.Device, {
    sfields: () => ({
      _isOpera: core.bool,
      _isIE: core.bool,
      _isFirefox: core.bool,
      _isWebKit: core.bool,
      _cachedCssPrefix: core.String,
      _cachedPropertyPrefix: core.String
    }),
    sgetters: () => ({
      userAgent: dart.definiteFunctionType(core.String, []),
      isOpera: dart.definiteFunctionType(core.bool, []),
      isIE: dart.definiteFunctionType(core.bool, []),
      isFirefox: dart.definiteFunctionType(core.bool, []),
      isWebKit: dart.definiteFunctionType(core.bool, []),
      cssPrefix: dart.definiteFunctionType(core.String, []),
      propertyPrefix: dart.definiteFunctionType(core.String, [])
    }),
    statics: () => ({isEventTypeSupported: dart.definiteFunctionType(core.bool, [core.String])}),
    names: ['isEventTypeSupported']
  });
  html_common.Device._isOpera = null;
  html_common.Device._isIE = null;
  html_common.Device._isFirefox = null;
  html_common.Device._isWebKit = null;
  html_common.Device._cachedCssPrefix = null;
  html_common.Device._cachedPropertyPrefix = null;
  const _childNodes = Symbol('_childNodes');
  const _node = Symbol('_node');
  const _iterable$0 = Symbol('_iterable');
  const _filtered = Symbol('_filtered');
  html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
    new(node) {
      this[_childNodes] = node[dartx.nodes];
      this[_node] = node;
    }
    get [_iterable$0]() {
      return this[_childNodes][dartx.where](dart.fn(n => html$.Element.is(n), NodeTobool$()))[dartx.map](html$.Element)(dart.fn(n => html$.Element.as(n), NodeToElement()));
    }
    get [_filtered]() {
      return ListOfElement().from(this[_iterable$0], {growable: false});
    }
    forEach(f) {
      this[_filtered][dartx.forEach](f);
    }
    _set(index, value) {
      this._get(index)[dartx.replaceWith](value);
      return value;
    }
    set length(newLength) {
      let len = this.length;
      if (dart.notNull(newLength) >= dart.notNull(len)) {
        return;
      } else if (dart.notNull(newLength) < 0) {
        dart.throw(new core.ArgumentError("Invalid list length"));
      }
      this.removeRange(newLength, len);
    }
    add(value) {
      this[_childNodes][dartx.add](value);
    }
    addAll(iterable) {
      for (let element of iterable) {
        this.add(element);
      }
    }
    contains(needle) {
      if (!html$.Element.is(needle)) return false;
      let element = html$.Element._check(needle);
      return dart.equals(element[dartx.parentNode], this[_node]);
    }
    get reversed() {
      return this[_filtered][dartx.reversed];
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError('Cannot sort filtered list'));
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError('Cannot setRange on filtered list'));
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      dart.throw(new core.UnsupportedError('Cannot fillRange on filtered list'));
    }
    replaceRange(start, end, iterable) {
      dart.throw(new core.UnsupportedError('Cannot replaceRange on filtered list'));
    }
    removeRange(start, end) {
      core.List.from(this[_iterable$0][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid$()));
    }
    clear() {
      this[_childNodes][dartx.clear]();
    }
    removeLast() {
      let result = this[_iterable$0][dartx.last];
      if (result != null) {
        result[dartx.remove]();
      }
      return result;
    }
    insert(index, value) {
      if (index == this.length) {
        this.add(value);
      } else {
        let element = this[_iterable$0][dartx.elementAt](index);
        element[dartx.parentNode][dartx.insertBefore](value, element);
      }
    }
    insertAll(index, iterable) {
      if (index == this.length) {
        this.addAll(iterable);
      } else {
        let element = this[_iterable$0][dartx.elementAt](index);
        element[dartx.parentNode][dartx.insertAllBefore](iterable, element);
      }
    }
    removeAt(index) {
      let result = this._get(index);
      result[dartx.remove]();
      return result;
    }
    remove(element) {
      if (!html$.Element.is(element)) return false;
      if (dart.test(this.contains(element))) {
        html$.Element.as(element)[dartx.remove]();
        return true;
      } else {
        return false;
      }
    }
    get length() {
      return this[_iterable$0][dartx.length];
    }
    _get(index) {
      return this[_iterable$0][dartx.elementAt](index);
    }
    get iterator() {
      return this[_filtered][dartx.iterator];
    }
    get rawList() {
      return this[_node][dartx.childNodes];
    }
  };
  dart.addSimpleTypeTests(html_common.FilteredElementList);
  html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(html_common.FilteredElementList, {
    constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html$.Node])}),
    fields: () => ({
      [_node]: html$.Node,
      [_childNodes]: ListOfNode()
    }),
    getters: () => ({
      [_iterable$0]: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
      [_filtered]: dart.definiteFunctionType(core.List$(html$.Element), []),
      reversed: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
      length: dart.definiteFunctionType(core.int, []),
      iterator: dart.definiteFunctionType(core.Iterator$(html$.Element), []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      forEach: dart.definiteFunctionType(dart.void, [ElementTovoid()]),
      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      add: dart.definiteFunctionType(dart.void, [html$.Element]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfElement()]),
      sort: dart.definiteFunctionType(dart.void, [], [ElementAndElementToint()]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()], [core.int]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.Element]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()]),
      removeLast: dart.definiteFunctionType(html$.Element, []),
      insert: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfElement()]),
      removeAt: dart.definiteFunctionType(html$.Element, [core.int]),
      _get: dart.definiteFunctionType(html$.Element, [core.int])
    })
  });
  dart.defineExtensionMembers(html_common.FilteredElementList, [
    'forEach',
    '_set',
    'add',
    'addAll',
    'contains',
    'sort',
    'setRange',
    'fillRange',
    'replaceRange',
    'removeRange',
    'clear',
    'removeLast',
    'insert',
    'insertAll',
    'removeAt',
    'remove',
    '_get',
    'length',
    'reversed',
    'length',
    'iterator'
  ]);
  html_common.Lists = class Lists extends core.Object {
    static indexOf(a, element, startIndex, endIndex) {
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        return -1;
      }
      if (dart.notNull(startIndex) < 0) {
        startIndex = 0;
      }
      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static lastIndexOf(a, element, startIndex) {
      if (dart.notNull(startIndex) < 0) {
        return -1;
      }
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        startIndex = dart.notNull(a[dartx.length]) - 1;
      }
      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static getRange(a, start, end, accumulator) {
      if (dart.notNull(start) < 0) dart.throw(new core.RangeError.value(start));
      if (dart.notNull(end) < dart.notNull(start)) dart.throw(new core.RangeError.value(end));
      if (dart.notNull(end) > dart.notNull(a[dartx.length])) dart.throw(new core.RangeError.value(end));
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        accumulator[dartx.add](a[dartx._get](i));
      }
      return accumulator;
    }
  };
  dart.setSignature(html_common.Lists, {
    statics: () => ({
      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
      getRange: dart.definiteFunctionType(core.List, [core.List, core.int, core.int, core.List])
    }),
    names: ['indexOf', 'lastIndexOf', 'getRange']
  });
  html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
  svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
    static createSvgElement_tag(tag) {
      let temp = html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
      return svg$.SvgElement._check(temp);
    }
  };
  dart.setSignature(svg$._SvgElementFactoryProvider, {
    statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg$.SvgElement, [core.String])}),
    names: ['createSvgElement_tag']
  });
  const _children$ = Symbol('_children');
  const _svgClassName = Symbol('_svgClassName');
  dart.defineExtensionNames([
    'classes',
    'children',
    'children',
    'outerHtml',
    'innerHtml',
    'innerHtml',
    'createFragment',
    'insertAdjacentText',
    'insertAdjacentHtml',
    'insertAdjacentElement',
    'isContentEditable',
    'click',
    'blur',
    'focus',
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onVolumeChange',
    'onWaiting',
    'ownerSvgElement',
    'viewportElement'
  ]);
  svg$.SvgElement = class SvgElement extends html$.Element {
    static tag(tag) {
      return svg$.SvgElement._check(html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
    }
    static svg(svg, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (validator == null && treeSanitizer == null) {
        validator = new html$.NodeValidatorBuilder.common();
        validator.allowSvg();
      }
      let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
      let parentElement = null;
      if (match != null && match.group(1)[dartx.toLowerCase]() == 'svg') {
        parentElement = html$.document[dartx.body];
      } else {
        parentElement = svg$.SvgSvgElement.new();
      }
      let fragment = dart.dsend(parentElement, 'createFragment', svg, {validator: validator, treeSanitizer: treeSanitizer});
      return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg$.SvgElement.is(e), dynamicTobool$())), 'single'));
    }
    get [dartx.classes]() {
      return new svg$._AttributeClassSet(this);
    }
    set [dartx.classes](value) {
      super[dartx.classes] = value;
    }
    get [dartx.children]() {
      return new html_common.FilteredElementList(this);
    }
    set [dartx.children](value) {
      let children = this[dartx.children];
      children[dartx.clear]();
      children[dartx.addAll](value);
    }
    get [dartx.outerHtml]() {
      let container = html$.Element.tag("div");
      let cloned = svg$.SvgElement._check(this[dartx.clone](true));
      container[dartx.children][dartx.add](cloned);
      return container[dartx.innerHtml];
    }
    get [dartx.innerHtml]() {
      let container = html$.Element.tag("div");
      let cloned = svg$.SvgElement._check(this[dartx.clone](true));
      container[dartx.children][dartx.addAll](cloned[dartx.children]);
      return container[dartx.innerHtml];
    }
    set [dartx.innerHtml](value) {
      this[dartx.setInnerHtml](value);
    }
    [dartx.createFragment](svg, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (treeSanitizer == null) {
        if (validator == null) {
          validator = new html$.NodeValidatorBuilder.common();
          validator.allowSvg();
        }
        treeSanitizer = html$.NodeTreeSanitizer.new(validator);
      }
      let html = dart.str`<svg version="1.1">${svg}</svg>`;
      let fragment = html$.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
      let svgFragment = html$.DocumentFragment.new();
      let root = fragment[dartx.nodes][dartx.single];
      while (root[dartx.firstChild] != null) {
        svgFragment[dartx.append](root[dartx.firstChild]);
      }
      return svgFragment;
    }
    [dartx.insertAdjacentText](where, text) {
      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentText on SVG."));
    }
    [dartx.insertAdjacentHtml](where, text, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentHtml on SVG."));
    }
    [dartx.insertAdjacentElement](where, element) {
      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentElement on SVG."));
    }
    get [_children$]() {
      dart.throw(new core.UnsupportedError("Cannot get _children on SVG."));
    }
    get [dartx.isContentEditable]() {
      return false;
    }
    [dartx.click]() {
      dart.throw(new core.UnsupportedError("Cannot invoke click SVG."));
    }
    static isTagSupported(tag) {
      let e = svg$.SvgElement.tag(tag);
      return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.ownerSvgElement] = null;
      this[dartx.viewportElement] = null;
      super.created();
    }
    get [_svgClassName]() {
      return this.className;
    }
    get [dartx.ownerSvgElement]() {
      return this.ownerSVGElement;
    }
    get [dartx.viewportElement]() {
      return this.viewportElement;
    }
    [dartx.blur](...args) {
      return this.blur.apply(this, args);
    }
    [dartx.focus](...args) {
      return this.focus.apply(this, args);
    }
    get [dartx.onAbort]() {
      return svg$.SvgElement.abortEvent.forElement(this);
    }
    get [dartx.onBlur]() {
      return svg$.SvgElement.blurEvent.forElement(this);
    }
    get [dartx.onCanPlay]() {
      return svg$.SvgElement.canPlayEvent.forElement(this);
    }
    get [dartx.onCanPlayThrough]() {
      return svg$.SvgElement.canPlayThroughEvent.forElement(this);
    }
    get [dartx.onChange]() {
      return svg$.SvgElement.changeEvent.forElement(this);
    }
    get [dartx.onClick]() {
      return svg$.SvgElement.clickEvent.forElement(this);
    }
    get [dartx.onContextMenu]() {
      return svg$.SvgElement.contextMenuEvent.forElement(this);
    }
    get [dartx.onDoubleClick]() {
      return svg$.SvgElement.doubleClickEvent.forElement(this);
    }
    get [dartx.onDrag]() {
      return svg$.SvgElement.dragEvent.forElement(this);
    }
    get [dartx.onDragEnd]() {
      return svg$.SvgElement.dragEndEvent.forElement(this);
    }
    get [dartx.onDragEnter]() {
      return svg$.SvgElement.dragEnterEvent.forElement(this);
    }
    get [dartx.onDragLeave]() {
      return svg$.SvgElement.dragLeaveEvent.forElement(this);
    }
    get [dartx.onDragOver]() {
      return svg$.SvgElement.dragOverEvent.forElement(this);
    }
    get [dartx.onDragStart]() {
      return svg$.SvgElement.dragStartEvent.forElement(this);
    }
    get [dartx.onDrop]() {
      return svg$.SvgElement.dropEvent.forElement(this);
    }
    get [dartx.onDurationChange]() {
      return svg$.SvgElement.durationChangeEvent.forElement(this);
    }
    get [dartx.onEmptied]() {
      return svg$.SvgElement.emptiedEvent.forElement(this);
    }
    get [dartx.onEnded]() {
      return svg$.SvgElement.endedEvent.forElement(this);
    }
    get [dartx.onError]() {
      return svg$.SvgElement.errorEvent.forElement(this);
    }
    get [dartx.onFocus]() {
      return svg$.SvgElement.focusEvent.forElement(this);
    }
    get [dartx.onInput]() {
      return svg$.SvgElement.inputEvent.forElement(this);
    }
    get [dartx.onInvalid]() {
      return svg$.SvgElement.invalidEvent.forElement(this);
    }
    get [dartx.onKeyDown]() {
      return svg$.SvgElement.keyDownEvent.forElement(this);
    }
    get [dartx.onKeyPress]() {
      return svg$.SvgElement.keyPressEvent.forElement(this);
    }
    get [dartx.onKeyUp]() {
      return svg$.SvgElement.keyUpEvent.forElement(this);
    }
    get [dartx.onLoad]() {
      return svg$.SvgElement.loadEvent.forElement(this);
    }
    get [dartx.onLoadedData]() {
      return svg$.SvgElement.loadedDataEvent.forElement(this);
    }
    get [dartx.onLoadedMetadata]() {
      return svg$.SvgElement.loadedMetadataEvent.forElement(this);
    }
    get [dartx.onMouseDown]() {
      return svg$.SvgElement.mouseDownEvent.forElement(this);
    }
    get [dartx.onMouseEnter]() {
      return svg$.SvgElement.mouseEnterEvent.forElement(this);
    }
    get [dartx.onMouseLeave]() {
      return svg$.SvgElement.mouseLeaveEvent.forElement(this);
    }
    get [dartx.onMouseMove]() {
      return svg$.SvgElement.mouseMoveEvent.forElement(this);
    }
    get [dartx.onMouseOut]() {
      return svg$.SvgElement.mouseOutEvent.forElement(this);
    }
    get [dartx.onMouseOver]() {
      return svg$.SvgElement.mouseOverEvent.forElement(this);
    }
    get [dartx.onMouseUp]() {
      return svg$.SvgElement.mouseUpEvent.forElement(this);
    }
    get [dartx.onMouseWheel]() {
      return svg$.SvgElement.mouseWheelEvent.forElement(this);
    }
    get [dartx.onPause]() {
      return svg$.SvgElement.pauseEvent.forElement(this);
    }
    get [dartx.onPlay]() {
      return svg$.SvgElement.playEvent.forElement(this);
    }
    get [dartx.onPlaying]() {
      return svg$.SvgElement.playingEvent.forElement(this);
    }
    get [dartx.onRateChange]() {
      return svg$.SvgElement.rateChangeEvent.forElement(this);
    }
    get [dartx.onReset]() {
      return svg$.SvgElement.resetEvent.forElement(this);
    }
    get [dartx.onResize]() {
      return svg$.SvgElement.resizeEvent.forElement(this);
    }
    get [dartx.onScroll]() {
      return svg$.SvgElement.scrollEvent.forElement(this);
    }
    get [dartx.onSeeked]() {
      return svg$.SvgElement.seekedEvent.forElement(this);
    }
    get [dartx.onSeeking]() {
      return svg$.SvgElement.seekingEvent.forElement(this);
    }
    get [dartx.onSelect]() {
      return svg$.SvgElement.selectEvent.forElement(this);
    }
    get [dartx.onStalled]() {
      return svg$.SvgElement.stalledEvent.forElement(this);
    }
    get [dartx.onSubmit]() {
      return svg$.SvgElement.submitEvent.forElement(this);
    }
    get [dartx.onSuspend]() {
      return svg$.SvgElement.suspendEvent.forElement(this);
    }
    get [dartx.onTimeUpdate]() {
      return svg$.SvgElement.timeUpdateEvent.forElement(this);
    }
    get [dartx.onVolumeChange]() {
      return svg$.SvgElement.volumeChangeEvent.forElement(this);
    }
    get [dartx.onWaiting]() {
      return svg$.SvgElement.waitingEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(svg$.SvgElement, 'created');
  svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers];
  dart.setSignature(svg$.SvgElement, {
    constructors: () => ({
      tag: dart.definiteFunctionType(svg$.SvgElement, [core.String]),
      svg: dart.definiteFunctionType(svg$.SvgElement, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      _: dart.definiteFunctionType(svg$.SvgElement, []),
      created: dart.definiteFunctionType(svg$.SvgElement, [])
    }),
    fields: () => ({
      [dartx.ownerSvgElement]: svg$.SvgSvgElement,
      [dartx.viewportElement]: svg$.SvgElement
    }),
    getters: () => ({
      [_children$]: dart.definiteFunctionType(html$.HtmlCollection, []),
      [_svgClassName]: dart.definiteFunctionType(svg$.AnimatedString, [])
    }),
    sfields: () => ({
      _START_TAG_REGEXP: core.RegExp,
      abortEvent: EventStreamProviderOfEvent(),
      blurEvent: EventStreamProviderOfEvent(),
      canPlayEvent: EventStreamProviderOfEvent(),
      canPlayThroughEvent: EventStreamProviderOfEvent(),
      changeEvent: EventStreamProviderOfEvent(),
      clickEvent: EventStreamProviderOfMouseEvent(),
      contextMenuEvent: EventStreamProviderOfMouseEvent(),
      doubleClickEvent: EventStreamProviderOfEvent(),
      dragEvent: EventStreamProviderOfMouseEvent(),
      dragEndEvent: EventStreamProviderOfMouseEvent(),
      dragEnterEvent: EventStreamProviderOfMouseEvent(),
      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
      dragOverEvent: EventStreamProviderOfMouseEvent(),
      dragStartEvent: EventStreamProviderOfMouseEvent(),
      dropEvent: EventStreamProviderOfMouseEvent(),
      durationChangeEvent: EventStreamProviderOfEvent(),
      emptiedEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      inputEvent: EventStreamProviderOfEvent(),
      invalidEvent: EventStreamProviderOfEvent(),
      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      loadedDataEvent: EventStreamProviderOfEvent(),
      loadedMetadataEvent: EventStreamProviderOfEvent(),
      mouseDownEvent: EventStreamProviderOfMouseEvent(),
      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
      mouseOutEvent: EventStreamProviderOfMouseEvent(),
      mouseOverEvent: EventStreamProviderOfMouseEvent(),
      mouseUpEvent: EventStreamProviderOfMouseEvent(),
      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      playEvent: EventStreamProviderOfEvent(),
      playingEvent: EventStreamProviderOfEvent(),
      rateChangeEvent: EventStreamProviderOfEvent(),
      resetEvent: EventStreamProviderOfEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      seekedEvent: EventStreamProviderOfEvent(),
      seekingEvent: EventStreamProviderOfEvent(),
      selectEvent: EventStreamProviderOfEvent(),
      stalledEvent: EventStreamProviderOfEvent(),
      submitEvent: EventStreamProviderOfEvent(),
      suspendEvent: EventStreamProviderOfEvent(),
      timeUpdateEvent: EventStreamProviderOfEvent(),
      volumeChangeEvent: EventStreamProviderOfEvent(),
      waitingEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(svg$.SvgElement, {
    get _START_TAG_REGEXP() {
      return core.RegExp.new('<(\\w+)');
    },
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get canPlayEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
    },
    get canPlayThroughEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    },
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
    },
    get contextMenuEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
    },
    get doubleClickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
    },
    get dragEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
    },
    get dragEndEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
    },
    get dragEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
    },
    get dragLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
    },
    get dragOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
    },
    get dragStartEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
    },
    get dropEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
    },
    get durationChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
    },
    get emptiedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get inputEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('input'));
    },
    get invalidEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
    },
    get keyDownEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
    },
    get keyPressEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
    },
    get keyUpEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get loadedDataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
    },
    get loadedMetadataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
    },
    get mouseDownEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
    },
    get mouseEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
    },
    get mouseLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
    },
    get mouseMoveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
    },
    get mouseOutEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
    },
    get mouseOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
    },
    get mouseUpEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
    },
    get mouseWheelEvent() {
      return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get playEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('play'));
    },
    get playingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('playing'));
    },
    get rateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
    },
    get resetEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('reset'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get seekedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
    },
    get seekingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
    },
    get selectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('select'));
    },
    get stalledEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
    },
    get submitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('submit'));
    },
    get suspendEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
    },
    get timeUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
    },
    get volumeChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
    },
    get waitingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
    }
  });
  dart.registerExtension(dart.global.SVGElement, svg$.SvgElement);
  dart.defineExtensionNames([
    'getBBox',
    'getCtm',
    'getScreenCtm',
    'getTransformToElement',
    'hasExtension',
    'farthestViewportElement',
    'nearestViewportElement',
    'transform',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.farthestViewportElement] = null;
      this[dartx.nearestViewportElement] = null;
      this[dartx.transform] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      super.created();
    }
    get [dartx.farthestViewportElement]() {
      return this.farthestViewportElement;
    }
    get [dartx.nearestViewportElement]() {
      return this.nearestViewportElement;
    }
    get [dartx.transform]() {
      return this.transform;
    }
    [dartx.getBBox](...args) {
      return this.getBBox.apply(this, args);
    }
    [dartx.getCtm](...args) {
      return this.getCTM.apply(this, args);
    }
    [dartx.getScreenCtm](...args) {
      return this.getScreenCTM.apply(this, args);
    }
    [dartx.getTransformToElement](...args) {
      return this.getTransformToElement.apply(this, args);
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.GraphicsElement, 'created');
  svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
  dart.setSignature(svg$.GraphicsElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.GraphicsElement, []),
      created: dart.definiteFunctionType(svg$.GraphicsElement, [])
    }),
    fields: () => ({
      [dartx.farthestViewportElement]: svg$.SvgElement,
      [dartx.nearestViewportElement]: svg$.SvgElement,
      [dartx.transform]: svg$.AnimatedTransformList,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList
    }),
    methods: () => ({
      [dartx.getBBox]: dart.definiteFunctionType(svg$.Rect, []),
      [dartx.getCtm]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.getScreenCtm]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.getTransformToElement]: dart.definiteFunctionType(svg$.Matrix, [svg$.SvgElement]),
      [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
    })
  });
  dart.registerExtension(dart.global.SVGGraphicsElement, svg$.GraphicsElement);
  dart.defineExtensionNames([
    'target',
    'href'
  ]);
  svg$.AElement = class AElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
    }
    created() {
      this[dartx.target] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.target]() {
      return this.target;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.AElement, 'created');
  svg$.AElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.AElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AElement, []),
      new: dart.definiteFunctionType(svg$.AElement, []),
      created: dart.definiteFunctionType(svg$.AElement, [])
    }),
    fields: () => ({
      [dartx.target]: svg$.AnimatedString,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGAElement, svg$.AElement);
  dart.defineExtensionNames([
    'convertToSpecifiedUnits',
    'newValueSpecifiedUnits',
    'unitType',
    'value',
    'valueAsString',
    'valueInSpecifiedUnits'
  ]);
  svg$.Angle = class Angle extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.unitType]() {
      return this.unitType;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.valueAsString]() {
      return this.valueAsString;
    }
    set [dartx.valueAsString](value) {
      this.valueAsString = value;
    }
    get [dartx.valueInSpecifiedUnits]() {
      return this.valueInSpecifiedUnits;
    }
    set [dartx.valueInSpecifiedUnits](value) {
      this.valueInSpecifiedUnits = value;
    }
    [dartx.convertToSpecifiedUnits](...args) {
      return this.convertToSpecifiedUnits.apply(this, args);
    }
    [dartx.newValueSpecifiedUnits](...args) {
      return this.newValueSpecifiedUnits.apply(this, args);
    }
  };
  dart.setSignature(svg$.Angle, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Angle, [])}),
    fields: () => ({
      [dartx.unitType]: core.int,
      [dartx.value]: core.num,
      [dartx.valueAsString]: core.String,
      [dartx.valueInSpecifiedUnits]: core.num
    }),
    methods: () => ({
      [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
    }),
    sfields: () => ({
      SVG_ANGLETYPE_DEG: core.int,
      SVG_ANGLETYPE_GRAD: core.int,
      SVG_ANGLETYPE_RAD: core.int,
      SVG_ANGLETYPE_UNKNOWN: core.int,
      SVG_ANGLETYPE_UNSPECIFIED: core.int
    })
  });
  svg$.Angle.SVG_ANGLETYPE_DEG = 2;
  svg$.Angle.SVG_ANGLETYPE_GRAD = 4;
  svg$.Angle.SVG_ANGLETYPE_RAD = 3;
  svg$.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
  svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
  dart.registerExtension(dart.global.SVGAngle, svg$.Angle);
  dart.defineExtensionNames([
    'beginElement',
    'beginElementAt',
    'endElement',
    'endElementAt',
    'getCurrentTime',
    'getSimpleDuration',
    'getStartTime',
    'hasExtension',
    'targetElement',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
    }
    created() {
      this[dartx.targetElement] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      super.created();
    }
    get [dartx.targetElement]() {
      return this.targetElement;
    }
    [dartx.beginElement](...args) {
      return this.beginElement.apply(this, args);
    }
    [dartx.beginElementAt](...args) {
      return this.beginElementAt.apply(this, args);
    }
    [dartx.endElement](...args) {
      return this.endElement.apply(this, args);
    }
    [dartx.endElementAt](...args) {
      return this.endElementAt.apply(this, args);
    }
    [dartx.getCurrentTime](...args) {
      return this.getCurrentTime.apply(this, args);
    }
    [dartx.getSimpleDuration](...args) {
      return this.getSimpleDuration.apply(this, args);
    }
    [dartx.getStartTime](...args) {
      return this.getStartTime.apply(this, args);
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.AnimationElement, 'created');
  svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
  dart.setSignature(svg$.AnimationElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimationElement, []),
      new: dart.definiteFunctionType(svg$.AnimationElement, []),
      created: dart.definiteFunctionType(svg$.AnimationElement, [])
    }),
    fields: () => ({
      [dartx.targetElement]: svg$.SvgElement,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList
    }),
    methods: () => ({
      [dartx.beginElement]: dart.definiteFunctionType(dart.void, []),
      [dartx.beginElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.endElement]: dart.definiteFunctionType(dart.void, []),
      [dartx.endElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
      [dartx.getSimpleDuration]: dart.definiteFunctionType(core.double, []),
      [dartx.getStartTime]: dart.definiteFunctionType(core.double, []),
      [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
    })
  });
  dart.registerExtension(dart.global.SVGAnimationElement, svg$.AnimationElement);
  svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('animate')) && svg$.AnimateElement.is(svg$.SvgElement.tag('animate'));
    }
  };
  dart.defineNamedConstructor(svg$.AnimateElement, 'created');
  dart.setSignature(svg$.AnimateElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimateElement, []),
      new: dart.definiteFunctionType(svg$.AnimateElement, []),
      created: dart.definiteFunctionType(svg$.AnimateElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGAnimateElement, svg$.AnimateElement);
  svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('animateMotion')) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag('animateMotion'));
    }
  };
  dart.defineNamedConstructor(svg$.AnimateMotionElement, 'created');
  dart.setSignature(svg$.AnimateMotionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
      new: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
      created: dart.definiteFunctionType(svg$.AnimateMotionElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGAnimateMotionElement, svg$.AnimateMotionElement);
  svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('animateTransform')) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag('animateTransform'));
    }
  };
  dart.defineNamedConstructor(svg$.AnimateTransformElement, 'created');
  dart.setSignature(svg$.AnimateTransformElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
      new: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
      created: dart.definiteFunctionType(svg$.AnimateTransformElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGAnimateTransformElement, svg$.AnimateTransformElement);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedAngle, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedAngle, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.Angle,
      [dartx.baseVal]: svg$.Angle
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedAngle, svg$.AnimatedAngle);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedBoolean, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedBoolean, [])}),
    fields: () => ({
      [dartx.animVal]: core.bool,
      [dartx.baseVal]: core.bool
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedBoolean, svg$.AnimatedBoolean);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedEnumeration, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedEnumeration, [])}),
    fields: () => ({
      [dartx.animVal]: core.int,
      [dartx.baseVal]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg$.AnimatedEnumeration);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedInteger, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedInteger, [])}),
    fields: () => ({
      [dartx.animVal]: core.int,
      [dartx.baseVal]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedInteger, svg$.AnimatedInteger);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedLength, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLength, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.Length,
      [dartx.baseVal]: svg$.Length
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedLength, svg$.AnimatedLength);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedLengthList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLengthList, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.LengthList,
      [dartx.baseVal]: svg$.LengthList
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedLengthList, svg$.AnimatedLengthList);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedNumber, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumber, [])}),
    fields: () => ({
      [dartx.animVal]: core.double,
      [dartx.baseVal]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedNumber, svg$.AnimatedNumber);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedNumberList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumberList, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.NumberList,
      [dartx.baseVal]: svg$.NumberList
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedNumberList, svg$.AnimatedNumberList);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedPreserveAspectRatio, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedPreserveAspectRatio, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.PreserveAspectRatio,
      [dartx.baseVal]: svg$.PreserveAspectRatio
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg$.AnimatedPreserveAspectRatio);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedRect, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedRect, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.Rect,
      [dartx.baseVal]: svg$.Rect
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedRect, svg$.AnimatedRect);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedString, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedString, [])}),
    fields: () => ({
      [dartx.animVal]: core.String,
      [dartx.baseVal]: core.String
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedString, svg$.AnimatedString);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedTransformList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedTransformList, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.TransformList,
      [dartx.baseVal]: svg$.TransformList
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedTransformList, svg$.AnimatedTransformList);
  dart.defineExtensionNames([
    'isPointInFill',
    'isPointInStroke'
  ]);
  svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
    [dartx.isPointInFill](...args) {
      return this.isPointInFill.apply(this, args);
    }
    [dartx.isPointInStroke](...args) {
      return this.isPointInStroke.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.GeometryElement, 'created');
  dart.setSignature(svg$.GeometryElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.GeometryElement, []),
      created: dart.definiteFunctionType(svg$.GeometryElement, [])
    }),
    methods: () => ({
      [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg$.Point]),
      [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg$.Point])
    })
  });
  dart.registerExtension(dart.global.SVGGeometryElement, svg$.GeometryElement);
  dart.defineExtensionNames([
    'cx',
    'cy',
    'r'
  ]);
  svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
    }
    created() {
      this[dartx.cx] = null;
      this[dartx.cy] = null;
      this[dartx.r] = null;
      super.created();
    }
    get [dartx.cx]() {
      return this.cx;
    }
    get [dartx.cy]() {
      return this.cy;
    }
    get [dartx.r]() {
      return this.r;
    }
  };
  dart.defineNamedConstructor(svg$.CircleElement, 'created');
  dart.setSignature(svg$.CircleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.CircleElement, []),
      new: dart.definiteFunctionType(svg$.CircleElement, []),
      created: dart.definiteFunctionType(svg$.CircleElement, [])
    }),
    fields: () => ({
      [dartx.cx]: svg$.AnimatedLength,
      [dartx.cy]: svg$.AnimatedLength,
      [dartx.r]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGCircleElement, svg$.CircleElement);
  dart.defineExtensionNames([
    'clipPathUnits'
  ]);
  svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
    }
    created() {
      this[dartx.clipPathUnits] = null;
      super.created();
    }
    get [dartx.clipPathUnits]() {
      return this.clipPathUnits;
    }
  };
  dart.defineNamedConstructor(svg$.ClipPathElement, 'created');
  dart.setSignature(svg$.ClipPathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ClipPathElement, []),
      new: dart.definiteFunctionType(svg$.ClipPathElement, []),
      created: dart.definiteFunctionType(svg$.ClipPathElement, [])
    }),
    fields: () => ({[dartx.clipPathUnits]: svg$.AnimatedEnumeration})
  });
  dart.registerExtension(dart.global.SVGClipPathElement, svg$.ClipPathElement);
  svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.DefsElement, 'created');
  dart.setSignature(svg$.DefsElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.DefsElement, []),
      new: dart.definiteFunctionType(svg$.DefsElement, []),
      created: dart.definiteFunctionType(svg$.DefsElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGDefsElement, svg$.DefsElement);
  svg$.DescElement = class DescElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.DescElement, 'created');
  dart.setSignature(svg$.DescElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.DescElement, []),
      new: dart.definiteFunctionType(svg$.DescElement, []),
      created: dart.definiteFunctionType(svg$.DescElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGDescElement, svg$.DescElement);
  svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.DiscardElement, 'created');
  dart.setSignature(svg$.DiscardElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.DiscardElement, []),
      created: dart.definiteFunctionType(svg$.DiscardElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGDiscardElement, svg$.DiscardElement);
  dart.defineExtensionNames([
    'cx',
    'cy',
    'rx',
    'ry'
  ]);
  svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
    }
    created() {
      this[dartx.cx] = null;
      this[dartx.cy] = null;
      this[dartx.rx] = null;
      this[dartx.ry] = null;
      super.created();
    }
    get [dartx.cx]() {
      return this.cx;
    }
    get [dartx.cy]() {
      return this.cy;
    }
    get [dartx.rx]() {
      return this.rx;
    }
    get [dartx.ry]() {
      return this.ry;
    }
  };
  dart.defineNamedConstructor(svg$.EllipseElement, 'created');
  dart.setSignature(svg$.EllipseElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.EllipseElement, []),
      new: dart.definiteFunctionType(svg$.EllipseElement, []),
      created: dart.definiteFunctionType(svg$.EllipseElement, [])
    }),
    fields: () => ({
      [dartx.cx]: svg$.AnimatedLength,
      [dartx.cy]: svg$.AnimatedLength,
      [dartx.rx]: svg$.AnimatedLength,
      [dartx.ry]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGEllipseElement, svg$.EllipseElement);
  dart.defineExtensionNames([
    'in1',
    'in2',
    'mode',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.in2] = null;
      this[dartx.mode] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feBlend')) && svg$.FEBlendElement.is(svg$.SvgElement.tag('feBlend'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.in2]() {
      return this.in2;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEBlendElement, 'created');
  svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEBlendElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEBlendElement, []),
      new: dart.definiteFunctionType(svg$.FEBlendElement, []),
      created: dart.definiteFunctionType(svg$.FEBlendElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.in2]: svg$.AnimatedString,
      [dartx.mode]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_FEBLEND_MODE_DARKEN: core.int,
      SVG_FEBLEND_MODE_LIGHTEN: core.int,
      SVG_FEBLEND_MODE_MULTIPLY: core.int,
      SVG_FEBLEND_MODE_NORMAL: core.int,
      SVG_FEBLEND_MODE_SCREEN: core.int,
      SVG_FEBLEND_MODE_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEBlendElement, svg$.FEBlendElement);
  dart.defineExtensionNames([
    'in1',
    'type',
    'values',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.type] = null;
      this[dartx.values] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feColorMatrix')) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag('feColorMatrix'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.values]() {
      return this.values;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEColorMatrixElement, 'created');
  svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEColorMatrixElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
      new: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
      created: dart.definiteFunctionType(svg$.FEColorMatrixElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.type]: svg$.AnimatedEnumeration,
      [dartx.values]: svg$.AnimatedNumberList,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_FECOLORMATRIX_TYPE_HUEROTATE: core.int,
      SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: core.int,
      SVG_FECOLORMATRIX_TYPE_MATRIX: core.int,
      SVG_FECOLORMATRIX_TYPE_SATURATE: core.int,
      SVG_FECOLORMATRIX_TYPE_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg$.FEColorMatrixElement);
  dart.defineExtensionNames([
    'in1',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feComponentTransfer')) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag('feComponentTransfer'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEComponentTransferElement, 'created');
  svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEComponentTransferElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
      new: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
      created: dart.definiteFunctionType(svg$.FEComponentTransferElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg$.FEComponentTransferElement);
  dart.defineExtensionNames([
    'in1',
    'in2',
    'k1',
    'k2',
    'k3',
    'k4',
    'operator',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.in2] = null;
      this[dartx.k1] = null;
      this[dartx.k2] = null;
      this[dartx.k3] = null;
      this[dartx.k4] = null;
      this[dartx.operator] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.in2]() {
      return this.in2;
    }
    get [dartx.k1]() {
      return this.k1;
    }
    get [dartx.k2]() {
      return this.k2;
    }
    get [dartx.k3]() {
      return this.k3;
    }
    get [dartx.k4]() {
      return this.k4;
    }
    get [dartx.operator]() {
      return this.operator;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FECompositeElement, 'created');
  svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FECompositeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FECompositeElement, []),
      created: dart.definiteFunctionType(svg$.FECompositeElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.in2]: svg$.AnimatedString,
      [dartx.k1]: svg$.AnimatedNumber,
      [dartx.k2]: svg$.AnimatedNumber,
      [dartx.k3]: svg$.AnimatedNumber,
      [dartx.k4]: svg$.AnimatedNumber,
      [dartx.operator]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: core.int,
      SVG_FECOMPOSITE_OPERATOR_ATOP: core.int,
      SVG_FECOMPOSITE_OPERATOR_IN: core.int,
      SVG_FECOMPOSITE_OPERATOR_OUT: core.int,
      SVG_FECOMPOSITE_OPERATOR_OVER: core.int,
      SVG_FECOMPOSITE_OPERATOR_UNKNOWN: core.int,
      SVG_FECOMPOSITE_OPERATOR_XOR: core.int
    })
  });
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
  dart.registerExtension(dart.global.SVGFECompositeElement, svg$.FECompositeElement);
  dart.defineExtensionNames([
    'bias',
    'divisor',
    'edgeMode',
    'in1',
    'kernelMatrix',
    'kernelUnitLengthX',
    'kernelUnitLengthY',
    'orderX',
    'orderY',
    'preserveAlpha',
    'targetX',
    'targetY',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
    }
    created() {
      this[dartx.bias] = null;
      this[dartx.divisor] = null;
      this[dartx.edgeMode] = null;
      this[dartx.in1] = null;
      this[dartx.kernelMatrix] = null;
      this[dartx.kernelUnitLengthX] = null;
      this[dartx.kernelUnitLengthY] = null;
      this[dartx.orderX] = null;
      this[dartx.orderY] = null;
      this[dartx.preserveAlpha] = null;
      this[dartx.targetX] = null;
      this[dartx.targetY] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feConvolveMatrix')) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag('feConvolveMatrix'));
    }
    get [dartx.bias]() {
      return this.bias;
    }
    get [dartx.divisor]() {
      return this.divisor;
    }
    get [dartx.edgeMode]() {
      return this.edgeMode;
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.kernelMatrix]() {
      return this.kernelMatrix;
    }
    get [dartx.kernelUnitLengthX]() {
      return this.kernelUnitLengthX;
    }
    get [dartx.kernelUnitLengthY]() {
      return this.kernelUnitLengthY;
    }
    get [dartx.orderX]() {
      return this.orderX;
    }
    get [dartx.orderY]() {
      return this.orderY;
    }
    get [dartx.preserveAlpha]() {
      return this.preserveAlpha;
    }
    get [dartx.targetX]() {
      return this.targetX;
    }
    get [dartx.targetY]() {
      return this.targetY;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEConvolveMatrixElement, 'created');
  svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEConvolveMatrixElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
      new: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
      created: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, [])
    }),
    fields: () => ({
      [dartx.bias]: svg$.AnimatedNumber,
      [dartx.divisor]: svg$.AnimatedNumber,
      [dartx.edgeMode]: svg$.AnimatedEnumeration,
      [dartx.in1]: svg$.AnimatedString,
      [dartx.kernelMatrix]: svg$.AnimatedNumberList,
      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
      [dartx.orderX]: svg$.AnimatedInteger,
      [dartx.orderY]: svg$.AnimatedInteger,
      [dartx.preserveAlpha]: svg$.AnimatedBoolean,
      [dartx.targetX]: svg$.AnimatedInteger,
      [dartx.targetY]: svg$.AnimatedInteger,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_EDGEMODE_DUPLICATE: core.int,
      SVG_EDGEMODE_NONE: core.int,
      SVG_EDGEMODE_UNKNOWN: core.int,
      SVG_EDGEMODE_WRAP: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
  dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg$.FEConvolveMatrixElement);
  dart.defineExtensionNames([
    'diffuseConstant',
    'in1',
    'kernelUnitLengthX',
    'kernelUnitLengthY',
    'surfaceScale',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
    }
    created() {
      this[dartx.diffuseConstant] = null;
      this[dartx.in1] = null;
      this[dartx.kernelUnitLengthX] = null;
      this[dartx.kernelUnitLengthY] = null;
      this[dartx.surfaceScale] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feDiffuseLighting')) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag('feDiffuseLighting'));
    }
    get [dartx.diffuseConstant]() {
      return this.diffuseConstant;
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.kernelUnitLengthX]() {
      return this.kernelUnitLengthX;
    }
    get [dartx.kernelUnitLengthY]() {
      return this.kernelUnitLengthY;
    }
    get [dartx.surfaceScale]() {
      return this.surfaceScale;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEDiffuseLightingElement, 'created');
  svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEDiffuseLightingElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
      new: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
      created: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, [])
    }),
    fields: () => ({
      [dartx.diffuseConstant]: svg$.AnimatedNumber,
      [dartx.in1]: svg$.AnimatedString,
      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
      [dartx.surfaceScale]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg$.FEDiffuseLightingElement);
  dart.defineExtensionNames([
    'in1',
    'in2',
    'scale',
    'xChannelSelector',
    'yChannelSelector',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.in2] = null;
      this[dartx.scale] = null;
      this[dartx.xChannelSelector] = null;
      this[dartx.yChannelSelector] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feDisplacementMap')) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag('feDisplacementMap'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.in2]() {
      return this.in2;
    }
    get [dartx.scale]() {
      return this.scale;
    }
    get [dartx.xChannelSelector]() {
      return this.xChannelSelector;
    }
    get [dartx.yChannelSelector]() {
      return this.yChannelSelector;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEDisplacementMapElement, 'created');
  svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEDisplacementMapElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
      new: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
      created: dart.definiteFunctionType(svg$.FEDisplacementMapElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.in2]: svg$.AnimatedString,
      [dartx.scale]: svg$.AnimatedNumber,
      [dartx.xChannelSelector]: svg$.AnimatedEnumeration,
      [dartx.yChannelSelector]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_CHANNEL_A: core.int,
      SVG_CHANNEL_B: core.int,
      SVG_CHANNEL_G: core.int,
      SVG_CHANNEL_R: core.int,
      SVG_CHANNEL_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg$.FEDisplacementMapElement);
  dart.defineExtensionNames([
    'azimuth',
    'elevation'
  ]);
  svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
    }
    created() {
      this[dartx.azimuth] = null;
      this[dartx.elevation] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feDistantLight')) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag('feDistantLight'));
    }
    get [dartx.azimuth]() {
      return this.azimuth;
    }
    get [dartx.elevation]() {
      return this.elevation;
    }
  };
  dart.defineNamedConstructor(svg$.FEDistantLightElement, 'created');
  dart.setSignature(svg$.FEDistantLightElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
      new: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
      created: dart.definiteFunctionType(svg$.FEDistantLightElement, [])
    }),
    fields: () => ({
      [dartx.azimuth]: svg$.AnimatedNumber,
      [dartx.elevation]: svg$.AnimatedNumber
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEDistantLightElement, svg$.FEDistantLightElement);
  dart.defineExtensionNames([
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFlood')) && svg$.FEFloodElement.is(svg$.SvgElement.tag('feFlood'));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEFloodElement, 'created');
  svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEFloodElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFloodElement, []),
      new: dart.definiteFunctionType(svg$.FEFloodElement, []),
      created: dart.definiteFunctionType(svg$.FEFloodElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFloodElement, svg$.FEFloodElement);
  svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$._SVGComponentTransferFunctionElement, 'created');
  dart.setSignature(svg$._SVGComponentTransferFunctionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, []),
      created: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg$._SVGComponentTransferFunctionElement);
  svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncA')) && svg$.FEFuncAElement.is(svg$.SvgElement.tag('feFuncA'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncAElement, 'created');
  dart.setSignature(svg$.FEFuncAElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncAElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncAElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncAElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncAElement, svg$.FEFuncAElement);
  svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncB')) && svg$.FEFuncBElement.is(svg$.SvgElement.tag('feFuncB'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncBElement, 'created');
  dart.setSignature(svg$.FEFuncBElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncBElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncBElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncBElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncBElement, svg$.FEFuncBElement);
  svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncG')) && svg$.FEFuncGElement.is(svg$.SvgElement.tag('feFuncG'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncGElement, 'created');
  dart.setSignature(svg$.FEFuncGElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncGElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncGElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncGElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncGElement, svg$.FEFuncGElement);
  svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncR')) && svg$.FEFuncRElement.is(svg$.SvgElement.tag('feFuncR'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncRElement, 'created');
  dart.setSignature(svg$.FEFuncRElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncRElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncRElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncRElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncRElement, svg$.FEFuncRElement);
  dart.defineExtensionNames([
    'setStdDeviation',
    'in1',
    'stdDeviationX',
    'stdDeviationY',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.stdDeviationX] = null;
      this[dartx.stdDeviationY] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feGaussianBlur')) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag('feGaussianBlur'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.stdDeviationX]() {
      return this.stdDeviationX;
    }
    get [dartx.stdDeviationY]() {
      return this.stdDeviationY;
    }
    [dartx.setStdDeviation](...args) {
      return this.setStdDeviation.apply(this, args);
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEGaussianBlurElement, 'created');
  svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEGaussianBlurElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
      new: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
      created: dart.definiteFunctionType(svg$.FEGaussianBlurElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.stdDeviationX]: svg$.AnimatedNumber,
      [dartx.stdDeviationY]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    methods: () => ({[dartx.setStdDeviation]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg$.FEGaussianBlurElement);
  dart.defineExtensionNames([
    'preserveAspectRatio',
    'height',
    'result',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
    }
    created() {
      this[dartx.preserveAspectRatio] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feImage')) && svg$.FEImageElement.is(svg$.SvgElement.tag('feImage'));
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.FEImageElement, 'created');
  svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
  dart.setSignature(svg$.FEImageElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEImageElement, []),
      new: dart.definiteFunctionType(svg$.FEImageElement, []),
      created: dart.definiteFunctionType(svg$.FEImageElement, [])
    }),
    fields: () => ({
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEImageElement, svg$.FEImageElement);
  dart.defineExtensionNames([
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feMerge')) && svg$.FEMergeElement.is(svg$.SvgElement.tag('feMerge'));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEMergeElement, 'created');
  svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEMergeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEMergeElement, []),
      new: dart.definiteFunctionType(svg$.FEMergeElement, []),
      created: dart.definiteFunctionType(svg$.FEMergeElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEMergeElement, svg$.FEMergeElement);
  dart.defineExtensionNames([
    'in1'
  ]);
  svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
    }
    created() {
      this[dartx.in1] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feMergeNode')) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag('feMergeNode'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
  };
  dart.defineNamedConstructor(svg$.FEMergeNodeElement, 'created');
  dart.setSignature(svg$.FEMergeNodeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
      new: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
      created: dart.definiteFunctionType(svg$.FEMergeNodeElement, [])
    }),
    fields: () => ({[dartx.in1]: svg$.AnimatedString}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg$.FEMergeNodeElement);
  dart.defineExtensionNames([
    'in1',
    'operator',
    'radiusX',
    'radiusY',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.operator] = null;
      this[dartx.radiusX] = null;
      this[dartx.radiusY] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.operator]() {
      return this.operator;
    }
    get [dartx.radiusX]() {
      return this.radiusX;
    }
    get [dartx.radiusY]() {
      return this.radiusY;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEMorphologyElement, 'created');
  svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEMorphologyElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEMorphologyElement, []),
      created: dart.definiteFunctionType(svg$.FEMorphologyElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.operator]: svg$.AnimatedEnumeration,
      [dartx.radiusX]: svg$.AnimatedNumber,
      [dartx.radiusY]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_MORPHOLOGY_OPERATOR_DILATE: core.int,
      SVG_MORPHOLOGY_OPERATOR_ERODE: core.int,
      SVG_MORPHOLOGY_OPERATOR_UNKNOWN: core.int
    })
  });
  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEMorphologyElement, svg$.FEMorphologyElement);
  dart.defineExtensionNames([
    'dx',
    'dy',
    'in1',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
    }
    created() {
      this[dartx.dx] = null;
      this[dartx.dy] = null;
      this[dartx.in1] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feOffset')) && svg$.FEOffsetElement.is(svg$.SvgElement.tag('feOffset'));
    }
    get [dartx.dx]() {
      return this.dx;
    }
    get [dartx.dy]() {
      return this.dy;
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEOffsetElement, 'created');
  svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEOffsetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEOffsetElement, []),
      new: dart.definiteFunctionType(svg$.FEOffsetElement, []),
      created: dart.definiteFunctionType(svg$.FEOffsetElement, [])
    }),
    fields: () => ({
      [dartx.dx]: svg$.AnimatedNumber,
      [dartx.dy]: svg$.AnimatedNumber,
      [dartx.in1]: svg$.AnimatedString,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEOffsetElement, svg$.FEOffsetElement);
  dart.defineExtensionNames([
    'x',
    'y',
    'z'
  ]);
  svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
    }
    created() {
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.z] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('fePointLight')) && svg$.FEPointLightElement.is(svg$.SvgElement.tag('fePointLight'));
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.defineNamedConstructor(svg$.FEPointLightElement, 'created');
  dart.setSignature(svg$.FEPointLightElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEPointLightElement, []),
      new: dart.definiteFunctionType(svg$.FEPointLightElement, []),
      created: dart.definiteFunctionType(svg$.FEPointLightElement, [])
    }),
    fields: () => ({
      [dartx.x]: svg$.AnimatedNumber,
      [dartx.y]: svg$.AnimatedNumber,
      [dartx.z]: svg$.AnimatedNumber
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEPointLightElement, svg$.FEPointLightElement);
  dart.defineExtensionNames([
    'in1',
    'kernelUnitLengthX',
    'kernelUnitLengthY',
    'specularConstant',
    'specularExponent',
    'surfaceScale',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.kernelUnitLengthX] = null;
      this[dartx.kernelUnitLengthY] = null;
      this[dartx.specularConstant] = null;
      this[dartx.specularExponent] = null;
      this[dartx.surfaceScale] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feSpecularLighting')) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag('feSpecularLighting'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.kernelUnitLengthX]() {
      return this.kernelUnitLengthX;
    }
    get [dartx.kernelUnitLengthY]() {
      return this.kernelUnitLengthY;
    }
    get [dartx.specularConstant]() {
      return this.specularConstant;
    }
    get [dartx.specularExponent]() {
      return this.specularExponent;
    }
    get [dartx.surfaceScale]() {
      return this.surfaceScale;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FESpecularLightingElement, 'created');
  svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FESpecularLightingElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
      new: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
      created: dart.definiteFunctionType(svg$.FESpecularLightingElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
      [dartx.specularConstant]: svg$.AnimatedNumber,
      [dartx.specularExponent]: svg$.AnimatedNumber,
      [dartx.surfaceScale]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg$.FESpecularLightingElement);
  dart.defineExtensionNames([
    'limitingConeAngle',
    'pointsAtX',
    'pointsAtY',
    'pointsAtZ',
    'specularExponent',
    'x',
    'y',
    'z'
  ]);
  svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
    }
    created() {
      this[dartx.limitingConeAngle] = null;
      this[dartx.pointsAtX] = null;
      this[dartx.pointsAtY] = null;
      this[dartx.pointsAtZ] = null;
      this[dartx.specularExponent] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.z] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feSpotLight')) && svg$.FESpotLightElement.is(svg$.SvgElement.tag('feSpotLight'));
    }
    get [dartx.limitingConeAngle]() {
      return this.limitingConeAngle;
    }
    get [dartx.pointsAtX]() {
      return this.pointsAtX;
    }
    get [dartx.pointsAtY]() {
      return this.pointsAtY;
    }
    get [dartx.pointsAtZ]() {
      return this.pointsAtZ;
    }
    get [dartx.specularExponent]() {
      return this.specularExponent;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.defineNamedConstructor(svg$.FESpotLightElement, 'created');
  dart.setSignature(svg$.FESpotLightElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FESpotLightElement, []),
      new: dart.definiteFunctionType(svg$.FESpotLightElement, []),
      created: dart.definiteFunctionType(svg$.FESpotLightElement, [])
    }),
    fields: () => ({
      [dartx.limitingConeAngle]: svg$.AnimatedNumber,
      [dartx.pointsAtX]: svg$.AnimatedNumber,
      [dartx.pointsAtY]: svg$.AnimatedNumber,
      [dartx.pointsAtZ]: svg$.AnimatedNumber,
      [dartx.specularExponent]: svg$.AnimatedNumber,
      [dartx.x]: svg$.AnimatedNumber,
      [dartx.y]: svg$.AnimatedNumber,
      [dartx.z]: svg$.AnimatedNumber
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFESpotLightElement, svg$.FESpotLightElement);
  dart.defineExtensionNames([
    'in1',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FETileElement = class FETileElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feTile')) && svg$.FETileElement.is(svg$.SvgElement.tag('feTile'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FETileElement, 'created');
  svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FETileElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FETileElement, []),
      new: dart.definiteFunctionType(svg$.FETileElement, []),
      created: dart.definiteFunctionType(svg$.FETileElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFETileElement, svg$.FETileElement);
  dart.defineExtensionNames([
    'baseFrequencyX',
    'baseFrequencyY',
    'numOctaves',
    'seed',
    'stitchTiles',
    'type',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
    }
    created() {
      this[dartx.baseFrequencyX] = null;
      this[dartx.baseFrequencyY] = null;
      this[dartx.numOctaves] = null;
      this[dartx.seed] = null;
      this[dartx.stitchTiles] = null;
      this[dartx.type] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feTurbulence')) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag('feTurbulence'));
    }
    get [dartx.baseFrequencyX]() {
      return this.baseFrequencyX;
    }
    get [dartx.baseFrequencyY]() {
      return this.baseFrequencyY;
    }
    get [dartx.numOctaves]() {
      return this.numOctaves;
    }
    get [dartx.seed]() {
      return this.seed;
    }
    get [dartx.stitchTiles]() {
      return this.stitchTiles;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FETurbulenceElement, 'created');
  svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FETurbulenceElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
      new: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
      created: dart.definiteFunctionType(svg$.FETurbulenceElement, [])
    }),
    fields: () => ({
      [dartx.baseFrequencyX]: svg$.AnimatedNumber,
      [dartx.baseFrequencyY]: svg$.AnimatedNumber,
      [dartx.numOctaves]: svg$.AnimatedInteger,
      [dartx.seed]: svg$.AnimatedNumber,
      [dartx.stitchTiles]: svg$.AnimatedEnumeration,
      [dartx.type]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_STITCHTYPE_NOSTITCH: core.int,
      SVG_STITCHTYPE_STITCH: core.int,
      SVG_STITCHTYPE_UNKNOWN: core.int,
      SVG_TURBULENCE_TYPE_FRACTALNOISE: core.int,
      SVG_TURBULENCE_TYPE_TURBULENCE: core.int,
      SVG_TURBULENCE_TYPE_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
  svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
  svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFETurbulenceElement, svg$.FETurbulenceElement);
  dart.defineExtensionNames([
    'filterUnits',
    'height',
    'primitiveUnits',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.FilterElement = class FilterElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
    }
    created() {
      this[dartx.filterUnits] = null;
      this[dartx.height] = null;
      this[dartx.primitiveUnits] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('filter')) && svg$.FilterElement.is(svg$.SvgElement.tag('filter'));
    }
    get [dartx.filterUnits]() {
      return this.filterUnits;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.primitiveUnits]() {
      return this.primitiveUnits;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.FilterElement, 'created');
  svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.FilterElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FilterElement, []),
      new: dart.definiteFunctionType(svg$.FilterElement, []),
      created: dart.definiteFunctionType(svg$.FilterElement, [])
    }),
    fields: () => ({
      [dartx.filterUnits]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.primitiveUnits]: svg$.AnimatedEnumeration,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFilterElement, svg$.FilterElement);
  dart.defineExtensionNames([
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get height() {
      return this[height$];
    }
    set height(value) {
      super.height = value;
    }
    get result() {
      return this[result];
    }
    set result(value) {
      super.result = value;
    }
    get width() {
      return this[width$];
    }
    set width(value) {
      super.width = value;
    }
    get x() {
      return this[x];
    }
    set x(value) {
      super.x = value;
    }
    get y() {
      return this[y];
    }
    set y(value) {
      super.y = value;
    }
  };
  const height$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
  const result = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
  const width$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
  const x = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
  const y = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
  dart.setSignature(svg$.FilterPrimitiveStandardAttributes, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.FilterPrimitiveStandardAttributes, [])}),
    fields: () => ({
      height: svg$.AnimatedLength,
      result: svg$.AnimatedString,
      width: svg$.AnimatedLength,
      x: svg$.AnimatedLength,
      y: svg$.AnimatedLength
    })
  });
  dart.defineExtensionMembers(svg$.FilterPrimitiveStandardAttributes, [
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  dart.defineExtensionNames([
    'preserveAspectRatio',
    'viewBox'
  ]);
  svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get preserveAspectRatio() {
      return this[preserveAspectRatio];
    }
    set preserveAspectRatio(value) {
      super.preserveAspectRatio = value;
    }
    get viewBox() {
      return this[viewBox];
    }
    set viewBox(value) {
      super.viewBox = value;
    }
  };
  const preserveAspectRatio = Symbol(svg$.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
  const viewBox = Symbol(svg$.FitToViewBox.name + "." + 'viewBox'.toString());
  dart.setSignature(svg$.FitToViewBox, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.FitToViewBox, [])}),
    fields: () => ({
      preserveAspectRatio: svg$.AnimatedPreserveAspectRatio,
      viewBox: svg$.AnimatedRect
    })
  });
  dart.defineExtensionMembers(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
  dart.defineExtensionNames([
    'height',
    'width',
    'x',
    'y'
  ]);
  svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('foreignObject')) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag('foreignObject'));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.ForeignObjectElement, 'created');
  dart.setSignature(svg$.ForeignObjectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
      new: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
      created: dart.definiteFunctionType(svg$.ForeignObjectElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGForeignObjectElement, svg$.ForeignObjectElement);
  svg$.GElement = class GElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.GElement, 'created');
  dart.setSignature(svg$.GElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.GElement, []),
      new: dart.definiteFunctionType(svg$.GElement, []),
      created: dart.definiteFunctionType(svg$.GElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGGElement, svg$.GElement);
  dart.defineExtensionNames([
    'height',
    'preserveAspectRatio',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.ImageElement, 'created');
  svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.ImageElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ImageElement, []),
      new: dart.definiteFunctionType(svg$.ImageElement, []),
      created: dart.definiteFunctionType(svg$.ImageElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGImageElement, svg$.ImageElement);
  dart.defineExtensionNames([
    'convertToSpecifiedUnits',
    'newValueSpecifiedUnits',
    'unitType',
    'value',
    'valueAsString',
    'valueInSpecifiedUnits'
  ]);
  svg$.Length = class Length extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.unitType]() {
      return this.unitType;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.valueAsString]() {
      return this.valueAsString;
    }
    set [dartx.valueAsString](value) {
      this.valueAsString = value;
    }
    get [dartx.valueInSpecifiedUnits]() {
      return this.valueInSpecifiedUnits;
    }
    set [dartx.valueInSpecifiedUnits](value) {
      this.valueInSpecifiedUnits = value;
    }
    [dartx.convertToSpecifiedUnits](...args) {
      return this.convertToSpecifiedUnits.apply(this, args);
    }
    [dartx.newValueSpecifiedUnits](...args) {
      return this.newValueSpecifiedUnits.apply(this, args);
    }
  };
  dart.setSignature(svg$.Length, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Length, [])}),
    fields: () => ({
      [dartx.unitType]: core.int,
      [dartx.value]: core.num,
      [dartx.valueAsString]: core.String,
      [dartx.valueInSpecifiedUnits]: core.num
    }),
    methods: () => ({
      [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
    }),
    sfields: () => ({
      SVG_LENGTHTYPE_CM: core.int,
      SVG_LENGTHTYPE_EMS: core.int,
      SVG_LENGTHTYPE_EXS: core.int,
      SVG_LENGTHTYPE_IN: core.int,
      SVG_LENGTHTYPE_MM: core.int,
      SVG_LENGTHTYPE_NUMBER: core.int,
      SVG_LENGTHTYPE_PC: core.int,
      SVG_LENGTHTYPE_PERCENTAGE: core.int,
      SVG_LENGTHTYPE_PT: core.int,
      SVG_LENGTHTYPE_PX: core.int,
      SVG_LENGTHTYPE_UNKNOWN: core.int
    })
  });
  svg$.Length.SVG_LENGTHTYPE_CM = 6;
  svg$.Length.SVG_LENGTHTYPE_EMS = 3;
  svg$.Length.SVG_LENGTHTYPE_EXS = 4;
  svg$.Length.SVG_LENGTHTYPE_IN = 8;
  svg$.Length.SVG_LENGTHTYPE_MM = 7;
  svg$.Length.SVG_LENGTHTYPE_NUMBER = 1;
  svg$.Length.SVG_LENGTHTYPE_PC = 10;
  svg$.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
  svg$.Length.SVG_LENGTHTYPE_PT = 9;
  svg$.Length.SVG_LENGTHTYPE_PX = 5;
  svg$.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGLength, svg$.Length);
  const __setter__$ = Symbol('__setter__');
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Length), html$.ImmutableListMixin$(svg$.Length)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.LengthList[dart.implements] = () => [ListOfLength()];
  dart.setSignature(svg$.LengthList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.LengthList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.Length, []),
      [dartx.last]: dart.definiteFunctionType(svg$.Length, []),
      [dartx.single]: dart.definiteFunctionType(svg$.Length, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGLengthList, svg$.LengthList);
  dart.defineExtensionNames([
    'x1',
    'x2',
    'y1',
    'y2'
  ]);
  svg$.LineElement = class LineElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
    }
    created() {
      this[dartx.x1] = null;
      this[dartx.x2] = null;
      this[dartx.y1] = null;
      this[dartx.y2] = null;
      super.created();
    }
    get [dartx.x1]() {
      return this.x1;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    get [dartx.y2]() {
      return this.y2;
    }
  };
  dart.defineNamedConstructor(svg$.LineElement, 'created');
  dart.setSignature(svg$.LineElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.LineElement, []),
      new: dart.definiteFunctionType(svg$.LineElement, []),
      created: dart.definiteFunctionType(svg$.LineElement, [])
    }),
    fields: () => ({
      [dartx.x1]: svg$.AnimatedLength,
      [dartx.x2]: svg$.AnimatedLength,
      [dartx.y1]: svg$.AnimatedLength,
      [dartx.y2]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGLineElement, svg$.LineElement);
  dart.defineExtensionNames([
    'gradientTransform',
    'gradientUnits',
    'spreadMethod',
    'href'
  ]);
  svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.gradientTransform] = null;
      this[dartx.gradientUnits] = null;
      this[dartx.spreadMethod] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.gradientTransform]() {
      return this.gradientTransform;
    }
    get [dartx.gradientUnits]() {
      return this.gradientUnits;
    }
    get [dartx.spreadMethod]() {
      return this.spreadMethod;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$._GradientElement, 'created');
  svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$._GradientElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._GradientElement, []),
      created: dart.definiteFunctionType(svg$._GradientElement, [])
    }),
    fields: () => ({
      [dartx.gradientTransform]: svg$.AnimatedTransformList,
      [dartx.gradientUnits]: svg$.AnimatedEnumeration,
      [dartx.spreadMethod]: svg$.AnimatedEnumeration,
      [dartx.href]: svg$.AnimatedString
    }),
    sfields: () => ({
      SVG_SPREADMETHOD_PAD: core.int,
      SVG_SPREADMETHOD_REFLECT: core.int,
      SVG_SPREADMETHOD_REPEAT: core.int,
      SVG_SPREADMETHOD_UNKNOWN: core.int
    })
  });
  svg$._GradientElement.SVG_SPREADMETHOD_PAD = 1;
  svg$._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
  svg$._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
  svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGGradientElement, svg$._GradientElement);
  dart.defineExtensionNames([
    'x1',
    'x2',
    'y1',
    'y2'
  ]);
  svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
    }
    created() {
      this[dartx.x1] = null;
      this[dartx.x2] = null;
      this[dartx.y1] = null;
      this[dartx.y2] = null;
      super.created();
    }
    get [dartx.x1]() {
      return this.x1;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    get [dartx.y2]() {
      return this.y2;
    }
  };
  dart.defineNamedConstructor(svg$.LinearGradientElement, 'created');
  dart.setSignature(svg$.LinearGradientElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.LinearGradientElement, []),
      new: dart.definiteFunctionType(svg$.LinearGradientElement, []),
      created: dart.definiteFunctionType(svg$.LinearGradientElement, [])
    }),
    fields: () => ({
      [dartx.x1]: svg$.AnimatedLength,
      [dartx.x2]: svg$.AnimatedLength,
      [dartx.y1]: svg$.AnimatedLength,
      [dartx.y2]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGLinearGradientElement, svg$.LinearGradientElement);
  dart.defineExtensionNames([
    'setOrientToAngle',
    'setOrientToAuto',
    'markerHeight',
    'markerUnits',
    'markerWidth',
    'orientAngle',
    'orientType',
    'refX',
    'refY',
    'preserveAspectRatio',
    'viewBox'
  ]);
  svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
    }
    created() {
      this[dartx.markerHeight] = null;
      this[dartx.markerUnits] = null;
      this[dartx.markerWidth] = null;
      this[dartx.orientAngle] = null;
      this[dartx.orientType] = null;
      this[dartx.refX] = null;
      this[dartx.refY] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      super.created();
    }
    get [dartx.markerHeight]() {
      return this.markerHeight;
    }
    get [dartx.markerUnits]() {
      return this.markerUnits;
    }
    get [dartx.markerWidth]() {
      return this.markerWidth;
    }
    get [dartx.orientAngle]() {
      return this.orientAngle;
    }
    get [dartx.orientType]() {
      return this.orientType;
    }
    get [dartx.refX]() {
      return this.refX;
    }
    get [dartx.refY]() {
      return this.refY;
    }
    [dartx.setOrientToAngle](...args) {
      return this.setOrientToAngle.apply(this, args);
    }
    [dartx.setOrientToAuto](...args) {
      return this.setOrientToAuto.apply(this, args);
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
  };
  dart.defineNamedConstructor(svg$.MarkerElement, 'created');
  svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
  dart.setSignature(svg$.MarkerElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.MarkerElement, []),
      new: dart.definiteFunctionType(svg$.MarkerElement, []),
      created: dart.definiteFunctionType(svg$.MarkerElement, [])
    }),
    fields: () => ({
      [dartx.markerHeight]: svg$.AnimatedLength,
      [dartx.markerUnits]: svg$.AnimatedEnumeration,
      [dartx.markerWidth]: svg$.AnimatedLength,
      [dartx.orientAngle]: svg$.AnimatedAngle,
      [dartx.orientType]: svg$.AnimatedEnumeration,
      [dartx.refX]: svg$.AnimatedLength,
      [dartx.refY]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect
    }),
    methods: () => ({
      [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg$.Angle]),
      [dartx.setOrientToAuto]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      SVG_MARKERUNITS_STROKEWIDTH: core.int,
      SVG_MARKERUNITS_UNKNOWN: core.int,
      SVG_MARKERUNITS_USERSPACEONUSE: core.int,
      SVG_MARKER_ORIENT_ANGLE: core.int,
      SVG_MARKER_ORIENT_AUTO: core.int,
      SVG_MARKER_ORIENT_UNKNOWN: core.int
    })
  });
  svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
  svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
  svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
  svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
  svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
  svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGMarkerElement, svg$.MarkerElement);
  dart.defineExtensionNames([
    'hasExtension',
    'height',
    'maskContentUnits',
    'maskUnits',
    'width',
    'x',
    'y',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.MaskElement = class MaskElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.maskContentUnits] = null;
      this[dartx.maskUnits] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.maskContentUnits]() {
      return this.maskContentUnits;
    }
    get [dartx.maskUnits]() {
      return this.maskUnits;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.MaskElement, 'created');
  svg$.MaskElement[dart.implements] = () => [svg$.Tests];
  dart.setSignature(svg$.MaskElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.MaskElement, []),
      new: dart.definiteFunctionType(svg$.MaskElement, []),
      created: dart.definiteFunctionType(svg$.MaskElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.maskContentUnits]: svg$.AnimatedEnumeration,
      [dartx.maskUnits]: svg$.AnimatedEnumeration,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList
    }),
    methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
  });
  dart.registerExtension(dart.global.SVGMaskElement, svg$.MaskElement);
  dart.defineExtensionNames([
    'flipX',
    'flipY',
    'inverse',
    'multiply',
    'rotate',
    'rotateFromVector',
    'scale',
    'scaleNonUniform',
    'skewX',
    'skewY',
    'translate',
    'a',
    'b',
    'c',
    'd',
    'e',
    'f'
  ]);
  svg$.Matrix = class Matrix extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.a]() {
      return this.a;
    }
    set [dartx.a](value) {
      this.a = value;
    }
    get [dartx.b]() {
      return this.b;
    }
    set [dartx.b](value) {
      this.b = value;
    }
    get [dartx.c]() {
      return this.c;
    }
    set [dartx.c](value) {
      this.c = value;
    }
    get [dartx.d]() {
      return this.d;
    }
    set [dartx.d](value) {
      this.d = value;
    }
    get [dartx.e]() {
      return this.e;
    }
    set [dartx.e](value) {
      this.e = value;
    }
    get [dartx.f]() {
      return this.f;
    }
    set [dartx.f](value) {
      this.f = value;
    }
    [dartx.flipX](...args) {
      return this.flipX.apply(this, args);
    }
    [dartx.flipY](...args) {
      return this.flipY.apply(this, args);
    }
    [dartx.inverse](...args) {
      return this.inverse.apply(this, args);
    }
    [dartx.multiply](...args) {
      return this.multiply.apply(this, args);
    }
    [dartx.rotate](...args) {
      return this.rotate.apply(this, args);
    }
    [dartx.rotateFromVector](...args) {
      return this.rotateFromVector.apply(this, args);
    }
    [dartx.scale](...args) {
      return this.scale.apply(this, args);
    }
    [dartx.scaleNonUniform](...args) {
      return this.scaleNonUniform.apply(this, args);
    }
    [dartx.skewX](...args) {
      return this.skewX.apply(this, args);
    }
    [dartx.skewY](...args) {
      return this.skewY.apply(this, args);
    }
    [dartx.translate](...args) {
      return this.translate.apply(this, args);
    }
  };
  dart.setSignature(svg$.Matrix, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Matrix, [])}),
    fields: () => ({
      [dartx.a]: core.num,
      [dartx.b]: core.num,
      [dartx.c]: core.num,
      [dartx.d]: core.num,
      [dartx.e]: core.num,
      [dartx.f]: core.num
    }),
    methods: () => ({
      [dartx.flipX]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.flipY]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.inverse]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.multiply]: dart.definiteFunctionType(svg$.Matrix, [svg$.Matrix]),
      [dartx.rotate]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.rotateFromVector]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
      [dartx.scale]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.scaleNonUniform]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
      [dartx.skewX]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.skewY]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.translate]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.SVGMatrix, svg$.Matrix);
  svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.MetadataElement, 'created');
  dart.setSignature(svg$.MetadataElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.MetadataElement, []),
      created: dart.definiteFunctionType(svg$.MetadataElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGMetadataElement, svg$.MetadataElement);
  dart.defineExtensionNames([
    'value'
  ]);
  svg$.Number = class Number extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.setSignature(svg$.Number, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Number, [])}),
    fields: () => ({[dartx.value]: core.num})
  });
  dart.registerExtension(dart.global.SVGNumber, svg$.Number);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Number), html$.ImmutableListMixin$(svg$.Number)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.NumberList[dart.implements] = () => [ListOfNumber()];
  dart.setSignature(svg$.NumberList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.NumberList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.Number, []),
      [dartx.last]: dart.definiteFunctionType(svg$.Number, []),
      [dartx.single]: dart.definiteFunctionType(svg$.Number, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGNumberList, svg$.NumberList);
  dart.defineExtensionNames([
    'createSvgPathSegArcAbs',
    'createSvgPathSegArcRel',
    'createSvgPathSegClosePath',
    'createSvgPathSegCurvetoCubicAbs',
    'createSvgPathSegCurvetoCubicRel',
    'createSvgPathSegCurvetoCubicSmoothAbs',
    'createSvgPathSegCurvetoCubicSmoothRel',
    'createSvgPathSegCurvetoQuadraticAbs',
    'createSvgPathSegCurvetoQuadraticRel',
    'createSvgPathSegCurvetoQuadraticSmoothAbs',
    'createSvgPathSegCurvetoQuadraticSmoothRel',
    'createSvgPathSegLinetoAbs',
    'createSvgPathSegLinetoHorizontalAbs',
    'createSvgPathSegLinetoHorizontalRel',
    'createSvgPathSegLinetoRel',
    'createSvgPathSegLinetoVerticalAbs',
    'createSvgPathSegLinetoVerticalRel',
    'createSvgPathSegMovetoAbs',
    'createSvgPathSegMovetoRel',
    'getPathSegAtLength',
    'getPointAtLength',
    'getTotalLength',
    'animatedNormalizedPathSegList',
    'animatedPathSegList',
    'normalizedPathSegList',
    'pathLength',
    'pathSegList'
  ]);
  svg$.PathElement = class PathElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
    }
    created() {
      this[dartx.animatedNormalizedPathSegList] = null;
      this[dartx.animatedPathSegList] = null;
      this[dartx.normalizedPathSegList] = null;
      this[dartx.pathLength] = null;
      this[dartx.pathSegList] = null;
      super.created();
    }
    get [dartx.animatedNormalizedPathSegList]() {
      return this.animatedNormalizedPathSegList;
    }
    get [dartx.animatedPathSegList]() {
      return this.animatedPathSegList;
    }
    get [dartx.normalizedPathSegList]() {
      return this.normalizedPathSegList;
    }
    get [dartx.pathLength]() {
      return this.pathLength;
    }
    get [dartx.pathSegList]() {
      return this.pathSegList;
    }
    [dartx.createSvgPathSegArcAbs](...args) {
      return this.createSVGPathSegArcAbs.apply(this, args);
    }
    [dartx.createSvgPathSegArcRel](...args) {
      return this.createSVGPathSegArcRel.apply(this, args);
    }
    [dartx.createSvgPathSegClosePath](...args) {
      return this.createSVGPathSegClosePath.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicAbs](...args) {
      return this.createSVGPathSegCurvetoCubicAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicRel](...args) {
      return this.createSVGPathSegCurvetoCubicRel.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicSmoothAbs](...args) {
      return this.createSVGPathSegCurvetoCubicSmoothAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicSmoothRel](...args) {
      return this.createSVGPathSegCurvetoCubicSmoothRel.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticAbs](...args) {
      return this.createSVGPathSegCurvetoQuadraticAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticRel](...args) {
      return this.createSVGPathSegCurvetoQuadraticRel.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs](...args) {
      return this.createSVGPathSegCurvetoQuadraticSmoothAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel](...args) {
      return this.createSVGPathSegCurvetoQuadraticSmoothRel.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoAbs](...args) {
      return this.createSVGPathSegLinetoAbs.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoHorizontalAbs](...args) {
      return this.createSVGPathSegLinetoHorizontalAbs.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoHorizontalRel](...args) {
      return this.createSVGPathSegLinetoHorizontalRel.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoRel](...args) {
      return this.createSVGPathSegLinetoRel.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoVerticalAbs](...args) {
      return this.createSVGPathSegLinetoVerticalAbs.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoVerticalRel](...args) {
      return this.createSVGPathSegLinetoVerticalRel.apply(this, args);
    }
    [dartx.createSvgPathSegMovetoAbs](...args) {
      return this.createSVGPathSegMovetoAbs.apply(this, args);
    }
    [dartx.createSvgPathSegMovetoRel](...args) {
      return this.createSVGPathSegMovetoRel.apply(this, args);
    }
    [dartx.getPathSegAtLength](...args) {
      return this.getPathSegAtLength.apply(this, args);
    }
    [dartx.getPointAtLength](...args) {
      return this.getPointAtLength.apply(this, args);
    }
    [dartx.getTotalLength](...args) {
      return this.getTotalLength.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.PathElement, 'created');
  dart.setSignature(svg$.PathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PathElement, []),
      new: dart.definiteFunctionType(svg$.PathElement, []),
      created: dart.definiteFunctionType(svg$.PathElement, [])
    }),
    fields: () => ({
      [dartx.animatedNormalizedPathSegList]: svg$.PathSegList,
      [dartx.animatedPathSegList]: svg$.PathSegList,
      [dartx.normalizedPathSegList]: svg$.PathSegList,
      [dartx.pathLength]: svg$.AnimatedNumber,
      [dartx.pathSegList]: svg$.PathSegList
    }),
    methods: () => ({
      [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg$.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
      [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg$.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
      [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg$.PathSegClosePath, []),
      [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
      [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [core.num, core.num]),
      [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [core.num]),
      [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [core.num]),
      [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg$.PathSegLinetoRel, [core.num, core.num]),
      [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [core.num]),
      [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [core.num]),
      [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [core.num, core.num]),
      [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg$.PathSegMovetoRel, [core.num, core.num]),
      [dartx.getPathSegAtLength]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx.getPointAtLength]: dart.definiteFunctionType(svg$.Point, [core.num]),
      [dartx.getTotalLength]: dart.definiteFunctionType(core.double, [])
    })
  });
  dart.registerExtension(dart.global.SVGPathElement, svg$.PathElement);
  dart.defineExtensionNames([
    'pathSegType',
    'pathSegTypeAsLetter'
  ]);
  svg$.PathSeg = class PathSeg extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.pathSegType]() {
      return this.pathSegType;
    }
    get [dartx.pathSegTypeAsLetter]() {
      return this.pathSegTypeAsLetter;
    }
  };
  dart.setSignature(svg$.PathSeg, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSeg, [])}),
    fields: () => ({
      [dartx.pathSegType]: core.int,
      [dartx.pathSegTypeAsLetter]: core.String
    }),
    sfields: () => ({
      PATHSEG_ARC_ABS: core.int,
      PATHSEG_ARC_REL: core.int,
      PATHSEG_CLOSEPATH: core.int,
      PATHSEG_CURVETO_CUBIC_ABS: core.int,
      PATHSEG_CURVETO_CUBIC_REL: core.int,
      PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: core.int,
      PATHSEG_CURVETO_CUBIC_SMOOTH_REL: core.int,
      PATHSEG_CURVETO_QUADRATIC_ABS: core.int,
      PATHSEG_CURVETO_QUADRATIC_REL: core.int,
      PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: core.int,
      PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: core.int,
      PATHSEG_LINETO_ABS: core.int,
      PATHSEG_LINETO_HORIZONTAL_ABS: core.int,
      PATHSEG_LINETO_HORIZONTAL_REL: core.int,
      PATHSEG_LINETO_REL: core.int,
      PATHSEG_LINETO_VERTICAL_ABS: core.int,
      PATHSEG_LINETO_VERTICAL_REL: core.int,
      PATHSEG_MOVETO_ABS: core.int,
      PATHSEG_MOVETO_REL: core.int,
      PATHSEG_UNKNOWN: core.int
    })
  });
  svg$.PathSeg.PATHSEG_ARC_ABS = 10;
  svg$.PathSeg.PATHSEG_ARC_REL = 11;
  svg$.PathSeg.PATHSEG_CLOSEPATH = 1;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
  svg$.PathSeg.PATHSEG_LINETO_ABS = 4;
  svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
  svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
  svg$.PathSeg.PATHSEG_LINETO_REL = 5;
  svg$.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
  svg$.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
  svg$.PathSeg.PATHSEG_MOVETO_ABS = 2;
  svg$.PathSeg.PATHSEG_MOVETO_REL = 3;
  svg$.PathSeg.PATHSEG_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGPathSeg, svg$.PathSeg);
  dart.defineExtensionNames([
    'angle',
    'largeArcFlag',
    'r1',
    'r2',
    'sweepFlag',
    'x',
    'y'
  ]);
  svg$.PathSegArcAbs = class PathSegArcAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    set [dartx.angle](value) {
      this.angle = value;
    }
    get [dartx.largeArcFlag]() {
      return this.largeArcFlag;
    }
    set [dartx.largeArcFlag](value) {
      this.largeArcFlag = value;
    }
    get [dartx.r1]() {
      return this.r1;
    }
    set [dartx.r1](value) {
      this.r1 = value;
    }
    get [dartx.r2]() {
      return this.r2;
    }
    set [dartx.r2](value) {
      this.r2 = value;
    }
    get [dartx.sweepFlag]() {
      return this.sweepFlag;
    }
    set [dartx.sweepFlag](value) {
      this.sweepFlag = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegArcAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcAbs, [])}),
    fields: () => ({
      [dartx.angle]: core.num,
      [dartx.largeArcFlag]: core.bool,
      [dartx.r1]: core.num,
      [dartx.r2]: core.num,
      [dartx.sweepFlag]: core.bool,
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegArcAbs, svg$.PathSegArcAbs);
  dart.defineExtensionNames([
    'angle',
    'largeArcFlag',
    'r1',
    'r2',
    'sweepFlag',
    'x',
    'y'
  ]);
  svg$.PathSegArcRel = class PathSegArcRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    set [dartx.angle](value) {
      this.angle = value;
    }
    get [dartx.largeArcFlag]() {
      return this.largeArcFlag;
    }
    set [dartx.largeArcFlag](value) {
      this.largeArcFlag = value;
    }
    get [dartx.r1]() {
      return this.r1;
    }
    set [dartx.r1](value) {
      this.r1 = value;
    }
    get [dartx.r2]() {
      return this.r2;
    }
    set [dartx.r2](value) {
      this.r2 = value;
    }
    get [dartx.sweepFlag]() {
      return this.sweepFlag;
    }
    set [dartx.sweepFlag](value) {
      this.sweepFlag = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegArcRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcRel, [])}),
    fields: () => ({
      [dartx.angle]: core.num,
      [dartx.largeArcFlag]: core.bool,
      [dartx.r1]: core.num,
      [dartx.r2]: core.num,
      [dartx.sweepFlag]: core.bool,
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegArcRel, svg$.PathSegArcRel);
  svg$.PathSegClosePath = class PathSegClosePath extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(svg$.PathSegClosePath, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegClosePath, [])})
  });
  dart.registerExtension(dart.global.SVGPathSegClosePath, svg$.PathSegClosePath);
  dart.defineExtensionNames([
    'x',
    'x1',
    'x2',
    'y',
    'y1',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg$.PathSegCurvetoCubicAbs);
  dart.defineExtensionNames([
    'x',
    'x1',
    'x2',
    'y',
    'y1',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg$.PathSegCurvetoCubicRel);
  dart.defineExtensionNames([
    'x',
    'x2',
    'y',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicSmoothAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg$.PathSegCurvetoCubicSmoothAbs);
  dart.defineExtensionNames([
    'x',
    'x2',
    'y',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicSmoothRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg$.PathSegCurvetoCubicSmoothRel);
  dart.defineExtensionNames([
    'x',
    'x1',
    'y',
    'y1'
  ]);
  svg$.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg$.PathSegCurvetoQuadraticAbs);
  dart.defineExtensionNames([
    'x',
    'x1',
    'y',
    'y1'
  ]);
  svg$.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg$.PathSegCurvetoQuadraticRel);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg$.PathSegCurvetoQuadraticSmoothAbs);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg$.PathSegCurvetoQuadraticSmoothRel);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegLinetoAbs = class PathSegLinetoAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg$.PathSegLinetoAbs);
  dart.defineExtensionNames([
    'x'
  ]);
  svg$.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoHorizontalAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [])}),
    fields: () => ({[dartx.x]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg$.PathSegLinetoHorizontalAbs);
  dart.defineExtensionNames([
    'x'
  ]);
  svg$.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoHorizontalRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [])}),
    fields: () => ({[dartx.x]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg$.PathSegLinetoHorizontalRel);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegLinetoRel = class PathSegLinetoRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg$.PathSegLinetoRel);
  dart.defineExtensionNames([
    'y'
  ]);
  svg$.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoVerticalAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [])}),
    fields: () => ({[dartx.y]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg$.PathSegLinetoVerticalAbs);
  dart.defineExtensionNames([
    'y'
  ]);
  svg$.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoVerticalRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [])}),
    fields: () => ({[dartx.y]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg$.PathSegLinetoVerticalRel);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.PathSeg), html$.ImmutableListMixin$(svg$.PathSeg)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.PathSegList[dart.implements] = () => [ListOfPathSeg()];
  dart.setSignature(svg$.PathSegList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.PathSeg, []),
      [dartx.last]: dart.definiteFunctionType(svg$.PathSeg, []),
      [dartx.single]: dart.definiteFunctionType(svg$.PathSeg, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGPathSegList, svg$.PathSegList);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegMovetoAbs = class PathSegMovetoAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegMovetoAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg$.PathSegMovetoAbs);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegMovetoRel = class PathSegMovetoRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegMovetoRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg$.PathSegMovetoRel);
  dart.defineExtensionNames([
    'hasExtension',
    'height',
    'patternContentUnits',
    'patternTransform',
    'patternUnits',
    'width',
    'x',
    'y',
    'preserveAspectRatio',
    'viewBox',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage',
    'href'
  ]);
  svg$.PatternElement = class PatternElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.patternContentUnits] = null;
      this[dartx.patternTransform] = null;
      this[dartx.patternUnits] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.patternContentUnits]() {
      return this.patternContentUnits;
    }
    get [dartx.patternTransform]() {
      return this.patternTransform;
    }
    get [dartx.patternUnits]() {
      return this.patternUnits;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.PatternElement, 'created');
  svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
  dart.setSignature(svg$.PatternElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PatternElement, []),
      new: dart.definiteFunctionType(svg$.PatternElement, []),
      created: dart.definiteFunctionType(svg$.PatternElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.patternContentUnits]: svg$.AnimatedEnumeration,
      [dartx.patternTransform]: svg$.AnimatedTransformList,
      [dartx.patternUnits]: svg$.AnimatedEnumeration,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList,
      [dartx.href]: svg$.AnimatedString
    }),
    methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
  });
  dart.registerExtension(dart.global.SVGPatternElement, svg$.PatternElement);
  dart.defineExtensionNames([
    'matrixTransform',
    'x',
    'y'
  ]);
  svg$.Point = class Point extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    [dartx.matrixTransform](...args) {
      return this.matrixTransform.apply(this, args);
    }
  };
  dart.setSignature(svg$.Point, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Point, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    }),
    methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg$.Point, [svg$.Matrix])})
  });
  dart.registerExtension(dart.global.SVGPoint, svg$.Point);
  dart.defineExtensionNames([
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'length',
    'numberOfItems'
  ]);
  svg$.PointList = class PointList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  dart.setSignature(svg$.PointList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PointList, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [dartx.numberOfItems]: core.int
    }),
    methods: () => ({
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Point]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGPointList, svg$.PointList);
  dart.defineExtensionNames([
    'animatedPoints',
    'points'
  ]);
  svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
    }
    created() {
      this[dartx.animatedPoints] = null;
      this[dartx.points] = null;
      super.created();
    }
    get [dartx.animatedPoints]() {
      return this.animatedPoints;
    }
    get [dartx.points]() {
      return this.points;
    }
  };
  dart.defineNamedConstructor(svg$.PolygonElement, 'created');
  dart.setSignature(svg$.PolygonElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PolygonElement, []),
      new: dart.definiteFunctionType(svg$.PolygonElement, []),
      created: dart.definiteFunctionType(svg$.PolygonElement, [])
    }),
    fields: () => ({
      [dartx.animatedPoints]: svg$.PointList,
      [dartx.points]: svg$.PointList
    })
  });
  dart.registerExtension(dart.global.SVGPolygonElement, svg$.PolygonElement);
  dart.defineExtensionNames([
    'animatedPoints',
    'points'
  ]);
  svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
    }
    created() {
      this[dartx.animatedPoints] = null;
      this[dartx.points] = null;
      super.created();
    }
    get [dartx.animatedPoints]() {
      return this.animatedPoints;
    }
    get [dartx.points]() {
      return this.points;
    }
  };
  dart.defineNamedConstructor(svg$.PolylineElement, 'created');
  dart.setSignature(svg$.PolylineElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PolylineElement, []),
      new: dart.definiteFunctionType(svg$.PolylineElement, []),
      created: dart.definiteFunctionType(svg$.PolylineElement, [])
    }),
    fields: () => ({
      [dartx.animatedPoints]: svg$.PointList,
      [dartx.points]: svg$.PointList
    })
  });
  dart.registerExtension(dart.global.SVGPolylineElement, svg$.PolylineElement);
  dart.defineExtensionNames([
    'align',
    'meetOrSlice'
  ]);
  svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.align]() {
      return this.align;
    }
    set [dartx.align](value) {
      this.align = value;
    }
    get [dartx.meetOrSlice]() {
      return this.meetOrSlice;
    }
    set [dartx.meetOrSlice](value) {
      this.meetOrSlice = value;
    }
  };
  dart.setSignature(svg$.PreserveAspectRatio, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PreserveAspectRatio, [])}),
    fields: () => ({
      [dartx.align]: core.int,
      [dartx.meetOrSlice]: core.int
    }),
    sfields: () => ({
      SVG_MEETORSLICE_MEET: core.int,
      SVG_MEETORSLICE_SLICE: core.int,
      SVG_MEETORSLICE_UNKNOWN: core.int,
      SVG_PRESERVEASPECTRATIO_NONE: core.int,
      SVG_PRESERVEASPECTRATIO_UNKNOWN: core.int,
      SVG_PRESERVEASPECTRATIO_XMAXYMAX: core.int,
      SVG_PRESERVEASPECTRATIO_XMAXYMID: core.int,
      SVG_PRESERVEASPECTRATIO_XMAXYMIN: core.int,
      SVG_PRESERVEASPECTRATIO_XMIDYMAX: core.int,
      SVG_PRESERVEASPECTRATIO_XMIDYMID: core.int,
      SVG_PRESERVEASPECTRATIO_XMIDYMIN: core.int,
      SVG_PRESERVEASPECTRATIO_XMINYMAX: core.int,
      SVG_PRESERVEASPECTRATIO_XMINYMID: core.int,
      SVG_PRESERVEASPECTRATIO_XMINYMIN: core.int
    })
  });
  svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
  svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
  svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
  dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg$.PreserveAspectRatio);
  dart.defineExtensionNames([
    'cx',
    'cy',
    'fr',
    'fx',
    'fy',
    'r'
  ]);
  svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
    }
    created() {
      this[dartx.cx] = null;
      this[dartx.cy] = null;
      this[dartx.fr] = null;
      this[dartx.fx] = null;
      this[dartx.fy] = null;
      this[dartx.r] = null;
      super.created();
    }
    get [dartx.cx]() {
      return this.cx;
    }
    get [dartx.cy]() {
      return this.cy;
    }
    get [dartx.fr]() {
      return this.fr;
    }
    get [dartx.fx]() {
      return this.fx;
    }
    get [dartx.fy]() {
      return this.fy;
    }
    get [dartx.r]() {
      return this.r;
    }
  };
  dart.defineNamedConstructor(svg$.RadialGradientElement, 'created');
  dart.setSignature(svg$.RadialGradientElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.RadialGradientElement, []),
      new: dart.definiteFunctionType(svg$.RadialGradientElement, []),
      created: dart.definiteFunctionType(svg$.RadialGradientElement, [])
    }),
    fields: () => ({
      [dartx.cx]: svg$.AnimatedLength,
      [dartx.cy]: svg$.AnimatedLength,
      [dartx.fr]: svg$.AnimatedLength,
      [dartx.fx]: svg$.AnimatedLength,
      [dartx.fy]: svg$.AnimatedLength,
      [dartx.r]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGRadialGradientElement, svg$.RadialGradientElement);
  dart.defineExtensionNames([
    'height',
    'width',
    'x',
    'y'
  ]);
  svg$.Rect = class Rect extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.Rect, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Rect, [])}),
    fields: () => ({
      [dartx.height]: core.num,
      [dartx.width]: core.num,
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGRect, svg$.Rect);
  dart.defineExtensionNames([
    'height',
    'rx',
    'ry',
    'width',
    'x',
    'y'
  ]);
  svg$.RectElement = class RectElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.rx] = null;
      this[dartx.ry] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.rx]() {
      return this.rx;
    }
    get [dartx.ry]() {
      return this.ry;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.RectElement, 'created');
  dart.setSignature(svg$.RectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.RectElement, []),
      new: dart.definiteFunctionType(svg$.RectElement, []),
      created: dart.definiteFunctionType(svg$.RectElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.rx]: svg$.AnimatedLength,
      [dartx.ry]: svg$.AnimatedLength,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGRectElement, svg$.RectElement);
  dart.defineExtensionNames([
    'type',
    'href'
  ]);
  svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
    }
    created() {
      this[dartx.type] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.ScriptElement, 'created');
  svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.ScriptElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ScriptElement, []),
      new: dart.definiteFunctionType(svg$.ScriptElement, []),
      created: dart.definiteFunctionType(svg$.ScriptElement, [])
    }),
    fields: () => ({
      [dartx.type]: core.String,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGScriptElement, svg$.ScriptElement);
  svg$.SetElement = class SetElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('set')) && svg$.SetElement.is(svg$.SvgElement.tag('set'));
    }
  };
  dart.defineNamedConstructor(svg$.SetElement, 'created');
  dart.setSignature(svg$.SetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.SetElement, []),
      new: dart.definiteFunctionType(svg$.SetElement, []),
      created: dart.definiteFunctionType(svg$.SetElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGSetElement, svg$.SetElement);
  dart.defineExtensionNames([
    'gradientOffset'
  ]);
  svg$.StopElement = class StopElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
    }
    created() {
      this[dartx.gradientOffset] = null;
      super.created();
    }
    get [dartx.gradientOffset]() {
      return this.offset;
    }
  };
  dart.defineNamedConstructor(svg$.StopElement, 'created');
  dart.setSignature(svg$.StopElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.StopElement, []),
      new: dart.definiteFunctionType(svg$.StopElement, []),
      created: dart.definiteFunctionType(svg$.StopElement, [])
    }),
    fields: () => ({[dartx.gradientOffset]: svg$.AnimatedNumber})
  });
  dart.registerExtension(dart.global.SVGStopElement, svg$.StopElement);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.StringList[dart.implements] = () => [ListOfString()];
  dart.setSignature(svg$.StringList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.StringList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(core.String, []),
      [dartx.last]: dart.definiteFunctionType(core.String, []),
      [dartx.single]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.elementAt]: dart.definiteFunctionType(core.String, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.appendItem]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.getItem]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(core.String, [core.String, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(core.String, [core.String, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGStringList, svg$.StringList);
  dart.defineExtensionNames([
    'disabled',
    'media',
    'sheet',
    'type'
  ]);
  svg$.StyleElement = class StyleElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.media] = null;
      this[dartx.sheet] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(svg$.StyleElement, 'created');
  dart.setSignature(svg$.StyleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.StyleElement, []),
      new: dart.definiteFunctionType(svg$.StyleElement, []),
      created: dart.definiteFunctionType(svg$.StyleElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.media]: core.String,
      [dartx.sheet]: html$.StyleSheet,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.SVGStyleElement, svg$.StyleElement);
  const _element$0 = Symbol('_element');
  svg$._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
    new(element) {
      this[_element$0] = element;
    }
    readClasses() {
      let classname = this[_element$0][dartx.attributes][dartx._get]('class');
      let s = LinkedHashSetOfString().new();
      if (classname == null) {
        return s;
      }
      for (let name of classname[dartx.split](' ')) {
        let trimmed = name[dartx.trim]();
        if (!dart.test(trimmed[dartx.isEmpty])) {
          s.add(trimmed);
        }
      }
      return s;
    }
    writeClasses(s) {
      this[_element$0][dartx.attributes][dartx._set]('class', s.join(' '));
    }
  };
  dart.setSignature(svg$._AttributeClassSet, {
    constructors: () => ({new: dart.definiteFunctionType(svg$._AttributeClassSet, [html$.Element])}),
    fields: () => ({[_element$0]: html$.Element}),
    methods: () => ({
      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
      writeClasses: dart.definiteFunctionType(dart.void, [core.Set])
    })
  });
  dart.defineExtensionNames([
    'animationsPaused',
    'checkEnclosure',
    'checkIntersection',
    'createSvgAngle',
    'createSvgLength',
    'createSvgMatrix',
    'createSvgNumber',
    'createSvgPoint',
    'createSvgRect',
    'createSvgTransform',
    'createSvgTransformFromMatrix',
    'deselectAll',
    'forceRedraw',
    'getCurrentTime',
    'getElementById',
    'getEnclosureList',
    'getIntersectionList',
    'pauseAnimations',
    'setCurrentTime',
    'suspendRedraw',
    'unpauseAnimations',
    'unsuspendRedraw',
    'unsuspendRedrawAll',
    'currentScale',
    'currentTranslate',
    'currentView',
    'height',
    'pixelUnitToMillimeterX',
    'pixelUnitToMillimeterY',
    'screenPixelToMillimeterX',
    'screenPixelToMillimeterY',
    'useCurrentView',
    'viewport',
    'width',
    'x',
    'y',
    'preserveAspectRatio',
    'viewBox',
    'zoomAndPan'
  ]);
  svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
    static new() {
      let el = svg$.SvgElement.tag("svg");
      el[dartx.attributes][dartx._set]('version', "1.1");
      return svg$.SvgSvgElement._check(el);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.currentScale] = null;
      this[dartx.currentTranslate] = null;
      this[dartx.currentView] = null;
      this[dartx.height] = null;
      this[dartx.pixelUnitToMillimeterX] = null;
      this[dartx.pixelUnitToMillimeterY] = null;
      this[dartx.screenPixelToMillimeterX] = null;
      this[dartx.screenPixelToMillimeterY] = null;
      this[dartx.useCurrentView] = null;
      this[dartx.viewport] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      this[dartx.zoomAndPan] = null;
      super.created();
    }
    get [dartx.currentScale]() {
      return this.currentScale;
    }
    set [dartx.currentScale](value) {
      this.currentScale = value;
    }
    get [dartx.currentTranslate]() {
      return this.currentTranslate;
    }
    get [dartx.currentView]() {
      return this.currentView;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.pixelUnitToMillimeterX]() {
      return this.pixelUnitToMillimeterX;
    }
    get [dartx.pixelUnitToMillimeterY]() {
      return this.pixelUnitToMillimeterY;
    }
    get [dartx.screenPixelToMillimeterX]() {
      return this.screenPixelToMillimeterX;
    }
    get [dartx.screenPixelToMillimeterY]() {
      return this.screenPixelToMillimeterY;
    }
    get [dartx.useCurrentView]() {
      return this.useCurrentView;
    }
    get [dartx.viewport]() {
      return this.viewport;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    [dartx.animationsPaused](...args) {
      return this.animationsPaused.apply(this, args);
    }
    [dartx.checkEnclosure](...args) {
      return this.checkEnclosure.apply(this, args);
    }
    [dartx.checkIntersection](...args) {
      return this.checkIntersection.apply(this, args);
    }
    [dartx.createSvgAngle](...args) {
      return this.createSVGAngle.apply(this, args);
    }
    [dartx.createSvgLength](...args) {
      return this.createSVGLength.apply(this, args);
    }
    [dartx.createSvgMatrix](...args) {
      return this.createSVGMatrix.apply(this, args);
    }
    [dartx.createSvgNumber](...args) {
      return this.createSVGNumber.apply(this, args);
    }
    [dartx.createSvgPoint](...args) {
      return this.createSVGPoint.apply(this, args);
    }
    [dartx.createSvgRect](...args) {
      return this.createSVGRect.apply(this, args);
    }
    [dartx.createSvgTransform](...args) {
      return this.createSVGTransform.apply(this, args);
    }
    [dartx.createSvgTransformFromMatrix](...args) {
      return this.createSVGTransformFromMatrix.apply(this, args);
    }
    [dartx.deselectAll](...args) {
      return this.deselectAll.apply(this, args);
    }
    [dartx.forceRedraw](...args) {
      return this.forceRedraw.apply(this, args);
    }
    [dartx.getCurrentTime](...args) {
      return this.getCurrentTime.apply(this, args);
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
    [dartx.getEnclosureList](...args) {
      return this.getEnclosureList.apply(this, args);
    }
    [dartx.getIntersectionList](...args) {
      return this.getIntersectionList.apply(this, args);
    }
    [dartx.pauseAnimations](...args) {
      return this.pauseAnimations.apply(this, args);
    }
    [dartx.setCurrentTime](...args) {
      return this.setCurrentTime.apply(this, args);
    }
    [dartx.suspendRedraw](...args) {
      return this.suspendRedraw.apply(this, args);
    }
    [dartx.unpauseAnimations](...args) {
      return this.unpauseAnimations.apply(this, args);
    }
    [dartx.unsuspendRedraw](...args) {
      return this.unsuspendRedraw.apply(this, args);
    }
    [dartx.unsuspendRedrawAll](...args) {
      return this.unsuspendRedrawAll.apply(this, args);
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.zoomAndPan]() {
      return this.zoomAndPan;
    }
    set [dartx.zoomAndPan](value) {
      this.zoomAndPan = value;
    }
  };
  dart.defineNamedConstructor(svg$.SvgSvgElement, 'created');
  svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
  dart.setSignature(svg$.SvgSvgElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(svg$.SvgSvgElement, []),
      _: dart.definiteFunctionType(svg$.SvgSvgElement, []),
      created: dart.definiteFunctionType(svg$.SvgSvgElement, [])
    }),
    fields: () => ({
      [dartx.currentScale]: core.num,
      [dartx.currentTranslate]: svg$.Point,
      [dartx.currentView]: svg$.ViewSpec,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.pixelUnitToMillimeterX]: core.double,
      [dartx.pixelUnitToMillimeterY]: core.double,
      [dartx.screenPixelToMillimeterX]: core.double,
      [dartx.screenPixelToMillimeterY]: core.double,
      [dartx.useCurrentView]: core.bool,
      [dartx.viewport]: svg$.Rect,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.zoomAndPan]: core.int
    }),
    methods: () => ({
      [dartx.animationsPaused]: dart.definiteFunctionType(core.bool, []),
      [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
      [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
      [dartx.createSvgAngle]: dart.definiteFunctionType(svg$.Angle, []),
      [dartx.createSvgLength]: dart.definiteFunctionType(svg$.Length, []),
      [dartx.createSvgMatrix]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.createSvgNumber]: dart.definiteFunctionType(svg$.Number, []),
      [dartx.createSvgPoint]: dart.definiteFunctionType(svg$.Point, []),
      [dartx.createSvgRect]: dart.definiteFunctionType(svg$.Rect, []),
      [dartx.createSvgTransform]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
      [dartx.deselectAll]: dart.definiteFunctionType(dart.void, []),
      [dartx.forceRedraw]: dart.definiteFunctionType(dart.void, []),
      [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
      [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
      [dartx.pauseAnimations]: dart.definiteFunctionType(dart.void, []),
      [dartx.setCurrentTime]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.suspendRedraw]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.unpauseAnimations]: dart.definiteFunctionType(dart.void, []),
      [dartx.unsuspendRedraw]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.unsuspendRedrawAll]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.SVGSVGElement, svg$.SvgSvgElement);
  svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.SwitchElement, 'created');
  dart.setSignature(svg$.SwitchElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.SwitchElement, []),
      new: dart.definiteFunctionType(svg$.SwitchElement, []),
      created: dart.definiteFunctionType(svg$.SwitchElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGSwitchElement, svg$.SwitchElement);
  dart.defineExtensionNames([
    'preserveAspectRatio',
    'viewBox'
  ]);
  svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
    }
    created() {
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      super.created();
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
  };
  dart.defineNamedConstructor(svg$.SymbolElement, 'created');
  svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
  dart.setSignature(svg$.SymbolElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.SymbolElement, []),
      new: dart.definiteFunctionType(svg$.SymbolElement, []),
      created: dart.definiteFunctionType(svg$.SymbolElement, [])
    }),
    fields: () => ({
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect
    })
  });
  dart.registerExtension(dart.global.SVGSymbolElement, svg$.SymbolElement);
  dart.defineExtensionNames([
    'getCharNumAtPosition',
    'getComputedTextLength',
    'getEndPositionOfChar',
    'getExtentOfChar',
    'getNumberOfChars',
    'getRotationOfChar',
    'getStartPositionOfChar',
    'getSubStringLength',
    'selectSubString',
    'lengthAdjust',
    'textLength'
  ]);
  svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.lengthAdjust] = null;
      this[dartx.textLength] = null;
      super.created();
    }
    get [dartx.lengthAdjust]() {
      return this.lengthAdjust;
    }
    get [dartx.textLength]() {
      return this.textLength;
    }
    [dartx.getCharNumAtPosition](...args) {
      return this.getCharNumAtPosition.apply(this, args);
    }
    [dartx.getComputedTextLength](...args) {
      return this.getComputedTextLength.apply(this, args);
    }
    [dartx.getEndPositionOfChar](...args) {
      return this.getEndPositionOfChar.apply(this, args);
    }
    [dartx.getExtentOfChar](...args) {
      return this.getExtentOfChar.apply(this, args);
    }
    [dartx.getNumberOfChars](...args) {
      return this.getNumberOfChars.apply(this, args);
    }
    [dartx.getRotationOfChar](...args) {
      return this.getRotationOfChar.apply(this, args);
    }
    [dartx.getStartPositionOfChar](...args) {
      return this.getStartPositionOfChar.apply(this, args);
    }
    [dartx.getSubStringLength](...args) {
      return this.getSubStringLength.apply(this, args);
    }
    [dartx.selectSubString](...args) {
      return this.selectSubString.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.TextContentElement, 'created');
  dart.setSignature(svg$.TextContentElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextContentElement, []),
      created: dart.definiteFunctionType(svg$.TextContentElement, [])
    }),
    fields: () => ({
      [dartx.lengthAdjust]: svg$.AnimatedEnumeration,
      [dartx.textLength]: svg$.AnimatedLength
    }),
    methods: () => ({
      [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg$.Point]),
      [dartx.getComputedTextLength]: dart.definiteFunctionType(core.double, []),
      [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.getExtentOfChar]: dart.definiteFunctionType(svg$.Rect, [core.int]),
      [dartx.getNumberOfChars]: dart.definiteFunctionType(core.int, []),
      [dartx.getRotationOfChar]: dart.definiteFunctionType(core.double, [core.int]),
      [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.getSubStringLength]: dart.definiteFunctionType(core.double, [core.int, core.int]),
      [dartx.selectSubString]: dart.definiteFunctionType(dart.void, [core.int, core.int])
    }),
    sfields: () => ({
      LENGTHADJUST_SPACING: core.int,
      LENGTHADJUST_SPACINGANDGLYPHS: core.int,
      LENGTHADJUST_UNKNOWN: core.int
    })
  });
  svg$.TextContentElement.LENGTHADJUST_SPACING = 1;
  svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
  svg$.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGTextContentElement, svg$.TextContentElement);
  dart.defineExtensionNames([
    'dx',
    'dy',
    'rotate',
    'x',
    'y'
  ]);
  svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.dx] = null;
      this[dartx.dy] = null;
      this[dartx.rotate] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.dx]() {
      return this.dx;
    }
    get [dartx.dy]() {
      return this.dy;
    }
    get [dartx.rotate]() {
      return this.rotate;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.TextPositioningElement, 'created');
  dart.setSignature(svg$.TextPositioningElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextPositioningElement, []),
      created: dart.definiteFunctionType(svg$.TextPositioningElement, [])
    }),
    fields: () => ({
      [dartx.dx]: svg$.AnimatedLengthList,
      [dartx.dy]: svg$.AnimatedLengthList,
      [dartx.rotate]: svg$.AnimatedNumberList,
      [dartx.x]: svg$.AnimatedLengthList,
      [dartx.y]: svg$.AnimatedLengthList
    })
  });
  dart.registerExtension(dart.global.SVGTextPositioningElement, svg$.TextPositioningElement);
  svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.TSpanElement, 'created');
  dart.setSignature(svg$.TSpanElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TSpanElement, []),
      new: dart.definiteFunctionType(svg$.TSpanElement, []),
      created: dart.definiteFunctionType(svg$.TSpanElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGTSpanElement, svg$.TSpanElement);
  dart.defineExtensionNames([
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.Tests = class Tests extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get requiredExtensions() {
      return this[requiredExtensions];
    }
    set requiredExtensions(value) {
      super.requiredExtensions = value;
    }
    get requiredFeatures() {
      return this[requiredFeatures];
    }
    set requiredFeatures(value) {
      super.requiredFeatures = value;
    }
    get systemLanguage() {
      return this[systemLanguage];
    }
    set systemLanguage(value) {
      super.systemLanguage = value;
    }
  };
  const requiredExtensions = Symbol(svg$.Tests.name + "." + 'requiredExtensions'.toString());
  const requiredFeatures = Symbol(svg$.Tests.name + "." + 'requiredFeatures'.toString());
  const systemLanguage = Symbol(svg$.Tests.name + "." + 'systemLanguage'.toString());
  dart.setSignature(svg$.Tests, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Tests, [])}),
    fields: () => ({
      requiredExtensions: svg$.StringList,
      requiredFeatures: svg$.StringList,
      systemLanguage: svg$.StringList
    })
  });
  dart.defineExtensionMembers(svg$.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
  svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.TextElement, 'created');
  dart.setSignature(svg$.TextElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextElement, []),
      new: dart.definiteFunctionType(svg$.TextElement, []),
      created: dart.definiteFunctionType(svg$.TextElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGTextElement, svg$.TextElement);
  dart.defineExtensionNames([
    'method',
    'spacing',
    'startOffset',
    'href'
  ]);
  svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.method] = null;
      this[dartx.spacing] = null;
      this[dartx.startOffset] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.method]() {
      return this.method;
    }
    get [dartx.spacing]() {
      return this.spacing;
    }
    get [dartx.startOffset]() {
      return this.startOffset;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.TextPathElement, 'created');
  svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.TextPathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextPathElement, []),
      created: dart.definiteFunctionType(svg$.TextPathElement, [])
    }),
    fields: () => ({
      [dartx.method]: svg$.AnimatedEnumeration,
      [dartx.spacing]: svg$.AnimatedEnumeration,
      [dartx.startOffset]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    }),
    sfields: () => ({
      TEXTPATH_METHODTYPE_ALIGN: core.int,
      TEXTPATH_METHODTYPE_STRETCH: core.int,
      TEXTPATH_METHODTYPE_UNKNOWN: core.int,
      TEXTPATH_SPACINGTYPE_AUTO: core.int,
      TEXTPATH_SPACINGTYPE_EXACT: core.int,
      TEXTPATH_SPACINGTYPE_UNKNOWN: core.int
    })
  });
  svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
  svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
  svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGTextPathElement, svg$.TextPathElement);
  svg$.TitleElement = class TitleElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.TitleElement, 'created');
  dart.setSignature(svg$.TitleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TitleElement, []),
      new: dart.definiteFunctionType(svg$.TitleElement, []),
      created: dart.definiteFunctionType(svg$.TitleElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGTitleElement, svg$.TitleElement);
  dart.defineExtensionNames([
    'setMatrix',
    'setRotate',
    'setScale',
    'setSkewX',
    'setSkewY',
    'setTranslate',
    'angle',
    'matrix',
    'type'
  ]);
  svg$.Transform = class Transform extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    get [dartx.matrix]() {
      return this.matrix;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.setMatrix](...args) {
      return this.setMatrix.apply(this, args);
    }
    [dartx.setRotate](...args) {
      return this.setRotate.apply(this, args);
    }
    [dartx.setScale](...args) {
      return this.setScale.apply(this, args);
    }
    [dartx.setSkewX](...args) {
      return this.setSkewX.apply(this, args);
    }
    [dartx.setSkewY](...args) {
      return this.setSkewY.apply(this, args);
    }
    [dartx.setTranslate](...args) {
      return this.setTranslate.apply(this, args);
    }
  };
  dart.setSignature(svg$.Transform, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Transform, [])}),
    fields: () => ({
      [dartx.angle]: core.double,
      [dartx.matrix]: svg$.Matrix,
      [dartx.type]: core.int
    }),
    methods: () => ({
      [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg$.Matrix]),
      [dartx.setRotate]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setScale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.setSkewX]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.setSkewY]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.setTranslate]: dart.definiteFunctionType(dart.void, [core.num, core.num])
    }),
    sfields: () => ({
      SVG_TRANSFORM_MATRIX: core.int,
      SVG_TRANSFORM_ROTATE: core.int,
      SVG_TRANSFORM_SCALE: core.int,
      SVG_TRANSFORM_SKEWX: core.int,
      SVG_TRANSFORM_SKEWY: core.int,
      SVG_TRANSFORM_TRANSLATE: core.int,
      SVG_TRANSFORM_UNKNOWN: core.int
    })
  });
  svg$.Transform.SVG_TRANSFORM_MATRIX = 1;
  svg$.Transform.SVG_TRANSFORM_ROTATE = 4;
  svg$.Transform.SVG_TRANSFORM_SCALE = 3;
  svg$.Transform.SVG_TRANSFORM_SKEWX = 5;
  svg$.Transform.SVG_TRANSFORM_SKEWY = 6;
  svg$.Transform.SVG_TRANSFORM_TRANSLATE = 2;
  svg$.Transform.SVG_TRANSFORM_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGTransform, svg$.Transform);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'consolidate',
    'createSvgTransformFromMatrix',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Transform), html$.ImmutableListMixin$(svg$.Transform)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.consolidate](...args) {
      return this.consolidate.apply(this, args);
    }
    [dartx.createSvgTransformFromMatrix](...args) {
      return this.createSVGTransformFromMatrix.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.TransformList[dart.implements] = () => [ListOfTransform()];
  dart.setSignature(svg$.TransformList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.TransformList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.last]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.single]: dart.definiteFunctionType(svg$.Transform, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
      [dartx.consolidate]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGTransformList, svg$.TransformList);
  svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(svg$.UnitTypes, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.UnitTypes, [])}),
    sfields: () => ({
      SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: core.int,
      SVG_UNIT_TYPE_UNKNOWN: core.int,
      SVG_UNIT_TYPE_USERSPACEONUSE: core.int
    })
  });
  svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
  svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
  svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
  dart.registerExtension(dart.global.SVGUnitTypes, svg$.UnitTypes);
  dart.defineExtensionNames([
    'href'
  ]);
  svg$.UriReference = class UriReference extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get href() {
      return this[href$0];
    }
    set href(value) {
      super.href = value;
    }
  };
  const href$0 = Symbol(svg$.UriReference.name + "." + 'href'.toString());
  dart.setSignature(svg$.UriReference, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.UriReference, [])}),
    fields: () => ({href: svg$.AnimatedString})
  });
  dart.defineExtensionMembers(svg$.UriReference, ['href']);
  dart.defineExtensionNames([
    'height',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.UseElement = class UseElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.UseElement, 'created');
  svg$.UseElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.UseElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.UseElement, []),
      new: dart.definiteFunctionType(svg$.UseElement, []),
      created: dart.definiteFunctionType(svg$.UseElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGUseElement, svg$.UseElement);
  dart.defineExtensionNames([
    'viewTarget',
    'preserveAspectRatio',
    'viewBox',
    'zoomAndPan'
  ]);
  svg$.ViewElement = class ViewElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
    }
    created() {
      this[dartx.viewTarget] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      this[dartx.zoomAndPan] = null;
      super.created();
    }
    get [dartx.viewTarget]() {
      return this.viewTarget;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.zoomAndPan]() {
      return this.zoomAndPan;
    }
    set [dartx.zoomAndPan](value) {
      this.zoomAndPan = value;
    }
  };
  dart.defineNamedConstructor(svg$.ViewElement, 'created');
  svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
  dart.setSignature(svg$.ViewElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ViewElement, []),
      new: dart.definiteFunctionType(svg$.ViewElement, []),
      created: dart.definiteFunctionType(svg$.ViewElement, [])
    }),
    fields: () => ({
      [dartx.viewTarget]: svg$.StringList,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.zoomAndPan]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGViewElement, svg$.ViewElement);
  dart.defineExtensionNames([
    'preserveAspectRatioString',
    'transform',
    'transformString',
    'viewBoxString',
    'viewTarget',
    'viewTargetString',
    'preserveAspectRatio',
    'viewBox',
    'zoomAndPan'
  ]);
  svg$.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.preserveAspectRatioString]() {
      return this.preserveAspectRatioString;
    }
    get [dartx.transform]() {
      return this.transform;
    }
    get [dartx.transformString]() {
      return this.transformString;
    }
    get [dartx.viewBoxString]() {
      return this.viewBoxString;
    }
    get [dartx.viewTarget]() {
      return this.viewTarget;
    }
    get [dartx.viewTargetString]() {
      return this.viewTargetString;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.zoomAndPan]() {
      return this.zoomAndPan;
    }
    set [dartx.zoomAndPan](value) {
      this.zoomAndPan = value;
    }
  };
  svg$.ViewSpec[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
  dart.setSignature(svg$.ViewSpec, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.ViewSpec, [])}),
    fields: () => ({
      [dartx.preserveAspectRatioString]: core.String,
      [dartx.transform]: svg$.TransformList,
      [dartx.transformString]: core.String,
      [dartx.viewBoxString]: core.String,
      [dartx.viewTarget]: svg$.SvgElement,
      [dartx.viewTargetString]: core.String,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.zoomAndPan]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGViewSpec, svg$.ViewSpec);
  dart.defineExtensionNames([
    'zoomAndPan'
  ]);
  svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get zoomAndPan() {
      return this[zoomAndPan];
    }
    set zoomAndPan(value) {
      this[zoomAndPan] = value;
    }
  };
  const zoomAndPan = Symbol(svg$.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
  dart.setSignature(svg$.ZoomAndPan, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomAndPan, [])}),
    fields: () => ({zoomAndPan: core.int}),
    sfields: () => ({
      SVG_ZOOMANDPAN_DISABLE: core.int,
      SVG_ZOOMANDPAN_MAGNIFY: core.int,
      SVG_ZOOMANDPAN_UNKNOWN: core.int
    })
  });
  dart.defineExtensionMembers(svg$.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
  svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
  svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
  svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
  dart.defineExtensionNames([
    'newScale',
    'newTranslate',
    'previousScale',
    'previousTranslate',
    'zoomRectScreen'
  ]);
  svg$.ZoomEvent = class ZoomEvent extends html$.UIEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.newScale]() {
      return this.newScale;
    }
    get [dartx.newTranslate]() {
      return this.newTranslate;
    }
    get [dartx.previousScale]() {
      return this.previousScale;
    }
    get [dartx.previousTranslate]() {
      return this.previousTranslate;
    }
    get [dartx.zoomRectScreen]() {
      return this.zoomRectScreen;
    }
  };
  dart.setSignature(svg$.ZoomEvent, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomEvent, [])}),
    fields: () => ({
      [dartx.newScale]: core.double,
      [dartx.newTranslate]: svg$.Point,
      [dartx.previousScale]: core.double,
      [dartx.previousTranslate]: svg$.Point,
      [dartx.zoomRectScreen]: svg$.Rect
    })
  });
  dart.registerExtension(dart.global.SVGZoomEvent, svg$.ZoomEvent);
  svg$._SVGCursorElement = class _SVGCursorElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$._SVGCursorElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('cursor')) && svg$._SVGCursorElement.is(svg$.SvgElement.tag('cursor'));
    }
  };
  dart.defineNamedConstructor(svg$._SVGCursorElement, 'created');
  svg$._SVGCursorElement[dart.implements] = () => [svg$.UriReference, svg$.Tests];
  dart.setSignature(svg$._SVGCursorElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGCursorElement, []),
      new: dart.definiteFunctionType(svg$._SVGCursorElement, []),
      created: dart.definiteFunctionType(svg$._SVGCursorElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGCursorElement, svg$._SVGCursorElement);
  svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$._SVGFEDropShadowElement, 'created');
  svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$._SVGFEDropShadowElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, []),
      created: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGFEDropShadowElement, svg$._SVGFEDropShadowElement);
  svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$._SVGMPathElement, 'created');
  svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$._SVGMPathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGMPathElement, []),
      new: dart.definiteFunctionType(svg$._SVGMPathElement, []),
      created: dart.definiteFunctionType(svg$._SVGMPathElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGMPathElement, svg$._SVGMPathElement);
  const _connect = Symbol('_connect');
  dart.defineExtensionNames([
    'disconnect',
    'connectNode',
    'connectParam',
    'channelCount',
    'channelCountMode',
    'channelInterpretation',
    'context',
    'numberOfInputs',
    'numberOfOutputs'
  ]);
  web_audio.AudioNode = class AudioNode extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.channelCount]() {
      return this.channelCount;
    }
    set [dartx.channelCount](value) {
      this.channelCount = value;
    }
    get [dartx.channelCountMode]() {
      return this.channelCountMode;
    }
    set [dartx.channelCountMode](value) {
      this.channelCountMode = value;
    }
    get [dartx.channelInterpretation]() {
      return this.channelInterpretation;
    }
    set [dartx.channelInterpretation](value) {
      this.channelInterpretation = value;
    }
    get [dartx.context]() {
      return this.context;
    }
    get [dartx.numberOfInputs]() {
      return this.numberOfInputs;
    }
    get [dartx.numberOfOutputs]() {
      return this.numberOfOutputs;
    }
    [_connect](...args) {
      return this.connect.apply(this, args);
    }
    [dartx.disconnect](...args) {
      return this.disconnect.apply(this, args);
    }
    [dartx.connectNode](destination, output, input) {
      if (output === void 0) output = 0;
      if (input === void 0) input = 0;
      return this[_connect](destination, output, input);
    }
    [dartx.connectParam](destination, output) {
      if (output === void 0) output = 0;
      return this[_connect](destination, output);
    }
  };
  dart.setSignature(web_audio.AudioNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioNode, [])}),
    fields: () => ({
      [dartx.channelCount]: core.int,
      [dartx.channelCountMode]: core.String,
      [dartx.channelInterpretation]: core.String,
      [dartx.context]: web_audio.AudioContext,
      [dartx.numberOfInputs]: core.int,
      [dartx.numberOfOutputs]: core.int
    }),
    methods: () => ({
      [_connect]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int], [core.int]),
      [dartx.disconnect]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.connectNode]: dart.definiteFunctionType(dart.void, [web_audio.AudioNode], [core.int, core.int]),
      [dartx.connectParam]: dart.definiteFunctionType(dart.void, [web_audio.AudioParam], [core.int])
    })
  });
  dart.registerExtension(dart.global.AudioNode, web_audio.AudioNode);
  dart.defineExtensionNames([
    'getByteFrequencyData',
    'getByteTimeDomainData',
    'getFloatFrequencyData',
    'getFloatTimeDomainData',
    'fftSize',
    'frequencyBinCount',
    'maxDecibels',
    'minDecibels',
    'smoothingTimeConstant'
  ]);
  web_audio.AnalyserNode = class AnalyserNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.fftSize]() {
      return this.fftSize;
    }
    set [dartx.fftSize](value) {
      this.fftSize = value;
    }
    get [dartx.frequencyBinCount]() {
      return this.frequencyBinCount;
    }
    get [dartx.maxDecibels]() {
      return this.maxDecibels;
    }
    set [dartx.maxDecibels](value) {
      this.maxDecibels = value;
    }
    get [dartx.minDecibels]() {
      return this.minDecibels;
    }
    set [dartx.minDecibels](value) {
      this.minDecibels = value;
    }
    get [dartx.smoothingTimeConstant]() {
      return this.smoothingTimeConstant;
    }
    set [dartx.smoothingTimeConstant](value) {
      this.smoothingTimeConstant = value;
    }
    [dartx.getByteFrequencyData](...args) {
      return this.getByteFrequencyData.apply(this, args);
    }
    [dartx.getByteTimeDomainData](...args) {
      return this.getByteTimeDomainData.apply(this, args);
    }
    [dartx.getFloatFrequencyData](...args) {
      return this.getFloatFrequencyData.apply(this, args);
    }
    [dartx.getFloatTimeDomainData](...args) {
      return this.getFloatTimeDomainData.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AnalyserNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AnalyserNode, [])}),
    fields: () => ({
      [dartx.fftSize]: core.int,
      [dartx.frequencyBinCount]: core.int,
      [dartx.maxDecibels]: core.num,
      [dartx.minDecibels]: core.num,
      [dartx.smoothingTimeConstant]: core.num
    }),
    methods: () => ({
      [dartx.getByteFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
      [dartx.getByteTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
      [dartx.getFloatFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List]),
      [dartx.getFloatTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List])
    })
  });
  dart.registerExtension(dart.global.AnalyserNode, web_audio.AnalyserNode);
  dart.registerExtension(dart.global.RealtimeAnalyserNode, web_audio.AnalyserNode);
  dart.defineExtensionNames([
    'getChannelData',
    'duration',
    'length',
    'numberOfChannels',
    'sampleRate'
  ]);
  web_audio.AudioBuffer = class AudioBuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfChannels]() {
      return this.numberOfChannels;
    }
    get [dartx.sampleRate]() {
      return this.sampleRate;
    }
    [dartx.getChannelData](...args) {
      return this.getChannelData.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AudioBuffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBuffer, [])}),
    fields: () => ({
      [dartx.duration]: core.double,
      [dartx.length]: core.int,
      [dartx.numberOfChannels]: core.int,
      [dartx.sampleRate]: core.double
    }),
    methods: () => ({[dartx.getChannelData]: dart.definiteFunctionType(typed_data.Float32List, [core.int])})
  });
  dart.registerExtension(dart.global.AudioBuffer, web_audio.AudioBuffer);
  web_audio.AudioBufferCallback = dart.typedef('AudioBufferCallback', () => dart.functionType(dart.void, [web_audio.AudioBuffer]));
  web_audio.AudioSourceNode = class AudioSourceNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.AudioSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioSourceNode, [])})
  });
  dart.registerExtension(dart.global.AudioSourceNode, web_audio.AudioSourceNode);
  dart.defineExtensionNames([
    'start',
    'stop',
    'onEnded',
    'buffer',
    'loop',
    'loopEnd',
    'loopStart',
    'playbackRate'
  ]);
  web_audio.AudioBufferSourceNode = class AudioBufferSourceNode extends web_audio.AudioSourceNode {
    [dartx.start](when, grainOffset, grainDuration) {
      if (grainOffset === void 0) grainOffset = null;
      if (grainDuration === void 0) grainDuration = null;
      if (!!this.start) {
        if (grainDuration != null) {
          this.start(when, grainOffset, grainDuration);
        } else if (grainOffset != null) {
          this.start(when, grainOffset);
        } else {
          this.start(when);
        }
      } else {
        if (grainDuration != null) {
          this.noteOn(when, grainOffset, grainDuration);
        } else if (grainOffset != null) {
          this.noteOn(when, grainOffset);
        } else {
          this.noteOn(when);
        }
      }
    }
    [dartx.stop](when) {
      if (!!this.stop) {
        this.stop(when);
      } else {
        this.noteOff(when);
      }
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.buffer]() {
      return this.buffer;
    }
    set [dartx.buffer](value) {
      this.buffer = value;
    }
    get [dartx.loop]() {
      return this.loop;
    }
    set [dartx.loop](value) {
      this.loop = value;
    }
    get [dartx.loopEnd]() {
      return this.loopEnd;
    }
    set [dartx.loopEnd](value) {
      this.loopEnd = value;
    }
    get [dartx.loopStart]() {
      return this.loopStart;
    }
    set [dartx.loopStart](value) {
      this.loopStart = value;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    get [dartx.onEnded]() {
      return web_audio.AudioBufferSourceNode.endedEvent.forTarget(this);
    }
  };
  dart.setSignature(web_audio.AudioBufferSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, [])}),
    fields: () => ({
      [dartx.buffer]: web_audio.AudioBuffer,
      [dartx.loop]: core.bool,
      [dartx.loopEnd]: core.num,
      [dartx.loopStart]: core.num,
      [dartx.playbackRate]: web_audio.AudioParam
    }),
    getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.start]: dart.definiteFunctionType(dart.void, [core.num], [core.num, core.num]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
  });
  web_audio.AudioBufferSourceNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
  dart.registerExtension(dart.global.AudioBufferSourceNode, web_audio.AudioBufferSourceNode);
  const _decodeAudioData = Symbol('_decodeAudioData');
  dart.defineExtensionNames([
    'createAnalyser',
    'createBiquadFilter',
    'createBuffer',
    'createBufferSource',
    'createChannelMerger',
    'createChannelSplitter',
    'createConvolver',
    'createDelay',
    'createDynamicsCompressor',
    'createMediaElementSource',
    'createMediaStreamDestination',
    'createMediaStreamSource',
    'createOscillator',
    'createPanner',
    'createPeriodicWave',
    'createWaveShaper',
    'startRendering',
    'onComplete',
    'createGain',
    'createScriptProcessor',
    'decodeAudioData',
    'currentTime',
    'destination',
    'listener',
    'sampleRate'
  ]);
  web_audio.AudioContext = class AudioContext extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!(window.AudioContext || window.webkitAudioContext);
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    get [dartx.destination]() {
      return this.destination;
    }
    get [dartx.listener]() {
      return this.listener;
    }
    get [dartx.sampleRate]() {
      return this.sampleRate;
    }
    [dartx.createAnalyser](...args) {
      return this.createAnalyser.apply(this, args);
    }
    [dartx.createBiquadFilter](...args) {
      return this.createBiquadFilter.apply(this, args);
    }
    [dartx.createBuffer](...args) {
      return this.createBuffer.apply(this, args);
    }
    [dartx.createBufferSource](...args) {
      return this.createBufferSource.apply(this, args);
    }
    [dartx.createChannelMerger](...args) {
      return this.createChannelMerger.apply(this, args);
    }
    [dartx.createChannelSplitter](...args) {
      return this.createChannelSplitter.apply(this, args);
    }
    [dartx.createConvolver](...args) {
      return this.createConvolver.apply(this, args);
    }
    [dartx.createDelay](...args) {
      return this.createDelay.apply(this, args);
    }
    [dartx.createDynamicsCompressor](...args) {
      return this.createDynamicsCompressor.apply(this, args);
    }
    [dartx.createMediaElementSource](...args) {
      return this.createMediaElementSource.apply(this, args);
    }
    [dartx.createMediaStreamDestination](...args) {
      return this.createMediaStreamDestination.apply(this, args);
    }
    [dartx.createMediaStreamSource](...args) {
      return this.createMediaStreamSource.apply(this, args);
    }
    [dartx.createOscillator](...args) {
      return this.createOscillator.apply(this, args);
    }
    [dartx.createPanner](...args) {
      return this.createPanner.apply(this, args);
    }
    [dartx.createPeriodicWave](...args) {
      return this.createPeriodicWave.apply(this, args);
    }
    [dartx.createWaveShaper](...args) {
      return this.createWaveShaper.apply(this, args);
    }
    [_decodeAudioData](...args) {
      return this.decodeAudioData.apply(this, args);
    }
    [dartx.startRendering](...args) {
      return this.startRendering.apply(this, args);
    }
    get [dartx.onComplete]() {
      return web_audio.AudioContext.completeEvent.forTarget(this);
    }
    static new() {
      return new (window.AudioContext || window.webkitAudioContext)();
    }
    [dartx.createGain]() {
      if (this.createGain !== undefined) {
        return this.createGain();
      } else {
        return this.createGainNode();
      }
    }
    [dartx.createScriptProcessor](bufferSize, numberOfInputChannels, numberOfOutputChannels) {
      if (numberOfInputChannels === void 0) numberOfInputChannels = null;
      if (numberOfOutputChannels === void 0) numberOfOutputChannels = null;
      let func = this.createScriptProcessor || this.createJavaScriptNode;
      if (numberOfOutputChannels != null) {
        return func.call(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
      } else if (numberOfInputChannels != null) {
        return func.call(this, bufferSize, numberOfInputChannels);
      } else {
        return func.call(this, bufferSize);
      }
    }
    [dartx.decodeAudioData](audioData) {
      let completer = CompleterOfAudioBuffer().new();
      this[_decodeAudioData](audioData, dart.fn(value => {
        completer.complete(value);
      }, AudioBufferTovoid()), dart.fn(error => {
        if (error == null) {
          completer.completeError('');
        } else {
          completer.completeError(error);
        }
      }, AudioBufferTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(web_audio.AudioContext, {
    constructors: () => ({
      _: dart.definiteFunctionType(web_audio.AudioContext, []),
      new: dart.definiteFunctionType(web_audio.AudioContext, [])
    }),
    fields: () => ({
      [dartx.currentTime]: core.double,
      [dartx.destination]: web_audio.AudioDestinationNode,
      [dartx.listener]: web_audio.AudioListener,
      [dartx.sampleRate]: core.double
    }),
    getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.createAnalyser]: dart.definiteFunctionType(web_audio.AnalyserNode, []),
      [dartx.createBiquadFilter]: dart.definiteFunctionType(web_audio.BiquadFilterNode, []),
      [dartx.createBuffer]: dart.definiteFunctionType(web_audio.AudioBuffer, [core.int, core.int, core.num]),
      [dartx.createBufferSource]: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, []),
      [dartx.createChannelMerger]: dart.definiteFunctionType(web_audio.ChannelMergerNode, [], [core.int]),
      [dartx.createChannelSplitter]: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [], [core.int]),
      [dartx.createConvolver]: dart.definiteFunctionType(web_audio.ConvolverNode, []),
      [dartx.createDelay]: dart.definiteFunctionType(web_audio.DelayNode, [], [core.num]),
      [dartx.createDynamicsCompressor]: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, []),
      [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
      [dartx.createMediaStreamDestination]: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, []),
      [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
      [dartx.createOscillator]: dart.definiteFunctionType(web_audio.OscillatorNode, []),
      [dartx.createPanner]: dart.definiteFunctionType(web_audio.PannerNode, []),
      [dartx.createPeriodicWave]: dart.definiteFunctionType(web_audio.PeriodicWave, [typed_data.Float32List, typed_data.Float32List]),
      [dartx.createWaveShaper]: dart.definiteFunctionType(web_audio.WaveShaperNode, []),
      [_decodeAudioData]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer, web_audio.AudioBufferCallback], [web_audio.AudioBufferCallback]),
      [dartx.startRendering]: dart.definiteFunctionType(dart.void, []),
      [dartx.createGain]: dart.definiteFunctionType(web_audio.GainNode, []),
      [dartx.createScriptProcessor]: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [core.int], [core.int, core.int]),
      [dartx.decodeAudioData]: dart.definiteFunctionType(async.Future$(web_audio.AudioBuffer), [typed_data.ByteBuffer])
    }),
    sfields: () => ({completeEvent: EventStreamProviderOfEvent()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  web_audio.AudioContext.completeEvent = dart.const(new (EventStreamProviderOfEvent())('complete'));
  dart.registerExtension(dart.global.AudioContext, web_audio.AudioContext);
  dart.registerExtension(dart.global.webkitAudioContext, web_audio.AudioContext);
  dart.defineExtensionNames([
    'maxChannelCount'
  ]);
  web_audio.AudioDestinationNode = class AudioDestinationNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.maxChannelCount]() {
      return this.maxChannelCount;
    }
  };
  dart.setSignature(web_audio.AudioDestinationNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioDestinationNode, [])}),
    fields: () => ({[dartx.maxChannelCount]: core.int})
  });
  dart.registerExtension(dart.global.AudioDestinationNode, web_audio.AudioDestinationNode);
  dart.defineExtensionNames([
    'setOrientation',
    'setPosition',
    'setVelocity',
    'dopplerFactor',
    'speedOfSound'
  ]);
  web_audio.AudioListener = class AudioListener extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.dopplerFactor]() {
      return this.dopplerFactor;
    }
    set [dartx.dopplerFactor](value) {
      this.dopplerFactor = value;
    }
    get [dartx.speedOfSound]() {
      return this.speedOfSound;
    }
    set [dartx.speedOfSound](value) {
      this.speedOfSound = value;
    }
    [dartx.setOrientation](...args) {
      return this.setOrientation.apply(this, args);
    }
    [dartx.setPosition](...args) {
      return this.setPosition.apply(this, args);
    }
    [dartx.setVelocity](...args) {
      return this.setVelocity.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AudioListener, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioListener, [])}),
    fields: () => ({
      [dartx.dopplerFactor]: core.num,
      [dartx.speedOfSound]: core.num
    }),
    methods: () => ({
      [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.AudioListener, web_audio.AudioListener);
  dart.defineExtensionNames([
    'cancelScheduledValues',
    'exponentialRampToValueAtTime',
    'linearRampToValueAtTime',
    'setTargetAtTime',
    'setValueAtTime',
    'setValueCurveAtTime',
    'defaultValue',
    'value'
  ]);
  web_audio.AudioParam = class AudioParam extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    [dartx.cancelScheduledValues](...args) {
      return this.cancelScheduledValues.apply(this, args);
    }
    [dartx.exponentialRampToValueAtTime](...args) {
      return this.exponentialRampToValueAtTime.apply(this, args);
    }
    [dartx.linearRampToValueAtTime](...args) {
      return this.linearRampToValueAtTime.apply(this, args);
    }
    [dartx.setTargetAtTime](...args) {
      return this.setTargetAtTime.apply(this, args);
    }
    [dartx.setValueAtTime](...args) {
      return this.setValueAtTime.apply(this, args);
    }
    [dartx.setValueCurveAtTime](...args) {
      return this.setValueCurveAtTime.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AudioParam, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioParam, [])}),
    fields: () => ({
      [dartx.defaultValue]: core.double,
      [dartx.value]: core.num
    }),
    methods: () => ({
      [dartx.cancelScheduledValues]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.exponentialRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.linearRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.setTargetAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.setValueCurveAtTime]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.AudioParam, web_audio.AudioParam);
  dart.defineExtensionNames([
    'inputBuffer',
    'outputBuffer',
    'playbackTime'
  ]);
  web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.inputBuffer]() {
      return this.inputBuffer;
    }
    get [dartx.outputBuffer]() {
      return this.outputBuffer;
    }
    get [dartx.playbackTime]() {
      return this.playbackTime;
    }
  };
  dart.setSignature(web_audio.AudioProcessingEvent, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioProcessingEvent, [])}),
    fields: () => ({
      [dartx.inputBuffer]: web_audio.AudioBuffer,
      [dartx.outputBuffer]: web_audio.AudioBuffer,
      [dartx.playbackTime]: core.double
    })
  });
  dart.registerExtension(dart.global.AudioProcessingEvent, web_audio.AudioProcessingEvent);
  dart.defineExtensionNames([
    'getFrequencyResponse',
    'Q',
    'detune',
    'frequency',
    'gain',
    'type'
  ]);
  web_audio.BiquadFilterNode = class BiquadFilterNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.Q]() {
      return this.Q;
    }
    get [dartx.detune]() {
      return this.detune;
    }
    get [dartx.frequency]() {
      return this.frequency;
    }
    get [dartx.gain]() {
      return this.gain;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    [dartx.getFrequencyResponse](...args) {
      return this.getFrequencyResponse.apply(this, args);
    }
  };
  dart.setSignature(web_audio.BiquadFilterNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.BiquadFilterNode, [])}),
    fields: () => ({
      [dartx.Q]: web_audio.AudioParam,
      [dartx.detune]: web_audio.AudioParam,
      [dartx.frequency]: web_audio.AudioParam,
      [dartx.gain]: web_audio.AudioParam,
      [dartx.type]: core.String
    }),
    methods: () => ({[dartx.getFrequencyResponse]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])})
  });
  dart.registerExtension(dart.global.BiquadFilterNode, web_audio.BiquadFilterNode);
  web_audio.ChannelMergerNode = class ChannelMergerNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.ChannelMergerNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelMergerNode, [])})
  });
  dart.registerExtension(dart.global.ChannelMergerNode, web_audio.ChannelMergerNode);
  dart.registerExtension(dart.global.AudioChannelMerger, web_audio.ChannelMergerNode);
  web_audio.ChannelSplitterNode = class ChannelSplitterNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.ChannelSplitterNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [])})
  });
  dart.registerExtension(dart.global.ChannelSplitterNode, web_audio.ChannelSplitterNode);
  dart.registerExtension(dart.global.AudioChannelSplitter, web_audio.ChannelSplitterNode);
  dart.defineExtensionNames([
    'buffer',
    'normalize'
  ]);
  web_audio.ConvolverNode = class ConvolverNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.buffer]() {
      return this.buffer;
    }
    set [dartx.buffer](value) {
      this.buffer = value;
    }
    get [dartx.normalize]() {
      return this.normalize;
    }
    set [dartx.normalize](value) {
      this.normalize = value;
    }
  };
  dart.setSignature(web_audio.ConvolverNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ConvolverNode, [])}),
    fields: () => ({
      [dartx.buffer]: web_audio.AudioBuffer,
      [dartx.normalize]: core.bool
    })
  });
  dart.registerExtension(dart.global.ConvolverNode, web_audio.ConvolverNode);
  dart.defineExtensionNames([
    'delayTime'
  ]);
  web_audio.DelayNode = class DelayNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.delayTime]() {
      return this.delayTime;
    }
  };
  dart.setSignature(web_audio.DelayNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.DelayNode, [])}),
    fields: () => ({[dartx.delayTime]: web_audio.AudioParam})
  });
  dart.registerExtension(dart.global.DelayNode, web_audio.DelayNode);
  dart.defineExtensionNames([
    'attack',
    'knee',
    'ratio',
    'reduction',
    'release',
    'threshold'
  ]);
  web_audio.DynamicsCompressorNode = class DynamicsCompressorNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.attack]() {
      return this.attack;
    }
    get [dartx.knee]() {
      return this.knee;
    }
    get [dartx.ratio]() {
      return this.ratio;
    }
    get [dartx.reduction]() {
      return this.reduction;
    }
    get [dartx.release]() {
      return this.release;
    }
    get [dartx.threshold]() {
      return this.threshold;
    }
  };
  dart.setSignature(web_audio.DynamicsCompressorNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, [])}),
    fields: () => ({
      [dartx.attack]: web_audio.AudioParam,
      [dartx.knee]: web_audio.AudioParam,
      [dartx.ratio]: web_audio.AudioParam,
      [dartx.reduction]: web_audio.AudioParam,
      [dartx.release]: web_audio.AudioParam,
      [dartx.threshold]: web_audio.AudioParam
    })
  });
  dart.registerExtension(dart.global.DynamicsCompressorNode, web_audio.DynamicsCompressorNode);
  dart.defineExtensionNames([
    'gain'
  ]);
  web_audio.GainNode = class GainNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.gain]() {
      return this.gain;
    }
  };
  dart.setSignature(web_audio.GainNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.GainNode, [])}),
    fields: () => ({[dartx.gain]: web_audio.AudioParam})
  });
  dart.registerExtension(dart.global.GainNode, web_audio.GainNode);
  dart.registerExtension(dart.global.AudioGainNode, web_audio.GainNode);
  dart.defineExtensionNames([
    'mediaElement'
  ]);
  web_audio.MediaElementAudioSourceNode = class MediaElementAudioSourceNode extends web_audio.AudioSourceNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.mediaElement]() {
      return this.mediaElement;
    }
  };
  dart.setSignature(web_audio.MediaElementAudioSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [])}),
    fields: () => ({[dartx.mediaElement]: html$.MediaElement})
  });
  dart.registerExtension(dart.global.MediaElementAudioSourceNode, web_audio.MediaElementAudioSourceNode);
  dart.defineExtensionNames([
    'stream'
  ]);
  web_audio.MediaStreamAudioDestinationNode = class MediaStreamAudioDestinationNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.stream]() {
      return this.stream;
    }
  };
  dart.setSignature(web_audio.MediaStreamAudioDestinationNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, [])}),
    fields: () => ({[dartx.stream]: html$.MediaStream})
  });
  dart.registerExtension(dart.global.MediaStreamAudioDestinationNode, web_audio.MediaStreamAudioDestinationNode);
  dart.defineExtensionNames([
    'mediaStream'
  ]);
  web_audio.MediaStreamAudioSourceNode = class MediaStreamAudioSourceNode extends web_audio.AudioSourceNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.mediaStream]() {
      return this.mediaStream;
    }
  };
  dart.setSignature(web_audio.MediaStreamAudioSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [])}),
    fields: () => ({[dartx.mediaStream]: html$.MediaStream})
  });
  dart.registerExtension(dart.global.MediaStreamAudioSourceNode, web_audio.MediaStreamAudioSourceNode);
  dart.defineExtensionNames([
    'renderedBuffer'
  ]);
  web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.renderedBuffer]() {
      return this.renderedBuffer;
    }
  };
  dart.setSignature(web_audio.OfflineAudioCompletionEvent, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.OfflineAudioCompletionEvent, [])}),
    fields: () => ({[dartx.renderedBuffer]: web_audio.AudioBuffer})
  });
  dart.registerExtension(dart.global.OfflineAudioCompletionEvent, web_audio.OfflineAudioCompletionEvent);
  web_audio.OfflineAudioContext = class OfflineAudioContext extends web_audio.AudioContext {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(numberOfChannels, numberOfFrames, sampleRate) {
      return web_audio.OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
    }
    static _create_1(numberOfChannels, numberOfFrames, sampleRate) {
      return new OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
    }
  };
  dart.setSignature(web_audio.OfflineAudioContext, {
    constructors: () => ({
      _: dart.definiteFunctionType(web_audio.OfflineAudioContext, []),
      new: dart.definiteFunctionType(web_audio.OfflineAudioContext, [core.int, core.int, core.num])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(web_audio.OfflineAudioContext, [dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.OfflineAudioContext, web_audio.OfflineAudioContext);
  dart.defineExtensionNames([
    'noteOff',
    'noteOn',
    'setPeriodicWave',
    'start',
    'stop',
    'onEnded',
    'detune',
    'frequency',
    'type'
  ]);
  web_audio.OscillatorNode = class OscillatorNode extends web_audio.AudioSourceNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.detune]() {
      return this.detune;
    }
    get [dartx.frequency]() {
      return this.frequency;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    [dartx.noteOff](...args) {
      return this.noteOff.apply(this, args);
    }
    [dartx.noteOn](...args) {
      return this.noteOn.apply(this, args);
    }
    [dartx.setPeriodicWave](...args) {
      return this.setPeriodicWave.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onEnded]() {
      return web_audio.OscillatorNode.endedEvent.forTarget(this);
    }
  };
  dart.setSignature(web_audio.OscillatorNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.OscillatorNode, [])}),
    fields: () => ({
      [dartx.detune]: web_audio.AudioParam,
      [dartx.frequency]: web_audio.AudioParam,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.noteOff]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.noteOn]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.setPeriodicWave]: dart.definiteFunctionType(dart.void, [web_audio.PeriodicWave]),
      [dartx.start]: dart.definiteFunctionType(dart.void, [], [core.num]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [], [core.num])
    }),
    sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
  });
  web_audio.OscillatorNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
  dart.registerExtension(dart.global.OscillatorNode, web_audio.OscillatorNode);
  dart.registerExtension(dart.global.Oscillator, web_audio.OscillatorNode);
  dart.defineExtensionNames([
    'setOrientation',
    'setPosition',
    'setVelocity',
    'coneInnerAngle',
    'coneOuterAngle',
    'coneOuterGain',
    'distanceModel',
    'maxDistance',
    'panningModel',
    'refDistance',
    'rolloffFactor'
  ]);
  web_audio.PannerNode = class PannerNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.coneInnerAngle]() {
      return this.coneInnerAngle;
    }
    set [dartx.coneInnerAngle](value) {
      this.coneInnerAngle = value;
    }
    get [dartx.coneOuterAngle]() {
      return this.coneOuterAngle;
    }
    set [dartx.coneOuterAngle](value) {
      this.coneOuterAngle = value;
    }
    get [dartx.coneOuterGain]() {
      return this.coneOuterGain;
    }
    set [dartx.coneOuterGain](value) {
      this.coneOuterGain = value;
    }
    get [dartx.distanceModel]() {
      return this.distanceModel;
    }
    set [dartx.distanceModel](value) {
      this.distanceModel = value;
    }
    get [dartx.maxDistance]() {
      return this.maxDistance;
    }
    set [dartx.maxDistance](value) {
      this.maxDistance = value;
    }
    get [dartx.panningModel]() {
      return this.panningModel;
    }
    set [dartx.panningModel](value) {
      this.panningModel = value;
    }
    get [dartx.refDistance]() {
      return this.refDistance;
    }
    set [dartx.refDistance](value) {
      this.refDistance = value;
    }
    get [dartx.rolloffFactor]() {
      return this.rolloffFactor;
    }
    set [dartx.rolloffFactor](value) {
      this.rolloffFactor = value;
    }
    [dartx.setOrientation](...args) {
      return this.setOrientation.apply(this, args);
    }
    [dartx.setPosition](...args) {
      return this.setPosition.apply(this, args);
    }
    [dartx.setVelocity](...args) {
      return this.setVelocity.apply(this, args);
    }
  };
  dart.setSignature(web_audio.PannerNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.PannerNode, [])}),
    fields: () => ({
      [dartx.coneInnerAngle]: core.num,
      [dartx.coneOuterAngle]: core.num,
      [dartx.coneOuterGain]: core.num,
      [dartx.distanceModel]: core.String,
      [dartx.maxDistance]: core.num,
      [dartx.panningModel]: core.String,
      [dartx.refDistance]: core.num,
      [dartx.rolloffFactor]: core.num
    }),
    methods: () => ({
      [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.PannerNode, web_audio.PannerNode);
  dart.registerExtension(dart.global.AudioPannerNode, web_audio.PannerNode);
  dart.registerExtension(dart.global.webkitAudioPannerNode, web_audio.PannerNode);
  web_audio.PeriodicWave = class PeriodicWave extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.PeriodicWave, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.PeriodicWave, [])})
  });
  dart.registerExtension(dart.global.PeriodicWave, web_audio.PeriodicWave);
  dart.defineExtensionNames([
    'setEventListener',
    'onAudioProcess',
    'bufferSize'
  ]);
  web_audio.ScriptProcessorNode = class ScriptProcessorNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bufferSize]() {
      return this.bufferSize;
    }
    [dartx.setEventListener](...args) {
      return this.setEventListener.apply(this, args);
    }
    get [dartx.onAudioProcess]() {
      return web_audio.ScriptProcessorNode.audioProcessEvent.forTarget(this);
    }
  };
  dart.setSignature(web_audio.ScriptProcessorNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [])}),
    fields: () => ({[dartx.bufferSize]: core.int}),
    getters: () => ({[dartx.onAudioProcess]: dart.definiteFunctionType(async.Stream$(web_audio.AudioProcessingEvent), [])}),
    methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])}),
    sfields: () => ({audioProcessEvent: EventStreamProviderOfAudioProcessingEvent()})
  });
  web_audio.ScriptProcessorNode.audioProcessEvent = dart.const(new (EventStreamProviderOfAudioProcessingEvent())('audioprocess'));
  dart.registerExtension(dart.global.ScriptProcessorNode, web_audio.ScriptProcessorNode);
  dart.registerExtension(dart.global.JavaScriptAudioNode, web_audio.ScriptProcessorNode);
  dart.defineExtensionNames([
    'curve',
    'oversample'
  ]);
  web_audio.WaveShaperNode = class WaveShaperNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.curve]() {
      return this.curve;
    }
    set [dartx.curve](value) {
      this.curve = value;
    }
    get [dartx.oversample]() {
      return this.oversample;
    }
    set [dartx.oversample](value) {
      this.oversample = value;
    }
  };
  dart.setSignature(web_audio.WaveShaperNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.WaveShaperNode, [])}),
    fields: () => ({
      [dartx.curve]: typed_data.Float32List,
      [dartx.oversample]: core.String
    })
  });
  dart.registerExtension(dart.global.WaveShaperNode, web_audio.WaveShaperNode);
  const _getContextAttributes_1$ = Symbol('_getContextAttributes_1');
  const _texImage2D_1 = Symbol('_texImage2D_1');
  const _texImage2D_2 = Symbol('_texImage2D_2');
  const _texImage2D_3 = Symbol('_texImage2D_3');
  const _texImage2D_4 = Symbol('_texImage2D_4');
  const _texImage2D_5 = Symbol('_texImage2D_5');
  const _texImage2DImageData_1 = Symbol('_texImage2DImageData_1');
  const _texSubImage2D_1 = Symbol('_texSubImage2D_1');
  const _texSubImage2D_2 = Symbol('_texSubImage2D_2');
  const _texSubImage2D_3 = Symbol('_texSubImage2D_3');
  const _texSubImage2D_4 = Symbol('_texSubImage2D_4');
  const _texSubImage2D_5 = Symbol('_texSubImage2D_5');
  const _texSubImage2DImageData_1 = Symbol('_texSubImage2DImageData_1');
  dart.defineExtensionNames([
    'activeTexture',
    'attachShader',
    'bindAttribLocation',
    'bindBuffer',
    'bindFramebuffer',
    'bindRenderbuffer',
    'bindTexture',
    'blendColor',
    'blendEquation',
    'blendEquationSeparate',
    'blendFunc',
    'blendFuncSeparate',
    'bufferByteData',
    'bufferData',
    'bufferDataTyped',
    'bufferSubByteData',
    'bufferSubData',
    'bufferSubDataTyped',
    'checkFramebufferStatus',
    'clear',
    'clearColor',
    'clearDepth',
    'clearStencil',
    'colorMask',
    'compileShader',
    'compressedTexImage2D',
    'compressedTexSubImage2D',
    'copyTexImage2D',
    'copyTexSubImage2D',
    'createBuffer',
    'createFramebuffer',
    'createProgram',
    'createRenderbuffer',
    'createShader',
    'createTexture',
    'cullFace',
    'deleteBuffer',
    'deleteFramebuffer',
    'deleteProgram',
    'deleteRenderbuffer',
    'deleteShader',
    'deleteTexture',
    'depthFunc',
    'depthMask',
    'depthRange',
    'detachShader',
    'disable',
    'disableVertexAttribArray',
    'drawArrays',
    'drawElements',
    'enable',
    'enableVertexAttribArray',
    'finish',
    'flush',
    'framebufferRenderbuffer',
    'framebufferTexture2D',
    'frontFace',
    'generateMipmap',
    'getActiveAttrib',
    'getActiveUniform',
    'getAttachedShaders',
    'getAttribLocation',
    'getBufferParameter',
    'getContextAttributes',
    'getError',
    'getExtension',
    'getFramebufferAttachmentParameter',
    'getParameter',
    'getProgramInfoLog',
    'getProgramParameter',
    'getRenderbufferParameter',
    'getShaderInfoLog',
    'getShaderParameter',
    'getShaderPrecisionFormat',
    'getShaderSource',
    'getSupportedExtensions',
    'getTexParameter',
    'getUniform',
    'getUniformLocation',
    'getVertexAttrib',
    'getVertexAttribOffset',
    'hint',
    'isBuffer',
    'isContextLost',
    'isEnabled',
    'isFramebuffer',
    'isProgram',
    'isRenderbuffer',
    'isShader',
    'isTexture',
    'lineWidth',
    'linkProgram',
    'pixelStorei',
    'polygonOffset',
    'readPixels',
    'renderbufferStorage',
    'sampleCoverage',
    'scissor',
    'shaderSource',
    'stencilFunc',
    'stencilFuncSeparate',
    'stencilMask',
    'stencilMaskSeparate',
    'stencilOp',
    'stencilOpSeparate',
    'texImage2D',
    'texImage2DCanvas',
    'texImage2DImage',
    'texImage2DImageData',
    'texImage2DVideo',
    'texParameterf',
    'texParameteri',
    'texSubImage2D',
    'texSubImage2DCanvas',
    'texSubImage2DImage',
    'texSubImage2DImageData',
    'texSubImage2DVideo',
    'uniform1f',
    'uniform1fv',
    'uniform1i',
    'uniform1iv',
    'uniform2f',
    'uniform2fv',
    'uniform2i',
    'uniform2iv',
    'uniform3f',
    'uniform3fv',
    'uniform3i',
    'uniform3iv',
    'uniform4f',
    'uniform4fv',
    'uniform4i',
    'uniform4iv',
    'uniformMatrix2fv',
    'uniformMatrix3fv',
    'uniformMatrix4fv',
    'useProgram',
    'validateProgram',
    'vertexAttrib1f',
    'vertexAttrib1fv',
    'vertexAttrib2f',
    'vertexAttrib2fv',
    'vertexAttrib3f',
    'vertexAttrib3fv',
    'vertexAttrib4f',
    'vertexAttrib4fv',
    'vertexAttribPointer',
    'viewport',
    'texImage2DUntyped',
    'texImage2DTyped',
    'texSubImage2DUntyped',
    'texSubImage2DTyped',
    'canvas',
    'drawingBufferHeight',
    'drawingBufferWidth'
  ]);
  web_gl.RenderingContext = class RenderingContext extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.WebGLRenderingContext;
    }
    get [dartx.canvas]() {
      return this.canvas;
    }
    get [dartx.drawingBufferHeight]() {
      return this.drawingBufferHeight;
    }
    get [dartx.drawingBufferWidth]() {
      return this.drawingBufferWidth;
    }
    [dartx.activeTexture](...args) {
      return this.activeTexture.apply(this, args);
    }
    [dartx.attachShader](...args) {
      return this.attachShader.apply(this, args);
    }
    [dartx.bindAttribLocation](...args) {
      return this.bindAttribLocation.apply(this, args);
    }
    [dartx.bindBuffer](...args) {
      return this.bindBuffer.apply(this, args);
    }
    [dartx.bindFramebuffer](...args) {
      return this.bindFramebuffer.apply(this, args);
    }
    [dartx.bindRenderbuffer](...args) {
      return this.bindRenderbuffer.apply(this, args);
    }
    [dartx.bindTexture](...args) {
      return this.bindTexture.apply(this, args);
    }
    [dartx.blendColor](...args) {
      return this.blendColor.apply(this, args);
    }
    [dartx.blendEquation](...args) {
      return this.blendEquation.apply(this, args);
    }
    [dartx.blendEquationSeparate](...args) {
      return this.blendEquationSeparate.apply(this, args);
    }
    [dartx.blendFunc](...args) {
      return this.blendFunc.apply(this, args);
    }
    [dartx.blendFuncSeparate](...args) {
      return this.blendFuncSeparate.apply(this, args);
    }
    [dartx.bufferByteData](...args) {
      return this.bufferData.apply(this, args);
    }
    [dartx.bufferData](...args) {
      return this.bufferData.apply(this, args);
    }
    [dartx.bufferDataTyped](...args) {
      return this.bufferData.apply(this, args);
    }
    [dartx.bufferSubByteData](...args) {
      return this.bufferSubData.apply(this, args);
    }
    [dartx.bufferSubData](...args) {
      return this.bufferSubData.apply(this, args);
    }
    [dartx.bufferSubDataTyped](...args) {
      return this.bufferSubData.apply(this, args);
    }
    [dartx.checkFramebufferStatus](...args) {
      return this.checkFramebufferStatus.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.clearColor](...args) {
      return this.clearColor.apply(this, args);
    }
    [dartx.clearDepth](...args) {
      return this.clearDepth.apply(this, args);
    }
    [dartx.clearStencil](...args) {
      return this.clearStencil.apply(this, args);
    }
    [dartx.colorMask](...args) {
      return this.colorMask.apply(this, args);
    }
    [dartx.compileShader](...args) {
      return this.compileShader.apply(this, args);
    }
    [dartx.compressedTexImage2D](...args) {
      return this.compressedTexImage2D.apply(this, args);
    }
    [dartx.compressedTexSubImage2D](...args) {
      return this.compressedTexSubImage2D.apply(this, args);
    }
    [dartx.copyTexImage2D](...args) {
      return this.copyTexImage2D.apply(this, args);
    }
    [dartx.copyTexSubImage2D](...args) {
      return this.copyTexSubImage2D.apply(this, args);
    }
    [dartx.createBuffer](...args) {
      return this.createBuffer.apply(this, args);
    }
    [dartx.createFramebuffer](...args) {
      return this.createFramebuffer.apply(this, args);
    }
    [dartx.createProgram](...args) {
      return this.createProgram.apply(this, args);
    }
    [dartx.createRenderbuffer](...args) {
      return this.createRenderbuffer.apply(this, args);
    }
    [dartx.createShader](...args) {
      return this.createShader.apply(this, args);
    }
    [dartx.createTexture](...args) {
      return this.createTexture.apply(this, args);
    }
    [dartx.cullFace](...args) {
      return this.cullFace.apply(this, args);
    }
    [dartx.deleteBuffer](...args) {
      return this.deleteBuffer.apply(this, args);
    }
    [dartx.deleteFramebuffer](...args) {
      return this.deleteFramebuffer.apply(this, args);
    }
    [dartx.deleteProgram](...args) {
      return this.deleteProgram.apply(this, args);
    }
    [dartx.deleteRenderbuffer](...args) {
      return this.deleteRenderbuffer.apply(this, args);
    }
    [dartx.deleteShader](...args) {
      return this.deleteShader.apply(this, args);
    }
    [dartx.deleteTexture](...args) {
      return this.deleteTexture.apply(this, args);
    }
    [dartx.depthFunc](...args) {
      return this.depthFunc.apply(this, args);
    }
    [dartx.depthMask](...args) {
      return this.depthMask.apply(this, args);
    }
    [dartx.depthRange](...args) {
      return this.depthRange.apply(this, args);
    }
    [dartx.detachShader](...args) {
      return this.detachShader.apply(this, args);
    }
    [dartx.disable](...args) {
      return this.disable.apply(this, args);
    }
    [dartx.disableVertexAttribArray](...args) {
      return this.disableVertexAttribArray.apply(this, args);
    }
    [dartx.drawArrays](...args) {
      return this.drawArrays.apply(this, args);
    }
    [dartx.drawElements](...args) {
      return this.drawElements.apply(this, args);
    }
    [dartx.enable](...args) {
      return this.enable.apply(this, args);
    }
    [dartx.enableVertexAttribArray](...args) {
      return this.enableVertexAttribArray.apply(this, args);
    }
    [dartx.finish](...args) {
      return this.finish.apply(this, args);
    }
    [dartx.flush](...args) {
      return this.flush.apply(this, args);
    }
    [dartx.framebufferRenderbuffer](...args) {
      return this.framebufferRenderbuffer.apply(this, args);
    }
    [dartx.framebufferTexture2D](...args) {
      return this.framebufferTexture2D.apply(this, args);
    }
    [dartx.frontFace](...args) {
      return this.frontFace.apply(this, args);
    }
    [dartx.generateMipmap](...args) {
      return this.generateMipmap.apply(this, args);
    }
    [dartx.getActiveAttrib](...args) {
      return this.getActiveAttrib.apply(this, args);
    }
    [dartx.getActiveUniform](...args) {
      return this.getActiveUniform.apply(this, args);
    }
    [dartx.getAttachedShaders](...args) {
      return this.getAttachedShaders.apply(this, args);
    }
    [dartx.getAttribLocation](...args) {
      return this.getAttribLocation.apply(this, args);
    }
    [dartx.getBufferParameter](...args) {
      return this.getBufferParameter.apply(this, args);
    }
    [dartx.getContextAttributes]() {
      return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1$]()));
    }
    [_getContextAttributes_1$](...args) {
      return this.getContextAttributes.apply(this, args);
    }
    [dartx.getError](...args) {
      return this.getError.apply(this, args);
    }
    [dartx.getExtension](...args) {
      return this.getExtension.apply(this, args);
    }
    [dartx.getFramebufferAttachmentParameter](...args) {
      return this.getFramebufferAttachmentParameter.apply(this, args);
    }
    [dartx.getParameter](...args) {
      return this.getParameter.apply(this, args);
    }
    [dartx.getProgramInfoLog](...args) {
      return this.getProgramInfoLog.apply(this, args);
    }
    [dartx.getProgramParameter](...args) {
      return this.getProgramParameter.apply(this, args);
    }
    [dartx.getRenderbufferParameter](...args) {
      return this.getRenderbufferParameter.apply(this, args);
    }
    [dartx.getShaderInfoLog](...args) {
      return this.getShaderInfoLog.apply(this, args);
    }
    [dartx.getShaderParameter](...args) {
      return this.getShaderParameter.apply(this, args);
    }
    [dartx.getShaderPrecisionFormat](...args) {
      return this.getShaderPrecisionFormat.apply(this, args);
    }
    [dartx.getShaderSource](...args) {
      return this.getShaderSource.apply(this, args);
    }
    [dartx.getSupportedExtensions](...args) {
      return this.getSupportedExtensions.apply(this, args);
    }
    [dartx.getTexParameter](...args) {
      return this.getTexParameter.apply(this, args);
    }
    [dartx.getUniform](...args) {
      return this.getUniform.apply(this, args);
    }
    [dartx.getUniformLocation](...args) {
      return this.getUniformLocation.apply(this, args);
    }
    [dartx.getVertexAttrib](...args) {
      return this.getVertexAttrib.apply(this, args);
    }
    [dartx.getVertexAttribOffset](...args) {
      return this.getVertexAttribOffset.apply(this, args);
    }
    [dartx.hint](...args) {
      return this.hint.apply(this, args);
    }
    [dartx.isBuffer](...args) {
      return this.isBuffer.apply(this, args);
    }
    [dartx.isContextLost](...args) {
      return this.isContextLost.apply(this, args);
    }
    [dartx.isEnabled](...args) {
      return this.isEnabled.apply(this, args);
    }
    [dartx.isFramebuffer](...args) {
      return this.isFramebuffer.apply(this, args);
    }
    [dartx.isProgram](...args) {
      return this.isProgram.apply(this, args);
    }
    [dartx.isRenderbuffer](...args) {
      return this.isRenderbuffer.apply(this, args);
    }
    [dartx.isShader](...args) {
      return this.isShader.apply(this, args);
    }
    [dartx.isTexture](...args) {
      return this.isTexture.apply(this, args);
    }
    [dartx.lineWidth](...args) {
      return this.lineWidth.apply(this, args);
    }
    [dartx.linkProgram](...args) {
      return this.linkProgram.apply(this, args);
    }
    [dartx.pixelStorei](...args) {
      return this.pixelStorei.apply(this, args);
    }
    [dartx.polygonOffset](...args) {
      return this.polygonOffset.apply(this, args);
    }
    [dartx.readPixels](...args) {
      return this.readPixels.apply(this, args);
    }
    [dartx.renderbufferStorage](...args) {
      return this.renderbufferStorage.apply(this, args);
    }
    [dartx.sampleCoverage](...args) {
      return this.sampleCoverage.apply(this, args);
    }
    [dartx.scissor](...args) {
      return this.scissor.apply(this, args);
    }
    [dartx.shaderSource](...args) {
      return this.shaderSource.apply(this, args);
    }
    [dartx.stencilFunc](...args) {
      return this.stencilFunc.apply(this, args);
    }
    [dartx.stencilFuncSeparate](...args) {
      return this.stencilFuncSeparate.apply(this, args);
    }
    [dartx.stencilMask](...args) {
      return this.stencilMask.apply(this, args);
    }
    [dartx.stencilMaskSeparate](...args) {
      return this.stencilMaskSeparate.apply(this, args);
    }
    [dartx.stencilOp](...args) {
      return this.stencilOp.apply(this, args);
    }
    [dartx.stencilOpSeparate](...args) {
      return this.stencilOpSeparate.apply(this, args);
    }
    [dartx.texImage2D](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
      if (format === void 0) format = null;
      if (type === void 0) type = null;
      if (pixels === void 0) pixels = null;
      if (pixels != null && type != null && format != null && typeof border_OR_canvas_OR_image_OR_pixels_OR_video == 'number') {
        this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
        return;
      }
      if ((html$.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
        let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
        this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
        return;
      }
      if (html$.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
        this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
        this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
        this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_texImage2D_1](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_2](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_3](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_4](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_5](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DCanvas](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DImage](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DImageData](target, level, internalformat, format, type, pixels) {
      let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
      this[_texImage2DImageData_1](target, level, internalformat, format, type, pixels_1);
      return;
    }
    [_texImage2DImageData_1](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DVideo](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texParameterf](...args) {
      return this.texParameterf.apply(this, args);
    }
    [dartx.texParameteri](...args) {
      return this.texParameteri.apply(this, args);
    }
    [dartx.texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
      if (type === void 0) type = null;
      if (pixels === void 0) pixels = null;
      if (pixels != null && type != null && typeof canvas_OR_format_OR_image_OR_pixels_OR_video == 'number') {
        this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
        return;
      }
      if ((html$.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
        let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
        this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
        return;
      }
      if (html$.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
        this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
        this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
        this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_texSubImage2D_1](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_2](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_3](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_4](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_5](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DCanvas](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DImage](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DImageData](target, level, xoffset, yoffset, format, type, pixels) {
      let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
      this[_texSubImage2DImageData_1](target, level, xoffset, yoffset, format, type, pixels_1);
      return;
    }
    [_texSubImage2DImageData_1](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DVideo](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.uniform1f](...args) {
      return this.uniform1f.apply(this, args);
    }
    [dartx.uniform1fv](...args) {
      return this.uniform1fv.apply(this, args);
    }
    [dartx.uniform1i](...args) {
      return this.uniform1i.apply(this, args);
    }
    [dartx.uniform1iv](...args) {
      return this.uniform1iv.apply(this, args);
    }
    [dartx.uniform2f](...args) {
      return this.uniform2f.apply(this, args);
    }
    [dartx.uniform2fv](...args) {
      return this.uniform2fv.apply(this, args);
    }
    [dartx.uniform2i](...args) {
      return this.uniform2i.apply(this, args);
    }
    [dartx.uniform2iv](...args) {
      return this.uniform2iv.apply(this, args);
    }
    [dartx.uniform3f](...args) {
      return this.uniform3f.apply(this, args);
    }
    [dartx.uniform3fv](...args) {
      return this.uniform3fv.apply(this, args);
    }
    [dartx.uniform3i](...args) {
      return this.uniform3i.apply(this, args);
    }
    [dartx.uniform3iv](...args) {
      return this.uniform3iv.apply(this, args);
    }
    [dartx.uniform4f](...args) {
      return this.uniform4f.apply(this, args);
    }
    [dartx.uniform4fv](...args) {
      return this.uniform4fv.apply(this, args);
    }
    [dartx.uniform4i](...args) {
      return this.uniform4i.apply(this, args);
    }
    [dartx.uniform4iv](...args) {
      return this.uniform4iv.apply(this, args);
    }
    [dartx.uniformMatrix2fv](...args) {
      return this.uniformMatrix2fv.apply(this, args);
    }
    [dartx.uniformMatrix3fv](...args) {
      return this.uniformMatrix3fv.apply(this, args);
    }
    [dartx.uniformMatrix4fv](...args) {
      return this.uniformMatrix4fv.apply(this, args);
    }
    [dartx.useProgram](...args) {
      return this.useProgram.apply(this, args);
    }
    [dartx.validateProgram](...args) {
      return this.validateProgram.apply(this, args);
    }
    [dartx.vertexAttrib1f](...args) {
      return this.vertexAttrib1f.apply(this, args);
    }
    [dartx.vertexAttrib1fv](...args) {
      return this.vertexAttrib1fv.apply(this, args);
    }
    [dartx.vertexAttrib2f](...args) {
      return this.vertexAttrib2f.apply(this, args);
    }
    [dartx.vertexAttrib2fv](...args) {
      return this.vertexAttrib2fv.apply(this, args);
    }
    [dartx.vertexAttrib3f](...args) {
      return this.vertexAttrib3f.apply(this, args);
    }
    [dartx.vertexAttrib3fv](...args) {
      return this.vertexAttrib3fv.apply(this, args);
    }
    [dartx.vertexAttrib4f](...args) {
      return this.vertexAttrib4f.apply(this, args);
    }
    [dartx.vertexAttrib4fv](...args) {
      return this.vertexAttrib4fv.apply(this, args);
    }
    [dartx.vertexAttribPointer](...args) {
      return this.vertexAttribPointer.apply(this, args);
    }
    [dartx.viewport](...args) {
      return this.viewport.apply(this, args);
    }
    [dartx.texImage2DUntyped](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DTyped](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texSubImage2DUntyped](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DTyped](...args) {
      return this.texSubImage2D.apply(this, args);
    }
  };
  web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
  dart.setSignature(web_gl.RenderingContext, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.RenderingContext, [])}),
    fields: () => ({
      [dartx.canvas]: html$.CanvasElement,
      [dartx.drawingBufferHeight]: core.int,
      [dartx.drawingBufferWidth]: core.int
    }),
    methods: () => ({
      [dartx.activeTexture]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.attachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
      [dartx.bindAttribLocation]: dart.definiteFunctionType(dart.void, [web_gl.Program, core.int, core.String]),
      [dartx.bindBuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Buffer]),
      [dartx.bindFramebuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Framebuffer]),
      [dartx.bindRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Renderbuffer]),
      [dartx.bindTexture]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Texture]),
      [dartx.blendColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.blendEquation]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.blendEquationSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.blendFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.blendFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.bufferByteData]: dart.definiteFunctionType(dart.void, [core.int, typed_data.ByteBuffer, core.int]),
      [dartx.bufferData]: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic, core.int]),
      [dartx.bufferDataTyped]: dart.definiteFunctionType(dart.void, [core.int, typed_data.TypedData, core.int]),
      [dartx.bufferSubByteData]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.ByteBuffer]),
      [dartx.bufferSubData]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.bufferSubDataTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.TypedData]),
      [dartx.checkFramebufferStatus]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.clearColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.clearDepth]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.clearStencil]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.colorMask]: dart.definiteFunctionType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
      [dartx.compileShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
      [dartx.compressedTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.compressedTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.copyTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      [dartx.copyTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      [dartx.createBuffer]: dart.definiteFunctionType(web_gl.Buffer, []),
      [dartx.createFramebuffer]: dart.definiteFunctionType(web_gl.Framebuffer, []),
      [dartx.createProgram]: dart.definiteFunctionType(web_gl.Program, []),
      [dartx.createRenderbuffer]: dart.definiteFunctionType(web_gl.Renderbuffer, []),
      [dartx.createShader]: dart.definiteFunctionType(web_gl.Shader, [core.int]),
      [dartx.createTexture]: dart.definiteFunctionType(web_gl.Texture, []),
      [dartx.cullFace]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.deleteBuffer]: dart.definiteFunctionType(dart.void, [web_gl.Buffer]),
      [dartx.deleteFramebuffer]: dart.definiteFunctionType(dart.void, [web_gl.Framebuffer]),
      [dartx.deleteProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.deleteRenderbuffer]: dart.definiteFunctionType(dart.void, [web_gl.Renderbuffer]),
      [dartx.deleteShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
      [dartx.deleteTexture]: dart.definiteFunctionType(dart.void, [web_gl.Texture]),
      [dartx.depthFunc]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.depthMask]: dart.definiteFunctionType(dart.void, [core.bool]),
      [dartx.depthRange]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.detachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
      [dartx.disable]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.disableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.drawArrays]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.drawElements]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.enable]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.enableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.finish]: dart.definiteFunctionType(dart.void, []),
      [dartx.flush]: dart.definiteFunctionType(dart.void, []),
      [dartx.framebufferRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
      [dartx.framebufferTexture2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
      [dartx.frontFace]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.generateMipmap]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.getActiveAttrib]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
      [dartx.getActiveUniform]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
      [dartx.getAttachedShaders]: dart.definiteFunctionType(core.List$(web_gl.Shader), [web_gl.Program]),
      [dartx.getAttribLocation]: dart.definiteFunctionType(core.int, [web_gl.Program, core.String]),
      [dartx.getBufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getContextAttributes]: dart.definiteFunctionType(web_gl.ContextAttributes, []),
      [_getContextAttributes_1$]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.getError]: dart.definiteFunctionType(core.int, []),
      [dartx.getExtension]: dart.definiteFunctionType(core.Object, [core.String]),
      [dartx.getFramebufferAttachmentParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int, core.int]),
      [dartx.getParameter]: dart.definiteFunctionType(core.Object, [core.int]),
      [dartx.getProgramInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Program]),
      [dartx.getProgramParameter]: dart.definiteFunctionType(core.Object, [web_gl.Program, core.int]),
      [dartx.getRenderbufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getShaderInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
      [dartx.getShaderParameter]: dart.definiteFunctionType(core.Object, [web_gl.Shader, core.int]),
      [dartx.getShaderPrecisionFormat]: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
      [dartx.getShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
      [dartx.getSupportedExtensions]: dart.definiteFunctionType(core.List$(core.String), []),
      [dartx.getTexParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getUniform]: dart.definiteFunctionType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
      [dartx.getUniformLocation]: dart.definiteFunctionType(web_gl.UniformLocation, [web_gl.Program, core.String]),
      [dartx.getVertexAttrib]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getVertexAttribOffset]: dart.definiteFunctionType(core.int, [core.int, core.int]),
      [dartx.hint]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.isBuffer]: dart.definiteFunctionType(core.bool, [web_gl.Buffer]),
      [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
      [dartx.isEnabled]: dart.definiteFunctionType(core.bool, [core.int]),
      [dartx.isFramebuffer]: dart.definiteFunctionType(core.bool, [web_gl.Framebuffer]),
      [dartx.isProgram]: dart.definiteFunctionType(core.bool, [web_gl.Program]),
      [dartx.isRenderbuffer]: dart.definiteFunctionType(core.bool, [web_gl.Renderbuffer]),
      [dartx.isShader]: dart.definiteFunctionType(core.bool, [web_gl.Shader]),
      [dartx.isTexture]: dart.definiteFunctionType(core.bool, [web_gl.Texture]),
      [dartx.lineWidth]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.linkProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.pixelStorei]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.polygonOffset]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.readPixels]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.renderbufferStorage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.sampleCoverage]: dart.definiteFunctionType(dart.void, [core.num, core.bool]),
      [dartx.scissor]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.shaderSource]: dart.definiteFunctionType(dart.void, [web_gl.Shader, core.String]),
      [dartx.stencilFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.stencilFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.stencilMask]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.stencilMaskSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.stencilOp]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.stencilOpSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.texImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
      [_texImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
      [_texImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
      [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
      [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
      [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
      [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
      [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
      [_texImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
      [dartx.texParameterf]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.num]),
      [dartx.texParameteri]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.texSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
      [_texSubImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
      [_texSubImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
      [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
      [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
      [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
      [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
      [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
      [_texSubImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
      [dartx.uniform1f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num]),
      [dartx.uniform1fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform1i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int]),
      [dartx.uniform1iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniform2f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
      [dartx.uniform2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform2i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
      [dartx.uniform2iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniform3f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
      [dartx.uniform3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform3i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
      [dartx.uniform3iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniform4f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
      [dartx.uniform4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform4i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
      [dartx.uniform4iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniformMatrix2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
      [dartx.uniformMatrix3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
      [dartx.uniformMatrix4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
      [dartx.useProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.validateProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.vertexAttrib1f]: dart.definiteFunctionType(dart.void, [core.int, core.num]),
      [dartx.vertexAttrib1fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttrib2f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num]),
      [dartx.vertexAttrib2fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttrib3f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num]),
      [dartx.vertexAttrib3fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttrib4f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
      [dartx.vertexAttrib4fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttribPointer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
      [dartx.viewport]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.texImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
      [dartx.texImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.texSubImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
      [dartx.texSubImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData])
    }),
    sfields: () => ({
      ACTIVE_ATTRIBUTES: core.int,
      ACTIVE_TEXTURE: core.int,
      ACTIVE_UNIFORMS: core.int,
      ALIASED_LINE_WIDTH_RANGE: core.int,
      ALIASED_POINT_SIZE_RANGE: core.int,
      ALPHA: core.int,
      ALPHA_BITS: core.int,
      ALWAYS: core.int,
      ARRAY_BUFFER: core.int,
      ARRAY_BUFFER_BINDING: core.int,
      ATTACHED_SHADERS: core.int,
      BACK: core.int,
      BLEND: core.int,
      BLEND_COLOR: core.int,
      BLEND_DST_ALPHA: core.int,
      BLEND_DST_RGB: core.int,
      BLEND_EQUATION: core.int,
      BLEND_EQUATION_ALPHA: core.int,
      BLEND_EQUATION_RGB: core.int,
      BLEND_SRC_ALPHA: core.int,
      BLEND_SRC_RGB: core.int,
      BLUE_BITS: core.int,
      BOOL: core.int,
      BOOL_VEC2: core.int,
      BOOL_VEC3: core.int,
      BOOL_VEC4: core.int,
      BROWSER_DEFAULT_WEBGL: core.int,
      BUFFER_SIZE: core.int,
      BUFFER_USAGE: core.int,
      BYTE: core.int,
      CCW: core.int,
      CLAMP_TO_EDGE: core.int,
      COLOR_ATTACHMENT0: core.int,
      COLOR_BUFFER_BIT: core.int,
      COLOR_CLEAR_VALUE: core.int,
      COLOR_WRITEMASK: core.int,
      COMPILE_STATUS: core.int,
      COMPRESSED_TEXTURE_FORMATS: core.int,
      CONSTANT_ALPHA: core.int,
      CONSTANT_COLOR: core.int,
      CONTEXT_LOST_WEBGL: core.int,
      CULL_FACE: core.int,
      CULL_FACE_MODE: core.int,
      CURRENT_PROGRAM: core.int,
      CURRENT_VERTEX_ATTRIB: core.int,
      CW: core.int,
      DECR: core.int,
      DECR_WRAP: core.int,
      DELETE_STATUS: core.int,
      DEPTH_ATTACHMENT: core.int,
      DEPTH_BITS: core.int,
      DEPTH_BUFFER_BIT: core.int,
      DEPTH_CLEAR_VALUE: core.int,
      DEPTH_COMPONENT: core.int,
      DEPTH_COMPONENT16: core.int,
      DEPTH_FUNC: core.int,
      DEPTH_RANGE: core.int,
      DEPTH_STENCIL: core.int,
      DEPTH_STENCIL_ATTACHMENT: core.int,
      DEPTH_TEST: core.int,
      DEPTH_WRITEMASK: core.int,
      DITHER: core.int,
      DONT_CARE: core.int,
      DST_ALPHA: core.int,
      DST_COLOR: core.int,
      DYNAMIC_DRAW: core.int,
      ELEMENT_ARRAY_BUFFER: core.int,
      ELEMENT_ARRAY_BUFFER_BINDING: core.int,
      EQUAL: core.int,
      FASTEST: core.int,
      FLOAT: core.int,
      FLOAT_MAT2: core.int,
      FLOAT_MAT3: core.int,
      FLOAT_MAT4: core.int,
      FLOAT_VEC2: core.int,
      FLOAT_VEC3: core.int,
      FLOAT_VEC4: core.int,
      FRAGMENT_SHADER: core.int,
      FRAMEBUFFER: core.int,
      FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: core.int,
      FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: core.int,
      FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: core.int,
      FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: core.int,
      FRAMEBUFFER_BINDING: core.int,
      FRAMEBUFFER_COMPLETE: core.int,
      FRAMEBUFFER_INCOMPLETE_ATTACHMENT: core.int,
      FRAMEBUFFER_INCOMPLETE_DIMENSIONS: core.int,
      FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: core.int,
      FRAMEBUFFER_UNSUPPORTED: core.int,
      FRONT: core.int,
      FRONT_AND_BACK: core.int,
      FRONT_FACE: core.int,
      FUNC_ADD: core.int,
      FUNC_REVERSE_SUBTRACT: core.int,
      FUNC_SUBTRACT: core.int,
      GENERATE_MIPMAP_HINT: core.int,
      GEQUAL: core.int,
      GREATER: core.int,
      GREEN_BITS: core.int,
      HIGH_FLOAT: core.int,
      HIGH_INT: core.int,
      IMPLEMENTATION_COLOR_READ_FORMAT: core.int,
      IMPLEMENTATION_COLOR_READ_TYPE: core.int,
      INCR: core.int,
      INCR_WRAP: core.int,
      INT: core.int,
      INT_VEC2: core.int,
      INT_VEC3: core.int,
      INT_VEC4: core.int,
      INVALID_ENUM: core.int,
      INVALID_FRAMEBUFFER_OPERATION: core.int,
      INVALID_OPERATION: core.int,
      INVALID_VALUE: core.int,
      INVERT: core.int,
      KEEP: core.int,
      LEQUAL: core.int,
      LESS: core.int,
      LINEAR: core.int,
      LINEAR_MIPMAP_LINEAR: core.int,
      LINEAR_MIPMAP_NEAREST: core.int,
      LINES: core.int,
      LINE_LOOP: core.int,
      LINE_STRIP: core.int,
      LINE_WIDTH: core.int,
      LINK_STATUS: core.int,
      LOW_FLOAT: core.int,
      LOW_INT: core.int,
      LUMINANCE: core.int,
      LUMINANCE_ALPHA: core.int,
      MAX_COMBINED_TEXTURE_IMAGE_UNITS: core.int,
      MAX_CUBE_MAP_TEXTURE_SIZE: core.int,
      MAX_FRAGMENT_UNIFORM_VECTORS: core.int,
      MAX_RENDERBUFFER_SIZE: core.int,
      MAX_TEXTURE_IMAGE_UNITS: core.int,
      MAX_TEXTURE_SIZE: core.int,
      MAX_VARYING_VECTORS: core.int,
      MAX_VERTEX_ATTRIBS: core.int,
      MAX_VERTEX_TEXTURE_IMAGE_UNITS: core.int,
      MAX_VERTEX_UNIFORM_VECTORS: core.int,
      MAX_VIEWPORT_DIMS: core.int,
      MEDIUM_FLOAT: core.int,
      MEDIUM_INT: core.int,
      MIRRORED_REPEAT: core.int,
      NEAREST: core.int,
      NEAREST_MIPMAP_LINEAR: core.int,
      NEAREST_MIPMAP_NEAREST: core.int,
      NEVER: core.int,
      NICEST: core.int,
      NONE: core.int,
      NOTEQUAL: core.int,
      NO_ERROR: core.int,
      ONE: core.int,
      ONE_MINUS_CONSTANT_ALPHA: core.int,
      ONE_MINUS_CONSTANT_COLOR: core.int,
      ONE_MINUS_DST_ALPHA: core.int,
      ONE_MINUS_DST_COLOR: core.int,
      ONE_MINUS_SRC_ALPHA: core.int,
      ONE_MINUS_SRC_COLOR: core.int,
      OUT_OF_MEMORY: core.int,
      PACK_ALIGNMENT: core.int,
      POINTS: core.int,
      POLYGON_OFFSET_FACTOR: core.int,
      POLYGON_OFFSET_FILL: core.int,
      POLYGON_OFFSET_UNITS: core.int,
      RED_BITS: core.int,
      RENDERBUFFER: core.int,
      RENDERBUFFER_ALPHA_SIZE: core.int,
      RENDERBUFFER_BINDING: core.int,
      RENDERBUFFER_BLUE_SIZE: core.int,
      RENDERBUFFER_DEPTH_SIZE: core.int,
      RENDERBUFFER_GREEN_SIZE: core.int,
      RENDERBUFFER_HEIGHT: core.int,
      RENDERBUFFER_INTERNAL_FORMAT: core.int,
      RENDERBUFFER_RED_SIZE: core.int,
      RENDERBUFFER_STENCIL_SIZE: core.int,
      RENDERBUFFER_WIDTH: core.int,
      RENDERER: core.int,
      REPEAT: core.int,
      REPLACE: core.int,
      RGB: core.int,
      RGB565: core.int,
      RGB5_A1: core.int,
      RGBA: core.int,
      RGBA4: core.int,
      SAMPLER_2D: core.int,
      SAMPLER_CUBE: core.int,
      SAMPLES: core.int,
      SAMPLE_ALPHA_TO_COVERAGE: core.int,
      SAMPLE_BUFFERS: core.int,
      SAMPLE_COVERAGE: core.int,
      SAMPLE_COVERAGE_INVERT: core.int,
      SAMPLE_COVERAGE_VALUE: core.int,
      SCISSOR_BOX: core.int,
      SCISSOR_TEST: core.int,
      SHADER_TYPE: core.int,
      SHADING_LANGUAGE_VERSION: core.int,
      SHORT: core.int,
      SRC_ALPHA: core.int,
      SRC_ALPHA_SATURATE: core.int,
      SRC_COLOR: core.int,
      STATIC_DRAW: core.int,
      STENCIL_ATTACHMENT: core.int,
      STENCIL_BACK_FAIL: core.int,
      STENCIL_BACK_FUNC: core.int,
      STENCIL_BACK_PASS_DEPTH_FAIL: core.int,
      STENCIL_BACK_PASS_DEPTH_PASS: core.int,
      STENCIL_BACK_REF: core.int,
      STENCIL_BACK_VALUE_MASK: core.int,
      STENCIL_BACK_WRITEMASK: core.int,
      STENCIL_BITS: core.int,
      STENCIL_BUFFER_BIT: core.int,
      STENCIL_CLEAR_VALUE: core.int,
      STENCIL_FAIL: core.int,
      STENCIL_FUNC: core.int,
      STENCIL_INDEX: core.int,
      STENCIL_INDEX8: core.int,
      STENCIL_PASS_DEPTH_FAIL: core.int,
      STENCIL_PASS_DEPTH_PASS: core.int,
      STENCIL_REF: core.int,
      STENCIL_TEST: core.int,
      STENCIL_VALUE_MASK: core.int,
      STENCIL_WRITEMASK: core.int,
      STREAM_DRAW: core.int,
      SUBPIXEL_BITS: core.int,
      TEXTURE: core.int,
      TEXTURE0: core.int,
      TEXTURE1: core.int,
      TEXTURE10: core.int,
      TEXTURE11: core.int,
      TEXTURE12: core.int,
      TEXTURE13: core.int,
      TEXTURE14: core.int,
      TEXTURE15: core.int,
      TEXTURE16: core.int,
      TEXTURE17: core.int,
      TEXTURE18: core.int,
      TEXTURE19: core.int,
      TEXTURE2: core.int,
      TEXTURE20: core.int,
      TEXTURE21: core.int,
      TEXTURE22: core.int,
      TEXTURE23: core.int,
      TEXTURE24: core.int,
      TEXTURE25: core.int,
      TEXTURE26: core.int,
      TEXTURE27: core.int,
      TEXTURE28: core.int,
      TEXTURE29: core.int,
      TEXTURE3: core.int,
      TEXTURE30: core.int,
      TEXTURE31: core.int,
      TEXTURE4: core.int,
      TEXTURE5: core.int,
      TEXTURE6: core.int,
      TEXTURE7: core.int,
      TEXTURE8: core.int,
      TEXTURE9: core.int,
      TEXTURE_2D: core.int,
      TEXTURE_BINDING_2D: core.int,
      TEXTURE_BINDING_CUBE_MAP: core.int,
      TEXTURE_CUBE_MAP: core.int,
      TEXTURE_CUBE_MAP_NEGATIVE_X: core.int,
      TEXTURE_CUBE_MAP_NEGATIVE_Y: core.int,
      TEXTURE_CUBE_MAP_NEGATIVE_Z: core.int,
      TEXTURE_CUBE_MAP_POSITIVE_X: core.int,
      TEXTURE_CUBE_MAP_POSITIVE_Y: core.int,
      TEXTURE_CUBE_MAP_POSITIVE_Z: core.int,
      TEXTURE_MAG_FILTER: core.int,
      TEXTURE_MIN_FILTER: core.int,
      TEXTURE_WRAP_S: core.int,
      TEXTURE_WRAP_T: core.int,
      TRIANGLES: core.int,
      TRIANGLE_FAN: core.int,
      TRIANGLE_STRIP: core.int,
      UNPACK_ALIGNMENT: core.int,
      UNPACK_COLORSPACE_CONVERSION_WEBGL: core.int,
      UNPACK_FLIP_Y_WEBGL: core.int,
      UNPACK_PREMULTIPLY_ALPHA_WEBGL: core.int,
      UNSIGNED_BYTE: core.int,
      UNSIGNED_INT: core.int,
      UNSIGNED_SHORT: core.int,
      UNSIGNED_SHORT_4_4_4_4: core.int,
      UNSIGNED_SHORT_5_5_5_1: core.int,
      UNSIGNED_SHORT_5_6_5: core.int,
      VALIDATE_STATUS: core.int,
      VENDOR: core.int,
      VERSION: core.int,
      VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: core.int,
      VERTEX_ATTRIB_ARRAY_ENABLED: core.int,
      VERTEX_ATTRIB_ARRAY_NORMALIZED: core.int,
      VERTEX_ATTRIB_ARRAY_POINTER: core.int,
      VERTEX_ATTRIB_ARRAY_SIZE: core.int,
      VERTEX_ATTRIB_ARRAY_STRIDE: core.int,
      VERTEX_ATTRIB_ARRAY_TYPE: core.int,
      VERTEX_SHADER: core.int,
      VIEWPORT: core.int,
      ZERO: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  web_gl.RenderingContext.ACTIVE_ATTRIBUTES = 35721;
  web_gl.RenderingContext.ACTIVE_TEXTURE = 34016;
  web_gl.RenderingContext.ACTIVE_UNIFORMS = 35718;
  web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE = 33902;
  web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE = 33901;
  web_gl.RenderingContext.ALPHA = 6406;
  web_gl.RenderingContext.ALPHA_BITS = 3413;
  web_gl.RenderingContext.ALWAYS = 519;
  web_gl.RenderingContext.ARRAY_BUFFER = 34962;
  web_gl.RenderingContext.ARRAY_BUFFER_BINDING = 34964;
  web_gl.RenderingContext.ATTACHED_SHADERS = 35717;
  web_gl.RenderingContext.BACK = 1029;
  web_gl.RenderingContext.BLEND = 3042;
  web_gl.RenderingContext.BLEND_COLOR = 32773;
  web_gl.RenderingContext.BLEND_DST_ALPHA = 32970;
  web_gl.RenderingContext.BLEND_DST_RGB = 32968;
  web_gl.RenderingContext.BLEND_EQUATION = 32777;
  web_gl.RenderingContext.BLEND_EQUATION_ALPHA = 34877;
  web_gl.RenderingContext.BLEND_EQUATION_RGB = 32777;
  web_gl.RenderingContext.BLEND_SRC_ALPHA = 32971;
  web_gl.RenderingContext.BLEND_SRC_RGB = 32969;
  web_gl.RenderingContext.BLUE_BITS = 3412;
  web_gl.RenderingContext.BOOL = 35670;
  web_gl.RenderingContext.BOOL_VEC2 = 35671;
  web_gl.RenderingContext.BOOL_VEC3 = 35672;
  web_gl.RenderingContext.BOOL_VEC4 = 35673;
  web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL = 37444;
  web_gl.RenderingContext.BUFFER_SIZE = 34660;
  web_gl.RenderingContext.BUFFER_USAGE = 34661;
  web_gl.RenderingContext.BYTE = 5120;
  web_gl.RenderingContext.CCW = 2305;
  web_gl.RenderingContext.CLAMP_TO_EDGE = 33071;
  web_gl.RenderingContext.COLOR_ATTACHMENT0 = 36064;
  web_gl.RenderingContext.COLOR_BUFFER_BIT = 16384;
  web_gl.RenderingContext.COLOR_CLEAR_VALUE = 3106;
  web_gl.RenderingContext.COLOR_WRITEMASK = 3107;
  web_gl.RenderingContext.COMPILE_STATUS = 35713;
  web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS = 34467;
  web_gl.RenderingContext.CONSTANT_ALPHA = 32771;
  web_gl.RenderingContext.CONSTANT_COLOR = 32769;
  web_gl.RenderingContext.CONTEXT_LOST_WEBGL = 37442;
  web_gl.RenderingContext.CULL_FACE = 2884;
  web_gl.RenderingContext.CULL_FACE_MODE = 2885;
  web_gl.RenderingContext.CURRENT_PROGRAM = 35725;
  web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB = 34342;
  web_gl.RenderingContext.CW = 2304;
  web_gl.RenderingContext.DECR = 7683;
  web_gl.RenderingContext.DECR_WRAP = 34056;
  web_gl.RenderingContext.DELETE_STATUS = 35712;
  web_gl.RenderingContext.DEPTH_ATTACHMENT = 36096;
  web_gl.RenderingContext.DEPTH_BITS = 3414;
  web_gl.RenderingContext.DEPTH_BUFFER_BIT = 256;
  web_gl.RenderingContext.DEPTH_CLEAR_VALUE = 2931;
  web_gl.RenderingContext.DEPTH_COMPONENT = 6402;
  web_gl.RenderingContext.DEPTH_COMPONENT16 = 33189;
  web_gl.RenderingContext.DEPTH_FUNC = 2932;
  web_gl.RenderingContext.DEPTH_RANGE = 2928;
  web_gl.RenderingContext.DEPTH_STENCIL = 34041;
  web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT = 33306;
  web_gl.RenderingContext.DEPTH_TEST = 2929;
  web_gl.RenderingContext.DEPTH_WRITEMASK = 2930;
  web_gl.RenderingContext.DITHER = 3024;
  web_gl.RenderingContext.DONT_CARE = 4352;
  web_gl.RenderingContext.DST_ALPHA = 772;
  web_gl.RenderingContext.DST_COLOR = 774;
  web_gl.RenderingContext.DYNAMIC_DRAW = 35048;
  web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER = 34963;
  web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING = 34965;
  web_gl.RenderingContext.EQUAL = 514;
  web_gl.RenderingContext.FASTEST = 4353;
  web_gl.RenderingContext.FLOAT = 5126;
  web_gl.RenderingContext.FLOAT_MAT2 = 35674;
  web_gl.RenderingContext.FLOAT_MAT3 = 35675;
  web_gl.RenderingContext.FLOAT_MAT4 = 35676;
  web_gl.RenderingContext.FLOAT_VEC2 = 35664;
  web_gl.RenderingContext.FLOAT_VEC3 = 35665;
  web_gl.RenderingContext.FLOAT_VEC4 = 35666;
  web_gl.RenderingContext.FRAGMENT_SHADER = 35632;
  web_gl.RenderingContext.FRAMEBUFFER = 36160;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050;
  web_gl.RenderingContext.FRAMEBUFFER_BINDING = 36006;
  web_gl.RenderingContext.FRAMEBUFFER_COMPLETE = 36053;
  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054;
  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057;
  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055;
  web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED = 36061;
  web_gl.RenderingContext.FRONT = 1028;
  web_gl.RenderingContext.FRONT_AND_BACK = 1032;
  web_gl.RenderingContext.FRONT_FACE = 2886;
  web_gl.RenderingContext.FUNC_ADD = 32774;
  web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT = 32779;
  web_gl.RenderingContext.FUNC_SUBTRACT = 32778;
  web_gl.RenderingContext.GENERATE_MIPMAP_HINT = 33170;
  web_gl.RenderingContext.GEQUAL = 518;
  web_gl.RenderingContext.GREATER = 516;
  web_gl.RenderingContext.GREEN_BITS = 3411;
  web_gl.RenderingContext.HIGH_FLOAT = 36338;
  web_gl.RenderingContext.HIGH_INT = 36341;
  web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT = 35739;
  web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE = 35738;
  web_gl.RenderingContext.INCR = 7682;
  web_gl.RenderingContext.INCR_WRAP = 34055;
  web_gl.RenderingContext.INT = 5124;
  web_gl.RenderingContext.INT_VEC2 = 35667;
  web_gl.RenderingContext.INT_VEC3 = 35668;
  web_gl.RenderingContext.INT_VEC4 = 35669;
  web_gl.RenderingContext.INVALID_ENUM = 1280;
  web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION = 1286;
  web_gl.RenderingContext.INVALID_OPERATION = 1282;
  web_gl.RenderingContext.INVALID_VALUE = 1281;
  web_gl.RenderingContext.INVERT = 5386;
  web_gl.RenderingContext.KEEP = 7680;
  web_gl.RenderingContext.LEQUAL = 515;
  web_gl.RenderingContext.LESS = 513;
  web_gl.RenderingContext.LINEAR = 9729;
  web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR = 9987;
  web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST = 9985;
  web_gl.RenderingContext.LINES = 1;
  web_gl.RenderingContext.LINE_LOOP = 2;
  web_gl.RenderingContext.LINE_STRIP = 3;
  web_gl.RenderingContext.LINE_WIDTH = 2849;
  web_gl.RenderingContext.LINK_STATUS = 35714;
  web_gl.RenderingContext.LOW_FLOAT = 36336;
  web_gl.RenderingContext.LOW_INT = 36339;
  web_gl.RenderingContext.LUMINANCE = 6409;
  web_gl.RenderingContext.LUMINANCE_ALPHA = 6410;
  web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661;
  web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE = 34076;
  web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS = 36349;
  web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE = 34024;
  web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS = 34930;
  web_gl.RenderingContext.MAX_TEXTURE_SIZE = 3379;
  web_gl.RenderingContext.MAX_VARYING_VECTORS = 36348;
  web_gl.RenderingContext.MAX_VERTEX_ATTRIBS = 34921;
  web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660;
  web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS = 36347;
  web_gl.RenderingContext.MAX_VIEWPORT_DIMS = 3386;
  web_gl.RenderingContext.MEDIUM_FLOAT = 36337;
  web_gl.RenderingContext.MEDIUM_INT = 36340;
  web_gl.RenderingContext.MIRRORED_REPEAT = 33648;
  web_gl.RenderingContext.NEAREST = 9728;
  web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR = 9986;
  web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST = 9984;
  web_gl.RenderingContext.NEVER = 512;
  web_gl.RenderingContext.NICEST = 4354;
  web_gl.RenderingContext.NONE = 0;
  web_gl.RenderingContext.NOTEQUAL = 517;
  web_gl.RenderingContext.NO_ERROR = 0;
  web_gl.RenderingContext.ONE = 1;
  web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA = 32772;
  web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR = 32770;
  web_gl.RenderingContext.ONE_MINUS_DST_ALPHA = 773;
  web_gl.RenderingContext.ONE_MINUS_DST_COLOR = 775;
  web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA = 771;
  web_gl.RenderingContext.ONE_MINUS_SRC_COLOR = 769;
  web_gl.RenderingContext.OUT_OF_MEMORY = 1285;
  web_gl.RenderingContext.PACK_ALIGNMENT = 3333;
  web_gl.RenderingContext.POINTS = 0;
  web_gl.RenderingContext.POLYGON_OFFSET_FACTOR = 32824;
  web_gl.RenderingContext.POLYGON_OFFSET_FILL = 32823;
  web_gl.RenderingContext.POLYGON_OFFSET_UNITS = 10752;
  web_gl.RenderingContext.RED_BITS = 3410;
  web_gl.RenderingContext.RENDERBUFFER = 36161;
  web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE = 36179;
  web_gl.RenderingContext.RENDERBUFFER_BINDING = 36007;
  web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE = 36178;
  web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE = 36180;
  web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE = 36177;
  web_gl.RenderingContext.RENDERBUFFER_HEIGHT = 36163;
  web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT = 36164;
  web_gl.RenderingContext.RENDERBUFFER_RED_SIZE = 36176;
  web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE = 36181;
  web_gl.RenderingContext.RENDERBUFFER_WIDTH = 36162;
  web_gl.RenderingContext.RENDERER = 7937;
  web_gl.RenderingContext.REPEAT = 10497;
  web_gl.RenderingContext.REPLACE = 7681;
  web_gl.RenderingContext.RGB = 6407;
  web_gl.RenderingContext.RGB565 = 36194;
  web_gl.RenderingContext.RGB5_A1 = 32855;
  web_gl.RenderingContext.RGBA = 6408;
  web_gl.RenderingContext.RGBA4 = 32854;
  web_gl.RenderingContext.SAMPLER_2D = 35678;
  web_gl.RenderingContext.SAMPLER_CUBE = 35680;
  web_gl.RenderingContext.SAMPLES = 32937;
  web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE = 32926;
  web_gl.RenderingContext.SAMPLE_BUFFERS = 32936;
  web_gl.RenderingContext.SAMPLE_COVERAGE = 32928;
  web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT = 32939;
  web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE = 32938;
  web_gl.RenderingContext.SCISSOR_BOX = 3088;
  web_gl.RenderingContext.SCISSOR_TEST = 3089;
  web_gl.RenderingContext.SHADER_TYPE = 35663;
  web_gl.RenderingContext.SHADING_LANGUAGE_VERSION = 35724;
  web_gl.RenderingContext.SHORT = 5122;
  web_gl.RenderingContext.SRC_ALPHA = 770;
  web_gl.RenderingContext.SRC_ALPHA_SATURATE = 776;
  web_gl.RenderingContext.SRC_COLOR = 768;
  web_gl.RenderingContext.STATIC_DRAW = 35044;
  web_gl.RenderingContext.STENCIL_ATTACHMENT = 36128;
  web_gl.RenderingContext.STENCIL_BACK_FAIL = 34817;
  web_gl.RenderingContext.STENCIL_BACK_FUNC = 34816;
  web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL = 34818;
  web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS = 34819;
  web_gl.RenderingContext.STENCIL_BACK_REF = 36003;
  web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK = 36004;
  web_gl.RenderingContext.STENCIL_BACK_WRITEMASK = 36005;
  web_gl.RenderingContext.STENCIL_BITS = 3415;
  web_gl.RenderingContext.STENCIL_BUFFER_BIT = 1024;
  web_gl.RenderingContext.STENCIL_CLEAR_VALUE = 2961;
  web_gl.RenderingContext.STENCIL_FAIL = 2964;
  web_gl.RenderingContext.STENCIL_FUNC = 2962;
  web_gl.RenderingContext.STENCIL_INDEX = 6401;
  web_gl.RenderingContext.STENCIL_INDEX8 = 36168;
  web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL = 2965;
  web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS = 2966;
  web_gl.RenderingContext.STENCIL_REF = 2967;
  web_gl.RenderingContext.STENCIL_TEST = 2960;
  web_gl.RenderingContext.STENCIL_VALUE_MASK = 2963;
  web_gl.RenderingContext.STENCIL_WRITEMASK = 2968;
  web_gl.RenderingContext.STREAM_DRAW = 35040;
  web_gl.RenderingContext.SUBPIXEL_BITS = 3408;
  web_gl.RenderingContext.TEXTURE = 5890;
  web_gl.RenderingContext.TEXTURE0 = 33984;
  web_gl.RenderingContext.TEXTURE1 = 33985;
  web_gl.RenderingContext.TEXTURE10 = 33994;
  web_gl.RenderingContext.TEXTURE11 = 33995;
  web_gl.RenderingContext.TEXTURE12 = 33996;
  web_gl.RenderingContext.TEXTURE13 = 33997;
  web_gl.RenderingContext.TEXTURE14 = 33998;
  web_gl.RenderingContext.TEXTURE15 = 33999;
  web_gl.RenderingContext.TEXTURE16 = 34000;
  web_gl.RenderingContext.TEXTURE17 = 34001;
  web_gl.RenderingContext.TEXTURE18 = 34002;
  web_gl.RenderingContext.TEXTURE19 = 34003;
  web_gl.RenderingContext.TEXTURE2 = 33986;
  web_gl.RenderingContext.TEXTURE20 = 34004;
  web_gl.RenderingContext.TEXTURE21 = 34005;
  web_gl.RenderingContext.TEXTURE22 = 34006;
  web_gl.RenderingContext.TEXTURE23 = 34007;
  web_gl.RenderingContext.TEXTURE24 = 34008;
  web_gl.RenderingContext.TEXTURE25 = 34009;
  web_gl.RenderingContext.TEXTURE26 = 34010;
  web_gl.RenderingContext.TEXTURE27 = 34011;
  web_gl.RenderingContext.TEXTURE28 = 34012;
  web_gl.RenderingContext.TEXTURE29 = 34013;
  web_gl.RenderingContext.TEXTURE3 = 33987;
  web_gl.RenderingContext.TEXTURE30 = 34014;
  web_gl.RenderingContext.TEXTURE31 = 34015;
  web_gl.RenderingContext.TEXTURE4 = 33988;
  web_gl.RenderingContext.TEXTURE5 = 33989;
  web_gl.RenderingContext.TEXTURE6 = 33990;
  web_gl.RenderingContext.TEXTURE7 = 33991;
  web_gl.RenderingContext.TEXTURE8 = 33992;
  web_gl.RenderingContext.TEXTURE9 = 33993;
  web_gl.RenderingContext.TEXTURE_2D = 3553;
  web_gl.RenderingContext.TEXTURE_BINDING_2D = 32873;
  web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP = 34068;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP = 34067;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
  web_gl.RenderingContext.TEXTURE_MAG_FILTER = 10240;
  web_gl.RenderingContext.TEXTURE_MIN_FILTER = 10241;
  web_gl.RenderingContext.TEXTURE_WRAP_S = 10242;
  web_gl.RenderingContext.TEXTURE_WRAP_T = 10243;
  web_gl.RenderingContext.TRIANGLES = 4;
  web_gl.RenderingContext.TRIANGLE_FAN = 6;
  web_gl.RenderingContext.TRIANGLE_STRIP = 5;
  web_gl.RenderingContext.UNPACK_ALIGNMENT = 3317;
  web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443;
  web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL = 37440;
  web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441;
  web_gl.RenderingContext.UNSIGNED_BYTE = 5121;
  web_gl.RenderingContext.UNSIGNED_INT = 5125;
  web_gl.RenderingContext.UNSIGNED_SHORT = 5123;
  web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4 = 32819;
  web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1 = 32820;
  web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5 = 33635;
  web_gl.RenderingContext.VALIDATE_STATUS = 35715;
  web_gl.RenderingContext.VENDOR = 7936;
  web_gl.RenderingContext.VERSION = 7938;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED = 34338;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER = 34373;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE = 34339;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE = 34340;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE = 34341;
  web_gl.RenderingContext.VERTEX_SHADER = 35633;
  web_gl.RenderingContext.VIEWPORT = 2978;
  web_gl.RenderingContext.ZERO = 0;
  dart.registerExtension(dart.global.WebGLRenderingContext, web_gl.RenderingContext);
  web_gl.ACTIVE_ATTRIBUTES = web_gl.RenderingContext.ACTIVE_ATTRIBUTES;
  web_gl.ACTIVE_TEXTURE = web_gl.RenderingContext.ACTIVE_TEXTURE;
  web_gl.ACTIVE_UNIFORMS = web_gl.RenderingContext.ACTIVE_UNIFORMS;
  web_gl.ALIASED_LINE_WIDTH_RANGE = web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE;
  web_gl.ALIASED_POINT_SIZE_RANGE = web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE;
  web_gl.ALPHA = web_gl.RenderingContext.ALPHA;
  web_gl.ALPHA_BITS = web_gl.RenderingContext.ALPHA_BITS;
  web_gl.ALWAYS = web_gl.RenderingContext.ALWAYS;
  web_gl.ARRAY_BUFFER = web_gl.RenderingContext.ARRAY_BUFFER;
  web_gl.ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ARRAY_BUFFER_BINDING;
  web_gl.ATTACHED_SHADERS = web_gl.RenderingContext.ATTACHED_SHADERS;
  web_gl.BACK = web_gl.RenderingContext.BACK;
  web_gl.BLEND = web_gl.RenderingContext.BLEND;
  web_gl.BLEND_COLOR = web_gl.RenderingContext.BLEND_COLOR;
  web_gl.BLEND_DST_ALPHA = web_gl.RenderingContext.BLEND_DST_ALPHA;
  web_gl.BLEND_DST_RGB = web_gl.RenderingContext.BLEND_DST_RGB;
  web_gl.BLEND_EQUATION = web_gl.RenderingContext.BLEND_EQUATION;
  web_gl.BLEND_EQUATION_ALPHA = web_gl.RenderingContext.BLEND_EQUATION_ALPHA;
  web_gl.BLEND_EQUATION_RGB = web_gl.RenderingContext.BLEND_EQUATION_RGB;
  web_gl.BLEND_SRC_ALPHA = web_gl.RenderingContext.BLEND_SRC_ALPHA;
  web_gl.BLEND_SRC_RGB = web_gl.RenderingContext.BLEND_SRC_RGB;
  web_gl.BLUE_BITS = web_gl.RenderingContext.BLUE_BITS;
  web_gl.BOOL = web_gl.RenderingContext.BOOL;
  web_gl.BOOL_VEC2 = web_gl.RenderingContext.BOOL_VEC2;
  web_gl.BOOL_VEC3 = web_gl.RenderingContext.BOOL_VEC3;
  web_gl.BOOL_VEC4 = web_gl.RenderingContext.BOOL_VEC4;
  web_gl.BROWSER_DEFAULT_WEBGL = web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL;
  web_gl.BUFFER_SIZE = web_gl.RenderingContext.BUFFER_SIZE;
  web_gl.BUFFER_USAGE = web_gl.RenderingContext.BUFFER_USAGE;
  web_gl.BYTE = web_gl.RenderingContext.BYTE;
  web_gl.CCW = web_gl.RenderingContext.CCW;
  web_gl.CLAMP_TO_EDGE = web_gl.RenderingContext.CLAMP_TO_EDGE;
  web_gl.COLOR_ATTACHMENT0 = web_gl.RenderingContext.COLOR_ATTACHMENT0;
  web_gl.COLOR_BUFFER_BIT = web_gl.RenderingContext.COLOR_BUFFER_BIT;
  web_gl.COLOR_CLEAR_VALUE = web_gl.RenderingContext.COLOR_CLEAR_VALUE;
  web_gl.COLOR_WRITEMASK = web_gl.RenderingContext.COLOR_WRITEMASK;
  web_gl.COMPILE_STATUS = web_gl.RenderingContext.COMPILE_STATUS;
  web_gl.COMPRESSED_TEXTURE_FORMATS = web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS;
  web_gl.CONSTANT_ALPHA = web_gl.RenderingContext.CONSTANT_ALPHA;
  web_gl.CONSTANT_COLOR = web_gl.RenderingContext.CONSTANT_COLOR;
  web_gl.CONTEXT_LOST_WEBGL = web_gl.RenderingContext.CONTEXT_LOST_WEBGL;
  web_gl.CULL_FACE = web_gl.RenderingContext.CULL_FACE;
  web_gl.CULL_FACE_MODE = web_gl.RenderingContext.CULL_FACE_MODE;
  web_gl.CURRENT_PROGRAM = web_gl.RenderingContext.CURRENT_PROGRAM;
  web_gl.CURRENT_VERTEX_ATTRIB = web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB;
  web_gl.CW = web_gl.RenderingContext.CW;
  web_gl.DECR = web_gl.RenderingContext.DECR;
  web_gl.DECR_WRAP = web_gl.RenderingContext.DECR_WRAP;
  web_gl.DELETE_STATUS = web_gl.RenderingContext.DELETE_STATUS;
  web_gl.DEPTH_ATTACHMENT = web_gl.RenderingContext.DEPTH_ATTACHMENT;
  web_gl.DEPTH_BITS = web_gl.RenderingContext.DEPTH_BITS;
  web_gl.DEPTH_BUFFER_BIT = web_gl.RenderingContext.DEPTH_BUFFER_BIT;
  web_gl.DEPTH_CLEAR_VALUE = web_gl.RenderingContext.DEPTH_CLEAR_VALUE;
  web_gl.DEPTH_COMPONENT = web_gl.RenderingContext.DEPTH_COMPONENT;
  web_gl.DEPTH_COMPONENT16 = web_gl.RenderingContext.DEPTH_COMPONENT16;
  web_gl.DEPTH_FUNC = web_gl.RenderingContext.DEPTH_FUNC;
  web_gl.DEPTH_RANGE = web_gl.RenderingContext.DEPTH_RANGE;
  web_gl.DEPTH_STENCIL = web_gl.RenderingContext.DEPTH_STENCIL;
  web_gl.DEPTH_STENCIL_ATTACHMENT = web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT;
  web_gl.DEPTH_TEST = web_gl.RenderingContext.DEPTH_TEST;
  web_gl.DEPTH_WRITEMASK = web_gl.RenderingContext.DEPTH_WRITEMASK;
  web_gl.DITHER = web_gl.RenderingContext.DITHER;
  web_gl.DONT_CARE = web_gl.RenderingContext.DONT_CARE;
  web_gl.DST_ALPHA = web_gl.RenderingContext.DST_ALPHA;
  web_gl.DST_COLOR = web_gl.RenderingContext.DST_COLOR;
  web_gl.DYNAMIC_DRAW = web_gl.RenderingContext.DYNAMIC_DRAW;
  web_gl.ELEMENT_ARRAY_BUFFER = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER;
  web_gl.ELEMENT_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
  web_gl.EQUAL = web_gl.RenderingContext.EQUAL;
  web_gl.FASTEST = web_gl.RenderingContext.FASTEST;
  web_gl.FLOAT = web_gl.RenderingContext.FLOAT;
  web_gl.FLOAT_MAT2 = web_gl.RenderingContext.FLOAT_MAT2;
  web_gl.FLOAT_MAT3 = web_gl.RenderingContext.FLOAT_MAT3;
  web_gl.FLOAT_MAT4 = web_gl.RenderingContext.FLOAT_MAT4;
  web_gl.FLOAT_VEC2 = web_gl.RenderingContext.FLOAT_VEC2;
  web_gl.FLOAT_VEC3 = web_gl.RenderingContext.FLOAT_VEC3;
  web_gl.FLOAT_VEC4 = web_gl.RenderingContext.FLOAT_VEC4;
  web_gl.FRAGMENT_SHADER = web_gl.RenderingContext.FRAGMENT_SHADER;
  web_gl.FRAMEBUFFER = web_gl.RenderingContext.FRAMEBUFFER;
  web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
  web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
  web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
  web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
  web_gl.FRAMEBUFFER_BINDING = web_gl.RenderingContext.FRAMEBUFFER_BINDING;
  web_gl.FRAMEBUFFER_COMPLETE = web_gl.RenderingContext.FRAMEBUFFER_COMPLETE;
  web_gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
  web_gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
  web_gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
  web_gl.FRAMEBUFFER_UNSUPPORTED = web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED;
  web_gl.FRONT = web_gl.RenderingContext.FRONT;
  web_gl.FRONT_AND_BACK = web_gl.RenderingContext.FRONT_AND_BACK;
  web_gl.FRONT_FACE = web_gl.RenderingContext.FRONT_FACE;
  web_gl.FUNC_ADD = web_gl.RenderingContext.FUNC_ADD;
  web_gl.FUNC_REVERSE_SUBTRACT = web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT;
  web_gl.FUNC_SUBTRACT = web_gl.RenderingContext.FUNC_SUBTRACT;
  web_gl.GENERATE_MIPMAP_HINT = web_gl.RenderingContext.GENERATE_MIPMAP_HINT;
  web_gl.GEQUAL = web_gl.RenderingContext.GEQUAL;
  web_gl.GREATER = web_gl.RenderingContext.GREATER;
  web_gl.GREEN_BITS = web_gl.RenderingContext.GREEN_BITS;
  web_gl.OesTextureHalfFloat = class OesTextureHalfFloat extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureHalfFloat, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloat, [])}),
    sfields: () => ({HALF_FLOAT_OES: core.int})
  });
  web_gl.OesTextureHalfFloat.HALF_FLOAT_OES = 36193;
  dart.registerExtension(dart.global.OESTextureHalfFloat, web_gl.OesTextureHalfFloat);
  web_gl.HALF_FLOAT_OES = web_gl.OesTextureHalfFloat.HALF_FLOAT_OES;
  web_gl.HIGH_FLOAT = web_gl.RenderingContext.HIGH_FLOAT;
  web_gl.HIGH_INT = web_gl.RenderingContext.HIGH_INT;
  web_gl.INCR = web_gl.RenderingContext.INCR;
  web_gl.INCR_WRAP = web_gl.RenderingContext.INCR_WRAP;
  web_gl.INT = web_gl.RenderingContext.INT;
  web_gl.INT_VEC2 = web_gl.RenderingContext.INT_VEC2;
  web_gl.INT_VEC3 = web_gl.RenderingContext.INT_VEC3;
  web_gl.INT_VEC4 = web_gl.RenderingContext.INT_VEC4;
  web_gl.INVALID_ENUM = web_gl.RenderingContext.INVALID_ENUM;
  web_gl.INVALID_FRAMEBUFFER_OPERATION = web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
  web_gl.INVALID_OPERATION = web_gl.RenderingContext.INVALID_OPERATION;
  web_gl.INVALID_VALUE = web_gl.RenderingContext.INVALID_VALUE;
  web_gl.INVERT = web_gl.RenderingContext.INVERT;
  web_gl.KEEP = web_gl.RenderingContext.KEEP;
  web_gl.LEQUAL = web_gl.RenderingContext.LEQUAL;
  web_gl.LESS = web_gl.RenderingContext.LESS;
  web_gl.LINEAR = web_gl.RenderingContext.LINEAR;
  web_gl.LINEAR_MIPMAP_LINEAR = web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR;
  web_gl.LINEAR_MIPMAP_NEAREST = web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST;
  web_gl.LINES = web_gl.RenderingContext.LINES;
  web_gl.LINE_LOOP = web_gl.RenderingContext.LINE_LOOP;
  web_gl.LINE_STRIP = web_gl.RenderingContext.LINE_STRIP;
  web_gl.LINE_WIDTH = web_gl.RenderingContext.LINE_WIDTH;
  web_gl.LINK_STATUS = web_gl.RenderingContext.LINK_STATUS;
  web_gl.LOW_FLOAT = web_gl.RenderingContext.LOW_FLOAT;
  web_gl.LOW_INT = web_gl.RenderingContext.LOW_INT;
  web_gl.LUMINANCE = web_gl.RenderingContext.LUMINANCE;
  web_gl.LUMINANCE_ALPHA = web_gl.RenderingContext.LUMINANCE_ALPHA;
  web_gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
  web_gl.MAX_CUBE_MAP_TEXTURE_SIZE = web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
  web_gl.MAX_FRAGMENT_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
  web_gl.MAX_RENDERBUFFER_SIZE = web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE;
  web_gl.MAX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
  web_gl.MAX_TEXTURE_SIZE = web_gl.RenderingContext.MAX_TEXTURE_SIZE;
  web_gl.MAX_VARYING_VECTORS = web_gl.RenderingContext.MAX_VARYING_VECTORS;
  web_gl.MAX_VERTEX_ATTRIBS = web_gl.RenderingContext.MAX_VERTEX_ATTRIBS;
  web_gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
  web_gl.MAX_VERTEX_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
  web_gl.MAX_VIEWPORT_DIMS = web_gl.RenderingContext.MAX_VIEWPORT_DIMS;
  web_gl.MEDIUM_FLOAT = web_gl.RenderingContext.MEDIUM_FLOAT;
  web_gl.MEDIUM_INT = web_gl.RenderingContext.MEDIUM_INT;
  web_gl.MIRRORED_REPEAT = web_gl.RenderingContext.MIRRORED_REPEAT;
  web_gl.NEAREST = web_gl.RenderingContext.NEAREST;
  web_gl.NEAREST_MIPMAP_LINEAR = web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR;
  web_gl.NEAREST_MIPMAP_NEAREST = web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST;
  web_gl.NEVER = web_gl.RenderingContext.NEVER;
  web_gl.NICEST = web_gl.RenderingContext.NICEST;
  web_gl.NONE = web_gl.RenderingContext.NONE;
  web_gl.NOTEQUAL = web_gl.RenderingContext.NOTEQUAL;
  web_gl.NO_ERROR = web_gl.RenderingContext.NO_ERROR;
  web_gl.ONE = web_gl.RenderingContext.ONE;
  web_gl.ONE_MINUS_CONSTANT_ALPHA = web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
  web_gl.ONE_MINUS_CONSTANT_COLOR = web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR;
  web_gl.ONE_MINUS_DST_ALPHA = web_gl.RenderingContext.ONE_MINUS_DST_ALPHA;
  web_gl.ONE_MINUS_DST_COLOR = web_gl.RenderingContext.ONE_MINUS_DST_COLOR;
  web_gl.ONE_MINUS_SRC_ALPHA = web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA;
  web_gl.ONE_MINUS_SRC_COLOR = web_gl.RenderingContext.ONE_MINUS_SRC_COLOR;
  web_gl.OUT_OF_MEMORY = web_gl.RenderingContext.OUT_OF_MEMORY;
  web_gl.PACK_ALIGNMENT = web_gl.RenderingContext.PACK_ALIGNMENT;
  web_gl.POINTS = web_gl.RenderingContext.POINTS;
  web_gl.POLYGON_OFFSET_FACTOR = web_gl.RenderingContext.POLYGON_OFFSET_FACTOR;
  web_gl.POLYGON_OFFSET_FILL = web_gl.RenderingContext.POLYGON_OFFSET_FILL;
  web_gl.POLYGON_OFFSET_UNITS = web_gl.RenderingContext.POLYGON_OFFSET_UNITS;
  web_gl.RED_BITS = web_gl.RenderingContext.RED_BITS;
  web_gl.RENDERBUFFER = web_gl.RenderingContext.RENDERBUFFER;
  web_gl.RENDERBUFFER_ALPHA_SIZE = web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE;
  web_gl.RENDERBUFFER_BINDING = web_gl.RenderingContext.RENDERBUFFER_BINDING;
  web_gl.RENDERBUFFER_BLUE_SIZE = web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE;
  web_gl.RENDERBUFFER_DEPTH_SIZE = web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE;
  web_gl.RENDERBUFFER_GREEN_SIZE = web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE;
  web_gl.RENDERBUFFER_HEIGHT = web_gl.RenderingContext.RENDERBUFFER_HEIGHT;
  web_gl.RENDERBUFFER_INTERNAL_FORMAT = web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
  web_gl.RENDERBUFFER_RED_SIZE = web_gl.RenderingContext.RENDERBUFFER_RED_SIZE;
  web_gl.RENDERBUFFER_STENCIL_SIZE = web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE;
  web_gl.RENDERBUFFER_WIDTH = web_gl.RenderingContext.RENDERBUFFER_WIDTH;
  web_gl.RENDERER = web_gl.RenderingContext.RENDERER;
  web_gl.REPEAT = web_gl.RenderingContext.REPEAT;
  web_gl.REPLACE = web_gl.RenderingContext.REPLACE;
  web_gl.RGB = web_gl.RenderingContext.RGB;
  web_gl.RGB565 = web_gl.RenderingContext.RGB565;
  web_gl.RGB5_A1 = web_gl.RenderingContext.RGB5_A1;
  web_gl.RGBA = web_gl.RenderingContext.RGBA;
  web_gl.RGBA4 = web_gl.RenderingContext.RGBA4;
  web_gl.SAMPLER_2D = web_gl.RenderingContext.SAMPLER_2D;
  web_gl.SAMPLER_CUBE = web_gl.RenderingContext.SAMPLER_CUBE;
  web_gl.SAMPLES = web_gl.RenderingContext.SAMPLES;
  web_gl.SAMPLE_ALPHA_TO_COVERAGE = web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
  web_gl.SAMPLE_BUFFERS = web_gl.RenderingContext.SAMPLE_BUFFERS;
  web_gl.SAMPLE_COVERAGE = web_gl.RenderingContext.SAMPLE_COVERAGE;
  web_gl.SAMPLE_COVERAGE_INVERT = web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT;
  web_gl.SAMPLE_COVERAGE_VALUE = web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE;
  web_gl.SCISSOR_BOX = web_gl.RenderingContext.SCISSOR_BOX;
  web_gl.SCISSOR_TEST = web_gl.RenderingContext.SCISSOR_TEST;
  web_gl.SHADER_TYPE = web_gl.RenderingContext.SHADER_TYPE;
  web_gl.SHADING_LANGUAGE_VERSION = web_gl.RenderingContext.SHADING_LANGUAGE_VERSION;
  web_gl.SHORT = web_gl.RenderingContext.SHORT;
  web_gl.SRC_ALPHA = web_gl.RenderingContext.SRC_ALPHA;
  web_gl.SRC_ALPHA_SATURATE = web_gl.RenderingContext.SRC_ALPHA_SATURATE;
  web_gl.SRC_COLOR = web_gl.RenderingContext.SRC_COLOR;
  web_gl.STATIC_DRAW = web_gl.RenderingContext.STATIC_DRAW;
  web_gl.STENCIL_ATTACHMENT = web_gl.RenderingContext.STENCIL_ATTACHMENT;
  web_gl.STENCIL_BACK_FAIL = web_gl.RenderingContext.STENCIL_BACK_FAIL;
  web_gl.STENCIL_BACK_FUNC = web_gl.RenderingContext.STENCIL_BACK_FUNC;
  web_gl.STENCIL_BACK_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
  web_gl.STENCIL_BACK_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
  web_gl.STENCIL_BACK_REF = web_gl.RenderingContext.STENCIL_BACK_REF;
  web_gl.STENCIL_BACK_VALUE_MASK = web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK;
  web_gl.STENCIL_BACK_WRITEMASK = web_gl.RenderingContext.STENCIL_BACK_WRITEMASK;
  web_gl.STENCIL_BITS = web_gl.RenderingContext.STENCIL_BITS;
  web_gl.STENCIL_BUFFER_BIT = web_gl.RenderingContext.STENCIL_BUFFER_BIT;
  web_gl.STENCIL_CLEAR_VALUE = web_gl.RenderingContext.STENCIL_CLEAR_VALUE;
  web_gl.STENCIL_FAIL = web_gl.RenderingContext.STENCIL_FAIL;
  web_gl.STENCIL_FUNC = web_gl.RenderingContext.STENCIL_FUNC;
  web_gl.STENCIL_INDEX = web_gl.RenderingContext.STENCIL_INDEX;
  web_gl.STENCIL_INDEX8 = web_gl.RenderingContext.STENCIL_INDEX8;
  web_gl.STENCIL_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL;
  web_gl.STENCIL_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS;
  web_gl.STENCIL_REF = web_gl.RenderingContext.STENCIL_REF;
  web_gl.STENCIL_TEST = web_gl.RenderingContext.STENCIL_TEST;
  web_gl.STENCIL_VALUE_MASK = web_gl.RenderingContext.STENCIL_VALUE_MASK;
  web_gl.STENCIL_WRITEMASK = web_gl.RenderingContext.STENCIL_WRITEMASK;
  web_gl.STREAM_DRAW = web_gl.RenderingContext.STREAM_DRAW;
  web_gl.SUBPIXEL_BITS = web_gl.RenderingContext.SUBPIXEL_BITS;
  web_gl.TEXTURE = web_gl.RenderingContext.TEXTURE;
  web_gl.TEXTURE0 = web_gl.RenderingContext.TEXTURE0;
  web_gl.TEXTURE1 = web_gl.RenderingContext.TEXTURE1;
  web_gl.TEXTURE10 = web_gl.RenderingContext.TEXTURE10;
  web_gl.TEXTURE11 = web_gl.RenderingContext.TEXTURE11;
  web_gl.TEXTURE12 = web_gl.RenderingContext.TEXTURE12;
  web_gl.TEXTURE13 = web_gl.RenderingContext.TEXTURE13;
  web_gl.TEXTURE14 = web_gl.RenderingContext.TEXTURE14;
  web_gl.TEXTURE15 = web_gl.RenderingContext.TEXTURE15;
  web_gl.TEXTURE16 = web_gl.RenderingContext.TEXTURE16;
  web_gl.TEXTURE17 = web_gl.RenderingContext.TEXTURE17;
  web_gl.TEXTURE18 = web_gl.RenderingContext.TEXTURE18;
  web_gl.TEXTURE19 = web_gl.RenderingContext.TEXTURE19;
  web_gl.TEXTURE2 = web_gl.RenderingContext.TEXTURE2;
  web_gl.TEXTURE20 = web_gl.RenderingContext.TEXTURE20;
  web_gl.TEXTURE21 = web_gl.RenderingContext.TEXTURE21;
  web_gl.TEXTURE22 = web_gl.RenderingContext.TEXTURE22;
  web_gl.TEXTURE23 = web_gl.RenderingContext.TEXTURE23;
  web_gl.TEXTURE24 = web_gl.RenderingContext.TEXTURE24;
  web_gl.TEXTURE25 = web_gl.RenderingContext.TEXTURE25;
  web_gl.TEXTURE26 = web_gl.RenderingContext.TEXTURE26;
  web_gl.TEXTURE27 = web_gl.RenderingContext.TEXTURE27;
  web_gl.TEXTURE28 = web_gl.RenderingContext.TEXTURE28;
  web_gl.TEXTURE29 = web_gl.RenderingContext.TEXTURE29;
  web_gl.TEXTURE3 = web_gl.RenderingContext.TEXTURE3;
  web_gl.TEXTURE30 = web_gl.RenderingContext.TEXTURE30;
  web_gl.TEXTURE31 = web_gl.RenderingContext.TEXTURE31;
  web_gl.TEXTURE4 = web_gl.RenderingContext.TEXTURE4;
  web_gl.TEXTURE5 = web_gl.RenderingContext.TEXTURE5;
  web_gl.TEXTURE6 = web_gl.RenderingContext.TEXTURE6;
  web_gl.TEXTURE7 = web_gl.RenderingContext.TEXTURE7;
  web_gl.TEXTURE8 = web_gl.RenderingContext.TEXTURE8;
  web_gl.TEXTURE9 = web_gl.RenderingContext.TEXTURE9;
  web_gl.TEXTURE_2D = web_gl.RenderingContext.TEXTURE_2D;
  web_gl.TEXTURE_BINDING_2D = web_gl.RenderingContext.TEXTURE_BINDING_2D;
  web_gl.TEXTURE_BINDING_CUBE_MAP = web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP;
  web_gl.TEXTURE_CUBE_MAP = web_gl.RenderingContext.TEXTURE_CUBE_MAP;
  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
  web_gl.TEXTURE_CUBE_MAP_POSITIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
  web_gl.TEXTURE_CUBE_MAP_POSITIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
  web_gl.TEXTURE_CUBE_MAP_POSITIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
  web_gl.TEXTURE_MAG_FILTER = web_gl.RenderingContext.TEXTURE_MAG_FILTER;
  web_gl.TEXTURE_MIN_FILTER = web_gl.RenderingContext.TEXTURE_MIN_FILTER;
  web_gl.TEXTURE_WRAP_S = web_gl.RenderingContext.TEXTURE_WRAP_S;
  web_gl.TEXTURE_WRAP_T = web_gl.RenderingContext.TEXTURE_WRAP_T;
  web_gl.TRIANGLES = web_gl.RenderingContext.TRIANGLES;
  web_gl.TRIANGLE_FAN = web_gl.RenderingContext.TRIANGLE_FAN;
  web_gl.TRIANGLE_STRIP = web_gl.RenderingContext.TRIANGLE_STRIP;
  web_gl.UNPACK_ALIGNMENT = web_gl.RenderingContext.UNPACK_ALIGNMENT;
  web_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL = web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
  web_gl.UNPACK_FLIP_Y_WEBGL = web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL;
  web_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
  web_gl.UNSIGNED_BYTE = web_gl.RenderingContext.UNSIGNED_BYTE;
  web_gl.UNSIGNED_INT = web_gl.RenderingContext.UNSIGNED_INT;
  web_gl.UNSIGNED_SHORT = web_gl.RenderingContext.UNSIGNED_SHORT;
  web_gl.UNSIGNED_SHORT_4_4_4_4 = web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4;
  web_gl.UNSIGNED_SHORT_5_5_5_1 = web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1;
  web_gl.UNSIGNED_SHORT_5_6_5 = web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5;
  web_gl.VALIDATE_STATUS = web_gl.RenderingContext.VALIDATE_STATUS;
  web_gl.VENDOR = web_gl.RenderingContext.VENDOR;
  web_gl.VERSION = web_gl.RenderingContext.VERSION;
  web_gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
  web_gl.VERTEX_ATTRIB_ARRAY_ENABLED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
  web_gl.VERTEX_ATTRIB_ARRAY_NORMALIZED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
  web_gl.VERTEX_ATTRIB_ARRAY_POINTER = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
  web_gl.VERTEX_ATTRIB_ARRAY_SIZE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
  web_gl.VERTEX_ATTRIB_ARRAY_STRIDE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
  web_gl.VERTEX_ATTRIB_ARRAY_TYPE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
  web_gl.VERTEX_SHADER = web_gl.RenderingContext.VERTEX_SHADER;
  web_gl.VIEWPORT = web_gl.RenderingContext.VIEWPORT;
  web_gl.ZERO = web_gl.RenderingContext.ZERO;
  dart.defineExtensionNames([
    'name',
    'size',
    'type'
  ]);
  web_gl.ActiveInfo = class ActiveInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.size]() {
      return this.size;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(web_gl.ActiveInfo, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ActiveInfo, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.size]: core.int,
      [dartx.type]: core.int
    })
  });
  dart.registerExtension(dart.global.WebGLActiveInfo, web_gl.ActiveInfo);
  dart.defineExtensionNames([
    'drawArraysInstancedAngle',
    'drawElementsInstancedAngle',
    'vertexAttribDivisorAngle'
  ]);
  web_gl.AngleInstancedArrays = class AngleInstancedArrays extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.drawArraysInstancedAngle](...args) {
      return this.drawArraysInstancedANGLE.apply(this, args);
    }
    [dartx.drawElementsInstancedAngle](...args) {
      return this.drawElementsInstancedANGLE.apply(this, args);
    }
    [dartx.vertexAttribDivisorAngle](...args) {
      return this.vertexAttribDivisorANGLE.apply(this, args);
    }
  };
  dart.setSignature(web_gl.AngleInstancedArrays, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.AngleInstancedArrays, [])}),
    methods: () => ({
      [dartx.drawArraysInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.drawElementsInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
      [dartx.vertexAttribDivisorAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int])
    }),
    sfields: () => ({VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: core.int})
  });
  web_gl.AngleInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 35070;
  dart.registerExtension(dart.global.ANGLEInstancedArrays, web_gl.AngleInstancedArrays);
  web_gl.Buffer = class Buffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Buffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Buffer, [])})
  });
  dart.registerExtension(dart.global.WebGLBuffer, web_gl.Buffer);
  web_gl.CompressedTextureAtc = class CompressedTextureAtc extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTextureAtc, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureAtc, [])}),
    sfields: () => ({
      COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: core.int,
      COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: core.int,
      COMPRESSED_RGB_ATC_WEBGL: core.int
    })
  });
  web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 35987;
  web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 34798;
  web_gl.CompressedTextureAtc.COMPRESSED_RGB_ATC_WEBGL = 35986;
  dart.registerExtension(dart.global.WebGLCompressedTextureATC, web_gl.CompressedTextureAtc);
  web_gl.CompressedTextureETC1 = class CompressedTextureETC1 extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTextureETC1, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureETC1, [])}),
    sfields: () => ({COMPRESSED_RGB_ETC1_WEBGL: core.int})
  });
  web_gl.CompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL = 36196;
  dart.registerExtension(dart.global.WebGLCompressedTextureETC1, web_gl.CompressedTextureETC1);
  web_gl.CompressedTexturePvrtc = class CompressedTexturePvrtc extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTexturePvrtc, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTexturePvrtc, [])}),
    sfields: () => ({
      COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: core.int,
      COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: core.int,
      COMPRESSED_RGB_PVRTC_2BPPV1_IMG: core.int,
      COMPRESSED_RGB_PVRTC_4BPPV1_IMG: core.int
    })
  });
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 35843;
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842;
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 35841;
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840;
  dart.registerExtension(dart.global.WebGLCompressedTexturePVRTC, web_gl.CompressedTexturePvrtc);
  web_gl.CompressedTextureS3TC = class CompressedTextureS3TC extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTextureS3TC, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureS3TC, [])}),
    sfields: () => ({
      COMPRESSED_RGBA_S3TC_DXT1_EXT: core.int,
      COMPRESSED_RGBA_S3TC_DXT3_EXT: core.int,
      COMPRESSED_RGBA_S3TC_DXT5_EXT: core.int,
      COMPRESSED_RGB_S3TC_DXT1_EXT: core.int
    })
  });
  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777;
  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778;
  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779;
  web_gl.CompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776;
  dart.registerExtension(dart.global.WebGLCompressedTextureS3TC, web_gl.CompressedTextureS3TC);
  dart.defineExtensionNames([
    'alpha',
    'antialias',
    'depth',
    'failIfMajorPerformanceCaveat',
    'premultipliedAlpha',
    'preserveDrawingBuffer',
    'stencil'
  ]);
  web_gl.ContextAttributes = class ContextAttributes extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.alpha]() {
      return this.alpha;
    }
    set [dartx.alpha](value) {
      this.alpha = value;
    }
    get [dartx.antialias]() {
      return this.antialias;
    }
    set [dartx.antialias](value) {
      this.antialias = value;
    }
    get [dartx.depth]() {
      return this.depth;
    }
    set [dartx.depth](value) {
      this.depth = value;
    }
    get [dartx.failIfMajorPerformanceCaveat]() {
      return this.failIfMajorPerformanceCaveat;
    }
    set [dartx.failIfMajorPerformanceCaveat](value) {
      this.failIfMajorPerformanceCaveat = value;
    }
    get [dartx.premultipliedAlpha]() {
      return this.premultipliedAlpha;
    }
    set [dartx.premultipliedAlpha](value) {
      this.premultipliedAlpha = value;
    }
    get [dartx.preserveDrawingBuffer]() {
      return this.preserveDrawingBuffer;
    }
    set [dartx.preserveDrawingBuffer](value) {
      this.preserveDrawingBuffer = value;
    }
    get [dartx.stencil]() {
      return this.stencil;
    }
    set [dartx.stencil](value) {
      this.stencil = value;
    }
  };
  dart.setSignature(web_gl.ContextAttributes, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextAttributes, [])}),
    fields: () => ({
      [dartx.alpha]: core.bool,
      [dartx.antialias]: core.bool,
      [dartx.depth]: core.bool,
      [dartx.failIfMajorPerformanceCaveat]: core.bool,
      [dartx.premultipliedAlpha]: core.bool,
      [dartx.preserveDrawingBuffer]: core.bool,
      [dartx.stencil]: core.bool
    })
  });
  dart.registerExtension(dart.global.WebGLContextAttributes, web_gl.ContextAttributes);
  dart.defineExtensionNames([
    'statusMessage'
  ]);
  web_gl.ContextEvent = class ContextEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.statusMessage]() {
      return this.statusMessage;
    }
  };
  dart.setSignature(web_gl.ContextEvent, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextEvent, [])}),
    fields: () => ({[dartx.statusMessage]: core.String})
  });
  dart.registerExtension(dart.global.WebGLContextEvent, web_gl.ContextEvent);
  web_gl.DebugRendererInfo = class DebugRendererInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.DebugRendererInfo, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugRendererInfo, [])}),
    sfields: () => ({
      UNMASKED_RENDERER_WEBGL: core.int,
      UNMASKED_VENDOR_WEBGL: core.int
    })
  });
  web_gl.DebugRendererInfo.UNMASKED_RENDERER_WEBGL = 37446;
  web_gl.DebugRendererInfo.UNMASKED_VENDOR_WEBGL = 37445;
  dart.registerExtension(dart.global.WebGLDebugRendererInfo, web_gl.DebugRendererInfo);
  dart.defineExtensionNames([
    'getTranslatedShaderSource'
  ]);
  web_gl.DebugShaders = class DebugShaders extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getTranslatedShaderSource](...args) {
      return this.getTranslatedShaderSource.apply(this, args);
    }
  };
  dart.setSignature(web_gl.DebugShaders, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugShaders, [])}),
    methods: () => ({[dartx.getTranslatedShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader])})
  });
  dart.registerExtension(dart.global.WebGLDebugShaders, web_gl.DebugShaders);
  web_gl.DepthTexture = class DepthTexture extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.DepthTexture, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DepthTexture, [])}),
    sfields: () => ({UNSIGNED_INT_24_8_WEBGL: core.int})
  });
  web_gl.DepthTexture.UNSIGNED_INT_24_8_WEBGL = 34042;
  dart.registerExtension(dart.global.WebGLDepthTexture, web_gl.DepthTexture);
  dart.defineExtensionNames([
    'drawBuffersWebgl'
  ]);
  web_gl.DrawBuffers = class DrawBuffers extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.drawBuffersWebgl](...args) {
      return this.drawBuffersWEBGL.apply(this, args);
    }
  };
  dart.setSignature(web_gl.DrawBuffers, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DrawBuffers, [])}),
    methods: () => ({[dartx.drawBuffersWebgl]: dart.definiteFunctionType(dart.void, [ListOfint()])}),
    sfields: () => ({
      COLOR_ATTACHMENT0_WEBGL: core.int,
      COLOR_ATTACHMENT10_WEBGL: core.int,
      COLOR_ATTACHMENT11_WEBGL: core.int,
      COLOR_ATTACHMENT12_WEBGL: core.int,
      COLOR_ATTACHMENT13_WEBGL: core.int,
      COLOR_ATTACHMENT14_WEBGL: core.int,
      COLOR_ATTACHMENT15_WEBGL: core.int,
      COLOR_ATTACHMENT1_WEBGL: core.int,
      COLOR_ATTACHMENT2_WEBGL: core.int,
      COLOR_ATTACHMENT3_WEBGL: core.int,
      COLOR_ATTACHMENT4_WEBGL: core.int,
      COLOR_ATTACHMENT5_WEBGL: core.int,
      COLOR_ATTACHMENT6_WEBGL: core.int,
      COLOR_ATTACHMENT7_WEBGL: core.int,
      COLOR_ATTACHMENT8_WEBGL: core.int,
      COLOR_ATTACHMENT9_WEBGL: core.int,
      DRAW_BUFFER0_WEBGL: core.int,
      DRAW_BUFFER10_WEBGL: core.int,
      DRAW_BUFFER11_WEBGL: core.int,
      DRAW_BUFFER12_WEBGL: core.int,
      DRAW_BUFFER13_WEBGL: core.int,
      DRAW_BUFFER14_WEBGL: core.int,
      DRAW_BUFFER15_WEBGL: core.int,
      DRAW_BUFFER1_WEBGL: core.int,
      DRAW_BUFFER2_WEBGL: core.int,
      DRAW_BUFFER3_WEBGL: core.int,
      DRAW_BUFFER4_WEBGL: core.int,
      DRAW_BUFFER5_WEBGL: core.int,
      DRAW_BUFFER6_WEBGL: core.int,
      DRAW_BUFFER7_WEBGL: core.int,
      DRAW_BUFFER8_WEBGL: core.int,
      DRAW_BUFFER9_WEBGL: core.int,
      MAX_COLOR_ATTACHMENTS_WEBGL: core.int,
      MAX_DRAW_BUFFERS_WEBGL: core.int
    })
  });
  web_gl.DrawBuffers.COLOR_ATTACHMENT0_WEBGL = 36064;
  web_gl.DrawBuffers.COLOR_ATTACHMENT10_WEBGL = 36074;
  web_gl.DrawBuffers.COLOR_ATTACHMENT11_WEBGL = 36075;
  web_gl.DrawBuffers.COLOR_ATTACHMENT12_WEBGL = 36076;
  web_gl.DrawBuffers.COLOR_ATTACHMENT13_WEBGL = 36077;
  web_gl.DrawBuffers.COLOR_ATTACHMENT14_WEBGL = 36078;
  web_gl.DrawBuffers.COLOR_ATTACHMENT15_WEBGL = 36079;
  web_gl.DrawBuffers.COLOR_ATTACHMENT1_WEBGL = 36065;
  web_gl.DrawBuffers.COLOR_ATTACHMENT2_WEBGL = 36066;
  web_gl.DrawBuffers.COLOR_ATTACHMENT3_WEBGL = 36067;
  web_gl.DrawBuffers.COLOR_ATTACHMENT4_WEBGL = 36068;
  web_gl.DrawBuffers.COLOR_ATTACHMENT5_WEBGL = 36069;
  web_gl.DrawBuffers.COLOR_ATTACHMENT6_WEBGL = 36070;
  web_gl.DrawBuffers.COLOR_ATTACHMENT7_WEBGL = 36071;
  web_gl.DrawBuffers.COLOR_ATTACHMENT8_WEBGL = 36072;
  web_gl.DrawBuffers.COLOR_ATTACHMENT9_WEBGL = 36073;
  web_gl.DrawBuffers.DRAW_BUFFER0_WEBGL = 34853;
  web_gl.DrawBuffers.DRAW_BUFFER10_WEBGL = 34863;
  web_gl.DrawBuffers.DRAW_BUFFER11_WEBGL = 34864;
  web_gl.DrawBuffers.DRAW_BUFFER12_WEBGL = 34865;
  web_gl.DrawBuffers.DRAW_BUFFER13_WEBGL = 34866;
  web_gl.DrawBuffers.DRAW_BUFFER14_WEBGL = 34867;
  web_gl.DrawBuffers.DRAW_BUFFER15_WEBGL = 34868;
  web_gl.DrawBuffers.DRAW_BUFFER1_WEBGL = 34854;
  web_gl.DrawBuffers.DRAW_BUFFER2_WEBGL = 34855;
  web_gl.DrawBuffers.DRAW_BUFFER3_WEBGL = 34856;
  web_gl.DrawBuffers.DRAW_BUFFER4_WEBGL = 34857;
  web_gl.DrawBuffers.DRAW_BUFFER5_WEBGL = 34858;
  web_gl.DrawBuffers.DRAW_BUFFER6_WEBGL = 34859;
  web_gl.DrawBuffers.DRAW_BUFFER7_WEBGL = 34860;
  web_gl.DrawBuffers.DRAW_BUFFER8_WEBGL = 34861;
  web_gl.DrawBuffers.DRAW_BUFFER9_WEBGL = 34862;
  web_gl.DrawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL = 36063;
  web_gl.DrawBuffers.MAX_DRAW_BUFFERS_WEBGL = 34852;
  dart.registerExtension(dart.global.WebGLDrawBuffers, web_gl.DrawBuffers);
  web_gl.ExtBlendMinMax = class ExtBlendMinMax extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtBlendMinMax, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtBlendMinMax, [])}),
    sfields: () => ({
      MAX_EXT: core.int,
      MIN_EXT: core.int
    })
  });
  web_gl.ExtBlendMinMax.MAX_EXT = 32776;
  web_gl.ExtBlendMinMax.MIN_EXT = 32775;
  dart.registerExtension(dart.global.EXTBlendMinMax, web_gl.ExtBlendMinMax);
  web_gl.ExtFragDepth = class ExtFragDepth extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtFragDepth, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtFragDepth, [])})
  });
  dart.registerExtension(dart.global.EXTFragDepth, web_gl.ExtFragDepth);
  web_gl.ExtShaderTextureLod = class ExtShaderTextureLod extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtShaderTextureLod, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtShaderTextureLod, [])})
  });
  dart.registerExtension(dart.global.EXTShaderTextureLOD, web_gl.ExtShaderTextureLod);
  web_gl.ExtTextureFilterAnisotropic = class ExtTextureFilterAnisotropic extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtTextureFilterAnisotropic, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtTextureFilterAnisotropic, [])}),
    sfields: () => ({
      MAX_TEXTURE_MAX_ANISOTROPY_EXT: core.int,
      TEXTURE_MAX_ANISOTROPY_EXT: core.int
    })
  });
  web_gl.ExtTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047;
  web_gl.ExtTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT = 34046;
  dart.registerExtension(dart.global.EXTTextureFilterAnisotropic, web_gl.ExtTextureFilterAnisotropic);
  web_gl.Framebuffer = class Framebuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Framebuffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Framebuffer, [])})
  });
  dart.registerExtension(dart.global.WebGLFramebuffer, web_gl.Framebuffer);
  dart.defineExtensionNames([
    'loseContext',
    'restoreContext'
  ]);
  web_gl.LoseContext = class LoseContext extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.loseContext](...args) {
      return this.loseContext.apply(this, args);
    }
    [dartx.restoreContext](...args) {
      return this.restoreContext.apply(this, args);
    }
  };
  dart.setSignature(web_gl.LoseContext, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.LoseContext, [])}),
    methods: () => ({
      [dartx.loseContext]: dart.definiteFunctionType(dart.void, []),
      [dartx.restoreContext]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.WebGLLoseContext, web_gl.LoseContext);
  dart.registerExtension(dart.global.WebGLExtensionLoseContext, web_gl.LoseContext);
  web_gl.OesElementIndexUint = class OesElementIndexUint extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesElementIndexUint, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesElementIndexUint, [])})
  });
  dart.registerExtension(dart.global.OESElementIndexUint, web_gl.OesElementIndexUint);
  web_gl.OesStandardDerivatives = class OesStandardDerivatives extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesStandardDerivatives, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesStandardDerivatives, [])}),
    sfields: () => ({FRAGMENT_SHADER_DERIVATIVE_HINT_OES: core.int})
  });
  web_gl.OesStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723;
  dart.registerExtension(dart.global.OESStandardDerivatives, web_gl.OesStandardDerivatives);
  web_gl.OesTextureFloat = class OesTextureFloat extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureFloat, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloat, [])})
  });
  dart.registerExtension(dart.global.OESTextureFloat, web_gl.OesTextureFloat);
  web_gl.OesTextureFloatLinear = class OesTextureFloatLinear extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureFloatLinear, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloatLinear, [])})
  });
  dart.registerExtension(dart.global.OESTextureFloatLinear, web_gl.OesTextureFloatLinear);
  web_gl.OesTextureHalfFloatLinear = class OesTextureHalfFloatLinear extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureHalfFloatLinear, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloatLinear, [])})
  });
  dart.registerExtension(dart.global.OESTextureHalfFloatLinear, web_gl.OesTextureHalfFloatLinear);
  dart.defineExtensionNames([
    'bindVertexArray',
    'createVertexArray',
    'deleteVertexArray',
    'isVertexArray'
  ]);
  web_gl.OesVertexArrayObject = class OesVertexArrayObject extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.bindVertexArray](...args) {
      return this.bindVertexArrayOES.apply(this, args);
    }
    [dartx.createVertexArray](...args) {
      return this.createVertexArrayOES.apply(this, args);
    }
    [dartx.deleteVertexArray](...args) {
      return this.deleteVertexArrayOES.apply(this, args);
    }
    [dartx.isVertexArray](...args) {
      return this.isVertexArrayOES.apply(this, args);
    }
  };
  dart.setSignature(web_gl.OesVertexArrayObject, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesVertexArrayObject, [])}),
    methods: () => ({
      [dartx.bindVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
      [dartx.createVertexArray]: dart.definiteFunctionType(web_gl.VertexArrayObject, []),
      [dartx.deleteVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
      [dartx.isVertexArray]: dart.definiteFunctionType(core.bool, [web_gl.VertexArrayObject])
    }),
    sfields: () => ({VERTEX_ARRAY_BINDING_OES: core.int})
  });
  web_gl.OesVertexArrayObject.VERTEX_ARRAY_BINDING_OES = 34229;
  dart.registerExtension(dart.global.OESVertexArrayObject, web_gl.OesVertexArrayObject);
  web_gl.Program = class Program extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Program, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Program, [])})
  });
  dart.registerExtension(dart.global.WebGLProgram, web_gl.Program);
  web_gl.Renderbuffer = class Renderbuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Renderbuffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Renderbuffer, [])})
  });
  dart.registerExtension(dart.global.WebGLRenderbuffer, web_gl.Renderbuffer);
  web_gl.Shader = class Shader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Shader, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Shader, [])})
  });
  dart.registerExtension(dart.global.WebGLShader, web_gl.Shader);
  dart.defineExtensionNames([
    'precision',
    'rangeMax',
    'rangeMin'
  ]);
  web_gl.ShaderPrecisionFormat = class ShaderPrecisionFormat extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.precision]() {
      return this.precision;
    }
    get [dartx.rangeMax]() {
      return this.rangeMax;
    }
    get [dartx.rangeMin]() {
      return this.rangeMin;
    }
  };
  dart.setSignature(web_gl.ShaderPrecisionFormat, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [])}),
    fields: () => ({
      [dartx.precision]: core.int,
      [dartx.rangeMax]: core.int,
      [dartx.rangeMin]: core.int
    })
  });
  dart.registerExtension(dart.global.WebGLShaderPrecisionFormat, web_gl.ShaderPrecisionFormat);
  web_gl.Texture = class Texture extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Texture, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Texture, [])})
  });
  dart.registerExtension(dart.global.WebGLTexture, web_gl.Texture);
  web_gl.UniformLocation = class UniformLocation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.UniformLocation, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.UniformLocation, [])})
  });
  dart.registerExtension(dart.global.WebGLUniformLocation, web_gl.UniformLocation);
  web_gl.VertexArrayObject = class VertexArrayObject extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.VertexArrayObject, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.VertexArrayObject, [])})
  });
  dart.registerExtension(dart.global.WebGLVertexArrayObjectOES, web_gl.VertexArrayObject);
  web_gl._WebGLRenderingContextBase = class _WebGLRenderingContextBase extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl._WebGLRenderingContextBase, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl._WebGLRenderingContextBase, [])})
  });
  web_sql.SqlStatementCallback = dart.typedef('SqlStatementCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlResultSet]));
  web_sql.SqlStatementErrorCallback = dart.typedef('SqlStatementErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlError]));
  web_sql.SqlTransactionCallback = dart.typedef('SqlTransactionCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction]));
  web_sql.SqlTransactionErrorCallback = dart.typedef('SqlTransactionErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlError]));
  dart.defineExtensionNames([
    'changeVersion',
    'readTransaction',
    'transaction',
    'version'
  ]);
  web_sql.SqlDatabase = class SqlDatabase extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.openDatabase;
    }
    get [dartx.version]() {
      return this.version;
    }
    [dartx.changeVersion](...args) {
      return this.changeVersion.apply(this, args);
    }
    [dartx.readTransaction](...args) {
      return this.readTransaction.apply(this, args);
    }
    [dartx.transaction](...args) {
      return this.transaction.apply(this, args);
    }
  };
  dart.setSignature(web_sql.SqlDatabase, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlDatabase, [])}),
    fields: () => ({[dartx.version]: core.String}),
    methods: () => ({
      [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
      [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
      [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.Database, web_sql.SqlDatabase);
  dart.defineExtensionNames([
    'code',
    'message'
  ]);
  web_sql.SqlError = class SqlError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(web_sql.SqlError, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlError, [])}),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.message]: core.String
    }),
    sfields: () => ({
      CONSTRAINT_ERR: core.int,
      DATABASE_ERR: core.int,
      QUOTA_ERR: core.int,
      SYNTAX_ERR: core.int,
      TIMEOUT_ERR: core.int,
      TOO_LARGE_ERR: core.int,
      UNKNOWN_ERR: core.int,
      VERSION_ERR: core.int
    })
  });
  web_sql.SqlError.CONSTRAINT_ERR = 6;
  web_sql.SqlError.DATABASE_ERR = 1;
  web_sql.SqlError.QUOTA_ERR = 4;
  web_sql.SqlError.SYNTAX_ERR = 5;
  web_sql.SqlError.TIMEOUT_ERR = 7;
  web_sql.SqlError.TOO_LARGE_ERR = 3;
  web_sql.SqlError.UNKNOWN_ERR = 0;
  web_sql.SqlError.VERSION_ERR = 2;
  dart.registerExtension(dart.global.SQLError, web_sql.SqlError);
  dart.defineExtensionNames([
    'insertId',
    'rows',
    'rowsAffected'
  ]);
  web_sql.SqlResultSet = class SqlResultSet extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.insertId]() {
      return this.insertId;
    }
    get [dartx.rows]() {
      return this.rows;
    }
    get [dartx.rowsAffected]() {
      return this.rowsAffected;
    }
  };
  dart.setSignature(web_sql.SqlResultSet, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSet, [])}),
    fields: () => ({
      [dartx.insertId]: core.int,
      [dartx.rows]: web_sql.SqlResultSetRowList,
      [dartx.rowsAffected]: core.int
    })
  });
  dart.registerExtension(dart.global.SQLResultSet, web_sql.SqlResultSet);
  const _item_1 = Symbol('_item_1');
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html$.ImmutableListMixin$(core.Map)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.item](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](index) {
      return html_common.convertNativeToDart_Dictionary(this[_item_1](index));
    }
    [_item_1](...args) {
      return this.item.apply(this, args);
    }
  };
  web_sql.SqlResultSetRowList[dart.implements] = () => [ListOfMap()];
  dart.setSignature(web_sql.SqlResultSetRowList, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSetRowList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(core.Map, []),
      [dartx.last]: dart.definiteFunctionType(core.Map, []),
      [dartx.single]: dart.definiteFunctionType(core.Map, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.Map, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.Map]),
      [dartx.elementAt]: dart.definiteFunctionType(core.Map, [core.int]),
      [dartx.item]: dart.definiteFunctionType(core.Map, [core.int]),
      [_item_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.SQLResultSetRowList, web_sql.SqlResultSetRowList);
  dart.defineExtensionNames([
    'executeSql'
  ]);
  web_sql.SqlTransaction = class SqlTransaction extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.executeSql](...args) {
      return this.executeSql.apply(this, args);
    }
  };
  dart.setSignature(web_sql.SqlTransaction, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlTransaction, [])}),
    methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
  });
  dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
  // Exports:
  exports.dart = dart;
  exports.dartx = dartx;
  exports._debugger = _debugger;
  exports._foreign_helper = _foreign_helper;
  exports._interceptors = _interceptors;
  exports._internal = _internal;
  exports._isolate_helper = _isolate_helper;
  exports._js_embedded_names = _js_embedded_names;
  exports._js_helper = _js_helper;
  exports._js_mirrors = _js_mirrors;
  exports._js_primitives = _js_primitives;
  exports._metadata = _metadata;
  exports._native_typed_data = _native_typed_data;
  exports.async = async;
  exports.collection = collection;
  exports.convert = convert;
  exports.core = core;
  exports.developer = developer;
  exports.io = io;
  exports.isolate = isolate;
  exports.js = js;
  exports.js_util = js_util;
  exports.math = math;
  exports.mirrors = mirrors;
  exports.typed_data = typed_data;
  exports.indexed_db = indexed_db;
  exports.html = html$;
  exports.html_common = html_common;
  exports.svg = svg$;
  exports.web_audio = web_audio;
  exports.web_gl = web_gl;
  exports.web_sql = web_sql;
});
