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 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 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 FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
  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 ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
  let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
  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 ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(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 FnTodynamic = () => (FnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTovoid()])))();
  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 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 dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
  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 dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
  let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
  let dynamic__Todynamic$ = () => (dynamic__Todynamic$ = 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 dart.dload(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});
  };
  const _jsTypeCallback = Symbol('_jsTypeCallback');
  const _rawJSType = Symbol('_rawJSType');
  dart._isInstanceOfLazyJSType = function(o, t) {
    if (t[_jsTypeCallback] != null) {
      return dart.is(o, t[_rawJSType]);
    }
    if (o == null) return false;
    return dart._isJSObject(o);
  };
  dart._asInstanceOfLazyJSType = function(o, t) {
    if (t[_jsTypeCallback] != null) {
      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._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() {
    debugger;
    dart.throw(new core.AssertionError());
  };
  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) {
    if (!condition) dart.throwAssertionError();
  };
  dart.throw = function(obj) {
    if (obj != null && (typeof obj == 'object' || typeof obj == 'function')) {
      dart._stack.set(obj, new Error());
    }
    throw obj;
  };
  dart.getError = function(exception) {
    var stack = dart._stack.get(exception);
    return stack !== void 0 ? 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';
    }
  };
  const _dartName = Symbol('_dartName');
  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 = new WeakMap();
  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');
  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 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) {
        collection.ListMixin._filter(this, test, false);
      }
      retainWhere(test) {
        collection.ListMixin._filter(this, test, true);
      }
      static _filter(source, test, retainMatching) {
        let retained = [];
        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()]),
        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()])
      }),
      statics: () => ({_filter: dart.definiteFunctionType(dart.void, [core.List, dynamicTobool(), core.bool])}),
      names: ['_filter']
    });
    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);
      self.onmessage = func;
      self.dartPrint = self.dartPrint || (function(serialize) {
        return function(object) {
          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 (self.console && self.console.error) {
          self.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) {
      self.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] = self.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] = self.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])) {
          self.clearTimeout(this[_handle]);
        } else {
          self.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 self.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})
  });
  _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();
  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.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._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;
        dart.dcall(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, [dart.dynamic]),
        [_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) {
      dart.dcall(async._AsyncRun._scheduleImmediateClosure, callback);
    }
    static _initializeScheduleImmediate() {
      if (self.scheduleImmediate != null) {
        return async._AsyncRun._scheduleImmediateJsOverride;
      }
      if (self.MutationObserver != null && self.document != null) {
        let div = self.document.createElement("div");
        let span = self.document.createElement("span");
        let storedCallback = null;
        function internalCallback(_) {
          _isolate_helper.leaveJsAsync();
          let f = storedCallback;
          storedCallback = null;
          dart.dcall(f);
        }
        dart.fn(internalCallback, dynamicTodynamic$());
        ;
        let observer = new self.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);
        }, FnTodynamic());
      } else if (self.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();
      self.scheduleImmediate(internalCallback);
    }
    static _scheduleImmediateWithSetImmediate(callback) {
      function internalCallback() {
        _isolate_helper.leaveJsAsync();
        callback();
      }
      dart.fn(internalCallback, VoidTodynamic$());
      ;
      _isolate_helper.enterJsAsync();
      self.setImmediate(internalCallback);
    }
    static _scheduleImmediateWithTimer(callback) {
      async.Timer._createTimer(core.Duration.ZERO, callback);
    }
  };
  dart.setSignature(async._AsyncRun, {
    sfields: () => ({_scheduleImmediateClosure: core.Function}),
    statics: () => ({
      _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _initializeScheduleImmediate: dart.definiteFunctionType(core.Function, []),
      _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);
        }, VoidTodynamic$()));
        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');
  const _filter = Symbol('_filter');
  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;
    }
  };
  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());
  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 (!(fn instanceof 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 || o instanceof ImageData || o instanceof Node || window.TypedData && o instanceof TypedData || 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._putIfAbsent(js._dartProxies, o, js._wrapToDart);
    }
  };
  dart.fn(js._convertToDart, dynamicToObject());
  js._wrapToDart = 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._wrapToDart, 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$ = Symbol('_buffer');
  const _getRandomBytes = Symbol('_getRandomBytes');
  math._JSSecureRandom = class _JSSecureRandom extends core.Object {
    new() {
      this[_buffer$] = 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$][dartx.buffer][dartx.asUint8List](start, length));
    }
    nextBool() {
      this[_getRandomBytes](0, 1);
      return this[_buffer$][dartx.getUint8](0)[dartx.isOdd];
    }
    nextDouble() {
      this[_getRandomBytes](1, 7);
      this[_buffer$][dartx.setUint8](0, 63);
      let highByte = this[_buffer$][dartx.getUint8](1);
      this[_buffer$][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
      let result = dart.notNull(this[_buffer$][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$][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$][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$]: 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$52;
  math.Random = class Random extends core.Object {
    static new(seed) {
      if (seed === void 0) seed = null;
      return seed == null ? const$52 || (const$52 = 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$2 = 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$2](value, key);
        } else {
          request = this[_add$2](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$2](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$2]: 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 Blob(parts);
    }
    static _create_2(parts, bag) {
      return new 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$0 = 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$0];
    }
    set [dartx.position](value) {
      this[_position$0] = value == null ? '' : value;
    }
    get [_position$0]() {
      return this.position;
    }
    set [_position$0](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$0]: 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$ = 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$]() {
      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$]: 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$ = 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$](test, false);
    }
    retainWhere(test) {
      this[_filter$](test, true);
    }
    [_filter$](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$]: 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$1 = Symbol('_value');
  html$.ScrollAlignment = class ScrollAlignment extends core.Object {
    _internal(value) {
      this[_value$1] = value;
    }
    toString() {
      return dart.str`ScrollAlignment.${this[_value$1]}`;
    }
  };
  dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
  dart.setSignature(html$.ScrollAlignment, {
    constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
    fields: () => ({[_value$1]: 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$];
    }
    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$](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$](test, true);
    }
    retainWhere(test) {
      this[_filter$](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$]: 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$2 = 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$2];
    }
    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$2]() {
      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$2]: 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$1] = value;
      this[_unit] = '%';
    }
    px(value) {
      this[_value$1] = value;
      this[_unit] = 'px';
    }
    pc(value) {
      this[_value$1] = value;
      this[_unit] = 'pc';
    }
    pt(value) {
      this[_value$1] = value;
      this[_unit] = 'pt';
    }
    inch(value) {
      this[_value$1] = value;
      this[_unit] = 'in';
    }
    cm(value) {
      this[_value$1] = value;
      this[_unit] = 'cm';
    }
    mm(value) {
      this[_value$1] = value;
      this[_unit] = 'mm';
    }
    em(value) {
      this[_value$1] = value;
      this[_unit] = 'em';
    }
    ex(value) {
      this[_value$1] = value;
      this[_unit] = 'ex';
    }
    css(cssValue) {
      this[_value$1] = 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$1] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
      } else {
        this[_value$1] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
      }
    }
    toString() {
      return dart.str`${this[_value$1]}${this[_unit]}`;
    }
    get value() {
      return this[_value$1];
    }
  };
  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$1]: 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$ = 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$] = 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$], this[_eventType], onData, this[_useCapture]);
      }
    }
    dart.setSignature(_EventStream, {
      constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
      fields: () => ({
        [_target$]: 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$], 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$ = Symbol('_onData');
  const _pauseCount$ = 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$] = target;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        this[_onData$] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(onData));
        this[_pauseCount$] = 0;
        this[_tryResume]();
      }
      cancel() {
        if (dart.test(this[_canceled])) return null;
        this[_unlisten]();
        this[_target$] = null;
        this[_onData$] = null;
        return null;
      }
      get [_canceled]() {
        return this[_target$] == null;
      }
      onData(handleData) {
        if (dart.test(this[_canceled])) {
          dart.throw(new core.StateError("Subscription has been canceled."));
        }
        this[_unlisten]();
        this[_onData$] = 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$] = dart.notNull(this[_pauseCount$]) + 1;
        this[_unlisten]();
        if (resumeSignal != null) {
          resumeSignal.whenComplete(dart.bind(this, 'resume'));
        }
      }
      get isPaused() {
        return dart.notNull(this[_pauseCount$]) > 0;
      }
      resume() {
        if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
        this[_tryResume]();
      }
      [_tryResume]() {
        if (this[_onData$] != null && !dart.test(this.isPaused)) {
          this[_target$][dartx.addEventListener](this[_eventType], this[_onData$], this[_useCapture]);
        }
      }
      [_unlisten]() {
        if (this[_onData$] != null) {
          this[_target$][dartx.removeEventListener](this[_eventType], this[_onData$], 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$]: core.int,
        [_target$]: html$.EventTarget,
        [_eventType]: core.String,
        [_onData$]: 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$0 = 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$0] = null;
        this[_controller$0] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
      }
      get stream() {
        return this[_controller$0].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$0], 'add'), {onError: dart.bind(this[_controller$0], '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$0].close();
      }
    }
    dart.addTypeTests(_StreamPool);
    dart.defineNamedConstructor(_StreamPool, 'broadcast');
    dart.setSignature(_StreamPool, {
      constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
      fields: () => ({
        [_controller$0]: 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$ = 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$];
    }
    new(type) {
      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
      this[_type] = type;
      this[_stream$] = new html$._CustomKeyEventStreamImpl('event');
      this[_target$] = null;
      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
    }
    initializeAllEventListeners(type, target) {
      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
      this[_type] = type;
      this[_target$] = target;
      this[_stream$] = null;
      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
      html$.Element.keyDownEvent.forTarget(this[_target$], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
      html$.Element.keyPressEvent.forTarget(this[_target$], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
      html$.Element.keyUpEvent.forTarget(this[_target$], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
      this[_stream$] = 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$].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$].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$].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$]: html$.EventTarget,
      [_stream$]: 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$53;
  let const$54;
  let const$55;
  let const$56;
  let const$57;
  let const$58;
  let const$59;
  let const$60;
  let const$61;
  let const$62;
  html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
    static allowNavigation(uriPolicy) {
      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$53 || (const$53 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$54 || (const$54 = 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$55 || (const$55 = dart.constList(['A::href', 'FORM::action'], core.String))});
    }
    static allowImages(uriPolicy) {
      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$56 || (const$56 = dart.constList(['IMG'], core.String)), allowedAttributes: const$57 || (const$57 = 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$58 || (const$58 = dart.constList(['IMG::src'], core.String))});
    }
    static allowTextElements() {
      return new html$._SimpleNodeValidator(null, {allowedElements: const$59 || (const$59 = 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$60 || (const$60 = dart.constList([], core.String))));
      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$61 || (const$61 = dart.constList([], core.String));
      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$62 || (const$62 = 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$0] = -1;
        this[_length$2] = array[dartx.length];
        this[_current$4] = null;
      }
      moveNext() {
        let nextPosition = dart.notNull(this[_position$0]) + 1;
        if (nextPosition < dart.notNull(this[_length$2])) {
          this[_current$4] = this[_array][dartx._get](nextPosition);
          this[_position$0] = nextPosition;
          return true;
        }
        this[_current$4] = null;
        this[_position$0] = this[_length$2];
        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$2]: core.int,
        [_position$0]: 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$0] = -1;
        this[_current$4] = null;
      }
      moveNext() {
        let nextPosition = dart.notNull(this[_position$0]) + 1;
        if (nextPosition < dart.notNull(this[_array][dartx.length])) {
          this[_current$4] = this[_array][dartx._get](nextPosition);
          this[_position$0] = nextPosition;
          return true;
        }
        this[_current$4] = null;
        this[_position$0] = 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$0]: 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$());
  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.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;
});
