// Generated by dart2js (NullSafetyMode.sound, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.2.5.
// The code supports the following hooks:
// dartPrint(message):
//    if this function is defined it is called instead of the Dart [print]
//    method.
//
// dartMainRunner(main, args):
//    if this function is defined, the Dart [main] method will not be invoked
//    directly. Instead, a closure that will invoke [main], and its arguments
//    [args] is passed to [dartMainRunner].
//
// dartDeferredLibraryLoader(uri, successCallback, errorCallback, loadId, loadPriority):
//    if this function is defined, it will be called when a deferred library
//    is loaded. It should load and eval the javascript of `uri`, and call
//    successCallback. If it fails to do so, it should call errorCallback with
//    an error. The loadId argument is the deferred import that resulted in
//    this uri being loaded. The loadPriority argument is the priority the
//    library should be loaded with as specified in the code via the
//    load-priority annotation (0: normal, 1: high).
//
// dartCallInstrumentation(id, qualifiedName):
//    if this function is defined, it will be called at each entry of a
//    method or constructor. Used only when compiling programs with
//    --experiment-call-instrumentation.
(function dartProgram() {
  function copyProperties(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      to[key] = from[key];
    }
  }
  function mixinPropertiesHard(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (!to.hasOwnProperty(key))
        to[key] = from[key];
    }
  }
  function mixinPropertiesEasy(from, to) {
    Object.assign(to, from);
  }
  var supportsDirectProtoAccess = function() {
    var cls = function() {
    };
    cls.prototype = {p: {}};
    var object = new cls();
    if (!(Object.getPrototypeOf(object) && Object.getPrototypeOf(object).p === cls.prototype.p))
      return false;
    try {
      if (typeof navigator != "undefined" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Chrome/") >= 0)
        return true;
      if (typeof version == "function" && version.length == 0) {
        var v = version();
        if (/^\d+\.\d+\.\d+\.\d+$/.test(v))
          return true;
      }
    } catch (_) {
    }
    return false;
  }();
  function inherit(cls, sup) {
    cls.prototype.constructor = cls;
    cls.prototype["$is" + cls.name] = cls;
    if (sup != null) {
      if (supportsDirectProtoAccess) {
        Object.setPrototypeOf(cls.prototype, sup.prototype);
        return;
      }
      var clsPrototype = Object.create(sup.prototype);
      copyProperties(cls.prototype, clsPrototype);
      cls.prototype = clsPrototype;
    }
  }
  function inheritMany(sup, classes) {
    for (var i = 0; i < classes.length; i++)
      inherit(classes[i], sup);
  }
  function mixinEasy(cls, mixin) {
    mixinPropertiesEasy(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function mixinHard(cls, mixin) {
    mixinPropertiesHard(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function lazyOld(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      holder[getterName] = function() {
        A.throwCyclicInit(name);
      };
      var result;
      var sentinelInProgress = initializer;
      try {
        if (holder[name] === uninitializedSentinel) {
          result = holder[name] = sentinelInProgress;
          result = holder[name] = initializer();
        } else
          result = holder[name];
      } finally {
        if (result === sentinelInProgress)
          holder[name] = null;
        holder[getterName] = function() {
          return this[name];
        };
      }
      return result;
    };
  }
  function lazy(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel)
        holder[name] = initializer();
      holder[getterName] = function() {
        return this[name];
      };
      return holder[name];
    };
  }
  function lazyFinal(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel) {
        var value = initializer();
        if (holder[name] !== uninitializedSentinel)
          A.throwLateFieldADI(name);
        holder[name] = value;
      }
      var finalValue = holder[name];
      holder[getterName] = function() {
        return finalValue;
      };
      return finalValue;
    };
  }
  function makeConstList(list) {
    list.immutable$list = Array;
    list.fixed$length = Array;
    return list;
  }
  function convertToFastObject(properties) {
    function t() {
    }
    t.prototype = properties;
    new t();
    return properties;
  }
  function convertAllToFastObject(arrayOfObjects) {
    for (var i = 0; i < arrayOfObjects.length; ++i)
      convertToFastObject(arrayOfObjects[i]);
  }
  var functionCounter = 0;
  function instanceTearOffGetter(isIntercepted, parameters) {
    var cache = null;
    return isIntercepted ? function(receiver) {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(receiver, this);
    } : function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(this, null);
    };
  }
  function staticTearOffGetter(parameters) {
    var cache = null;
    return function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters).prototype;
      return cache;
    };
  }
  var typesOffset = 0;
  function tearOffParameters(container, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    if (typeof funType == "number")
      funType += typesOffset;
    return {co: container, iS: isStatic, iI: isIntercepted, rC: requiredParameterCount, dV: optionalParameterDefaultValues, cs: callNames, fs: funsOrNames, fT: funType, aI: applyIndex || 0, nDA: needsDirectAccess};
  }
  function installStaticTearOff(holder, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    var parameters = tearOffParameters(holder, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, false);
    var getterFunction = staticTearOffGetter(parameters);
    holder[getterName] = getterFunction;
  }
  function installInstanceTearOff(prototype, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    isIntercepted = !!isIntercepted;
    var parameters = tearOffParameters(prototype, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, !!needsDirectAccess);
    var getterFunction = instanceTearOffGetter(isIntercepted, parameters);
    prototype[getterName] = getterFunction;
  }
  function setOrUpdateInterceptorsByTag(newTags) {
    var tags = init.interceptorsByTag;
    if (!tags) {
      init.interceptorsByTag = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function setOrUpdateLeafTags(newTags) {
    var tags = init.leafTags;
    if (!tags) {
      init.leafTags = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function updateTypes(newTypes) {
    var types = init.types;
    var length = types.length;
    types.push.apply(types, newTypes);
    return length;
  }
  function updateHolder(holder, newHolder) {
    copyProperties(newHolder, holder);
    return holder;
  }
  var hunkHelpers = function() {
    var mkInstance = function(isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex, false);
        };
      },
      mkStatic = function(requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
        };
      };
    return {inherit: inherit, inheritMany: inheritMany, mixin: mixinEasy, mixinHard: mixinHard, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, lazyFinal: lazyFinal, lazyOld: lazyOld, updateHolder: updateHolder, convertToFastObject: convertToFastObject, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
  }();
  function initializeDeferredHunk(hunk) {
    typesOffset = init.types.length;
    hunk(hunkHelpers, init, holders, $);
  }
  var J = {
    makeDispatchRecord(interceptor, proto, extension, indexability) {
      return {i: interceptor, p: proto, e: extension, x: indexability};
    },
    getNativeInterceptor(object) {
      var proto, objectProto, $constructor, interceptor, t1,
        record = object[init.dispatchPropertyName];
      if (record == null)
        if ($.initNativeDispatchFlag == null) {
          A.initNativeDispatch();
          record = object[init.dispatchPropertyName];
        }
      if (record != null) {
        proto = record.p;
        if (false === proto)
          return record.i;
        if (true === proto)
          return object;
        objectProto = Object.getPrototypeOf(object);
        if (proto === objectProto)
          return record.i;
        if (record.e === objectProto)
          throw A.wrapException(A.UnimplementedError$("Return interceptor for " + A.S(proto(object, record))));
      }
      $constructor = object.constructor;
      if ($constructor == null)
        interceptor = null;
      else {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        interceptor = $constructor[t1];
      }
      if (interceptor != null)
        return interceptor;
      interceptor = A.lookupAndCacheInterceptor(object);
      if (interceptor != null)
        return interceptor;
      if (typeof object == "function")
        return B.JavaScriptFunction_methods;
      proto = Object.getPrototypeOf(object);
      if (proto == null)
        return B.PlainJavaScriptObject_methods;
      if (proto === Object.prototype)
        return B.PlainJavaScriptObject_methods;
      if (typeof $constructor == "function") {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        Object.defineProperty($constructor, t1, {value: B.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
        return B.UnknownJavaScriptObject_methods;
      }
      return B.UnknownJavaScriptObject_methods;
    },
    JSArray_JSArray$fixed($length, $E) {
      if ($length < 0 || $length > 4294967295)
        throw A.wrapException(A.RangeError$range($length, 0, 4294967295, "length", null));
      return J.JSArray_JSArray$markFixed(new Array($length), $E);
    },
    JSArray_JSArray$growable($length, $E) {
      if ($length < 0)
        throw A.wrapException(A.ArgumentError$("Length must be a non-negative integer: " + $length, null));
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$allocateGrowable($length, $E) {
      if ($length < 0)
        throw A.wrapException(A.ArgumentError$("Length must be a non-negative integer: " + $length, null));
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$markFixed(allocation, $E) {
      return J.JSArray_markFixedList(A._setArrayType(allocation, $E._eval$1("JSArray<0>")), $E);
    },
    JSArray_markFixedList(list, $T) {
      list.fixed$length = Array;
      return list;
    },
    JSArray_markUnmodifiableList(list) {
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    },
    JSArray__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    getInterceptor$(receiver) {
      if (typeof receiver == "number") {
        if (Math.floor(receiver) == receiver)
          return J.JSInt.prototype;
        return J.JSNumNotInt.prototype;
      }
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return J.JSNull.prototype;
      if (typeof receiver == "boolean")
        return J.JSBool.prototype;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$asx(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ax(receiver) {
      if (receiver == null)
        return receiver;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$n(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$ns(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$s(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$x(receiver) {
      if (receiver == null)
        return receiver;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$z(receiver) {
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    set$_innerHtml$x(receiver, value) {
      return J.getInterceptor$x(receiver).set$_innerHtml(receiver, value);
    },
    get$attributes$x(receiver) {
      return J.getInterceptor$x(receiver).get$attributes(receiver);
    },
    get$digestsPath$x(receiver) {
      return J.getInterceptor$x(receiver).get$digestsPath(receiver);
    },
    get$first$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$first(receiver);
    },
    get$hashCode$(receiver) {
      return J.getInterceptor$(receiver).get$hashCode(receiver);
    },
    get$isEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
    },
    get$isNotEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
    },
    get$iterator$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$iterator(receiver);
    },
    get$keys$x(receiver) {
      return J.getInterceptor$x(receiver).get$keys(receiver);
    },
    get$length$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$length(receiver);
    },
    get$message$x(receiver) {
      return J.getInterceptor$x(receiver).get$message(receiver);
    },
    get$moduleParentsGraph$x(receiver) {
      return J.getInterceptor$x(receiver).get$moduleParentsGraph(receiver);
    },
    get$parent$z(receiver) {
      return J.getInterceptor$z(receiver).get$parent(receiver);
    },
    get$runtimeType$(receiver) {
      return J.getInterceptor$(receiver).get$runtimeType(receiver);
    },
    $eq$(receiver, a0) {
      if (receiver == null)
        return a0 == null;
      if (typeof receiver != "object")
        return a0 != null && receiver === a0;
      return J.getInterceptor$(receiver).$eq(receiver, a0);
    },
    $get$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).$get$1(receiver, a0);
    },
    $index$asx(receiver, a0) {
      if (typeof a0 === "number")
        if (Array.isArray(receiver) || typeof receiver == "string" || A.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
          if (a0 >>> 0 === a0 && a0 < receiver.length)
            return receiver[a0];
      return J.getInterceptor$asx(receiver).$index(receiver, a0);
    },
    $indexSet$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
    },
    _clearChildren$0$x(receiver) {
      return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
    },
    _initCustomEvent$4$x(receiver, a0, a1, a2, a3) {
      return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
    },
    _removeEventListener$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver)._removeEventListener$3(receiver, a0, a1, a2);
    },
    addEventListener$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
    },
    allMatches$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver).allMatches$1(receiver, a0);
    },
    cast$1$0$ax(receiver, $T1) {
      return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1);
    },
    cast$2$0$ax(receiver, $T1, $T2) {
      return J.getInterceptor$ax(receiver).cast$2$0(receiver, $T1, $T2);
    },
    compareTo$1$ns(receiver, a0) {
      return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
    },
    complete$1$z(receiver, a0) {
      return J.getInterceptor$z(receiver).complete$1(receiver, a0);
    },
    contains$1$asx(receiver, a0) {
      return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
    },
    containsKey$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).containsKey$1(receiver, a0);
    },
    elementAt$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
    },
    forEach$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).forEach$1(receiver, a0);
    },
    forceLoadModule$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).forceLoadModule$3(receiver, a0, a1, a2);
    },
    getRange$2$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).getRange$2(receiver, a0, a1);
    },
    keys$0$x(receiver) {
      return J.getInterceptor$x(receiver).keys$0(receiver);
    },
    map$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
    },
    map$1$1$ax(receiver, a0, $T1) {
      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
    },
    map$2$1$ax(receiver, a0, $T1, $T2) {
      return J.getInterceptor$ax(receiver).map$2$1(receiver, a0, $T1, $T2);
    },
    matchAsPrefix$2$s(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).matchAsPrefix$2(receiver, a0, a1);
    },
    noSuchMethod$1$(receiver, a0) {
      return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
    },
    remove$0$x(receiver) {
      return J.getInterceptor$x(receiver).remove$0(receiver);
    },
    skip$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
    },
    sort$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
    },
    then$1$1$x(receiver, a0, $T1) {
      return J.getInterceptor$x(receiver).then$1$1(receiver, a0, $T1);
    },
    then$2$x(receiver, a0, a1) {
      return J.getInterceptor$x(receiver).then$2(receiver, a0, a1);
    },
    toList$0$ax(receiver) {
      return J.getInterceptor$ax(receiver).toList$0(receiver);
    },
    toLowerCase$0$s(receiver) {
      return J.getInterceptor$s(receiver).toLowerCase$0(receiver);
    },
    toRadixString$1$n(receiver, a0) {
      return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
    },
    toString$0$(receiver) {
      return J.getInterceptor$(receiver).toString$0(receiver);
    },
    update$2$z(receiver, a0, a1) {
      return J.getInterceptor$z(receiver).update$2(receiver, a0, a1);
    },
    Interceptor: function Interceptor() {
    },
    JSBool: function JSBool() {
    },
    JSNull: function JSNull() {
    },
    JavaScriptObject: function JavaScriptObject() {
    },
    LegacyJavaScriptObject: function LegacyJavaScriptObject() {
    },
    PlainJavaScriptObject: function PlainJavaScriptObject() {
    },
    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
    },
    JavaScriptFunction: function JavaScriptFunction() {
    },
    JavaScriptBigInt: function JavaScriptBigInt() {
    },
    JavaScriptSymbol: function JavaScriptSymbol() {
    },
    JSArray: function JSArray(t0) {
      this.$ti = t0;
    },
    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
      this.$ti = t0;
    },
    ArrayIterator: function ArrayIterator(t0, t1, t2) {
      var _ = this;
      _._iterable = t0;
      _.__interceptors$_length = t1;
      _._index = 0;
      _.__interceptors$_current = null;
      _.$ti = t2;
    },
    JSNumber: function JSNumber() {
    },
    JSInt: function JSInt() {
    },
    JSNumNotInt: function JSNumNotInt() {
    },
    JSString: function JSString() {
    }
  },
  A = {JS_CONST: function JS_CONST() {
    },
    CastIterable_CastIterable(source, $S, $T) {
      if ($S._eval$1("EfficientLengthIterable<0>")._is(source))
        return new A._EfficientLengthCastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("_EfficientLengthCastIterable<1,2>"));
      return new A.CastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastIterable<1,2>"));
    },
    LateError$fieldNI(fieldName) {
      return new A.LateError("Field '" + fieldName + "' has not been initialized.");
    },
    hexDigitValue(char) {
      var letter,
        digit = char ^ 48;
      if (digit <= 9)
        return digit;
      letter = char | 32;
      if (97 <= letter && letter <= 102)
        return letter - 87;
      return -1;
    },
    SystemHash_combine(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    SystemHash_finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    checkNotNullable(value, $name, $T) {
      return value;
    },
    isToStringVisiting(object) {
      var t1, i;
      for (t1 = $.toStringVisiting.length, i = 0; i < t1; ++i)
        if (object === $.toStringVisiting[i])
          return true;
      return false;
    },
    SubListIterable$(_iterable, _start, _endOrLength, $E) {
      A.RangeError_checkNotNegative(_start, "start");
      if (_endOrLength != null) {
        A.RangeError_checkNotNegative(_endOrLength, "end");
        if (_start > _endOrLength)
          A.throwExpression(A.RangeError$range(_start, 0, _endOrLength, "start", null));
      }
      return new A.SubListIterable(_iterable, _start, _endOrLength, $E._eval$1("SubListIterable<0>"));
    },
    MappedIterable_MappedIterable(iterable, $function, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new A.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
      return new A.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    SkipIterable_SkipIterable(iterable, count, $E) {
      var _s5_ = "count";
      if (type$.EfficientLengthIterable_dynamic._is(iterable)) {
        A.ArgumentError_checkNotNull(count, _s5_, type$.int);
        A.RangeError_checkNotNegative(count, _s5_);
        return new A.EfficientLengthSkipIterable(iterable, count, $E._eval$1("EfficientLengthSkipIterable<0>"));
      }
      A.ArgumentError_checkNotNull(count, _s5_, type$.int);
      A.RangeError_checkNotNegative(count, _s5_);
      return new A.SkipIterable(iterable, count, $E._eval$1("SkipIterable<0>"));
    },
    IterableElementError_noElement() {
      return new A.StateError("No element");
    },
    IterableElementError_tooMany() {
      return new A.StateError("Too many elements");
    },
    IterableElementError_tooFew() {
      return new A.StateError("Too few elements");
    },
    Sort__doSort(a, left, right, compare, $E) {
      if (right - left <= 32)
        A.Sort__insertionSort(a, left, right, compare, $E);
      else
        A.Sort__dualPivotQuicksort(a, left, right, compare, $E);
    },
    Sort__insertionSort(a, left, right, compare, $E) {
      var i, t1, el, j, t2, j0;
      for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
        el = t1.$index(a, i);
        j = i;
        while (true) {
          if (j > left) {
            t2 = compare.call$2(t1.$index(a, j - 1), el);
            if (typeof t2 !== "number")
              return t2.$gt();
            t2 = t2 > 0;
          } else
            t2 = false;
          if (!t2)
            break;
          j0 = j - 1;
          t1.$indexSet(a, j, t1.$index(a, j0));
          j = j0;
        }
        t1.$indexSet(a, j, el);
      }
    },
    Sort__dualPivotQuicksort(a, left, right, compare, $E) {
      var t0, less, great, k, ak, comp, great0, less0, pivots_are_equal,
        sixth = B.JSInt_methods._tdivFast$1(right - left + 1, 6),
        index1 = left + sixth,
        index5 = right - sixth,
        index3 = B.JSInt_methods._tdivFast$1(left + right, 2),
        index2 = index3 - sixth,
        index4 = index3 + sixth,
        t1 = J.getInterceptor$asx(a),
        el1 = t1.$index(a, index1),
        el2 = t1.$index(a, index2),
        el3 = t1.$index(a, index3),
        el4 = t1.$index(a, index4),
        el5 = t1.$index(a, index5),
        t2 = compare.call$2(el1, el2);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el2;
        el2 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t2 = compare.call$2(el1, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el1, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el3, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el3;
        el3 = t0;
      }
      t2 = compare.call$2(el2, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t1.$indexSet(a, index1, el1);
      t1.$indexSet(a, index3, el3);
      t1.$indexSet(a, index5, el5);
      t1.$indexSet(a, index2, t1.$index(a, left));
      t1.$indexSet(a, index4, t1.$index(a, right));
      less = left + 1;
      great = right - 1;
      if (J.$eq$(compare.call$2(el2, el4), 0)) {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp = compare.call$2(ak, el2);
          if (comp === 0)
            continue;
          if (comp < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else
            for (; true;) {
              comp = compare.call$2(t1.$index(a, great), el2);
              if (comp > 0) {
                --great;
                continue;
              } else {
                great0 = great - 1;
                if (comp < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  less = less0;
                  break;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  break;
                }
              }
            }
        }
        pivots_are_equal = true;
      } else {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) > 0)
            for (; true;)
              if (compare.call$2(t1.$index(a, great), el4) > 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                great0 = great - 1;
                if (compare.call$2(t1.$index(a, great), el2) < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        pivots_are_equal = false;
      }
      t2 = less - 1;
      t1.$indexSet(a, left, t1.$index(a, t2));
      t1.$indexSet(a, t2, el2);
      t2 = great + 1;
      t1.$indexSet(a, right, t1.$index(a, t2));
      t1.$indexSet(a, t2, el4);
      A.Sort__doSort(a, left, less - 2, compare, $E);
      A.Sort__doSort(a, great + 2, right, compare, $E);
      if (pivots_are_equal)
        return;
      if (less < index1 && great > index5) {
        for (; J.$eq$(compare.call$2(t1.$index(a, less), el2), 0);)
          ++less;
        for (; J.$eq$(compare.call$2(t1.$index(a, great), el4), 0);)
          --great;
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) === 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) === 0)
            for (; true;)
              if (compare.call$2(t1.$index(a, great), el4) === 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                great0 = great - 1;
                if (compare.call$2(t1.$index(a, great), el2) < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        A.Sort__doSort(a, less, great, compare, $E);
      } else
        A.Sort__doSort(a, less, great, compare, $E);
    },
    _CastIterableBase: function _CastIterableBase() {
    },
    CastIterator: function CastIterator(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastIterable: function CastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _EfficientLengthCastIterable: function _EfficientLengthCastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _CastListBase: function _CastListBase() {
    },
    _CastListBase_sort_closure: function _CastListBase_sort_closure(t0, t1) {
      this.$this = t0;
      this.compare = t1;
    },
    CastList: function CastList(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap: function CastMap(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap_forEach_closure: function CastMap_forEach_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    LateError: function LateError(t0) {
      this._message = t0;
    },
    nullFuture_closure: function nullFuture_closure() {
    },
    SentinelValue: function SentinelValue() {
    },
    EfficientLengthIterable: function EfficientLengthIterable() {
    },
    ListIterable: function ListIterable() {
    },
    SubListIterable: function SubListIterable(t0, t1, t2, t3) {
      var _ = this;
      _.__internal$_iterable = t0;
      _.__internal$_start = t1;
      _._endOrLength = t2;
      _.$ti = t3;
    },
    ListIterator: function ListIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_iterable = t0;
      _.__internal$_length = t1;
      _.__internal$_index = 0;
      _.__internal$_current = null;
      _.$ti = t2;
    },
    MappedIterable: function MappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    EfficientLengthMappedIterable: function EfficientLengthMappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    MappedIterator: function MappedIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_current = null;
      _._iterator = t0;
      _._f = t1;
      _.$ti = t2;
    },
    MappedListIterable: function MappedListIterable(t0, t1, t2) {
      this.__internal$_source = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterable: function WhereIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterator: function WhereIterator(t0, t1, t2) {
      this._iterator = t0;
      this._f = t1;
      this.$ti = t2;
    },
    SkipIterable: function SkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EfficientLengthSkipIterable: function EfficientLengthSkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    SkipIterator: function SkipIterator(t0, t1, t2) {
      this._iterator = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EmptyIterable: function EmptyIterable(t0) {
      this.$ti = t0;
    },
    EmptyIterator: function EmptyIterator(t0) {
      this.$ti = t0;
    },
    FixedLengthListMixin: function FixedLengthListMixin() {
    },
    UnmodifiableListMixin: function UnmodifiableListMixin() {
    },
    UnmodifiableListBase: function UnmodifiableListBase() {
    },
    ReversedListIterable: function ReversedListIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    Symbol: function Symbol(t0) {
      this._name = t0;
    },
    __CastListBase__CastIterableBase_ListMixin: function __CastListBase__CastIterableBase_ListMixin() {
    },
    ConstantMap__throwUnmodifiable() {
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable Map"));
    },
    unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    isJsIndexable(object, record) {
      var result;
      if (record != null) {
        result = record.x;
        if (result != null)
          return result;
      }
      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
    },
    S(value) {
      var result;
      if (typeof value == "string")
        return value;
      if (typeof value == "number") {
        if (value !== 0)
          return "" + value;
      } else if (true === value)
        return "true";
      else if (false === value)
        return "false";
      else if (value == null)
        return "null";
      result = J.toString$0$(value);
      return result;
    },
    Primitives_objectHashCode(object) {
      var hash,
        property = $.Primitives__identityHashCodeProperty;
      if (property == null)
        property = $.Primitives__identityHashCodeProperty = Symbol("identityHashCode");
      hash = object[property];
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object[property] = hash;
      }
      return hash;
    },
    Primitives_parseInt(source, radix) {
      var decimalMatch, maxCharCode, digitsPart, t1, i, _null = null,
        match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
      if (match == null)
        return _null;
      if (3 >= match.length)
        return A.ioore(match, 3);
      decimalMatch = match[3];
      if (radix == null) {
        if (decimalMatch != null)
          return parseInt(source, 10);
        if (match[2] != null)
          return parseInt(source, 16);
        return _null;
      }
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", _null));
      if (radix === 10 && decimalMatch != null)
        return parseInt(source, 10);
      if (radix < 10 || decimalMatch == null) {
        maxCharCode = radix <= 10 ? 47 + radix : 86 + radix;
        digitsPart = match[1];
        for (t1 = digitsPart.length, i = 0; i < t1; ++i)
          if ((digitsPart.charCodeAt(i) | 32) > maxCharCode)
            return _null;
      }
      return parseInt(source, radix);
    },
    Primitives_objectTypeName(object) {
      return A.Primitives__objectTypeNameNewRti(object);
    },
    Primitives__objectTypeNameNewRti(object) {
      var interceptor, dispatchName, $constructor, constructorName;
      if (object instanceof A.Object)
        return A._rtiToString(A.instanceType(object), null);
      interceptor = J.getInterceptor$(object);
      if (interceptor === B.Interceptor_methods || interceptor === B.JavaScriptObject_methods || type$.UnknownJavaScriptObject._is(object)) {
        dispatchName = B.C_JS_CONST(object);
        if (dispatchName !== "Object" && dispatchName !== "")
          return dispatchName;
        $constructor = object.constructor;
        if (typeof $constructor == "function") {
          constructorName = $constructor.name;
          if (typeof constructorName == "string" && constructorName !== "Object" && constructorName !== "")
            return constructorName;
        }
      }
      return A._rtiToString(A.instanceType(object), null);
    },
    Primitives_safeToString(object) {
      if (object == null || typeof object == "number" || A._isBool(object))
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      if (object instanceof A.Closure)
        return object.toString$0(0);
      if (object instanceof A._Record)
        return object._toString$1(true);
      return "Instance of '" + A.Primitives_objectTypeName(object) + "'";
    },
    Primitives__fromCharCodeApply(array) {
      var result, i, i0, chunkEnd,
        end = array.length;
      if (end <= 500)
        return String.fromCharCode.apply(null, array);
      for (result = "", i = 0; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, array.slice(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCodePoints(codePoints) {
      var t1, _i, i,
        a = A._setArrayType([], type$.JSArray_int);
      for (t1 = codePoints.length, _i = 0; _i < codePoints.length; codePoints.length === t1 || (0, A.throwConcurrentModificationError)(codePoints), ++_i) {
        i = codePoints[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i <= 65535)
          B.JSArray_methods.add$1(a, i);
        else if (i <= 1114111) {
          B.JSArray_methods.add$1(a, 55296 + (B.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
          B.JSArray_methods.add$1(a, 56320 + (i & 1023));
        } else
          throw A.wrapException(A.argumentErrorValue(i));
      }
      return A.Primitives__fromCharCodeApply(a);
    },
    Primitives_stringFromCharCodes(charCodes) {
      var t1, _i, i;
      for (t1 = charCodes.length, _i = 0; _i < t1; ++_i) {
        i = charCodes[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i < 0)
          throw A.wrapException(A.argumentErrorValue(i));
        if (i > 65535)
          return A.Primitives_stringFromCodePoints(charCodes);
      }
      return A.Primitives__fromCharCodeApply(charCodes);
    },
    Primitives_stringFromNativeUint8List(charCodes, start, end) {
      var i, result, i0, chunkEnd;
      if (end <= 500 && start === 0 && end === charCodes.length)
        return String.fromCharCode.apply(null, charCodes);
      for (i = start, result = ""; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCharCode(charCode) {
      var bits;
      if (0 <= charCode) {
        if (charCode <= 65535)
          return String.fromCharCode(charCode);
        if (charCode <= 1114111) {
          bits = charCode - 65536;
          return String.fromCharCode((B.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
        }
      }
      throw A.wrapException(A.RangeError$range(charCode, 0, 1114111, null, null));
    },
    Primitives_lazyAsJsDate(receiver) {
      if (receiver.date === void 0)
        receiver.date = new Date(receiver._value);
      return receiver.date;
    },
    Primitives_getYear(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCFullYear() + 0 : A.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
    },
    Primitives_getMonth(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMonth() + 1 : A.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
    },
    Primitives_getDay(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCDate() + 0 : A.Primitives_lazyAsJsDate(receiver).getDate() + 0;
    },
    Primitives_getHours(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCHours() + 0 : A.Primitives_lazyAsJsDate(receiver).getHours() + 0;
    },
    Primitives_getMinutes(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMinutes() + 0 : A.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
    },
    Primitives_getSeconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCSeconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
    },
    Primitives_getMilliseconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
    },
    Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments) {
      var $arguments, namedArgumentList, t1 = {};
      t1.argumentCount = 0;
      $arguments = [];
      namedArgumentList = [];
      t1.argumentCount = positionalArguments.length;
      B.JSArray_methods.addAll$1($arguments, positionalArguments);
      t1.names = "";
      if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
        namedArguments.forEach$1(0, new A.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
      return J.noSuchMethod$1$($function, new A.JSInvocationMirror(B.Symbol_call, 0, $arguments, namedArgumentList, 0));
    },
    Primitives_applyFunction($function, positionalArguments, namedArguments) {
      var t1, argumentCount, jsStub;
      if (Array.isArray(positionalArguments))
        t1 = namedArguments == null || namedArguments.__js_helper$_length === 0;
      else
        t1 = false;
      if (t1) {
        argumentCount = positionalArguments.length;
        if (argumentCount === 0) {
          if (!!$function.call$0)
            return $function.call$0();
        } else if (argumentCount === 1) {
          if (!!$function.call$1)
            return $function.call$1(positionalArguments[0]);
        } else if (argumentCount === 2) {
          if (!!$function.call$2)
            return $function.call$2(positionalArguments[0], positionalArguments[1]);
        } else if (argumentCount === 3) {
          if (!!$function.call$3)
            return $function.call$3(positionalArguments[0], positionalArguments[1], positionalArguments[2]);
        } else if (argumentCount === 4) {
          if (!!$function.call$4)
            return $function.call$4(positionalArguments[0], positionalArguments[1], positionalArguments[2], positionalArguments[3]);
        } else if (argumentCount === 5)
          if (!!$function.call$5)
            return $function.call$5(positionalArguments[0], positionalArguments[1], positionalArguments[2], positionalArguments[3], positionalArguments[4]);
        jsStub = $function["call" + "$" + argumentCount];
        if (jsStub != null)
          return jsStub.apply($function, positionalArguments);
      }
      return A.Primitives__generalApplyFunction($function, positionalArguments, namedArguments);
    },
    Primitives__generalApplyFunction($function, positionalArguments, namedArguments) {
      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, maxArguments, missingDefaults, keys, _i, defaultValue, used, key;
      if (positionalArguments != null)
        $arguments = Array.isArray(positionalArguments) ? positionalArguments : A.List_List$of(positionalArguments, true, type$.dynamic);
      else
        $arguments = [];
      argumentCount = $arguments.length;
      requiredParameterCount = $function.$requiredArgCount;
      if (argumentCount < requiredParameterCount)
        return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      defaultValuesClosure = $function.$defaultValues;
      t1 = defaultValuesClosure == null;
      defaultValues = !t1 ? defaultValuesClosure() : null;
      interceptor = J.getInterceptor$($function);
      jsFunction = interceptor["call*"];
      if (typeof jsFunction == "string")
        jsFunction = interceptor[jsFunction];
      if (t1) {
        if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount === requiredParameterCount)
          return jsFunction.apply($function, $arguments);
        return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      }
      if (Array.isArray(defaultValues)) {
        if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        maxArguments = requiredParameterCount + defaultValues.length;
        if (argumentCount > maxArguments)
          return A.Primitives_functionNoSuchMethod($function, $arguments, null);
        if (argumentCount < maxArguments) {
          missingDefaults = defaultValues.slice(argumentCount - requiredParameterCount);
          if ($arguments === positionalArguments)
            $arguments = A.List_List$of($arguments, true, type$.dynamic);
          B.JSArray_methods.addAll$1($arguments, missingDefaults);
        }
        return jsFunction.apply($function, $arguments);
      } else {
        if (argumentCount > requiredParameterCount)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if ($arguments === positionalArguments)
          $arguments = A.List_List$of($arguments, true, type$.dynamic);
        keys = Object.keys(defaultValues);
        if (namedArguments == null)
          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
            defaultValue = defaultValues[A._asString(keys[_i])];
            if (B.C__Required === defaultValue)
              return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
            B.JSArray_methods.add$1($arguments, defaultValue);
          }
        else {
          for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
            key = A._asString(keys[_i]);
            if (namedArguments.containsKey$1(0, key)) {
              ++used;
              B.JSArray_methods.add$1($arguments, namedArguments.$index(0, key));
            } else {
              defaultValue = defaultValues[key];
              if (B.C__Required === defaultValue)
                return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
              B.JSArray_methods.add$1($arguments, defaultValue);
            }
          }
          if (used !== namedArguments.__js_helper$_length)
            return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        }
        return jsFunction.apply($function, $arguments);
      }
    },
    iae(argument) {
      throw A.wrapException(A.argumentErrorValue(argument));
    },
    ioore(receiver, index) {
      if (receiver == null)
        J.get$length$asx(receiver);
      throw A.wrapException(A.diagnoseIndexError(receiver, index));
    },
    diagnoseIndexError(indexable, index) {
      var $length, _s5_ = "index";
      if (!A._isInt(index))
        return new A.ArgumentError(true, index, _s5_, null);
      $length = A._asInt(J.get$length$asx(indexable));
      if (index < 0 || index >= $length)
        return A.IndexError$withLength(index, $length, indexable, null, _s5_);
      return A.RangeError$value(index, _s5_);
    },
    diagnoseRangeError(start, end, $length) {
      if (start > $length)
        return A.RangeError$range(start, 0, $length, "start", null);
      if (end != null)
        if (end < start || end > $length)
          return A.RangeError$range(end, start, $length, "end", null);
      return new A.ArgumentError(true, end, "end", null);
    },
    argumentErrorValue(object) {
      return new A.ArgumentError(true, object, null, null);
    },
    checkNum(value) {
      return value;
    },
    wrapException(ex) {
      return A.initializeExceptionWrapper(new Error(), ex);
    },
    initializeExceptionWrapper(wrapper, ex) {
      var t1;
      if (ex == null)
        ex = new A.TypeError();
      wrapper.dartException = ex;
      t1 = A.toStringWrapper;
      if ("defineProperty" in Object) {
        Object.defineProperty(wrapper, "message", {get: t1});
        wrapper.name = "";
      } else
        wrapper.toString = t1;
      return wrapper;
    },
    toStringWrapper() {
      return J.toString$0$(this.dartException);
    },
    throwExpression(ex) {
      throw A.wrapException(ex);
    },
    throwExpressionWithWrapper(ex, wrapper) {
      throw A.initializeExceptionWrapper(wrapper, ex);
    },
    throwConcurrentModificationError(collection) {
      throw A.wrapException(A.ConcurrentModificationError$(collection));
    },
    TypeErrorDecoder_extractPattern(message) {
      var match, $arguments, argumentsExpr, expr, method, receiver;
      message = A.quoteStringForRegExp(message.replace(String({}), "$receiver$"));
      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
      if (match == null)
        match = A._setArrayType([], type$.JSArray_String);
      $arguments = match.indexOf("\\$arguments\\$");
      argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
      expr = match.indexOf("\\$expr\\$");
      method = match.indexOf("\\$method\\$");
      receiver = match.indexOf("\\$receiver\\$");
      return new A.TypeErrorDecoder(message.replace(new RegExp("\\\\\\$arguments\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$", "g"), "((?:x|[^x])*)"), $arguments, argumentsExpr, expr, method, receiver);
    },
    TypeErrorDecoder_provokeCallErrorOn(expression) {
      return function($expr$) {
        var $argumentsExpr$ = "$arguments$";
        try {
          $expr$.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    TypeErrorDecoder_provokePropertyErrorOn(expression) {
      return function($expr$) {
        try {
          $expr$.$method$;
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    JsNoSuchMethodError$(_message, match) {
      var t1 = match == null,
        t2 = t1 ? null : match.method;
      return new A.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
    },
    unwrapException(ex) {
      var t1;
      if (ex == null)
        return new A.NullThrownFromJavaScriptException(ex);
      if (ex instanceof A.ExceptionAndStackTrace) {
        t1 = ex.dartException;
        return A.saveStackTrace(ex, t1 == null ? type$.Object._as(t1) : t1);
      }
      if (typeof ex !== "object")
        return ex;
      if ("dartException" in ex)
        return A.saveStackTrace(ex, ex.dartException);
      return A._unwrapNonDartException(ex);
    },
    saveStackTrace(ex, error) {
      if (type$.Error._is(error))
        if (error.$thrownJsError == null)
          error.$thrownJsError = ex;
      return error;
    },
    _unwrapNonDartException(ex) {
      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match;
      if (!("message" in ex))
        return ex;
      message = ex.message;
      if ("number" in ex && typeof ex.number == "number") {
        number = ex.number;
        ieErrorCode = number & 65535;
        if ((B.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
          switch (ieErrorCode) {
            case 438:
              return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A.S(message) + " (Error " + ieErrorCode + ")", null));
            case 445:
            case 5007:
              A.S(message);
              return A.saveStackTrace(ex, new A.NullError());
          }
      }
      if (ex instanceof TypeError) {
        nsme = $.$get$TypeErrorDecoder_noSuchMethodPattern();
        notClosure = $.$get$TypeErrorDecoder_notClosurePattern();
        nullCall = $.$get$TypeErrorDecoder_nullCallPattern();
        nullLiteralCall = $.$get$TypeErrorDecoder_nullLiteralCallPattern();
        undefCall = $.$get$TypeErrorDecoder_undefinedCallPattern();
        undefLiteralCall = $.$get$TypeErrorDecoder_undefinedLiteralCallPattern();
        nullProperty = $.$get$TypeErrorDecoder_nullPropertyPattern();
        $.$get$TypeErrorDecoder_nullLiteralPropertyPattern();
        undefProperty = $.$get$TypeErrorDecoder_undefinedPropertyPattern();
        undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
        match = nsme.matchTypeError$1(message);
        if (match != null)
          return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asString(message), match));
        else {
          match = notClosure.matchTypeError$1(message);
          if (match != null) {
            match.method = "call";
            return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asString(message), match));
          } else if (nullCall.matchTypeError$1(message) != null || nullLiteralCall.matchTypeError$1(message) != null || undefCall.matchTypeError$1(message) != null || undefLiteralCall.matchTypeError$1(message) != null || nullProperty.matchTypeError$1(message) != null || nullLiteralCall.matchTypeError$1(message) != null || undefProperty.matchTypeError$1(message) != null || undefLiteralProperty.matchTypeError$1(message) != null) {
            A._asString(message);
            return A.saveStackTrace(ex, new A.NullError());
          }
        }
        return A.saveStackTrace(ex, new A.UnknownJsTypeError(typeof message == "string" ? message : ""));
      }
      if (ex instanceof RangeError) {
        if (typeof message == "string" && message.indexOf("call stack") !== -1)
          return new A.StackOverflowError();
        message = function(ex) {
          try {
            return String(ex);
          } catch (e) {
          }
          return null;
        }(ex);
        return A.saveStackTrace(ex, new A.ArgumentError(false, null, null, typeof message == "string" ? message.replace(/^RangeError:\s*/, "") : message));
      }
      if (typeof InternalError == "function" && ex instanceof InternalError)
        if (typeof message == "string" && message === "too much recursion")
          return new A.StackOverflowError();
      return ex;
    },
    getTraceFromException(exception) {
      var trace;
      if (exception instanceof A.ExceptionAndStackTrace)
        return exception.stackTrace;
      if (exception == null)
        return new A._StackTrace(exception);
      trace = exception.$cachedTrace;
      if (trace != null)
        return trace;
      trace = new A._StackTrace(exception);
      if (typeof exception === "object")
        exception.$cachedTrace = trace;
      return trace;
    },
    objectHashCode(object) {
      if (object == null)
        return J.get$hashCode$(object);
      if (typeof object == "object")
        return A.Primitives_objectHashCode(object);
      return J.get$hashCode$(object);
    },
    fillLiteralMap(keyValuePairs, result) {
      var index, index0, index1,
        $length = keyValuePairs.length;
      for (index = 0; index < $length; index = index1) {
        index0 = index + 1;
        index1 = index0 + 1;
        result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
      }
      return result;
    },
    _invokeClosure(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
      type$.Function._as(closure);
      switch (A._asInt(numberOfArguments)) {
        case 0:
          return closure.call$0();
        case 1:
          return closure.call$1(arg1);
        case 2:
          return closure.call$2(arg1, arg2);
        case 3:
          return closure.call$3(arg1, arg2, arg3);
        case 4:
          return closure.call$4(arg1, arg2, arg3, arg4);
      }
      throw A.wrapException(A.Exception_Exception("Unsupported number of arguments for wrapped closure"));
    },
    convertDartClosureToJS(closure, arity) {
      var $function;
      if (closure == null)
        return null;
      $function = closure.$identity;
      if (!!$function)
        return $function;
      $function = A.convertDartClosureToJSUncached(closure, arity);
      closure.$identity = $function;
      return $function;
    },
    convertDartClosureToJSUncached(closure, arity) {
      var entry;
      switch (arity) {
        case 0:
          entry = closure.call$0;
          break;
        case 1:
          entry = closure.call$1;
          break;
        case 2:
          entry = closure.call$2;
          break;
        case 3:
          entry = closure.call$3;
          break;
        case 4:
          entry = closure.call$4;
          break;
        default:
          entry = null;
      }
      if (entry != null)
        return entry.bind(closure);
      return function(closure, arity, invoke) {
        return function(a1, a2, a3, a4) {
          return invoke(closure, arity, a1, a2, a3, a4);
        };
      }(closure, arity, A._invokeClosure);
    },
    Closure_fromTearOff(parameters) {
      var $prototype, $constructor, t2, trampoline, applyTrampoline, i, stub, stub0, stubName, stubCallName,
        container = parameters.co,
        isStatic = parameters.iS,
        isIntercepted = parameters.iI,
        needsDirectAccess = parameters.nDA,
        applyTrampolineIndex = parameters.aI,
        funsOrNames = parameters.fs,
        callNames = parameters.cs,
        $name = funsOrNames[0],
        callName = callNames[0],
        $function = container[$name],
        t1 = parameters.fT;
      t1.toString;
      $prototype = isStatic ? Object.create(new A.StaticClosure().constructor.prototype) : Object.create(new A.BoundClosure(null, null).constructor.prototype);
      $prototype.$initialize = $prototype.constructor;
      if (isStatic)
        $constructor = function static_tear_off() {
          this.$initialize();
        };
      else
        $constructor = function tear_off(a, b) {
          this.$initialize(a, b);
        };
      $prototype.constructor = $constructor;
      $constructor.prototype = $prototype;
      $prototype.$_name = $name;
      $prototype.$_target = $function;
      t2 = !isStatic;
      if (t2)
        trampoline = A.Closure_forwardCallTo($name, $function, isIntercepted, needsDirectAccess);
      else {
        $prototype.$static_name = $name;
        trampoline = $function;
      }
      $prototype.$signature = A.Closure__computeSignatureFunctionNewRti(t1, isStatic, isIntercepted);
      $prototype[callName] = trampoline;
      for (applyTrampoline = trampoline, i = 1; i < funsOrNames.length; ++i) {
        stub = funsOrNames[i];
        if (typeof stub == "string") {
          stub0 = container[stub];
          stubName = stub;
          stub = stub0;
        } else
          stubName = "";
        stubCallName = callNames[i];
        if (stubCallName != null) {
          if (t2)
            stub = A.Closure_forwardCallTo(stubName, stub, isIntercepted, needsDirectAccess);
          $prototype[stubCallName] = stub;
        }
        if (i === applyTrampolineIndex)
          applyTrampoline = stub;
      }
      $prototype["call*"] = applyTrampoline;
      $prototype.$requiredArgCount = parameters.rC;
      $prototype.$defaultValues = parameters.dV;
      return $constructor;
    },
    Closure__computeSignatureFunctionNewRti(functionType, isStatic, isIntercepted) {
      if (typeof functionType == "number")
        return functionType;
      if (typeof functionType == "string") {
        if (isStatic)
          throw A.wrapException("Cannot compute signature for static tearoff.");
        return function(recipe, evalOnReceiver) {
          return function() {
            return evalOnReceiver(this, recipe);
          };
        }(functionType, A.BoundClosure_evalRecipe);
      }
      throw A.wrapException("Error in functionType of tearoff");
    },
    Closure_cspForwardCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf;
      switch (needsDirectAccess ? -1 : arity) {
        case 0:
          return function(entry, receiverOf) {
            return function() {
              return receiverOf(this)[entry]();
            };
          }(stubName, getReceiver);
        case 1:
          return function(entry, receiverOf) {
            return function(a) {
              return receiverOf(this)[entry](a);
            };
          }(stubName, getReceiver);
        case 2:
          return function(entry, receiverOf) {
            return function(a, b) {
              return receiverOf(this)[entry](a, b);
            };
          }(stubName, getReceiver);
        case 3:
          return function(entry, receiverOf) {
            return function(a, b, c) {
              return receiverOf(this)[entry](a, b, c);
            };
          }(stubName, getReceiver);
        case 4:
          return function(entry, receiverOf) {
            return function(a, b, c, d) {
              return receiverOf(this)[entry](a, b, c, d);
            };
          }(stubName, getReceiver);
        case 5:
          return function(entry, receiverOf) {
            return function(a, b, c, d, e) {
              return receiverOf(this)[entry](a, b, c, d, e);
            };
          }(stubName, getReceiver);
        default:
          return function(f, receiverOf) {
            return function() {
              return f.apply(receiverOf(this), arguments);
            };
          }($function, getReceiver);
      }
    },
    Closure_forwardCallTo(stubName, $function, isIntercepted, needsDirectAccess) {
      var arity, t1;
      if (isIntercepted)
        return A.Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess);
      arity = $function.length;
      t1 = A.Closure_cspForwardCall(arity, needsDirectAccess, stubName, $function);
      return t1;
    },
    Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf,
        getInterceptor = A.BoundClosure_interceptorOf;
      switch (needsDirectAccess ? -1 : arity) {
        case 0:
          throw A.wrapException(new A.RuntimeError("Intercepted function with no arguments."));
        case 1:
          return function(entry, interceptorOf, receiverOf) {
            return function() {
              return interceptorOf(this)[entry](receiverOf(this));
            };
          }(stubName, getInterceptor, getReceiver);
        case 2:
          return function(entry, interceptorOf, receiverOf) {
            return function(a) {
              return interceptorOf(this)[entry](receiverOf(this), a);
            };
          }(stubName, getInterceptor, getReceiver);
        case 3:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b) {
              return interceptorOf(this)[entry](receiverOf(this), a, b);
            };
          }(stubName, getInterceptor, getReceiver);
        case 4:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c);
            };
          }(stubName, getInterceptor, getReceiver);
        case 5:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d);
            };
          }(stubName, getInterceptor, getReceiver);
        case 6:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d, e) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d, e);
            };
          }(stubName, getInterceptor, getReceiver);
        default:
          return function(f, interceptorOf, receiverOf) {
            return function() {
              var a = [receiverOf(this)];
              Array.prototype.push.apply(a, arguments);
              return f.apply(interceptorOf(this), a);
            };
          }($function, getInterceptor, getReceiver);
      }
    },
    Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess) {
      var arity, t1;
      if ($.BoundClosure__interceptorFieldNameCache == null)
        $.BoundClosure__interceptorFieldNameCache = A.BoundClosure__computeFieldNamed("interceptor");
      if ($.BoundClosure__receiverFieldNameCache == null)
        $.BoundClosure__receiverFieldNameCache = A.BoundClosure__computeFieldNamed("receiver");
      arity = $function.length;
      t1 = A.Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function);
      return t1;
    },
    closureFromTearOff(parameters) {
      return A.Closure_fromTearOff(parameters);
    },
    BoundClosure_evalRecipe(closure, recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, A.instanceType(closure._receiver), recipe);
    },
    BoundClosure_receiverOf(closure) {
      return closure._receiver;
    },
    BoundClosure_interceptorOf(closure) {
      return closure._interceptor;
    },
    BoundClosure__computeFieldNamed(fieldName) {
      var t1, i, $name,
        template = new A.BoundClosure("receiver", "interceptor"),
        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template), type$.nullable_Object);
      for (t1 = names.length, i = 0; i < t1; ++i) {
        $name = names[i];
        if (template[$name] === fieldName)
          return $name;
      }
      throw A.wrapException(A.ArgumentError$("Field name " + fieldName + " not found.", null));
    },
    boolConversionCheck(value) {
      if (value == null)
        A.assertThrow("boolean expression must not be null");
      return value;
    },
    assertThrow(message) {
      throw A.wrapException(new A._AssertionError(message));
    },
    throwCyclicInit(staticName) {
      throw A.wrapException(new A._CyclicInitializationError(staticName));
    },
    getIsolateAffinityTag($name) {
      return init.getIsolateTag($name);
    },
    LinkedHashMapKeyIterator$(_map, _modifications, $E) {
      var t1 = new A.LinkedHashMapKeyIterator(_map, _modifications, $E._eval$1("LinkedHashMapKeyIterator<0>"));
      t1._cell = _map._first;
      return t1;
    },
    defineProperty(obj, property, value) {
      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
    },
    lookupAndCacheInterceptor(obj) {
      var interceptor, interceptorClass, altTag, mark, t1,
        tag = A._asString($.getTagFunction.call$1(obj)),
        record = $.dispatchRecordsForInstanceTags[tag];
      if (record != null) {
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      interceptor = $.interceptorsForUncacheableTags[tag];
      if (interceptor != null)
        return interceptor;
      interceptorClass = init.interceptorsByTag[tag];
      if (interceptorClass == null) {
        altTag = A._asStringQ($.alternateTagFunction.call$2(obj, tag));
        if (altTag != null) {
          record = $.dispatchRecordsForInstanceTags[altTag];
          if (record != null) {
            Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
            return record.i;
          }
          interceptor = $.interceptorsForUncacheableTags[altTag];
          if (interceptor != null)
            return interceptor;
          interceptorClass = init.interceptorsByTag[altTag];
          tag = altTag;
        }
      }
      if (interceptorClass == null)
        return null;
      interceptor = interceptorClass.prototype;
      mark = tag[0];
      if (mark === "!") {
        record = A.makeLeafDispatchRecord(interceptor);
        $.dispatchRecordsForInstanceTags[tag] = record;
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      if (mark === "~") {
        $.interceptorsForUncacheableTags[tag] = interceptor;
        return interceptor;
      }
      if (mark === "-") {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      }
      if (mark === "+")
        return A.patchInteriorProto(obj, interceptor);
      if (mark === "*")
        throw A.wrapException(A.UnimplementedError$(tag));
      if (init.leafTags[tag] === true) {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      } else
        return A.patchInteriorProto(obj, interceptor);
    },
    patchInteriorProto(obj, interceptor) {
      var proto = Object.getPrototypeOf(obj);
      Object.defineProperty(proto, init.dispatchPropertyName, {value: J.makeDispatchRecord(interceptor, proto, null, null), enumerable: false, writable: true, configurable: true});
      return interceptor;
    },
    makeLeafDispatchRecord(interceptor) {
      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
    },
    makeDefaultDispatchRecord(tag, interceptorClass, proto) {
      var interceptor = interceptorClass.prototype;
      if (init.leafTags[tag] === true)
        return A.makeLeafDispatchRecord(interceptor);
      else
        return J.makeDispatchRecord(interceptor, proto, null, null);
    },
    initNativeDispatch() {
      if (true === $.initNativeDispatchFlag)
        return;
      $.initNativeDispatchFlag = true;
      A.initNativeDispatchContinue();
    },
    initNativeDispatchContinue() {
      var map, tags, fun, i, tag, proto, record, interceptorClass;
      $.dispatchRecordsForInstanceTags = Object.create(null);
      $.interceptorsForUncacheableTags = Object.create(null);
      A.initHooks();
      map = init.interceptorsByTag;
      tags = Object.getOwnPropertyNames(map);
      if (typeof window != "undefined") {
        window;
        fun = function() {
        };
        for (i = 0; i < tags.length; ++i) {
          tag = tags[i];
          proto = $.prototypeForTagFunction.call$1(tag);
          if (proto != null) {
            record = A.makeDefaultDispatchRecord(tag, map[tag], proto);
            if (record != null) {
              Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
              fun.prototype = proto;
            }
          }
        }
      }
      for (i = 0; i < tags.length; ++i) {
        tag = tags[i];
        if (/^[A-Za-z_]/.test(tag)) {
          interceptorClass = map[tag];
          map["!" + tag] = interceptorClass;
          map["~" + tag] = interceptorClass;
          map["-" + tag] = interceptorClass;
          map["+" + tag] = interceptorClass;
          map["*" + tag] = interceptorClass;
        }
      }
    },
    initHooks() {
      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
        hooks = B.C_JS_CONST0();
      hooks = A.applyHooksTransformer(B.C_JS_CONST1, A.applyHooksTransformer(B.C_JS_CONST2, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST4, A.applyHooksTransformer(B.C_JS_CONST5, A.applyHooksTransformer(B.C_JS_CONST6(B.C_JS_CONST), hooks)))))));
      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
        transformers = dartNativeDispatchHooksTransformer;
        if (typeof transformers == "function")
          transformers = [transformers];
        if (Array.isArray(transformers))
          for (i = 0; i < transformers.length; ++i) {
            transformer = transformers[i];
            if (typeof transformer == "function")
              hooks = transformer(hooks) || hooks;
          }
      }
      getTag = hooks.getTag;
      getUnknownTag = hooks.getUnknownTag;
      prototypeForTag = hooks.prototypeForTag;
      $.getTagFunction = new A.initHooks_closure(getTag);
      $.alternateTagFunction = new A.initHooks_closure0(getUnknownTag);
      $.prototypeForTagFunction = new A.initHooks_closure1(prototypeForTag);
    },
    applyHooksTransformer(transformer, hooks) {
      return transformer(hooks) || hooks;
    },
    createRecordTypePredicate(shape, fieldRtis) {
      var $length = fieldRtis.length,
        $function = init.rttc["" + $length + ";" + shape];
      if ($function == null)
        return null;
      if ($length === 0)
        return $function;
      if ($length === $function.length)
        return $function.apply(null, fieldRtis);
      return $function(fieldRtis);
    },
    JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, unicode, dotAll, global) {
      var m = multiLine ? "m" : "",
        i = caseSensitive ? "" : "i",
        u = unicode ? "u" : "",
        s = dotAll ? "s" : "",
        g = global ? "g" : "",
        regexp = function(source, modifiers) {
          try {
            return new RegExp(source, modifiers);
          } catch (e) {
            return e;
          }
        }(source, m + i + u + s + g);
      if (regexp instanceof RegExp)
        return regexp;
      throw A.wrapException(A.FormatException$("Illegal RegExp pattern (" + String(regexp) + ")", source, null));
    },
    stringContainsUnchecked(receiver, other, startIndex) {
      var t1;
      if (typeof other == "string")
        return receiver.indexOf(other, startIndex) >= 0;
      else if (other instanceof A.JSSyntaxRegExp) {
        t1 = B.JSString_methods.substring$1(receiver, startIndex);
        return other._nativeRegExp.test(t1);
      } else {
        t1 = J.allMatches$1$s(other, B.JSString_methods.substring$1(receiver, startIndex));
        return !t1.get$isEmpty(t1);
      }
    },
    quoteStringForRegExp(string) {
      if (/[[\]{}()*+?.\\^$|]/.test(string))
        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
      return string;
    },
    stringReplaceRangeUnchecked(receiver, start, end, replacement) {
      return receiver.substring(0, start) + replacement + receiver.substring(end);
    },
    _Record_2: function _Record_2(t0, t1) {
      this._0 = t0;
      this._1 = t1;
    },
    ConstantMapView: function ConstantMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ConstantMap: function ConstantMap() {
    },
    ConstantMap_map_closure: function ConstantMap_map_closure(t0, t1, t2) {
      this.$this = t0;
      this.transform = t1;
      this.result = t2;
    },
    ConstantStringMap: function ConstantStringMap(t0, t1, t2) {
      this._jsIndex = t0;
      this._values = t1;
      this.$ti = t2;
    },
    _KeysOrValues: function _KeysOrValues(t0, t1) {
      this._elements = t0;
      this.$ti = t1;
    },
    _KeysOrValuesOrElementsIterator: function _KeysOrValuesOrElementsIterator(t0, t1, t2) {
      var _ = this;
      _._elements = t0;
      _.__js_helper$_length = t1;
      _.__js_helper$_index = 0;
      _.__js_helper$_current = null;
      _.$ti = t2;
    },
    JSInvocationMirror: function JSInvocationMirror(t0, t1, t2, t3, t4) {
      var _ = this;
      _._memberName = t0;
      _.__js_helper$_kind = t1;
      _._arguments = t2;
      _._namedArgumentNames = t3;
      _._typeArgumentCount = t4;
    },
    Primitives_functionNoSuchMethod_closure: function Primitives_functionNoSuchMethod_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.namedArgumentList = t1;
      this.$arguments = t2;
    },
    TypeErrorDecoder: function TypeErrorDecoder(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._pattern = t0;
      _._arguments = t1;
      _._argumentsExpr = t2;
      _._expr = t3;
      _._method = t4;
      _._receiver = t5;
    },
    NullError: function NullError() {
    },
    JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
      this.__js_helper$_message = t0;
      this._method = t1;
      this._receiver = t2;
    },
    UnknownJsTypeError: function UnknownJsTypeError(t0) {
      this.__js_helper$_message = t0;
    },
    NullThrownFromJavaScriptException: function NullThrownFromJavaScriptException(t0) {
      this._irritant = t0;
    },
    ExceptionAndStackTrace: function ExceptionAndStackTrace(t0, t1) {
      this.dartException = t0;
      this.stackTrace = t1;
    },
    _StackTrace: function _StackTrace(t0) {
      this._exception = t0;
      this._trace = null;
    },
    Closure: function Closure() {
    },
    Closure0Args: function Closure0Args() {
    },
    Closure2Args: function Closure2Args() {
    },
    TearOffClosure: function TearOffClosure() {
    },
    StaticClosure: function StaticClosure() {
    },
    BoundClosure: function BoundClosure(t0, t1) {
      this._receiver = t0;
      this._interceptor = t1;
    },
    _CyclicInitializationError: function _CyclicInitializationError(t0) {
      this.variableName = t0;
    },
    RuntimeError: function RuntimeError(t0) {
      this.message = t0;
    },
    _AssertionError: function _AssertionError(t0) {
      this.message = t0;
    },
    _Required: function _Required() {
    },
    JsLinkedHashMap: function JsLinkedHashMap(t0) {
      var _ = this;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
      _._modifications = 0;
      _.$ti = t0;
    },
    JsLinkedHashMap_addAll_closure: function JsLinkedHashMap_addAll_closure(t0) {
      this.$this = t0;
    },
    LinkedHashMapCell: function LinkedHashMapCell(t0, t1) {
      var _ = this;
      _.hashMapCellKey = t0;
      _.hashMapCellValue = t1;
      _._previous = _._next = null;
    },
    LinkedHashMapKeyIterable: function LinkedHashMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._map = t0;
      _._modifications = t1;
      _.__js_helper$_current = _._cell = null;
      _.$ti = t2;
    },
    initHooks_closure: function initHooks_closure(t0) {
      this.getTag = t0;
    },
    initHooks_closure0: function initHooks_closure0(t0) {
      this.getUnknownTag = t0;
    },
    initHooks_closure1: function initHooks_closure1(t0) {
      this.prototypeForTag = t0;
    },
    _Record: function _Record() {
    },
    _Record2: function _Record2() {
    },
    JSSyntaxRegExp: function JSSyntaxRegExp(t0, t1) {
      var _ = this;
      _.pattern = t0;
      _._nativeRegExp = t1;
      _._nativeAnchoredRegExp = _._nativeGlobalRegExp = null;
    },
    _MatchImplementation: function _MatchImplementation(t0) {
      this._match = t0;
    },
    _AllMatchesIterable: function _AllMatchesIterable(t0, t1, t2) {
      this._re = t0;
      this._string = t1;
      this._start = t2;
    },
    _AllMatchesIterator: function _AllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._regExp = t0;
      _._string = t1;
      _._nextIndex = t2;
      _.__js_helper$_current = null;
    },
    StringMatch: function StringMatch(t0, t1) {
      this.start = t0;
      this.pattern = t1;
    },
    _StringAllMatchesIterable: function _StringAllMatchesIterable(t0, t1, t2) {
      this._input = t0;
      this._pattern = t1;
      this.__js_helper$_index = t2;
    },
    _StringAllMatchesIterator: function _StringAllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._input = t0;
      _._pattern = t1;
      _.__js_helper$_index = t2;
      _.__js_helper$_current = null;
    },
    throwLateFieldNI(fieldName) {
      A.throwExpressionWithWrapper(new A.LateError("Field '" + fieldName + "' has not been initialized."), new Error());
    },
    throwLateFieldAI(fieldName) {
      A.throwExpressionWithWrapper(new A.LateError("Field '" + fieldName + "' has already been initialized."), new Error());
    },
    throwLateFieldADI(fieldName) {
      A.throwExpressionWithWrapper(new A.LateError("Field '" + fieldName + string$.__has_), new Error());
    },
    _Cell$named(_name) {
      var t1 = new A._Cell(_name);
      return t1.__late_helper$_value = t1;
    },
    _InitializedCell$named(_name, _initializer) {
      var t1 = new A._InitializedCell(_name, _initializer);
      return t1.__late_helper$_value = t1;
    },
    _Cell: function _Cell(t0) {
      this.__late_helper$_name = t0;
      this.__late_helper$_value = null;
    },
    _InitializedCell: function _InitializedCell(t0, t1) {
      this.__late_helper$_name = t0;
      this.__late_helper$_value = null;
      this._initializer = t1;
    },
    _ensureNativeList(list) {
      return list;
    },
    NativeInt8List__create1(arg) {
      return new Int8Array(arg);
    },
    NativeUint8List_NativeUint8List($length) {
      return new Uint8Array($length);
    },
    NativeUint8List_NativeUint8List$view(buffer, offsetInBytes, $length) {
      return $length == null ? new Uint8Array(buffer, offsetInBytes) : new Uint8Array(buffer, offsetInBytes, $length);
    },
    _checkValidIndex(index, list, $length) {
      if (index >>> 0 !== index || index >= $length)
        throw A.wrapException(A.diagnoseIndexError(list, index));
    },
    _checkValidRange(start, end, $length) {
      var t1;
      if (!(start >>> 0 !== start))
        if (end == null)
          t1 = start > $length;
        else
          t1 = end >>> 0 !== end || start > end || end > $length;
      else
        t1 = true;
      if (t1)
        throw A.wrapException(A.diagnoseRangeError(start, end, $length));
      if (end == null)
        return $length;
      return end;
    },
    NativeByteBuffer: function NativeByteBuffer() {
    },
    NativeTypedData: function NativeTypedData() {
    },
    NativeByteData: function NativeByteData() {
    },
    NativeTypedArray: function NativeTypedArray() {
    },
    NativeTypedArrayOfDouble: function NativeTypedArrayOfDouble() {
    },
    NativeTypedArrayOfInt: function NativeTypedArrayOfInt() {
    },
    NativeFloat32List: function NativeFloat32List() {
    },
    NativeFloat64List: function NativeFloat64List() {
    },
    NativeInt16List: function NativeInt16List() {
    },
    NativeInt32List: function NativeInt32List() {
    },
    NativeInt8List: function NativeInt8List() {
    },
    NativeUint16List: function NativeUint16List() {
    },
    NativeUint32List: function NativeUint32List() {
    },
    NativeUint8ClampedList: function NativeUint8ClampedList() {
    },
    NativeUint8List: function NativeUint8List() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    Rti__getQuestionFromStar(universe, rti) {
      var question = rti._precomputed1;
      return question == null ? rti._precomputed1 = A._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
    },
    Rti__getFutureFromFutureOr(universe, rti) {
      var future = rti._precomputed1;
      return future == null ? rti._precomputed1 = A._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
    },
    Rti__getIsSubtypeCache(rti) {
      var probe = rti._isSubtypeCache;
      if (probe != null)
        return probe;
      return rti._isSubtypeCache = new Map();
    },
    Rti__isUnionOfFunctionType(rti) {
      var kind = rti._kind;
      if (kind === 6 || kind === 7 || kind === 8)
        return A.Rti__isUnionOfFunctionType(rti._primary);
      return kind === 12 || kind === 13;
    },
    Rti__getCanonicalRecipe(rti) {
      return rti._canonicalRecipe;
    },
    findType(recipe) {
      return A._Universe_eval(init.typeUniverse, recipe, false);
    },
    _substitute(universe, rti, typeArguments, depth) {
      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, returnType, substitutedReturnType, functionParameters, substitutedFunctionParameters, bounds, substitutedBounds, index, argument,
        kind = rti._kind;
      switch (kind) {
        case 5:
        case 1:
        case 2:
        case 3:
        case 4:
          return rti;
        case 6:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupStarRti(universe, substitutedBaseType, true);
        case 7:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
        case 8:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
        case 9:
          interfaceTypeArguments = rti._rest;
          substitutedInterfaceTypeArguments = A._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
            return rti;
          return A._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
        case 10:
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          $arguments = rti._rest;
          substitutedArguments = A._substituteArray(universe, $arguments, typeArguments, depth);
          if (substitutedBase === base && substitutedArguments === $arguments)
            return rti;
          return A._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
        case 12:
          returnType = rti._primary;
          substitutedReturnType = A._substitute(universe, returnType, typeArguments, depth);
          functionParameters = rti._rest;
          substitutedFunctionParameters = A._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
            return rti;
          return A._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
        case 13:
          bounds = rti._rest;
          depth += bounds.length;
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, depth);
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          if (substitutedBounds === bounds && substitutedBase === base)
            return rti;
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
        case 14:
          index = rti._primary;
          if (index < depth)
            return rti;
          argument = typeArguments[index - depth];
          if (argument == null)
            return rti;
          return argument;
        default:
          throw A.wrapException(A.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
      }
    },
    _substituteArray(universe, rtiArray, typeArguments, depth) {
      var changed, i, rti, substitutedRti,
        $length = rtiArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; ++i) {
        rti = rtiArray[i];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result[i] = substitutedRti;
      }
      return changed ? result : rtiArray;
    },
    _substituteNamed(universe, namedArray, typeArguments, depth) {
      var changed, i, t1, t2, rti, substitutedRti,
        $length = namedArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; i += 3) {
        t1 = namedArray[i];
        t2 = namedArray[i + 1];
        rti = namedArray[i + 2];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.splice(i, 3, t1, t2, substitutedRti);
      }
      return changed ? result : namedArray;
    },
    _substituteFunctionParameters(universe, functionParameters, typeArguments, depth) {
      var result,
        requiredPositional = functionParameters._requiredPositional,
        substitutedRequiredPositional = A._substituteArray(universe, requiredPositional, typeArguments, depth),
        optionalPositional = functionParameters._optionalPositional,
        substitutedOptionalPositional = A._substituteArray(universe, optionalPositional, typeArguments, depth),
        named = functionParameters._named,
        substitutedNamed = A._substituteNamed(universe, named, typeArguments, depth);
      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
        return functionParameters;
      result = new A._FunctionParameters();
      result._requiredPositional = substitutedRequiredPositional;
      result._optionalPositional = substitutedOptionalPositional;
      result._named = substitutedNamed;
      return result;
    },
    _setArrayType(target, rti) {
      target[init.arrayRti] = rti;
      return target;
    },
    closureFunctionType(closure) {
      var t1,
        signature = closure.$signature;
      if (signature != null) {
        if (typeof signature == "number")
          return A.getTypeFromTypesTable(signature);
        t1 = closure.$signature();
        return t1;
      }
      return null;
    },
    instanceOrFunctionType(object, testRti) {
      var rti;
      if (A.Rti__isUnionOfFunctionType(testRti))
        if (object instanceof A.Closure) {
          rti = A.closureFunctionType(object);
          if (rti != null)
            return rti;
        }
      return A.instanceType(object);
    },
    instanceType(object) {
      if (object instanceof A.Object)
        return A._instanceType(object);
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A._instanceTypeFromConstructor(J.getInterceptor$(object));
    },
    _arrayInstanceType(object) {
      var rti = object[init.arrayRti],
        defaultRti = type$.JSArray_dynamic;
      if (rti == null)
        return defaultRti;
      if (rti.constructor !== defaultRti.constructor)
        return defaultRti;
      return rti;
    },
    _instanceType(object) {
      var rti = object.$ti;
      return rti != null ? rti : A._instanceTypeFromConstructor(object);
    },
    _instanceTypeFromConstructor(instance) {
      var $constructor = instance.constructor,
        probe = $constructor.$ccache;
      if (probe != null)
        return probe;
      return A._instanceTypeFromConstructorMiss(instance, $constructor);
    },
    _instanceTypeFromConstructorMiss(instance, $constructor) {
      var effectiveConstructor = instance instanceof A.Closure ? Object.getPrototypeOf(Object.getPrototypeOf(instance)).constructor : $constructor,
        rti = A._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
      $constructor.$ccache = rti;
      return rti;
    },
    getTypeFromTypesTable(index) {
      var rti,
        table = init.types,
        type = table[index];
      if (typeof type == "string") {
        rti = A._Universe_eval(init.typeUniverse, type, false);
        table[index] = rti;
        return rti;
      }
      return type;
    },
    getRuntimeTypeOfDartObject(object) {
      return A.createRuntimeType(A._instanceType(object));
    },
    _structuralTypeOf(object) {
      var functionRti;
      if (object instanceof A._Record)
        return object._getRti$0();
      functionRti = object instanceof A.Closure ? A.closureFunctionType(object) : null;
      if (functionRti != null)
        return functionRti;
      if (type$.TrustedGetRuntimeType._is(object))
        return J.get$runtimeType$(object)._rti;
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A.instanceType(object);
    },
    createRuntimeType(rti) {
      var t1 = rti._cachedRuntimeType;
      return t1 == null ? rti._cachedRuntimeType = A._createRuntimeType(rti) : t1;
    },
    _createRuntimeType(rti) {
      var starErasedRti, t1,
        s = rti._canonicalRecipe,
        starErasedRecipe = s.replace(/\*/g, "");
      if (starErasedRecipe === s)
        return rti._cachedRuntimeType = new A._Type(rti);
      starErasedRti = A._Universe_eval(init.typeUniverse, starErasedRecipe, true);
      t1 = starErasedRti._cachedRuntimeType;
      return t1 == null ? starErasedRti._cachedRuntimeType = A._createRuntimeType(starErasedRti) : t1;
    },
    evaluateRtiForRecord(recordRecipe, valuesList) {
      var bindings, i,
        values = valuesList,
        $length = values.length;
      if ($length === 0)
        return type$.Record_0;
      if (0 >= $length)
        return A.ioore(values, 0);
      bindings = A._Universe_evalInEnvironment(init.typeUniverse, A._structuralTypeOf(values[0]), "@<0>");
      for (i = 1; i < $length; ++i) {
        if (!(i < values.length))
          return A.ioore(values, i);
        bindings = A._Universe_bind(init.typeUniverse, bindings, A._structuralTypeOf(values[i]));
      }
      return A._Universe_evalInEnvironment(init.typeUniverse, bindings, recordRecipe);
    },
    typeLiteral(recipe) {
      return A.createRuntimeType(A._Universe_eval(init.typeUniverse, recipe, false));
    },
    _installSpecializedIsTest(object) {
      var t1, unstarred, unstarredKind, isFn, $name, predicate, testRti = this;
      if (testRti === type$.Object)
        return A._finishIsFn(testRti, object, A._isObject);
      if (!A.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return A._finishIsFn(testRti, object, A._isTop);
      t1 = testRti._kind;
      if (t1 === 7)
        return A._finishIsFn(testRti, object, A._generalNullableIsTestImplementation);
      if (t1 === 1)
        return A._finishIsFn(testRti, object, A._isNever);
      unstarred = t1 === 6 ? testRti._primary : testRti;
      unstarredKind = unstarred._kind;
      if (unstarredKind === 8)
        return A._finishIsFn(testRti, object, A._isFutureOr);
      if (unstarred === type$.int)
        isFn = A._isInt;
      else if (unstarred === type$.double || unstarred === type$.num)
        isFn = A._isNum;
      else if (unstarred === type$.String)
        isFn = A._isString;
      else
        isFn = unstarred === type$.bool ? A._isBool : null;
      if (isFn != null)
        return A._finishIsFn(testRti, object, isFn);
      if (unstarredKind === 9) {
        $name = unstarred._primary;
        if (unstarred._rest.every(A.isTopType)) {
          testRti._specializedTestResource = "$is" + $name;
          if ($name === "List")
            return A._finishIsFn(testRti, object, A._isListTestViaProperty);
          return A._finishIsFn(testRti, object, A._isTestViaProperty);
        }
      } else if (unstarredKind === 11) {
        predicate = A.createRecordTypePredicate(unstarred._primary, unstarred._rest);
        return A._finishIsFn(testRti, object, predicate == null ? A._isNever : predicate);
      }
      return A._finishIsFn(testRti, object, A._generalIsTestImplementation);
    },
    _finishIsFn(testRti, object, isFn) {
      testRti._is = isFn;
      return testRti._is(object);
    },
    _installSpecializedAsCheck(object) {
      var t1, testRti = this,
        asFn = A._generalAsCheckImplementation;
      if (!A.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        asFn = A._asTop;
      else if (testRti === type$.Object)
        asFn = A._asObject;
      else {
        t1 = A.isNullable(testRti);
        if (t1)
          asFn = A._generalNullableAsCheckImplementation;
      }
      testRti._as = asFn;
      return testRti._as(object);
    },
    _nullIs(testRti) {
      var t1,
        kind = testRti._kind;
      if (!A.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          if (!(testRti === type$.legacy_Never))
            if (kind !== 7)
              if (!(kind === 6 && A._nullIs(testRti._primary)))
                t1 = kind === 8 && A._nullIs(testRti._primary) || testRti === type$.Null || testRti === type$.JSNull;
              else
                t1 = true;
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    _generalIsTestImplementation(object) {
      var testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      return A.isSubtype(init.typeUniverse, A.instanceOrFunctionType(object, testRti), testRti);
    },
    _generalNullableIsTestImplementation(object) {
      if (object == null)
        return true;
      return this._primary._is(object);
    },
    _isTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _isListTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      if (typeof object != "object")
        return false;
      if (Array.isArray(object))
        return true;
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _generalAsCheckImplementation(object) {
      var t1, testRti = this;
      if (object == null) {
        t1 = A.isNullable(testRti);
        if (t1)
          return object;
      } else if (testRti._is(object))
        return object;
      A._failedAsCheck(object, testRti);
    },
    _generalNullableAsCheckImplementation(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      A._failedAsCheck(object, testRti);
    },
    _failedAsCheck(object, testRti) {
      throw A.wrapException(A._TypeError$fromMessage(A._Error_compose(object, A._rtiToString(testRti, null))));
    },
    checkTypeBound(type, bound, variable, methodName) {
      if (A.isSubtype(init.typeUniverse, type, bound))
        return type;
      throw A.wrapException(A._TypeError$fromMessage("The type argument '" + A._rtiToString(type, null) + "' is not a subtype of the type variable bound '" + A._rtiToString(bound, null) + "' of type variable '" + variable + "' in '" + methodName + "'."));
    },
    _Error_compose(object, checkedTypeDescription) {
      return A.Error_safeToString(object) + ": type '" + A._rtiToString(A._structuralTypeOf(object), null) + "' is not a subtype of type '" + checkedTypeDescription + "'";
    },
    _TypeError$fromMessage(message) {
      return new A._TypeError("TypeError: " + message);
    },
    _TypeError__TypeError$forType(object, type) {
      return new A._TypeError("TypeError: " + A._Error_compose(object, type));
    },
    _isFutureOr(object) {
      var testRti = this,
        unstarred = testRti._kind === 6 ? testRti._primary : testRti;
      return unstarred._primary._is(object) || A.Rti__getFutureFromFutureOr(init.typeUniverse, unstarred)._is(object);
    },
    _isObject(object) {
      return object != null;
    },
    _asObject(object) {
      if (object != null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "Object"));
    },
    _isTop(object) {
      return true;
    },
    _asTop(object) {
      return object;
    },
    _isNever(object) {
      return false;
    },
    _isBool(object) {
      return true === object || false === object;
    },
    _asBool(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolS(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolQ(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool?"));
    },
    _asDouble(object) {
      if (typeof object == "number")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleS(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double?"));
    },
    _isInt(object) {
      return typeof object == "number" && Math.floor(object) === object;
    },
    _asInt(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int"));
    },
    _asIntS(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int"));
    },
    _asIntQ(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int?"));
    },
    _isNum(object) {
      return typeof object == "number";
    },
    _asNum(object) {
      if (typeof object == "number")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num"));
    },
    _asNumS(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num"));
    },
    _asNumQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num?"));
    },
    _isString(object) {
      return typeof object == "string";
    },
    _asString(object) {
      if (typeof object == "string")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String"));
    },
    _asStringS(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String"));
    },
    _asStringQ(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String?"));
    },
    _rtiArrayToString(array, genericContext) {
      var s, sep, i;
      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
        s += sep + A._rtiToString(array[i], genericContext);
      return s;
    },
    _recordRtiToString(recordType, genericContext) {
      var fieldCount, names, namesIndex, s, comma, i,
        partialShape = recordType._primary,
        fields = recordType._rest;
      if ("" === partialShape)
        return "(" + A._rtiArrayToString(fields, genericContext) + ")";
      fieldCount = fields.length;
      names = partialShape.split(",");
      namesIndex = names.length - fieldCount;
      for (s = "(", comma = "", i = 0; i < fieldCount; ++i, comma = ", ") {
        s += comma;
        if (namesIndex === 0)
          s += "{";
        s += A._rtiToString(fields[i], genericContext);
        if (namesIndex >= 0)
          s += " " + names[namesIndex];
        ++namesIndex;
      }
      return s + "})";
    },
    _functionRtiToString(functionType, genericContext, bounds) {
      var boundsLength, outerContextLength, offset, i, t1, t2, typeParametersText, typeSep, t3, t4, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
      if (bounds != null) {
        boundsLength = bounds.length;
        if (genericContext == null) {
          genericContext = A._setArrayType([], type$.JSArray_String);
          outerContextLength = null;
        } else
          outerContextLength = genericContext.length;
        offset = genericContext.length;
        for (i = boundsLength; i > 0; --i)
          B.JSArray_methods.add$1(genericContext, "T" + (offset + i));
        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
          t3 = genericContext.length;
          t4 = t3 - 1 - i;
          if (!(t4 >= 0))
            return A.ioore(genericContext, t4);
          typeParametersText = B.JSString_methods.$add(typeParametersText + typeSep, genericContext[t4]);
          boundRti = bounds[i];
          kind = boundRti._kind;
          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
            if (!(boundRti === t2))
              t3 = false;
            else
              t3 = true;
          else
            t3 = true;
          if (!t3)
            typeParametersText += " extends " + A._rtiToString(boundRti, genericContext);
        }
        typeParametersText += ">";
      } else {
        typeParametersText = "";
        outerContextLength = null;
      }
      t1 = functionType._primary;
      parameters = functionType._rest;
      requiredPositional = parameters._requiredPositional;
      requiredPositionalLength = requiredPositional.length;
      optionalPositional = parameters._optionalPositional;
      optionalPositionalLength = optionalPositional.length;
      named = parameters._named;
      namedLength = named.length;
      returnTypeText = A._rtiToString(t1, genericContext);
      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
        argumentsText += sep + A._rtiToString(requiredPositional[i], genericContext);
      if (optionalPositionalLength > 0) {
        argumentsText += sep + "[";
        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
          argumentsText += sep + A._rtiToString(optionalPositional[i], genericContext);
        argumentsText += "]";
      }
      if (namedLength > 0) {
        argumentsText += sep + "{";
        for (sep = "", i = 0; i < namedLength; i += 3, sep = _s2_) {
          argumentsText += sep;
          if (named[i + 1])
            argumentsText += "required ";
          argumentsText += A._rtiToString(named[i + 2], genericContext) + " " + named[i];
        }
        argumentsText += "}";
      }
      if (outerContextLength != null) {
        genericContext.toString;
        genericContext.length = outerContextLength;
      }
      return typeParametersText + "(" + argumentsText + ") => " + returnTypeText;
    },
    _rtiToString(rti, genericContext) {
      var s, questionArgument, argumentKind, $name, $arguments, t1, t2,
        kind = rti._kind;
      if (kind === 5)
        return "erased";
      if (kind === 2)
        return "dynamic";
      if (kind === 3)
        return "void";
      if (kind === 1)
        return "Never";
      if (kind === 4)
        return "any";
      if (kind === 6) {
        s = A._rtiToString(rti._primary, genericContext);
        return s;
      }
      if (kind === 7) {
        questionArgument = rti._primary;
        s = A._rtiToString(questionArgument, genericContext);
        argumentKind = questionArgument._kind;
        return (argumentKind === 12 || argumentKind === 13 ? "(" + s + ")" : s) + "?";
      }
      if (kind === 8)
        return "FutureOr<" + A._rtiToString(rti._primary, genericContext) + ">";
      if (kind === 9) {
        $name = A._unminifyOrTag(rti._primary);
        $arguments = rti._rest;
        return $arguments.length > 0 ? $name + ("<" + A._rtiArrayToString($arguments, genericContext) + ">") : $name;
      }
      if (kind === 11)
        return A._recordRtiToString(rti, genericContext);
      if (kind === 12)
        return A._functionRtiToString(rti, genericContext, null);
      if (kind === 13)
        return A._functionRtiToString(rti._primary, genericContext, rti._rest);
      if (kind === 14) {
        t1 = rti._primary;
        t2 = genericContext.length;
        t1 = t2 - 1 - t1;
        if (!(t1 >= 0 && t1 < t2))
          return A.ioore(genericContext, t1);
        return genericContext[t1];
      }
      return "?";
    },
    _unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    _Universe_findRule(universe, targetType) {
      var rule = universe.tR[targetType];
      for (; typeof rule == "string";)
        rule = universe.tR[rule];
      return rule;
    },
    _Universe_findErasedType(universe, cls) {
      var $length, erased, $arguments, i, $interface,
        t1 = universe.eT,
        probe = t1[cls];
      if (probe == null)
        return A._Universe_eval(universe, cls, false);
      else if (typeof probe == "number") {
        $length = probe;
        erased = A._Universe__lookupTerminalRti(universe, 5, "#");
        $arguments = A._Utils_newArrayOrEmpty($length);
        for (i = 0; i < $length; ++i)
          $arguments[i] = erased;
        $interface = A._Universe__lookupInterfaceRti(universe, cls, $arguments);
        t1[cls] = $interface;
        return $interface;
      } else
        return probe;
    },
    _Universe_addRules(universe, rules) {
      return A._Utils_objectAssign(universe.tR, rules);
    },
    _Universe_addErasedTypes(universe, types) {
      return A._Utils_objectAssign(universe.eT, types);
    },
    _Universe_eval(universe, recipe, normalize) {
      var rti,
        t1 = universe.eC,
        probe = t1.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, null, recipe, normalize));
      t1.set(recipe, rti);
      return rti;
    },
    _Universe_evalInEnvironment(universe, environment, recipe) {
      var probe, rti,
        cache = environment._evalCache;
      if (cache == null)
        cache = environment._evalCache = new Map();
      probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, environment, recipe, true));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_bind(universe, environment, argumentsRti) {
      var argumentsRecipe, probe, rti,
        cache = environment._bindCache;
      if (cache == null)
        cache = environment._bindCache = new Map();
      argumentsRecipe = argumentsRti._canonicalRecipe;
      probe = cache.get(argumentsRecipe);
      if (probe != null)
        return probe;
      rti = A._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
      cache.set(argumentsRecipe, rti);
      return rti;
    },
    _Universe__installTypeTests(universe, rti) {
      rti._as = A._installSpecializedAsCheck;
      rti._is = A._installSpecializedIsTest;
      return rti;
    },
    _Universe__lookupTerminalRti(universe, kind, key) {
      var rti, t1,
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = kind;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupStarRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "*",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createStarRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createStarRti(universe, baseType, key, normalize) {
      var baseKind, t1, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!A.isStrongTopType(baseType))
          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
        else
          t1 = true;
        if (t1)
          return baseType;
      }
      rti = new A.Rti(null, null);
      rti._kind = 6;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupQuestionRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "?",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createQuestionRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createQuestionRti(universe, baseType, key, normalize) {
      var baseKind, t1, starArgument, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!A.isStrongTopType(baseType))
          if (!(baseType === type$.Null || baseType === type$.JSNull))
            if (baseKind !== 7)
              t1 = baseKind === 8 && A.isNullable(baseType._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
        if (t1)
          return baseType;
        else if (baseKind === 1 || baseType === type$.legacy_Never)
          return type$.Null;
        else if (baseKind === 6) {
          starArgument = baseType._primary;
          if (starArgument._kind === 8 && A.isNullable(starArgument._primary))
            return starArgument;
          else
            return A.Rti__getQuestionFromStar(universe, baseType);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 7;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupFutureOrRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "/",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createFutureOrRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createFutureOrRti(universe, baseType, key, normalize) {
      var t1, t2, rti;
      if (normalize) {
        t1 = baseType._kind;
        if (!A.isStrongTopType(baseType))
          if (!(baseType === type$.legacy_Object))
            t2 = false;
          else
            t2 = true;
        else
          t2 = true;
        if (t2 || baseType === type$.Object)
          return baseType;
        else if (t1 === 1)
          return A._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
        else if (baseType === type$.Null || baseType === type$.JSNull)
          return type$.nullable_Future_Null;
      }
      rti = new A.Rti(null, null);
      rti._kind = 8;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupGenericFunctionParameterRti(universe, index) {
      var rti, t1,
        key = "" + index + "^",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 14;
      rti._primary = index;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__canonicalRecipeJoin($arguments) {
      var s, sep, i,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; ++i, sep = ",")
        s += sep + $arguments[i]._canonicalRecipe;
      return s;
    },
    _Universe__canonicalRecipeJoinNamed($arguments) {
      var s, sep, i, t1, nameSep,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
        t1 = $arguments[i];
        nameSep = $arguments[i + 1] ? "!" : ":";
        s += sep + t1 + nameSep + $arguments[i + 2]._canonicalRecipe;
      }
      return s;
    },
    _Universe__lookupInterfaceRti(universe, $name, $arguments) {
      var probe, rti, t1,
        s = $name;
      if ($arguments.length > 0)
        s += "<" + A._Universe__canonicalRecipeJoin($arguments) + ">";
      probe = universe.eC.get(s);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 9;
      rti._primary = $name;
      rti._rest = $arguments;
      if ($arguments.length > 0)
        rti._precomputed1 = $arguments[0];
      rti._canonicalRecipe = s;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(s, t1);
      return t1;
    },
    _Universe__lookupBindingRti(universe, base, $arguments) {
      var newBase, newArguments, key, probe, rti, t1;
      if (base._kind === 10) {
        newBase = base._primary;
        newArguments = base._rest.concat($arguments);
      } else {
        newArguments = $arguments;
        newBase = base;
      }
      key = newBase._canonicalRecipe + (";<" + A._Universe__canonicalRecipeJoin(newArguments) + ">");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 10;
      rti._primary = newBase;
      rti._rest = newArguments;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupRecordRti(universe, partialShapeTag, fields) {
      var rti, t1,
        key = "+" + (partialShapeTag + "(" + A._Universe__canonicalRecipeJoin(fields) + ")"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 11;
      rti._primary = partialShapeTag;
      rti._rest = fields;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupFunctionRti(universe, returnType, parameters) {
      var sep, key, probe, rti, t1,
        s = returnType._canonicalRecipe,
        requiredPositional = parameters._requiredPositional,
        requiredPositionalLength = requiredPositional.length,
        optionalPositional = parameters._optionalPositional,
        optionalPositionalLength = optionalPositional.length,
        named = parameters._named,
        namedLength = named.length,
        recipe = "(" + A._Universe__canonicalRecipeJoin(requiredPositional);
      if (optionalPositionalLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        recipe += sep + "[" + A._Universe__canonicalRecipeJoin(optionalPositional) + "]";
      }
      if (namedLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        recipe += sep + "{" + A._Universe__canonicalRecipeJoinNamed(named) + "}";
      }
      key = s + (recipe + ")");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 12;
      rti._primary = returnType;
      rti._rest = parameters;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupGenericFunctionRti(universe, baseFunctionType, bounds, normalize) {
      var t1,
        key = baseFunctionType._canonicalRecipe + ("<" + A._Universe__canonicalRecipeJoin(bounds) + ">"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize) {
      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
      if (normalize) {
        $length = bounds.length;
        typeArguments = A._Utils_newArrayOrEmpty($length);
        for (count = 0, i = 0; i < $length; ++i) {
          bound = bounds[i];
          if (bound._kind === 1) {
            typeArguments[i] = bound;
            ++count;
          }
        }
        if (count > 0) {
          substitutedBase = A._substitute(universe, baseFunctionType, typeArguments, 0);
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, 0);
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 13;
      rti._primary = baseFunctionType;
      rti._rest = bounds;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Parser_create(universe, environment, recipe, normalize) {
      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
    },
    _Parser_parse(parser) {
      var t2, i, ch, t3, array, end, item,
        source = parser.r,
        t1 = parser.s;
      for (t2 = source.length, i = 0; i < t2;) {
        ch = source.charCodeAt(i);
        if (ch >= 48 && ch <= 57)
          i = A._Parser_handleDigit(i + 1, ch, source, t1);
        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36 || ch === 124)
          i = A._Parser_handleIdentifier(parser, i, source, t1, false);
        else if (ch === 46)
          i = A._Parser_handleIdentifier(parser, i, source, t1, true);
        else {
          ++i;
          switch (ch) {
            case 44:
              break;
            case 58:
              t1.push(false);
              break;
            case 33:
              t1.push(true);
              break;
            case 59:
              t1.push(A._Parser_toType(parser.u, parser.e, t1.pop()));
              break;
            case 94:
              t1.push(A._Universe__lookupGenericFunctionParameterRti(parser.u, t1.pop()));
              break;
            case 35:
              t1.push(A._Universe__lookupTerminalRti(parser.u, 5, "#"));
              break;
            case 64:
              t1.push(A._Universe__lookupTerminalRti(parser.u, 2, "@"));
              break;
            case 126:
              t1.push(A._Universe__lookupTerminalRti(parser.u, 3, "~"));
              break;
            case 60:
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 62:
              A._Parser_handleTypeArguments(parser, t1);
              break;
            case 38:
              A._Parser_handleExtendedOperations(parser, t1);
              break;
            case 42:
              t3 = parser.u;
              t1.push(A._Universe__lookupStarRti(t3, A._Parser_toType(t3, parser.e, t1.pop()), parser.n));
              break;
            case 63:
              t3 = parser.u;
              t1.push(A._Universe__lookupQuestionRti(t3, A._Parser_toType(t3, parser.e, t1.pop()), parser.n));
              break;
            case 47:
              t3 = parser.u;
              t1.push(A._Universe__lookupFutureOrRti(t3, A._Parser_toType(t3, parser.e, t1.pop()), parser.n));
              break;
            case 40:
              t1.push(-3);
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 41:
              A._Parser_handleArguments(parser, t1);
              break;
            case 91:
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 93:
              array = t1.splice(parser.p);
              A._Parser_toTypes(parser.u, parser.e, array);
              parser.p = t1.pop();
              t1.push(array);
              t1.push(-1);
              break;
            case 123:
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 125:
              array = t1.splice(parser.p);
              A._Parser_toTypesNamed(parser.u, parser.e, array);
              parser.p = t1.pop();
              t1.push(array);
              t1.push(-2);
              break;
            case 43:
              end = source.indexOf("(", i);
              t1.push(source.substring(i, end));
              t1.push(-4);
              t1.push(parser.p);
              parser.p = t1.length;
              i = end + 1;
              break;
            default:
              throw "Bad character " + ch;
          }
        }
      }
      item = t1.pop();
      return A._Parser_toType(parser.u, parser.e, item);
    },
    _Parser_handleDigit(i, digit, source, stack) {
      var t1, ch,
        value = digit - 48;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (!(ch >= 48 && ch <= 57))
          break;
        value = value * 10 + (ch - 48);
      }
      stack.push(value);
      return i;
    },
    _Parser_handleIdentifier(parser, start, source, stack, hasPeriod) {
      var t1, ch, t2, string, environment, recipe,
        i = start + 1;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (ch === 46) {
          if (hasPeriod)
            break;
          hasPeriod = true;
        } else {
          if (!((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36 || ch === 124))
            t2 = ch >= 48 && ch <= 57;
          else
            t2 = true;
          if (!t2)
            break;
        }
      }
      string = source.substring(start, i);
      if (hasPeriod) {
        t1 = parser.u;
        environment = parser.e;
        if (environment._kind === 10)
          environment = environment._primary;
        recipe = A._Universe_findRule(t1, environment._primary)[string];
        if (recipe == null)
          A.throwExpression('No "' + string + '" in "' + A.Rti__getCanonicalRecipe(environment) + '"');
        stack.push(A._Universe_evalInEnvironment(t1, environment, recipe));
      } else
        stack.push(string);
      return i;
    },
    _Parser_handleTypeArguments(parser, stack) {
      var base,
        t1 = parser.u,
        $arguments = A._Parser_collectArray(parser, stack),
        head = stack.pop();
      if (typeof head == "string")
        stack.push(A._Universe__lookupInterfaceRti(t1, head, $arguments));
      else {
        base = A._Parser_toType(t1, parser.e, head);
        switch (base._kind) {
          case 12:
            stack.push(A._Universe__lookupGenericFunctionRti(t1, base, $arguments, parser.n));
            break;
          default:
            stack.push(A._Universe__lookupBindingRti(t1, base, $arguments));
            break;
        }
      }
    },
    _Parser_handleArguments(parser, stack) {
      var optionalPositional, named, requiredPositional, returnType, parameters, _null = null,
        t1 = parser.u,
        head = stack.pop();
      if (typeof head == "number")
        switch (head) {
          case -1:
            optionalPositional = stack.pop();
            named = _null;
            break;
          case -2:
            named = stack.pop();
            optionalPositional = _null;
            break;
          default:
            stack.push(head);
            named = _null;
            optionalPositional = named;
            break;
        }
      else {
        stack.push(head);
        named = _null;
        optionalPositional = named;
      }
      requiredPositional = A._Parser_collectArray(parser, stack);
      head = stack.pop();
      switch (head) {
        case -3:
          head = stack.pop();
          if (optionalPositional == null)
            optionalPositional = t1.sEA;
          if (named == null)
            named = t1.sEA;
          returnType = A._Parser_toType(t1, parser.e, head);
          parameters = new A._FunctionParameters();
          parameters._requiredPositional = requiredPositional;
          parameters._optionalPositional = optionalPositional;
          parameters._named = named;
          stack.push(A._Universe__lookupFunctionRti(t1, returnType, parameters));
          return;
        case -4:
          stack.push(A._Universe__lookupRecordRti(t1, stack.pop(), requiredPositional));
          return;
        default:
          throw A.wrapException(A.AssertionError$("Unexpected state under `()`: " + A.S(head)));
      }
    },
    _Parser_handleExtendedOperations(parser, stack) {
      var $top = stack.pop();
      if (0 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 1, "0&"));
        return;
      }
      if (1 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 4, "1&"));
        return;
      }
      throw A.wrapException(A.AssertionError$("Unexpected extended operation " + A.S($top)));
    },
    _Parser_collectArray(parser, stack) {
      var array = stack.splice(parser.p);
      A._Parser_toTypes(parser.u, parser.e, array);
      parser.p = stack.pop();
      return array;
    },
    _Parser_toType(universe, environment, item) {
      if (typeof item == "string")
        return A._Universe__lookupInterfaceRti(universe, item, universe.sEA);
      else if (typeof item == "number") {
        environment.toString;
        return A._Parser_indexToType(universe, environment, item);
      } else
        return item;
    },
    _Parser_toTypes(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 0; i < $length; ++i)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_toTypesNamed(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 2; i < $length; i += 3)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_indexToType(universe, environment, index) {
      var typeArguments, len,
        kind = environment._kind;
      if (kind === 10) {
        if (index === 0)
          return environment._primary;
        typeArguments = environment._rest;
        len = typeArguments.length;
        if (index <= len)
          return typeArguments[index - 1];
        index -= len;
        environment = environment._primary;
        kind = environment._kind;
      } else if (index === 0)
        return environment;
      if (kind !== 9)
        throw A.wrapException(A.AssertionError$("Indexed base must be an interface type"));
      typeArguments = environment._rest;
      if (index <= typeArguments.length)
        return typeArguments[index - 1];
      throw A.wrapException(A.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
    },
    isSubtype(universe, s, t) {
      var result,
        sCache = A.Rti__getIsSubtypeCache(s),
        probe = sCache.get(t);
      if (probe != null)
        return probe;
      result = A._isSubtype(universe, s, null, t, null);
      sCache.set(t, result);
      return result;
    },
    _isSubtype(universe, s, sEnv, t, tEnv) {
      var t1, sKind, leftTypeVariable, tKind, t2, sBounds, tBounds, sLength, i, sBound, tBound;
      if (s === t)
        return true;
      if (!A.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return true;
      sKind = s._kind;
      if (sKind === 4)
        return true;
      if (A.isStrongTopType(s))
        return false;
      if (s._kind !== 1)
        t1 = false;
      else
        t1 = true;
      if (t1)
        return true;
      leftTypeVariable = sKind === 14;
      if (leftTypeVariable)
        if (A._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
          return true;
      tKind = t._kind;
      t1 = s === type$.Null || s === type$.JSNull;
      if (t1) {
        if (tKind === 8)
          return A._isSubtype(universe, s, sEnv, t._primary, tEnv);
        return t === type$.Null || t === type$.JSNull || tKind === 7 || tKind === 6;
      }
      if (t === type$.Object) {
        if (sKind === 8)
          return A._isSubtype(universe, s._primary, sEnv, t, tEnv);
        if (sKind === 6)
          return A._isSubtype(universe, s._primary, sEnv, t, tEnv);
        return sKind !== 7;
      }
      if (sKind === 6)
        return A._isSubtype(universe, s._primary, sEnv, t, tEnv);
      if (tKind === 6) {
        t1 = A.Rti__getQuestionFromStar(universe, t);
        return A._isSubtype(universe, s, sEnv, t1, tEnv);
      }
      if (sKind === 8) {
        if (!A._isSubtype(universe, s._primary, sEnv, t, tEnv))
          return false;
        return A._isSubtype(universe, A.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
      }
      if (sKind === 7) {
        t1 = A._isSubtype(universe, type$.Null, sEnv, t, tEnv);
        return t1 && A._isSubtype(universe, s._primary, sEnv, t, tEnv);
      }
      if (tKind === 8) {
        if (A._isSubtype(universe, s, sEnv, t._primary, tEnv))
          return true;
        return A._isSubtype(universe, s, sEnv, A.Rti__getFutureFromFutureOr(universe, t), tEnv);
      }
      if (tKind === 7) {
        t1 = A._isSubtype(universe, s, sEnv, type$.Null, tEnv);
        return t1 || A._isSubtype(universe, s, sEnv, t._primary, tEnv);
      }
      if (leftTypeVariable)
        return false;
      t1 = sKind !== 12;
      if ((!t1 || sKind === 13) && t === type$.Function)
        return true;
      t2 = sKind === 11;
      if (t2 && t === type$.Record)
        return true;
      if (tKind === 13) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (sKind !== 13)
          return false;
        sBounds = s._rest;
        tBounds = t._rest;
        sLength = sBounds.length;
        if (sLength !== tBounds.length)
          return false;
        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
        for (i = 0; i < sLength; ++i) {
          sBound = sBounds[i];
          tBound = tBounds[i];
          if (!A._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !A._isSubtype(universe, tBound, tEnv, sBound, sEnv))
            return false;
        }
        return A._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
      }
      if (tKind === 12) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (t1)
          return false;
        return A._isFunctionSubtype(universe, s, sEnv, t, tEnv);
      }
      if (sKind === 9) {
        if (tKind !== 9)
          return false;
        return A._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
      }
      if (t2 && tKind === 11)
        return A._isRecordSubtype(universe, s, sEnv, t, tEnv);
      return false;
    },
    _isFunctionSubtype(universe, s, sEnv, t, tEnv) {
      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName, sIsRequired;
      if (!A._isSubtype(universe, s._primary, sEnv, t._primary, tEnv))
        return false;
      sParameters = s._rest;
      tParameters = t._rest;
      sRequiredPositional = sParameters._requiredPositional;
      tRequiredPositional = tParameters._requiredPositional;
      sRequiredPositionalLength = sRequiredPositional.length;
      tRequiredPositionalLength = tRequiredPositional.length;
      if (sRequiredPositionalLength > tRequiredPositionalLength)
        return false;
      requiredPositionalDelta = tRequiredPositionalLength - sRequiredPositionalLength;
      sOptionalPositional = sParameters._optionalPositional;
      tOptionalPositional = tParameters._optionalPositional;
      sOptionalPositionalLength = sOptionalPositional.length;
      tOptionalPositionalLength = tOptionalPositional.length;
      if (sRequiredPositionalLength + sOptionalPositionalLength < tRequiredPositionalLength + tOptionalPositionalLength)
        return false;
      for (i = 0; i < sRequiredPositionalLength; ++i) {
        t1 = sRequiredPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < requiredPositionalDelta; ++i) {
        t1 = sOptionalPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < tOptionalPositionalLength; ++i) {
        t1 = sOptionalPositional[requiredPositionalDelta + i];
        if (!A._isSubtype(universe, tOptionalPositional[i], tEnv, t1, sEnv))
          return false;
      }
      sNamed = sParameters._named;
      tNamed = tParameters._named;
      sNamedLength = sNamed.length;
      tNamedLength = tNamed.length;
      for (sIndex = 0, tIndex = 0; tIndex < tNamedLength; tIndex += 3) {
        tName = tNamed[tIndex];
        for (; true;) {
          if (sIndex >= sNamedLength)
            return false;
          sName = sNamed[sIndex];
          sIndex += 3;
          if (tName < sName)
            return false;
          sIsRequired = sNamed[sIndex - 2];
          if (sName < tName) {
            if (sIsRequired)
              return false;
            continue;
          }
          t1 = tNamed[tIndex + 1];
          if (sIsRequired && !t1)
            return false;
          t1 = sNamed[sIndex - 1];
          if (!A._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
            return false;
          break;
        }
      }
      for (; sIndex < sNamedLength;) {
        if (sNamed[sIndex + 1])
          return false;
        sIndex += 3;
      }
      return true;
    },
    _isInterfaceSubtype(universe, s, sEnv, t, tEnv) {
      var rule, recipes, $length, supertypeArgs, i, t1, t2,
        sName = s._primary,
        tName = t._primary;
      for (; sName !== tName;) {
        rule = universe.tR[sName];
        if (rule == null)
          return false;
        if (typeof rule == "string") {
          sName = rule;
          continue;
        }
        recipes = rule[tName];
        if (recipes == null)
          return false;
        $length = recipes.length;
        supertypeArgs = $length > 0 ? new Array($length) : init.typeUniverse.sEA;
        for (i = 0; i < $length; ++i)
          supertypeArgs[i] = A._Universe_evalInEnvironment(universe, s, recipes[i]);
        return A._areArgumentsSubtypes(universe, supertypeArgs, null, sEnv, t._rest, tEnv);
      }
      t1 = s._rest;
      t2 = t._rest;
      return A._areArgumentsSubtypes(universe, t1, null, sEnv, t2, tEnv);
    },
    _areArgumentsSubtypes(universe, sArgs, sVariances, sEnv, tArgs, tEnv) {
      var i, t1, t2,
        $length = sArgs.length;
      for (i = 0; i < $length; ++i) {
        t1 = sArgs[i];
        t2 = tArgs[i];
        if (!A._isSubtype(universe, t1, sEnv, t2, tEnv))
          return false;
      }
      return true;
    },
    _isRecordSubtype(universe, s, sEnv, t, tEnv) {
      var i,
        sFields = s._rest,
        tFields = t._rest,
        sCount = sFields.length;
      if (sCount !== tFields.length)
        return false;
      if (s._primary !== t._primary)
        return false;
      for (i = 0; i < sCount; ++i)
        if (!A._isSubtype(universe, sFields[i], sEnv, tFields[i], tEnv))
          return false;
      return true;
    },
    isNullable(t) {
      var t1,
        kind = t._kind;
      if (!(t === type$.Null || t === type$.JSNull))
        if (!A.isStrongTopType(t))
          if (kind !== 7)
            if (!(kind === 6 && A.isNullable(t._primary)))
              t1 = kind === 8 && A.isNullable(t._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isTopType(t) {
      var t1;
      if (!A.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isStrongTopType(t) {
      var kind = t._kind;
      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
    },
    _Utils_objectAssign(o, other) {
      var i, key,
        keys = Object.keys(other),
        $length = keys.length;
      for (i = 0; i < $length; ++i) {
        key = keys[i];
        o[key] = other[key];
      }
    },
    _Utils_newArrayOrEmpty($length) {
      return $length > 0 ? new Array($length) : init.typeUniverse.sEA;
    },
    Rti: function Rti(t0, t1) {
      var _ = this;
      _._as = t0;
      _._is = t1;
      _._cachedRuntimeType = _._specializedTestResource = _._unsoundIsSubtypeCache = _._isSubtypeCache = _._precomputed1 = null;
      _._kind = 0;
      _._canonicalRecipe = _._bindCache = _._evalCache = _._rest = _._primary = null;
    },
    _FunctionParameters: function _FunctionParameters() {
      this._named = this._optionalPositional = this._requiredPositional = null;
    },
    _Type: function _Type(t0) {
      this._rti = t0;
    },
    _Error: function _Error() {
    },
    _TypeError: function _TypeError(t0) {
      this.__rti$_message = t0;
    },
    _AsyncRun__initializeScheduleImmediate() {
      var div, span, t1 = {};
      if (self.scheduleImmediate != null)
        return A.async__AsyncRun__scheduleImmediateJsOverride$closure();
      if (self.MutationObserver != null && self.document != null) {
        div = self.document.createElement("div");
        span = self.document.createElement("span");
        t1.storedCallback = null;
        new self.MutationObserver(A.convertDartClosureToJS(new A._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
        return new A._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
      } else if (self.setImmediate != null)
        return A.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
      return A.async__AsyncRun__scheduleImmediateWithTimer$closure();
    },
    _AsyncRun__scheduleImmediateJsOverride(callback) {
      self.scheduleImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithSetImmediate(callback) {
      self.setImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithTimer(callback) {
      A.Timer__createTimer(B.Duration_0, type$.void_Function._as(callback));
    },
    Timer__createTimer(duration, callback) {
      var milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _TimerImpl$(milliseconds, callback) {
      var t1 = new A._TimerImpl(true);
      t1._TimerImpl$2(milliseconds, callback);
      return t1;
    },
    _TimerImpl$periodic(milliseconds, callback) {
      var t1 = new A._TimerImpl(false);
      t1._TimerImpl$periodic$2(milliseconds, callback);
      return t1;
    },
    _makeAsyncAwaitCompleter($T) {
      return new A._AsyncAwaitCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
    },
    _asyncStartSync(bodyFunction, completer) {
      bodyFunction.call$2(0, null);
      completer.isSync = true;
      return completer._future;
    },
    _asyncAwait(object, bodyFunction) {
      A._awaitOnObject(object, bodyFunction);
    },
    _asyncReturn(object, completer) {
      completer.complete$1(0, object);
    },
    _asyncRethrow(object, completer) {
      completer.completeError$2(A.unwrapException(object), A.getTraceFromException(object));
    },
    _awaitOnObject(object, bodyFunction) {
      var t1, future,
        thenCallback = new A._awaitOnObject_closure(bodyFunction),
        errorCallback = new A._awaitOnObject_closure0(bodyFunction);
      if (object instanceof A._Future)
        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
      else {
        t1 = type$.dynamic;
        if (object instanceof A._Future)
          object.then$1$2$onError(0, thenCallback, errorCallback, t1);
        else {
          future = new A._Future($.Zone__current, type$._Future_dynamic);
          future._state = 8;
          future._resultOrListeners = object;
          future._thenAwait$1$2(thenCallback, errorCallback, t1);
        }
      }
    },
    _wrapJsFunctionForAsync($function) {
      var $protected = function(fn, ERROR) {
        return function(errorCode, result) {
          while (true)
            try {
              fn(errorCode, result);
              break;
            } catch (error) {
              result = error;
              errorCode = ERROR;
            }
        };
      }($function, 1);
      return $.Zone__current.registerBinaryCallback$3$1(new A._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
    },
    AsyncError$(error, stackTrace) {
      var t1 = A.checkNotNullable(error, "error", type$.Object);
      return new A.AsyncError(t1, stackTrace == null ? A.AsyncError_defaultStackTrace(error) : stackTrace);
    },
    AsyncError_defaultStackTrace(error) {
      var stackTrace;
      if (type$.Error._is(error)) {
        stackTrace = error.get$stackTrace();
        if (stackTrace != null)
          return stackTrace;
      }
      return B._StringStackTrace_3uE;
    },
    Future_Future$microtask(computation, $T) {
      var result = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      A.scheduleMicrotask(new A.Future_Future$microtask_closure(result, computation));
      return result;
    },
    Future_Future$sync(computation, $T) {
      var result, error, stackTrace, future, replacement, t1, exception;
      try {
        result = computation.call$0();
        if ($T._eval$1("Future<0>")._is(result))
          return result;
        else {
          t1 = A._Future$value(result, $T);
          return t1;
        }
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1 = $.Zone__current;
        future = new A._Future(t1, $T._eval$1("_Future<0>"));
        replacement = t1.errorCallback$2(error, stackTrace);
        if (replacement != null)
          future._asyncCompleteError$2(replacement.error, replacement.stackTrace);
        else
          future._asyncCompleteError$2(error, stackTrace);
        return future;
      }
    },
    Future_Future$value(value, $T) {
      var t1 = value == null ? $T._as(value) : value,
        t2 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      t2._asyncComplete$1(t1);
      return t2;
    },
    Completer_Completer($T) {
      return new A._AsyncCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncCompleter<0>"));
    },
    _completeWithErrorCallback(result, error, stackTrace) {
      var replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      result._completeError$2(error, stackTrace);
    },
    _Future$value(value, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      $T._as(value);
      t1._state = 8;
      t1._resultOrListeners = value;
      return t1;
    },
    _Future__chainCoreFutureSync(source, target) {
      var t1, t2, listeners;
      for (t1 = type$._Future_dynamic; t2 = source._state, (t2 & 4) !== 0;)
        source = t1._as(source._resultOrListeners);
      if ((t2 & 24) !== 0) {
        listeners = target._removeListeners$0();
        target._cloneResult$1(source);
        A._Future__propagateToListeners(target, listeners);
      } else {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._setChained$1(source);
        source._prependListeners$1(listeners);
      }
    },
    _Future__chainCoreFutureAsync(source, target) {
      var t2, t3, listeners, _box_0 = {},
        t1 = _box_0.source = source;
      for (t2 = type$._Future_dynamic; t3 = t1._state, (t3 & 4) !== 0; t1 = source) {
        source = t2._as(t1._resultOrListeners);
        _box_0.source = source;
      }
      if ((t3 & 24) === 0) {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._setChained$1(t1);
        _box_0.source._prependListeners$1(listeners);
        return;
      }
      if ((t3 & 16) === 0 && target._resultOrListeners == null) {
        target._cloneResult$1(t1);
        return;
      }
      target._state ^= 2;
      target._zone.scheduleMicrotask$1(new A._Future__chainCoreFutureAsync_closure(_box_0, target));
    },
    _Future__propagateToListeners(source, listeners) {
      var t2, t3, t4, _box_0, t5, t6, hasError, asyncError, nextListener, nextListener0, sourceResult, t7, zone, oldZone, result, current, _box_1 = {},
        t1 = _box_1.source = source;
      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic, t4 = type$.Future_dynamic; true;) {
        _box_0 = {};
        t5 = t1._state;
        t6 = (t5 & 16) === 0;
        hasError = !t6;
        if (listeners == null) {
          if (hasError && (t5 & 1) === 0) {
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        _box_0.listener = listeners;
        nextListener = listeners._nextListener;
        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
          t1._nextListener = null;
          A._Future__propagateToListeners(_box_1.source, t1);
          _box_0.listener = nextListener;
          nextListener0 = nextListener._nextListener;
        }
        t5 = _box_1.source;
        sourceResult = t5._resultOrListeners;
        _box_0.listenerHasError = hasError;
        _box_0.listenerValueOrError = sourceResult;
        if (t6) {
          t7 = t1.state;
          t7 = (t7 & 1) !== 0 || (t7 & 15) === 8;
        } else
          t7 = true;
        if (t7) {
          zone = t1.result._zone;
          if (hasError) {
            t1 = t5._zone;
            t1 = !(t1 === zone || t1.get$errorZone() === zone.get$errorZone());
          } else
            t1 = false;
          if (t1) {
            t1 = _box_1.source;
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
            return;
          }
          oldZone = $.Zone__current;
          if (oldZone !== zone)
            $.Zone__current = zone;
          else
            oldZone = null;
          t1 = _box_0.listener.state;
          if ((t1 & 15) === 8)
            new A._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
          else if (t6) {
            if ((t1 & 1) !== 0)
              new A._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
          } else if ((t1 & 2) !== 0)
            new A._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
          if (oldZone != null)
            $.Zone__current = oldZone;
          t1 = _box_0.listenerValueOrError;
          if (t1 instanceof A._Future) {
            t5 = _box_0.listener.$ti;
            t5 = t5._eval$1("Future<2>")._is(t1) || !t5._rest[1]._is(t1);
          } else
            t5 = false;
          if (t5) {
            t4._as(t1);
            result = _box_0.listener.result;
            if ((t1._state & 24) !== 0) {
              current = t3._as(result._resultOrListeners);
              result._resultOrListeners = null;
              listeners = result._reverseListeners$1(current);
              result._state = t1._state & 30 | result._state & 1;
              result._resultOrListeners = t1._resultOrListeners;
              _box_1.source = t1;
              continue;
            } else
              A._Future__chainCoreFutureSync(t1, result);
            return;
          }
        }
        result = _box_0.listener.result;
        current = t3._as(result._resultOrListeners);
        result._resultOrListeners = null;
        listeners = result._reverseListeners$1(current);
        t1 = _box_0.listenerHasError;
        t5 = _box_0.listenerValueOrError;
        if (!t1) {
          result.$ti._precomputed1._as(t5);
          result._state = 8;
          result._resultOrListeners = t5;
        } else {
          t2._as(t5);
          result._state = result._state & 1 | 16;
          result._resultOrListeners = t5;
        }
        _box_1.source = result;
        t1 = result;
      }
    },
    _registerErrorHandler(errorHandler, zone) {
      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.dynamic_Function_Object._is(errorHandler))
        return zone.registerUnaryCallback$2$1(errorHandler, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$value(errorHandler, "onError", string$.Error_));
    },
    _microtaskLoop() {
      var entry, next;
      for (entry = $._nextCallback; entry != null; entry = $._nextCallback) {
        $._lastPriorityCallback = null;
        next = entry.next;
        $._nextCallback = next;
        if (next == null)
          $._lastCallback = null;
        entry.callback.call$0();
      }
    },
    _startMicrotaskLoop() {
      $._isInCallbackLoop = true;
      try {
        A._microtaskLoop();
      } finally {
        $._lastPriorityCallback = null;
        $._isInCallbackLoop = false;
        if ($._nextCallback != null)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      }
    },
    _scheduleAsyncCallback(callback) {
      var newEntry = new A._AsyncCallbackEntry(callback),
        lastCallback = $._lastCallback;
      if (lastCallback == null) {
        $._nextCallback = $._lastCallback = newEntry;
        if (!$._isInCallbackLoop)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      } else
        $._lastCallback = lastCallback.next = newEntry;
    },
    _schedulePriorityAsyncCallback(callback) {
      var entry, lastPriorityCallback, next,
        t1 = $._nextCallback;
      if (t1 == null) {
        A._scheduleAsyncCallback(callback);
        $._lastPriorityCallback = $._lastCallback;
        return;
      }
      entry = new A._AsyncCallbackEntry(callback);
      lastPriorityCallback = $._lastPriorityCallback;
      if (lastPriorityCallback == null) {
        entry.next = t1;
        $._nextCallback = $._lastPriorityCallback = entry;
      } else {
        next = lastPriorityCallback.next;
        entry.next = next;
        $._lastPriorityCallback = lastPriorityCallback.next = entry;
        if (next == null)
          $._lastCallback = entry;
      }
    },
    scheduleMicrotask(callback) {
      var t1, _null = null,
        currentZone = $.Zone__current;
      if (B.C__RootZone === currentZone) {
        A._rootScheduleMicrotask(_null, _null, B.C__RootZone, callback);
        return;
      }
      if (B.C__RootZone === currentZone.get$_scheduleMicrotask().zone)
        t1 = B.C__RootZone.get$errorZone() === currentZone.get$errorZone();
      else
        t1 = false;
      if (t1) {
        A._rootScheduleMicrotask(_null, _null, currentZone, currentZone.registerCallback$1$1(callback, type$.void));
        return;
      }
      t1 = $.Zone__current;
      t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback));
    },
    StreamIterator_StreamIterator(stream, $T) {
      A.checkNotNullable(stream, "stream", type$.Object);
      return new A._StreamIterator($T._eval$1("_StreamIterator<0>"));
    },
    StreamController_StreamController(onCancel, onListen, sync, $T) {
      var _null = null;
      return sync ? new A._SyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_SyncStreamController<0>")) : new A._AsyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_AsyncStreamController<0>"));
    },
    _runGuarded(notificationHandler) {
      var e, s, exception;
      if (notificationHandler == null)
        return;
      try {
        notificationHandler.call$0();
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current.handleUncaughtError$2(e, s);
      }
    },
    _BufferingStreamSubscription__registerDataHandler(zone, handleData, $T) {
      var t1 = handleData == null ? A.async___nullDataHandler$closure() : handleData;
      return zone.registerUnaryCallback$2$1(t1, type$.void, $T);
    },
    _BufferingStreamSubscription__registerErrorHandler(zone, handleError) {
      if (handleError == null)
        handleError = A.async___nullErrorHandler$closure();
      if (type$.void_Function_Object_StackTrace._is(handleError))
        return zone.registerBinaryCallback$3$1(handleError, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.void_Function_Object._is(handleError))
        return zone.registerUnaryCallback$2$1(handleError, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace.", null));
    },
    _nullDataHandler(value) {
    },
    _nullErrorHandler(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      $.Zone__current.handleUncaughtError$2(error, stackTrace);
    },
    _nullDoneHandler() {
    },
    _cancelAndValue(subscription, future, value) {
      var cancelFuture = subscription.cancel$0(0),
        t1 = $.$get$Future__nullFuture();
      if (cancelFuture !== t1)
        cancelFuture.whenComplete$1(new A._cancelAndValue_closure(future, value));
      else
        future._complete$1(value);
    },
    Timer_Timer(duration, callback) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return t1.createTimer$2(duration, callback);
      return t1.createTimer$2(duration, t1.bindCallbackGuarded$1(callback));
    },
    ZoneSpecification_ZoneSpecification$from(other, handleUncaughtError) {
      var t1 = handleUncaughtError == null ? other.handleUncaughtError : handleUncaughtError;
      return new A._ZoneSpecification(t1, other.run, other.runUnary, other.runBinary, other.registerCallback, other.registerUnaryCallback, other.registerBinaryCallback, other.errorCallback, other.scheduleMicrotask, other.createTimer, other.createPeriodicTimer, other.print, other.fork);
    },
    _rootHandleUncaughtError($self, $parent, zone, error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    _rootHandleError(error, stackTrace) {
      A._schedulePriorityAsyncCallback(new A._rootHandleError_closure(error, stackTrace));
    },
    _rootRun($self, $parent, zone, f, $R) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("0()")._as(f);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$0();
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$0();
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunUnary($self, $parent, zone, f, arg, $R, $T) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$1(arg);
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$1(arg);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunBinary($self, $parent, zone, f, arg1, arg2, $R, T1, T2) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$2(arg1, arg2);
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$2(arg1, arg2);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRegisterCallback($self, $parent, zone, f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    _rootRegisterUnaryCallback($self, $parent, zone, f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    _rootRegisterBinaryCallback($self, $parent, zone, f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    _rootErrorCallback($self, $parent, zone, error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    _rootScheduleMicrotask($self, $parent, zone, f) {
      var t1, t2;
      type$.void_Function._as(f);
      if (B.C__RootZone !== zone) {
        t1 = B.C__RootZone.get$errorZone();
        t2 = zone.get$errorZone();
        f = t1 !== t2 ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
      }
      A._scheduleAsyncCallback(f);
    },
    _rootCreateTimer($self, $parent, zone, duration, callback) {
      type$.Duration._as(duration);
      type$.void_Function._as(callback);
      return A.Timer__createTimer(duration, B.C__RootZone !== zone ? zone.bindCallback$1$1(callback, type$.void) : callback);
    },
    _rootCreatePeriodicTimer($self, $parent, zone, duration, callback) {
      var milliseconds;
      type$.Duration._as(duration);
      type$.void_Function_Timer._as(callback);
      if (B.C__RootZone !== zone)
        callback = zone.bindUnaryCallback$2$1(callback, type$.void, type$.Timer);
      milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$periodic(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _rootPrint($self, $parent, zone, line) {
      A.printString(A._asString(line));
    },
    _printToZone(line) {
      $.Zone__current.print$1(0, line);
    },
    _rootFork($self, $parent, zone, specification, zoneValues) {
      var valueMap, t1, handleUncaughtError;
      type$.nullable_ZoneSpecification._as(specification);
      type$.nullable_Map_of_nullable_Object_and_nullable_Object._as(zoneValues);
      $.printToZone = A.async___printToZone$closure();
      valueMap = zone.get$_async$_map();
      t1 = new A._CustomZone(zone.get$_run(), zone.get$_runUnary(), zone.get$_runBinary(), zone.get$_registerCallback(), zone.get$_registerUnaryCallback(), zone.get$_registerBinaryCallback(), zone.get$_errorCallback(), zone.get$_scheduleMicrotask(), zone.get$_createTimer(), zone.get$_createPeriodicTimer(), zone.get$_print(), zone.get$_fork(), zone.get$_handleUncaughtError(), zone, valueMap);
      handleUncaughtError = specification.handleUncaughtError;
      if (handleUncaughtError != null)
        t1.set$_handleUncaughtError(new A._ZoneFunction(t1, handleUncaughtError, type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace));
      return t1;
    },
    runZonedGuarded(body, onError, $R) {
      var error, stackTrace, parentZone, errorHandler, t1, exception, _null = null, zoneSpecification = null, zoneValues = null;
      A.checkNotNullable(body, "body", $R._eval$1("0()"));
      A.checkNotNullable(onError, "onError", type$.void_Function_Object_StackTrace);
      parentZone = $.Zone__current;
      errorHandler = new A.runZonedGuarded_closure(parentZone, onError);
      if (zoneSpecification == null)
        zoneSpecification = new A._ZoneSpecification(errorHandler, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null);
      else
        zoneSpecification = A.ZoneSpecification_ZoneSpecification$from(zoneSpecification, errorHandler);
      try {
        t1 = parentZone.fork$2$specification$zoneValues(zoneSpecification, zoneValues).run$1$1(body, $R);
        return t1;
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        onError.call$2(error, stackTrace);
      }
      return _null;
    },
    _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
      this._box_0 = t0;
    },
    _AsyncRun__initializeScheduleImmediate_closure: function _AsyncRun__initializeScheduleImmediate_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.div = t1;
      this.span = t2;
    },
    _AsyncRun__scheduleImmediateJsOverride_internalCallback: function _AsyncRun__scheduleImmediateJsOverride_internalCallback(t0) {
      this.callback = t0;
    },
    _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: function _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(t0) {
      this.callback = t0;
    },
    _TimerImpl: function _TimerImpl(t0) {
      this._once = t0;
      this._handle = null;
      this._tick = 0;
    },
    _TimerImpl_internalCallback: function _TimerImpl_internalCallback(t0, t1) {
      this.$this = t0;
      this.callback = t1;
    },
    _TimerImpl$periodic_closure: function _TimerImpl$periodic_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.milliseconds = t1;
      _.start = t2;
      _.callback = t3;
    },
    _AsyncAwaitCompleter: function _AsyncAwaitCompleter(t0, t1) {
      this._future = t0;
      this.isSync = false;
      this.$ti = t1;
    },
    _awaitOnObject_closure: function _awaitOnObject_closure(t0) {
      this.bodyFunction = t0;
    },
    _awaitOnObject_closure0: function _awaitOnObject_closure0(t0) {
      this.bodyFunction = t0;
    },
    _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {
      this.$protected = t0;
    },
    AsyncError: function AsyncError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    Future_Future$microtask_closure: function Future_Future$microtask_closure(t0, t1) {
      this.result = t0;
      this.computation = t1;
    },
    _Completer: function _Completer() {
    },
    _AsyncCompleter: function _AsyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _SyncCompleter: function _SyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _FutureListener: function _FutureListener(t0, t1, t2, t3, t4) {
      var _ = this;
      _._nextListener = null;
      _.result = t0;
      _.state = t1;
      _.callback = t2;
      _.errorCallback = t3;
      _.$ti = t4;
    },
    _Future: function _Future(t0, t1) {
      var _ = this;
      _._state = 0;
      _._zone = t0;
      _._resultOrListeners = null;
      _.$ti = t1;
    },
    _Future__addListener_closure: function _Future__addListener_closure(t0, t1) {
      this.$this = t0;
      this.listener = t1;
    },
    _Future__prependListeners_closure: function _Future__prependListeners_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _Future__chainForeignFuture_closure: function _Future__chainForeignFuture_closure(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure0: function _Future__chainForeignFuture_closure0(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure1: function _Future__chainForeignFuture_closure1(t0, t1, t2) {
      this.$this = t0;
      this.e = t1;
      this.s = t2;
    },
    _Future__chainCoreFutureAsync_closure: function _Future__chainCoreFutureAsync_closure(t0, t1) {
      this._box_0 = t0;
      this.target = t1;
    },
    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__asyncCompleteError_closure: function _Future__asyncCompleteError_closure(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2) {
      this._box_0 = t0;
      this._box_1 = t1;
      this.hasError = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback_closure: function _Future__propagateToListeners_handleWhenCompleteCallback_closure(t0) {
      this.originalSource = t0;
    },
    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1) {
      this._box_0 = t0;
      this.sourceResult = t1;
    },
    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1) {
      this._box_1 = t0;
      this._box_0 = t1;
    },
    _Future_timeout_closure: function _Future_timeout_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _._future = t1;
      _.zone = t2;
      _.onTimeoutHandler = t3;
    },
    _Future_timeout_closure0: function _Future_timeout_closure0(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this._future = t2;
    },
    _Future_timeout_closure1: function _Future_timeout_closure1(t0, t1) {
      this._box_0 = t0;
      this._future = t1;
    },
    _AsyncCallbackEntry: function _AsyncCallbackEntry(t0) {
      this.callback = t0;
      this.next = null;
    },
    Stream: function Stream() {
    },
    Stream_length_closure: function Stream_length_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    Stream_length_closure0: function Stream_length_closure0(t0, t1) {
      this._box_0 = t0;
      this.future = t1;
    },
    Stream_first_closure: function Stream_first_closure(t0) {
      this.future = t0;
    },
    Stream_first_closure0: function Stream_first_closure0(t0, t1, t2) {
      this.$this = t0;
      this.subscription = t1;
      this.future = t2;
    },
    _StreamController: function _StreamController() {
    },
    _StreamController__subscribe_closure: function _StreamController__subscribe_closure(t0) {
      this.$this = t0;
    },
    _StreamController__recordCancel_complete: function _StreamController__recordCancel_complete(t0) {
      this.$this = t0;
    },
    _SyncStreamControllerDispatch: function _SyncStreamControllerDispatch() {
    },
    _AsyncStreamControllerDispatch: function _AsyncStreamControllerDispatch() {
    },
    _AsyncStreamController: function _AsyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _SyncStreamController: function _SyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _ControllerStream: function _ControllerStream(t0, t1) {
      this._controller = t0;
      this.$ti = t1;
    },
    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._controller = t0;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _StreamSinkWrapper: function _StreamSinkWrapper(t0, t1) {
      this._async$_target = t0;
      this.$ti = t1;
    },
    _BufferingStreamSubscription: function _BufferingStreamSubscription() {
    },
    _BufferingStreamSubscription_asFuture_closure: function _BufferingStreamSubscription_asFuture_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture_closure0: function _BufferingStreamSubscription_asFuture_closure0(t0, t1) {
      this.$this = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture__closure: function _BufferingStreamSubscription_asFuture__closure(t0, t1, t2) {
      this.result = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendError_sendError: function _BufferingStreamSubscription__sendError_sendError(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendDone_sendDone: function _BufferingStreamSubscription__sendDone_sendDone(t0) {
      this.$this = t0;
    },
    _StreamImpl: function _StreamImpl() {
    },
    _DelayedEvent: function _DelayedEvent() {
    },
    _DelayedData: function _DelayedData(t0, t1) {
      this.value = t0;
      this.next = null;
      this.$ti = t1;
    },
    _DelayedError: function _DelayedError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
      this.next = null;
    },
    _DelayedDone: function _DelayedDone() {
    },
    _PendingEvents: function _PendingEvents(t0) {
      var _ = this;
      _._state = 0;
      _.lastPendingEvent = _.firstPendingEvent = null;
      _.$ti = t0;
    },
    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
      this.$this = t0;
      this.dispatch = t1;
    },
    _StreamIterator: function _StreamIterator(t0) {
      this.$ti = t0;
    },
    _cancelAndValue_closure: function _cancelAndValue_closure(t0, t1) {
      this.future = t0;
      this.value = t1;
    },
    _ForwardingStream: function _ForwardingStream() {
    },
    _ForwardingStreamSubscription: function _ForwardingStreamSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._stream = t0;
      _._subscription = null;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _MapStream: function _MapStream(t0, t1, t2) {
      this._transform = t0;
      this._source = t1;
      this.$ti = t2;
    },
    _ZoneFunction: function _ZoneFunction(t0, t1, t2) {
      this.zone = t0;
      this.$function = t1;
      this.$ti = t2;
    },
    _ZoneSpecification: function _ZoneSpecification(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.handleUncaughtError = t0;
      _.run = t1;
      _.runUnary = t2;
      _.runBinary = t3;
      _.registerCallback = t4;
      _.registerUnaryCallback = t5;
      _.registerBinaryCallback = t6;
      _.errorCallback = t7;
      _.scheduleMicrotask = t8;
      _.createTimer = t9;
      _.createPeriodicTimer = t10;
      _.print = t11;
      _.fork = t12;
    },
    _ZoneDelegate: function _ZoneDelegate(t0) {
      this._delegationTarget = t0;
    },
    _Zone: function _Zone() {
    },
    _CustomZone: function _CustomZone(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) {
      var _ = this;
      _._run = t0;
      _._runUnary = t1;
      _._runBinary = t2;
      _._registerCallback = t3;
      _._registerUnaryCallback = t4;
      _._registerBinaryCallback = t5;
      _._errorCallback = t6;
      _._scheduleMicrotask = t7;
      _._createTimer = t8;
      _._createPeriodicTimer = t9;
      _._print = t10;
      _._fork = t11;
      _._handleUncaughtError = t12;
      _._delegateCache = null;
      _.parent = t13;
      _._async$_map = t14;
    },
    _CustomZone_bindCallback_closure: function _CustomZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.R = t2;
    },
    _CustomZone_bindUnaryCallback_closure: function _CustomZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.registered = t1;
      _.T = t2;
      _.R = t3;
    },
    _CustomZone_bindCallbackGuarded_closure: function _CustomZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.registered = t1;
    },
    _CustomZone_bindUnaryCallbackGuarded_closure: function _CustomZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.T = t2;
    },
    _rootHandleError_closure: function _rootHandleError_closure(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    _RootZone: function _RootZone() {
    },
    _RootZone_bindCallback_closure: function _RootZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.R = t2;
    },
    _RootZone_bindUnaryCallback_closure: function _RootZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.f = t1;
      _.T = t2;
      _.R = t3;
    },
    _RootZone_bindCallbackGuarded_closure: function _RootZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    _RootZone_bindUnaryCallbackGuarded_closure: function _RootZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.T = t2;
    },
    runZonedGuarded_closure: function runZonedGuarded_closure(t0, t1) {
      this.parentZone = t0;
      this.onError = t1;
    },
    HashMap_HashMap(equals, hashCode, isValidKey, $K, $V) {
      if (isValidKey == null)
        if (hashCode == null) {
          if (equals == null)
            return new A._HashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_HashMap<1,2>"));
          hashCode = A.collection___defaultHashCode$closure();
        } else {
          if (A.core__identityHashCode$closure() === hashCode && A.core__identical$closure() === equals)
            return new A._IdentityHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_IdentityHashMap<1,2>"));
          if (equals == null)
            equals = A.collection___defaultEquals$closure();
        }
      else {
        if (hashCode == null)
          hashCode = A.collection___defaultHashCode$closure();
        if (equals == null)
          equals = A.collection___defaultEquals$closure();
      }
      return A._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
    },
    _HashMap__getTableEntry(table, key) {
      var entry = table[key];
      return entry === table ? null : entry;
    },
    _HashMap__setTableEntry(table, key, value) {
      if (value == null)
        table[key] = table;
      else
        table[key] = value;
    },
    _HashMap__newHashTable() {
      var table = Object.create(null);
      A._HashMap__setTableEntry(table, "<non-identifier-key>", table);
      delete table["<non-identifier-key>"];
      return table;
    },
    _CustomHashMap$(_equals, _hashCode, validKey, $K, $V) {
      var t1 = validKey != null ? validKey : new A._CustomHashMap_closure($K);
      return new A._CustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_CustomHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap($K, $V) {
      return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap$_literal(keyValuePairs, $K, $V) {
      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(A.fillLiteralMap(keyValuePairs, new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
    },
    LinkedHashMap_LinkedHashMap$_empty($K, $V) {
      return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    HashSet_HashSet(equals, hashCode, $E) {
      return new A._HashSet($E._eval$1("_HashSet<0>"));
    },
    _HashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    LinkedHashSet_LinkedHashSet($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    LinkedHashSet_LinkedHashSet$_empty($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    _LinkedHashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    _LinkedHashSetIterator$(_set, _modifications, $E) {
      var t1 = new A._LinkedHashSetIterator(_set, _modifications, $E._eval$1("_LinkedHashSetIterator<0>"));
      t1._collection$_cell = _set._collection$_first;
      return t1;
    },
    _defaultEquals0(a, b) {
      return J.$eq$(a, b);
    },
    _defaultHashCode(a) {
      return J.get$hashCode$(a);
    },
    LinkedHashMap_LinkedHashMap$from(other, $K, $V) {
      var result = A.LinkedHashMap_LinkedHashMap($K, $V);
      other.forEach$1(0, new A.LinkedHashMap_LinkedHashMap$from_closure(result, $K, $V));
      return result;
    },
    LinkedHashSet_LinkedHashSet$from(elements, $E) {
      var t1, _i,
        result = A.LinkedHashSet_LinkedHashSet($E);
      for (t1 = elements.length, _i = 0; _i < elements.length; elements.length === t1 || (0, A.throwConcurrentModificationError)(elements), ++_i)
        result.add$1(0, $E._as(elements[_i]));
      return result;
    },
    ListBase__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    MapBase_mapToString(m) {
      var result, t1 = {};
      if (A.isToStringVisiting(m))
        return "{...}";
      result = new A.StringBuffer("");
      try {
        B.JSArray_methods.add$1($.toStringVisiting, m);
        result._contents += "{";
        t1.first = true;
        J.forEach$1$x(m, new A.MapBase_mapToString_closure(t1, result));
        result._contents += "}";
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      t1 = result._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    ListQueue$($E) {
      return new A.ListQueue(A.List_List$filled(A.ListQueue__calculateCapacity(null), null, false, $E._eval$1("0?")), $E._eval$1("ListQueue<0>"));
    },
    ListQueue__calculateCapacity(initialCapacity) {
      return 8;
    },
    SplayTreeSet$(compare, isValidKey, $E) {
      var t1 = isValidKey == null ? new A.SplayTreeSet_closure($E) : isValidKey;
      return new A.SplayTreeSet(compare, t1, $E._eval$1("SplayTreeSet<0>"));
    },
    _HashMap: function _HashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _IdentityHashMap: function _IdentityHashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _CustomHashMap: function _CustomHashMap(t0, t1, t2, t3) {
      var _ = this;
      _._equals = t0;
      _._hashCode = t1;
      _._validKey = t2;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t3;
    },
    _CustomHashMap_closure: function _CustomHashMap_closure(t0) {
      this.K = t0;
    },
    _HashMapKeyIterable: function _HashMapKeyIterable(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    _HashMapKeyIterator: function _HashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._collection$_map = t0;
      _._keys = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _HashSet: function _HashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_elements = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _HashSetIterator: function _HashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_elements = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedHashSet: function _LinkedHashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _._collection$_modifications = 0;
      _.$ti = t0;
    },
    _LinkedHashSetCell: function _LinkedHashSetCell(t0) {
      this._collection$_element = t0;
      this._collection$_next = null;
    },
    _LinkedHashSetIterator: function _LinkedHashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_modifications = t1;
      _._collection$_current = _._collection$_cell = null;
      _.$ti = t2;
    },
    UnmodifiableListView: function UnmodifiableListView(t0, t1) {
      this._collection$_source = t0;
      this.$ti = t1;
    },
    LinkedHashMap_LinkedHashMap$from_closure: function LinkedHashMap_LinkedHashMap$from_closure(t0, t1, t2) {
      this.result = t0;
      this.K = t1;
      this.V = t2;
    },
    ListBase: function ListBase() {
    },
    MapBase: function MapBase() {
    },
    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
    },
    MapView: function MapView() {
    },
    UnmodifiableMapView: function UnmodifiableMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ListQueue: function ListQueue(t0, t1) {
      var _ = this;
      _._table = t0;
      _._modificationCount = _._tail = _._head = 0;
      _.$ti = t1;
    },
    _ListQueueIterator: function _ListQueueIterator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue = t0;
      _._end = t1;
      _._modificationCount = t2;
      _._collection$_position = t3;
      _._collection$_current = null;
      _.$ti = t4;
    },
    SetBase: function SetBase() {
    },
    _SetBase: function _SetBase() {
    },
    _SplayTreeNode: function _SplayTreeNode() {
    },
    _SplayTreeSetNode: function _SplayTreeSetNode(t0, t1) {
      var _ = this;
      _.key = t0;
      _._right = _._left = null;
      _.$ti = t1;
    },
    _SplayTree: function _SplayTree() {
    },
    _SplayTreeIterator: function _SplayTreeIterator() {
    },
    _SplayTreeKeyIterator: function _SplayTreeKeyIterator(t0, t1, t2, t3) {
      var _ = this;
      _._tree = t0;
      _._path = t1;
      _._modificationCount = null;
      _._splayCount = t2;
      _.$ti = t3;
    },
    SplayTreeSet: function SplayTreeSet(t0, t1, t2) {
      var _ = this;
      _._root = null;
      _._compare = t0;
      _._validKey = t1;
      _._splayCount = _._modificationCount = _._count = 0;
      _.$ti = t2;
    },
    SplayTreeSet_closure: function SplayTreeSet_closure(t0) {
      this.E = t0;
    },
    _SplayTreeSet__SplayTree_Iterable: function _SplayTreeSet__SplayTree_Iterable() {
    },
    _SplayTreeSet__SplayTree_Iterable_SetMixin: function _SplayTreeSet__SplayTree_Iterable_SetMixin() {
    },
    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
    },
    _parseJson(source, reviver) {
      var e, exception, t1, parsed = null;
      try {
        parsed = JSON.parse(source);
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.FormatException$(String(e), null, null);
        throw A.wrapException(t1);
      }
      t1 = A._convertJsonToDartLazy(parsed);
      return t1;
    },
    _convertJsonToDartLazy(object) {
      var i;
      if (object == null)
        return null;
      if (typeof object != "object")
        return object;
      if (Object.getPrototypeOf(object) !== Array.prototype)
        return new A._JsonMap(object, Object.create(null));
      for (i = 0; i < object.length; ++i)
        object[i] = A._convertJsonToDartLazy(object[i]);
      return object;
    },
    Base64Codec__checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, $length) {
      if (B.JSInt_methods.$mod($length, 4) !== 0)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, padded length must be multiple of four, is " + $length, source, sourceEnd));
      if (firstPadding + paddingCount !== $length)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, '=' not at the end", source, sourceIndex));
      if (paddingCount > 2)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
    },
    _Base64Encoder_encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
      var t1, t2, t3, i, byteOr, byte, outputIndex0, t4, outputIndex1,
        bits = state >>> 2,
        expectedChars = 3 - (state & 3);
      for (t1 = J.getInterceptor$asx(bytes), t2 = alphabet.length, t3 = output.length, i = start, byteOr = 0; i < end; ++i) {
        byte = t1.$index(bytes, i);
        byteOr = (byteOr | byte) >>> 0;
        bits = (bits << 8 | byte) & 16777215;
        --expectedChars;
        if (expectedChars === 0) {
          outputIndex0 = outputIndex + 1;
          t4 = bits >>> 18 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex < t3))
            return A.ioore(output, outputIndex);
          output[outputIndex] = alphabet.charCodeAt(t4);
          outputIndex = outputIndex0 + 1;
          t4 = bits >>> 12 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex0 < t3))
            return A.ioore(output, outputIndex0);
          output[outputIndex0] = alphabet.charCodeAt(t4);
          outputIndex0 = outputIndex + 1;
          t4 = bits >>> 6 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex < t3))
            return A.ioore(output, outputIndex);
          output[outputIndex] = alphabet.charCodeAt(t4);
          outputIndex = outputIndex0 + 1;
          t4 = bits & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex0 < t3))
            return A.ioore(output, outputIndex0);
          output[outputIndex0] = alphabet.charCodeAt(t4);
          bits = 0;
          expectedChars = 3;
        }
      }
      if (byteOr >= 0 && byteOr <= 255) {
        if (isLast && expectedChars < 3) {
          outputIndex0 = outputIndex + 1;
          outputIndex1 = outputIndex0 + 1;
          if (3 - expectedChars === 1) {
            t1 = bits >>> 2 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = alphabet.charCodeAt(t1);
            t1 = bits << 4 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex0 < t3))
              return A.ioore(output, outputIndex0);
            output[outputIndex0] = alphabet.charCodeAt(t1);
            outputIndex = outputIndex1 + 1;
            if (!(outputIndex1 < t3))
              return A.ioore(output, outputIndex1);
            output[outputIndex1] = 61;
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = 61;
          } else {
            t1 = bits >>> 10 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = alphabet.charCodeAt(t1);
            t1 = bits >>> 4 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex0 < t3))
              return A.ioore(output, outputIndex0);
            output[outputIndex0] = alphabet.charCodeAt(t1);
            outputIndex = outputIndex1 + 1;
            t1 = bits << 2 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex1 < t3))
              return A.ioore(output, outputIndex1);
            output[outputIndex1] = alphabet.charCodeAt(t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = 61;
          }
          return 0;
        }
        return (bits << 2 | 3 - expectedChars) >>> 0;
      }
      for (i = start; i < end;) {
        byte = t1.$index(bytes, i);
        if (byte < 0 || byte > 255)
          break;
        ++i;
      }
      throw A.wrapException(A.ArgumentError$value(bytes, "Not a byte value at index " + i + ": 0x" + J.toRadixString$1$n(t1.$index(bytes, i), 16), null));
    },
    _Base64Decoder_decodeChunk(input, start, end, output, outIndex, state) {
      var t1, t2, t3, i, charOr, char, t4, code, outIndex0, expectedPadding,
        _s31_ = "Invalid encoding before padding",
        _s17_ = "Invalid character",
        bits = B.JSInt_methods._shrOtherPositive$1(state, 2),
        count = state & 3,
        inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (t1 = input.length, t2 = inverseAlphabet.length, t3 = output.length, i = start, charOr = 0; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(input, i);
        char = input.charCodeAt(i);
        charOr |= char;
        t4 = char & 127;
        if (!(t4 < t2))
          return A.ioore(inverseAlphabet, t4);
        code = inverseAlphabet[t4];
        if (code >= 0) {
          bits = (bits << 6 | code) & 16777215;
          count = count + 1 & 3;
          if (count === 0) {
            outIndex0 = outIndex + 1;
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 16 & 255;
            outIndex = outIndex0 + 1;
            if (!(outIndex0 < t3))
              return A.ioore(output, outIndex0);
            output[outIndex0] = bits >>> 8 & 255;
            outIndex0 = outIndex + 1;
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits & 255;
            outIndex = outIndex0;
            bits = 0;
          }
          continue;
        } else if (code === -1 && count > 1) {
          if (charOr > 127)
            break;
          if (count === 3) {
            if ((bits & 3) !== 0)
              throw A.wrapException(A.FormatException$(_s31_, input, i));
            outIndex0 = outIndex + 1;
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 10;
            if (!(outIndex0 < t3))
              return A.ioore(output, outIndex0);
            output[outIndex0] = bits >>> 2;
          } else {
            if ((bits & 15) !== 0)
              throw A.wrapException(A.FormatException$(_s31_, input, i));
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 4;
          }
          expectedPadding = (3 - count) * 3;
          if (char === 37)
            expectedPadding += 2;
          return A._Base64Decoder__checkPadding(input, i + 1, end, -expectedPadding - 1);
        }
        throw A.wrapException(A.FormatException$(_s17_, input, i));
      }
      if (charOr >= 0 && charOr <= 127)
        return (bits << 2 | count) >>> 0;
      for (i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(input, i);
        if (input.charCodeAt(i) > 127)
          break;
      }
      throw A.wrapException(A.FormatException$(_s17_, input, i));
    },
    _Base64Decoder__allocateBuffer(input, start, end, state) {
      var paddingStart = A._Base64Decoder__trimPaddingChars(input, start, end),
        $length = (state & 3) + (paddingStart - start),
        bufferLength = B.JSInt_methods._shrOtherPositive$1($length, 2) * 3,
        remainderLength = $length & 3;
      if (remainderLength !== 0 && paddingStart < end)
        bufferLength += remainderLength - 1;
      if (bufferLength > 0)
        return new Uint8Array(bufferLength);
      return $.$get$_Base64Decoder__emptyBuffer();
    },
    _Base64Decoder__trimPaddingChars(input, start, end) {
      var char,
        t1 = input.length,
        newEnd = end,
        index = newEnd,
        padding = 0;
      while (true) {
        if (!(index > start && padding < 2))
          break;
        c$0: {
          --index;
          if (!(index >= 0 && index < t1))
            return A.ioore(input, index);
          char = input.charCodeAt(index);
          if (char === 61) {
            ++padding;
            newEnd = index;
            break c$0;
          }
          if ((char | 32) === 100) {
            if (index === start)
              break;
            --index;
            if (!(index >= 0 && index < t1))
              return A.ioore(input, index);
            char = input.charCodeAt(index);
          }
          if (char === 51) {
            if (index === start)
              break;
            --index;
            if (!(index >= 0 && index < t1))
              return A.ioore(input, index);
            char = input.charCodeAt(index);
          }
          if (char === 37) {
            ++padding;
            newEnd = index;
            break c$0;
          }
          break;
        }
      }
      return newEnd;
    },
    _Base64Decoder__checkPadding(input, start, end, state) {
      var expectedPadding, t1, char;
      if (start === end)
        return state;
      expectedPadding = -state - 1;
      for (t1 = input.length; expectedPadding > 0;) {
        if (!(start < t1))
          return A.ioore(input, start);
        char = input.charCodeAt(start);
        if (expectedPadding === 3) {
          if (char === 61) {
            expectedPadding -= 3;
            ++start;
            break;
          }
          if (char === 37) {
            --expectedPadding;
            ++start;
            if (start === end)
              break;
            if (!(start < t1))
              return A.ioore(input, start);
            char = input.charCodeAt(start);
          } else
            break;
        }
        if ((expectedPadding > 3 ? expectedPadding - 3 : expectedPadding) === 2) {
          if (char !== 51)
            break;
          ++start;
          --expectedPadding;
          if (start === end)
            break;
          if (!(start < t1))
            return A.ioore(input, start);
          char = input.charCodeAt(start);
        }
        if ((char | 32) !== 100)
          break;
        ++start;
        --expectedPadding;
        if (start === end)
          break;
      }
      if (start !== end)
        throw A.wrapException(A.FormatException$("Invalid padding character", input, start));
      return -expectedPadding - 1;
    },
    JsonUnsupportedObjectError$(unsupportedObject, cause, partialResult) {
      return new A.JsonUnsupportedObjectError(unsupportedObject, cause);
    },
    _defaultToEncodable(object) {
      return object.toJson$0();
    },
    _JsonStringStringifier$(_sink, _toEncodable) {
      return new A._JsonStringStringifier(_sink, [], A.convert___defaultToEncodable$closure());
    },
    _JsonStringStringifier_stringify(object, toEncodable, indent) {
      var t1,
        output = new A.StringBuffer("");
      A._JsonStringStringifier_printOn(object, output, toEncodable, indent);
      t1 = output._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _JsonStringStringifier_printOn(object, output, toEncodable, indent) {
      var stringifier = A._JsonStringStringifier$(output, toEncodable);
      stringifier.writeObject$1(object);
    },
    _JsonMap: function _JsonMap(t0, t1) {
      this._original = t0;
      this._processed = t1;
      this._data = null;
    },
    _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) {
      this._parent = t0;
    },
    Base64Codec: function Base64Codec() {
    },
    Base64Encoder: function Base64Encoder() {
    },
    _Base64Encoder: function _Base64Encoder(t0) {
      this._convert$_state = 0;
      this._alphabet = t0;
    },
    Base64Decoder: function Base64Decoder() {
    },
    _Base64Decoder: function _Base64Decoder() {
      this._convert$_state = 0;
    },
    Codec: function Codec() {
    },
    Converter: function Converter() {
    },
    Encoding: function Encoding() {
    },
    JsonUnsupportedObjectError: function JsonUnsupportedObjectError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCyclicError: function JsonCyclicError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCodec: function JsonCodec() {
    },
    JsonEncoder: function JsonEncoder(t0) {
      this._toEncodable = t0;
    },
    JsonDecoder: function JsonDecoder(t0) {
      this._reviver = t0;
    },
    _JsonStringifier: function _JsonStringifier() {
    },
    _JsonStringifier_writeMap_closure: function _JsonStringifier_writeMap_closure(t0, t1) {
      this._box_0 = t0;
      this.keyValueList = t1;
    },
    _JsonStringStringifier: function _JsonStringStringifier(t0, t1, t2) {
      this._convert$_sink = t0;
      this._seen = t1;
      this._toEncodable = t2;
    },
    Utf8Codec: function Utf8Codec() {
    },
    Utf8Encoder: function Utf8Encoder() {
    },
    _Utf8Encoder: function _Utf8Encoder(t0) {
      this._bufferIndex = this._carry = 0;
      this._buffer = t0;
    },
    _BigIntImpl__parseDecimal(source, isNegative) {
      var part, i,
        result = $.$get$_BigIntImpl_zero(),
        t1 = source.length,
        digitInPartCount = 4 - t1 % 4;
      if (digitInPartCount === 4)
        digitInPartCount = 0;
      for (part = 0, i = 0; i < t1; ++i) {
        part = part * 10 + source.charCodeAt(i) - 48;
        ++digitInPartCount;
        if (digitInPartCount === 4) {
          result = result.$mul(0, $.$get$_BigIntImpl__bigInt10000()).$add(0, A._BigIntImpl__BigIntImpl$_fromInt(part));
          part = 0;
          digitInPartCount = 0;
        }
      }
      if (isNegative)
        return result.$negate(0);
      return result;
    },
    _BigIntImpl__codeUnitToRadixValue(codeUnit) {
      if (48 <= codeUnit && codeUnit <= 57)
        return codeUnit - 48;
      return (codeUnit | 32) - 97 + 10;
    },
    _BigIntImpl__parseHex(source, startPos, isNegative) {
      var i, chunk, j, i0, digitValue, digitIndex, digitIndex0,
        t1 = source.length,
        sourceLength = t1 - startPos,
        chunkCount = B.JSNumber_methods.ceil$0(sourceLength / 4),
        digits = new Uint16Array(chunkCount),
        t2 = chunkCount - 1,
        lastDigitLength = sourceLength - t2 * 4;
      for (i = startPos, chunk = 0, j = 0; j < lastDigitLength; ++j, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(source, i);
        digitValue = A._BigIntImpl__codeUnitToRadixValue(source.charCodeAt(i));
        if (digitValue >= 16)
          return null;
        chunk = chunk * 16 + digitValue;
      }
      digitIndex = t2 - 1;
      if (!(t2 >= 0 && t2 < chunkCount))
        return A.ioore(digits, t2);
      digits[t2] = chunk;
      for (; i < t1; digitIndex = digitIndex0) {
        for (chunk = 0, j = 0; j < 4; ++j, i = i0) {
          i0 = i + 1;
          if (!(i >= 0 && i < t1))
            return A.ioore(source, i);
          digitValue = A._BigIntImpl__codeUnitToRadixValue(source.charCodeAt(i));
          if (digitValue >= 16)
            return null;
          chunk = chunk * 16 + digitValue;
        }
        digitIndex0 = digitIndex - 1;
        if (!(digitIndex >= 0 && digitIndex < chunkCount))
          return A.ioore(digits, digitIndex);
        digits[digitIndex] = chunk;
      }
      if (chunkCount === 1) {
        if (0 >= chunkCount)
          return A.ioore(digits, 0);
        t1 = digits[0] === 0;
      } else
        t1 = false;
      if (t1)
        return $.$get$_BigIntImpl_zero();
      t1 = A._BigIntImpl__normalize(chunkCount, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__tryParse(source, radix) {
      var match, t1, t2, isNegative, decimalMatch, hexMatch;
      if (source === "")
        return null;
      match = $.$get$_BigIntImpl__parseRE().firstMatch$1(source);
      if (match == null)
        return null;
      t1 = match._match;
      t2 = t1.length;
      if (1 >= t2)
        return A.ioore(t1, 1);
      isNegative = t1[1] === "-";
      if (4 >= t2)
        return A.ioore(t1, 4);
      decimalMatch = t1[4];
      hexMatch = t1[3];
      if (5 >= t2)
        return A.ioore(t1, 5);
      if (decimalMatch != null)
        return A._BigIntImpl__parseDecimal(decimalMatch, isNegative);
      if (hexMatch != null)
        return A._BigIntImpl__parseHex(hexMatch, 2, isNegative);
      return null;
    },
    _BigIntImpl__normalize(used, digits) {
      var t2,
        t1 = digits.length;
      while (true) {
        if (used > 0) {
          t2 = used - 1;
          if (!(t2 < t1))
            return A.ioore(digits, t2);
          t2 = digits[t2] === 0;
        } else
          t2 = false;
        if (!t2)
          break;
        --used;
      }
      return used;
    },
    _BigIntImpl__cloneDigits(digits, from, to, $length) {
      var t1, i, t2,
        resultDigits = new Uint16Array($length),
        n = to - from;
      for (t1 = digits.length, i = 0; i < n; ++i) {
        t2 = from + i;
        if (!(t2 >= 0 && t2 < t1))
          return A.ioore(digits, t2);
        t2 = digits[t2];
        if (!(i < $length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = t2;
      }
      return resultDigits;
    },
    _BigIntImpl__BigIntImpl$_fromInt(value) {
      var digits, t1, i, i0,
        isNegative = value < 0;
      if (isNegative) {
        if (value === -9223372036854776e3) {
          digits = new Uint16Array(4);
          digits[3] = 32768;
          t1 = A._BigIntImpl__normalize(4, digits);
          return new A._BigIntImpl(t1 !== 0 || false, digits, t1);
        }
        value = -value;
      }
      if (value < 65536) {
        digits = new Uint16Array(1);
        digits[0] = value;
        t1 = A._BigIntImpl__normalize(1, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      if (value <= 4294967295) {
        digits = new Uint16Array(2);
        digits[0] = value & 65535;
        digits[1] = B.JSInt_methods._shrOtherPositive$1(value, 16);
        t1 = A._BigIntImpl__normalize(2, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      t1 = B.JSInt_methods._tdivFast$1(B.JSInt_methods.get$bitLength(value) - 1, 16) + 1;
      digits = new Uint16Array(t1);
      for (i = 0; value !== 0; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(digits, i);
        digits[i] = value & 65535;
        value = B.JSInt_methods._tdivFast$1(value, 65536);
      }
      t1 = A._BigIntImpl__normalize(t1, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__dlShiftDigits(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, t3, t4;
      if (xUsed === 0)
        return 0;
      if (n === 0 && resultDigits === xDigits)
        return xUsed;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length; i >= 0; --i) {
        t3 = i + n;
        if (!(i < t1))
          return A.ioore(xDigits, i);
        t4 = xDigits[i];
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = t4;
      }
      for (i = n - 1; i >= 0; --i) {
        if (!(i < t2))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      return xUsed + n;
    },
    _BigIntImpl__lsh(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, carry, digit, t3, t4,
        digitShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, carryBitShift) - 1;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length, carry = 0; i >= 0; --i) {
        if (!(i < t1))
          return A.ioore(xDigits, i);
        digit = xDigits[i];
        t3 = i + digitShift + 1;
        t4 = B.JSInt_methods.$shr(digit, carryBitShift);
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = (t4 | carry) >>> 0;
        carry = B.JSInt_methods.$shl((digit & bitMask) >>> 0, bitShift);
      }
      if (!(digitShift >= 0 && digitShift < t2))
        return A.ioore(resultDigits, digitShift);
      resultDigits[digitShift] = carry;
    },
    _BigIntImpl__lShiftDigits(xDigits, xUsed, n, resultDigits) {
      var resultUsed, t1, i, t2,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16);
      if (B.JSInt_methods.$mod(n, 16) === 0)
        return A._BigIntImpl__dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
      resultUsed = xUsed + digitsShift + 1;
      A._BigIntImpl__lsh(xDigits, xUsed, n, resultDigits);
      for (t1 = resultDigits.length, i = digitsShift; --i, i >= 0;) {
        if (!(i < t1))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      t2 = resultUsed - 1;
      if (!(t2 >= 0 && t2 < t1))
        return A.ioore(resultDigits, t2);
      if (resultDigits[t2] === 0)
        resultUsed = t2;
      return resultUsed;
    },
    _BigIntImpl__rsh(xDigits, xUsed, n, resultDigits) {
      var carry, last, t2, i, t3, digit,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, bitShift) - 1,
        t1 = xDigits.length;
      if (!(digitsShift >= 0 && digitsShift < t1))
        return A.ioore(xDigits, digitsShift);
      carry = B.JSInt_methods.$shr(xDigits[digitsShift], bitShift);
      last = xUsed - digitsShift - 1;
      for (t2 = resultDigits.length, i = 0; i < last; ++i) {
        t3 = i + digitsShift + 1;
        if (!(t3 < t1))
          return A.ioore(xDigits, t3);
        digit = xDigits[t3];
        t3 = B.JSInt_methods.$shl((digit & bitMask) >>> 0, carryBitShift);
        if (!(i < t2))
          return A.ioore(resultDigits, i);
        resultDigits[i] = (t3 | carry) >>> 0;
        carry = B.JSInt_methods.$shr(digit, bitShift);
      }
      if (!(last >= 0 && last < t2))
        return A.ioore(resultDigits, last);
      resultDigits[last] = carry;
    },
    _BigIntImpl__compareDigits(digits, used, otherDigits, otherUsed) {
      var i, t1, t2, t3,
        result = used - otherUsed;
      if (result === 0)
        for (i = used - 1, t1 = digits.length, t2 = otherDigits.length; i >= 0; --i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          t3 = digits[i];
          if (!(i < t2))
            return A.ioore(otherDigits, i);
          result = t3 - otherDigits[i];
          if (result !== 0)
            return result;
        }
      return result;
    },
    _BigIntImpl__absAdd(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 + otherDigits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = B.JSInt_methods._shrOtherPositive$1(carry, 16);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = B.JSInt_methods._shrOtherPositive$1(carry, 16);
      }
      if (!(used >= 0 && used < t3))
        return A.ioore(resultDigits, used);
      resultDigits[used] = carry;
    },
    _BigIntImpl__absSub(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 - otherDigits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
    },
    _BigIntImpl__mulAdd(x, multiplicandDigits, i, accumulatorDigits, j, n) {
      var t1, t2, c, i0, t3, combined, j0, l;
      if (x === 0)
        return;
      for (t1 = multiplicandDigits.length, t2 = accumulatorDigits.length, c = 0; --n, n >= 0; j = j0, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(multiplicandDigits, i);
        t3 = multiplicandDigits[i];
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        combined = x * t3 + accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = combined & 65535;
        c = B.JSInt_methods._tdivFast$1(combined, 65536);
      }
      for (; c !== 0; j = j0) {
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        l = accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = l & 65535;
        c = B.JSInt_methods._tdivFast$1(l, 65536);
      }
    },
    _BigIntImpl__estimateQuotientDigit(topDigitDivisor, digits, i) {
      var t2, t3, quotientDigit,
        t1 = digits.length;
      if (!(i >= 0 && i < t1))
        return A.ioore(digits, i);
      t2 = digits[i];
      if (t2 === topDigitDivisor)
        return 65535;
      t3 = i - 1;
      if (!(t3 >= 0 && t3 < t1))
        return A.ioore(digits, t3);
      quotientDigit = B.JSInt_methods.$tdiv((t2 << 16 | digits[t3]) >>> 0, topDigitDivisor);
      if (quotientDigit > 65535)
        return 65535;
      return quotientDigit;
    },
    _symbolMapToStringMap(map) {
      var result = new A.JsLinkedHashMap(type$.JsLinkedHashMap_String_dynamic);
      map.forEach$1(0, new A._symbolMapToStringMap_closure(result));
      return result;
    },
    identityHashCode(object) {
      return A.objectHashCode(object);
    },
    Function_apply($function, positionalArguments, namedArguments) {
      return A.Primitives_applyFunction($function, positionalArguments, namedArguments == null ? null : A._symbolMapToStringMap(namedArguments));
    },
    Expando__checkType(object) {
      var t1;
      if (typeof object != "number")
        t1 = false;
      else
        t1 = true;
      if (t1)
        A.Expando__badExpandoKey(object);
    },
    Expando__badExpandoKey(object) {
      throw A.wrapException(A.ArgumentError$value(object, "object", "Expandos are not allowed on strings, numbers, bools, records or null"));
    },
    int_parse(source, radix) {
      var value = A.Primitives_parseInt(source, radix);
      if (value != null)
        return value;
      throw A.wrapException(A.FormatException$(source, null, null));
    },
    Error__throw(error, stackTrace) {
      error = A.wrapException(error);
      if (error == null)
        error = type$.Object._as(error);
      error.stack = stackTrace.toString$0(0);
      throw error;
      throw A.wrapException("unreachable");
    },
    DateTime$fromMillisecondsSinceEpoch(millisecondsSinceEpoch, isUtc) {
      var t1;
      if (Math.abs(millisecondsSinceEpoch) <= 864e13)
        t1 = false;
      else
        t1 = true;
      if (t1)
        A.throwExpression(A.ArgumentError$("DateTime is outside valid range: " + millisecondsSinceEpoch, null));
      A.checkNotNullable(isUtc, "isUtc", type$.bool);
      return new A.DateTime(millisecondsSinceEpoch, isUtc);
    },
    List_List$filled($length, fill, growable, $E) {
      var i,
        result = growable ? J.JSArray_JSArray$growable($length, $E) : J.JSArray_JSArray$fixed($length, $E);
      if ($length !== 0 && fill != null)
        for (i = 0; i < result.length; ++i)
          result[i] = fill;
      return result;
    },
    List_List$from(elements, growable, $E) {
      var t1,
        list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, $E._as(t1.get$current(t1)));
      if (growable)
        return list;
      return J.JSArray_markFixedList(list, $E);
    },
    List_List$of(elements, growable, $E) {
      var t1;
      if (growable)
        return A.List_List$_of(elements, $E);
      t1 = J.JSArray_markFixedList(A.List_List$_of(elements, $E), $E);
      return t1;
    },
    List_List$_of(elements, $E) {
      var list, t1;
      if (Array.isArray(elements))
        return A._setArrayType(elements.slice(0), $E._eval$1("JSArray<0>"));
      list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, t1.get$current(t1));
      return list;
    },
    List_List$unmodifiable(elements, $E) {
      return J.JSArray_markUnmodifiableList(A.List_List$from(elements, false, $E));
    },
    String_String$fromCharCodes(charCodes, start, end) {
      var array, len;
      if (Array.isArray(charCodes)) {
        array = charCodes;
        len = array.length;
        end = A.RangeError_checkValidRange(start, end, len);
        return A.Primitives_stringFromCharCodes(start > 0 || end < len ? array.slice(start, end) : array);
      }
      if (type$.NativeUint8List._is(charCodes))
        return A.Primitives_stringFromNativeUint8List(charCodes, start, A.RangeError_checkValidRange(start, end, charCodes.length));
      return A.String__stringFromIterable(charCodes, start, end);
    },
    String__stringFromIterable(charCodes, start, end) {
      var t1, it, i, list, _null = null;
      if (start < 0)
        throw A.wrapException(A.RangeError$range(start, 0, J.get$length$asx(charCodes), _null, _null));
      t1 = end == null;
      if (!t1 && end < start)
        throw A.wrapException(A.RangeError$range(end, start, J.get$length$asx(charCodes), _null, _null));
      it = J.get$iterator$ax(charCodes);
      for (i = 0; i < start; ++i)
        if (!it.moveNext$0())
          throw A.wrapException(A.RangeError$range(start, 0, i, _null, _null));
      list = [];
      if (t1)
        for (; it.moveNext$0();)
          list.push(it.get$current(it));
      else
        for (i = start; i < end; ++i) {
          if (!it.moveNext$0())
            throw A.wrapException(A.RangeError$range(end, start, i, _null, _null));
          list.push(it.get$current(it));
        }
      return A.Primitives_stringFromCharCodes(list);
    },
    RegExp_RegExp(source, caseSensitive, multiLine) {
      return new A.JSSyntaxRegExp(source, A.JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, false, false, false));
    },
    identical(a, b) {
      return a == null ? b == null : a === b;
    },
    StringBuffer__writeAll(string, objects, separator) {
      var iterator = J.get$iterator$ax(objects);
      if (!iterator.moveNext$0())
        return string;
      if (separator.length === 0) {
        do
          string += A.S(iterator.get$current(iterator));
        while (iterator.moveNext$0());
      } else {
        string += A.S(iterator.get$current(iterator));
        for (; iterator.moveNext$0();)
          string = string + separator + A.S(iterator.get$current(iterator));
      }
      return string;
    },
    NoSuchMethodError_NoSuchMethodError$withInvocation(receiver, invocation) {
      return new A.NoSuchMethodError(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments());
    },
    _Uri__uriEncode(canonicalTable, text, encoding, spaceToPlus) {
      var t1, bytes, i, t2, byte, t3,
        _s16_ = "0123456789ABCDEF";
      if (encoding === B.C_Utf8Codec) {
        t1 = $.$get$_Uri__needsNoEncoding();
        t1 = t1._nativeRegExp.test(text);
      } else
        t1 = false;
      if (t1)
        return text;
      bytes = B.C_Utf8Encoder.convert$1(text);
      for (t1 = bytes.length, i = 0, t2 = ""; i < t1; ++i) {
        byte = bytes[i];
        if (byte < 128) {
          t3 = byte >>> 4;
          if (!(t3 < 8))
            return A.ioore(canonicalTable, t3);
          t3 = (canonicalTable[t3] & 1 << (byte & 15)) !== 0;
        } else
          t3 = false;
        if (t3)
          t2 += A.Primitives_stringFromCharCode(byte);
        else
          t2 = spaceToPlus && byte === 32 ? t2 + "+" : t2 + "%" + _s16_[byte >>> 4 & 15] + _s16_[byte & 15];
      }
      return t2.charCodeAt(0) == 0 ? t2 : t2;
    },
    StackTrace_current() {
      return A.getTraceFromException(new Error());
    },
    DateTime__fourDigits(n) {
      var absN = Math.abs(n),
        sign = n < 0 ? "-" : "";
      if (absN >= 1000)
        return "" + n;
      if (absN >= 100)
        return sign + "0" + absN;
      if (absN >= 10)
        return sign + "00" + absN;
      return sign + "000" + absN;
    },
    DateTime__threeDigits(n) {
      if (n >= 100)
        return "" + n;
      if (n >= 10)
        return "0" + n;
      return "00" + n;
    },
    DateTime__twoDigits(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    Duration$(microseconds, milliseconds) {
      return new A.Duration(microseconds + 1000 * milliseconds);
    },
    Error_safeToString(object) {
      if (typeof object == "number" || A._isBool(object) || object == null)
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      return A.Primitives_safeToString(object);
    },
    Error_throwWithStackTrace(error, stackTrace) {
      A.checkNotNullable(error, "error", type$.Object);
      A.checkNotNullable(stackTrace, "stackTrace", type$.StackTrace);
      A.Error__throw(error, stackTrace);
    },
    AssertionError$(message) {
      return new A.AssertionError(message);
    },
    ArgumentError$(message, $name) {
      return new A.ArgumentError(false, null, $name, message);
    },
    ArgumentError$value(value, $name, message) {
      return new A.ArgumentError(true, value, $name, message);
    },
    ArgumentError$notNull($name) {
      return new A.ArgumentError(false, null, $name, "Must not be null");
    },
    ArgumentError_checkNotNull(argument, $name, $T) {
      return argument;
    },
    RangeError$(message) {
      var _null = null;
      return new A.RangeError(_null, _null, false, _null, _null, message);
    },
    RangeError$value(value, $name) {
      return new A.RangeError(null, null, true, value, $name, "Value not in range");
    },
    RangeError$range(invalidValue, minValue, maxValue, $name, message) {
      return new A.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
    },
    RangeError_checkValidRange(start, end, $length) {
      if (0 > start || start > $length)
        throw A.wrapException(A.RangeError$range(start, 0, $length, "start", null));
      if (end != null) {
        if (start > end || end > $length)
          throw A.wrapException(A.RangeError$range(end, start, $length, "end", null));
        return end;
      }
      return $length;
    },
    RangeError_checkNotNegative(value, $name) {
      if (value < 0)
        throw A.wrapException(A.RangeError$range(value, 0, null, $name, null));
      return value;
    },
    IndexError$withLength(invalidValue, $length, indexable, message, $name) {
      return new A.IndexError($length, true, invalidValue, $name, "Index out of range");
    },
    UnsupportedError$(message) {
      return new A.UnsupportedError(message);
    },
    UnimplementedError$(message) {
      return new A.UnimplementedError(message);
    },
    StateError$(message) {
      return new A.StateError(message);
    },
    ConcurrentModificationError$(modifiedObject) {
      return new A.ConcurrentModificationError(modifiedObject);
    },
    Exception_Exception(message) {
      return new A._Exception(message);
    },
    FormatException$(message, source, offset) {
      return new A.FormatException(message, source, offset);
    },
    Iterable_iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
      var parts, t1;
      if (A.isToStringVisiting(iterable)) {
        if (leftDelimiter === "(" && rightDelimiter === ")")
          return "(...)";
        return leftDelimiter + "..." + rightDelimiter;
      }
      parts = A._setArrayType([], type$.JSArray_String);
      B.JSArray_methods.add$1($.toStringVisiting, iterable);
      try {
        A._iterablePartsToStrings(iterable, parts);
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      t1 = A.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    Iterable_iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
      var buffer, t1;
      if (A.isToStringVisiting(iterable))
        return leftDelimiter + "..." + rightDelimiter;
      buffer = new A.StringBuffer(leftDelimiter);
      B.JSArray_methods.add$1($.toStringVisiting, iterable);
      try {
        t1 = buffer;
        t1._contents = A.StringBuffer__writeAll(t1._contents, iterable, ", ");
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      buffer._contents += rightDelimiter;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _iterablePartsToStrings(iterable, parts) {
      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
        it = J.get$iterator$ax(iterable),
        $length = 0, count = 0;
      while (true) {
        if (!($length < 80 || count < 3))
          break;
        if (!it.moveNext$0())
          return;
        next = A.S(it.get$current(it));
        B.JSArray_methods.add$1(parts, next);
        $length += next.length + 2;
        ++count;
      }
      if (!it.moveNext$0()) {
        if (count <= 5)
          return;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        ultimateString = parts.pop();
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        penultimateString = parts.pop();
      } else {
        penultimate = it.get$current(it);
        ++count;
        if (!it.moveNext$0()) {
          if (count <= 4) {
            B.JSArray_methods.add$1(parts, A.S(penultimate));
            return;
          }
          ultimateString = A.S(penultimate);
          if (0 >= parts.length)
            return A.ioore(parts, -1);
          penultimateString = parts.pop();
          $length += ultimateString.length + 2;
        } else {
          ultimate = it.get$current(it);
          ++count;
          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
            ultimate0 = it.get$current(it);
            ++count;
            if (count > 100) {
              while (true) {
                if (!($length > 75 && count > 3))
                  break;
                if (0 >= parts.length)
                  return A.ioore(parts, -1);
                $length -= parts.pop().length + 2;
                --count;
              }
              B.JSArray_methods.add$1(parts, "...");
              return;
            }
          }
          penultimateString = A.S(penultimate);
          ultimateString = A.S(ultimate);
          $length += ultimateString.length + penultimateString.length + 4;
        }
      }
      if (count > parts.length + 2) {
        $length += 5;
        elision = "...";
      } else
        elision = null;
      while (true) {
        if (!($length > 80 && parts.length > 3))
          break;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        $length -= parts.pop().length + 2;
        if (elision == null) {
          $length += 5;
          elision = "...";
        }
      }
      if (elision != null)
        B.JSArray_methods.add$1(parts, elision);
      B.JSArray_methods.add$1(parts, penultimateString);
      B.JSArray_methods.add$1(parts, ultimateString);
    },
    Map_castFrom(source, $K, $V, K2, V2) {
      return new A.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1(K2)._bind$1(V2)._eval$1("CastMap<1,2,3,4>"));
    },
    Object_hash(object1, object2, object3, object4) {
      var t1;
      if (B.C_SentinelValue === object3) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2));
      }
      if (B.C_SentinelValue === object4) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        object3 = J.get$hashCode$(object3);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3));
      }
      t1 = J.get$hashCode$(object1);
      object2 = J.get$hashCode$(object2);
      object3 = J.get$hashCode$(object3);
      object4 = J.get$hashCode$(object4);
      object4 = A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3), object4));
      return object4;
    },
    print(object) {
      var toZone = $.printToZone;
      if (toZone == null)
        A.printString(object);
      else
        toZone.call$1(object);
    },
    Uri_parse(uri) {
      var delta, indices, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, isSimple, scheme, t1, t2, schemeAuth, queryStart0, pathStart0, userInfoStart, userInfo, host, portNumber, port, path, query, _null = null,
        end = uri.length;
      if (end >= 5) {
        if (4 >= end)
          return A.ioore(uri, 4);
        delta = ((uri.charCodeAt(4) ^ 58) * 3 | uri.charCodeAt(0) ^ 100 | uri.charCodeAt(1) ^ 97 | uri.charCodeAt(2) ^ 116 | uri.charCodeAt(3) ^ 97) >>> 0;
        if (delta === 0)
          return A.UriData__parse(end < end ? B.JSString_methods.substring$2(uri, 0, end) : uri, 5, _null).get$uri();
        else if (delta === 32)
          return A.UriData__parse(B.JSString_methods.substring$2(uri, 5, end), 0, _null).get$uri();
      }
      indices = A.List_List$filled(8, 0, false, type$.int);
      B.JSArray_methods.$indexSet(indices, 0, 0);
      B.JSArray_methods.$indexSet(indices, 1, -1);
      B.JSArray_methods.$indexSet(indices, 2, -1);
      B.JSArray_methods.$indexSet(indices, 7, -1);
      B.JSArray_methods.$indexSet(indices, 3, 0);
      B.JSArray_methods.$indexSet(indices, 4, 0);
      B.JSArray_methods.$indexSet(indices, 5, end);
      B.JSArray_methods.$indexSet(indices, 6, end);
      if (A._scan(uri, 0, end, 0, indices) >= 14)
        B.JSArray_methods.$indexSet(indices, 7, end);
      schemeEnd = indices[1];
      if (schemeEnd >= 0)
        if (A._scan(uri, 0, schemeEnd, 20, indices) === 20)
          indices[7] = schemeEnd;
      hostStart = indices[2] + 1;
      portStart = indices[3];
      pathStart = indices[4];
      queryStart = indices[5];
      fragmentStart = indices[6];
      if (fragmentStart < queryStart)
        queryStart = fragmentStart;
      if (pathStart < hostStart)
        pathStart = queryStart;
      else if (pathStart <= schemeEnd)
        pathStart = schemeEnd + 1;
      if (portStart < hostStart)
        portStart = pathStart;
      isSimple = indices[7] < 0;
      if (isSimple)
        if (hostStart > schemeEnd + 3) {
          scheme = _null;
          isSimple = false;
        } else {
          t1 = portStart > 0;
          if (t1 && portStart + 1 === pathStart) {
            scheme = _null;
            isSimple = false;
          } else {
            if (!B.JSString_methods.startsWith$2(uri, "\\", pathStart))
              if (hostStart > 0)
                t2 = B.JSString_methods.startsWith$2(uri, "\\", hostStart - 1) || B.JSString_methods.startsWith$2(uri, "\\", hostStart - 2);
              else
                t2 = false;
            else
              t2 = true;
            if (t2) {
              scheme = _null;
              isSimple = false;
            } else {
              if (!(queryStart < end && queryStart === pathStart + 2 && B.JSString_methods.startsWith$2(uri, "..", pathStart)))
                t2 = queryStart > pathStart + 2 && B.JSString_methods.startsWith$2(uri, "/..", queryStart - 3);
              else
                t2 = true;
              if (t2) {
                scheme = _null;
                isSimple = false;
              } else {
                if (schemeEnd === 4)
                  if (B.JSString_methods.startsWith$2(uri, "file", 0)) {
                    if (hostStart <= 0) {
                      if (!B.JSString_methods.startsWith$2(uri, "/", pathStart)) {
                        schemeAuth = "file:///";
                        delta = 3;
                      } else {
                        schemeAuth = "file://";
                        delta = 2;
                      }
                      uri = schemeAuth + B.JSString_methods.substring$2(uri, pathStart, end);
                      schemeEnd -= 0;
                      t1 = delta - 0;
                      queryStart += t1;
                      fragmentStart += t1;
                      end = uri.length;
                      hostStart = 7;
                      portStart = 7;
                      pathStart = 7;
                    } else if (pathStart === queryStart) {
                      ++fragmentStart;
                      queryStart0 = queryStart + 1;
                      uri = B.JSString_methods.replaceRange$3(uri, pathStart, queryStart, "/");
                      ++end;
                      queryStart = queryStart0;
                    }
                    scheme = "file";
                  } else if (B.JSString_methods.startsWith$2(uri, "http", 0)) {
                    if (t1 && portStart + 3 === pathStart && B.JSString_methods.startsWith$2(uri, "80", portStart + 1)) {
                      fragmentStart -= 3;
                      pathStart0 = pathStart - 3;
                      queryStart -= 3;
                      uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                      end -= 3;
                      pathStart = pathStart0;
                    }
                    scheme = "http";
                  } else
                    scheme = _null;
                else if (schemeEnd === 5 && B.JSString_methods.startsWith$2(uri, "https", 0)) {
                  if (t1 && portStart + 4 === pathStart && B.JSString_methods.startsWith$2(uri, "443", portStart + 1)) {
                    fragmentStart -= 4;
                    pathStart0 = pathStart - 4;
                    queryStart -= 4;
                    uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                    end -= 3;
                    pathStart = pathStart0;
                  }
                  scheme = "https";
                } else
                  scheme = _null;
                isSimple = true;
              }
            }
          }
        }
      else
        scheme = _null;
      if (isSimple) {
        if (end < uri.length) {
          uri = B.JSString_methods.substring$2(uri, 0, end);
          schemeEnd -= 0;
          hostStart -= 0;
          portStart -= 0;
          pathStart -= 0;
          queryStart -= 0;
          fragmentStart -= 0;
        }
        return new A._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
      }
      if (scheme == null)
        if (schemeEnd > 0)
          scheme = A._Uri__makeScheme(uri, 0, schemeEnd);
        else {
          if (schemeEnd === 0)
            A._Uri__fail(uri, 0, "Invalid empty scheme");
          scheme = "";
        }
      if (hostStart > 0) {
        userInfoStart = schemeEnd + 3;
        userInfo = userInfoStart < hostStart ? A._Uri__makeUserInfo(uri, userInfoStart, hostStart - 1) : "";
        host = A._Uri__makeHost(uri, hostStart, portStart, false);
        t1 = portStart + 1;
        if (t1 < pathStart) {
          portNumber = A.Primitives_parseInt(B.JSString_methods.substring$2(uri, t1, pathStart), _null);
          port = A._Uri__makePort(portNumber == null ? A.throwExpression(A.FormatException$("Invalid port", uri, t1)) : portNumber, scheme);
        } else
          port = _null;
      } else {
        port = _null;
        host = port;
        userInfo = "";
      }
      path = A._Uri__makePath(uri, pathStart, queryStart, _null, scheme, host != null);
      query = queryStart < fragmentStart ? A._Uri__makeQuery(uri, queryStart + 1, fragmentStart, _null) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragmentStart < end ? A._Uri__makeFragment(uri, fragmentStart + 1, end) : _null);
    },
    Uri__parseIPv4Address(host, start, end) {
      var t1, i, partStart, partIndex, char, part, partIndex0,
        _s43_ = "IPv4 address should contain exactly 4 parts",
        _s37_ = "each part must be in the range 0..255",
        error = new A.Uri__parseIPv4Address_error(host),
        result = new Uint8Array(4);
      for (t1 = host.length, i = start, partStart = i, partIndex = 0; i < end; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(host, i);
        char = host.charCodeAt(i);
        if (char !== 46) {
          if ((char ^ 48) > 9)
            error.call$2("invalid character", i);
        } else {
          if (partIndex === 3)
            error.call$2(_s43_, i);
          part = A.int_parse(B.JSString_methods.substring$2(host, partStart, i), null);
          if (part > 255)
            error.call$2(_s37_, partStart);
          partIndex0 = partIndex + 1;
          if (!(partIndex < 4))
            return A.ioore(result, partIndex);
          result[partIndex] = part;
          partStart = i + 1;
          partIndex = partIndex0;
        }
      }
      if (partIndex !== 3)
        error.call$2(_s43_, end);
      part = A.int_parse(B.JSString_methods.substring$2(host, partStart, end), null);
      if (part > 255)
        error.call$2(_s37_, partStart);
      if (!(partIndex < 4))
        return A.ioore(result, partIndex);
      result[partIndex] = part;
      return result;
    },
    Uri_parseIPv6Address(host, start, end) {
      var parts, i, partStart, wildcardSeen, seenDot, char, atEnd, last, bytes, wildCardLength, index, value, j, t2, _null = null,
        error = new A.Uri_parseIPv6Address_error(host),
        parseHex = new A.Uri_parseIPv6Address_parseHex(error, host),
        t1 = host.length;
      if (t1 < 2)
        error.call$2("address is too short", _null);
      parts = A._setArrayType([], type$.JSArray_int);
      for (i = start, partStart = i, wildcardSeen = false, seenDot = false; i < end; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(host, i);
        char = host.charCodeAt(i);
        if (char === 58) {
          if (i === start) {
            ++i;
            if (!(i < t1))
              return A.ioore(host, i);
            if (host.charCodeAt(i) !== 58)
              error.call$2("invalid start colon.", i);
            partStart = i;
          }
          if (i === partStart) {
            if (wildcardSeen)
              error.call$2("only one wildcard `::` is allowed", i);
            B.JSArray_methods.add$1(parts, -1);
            wildcardSeen = true;
          } else
            B.JSArray_methods.add$1(parts, parseHex.call$2(partStart, i));
          partStart = i + 1;
        } else if (char === 46)
          seenDot = true;
      }
      if (parts.length === 0)
        error.call$2("too few parts", _null);
      atEnd = partStart === end;
      t1 = B.JSArray_methods.get$last(parts);
      if (atEnd && t1 !== -1)
        error.call$2("expected a part after last `:`", end);
      if (!atEnd)
        if (!seenDot)
          B.JSArray_methods.add$1(parts, parseHex.call$2(partStart, end));
        else {
          last = A.Uri__parseIPv4Address(host, partStart, end);
          B.JSArray_methods.add$1(parts, (last[0] << 8 | last[1]) >>> 0);
          B.JSArray_methods.add$1(parts, (last[2] << 8 | last[3]) >>> 0);
        }
      if (wildcardSeen) {
        if (parts.length > 7)
          error.call$2("an address with a wildcard must have less than 7 parts", _null);
      } else if (parts.length !== 8)
        error.call$2("an address without a wildcard must contain exactly 8 parts", _null);
      bytes = new Uint8Array(16);
      for (t1 = parts.length, wildCardLength = 9 - t1, i = 0, index = 0; i < t1; ++i) {
        value = parts[i];
        if (value === -1)
          for (j = 0; j < wildCardLength; ++j) {
            if (!(index >= 0 && index < 16))
              return A.ioore(bytes, index);
            bytes[index] = 0;
            t2 = index + 1;
            if (!(t2 < 16))
              return A.ioore(bytes, t2);
            bytes[t2] = 0;
            index += 2;
          }
        else {
          t2 = B.JSInt_methods._shrOtherPositive$1(value, 8);
          if (!(index >= 0 && index < 16))
            return A.ioore(bytes, index);
          bytes[index] = t2;
          t2 = index + 1;
          if (!(t2 < 16))
            return A.ioore(bytes, t2);
          bytes[t2] = value & 255;
          index += 2;
        }
      }
      return bytes;
    },
    _Uri$_internal(scheme, _userInfo, _host, _port, path, _query, _fragment) {
      return new A._Uri(scheme, _userInfo, _host, _port, path, _query, _fragment);
    },
    _Uri__defaultPort(scheme) {
      if (scheme === "http")
        return 80;
      if (scheme === "https")
        return 443;
      return 0;
    },
    _Uri__fail(uri, index, message) {
      throw A.wrapException(A.FormatException$(message, uri, index));
    },
    _Uri__makePort(port, scheme) {
      if (port != null && port === A._Uri__defaultPort(scheme))
        return null;
      return port;
    },
    _Uri__makeHost(host, start, end, strictIPv6) {
      var t1, t2, index, zoneIDstart, zoneID, i;
      if (host == null)
        return null;
      if (start === end)
        return "";
      t1 = host.length;
      if (!(start >= 0 && start < t1))
        return A.ioore(host, start);
      if (host.charCodeAt(start) === 91) {
        t2 = end - 1;
        if (!(t2 >= 0 && t2 < t1))
          return A.ioore(host, t2);
        if (host.charCodeAt(t2) !== 93)
          A._Uri__fail(host, start, "Missing end `]` to match `[` in host");
        t1 = start + 1;
        index = A._Uri__checkZoneID(host, t1, t2);
        if (index < t2) {
          zoneIDstart = index + 1;
          zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, t2, "%25");
        } else
          zoneID = "";
        A.Uri_parseIPv6Address(host, t1, index);
        return B.JSString_methods.substring$2(host, start, index).toLowerCase() + zoneID + "]";
      }
      for (i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(host, i);
        if (host.charCodeAt(i) === 58) {
          index = B.JSString_methods.indexOf$2(host, "%", start);
          index = index >= start && index < end ? index : end;
          if (index < end) {
            zoneIDstart = index + 1;
            zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, end, "%25");
          } else
            zoneID = "";
          A.Uri_parseIPv6Address(host, start, index);
          return "[" + B.JSString_methods.substring$2(host, start, index) + zoneID + "]";
        }
      }
      return A._Uri__normalizeRegName(host, start, end);
    },
    _Uri__checkZoneID(host, start, end) {
      var index = B.JSString_methods.indexOf$2(host, "%", start);
      return index >= start && index < end ? index : end;
    },
    _Uri__normalizeZoneID(host, start, end, prefix) {
      var t1, index, sectionStart, isNormalized, char, replacement, t2, t3, tail, sourceLength, slice,
        buffer = prefix !== "" ? new A.StringBuffer(prefix) : null;
      for (t1 = host.length, index = start, sectionStart = index, isNormalized = true; index < end;) {
        if (!(index >= 0 && index < t1))
          return A.ioore(host, index);
        char = host.charCodeAt(index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t2 = replacement == null;
          if (t2 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          t3 = buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
          if (t2)
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
          else if (replacement === "%")
            A._Uri__fail(host, index, "ZoneID should not contain % anymore");
          buffer._contents = t3 + replacement;
          index += 3;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_M1A, t2);
            t2 = (B.List_M1A[t2] & 1 << (char & 15)) !== 0;
          } else
            t2 = false;
          if (t2) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new A.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if ((char & 64512) === 55296 && index + 1 < end) {
              t2 = index + 1;
              if (!(t2 < t1))
                return A.ioore(host, t2);
              tail = host.charCodeAt(t2);
              if ((tail & 64512) === 56320) {
                char = (char & 1023) << 10 | tail & 1023 | 65536;
                sourceLength = 2;
              } else
                sourceLength = 1;
            } else
              sourceLength = 1;
            slice = B.JSString_methods.substring$2(host, sectionStart, index);
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t2 = buffer;
            } else
              t2 = buffer;
            t2._contents += slice;
            t2._contents += A._Uri__escapeChar(char);
            index += sourceLength;
            sectionStart = index;
          }
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end)
        buffer._contents += B.JSString_methods.substring$2(host, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__normalizeRegName(host, start, end) {
      var t1, index, sectionStart, buffer, isNormalized, char, replacement, t2, slice, t3, sourceLength, tail;
      for (t1 = host.length, index = start, sectionStart = index, buffer = null, isNormalized = true; index < end;) {
        if (!(index >= 0 && index < t1))
          return A.ioore(host, index);
        char = host.charCodeAt(index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t2 = replacement == null;
          if (t2 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          slice = B.JSString_methods.substring$2(host, sectionStart, index);
          t3 = buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
          if (t2) {
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
            sourceLength = 3;
          } else if (replacement === "%") {
            replacement = "%25";
            sourceLength = 1;
          } else
            sourceLength = 3;
          buffer._contents = t3 + replacement;
          index += sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_ejq, t2);
            t2 = (B.List_ejq[t2] & 1 << (char & 15)) !== 0;
          } else
            t2 = false;
          if (t2) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new A.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if (char <= 93) {
              t2 = char >>> 4;
              if (!(t2 < 8))
                return A.ioore(B.List_YmH, t2);
              t2 = (B.List_YmH[t2] & 1 << (char & 15)) !== 0;
            } else
              t2 = false;
            if (t2)
              A._Uri__fail(host, index, "Invalid character");
            else {
              if ((char & 64512) === 55296 && index + 1 < end) {
                t2 = index + 1;
                if (!(t2 < t1))
                  return A.ioore(host, t2);
                tail = host.charCodeAt(t2);
                if ((tail & 64512) === 56320) {
                  char = (char & 1023) << 10 | tail & 1023 | 65536;
                  sourceLength = 2;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              slice = B.JSString_methods.substring$2(host, sectionStart, index);
              if (!isNormalized)
                slice = slice.toLowerCase();
              if (buffer == null) {
                buffer = new A.StringBuffer("");
                t2 = buffer;
              } else
                t2 = buffer;
              t2._contents += slice;
              t2._contents += A._Uri__escapeChar(char);
              index += sourceLength;
              sectionStart = index;
            }
          }
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end) {
        slice = B.JSString_methods.substring$2(host, sectionStart, end);
        buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__makeScheme(scheme, start, end) {
      var t1, i, containsUpperCase, codeUnit, t2;
      if (start === end)
        return "";
      t1 = scheme.length;
      if (!(start < t1))
        return A.ioore(scheme, start);
      if (!A._Uri__isAlphabeticCharacter(scheme.charCodeAt(start)))
        A._Uri__fail(scheme, start, "Scheme not starting with alphabetic character");
      for (i = start, containsUpperCase = false; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(scheme, i);
        codeUnit = scheme.charCodeAt(i);
        if (codeUnit < 128) {
          t2 = codeUnit >>> 4;
          if (!(t2 < 8))
            return A.ioore(B.List_MMm, t2);
          t2 = (B.List_MMm[t2] & 1 << (codeUnit & 15)) !== 0;
        } else
          t2 = false;
        if (!t2)
          A._Uri__fail(scheme, i, "Illegal scheme character");
        if (65 <= codeUnit && codeUnit <= 90)
          containsUpperCase = true;
      }
      scheme = B.JSString_methods.substring$2(scheme, start, end);
      return A._Uri__canonicalizeScheme(containsUpperCase ? scheme.toLowerCase() : scheme);
    },
    _Uri__canonicalizeScheme(scheme) {
      if (scheme === "http")
        return "http";
      if (scheme === "file")
        return "file";
      if (scheme === "https")
        return "https";
      if (scheme === "package")
        return "package";
      return scheme;
    },
    _Uri__makeUserInfo(userInfo, start, end) {
      if (userInfo == null)
        return "";
      return A._Uri__normalizeOrSubstring(userInfo, start, end, B.List_OL3, false, false);
    },
    _Uri__makePath(path, start, end, pathSegments, scheme, hasAuthority) {
      var t1, result,
        isFile = scheme === "file",
        ensureLeadingSlash = isFile || hasAuthority;
      if (path == null) {
        if (pathSegments == null)
          return isFile ? "/" : "";
        t1 = A._arrayInstanceType(pathSegments);
        result = new A.MappedListIterable(pathSegments, t1._eval$1("String(1)")._as(new A._Uri__makePath_closure()), t1._eval$1("MappedListIterable<1,String>")).join$1(0, "/");
      } else if (pathSegments != null)
        throw A.wrapException(A.ArgumentError$("Both path and pathSegments specified", null));
      else
        result = A._Uri__normalizeOrSubstring(path, start, end, B.List_XRg, true, true);
      if (result.length === 0) {
        if (isFile)
          return "/";
      } else if (ensureLeadingSlash && !B.JSString_methods.startsWith$1(result, "/"))
        result = "/" + result;
      return A._Uri__normalizePath(result, scheme, hasAuthority);
    },
    _Uri__normalizePath(path, scheme, hasAuthority) {
      var t1 = scheme.length === 0;
      if (t1 && !hasAuthority && !B.JSString_methods.startsWith$1(path, "/") && !B.JSString_methods.startsWith$1(path, "\\"))
        return A._Uri__normalizeRelativePath(path, !t1 || hasAuthority);
      return A._Uri__removeDotSegments(path);
    },
    _Uri__makeQuery(query, start, end, queryParameters) {
      if (query != null)
        return A._Uri__normalizeOrSubstring(query, start, end, B.List_oFp, true, false);
      return null;
    },
    _Uri__makeFragment(fragment, start, end) {
      if (fragment == null)
        return null;
      return A._Uri__normalizeOrSubstring(fragment, start, end, B.List_oFp, true, false);
    },
    _Uri__normalizeEscape(source, index, lowerCase) {
      var t3, firstDigit, secondDigit, firstDigitValue, secondDigitValue, value,
        t1 = index + 2,
        t2 = source.length;
      if (t1 >= t2)
        return "%";
      t3 = index + 1;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(source, t3);
      firstDigit = source.charCodeAt(t3);
      if (!(t1 >= 0))
        return A.ioore(source, t1);
      secondDigit = source.charCodeAt(t1);
      firstDigitValue = A.hexDigitValue(firstDigit);
      secondDigitValue = A.hexDigitValue(secondDigit);
      if (firstDigitValue < 0 || secondDigitValue < 0)
        return "%";
      value = firstDigitValue * 16 + secondDigitValue;
      if (value < 127) {
        t1 = B.JSInt_methods._shrOtherPositive$1(value, 4);
        if (!(t1 < 8))
          return A.ioore(B.List_M1A, t1);
        t1 = (B.List_M1A[t1] & 1 << (value & 15)) !== 0;
      } else
        t1 = false;
      if (t1)
        return A.Primitives_stringFromCharCode(lowerCase && 65 <= value && 90 >= value ? (value | 32) >>> 0 : value);
      if (firstDigit >= 97 || secondDigit >= 97)
        return B.JSString_methods.substring$2(source, index, index + 3).toUpperCase();
      return null;
    },
    _Uri__escapeChar(char) {
      var codeUnits, t1, flag, encodedBytes, index, byte, t2, t3,
        _s16_ = "0123456789ABCDEF";
      if (char < 128) {
        codeUnits = new Uint8Array(3);
        codeUnits[0] = 37;
        t1 = char >>> 4;
        if (!(t1 < 16))
          return A.ioore(_s16_, t1);
        codeUnits[1] = _s16_.charCodeAt(t1);
        codeUnits[2] = _s16_.charCodeAt(char & 15);
      } else {
        if (char > 2047)
          if (char > 65535) {
            flag = 240;
            encodedBytes = 4;
          } else {
            flag = 224;
            encodedBytes = 3;
          }
        else {
          flag = 192;
          encodedBytes = 2;
        }
        t1 = 3 * encodedBytes;
        codeUnits = new Uint8Array(t1);
        for (index = 0; --encodedBytes, encodedBytes >= 0; flag = 128) {
          byte = B.JSInt_methods._shrReceiverPositive$1(char, 6 * encodedBytes) & 63 | flag;
          if (!(index < t1))
            return A.ioore(codeUnits, index);
          codeUnits[index] = 37;
          t2 = index + 1;
          t3 = byte >>> 4;
          if (!(t3 < 16))
            return A.ioore(_s16_, t3);
          if (!(t2 < t1))
            return A.ioore(codeUnits, t2);
          codeUnits[t2] = _s16_.charCodeAt(t3);
          t3 = index + 2;
          if (!(t3 < t1))
            return A.ioore(codeUnits, t3);
          codeUnits[t3] = _s16_.charCodeAt(byte & 15);
          index += 3;
        }
      }
      return A.String_String$fromCharCodes(codeUnits, 0, null);
    },
    _Uri__normalizeOrSubstring(component, start, end, charTable, escapeDelimiters, replaceBackslash) {
      var t1 = A._Uri__normalize(component, start, end, charTable, escapeDelimiters, replaceBackslash);
      return t1 == null ? B.JSString_methods.substring$2(component, start, end) : t1;
    },
    _Uri__normalize(component, start, end, charTable, escapeDelimiters, replaceBackslash) {
      var t1, t2, index, sectionStart, buffer, char, t3, replacement, sourceLength, tail, t4, _null = null;
      for (t1 = !escapeDelimiters, t2 = component.length, index = start, sectionStart = index, buffer = _null; index < end;) {
        if (!(index >= 0 && index < t2))
          return A.ioore(component, index);
        char = component.charCodeAt(index);
        if (char < 127) {
          t3 = char >>> 4;
          if (!(t3 < 8))
            return A.ioore(charTable, t3);
          t3 = (charTable[t3] & 1 << (char & 15)) !== 0;
        } else
          t3 = false;
        if (t3)
          ++index;
        else {
          if (char === 37) {
            replacement = A._Uri__normalizeEscape(component, index, false);
            if (replacement == null) {
              index += 3;
              continue;
            }
            if ("%" === replacement) {
              replacement = "%25";
              sourceLength = 1;
            } else
              sourceLength = 3;
          } else if (char === 92 && replaceBackslash) {
            replacement = "/";
            sourceLength = 1;
          } else {
            if (t1)
              if (char <= 93) {
                t3 = char >>> 4;
                if (!(t3 < 8))
                  return A.ioore(B.List_YmH, t3);
                t3 = (B.List_YmH[t3] & 1 << (char & 15)) !== 0;
              } else
                t3 = false;
            else
              t3 = false;
            if (t3) {
              A._Uri__fail(component, index, "Invalid character");
              sourceLength = _null;
              replacement = sourceLength;
            } else {
              if ((char & 64512) === 55296) {
                t3 = index + 1;
                if (t3 < end) {
                  if (!(t3 < t2))
                    return A.ioore(component, t3);
                  tail = component.charCodeAt(t3);
                  if ((tail & 64512) === 56320) {
                    char = (char & 1023) << 10 | tail & 1023 | 65536;
                    sourceLength = 2;
                  } else
                    sourceLength = 1;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              replacement = A._Uri__escapeChar(char);
            }
          }
          if (buffer == null) {
            buffer = new A.StringBuffer("");
            t3 = buffer;
          } else
            t3 = buffer;
          t4 = t3._contents += B.JSString_methods.substring$2(component, sectionStart, index);
          t3._contents = t4 + A.S(replacement);
          if (typeof sourceLength !== "number")
            return A.iae(sourceLength);
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return _null;
      if (sectionStart < end)
        buffer._contents += B.JSString_methods.substring$2(component, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__mayContainDotSegments(path) {
      if (B.JSString_methods.startsWith$1(path, "."))
        return true;
      return B.JSString_methods.indexOf$1(path, "/.") !== -1;
    },
    _Uri__removeDotSegments(path) {
      var output, t1, t2, appendSlash, _i, segment, t3;
      if (!A._Uri__mayContainDotSegments(path))
        return path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (J.$eq$(segment, "..")) {
          t3 = output.length;
          if (t3 !== 0) {
            if (0 >= t3)
              return A.ioore(output, -1);
            output.pop();
            if (output.length === 0)
              B.JSArray_methods.add$1(output, "");
          }
          appendSlash = true;
        } else if ("." === segment)
          appendSlash = true;
        else {
          B.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      if (appendSlash)
        B.JSArray_methods.add$1(output, "");
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__normalizeRelativePath(path, allowScheme) {
      var output, t1, t2, appendSlash, _i, segment;
      if (!A._Uri__mayContainDotSegments(path))
        return !allowScheme ? A._Uri__escapeScheme(path) : path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (".." === segment)
          if (output.length !== 0 && B.JSArray_methods.get$last(output) !== "..") {
            if (0 >= output.length)
              return A.ioore(output, -1);
            output.pop();
            appendSlash = true;
          } else {
            B.JSArray_methods.add$1(output, "..");
            appendSlash = false;
          }
        else if ("." === segment)
          appendSlash = true;
        else {
          B.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      t1 = output.length;
      if (t1 !== 0)
        if (t1 === 1) {
          if (0 >= t1)
            return A.ioore(output, 0);
          t1 = output[0].length === 0;
        } else
          t1 = false;
      else
        t1 = true;
      if (t1)
        return "./";
      if (appendSlash || B.JSArray_methods.get$last(output) === "..")
        B.JSArray_methods.add$1(output, "");
      if (!allowScheme) {
        if (0 >= output.length)
          return A.ioore(output, 0);
        B.JSArray_methods.$indexSet(output, 0, A._Uri__escapeScheme(output[0]));
      }
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__escapeScheme(path) {
      var i, char, t2,
        t1 = path.length;
      if (t1 >= 2 && A._Uri__isAlphabeticCharacter(path.charCodeAt(0)))
        for (i = 1; i < t1; ++i) {
          char = path.charCodeAt(i);
          if (char === 58)
            return B.JSString_methods.substring$2(path, 0, i) + "%3A" + B.JSString_methods.substring$1(path, i + 1);
          if (char <= 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_MMm, t2);
            t2 = (B.List_MMm[t2] & 1 << (char & 15)) === 0;
          } else
            t2 = true;
          if (t2)
            break;
        }
      return path;
    },
    _Uri__isAlphabeticCharacter(codeUnit) {
      var lowerCase = codeUnit | 32;
      return 97 <= lowerCase && lowerCase <= 122;
    },
    UriData__parse(text, start, sourceUri) {
      var t1, i, slashIndex, char, equalsIndex, lastSeparator, t2, data,
        _s17_ = "Invalid MIME type",
        indices = A._setArrayType([start - 1], type$.JSArray_int);
      for (t1 = text.length, i = start, slashIndex = -1, char = null; i < t1; ++i) {
        char = text.charCodeAt(i);
        if (char === 44 || char === 59)
          break;
        if (char === 47) {
          if (slashIndex < 0) {
            slashIndex = i;
            continue;
          }
          throw A.wrapException(A.FormatException$(_s17_, text, i));
        }
      }
      if (slashIndex < 0 && i > start)
        throw A.wrapException(A.FormatException$(_s17_, text, i));
      for (; char !== 44;) {
        B.JSArray_methods.add$1(indices, i);
        ++i;
        for (equalsIndex = -1; i < t1; ++i) {
          if (!(i >= 0))
            return A.ioore(text, i);
          char = text.charCodeAt(i);
          if (char === 61) {
            if (equalsIndex < 0)
              equalsIndex = i;
          } else if (char === 59 || char === 44)
            break;
        }
        if (equalsIndex >= 0)
          B.JSArray_methods.add$1(indices, equalsIndex);
        else {
          lastSeparator = B.JSArray_methods.get$last(indices);
          if (char !== 44 || i !== lastSeparator + 7 || !B.JSString_methods.startsWith$2(text, "base64", lastSeparator + 1))
            throw A.wrapException(A.FormatException$("Expecting '='", text, i));
          break;
        }
      }
      B.JSArray_methods.add$1(indices, i);
      t2 = i + 1;
      if ((indices.length & 1) === 1)
        text = B.C_Base64Codec.normalize$3(0, text, t2, t1);
      else {
        data = A._Uri__normalize(text, t2, t1, B.List_oFp, true, false);
        if (data != null)
          text = B.JSString_methods.replaceRange$3(text, t2, t1, data);
      }
      return new A.UriData(text, indices, sourceUri);
    },
    _createTables() {
      var _i, t2, t3, t4, t5,
        _s77_ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=",
        _s1_ = ".", _s1_0 = ":", _s1_1 = "/", _s1_2 = "\\", _s1_3 = "?", _s1_4 = "#", _s2_ = "/\\",
        t1 = type$.Uint8List,
        tables = J.JSArray_JSArray$allocateGrowable(22, t1);
      for (_i = 0; _i < 22; ++_i)
        tables[_i] = new Uint8Array(96);
      t2 = new A._createTables_build(tables);
      t3 = new A._createTables_setChars();
      t4 = new A._createTables_setRange();
      t5 = t1._as(t2.call$2(0, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_, 14);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 3);
      t3.call$3(t5, _s1_2, 227);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(14, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_, 15);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s2_, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(15, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, "%", 225);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 9);
      t3.call$3(t5, _s1_2, 233);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(1, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(2, 235));
      t3.call$3(t5, _s77_, 139);
      t3.call$3(t5, _s1_1, 131);
      t3.call$3(t5, _s1_2, 131);
      t3.call$3(t5, _s1_, 146);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(3, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 68);
      t3.call$3(t5, _s1_2, 68);
      t3.call$3(t5, _s1_, 18);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(4, 229));
      t3.call$3(t5, _s77_, 5);
      t4.call$3(t5, "AZ", 229);
      t3.call$3(t5, _s1_0, 102);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, "[", 232);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 138);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(5, 229));
      t3.call$3(t5, _s77_, 5);
      t4.call$3(t5, "AZ", 229);
      t3.call$3(t5, _s1_0, 102);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 138);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(6, 231));
      t4.call$3(t5, "19", 7);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 138);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(7, 231));
      t4.call$3(t5, "09", 7);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 138);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t3.call$3(t1._as(t2.call$2(8, 8)), "]", 5);
      t5 = t1._as(t2.call$2(9, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 16);
      t3.call$3(t5, _s2_, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(16, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 17);
      t3.call$3(t5, _s2_, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(17, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 9);
      t3.call$3(t5, _s1_2, 233);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(10, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 18);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(18, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 19);
      t3.call$3(t5, _s2_, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(19, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s2_, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(11, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 234);
      t3.call$3(t5, _s1_3, 172);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(12, 236));
      t3.call$3(t5, _s77_, 12);
      t3.call$3(t5, _s1_3, 12);
      t3.call$3(t5, _s1_4, 205);
      t5 = t1._as(t2.call$2(13, 237));
      t3.call$3(t5, _s77_, 13);
      t3.call$3(t5, _s1_3, 13);
      t4.call$3(t1._as(t2.call$2(20, 245)), "az", 21);
      t2 = t1._as(t2.call$2(21, 245));
      t4.call$3(t2, "az", 21);
      t4.call$3(t2, "09", 21);
      t3.call$3(t2, "+-.", 21);
      return tables;
    },
    _scan(uri, start, end, state, indices) {
      var t1, i, table, char, transition,
        tables = $.$get$_scannerTables();
      for (t1 = uri.length, i = start; i < end; ++i) {
        if (!(state >= 0 && state < tables.length))
          return A.ioore(tables, state);
        table = tables[state];
        if (!(i < t1))
          return A.ioore(uri, i);
        char = uri.charCodeAt(i) ^ 96;
        transition = table[char > 95 ? 31 : char];
        state = transition & 31;
        B.JSArray_methods.$indexSet(indices, transition >>> 5, i);
      }
      return state;
    },
    _caseInsensitiveCompareStart(prefix, string, start) {
      var t1, t2, result, i, t3, stringChar, delta, lowerChar;
      for (t1 = prefix.length, t2 = string.length, result = 0, i = 0; i < t1; ++i) {
        t3 = start + i;
        if (!(t3 < t2))
          return A.ioore(string, t3);
        stringChar = string.charCodeAt(t3);
        delta = prefix.charCodeAt(i) ^ stringChar;
        if (delta !== 0) {
          if (delta === 32) {
            lowerChar = stringChar | delta;
            if (97 <= lowerChar && lowerChar <= 122) {
              result = 32;
              continue;
            }
          }
          return -1;
        }
      }
      return result;
    },
    _BigIntImpl: function _BigIntImpl(t0, t1, t2) {
      this._isNegative = t0;
      this._digits = t1;
      this._used = t2;
    },
    _BigIntImpl_hashCode_combine: function _BigIntImpl_hashCode_combine() {
    },
    _BigIntImpl_hashCode_finish: function _BigIntImpl_hashCode_finish() {
    },
    _symbolMapToStringMap_closure: function _symbolMapToStringMap_closure(t0) {
      this.result = t0;
    },
    NoSuchMethodError_toString_closure: function NoSuchMethodError_toString_closure(t0, t1) {
      this._box_0 = t0;
      this.sb = t1;
    },
    DateTime: function DateTime(t0, t1) {
      this._value = t0;
      this.isUtc = t1;
    },
    Duration: function Duration(t0) {
      this._duration = t0;
    },
    Error: function Error() {
    },
    AssertionError: function AssertionError(t0) {
      this.message = t0;
    },
    TypeError: function TypeError() {
    },
    ArgumentError: function ArgumentError(t0, t1, t2, t3) {
      var _ = this;
      _._hasValue = t0;
      _.invalidValue = t1;
      _.name = t2;
      _.message = t3;
    },
    RangeError: function RangeError(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _.start = t0;
      _.end = t1;
      _._hasValue = t2;
      _.invalidValue = t3;
      _.name = t4;
      _.message = t5;
    },
    IndexError: function IndexError(t0, t1, t2, t3, t4) {
      var _ = this;
      _.length = t0;
      _._hasValue = t1;
      _.invalidValue = t2;
      _.name = t3;
      _.message = t4;
    },
    NoSuchMethodError: function NoSuchMethodError(t0, t1, t2, t3) {
      var _ = this;
      _._core$_receiver = t0;
      _._core$_memberName = t1;
      _._core$_arguments = t2;
      _._namedArguments = t3;
    },
    UnsupportedError: function UnsupportedError(t0) {
      this.message = t0;
    },
    UnimplementedError: function UnimplementedError(t0) {
      this.message = t0;
    },
    StateError: function StateError(t0) {
      this.message = t0;
    },
    ConcurrentModificationError: function ConcurrentModificationError(t0) {
      this.modifiedObject = t0;
    },
    OutOfMemoryError: function OutOfMemoryError() {
    },
    StackOverflowError: function StackOverflowError() {
    },
    _Exception: function _Exception(t0) {
      this.message = t0;
    },
    FormatException: function FormatException(t0, t1, t2) {
      this.message = t0;
      this.source = t1;
      this.offset = t2;
    },
    IntegerDivisionByZeroException: function IntegerDivisionByZeroException() {
    },
    Iterable: function Iterable() {
    },
    Null: function Null() {
    },
    Object: function Object() {
    },
    _StringStackTrace: function _StringStackTrace(t0) {
      this._stackTrace = t0;
    },
    StringBuffer: function StringBuffer(t0) {
      this._contents = t0;
    },
    Uri__parseIPv4Address_error: function Uri__parseIPv4Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_error: function Uri_parseIPv6Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_parseHex: function Uri_parseIPv6Address_parseHex(t0, t1) {
      this.error = t0;
      this.host = t1;
    },
    _Uri: function _Uri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $;
    },
    _Uri__makePath_closure: function _Uri__makePath_closure() {
    },
    UriData: function UriData(t0, t1, t2) {
      this._text = t0;
      this._separatorIndices = t1;
      this._uriCache = t2;
    },
    _createTables_build: function _createTables_build(t0) {
      this.tables = t0;
    },
    _createTables_setChars: function _createTables_setChars() {
    },
    _createTables_setRange: function _createTables_setRange() {
    },
    _SimpleUri: function _SimpleUri(t0, t1, t2, t3, t4, t5, t6, t7) {
      var _ = this;
      _._uri = t0;
      _._schemeEnd = t1;
      _._hostStart = t2;
      _._portStart = t3;
      _._pathStart = t4;
      _._queryStart = t5;
      _._fragmentStart = t6;
      _._schemeCache = t7;
      _._hashCodeCache = null;
    },
    _DataUri: function _DataUri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $;
    },
    Expando: function Expando(t0, t1) {
      this._jsWeakMap = t0;
      this.$ti = t1;
    },
    CustomEvent_CustomEvent(type, detail) {
      var e, t1, exception,
        canBubble = true,
        cancelable = true;
      detail = detail;
      t1 = document.createEvent("CustomEvent");
      t1.toString;
      e = type$.CustomEvent._as(t1);
      e._dartDetail = detail;
      if (type$.List_dynamic._is(detail) || type$.Map_dynamic_dynamic._is(detail) || typeof detail == "string" || typeof detail == "number")
        try {
          detail = new A._StructuredCloneDart2Js([], []).walk$1(detail);
          J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
        } catch (exception) {
          J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
        }
      else
        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
      return e;
    },
    Element_Element$html(html, treeSanitizer, validator) {
      var t2,
        t1 = document.body;
      t1.toString;
      t2 = type$._ChildNodeListLazy;
      t2 = new A.WhereIterable(new A._ChildNodeListLazy(B.BodyElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator)), t2._eval$1("bool(ListBase.E)")._as(new A.Element_Element$html_closure()), t2._eval$1("WhereIterable<ListBase.E>"));
      return type$.Element._as(t2.get$single(t2));
    },
    Element__safeTagName(element) {
      var t1, exception,
        result = "element tag unavailable";
      try {
        t1 = element.tagName;
        t1.toString;
        result = t1;
      } catch (exception) {
      }
      return result;
    },
    HttpRequest_request(url, method, responseType, withCredentials) {
      var t3, t4,
        t1 = new A._Future($.Zone__current, type$._Future_HttpRequest),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_HttpRequest),
        t2 = new XMLHttpRequest();
      t2.toString;
      B.HttpRequest_methods.open$3$async(t2, method, url, true);
      if (withCredentials != null)
        B.HttpRequest_methods.set$withCredentials(t2, withCredentials);
      if (responseType != null)
        t2.responseType = responseType;
      t3 = type$.nullable_void_Function_ProgressEvent;
      t4 = type$.ProgressEvent;
      A._EventStreamSubscription$(t2, "load", t3._as(new A.HttpRequest_request_closure(t2, completer)), false, t4);
      A._EventStreamSubscription$(t2, "error", t3._as(completer.get$completeError()), false, t4);
      t2.send();
      return t1;
    },
    ScriptElement___new_tearOff() {
      var t1 = document.createElement("script");
      t1.toString;
      return t1;
    },
    _EventStreamSubscription$(_target, _eventType, onData, _useCapture, $T) {
      var t1 = onData == null ? null : A._wrapZone(new A._EventStreamSubscription_closure(onData), type$.Event);
      t1 = new A._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
      t1._tryResume$0();
      return t1;
    },
    _Html5NodeValidator$(uriPolicy) {
      var t1 = document.createElement("a");
      t1.toString;
      t1 = new A._SameOriginUriPolicy(t1, type$.Location._as(window.location));
      t1 = new A._Html5NodeValidator(t1);
      t1._Html5NodeValidator$1$uriPolicy(uriPolicy);
      return t1;
    },
    _Html5NodeValidator__standardAttributeValidator(element, attributeName, value, context) {
      type$.Element._as(element);
      A._asString(attributeName);
      A._asString(value);
      type$._Html5NodeValidator._as(context);
      return true;
    },
    _Html5NodeValidator__uriAttributeValidator(element, attributeName, value, context) {
      var t1, t2, t3, t4, t5;
      type$.Element._as(element);
      A._asString(attributeName);
      A._asString(value);
      t1 = type$._Html5NodeValidator._as(context).uriPolicy;
      t2 = t1._hiddenAnchor;
      B.AnchorElement_methods.set$href(t2, value);
      t3 = t2.hostname;
      t1 = t1._loc;
      if (t3 == t1.hostname) {
        t4 = t2.port;
        t5 = t1.port;
        t5.toString;
        if (t4 === t5) {
          t4 = t2.protocol;
          t1 = t1.protocol;
          t1.toString;
          t1 = t4 === t1;
        } else
          t1 = false;
      } else
        t1 = false;
      if (!t1)
        if (t3 === "")
          if (t2.port === "") {
            t1 = t2.protocol;
            t1 = t1 === ":" || t1 === "";
          } else
            t1 = false;
        else
          t1 = false;
      else
        t1 = true;
      return t1;
    },
    _TemplatingNodeValidator$() {
      var t1 = type$.String,
        t2 = A.LinkedHashSet_LinkedHashSet$from(B.List_AuK, t1),
        t3 = A._setArrayType(["TEMPLATE"], type$.JSArray_String),
        t4 = type$.String_Function_String._as(new A._TemplatingNodeValidator_closure());
      t1 = new A._TemplatingNodeValidator(t2, A.LinkedHashSet_LinkedHashSet(t1), A.LinkedHashSet_LinkedHashSet(t1), A.LinkedHashSet_LinkedHashSet(t1), null);
      t1._SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(null, new A.MappedListIterable(B.List_AuK, t4, type$.MappedListIterable_String_String), t3, null);
      return t1;
    },
    _convertNativeToDart_XHR_Response(o) {
      if (type$.Document._is(o))
        return o;
      return new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(o, true);
    },
    _DOMWindowCrossFrame__createSafe(w) {
      var t1 = window;
      t1.toString;
      if (w === t1)
        return type$.WindowBase._as(w);
      else
        return new A._DOMWindowCrossFrame();
    },
    _wrapZone(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    HtmlElement: function HtmlElement() {
    },
    AccessibleNodeList: function AccessibleNodeList() {
    },
    AnchorElement: function AnchorElement() {
    },
    AreaElement: function AreaElement() {
    },
    BaseElement: function BaseElement() {
    },
    Blob: function Blob() {
    },
    BodyElement: function BodyElement() {
    },
    CharacterData: function CharacterData() {
    },
    CssPerspective: function CssPerspective() {
    },
    CssRule: function CssRule() {
    },
    CssStyleDeclaration: function CssStyleDeclaration() {
    },
    CssStyleDeclarationBase: function CssStyleDeclarationBase() {
    },
    CssStyleValue: function CssStyleValue() {
    },
    CssTransformComponent: function CssTransformComponent() {
    },
    CssTransformValue: function CssTransformValue() {
    },
    CssUnparsedValue: function CssUnparsedValue() {
    },
    CustomEvent: function CustomEvent() {
    },
    DataTransferItemList: function DataTransferItemList() {
    },
    Document: function Document() {
    },
    DomException: function DomException() {
    },
    DomImplementation: function DomImplementation() {
    },
    DomRectList: function DomRectList() {
    },
    DomRectReadOnly: function DomRectReadOnly() {
    },
    DomStringList: function DomStringList() {
    },
    DomTokenList: function DomTokenList() {
    },
    _FrozenElementList: function _FrozenElementList(t0, t1) {
      this._nodeList = t0;
      this.$ti = t1;
    },
    Element: function Element() {
    },
    Element_Element$html_closure: function Element_Element$html_closure() {
    },
    Event: function Event() {
    },
    EventTarget: function EventTarget() {
    },
    File: function File() {
    },
    FileList: function FileList() {
    },
    FileWriter: function FileWriter() {
    },
    FormElement: function FormElement() {
    },
    Gamepad: function Gamepad() {
    },
    History: function History() {
    },
    HtmlCollection: function HtmlCollection() {
    },
    HtmlDocument: function HtmlDocument() {
    },
    HttpRequest: function HttpRequest() {
    },
    HttpRequest_request_closure: function HttpRequest_request_closure(t0, t1) {
      this.xhr = t0;
      this.completer = t1;
    },
    HttpRequestEventTarget: function HttpRequestEventTarget() {
    },
    ImageData: function ImageData() {
    },
    KeyboardEvent: function KeyboardEvent() {
    },
    Location: function Location() {
    },
    MediaList: function MediaList() {
    },
    MessageEvent: function MessageEvent() {
    },
    MessagePort: function MessagePort() {
    },
    MidiInputMap: function MidiInputMap() {
    },
    MidiInputMap_keys_closure: function MidiInputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MidiOutputMap: function MidiOutputMap() {
    },
    MidiOutputMap_keys_closure: function MidiOutputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MimeType: function MimeType() {
    },
    MimeTypeArray: function MimeTypeArray() {
    },
    _ChildNodeListLazy: function _ChildNodeListLazy(t0) {
      this._this = t0;
    },
    Node: function Node() {
    },
    NodeList: function NodeList() {
    },
    Plugin: function Plugin() {
    },
    PluginArray: function PluginArray() {
    },
    ProgressEvent: function ProgressEvent() {
    },
    RtcStatsReport: function RtcStatsReport() {
    },
    RtcStatsReport_keys_closure: function RtcStatsReport_keys_closure(t0) {
      this.keys = t0;
    },
    ScriptElement: function ScriptElement() {
    },
    SelectElement: function SelectElement() {
    },
    SharedArrayBuffer: function SharedArrayBuffer() {
    },
    SourceBuffer: function SourceBuffer() {
    },
    SourceBufferList: function SourceBufferList() {
    },
    SpeechGrammar: function SpeechGrammar() {
    },
    SpeechGrammarList: function SpeechGrammarList() {
    },
    SpeechRecognitionResult: function SpeechRecognitionResult() {
    },
    Storage: function Storage() {
    },
    Storage_keys_closure: function Storage_keys_closure(t0) {
      this.keys = t0;
    },
    StyleSheet: function StyleSheet() {
    },
    TableElement: function TableElement() {
    },
    TableRowElement: function TableRowElement() {
    },
    TableSectionElement: function TableSectionElement() {
    },
    TemplateElement: function TemplateElement() {
    },
    TextTrack: function TextTrack() {
    },
    TextTrackCue: function TextTrackCue() {
    },
    TextTrackCueList: function TextTrackCueList() {
    },
    TextTrackList: function TextTrackList() {
    },
    TimeRanges: function TimeRanges() {
    },
    Touch: function Touch() {
    },
    TouchList: function TouchList() {
    },
    TrackDefaultList: function TrackDefaultList() {
    },
    UIEvent: function UIEvent() {
    },
    Url: function Url() {
    },
    VideoTrackList: function VideoTrackList() {
    },
    Window: function Window() {
    },
    WorkerGlobalScope: function WorkerGlobalScope() {
    },
    _Attr: function _Attr() {
    },
    _CssRuleList: function _CssRuleList() {
    },
    _DomRect: function _DomRect() {
    },
    _GamepadList: function _GamepadList() {
    },
    _NamedNodeMap: function _NamedNodeMap() {
    },
    _SpeechRecognitionResultList: function _SpeechRecognitionResultList() {
    },
    _StyleSheetList: function _StyleSheetList() {
    },
    _AttributeMap: function _AttributeMap() {
    },
    _ElementAttributeMap: function _ElementAttributeMap(t0) {
      this._element = t0;
    },
    EventStreamProvider: function EventStreamProvider(t0, t1) {
      this._eventType = t0;
      this.$ti = t1;
    },
    _EventStream0: function _EventStream0(t0, t1, t2, t3) {
      var _ = this;
      _._target = t0;
      _._eventType = t1;
      _._useCapture = t2;
      _.$ti = t3;
    },
    _EventStreamSubscription: function _EventStreamSubscription(t0, t1, t2, t3, t4) {
      var _ = this;
      _._pauseCount = 0;
      _._target = t0;
      _._eventType = t1;
      _._onData = t2;
      _._useCapture = t3;
      _.$ti = t4;
    },
    _EventStreamSubscription_closure: function _EventStreamSubscription_closure(t0) {
      this.onData = t0;
    },
    _EventStreamSubscription_onData_closure0: function _EventStreamSubscription_onData_closure0(t0) {
      this.handleData = t0;
    },
    _Html5NodeValidator: function _Html5NodeValidator(t0) {
      this.uriPolicy = t0;
    },
    ImmutableListMixin: function ImmutableListMixin() {
    },
    NodeValidatorBuilder: function NodeValidatorBuilder(t0) {
      this._validators = t0;
    },
    NodeValidatorBuilder_allowsElement_closure: function NodeValidatorBuilder_allowsElement_closure(t0) {
      this.element = t0;
    },
    NodeValidatorBuilder_allowsAttribute_closure: function NodeValidatorBuilder_allowsAttribute_closure(t0, t1, t2) {
      this.element = t0;
      this.attributeName = t1;
      this.value = t2;
    },
    _SimpleNodeValidator: function _SimpleNodeValidator() {
    },
    _SimpleNodeValidator_closure: function _SimpleNodeValidator_closure() {
    },
    _SimpleNodeValidator_closure0: function _SimpleNodeValidator_closure0() {
    },
    _TemplatingNodeValidator: function _TemplatingNodeValidator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._templateAttrs = t0;
      _.allowedElements = t1;
      _.allowedAttributes = t2;
      _.allowedUriAttributes = t3;
      _.uriPolicy = t4;
    },
    _TemplatingNodeValidator_closure: function _TemplatingNodeValidator_closure() {
    },
    _SvgNodeValidator: function _SvgNodeValidator() {
    },
    FixedSizeListIterator: function FixedSizeListIterator(t0, t1, t2) {
      var _ = this;
      _._array = t0;
      _._length = t1;
      _._position = -1;
      _._current = null;
      _.$ti = t2;
    },
    _DOMWindowCrossFrame: function _DOMWindowCrossFrame() {
    },
    _SameOriginUriPolicy: function _SameOriginUriPolicy(t0, t1) {
      this._hiddenAnchor = t0;
      this._loc = t1;
    },
    _ValidatingTreeSanitizer: function _ValidatingTreeSanitizer(t0) {
      this.validator = t0;
      this.numTreeModifications = 0;
    },
    _ValidatingTreeSanitizer_sanitizeTree_walk: function _ValidatingTreeSanitizer_sanitizeTree_walk(t0) {
      this.$this = t0;
    },
    _CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase: function _CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase() {
    },
    _DomRectList_JavaScriptObject_ListMixin: function _DomRectList_JavaScriptObject_ListMixin() {
    },
    _DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin: function _DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _DomStringList_JavaScriptObject_ListMixin: function _DomStringList_JavaScriptObject_ListMixin() {
    },
    _DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin: function _DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _FileList_JavaScriptObject_ListMixin: function _FileList_JavaScriptObject_ListMixin() {
    },
    _FileList_JavaScriptObject_ListMixin_ImmutableListMixin: function _FileList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _HtmlCollection_JavaScriptObject_ListMixin: function _HtmlCollection_JavaScriptObject_ListMixin() {
    },
    _HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin: function _HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _MidiInputMap_JavaScriptObject_MapMixin: function _MidiInputMap_JavaScriptObject_MapMixin() {
    },
    _MidiOutputMap_JavaScriptObject_MapMixin: function _MidiOutputMap_JavaScriptObject_MapMixin() {
    },
    _MimeTypeArray_JavaScriptObject_ListMixin: function _MimeTypeArray_JavaScriptObject_ListMixin() {
    },
    _MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin: function _MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _NodeList_JavaScriptObject_ListMixin: function _NodeList_JavaScriptObject_ListMixin() {
    },
    _NodeList_JavaScriptObject_ListMixin_ImmutableListMixin: function _NodeList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _PluginArray_JavaScriptObject_ListMixin: function _PluginArray_JavaScriptObject_ListMixin() {
    },
    _PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin: function _PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _RtcStatsReport_JavaScriptObject_MapMixin: function _RtcStatsReport_JavaScriptObject_MapMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin: function _SourceBufferList_EventTarget_ListMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin: function _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _SpeechGrammarList_JavaScriptObject_ListMixin: function _SpeechGrammarList_JavaScriptObject_ListMixin() {
    },
    _SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin: function _SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _Storage_JavaScriptObject_MapMixin: function _Storage_JavaScriptObject_MapMixin() {
    },
    _TextTrackCueList_JavaScriptObject_ListMixin: function _TextTrackCueList_JavaScriptObject_ListMixin() {
    },
    _TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin: function _TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin: function _TextTrackList_EventTarget_ListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin_ImmutableListMixin: function _TextTrackList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _TouchList_JavaScriptObject_ListMixin: function _TouchList_JavaScriptObject_ListMixin() {
    },
    _TouchList_JavaScriptObject_ListMixin_ImmutableListMixin: function _TouchList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __CssRuleList_JavaScriptObject_ListMixin: function __CssRuleList_JavaScriptObject_ListMixin() {
    },
    __CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin: function __CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __GamepadList_JavaScriptObject_ListMixin: function __GamepadList_JavaScriptObject_ListMixin() {
    },
    __GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin: function __GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __NamedNodeMap_JavaScriptObject_ListMixin: function __NamedNodeMap_JavaScriptObject_ListMixin() {
    },
    __NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin: function __NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __SpeechRecognitionResultList_JavaScriptObject_ListMixin: function __SpeechRecognitionResultList_JavaScriptObject_ListMixin() {
    },
    __SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin: function __SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __StyleSheetList_JavaScriptObject_ListMixin: function __StyleSheetList_JavaScriptObject_ListMixin() {
    },
    __StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin: function __StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _convertNativeToDart_Value(value) {
      var t1, values, i;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || A._isBool(value))
        return value;
      if (A.isJavaScriptSimpleObject(value))
        return A.convertNativeToDart_Dictionary(value);
      t1 = Array.isArray(value);
      t1.toString;
      if (t1) {
        values = [];
        i = 0;
        while (true) {
          t1 = value.length;
          t1.toString;
          if (!(i < t1))
            break;
          values.push(A._convertNativeToDart_Value(value[i]));
          ++i;
        }
        return values;
      }
      return value;
    },
    convertNativeToDart_Dictionary(object) {
      var dict, keys, t1, _i, key, t2;
      if (object == null)
        return null;
      dict = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = Object.getOwnPropertyNames(object);
      for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
        key = keys[_i];
        t2 = key;
        t2.toString;
        dict.$indexSet(0, t2, A._convertNativeToDart_Value(object[key]));
      }
      return dict;
    },
    isJavaScriptSimpleObject(value) {
      var proto = Object.getPrototypeOf(value),
        t1 = proto === Object.prototype;
      t1.toString;
      if (!t1) {
        t1 = proto === null;
        t1.toString;
      } else
        t1 = true;
      return t1;
    },
    _StructuredClone: function _StructuredClone() {
    },
    _StructuredClone_walk_closure: function _StructuredClone_walk_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _StructuredClone_walk_closure0: function _StructuredClone_walk_closure0(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _AcceptStructuredClone: function _AcceptStructuredClone() {
    },
    _AcceptStructuredClone_walk_closure: function _AcceptStructuredClone_walk_closure(t0, t1) {
      this.$this = t0;
      this.map = t1;
    },
    _StructuredCloneDart2Js: function _StructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
    },
    _AcceptStructuredCloneDart2Js: function _AcceptStructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
      this.mustCopy = false;
    },
    KeyRange: function KeyRange() {
    },
    _callDartFunction(callback, captureThis, $self, $arguments) {
      var arguments0, t1, dartArgs;
      A._asBool(captureThis);
      type$.List_dynamic._as($arguments);
      if (captureThis) {
        arguments0 = [$self];
        B.JSArray_methods.addAll$1(arguments0, $arguments);
        $arguments = arguments0;
      }
      t1 = type$.dynamic;
      dartArgs = A.List_List$from(J.map$1$1$ax($arguments, A.js___convertToDart$closure(), t1), true, t1);
      return A._convertToJS(A.Function_apply(type$.Function._as(callback), dartArgs, null));
    },
    JsObject_JsObject$fromBrowserObject(object) {
      var t1 = false;
      if (t1)
        throw A.wrapException(A.ArgumentError$("object cannot be a num, string, bool, or null", null));
      return A._wrapToDart(A._convertToJS(object));
    },
    JsObject__convertDataTree(data) {
      return new A.JsObject__convertDataTree__convert(new A._IdentityHashMap(type$._IdentityHashMap_dynamic_dynamic)).call$1(data);
    },
    _castToJsObject(o) {
      return o;
    },
    _defineProperty(o, $name, value) {
      var exception;
      try {
        if (Object.isExtensible(o) && !Object.prototype.hasOwnProperty.call(o, $name)) {
          Object.defineProperty(o, $name, {value: value});
          return true;
        }
      } catch (exception) {
      }
      return false;
    },
    _getOwnProperty(o, $name) {
      if (Object.prototype.hasOwnProperty.call(o, $name))
        return o[$name];
      return null;
    },
    _convertToJS(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || A._isBool(o))
        return o;
      if (o instanceof A.JsObject)
        return o._jsObject;
      if (A.isBrowserObject(o))
        return o;
      if (type$.TypedData._is(o))
        return o;
      if (o instanceof A.DateTime)
        return A.Primitives_lazyAsJsDate(o);
      if (type$.Function._is(o))
        return A._getJsProxy(o, "$dart_jsFunction", new A._convertToJS_closure());
      return A._getJsProxy(o, "_$dart_jsObject", new A._convertToJS_closure0($.$get$_dartProxyCtor()));
    },
    _getJsProxy(o, propertyName, createProxy) {
      var jsProxy = A._getOwnProperty(o, propertyName);
      if (jsProxy == null) {
        jsProxy = createProxy.call$1(o);
        A._defineProperty(o, propertyName, jsProxy);
      }
      return jsProxy;
    },
    _convertToDart(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
        return o;
      else if (o instanceof Object && A.isBrowserObject(o))
        return o;
      else if (o instanceof Object && type$.TypedData._is(o))
        return o;
      else if (o instanceof Date)
        return A.DateTime$fromMillisecondsSinceEpoch(A._asInt(o.getTime()), false);
      else if (o.constructor === $.$get$_dartProxyCtor())
        return o.o;
      else
        return A._wrapToDart(o);
    },
    _wrapToDart(o) {
      if (typeof o == "function")
        return A._getDartProxy(o, $.$get$DART_CLOSURE_PROPERTY_NAME(), new A._wrapToDart_closure());
      if (o instanceof Array)
        return A._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new A._wrapToDart_closure0());
      return A._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new A._wrapToDart_closure1());
    },
    _getDartProxy(o, propertyName, createProxy) {
      var dartProxy = A._getOwnProperty(o, propertyName);
      if (dartProxy == null || !(o instanceof Object)) {
        dartProxy = createProxy.call$1(o);
        A._defineProperty(o, propertyName, dartProxy);
      }
      return dartProxy;
    },
    JsObject__convertDataTree__convert: function JsObject__convertDataTree__convert(t0) {
      this._convertedObjects = t0;
    },
    _convertToJS_closure: function _convertToJS_closure() {
    },
    _convertToJS_closure0: function _convertToJS_closure0(t0) {
      this.ctor = t0;
    },
    _wrapToDart_closure: function _wrapToDart_closure() {
    },
    _wrapToDart_closure0: function _wrapToDart_closure0() {
    },
    _wrapToDart_closure1: function _wrapToDart_closure1() {
    },
    JsObject: function JsObject(t0) {
      this._jsObject = t0;
    },
    JsFunction: function JsFunction(t0) {
      this._jsObject = t0;
    },
    JsArray: function JsArray(t0, t1) {
      this._jsObject = t0;
      this.$ti = t1;
    },
    _JsArray_JsObject_ListMixin: function _JsArray_JsObject_ListMixin() {
    },
    _convertDartFunctionFast(f) {
      var ret,
        existing = f.$dart_jsFunction;
      if (existing != null)
        return existing;
      ret = function(_call, f) {
        return function() {
          return _call(f, Array.prototype.slice.apply(arguments));
        };
      }(A._callDartFunctionFast, f);
      ret[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      f.$dart_jsFunction = ret;
      return ret;
    },
    _callDartFunctionFast(callback, $arguments) {
      type$.List_dynamic._as($arguments);
      return A.Function_apply(type$.Function._as(callback), $arguments, null);
    },
    allowInterop(f, $F) {
      if (typeof f == "function")
        return f;
      else
        return $F._as(A._convertDartFunctionFast(f));
    },
    _noJsifyRequired(o) {
      return o == null || A._isBool(o) || typeof o == "number" || typeof o == "string" || type$.Int8List._is(o) || type$.Uint8List._is(o) || type$.Uint8ClampedList._is(o) || type$.Int16List._is(o) || type$.Uint16List._is(o) || type$.Int32List._is(o) || type$.Uint32List._is(o) || type$.Float32List._is(o) || type$.Float64List._is(o) || type$.ByteBuffer._is(o) || type$.ByteData._is(o);
    },
    jsify(object) {
      if (A._noJsifyRequired(object))
        return object;
      return new A.jsify__convert(new A._IdentityHashMap(type$._IdentityHashMap_of_nullable_Object_and_nullable_Object)).call$1(object);
    },
    promiseToFuture(jsPromise, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new A._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      jsPromise.then(A.convertDartClosureToJS(new A.promiseToFuture_closure(completer, $T), 1), A.convertDartClosureToJS(new A.promiseToFuture_closure0(completer), 1));
      return t1;
    },
    _noDartifyRequired(o) {
      return o == null || typeof o === "boolean" || typeof o === "number" || typeof o === "string" || o instanceof Int8Array || o instanceof Uint8Array || o instanceof Uint8ClampedArray || o instanceof Int16Array || o instanceof Uint16Array || o instanceof Int32Array || o instanceof Uint32Array || o instanceof Float32Array || o instanceof Float64Array || o instanceof ArrayBuffer || o instanceof DataView;
    },
    dartify(o) {
      if (A._noDartifyRequired(o))
        return o;
      return new A.dartify_convert(new A._IdentityHashMap(type$._IdentityHashMap_of_nullable_Object_and_nullable_Object)).call$1(o);
    },
    jsify__convert: function jsify__convert(t0) {
      this._convertedObjects = t0;
    },
    promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
      this.completer = t0;
      this.T = t1;
    },
    promiseToFuture_closure0: function promiseToFuture_closure0(t0) {
      this.completer = t0;
    },
    dartify_convert: function dartify_convert(t0) {
      this._convertedObjects = t0;
    },
    NullRejectionException: function NullRejectionException(t0) {
      this.isUndefined = t0;
    },
    Random_Random(seed) {
      var t1;
      if (seed == null)
        t1 = B.C__JSRandom;
      else {
        t1 = new A._Random();
        t1._Random$1(seed);
      }
      return t1;
    },
    _JSRandom: function _JSRandom() {
    },
    _Random: function _Random() {
      this._hi = this._lo = 0;
    },
    Length: function Length() {
    },
    LengthList: function LengthList() {
    },
    Number: function Number() {
    },
    NumberList: function NumberList() {
    },
    PointList: function PointList() {
    },
    ScriptElement0: function ScriptElement0() {
    },
    StringList: function StringList() {
    },
    SvgElement: function SvgElement() {
    },
    Transform: function Transform() {
    },
    TransformList: function TransformList() {
    },
    _LengthList_JavaScriptObject_ListMixin: function _LengthList_JavaScriptObject_ListMixin() {
    },
    _LengthList_JavaScriptObject_ListMixin_ImmutableListMixin: function _LengthList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _NumberList_JavaScriptObject_ListMixin: function _NumberList_JavaScriptObject_ListMixin() {
    },
    _NumberList_JavaScriptObject_ListMixin_ImmutableListMixin: function _NumberList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _StringList_JavaScriptObject_ListMixin: function _StringList_JavaScriptObject_ListMixin() {
    },
    _StringList_JavaScriptObject_ListMixin_ImmutableListMixin: function _StringList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _TransformList_JavaScriptObject_ListMixin: function _TransformList_JavaScriptObject_ListMixin() {
    },
    _TransformList_JavaScriptObject_ListMixin_ImmutableListMixin: function _TransformList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    AudioBuffer: function AudioBuffer() {
    },
    AudioParamMap: function AudioParamMap() {
    },
    AudioParamMap_keys_closure: function AudioParamMap_keys_closure(t0) {
      this.keys = t0;
    },
    AudioTrackList: function AudioTrackList() {
    },
    BaseAudioContext: function BaseAudioContext() {
    },
    OfflineAudioContext: function OfflineAudioContext() {
    },
    _AudioParamMap_JavaScriptObject_MapMixin: function _AudioParamMap_JavaScriptObject_MapMixin() {
    },
    AsyncMemoizer: function AsyncMemoizer(t0, t1) {
      this._async_memoizer$_completer = t0;
      this.$ti = t1;
    },
    DelegatingStreamSink: function DelegatingStreamSink() {
    },
    ErrorResult: function ErrorResult(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ValueResult: function ValueResult(t0, t1) {
      this.value = t0;
      this.$ti = t1;
    },
    StreamQueue: function StreamQueue(t0, t1, t2, t3) {
      var _ = this;
      _._stream_queue$_source = t0;
      _._stream_queue$_subscription = null;
      _._isDone = false;
      _._eventsReceived = 0;
      _._eventQueue = t1;
      _._requestQueue = t2;
      _.$ti = t3;
    },
    StreamQueue__ensureListening_closure: function StreamQueue__ensureListening_closure(t0) {
      this.$this = t0;
    },
    StreamQueue__ensureListening_closure1: function StreamQueue__ensureListening_closure1(t0) {
      this.$this = t0;
    },
    StreamQueue__ensureListening_closure0: function StreamQueue__ensureListening_closure0(t0) {
      this.$this = t0;
    },
    _NextRequest: function _NextRequest(t0, t1) {
      this._stream_queue$_completer = t0;
      this.$ti = t1;
    },
    _HasNextRequest: function _HasNextRequest(t0, t1) {
      this._stream_queue$_completer = t0;
      this.$ti = t1;
    },
    hashObjects(objects) {
      return A._finish(B.JSArray_methods.fold$1$2(objects, 0, new A.hashObjects_closure(), type$.int));
    },
    _combine(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    _finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    hashObjects_closure: function hashObjects_closure() {
    },
    BuiltList_BuiltList$from(iterable, $E) {
      var t1;
      if (iterable instanceof A._BuiltList) {
        t1 = A.createRuntimeType($E);
        t1 = A.createRuntimeType(iterable.$ti._precomputed1) === t1;
      } else
        t1 = false;
      if (t1)
        return $E._eval$1("BuiltList<0>")._as(iterable);
      else {
        t1 = new A._BuiltList(A.List_List$from(iterable, false, $E), $E._eval$1("_BuiltList<0>"));
        t1._list$_maybeCheckForNull$0();
        return t1;
      }
    },
    ListBuilder_ListBuilder(iterable, $E) {
      var t1 = new A.ListBuilder($E._eval$1("ListBuilder<0>"));
      t1.replace$1(0, iterable);
      return t1;
    },
    BuiltList: function BuiltList() {
    },
    _BuiltList: function _BuiltList(t0, t1) {
      this._list = t0;
      this._list$_hashCode = null;
      this.$ti = t1;
    },
    ListBuilder: function ListBuilder(t0) {
      this.__ListBuilder__list_A = $;
      this._listOwner = null;
      this.$ti = t0;
    },
    BuiltListMultimap_BuiltListMultimap($K, $V) {
      var t1 = A._BuiltListMultimap$copy(B.Map_empty0.get$keys(B.Map_empty0), new A.BuiltListMultimap_BuiltListMultimap_closure(B.Map_empty0), $K, $V);
      return t1;
    },
    _BuiltListMultimap$copy(keys, lookup, $K, $V) {
      var t1 = new A._BuiltListMultimap(A.LinkedHashMap_LinkedHashMap$_empty($K, $V._eval$1("BuiltList<0>")), A.BuiltList_BuiltList$from(B.List_empty, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltListMultimap<1,2>"));
      t1._BuiltListMultimap$copy$2(keys, lookup, $K, $V);
      return t1;
    },
    ListMultimapBuilder_ListMultimapBuilder($K, $V) {
      var t1 = new A.ListMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("ListMultimapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty0);
      return t1;
    },
    BuiltListMultimap: function BuiltListMultimap() {
    },
    BuiltListMultimap_BuiltListMultimap_closure: function BuiltListMultimap_BuiltListMultimap_closure(t0) {
      this.multimap = t0;
    },
    BuiltListMultimap_hashCode_closure: function BuiltListMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltListMultimap: function _BuiltListMultimap(t0, t1, t2) {
      var _ = this;
      _._list_multimap$_map = t0;
      _._emptyList = t1;
      _._list_multimap$_keys = _._list_multimap$_hashCode = null;
      _.$ti = t2;
    },
    ListMultimapBuilder: function ListMultimapBuilder(t0) {
      var _ = this;
      _.__ListMultimapBuilder__builtMap_A = $;
      _._list_multimap$_builtMapOwner = null;
      _.__ListMultimapBuilder__builderMap_A = $;
      _.$ti = t0;
    },
    ListMultimapBuilder_replace_closure: function ListMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    BuiltMap_BuiltMap($K, $V) {
      var t1 = new A._BuiltMap(null, A.LinkedHashMap_LinkedHashMap$_empty($K, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltMap<1,2>"));
      t1._BuiltMap$copyAndCheckTypes$2(B.Map_empty0.get$keys(B.Map_empty0), new A.BuiltMap_BuiltMap_closure(B.Map_empty0), $K, $V);
      return t1;
    },
    MapBuilder_MapBuilder($K, $V) {
      var t1 = new A.MapBuilder(null, $, null, $K._eval$1("@<0>")._bind$1($V)._eval$1("MapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty0);
      return t1;
    },
    BuiltMap: function BuiltMap() {
    },
    BuiltMap_BuiltMap_closure: function BuiltMap_BuiltMap_closure(t0) {
      this.map = t0;
    },
    BuiltMap_hashCode_closure: function BuiltMap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltMap: function _BuiltMap(t0, t1, t2) {
      var _ = this;
      _._mapFactory = t0;
      _._map$_map = t1;
      _._map$_keys = _._map$_hashCode = null;
      _.$ti = t2;
    },
    MapBuilder: function MapBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._mapFactory = t0;
      _.__MapBuilder__map_A = t1;
      _._mapOwner = t2;
      _.$ti = t3;
    },
    MapBuilder_replace_closure: function MapBuilder_replace_closure(t0, t1) {
      this.$this = t0;
      this.replacement = t1;
    },
    BuiltSet_BuiltSet$from(iterable, $E) {
      var t1 = new A._BuiltSet(null, A.LinkedHashSet_LinkedHashSet$from(iterable, $E), $E._eval$1("_BuiltSet<0>"));
      t1._maybeCheckForNull$0();
      return t1;
    },
    SetBuilder_SetBuilder($E) {
      var t1 = new A.SetBuilder(null, $, null, $E._eval$1("SetBuilder<0>"));
      t1.replace$1(0, B.List_empty);
      return t1;
    },
    BuiltSet: function BuiltSet() {
    },
    BuiltSet_hashCode_closure: function BuiltSet_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSet: function _BuiltSet(t0, t1, t2) {
      var _ = this;
      _._setFactory = t0;
      _._set$_set = t1;
      _._set$_hashCode = null;
      _.$ti = t2;
    },
    SetBuilder: function SetBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._setFactory = t0;
      _.__SetBuilder__set_A = t1;
      _._setOwner = t2;
      _.$ti = t3;
    },
    SetMultimapBuilder_SetMultimapBuilder($K, $V) {
      var t1 = new A.SetMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("SetMultimapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty0);
      return t1;
    },
    BuiltSetMultimap: function BuiltSetMultimap() {
    },
    BuiltSetMultimap_hashCode_closure: function BuiltSetMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSetMultimap: function _BuiltSetMultimap(t0, t1, t2) {
      var _ = this;
      _._set_multimap$_map = t0;
      _._emptySet = t1;
      _._set_multimap$_keys = _._set_multimap$_hashCode = null;
      _.$ti = t2;
    },
    SetMultimapBuilder: function SetMultimapBuilder(t0) {
      var _ = this;
      _.__SetMultimapBuilder__builtMap_A = $;
      _._builtMapOwner = null;
      _.__SetMultimapBuilder__builderMap_A = $;
      _.$ti = t0;
    },
    SetMultimapBuilder_replace_closure: function SetMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    $jc(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $jf(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    BuiltValueNullFieldError_checkNotNull(value, type, field, $T) {
      if (value == null)
        throw A.wrapException(new A.BuiltValueNullFieldError(type, field));
      return value;
    },
    BuiltValueNestedFieldError$(type, field, error) {
      return new A.BuiltValueNestedFieldError(type, field, error);
    },
    EnumClass: function EnumClass() {
    },
    newBuiltValueToStringHelper_closure: function newBuiltValueToStringHelper_closure() {
    },
    IndentingBuiltValueToStringHelper: function IndentingBuiltValueToStringHelper(t0) {
      this._result = t0;
    },
    BuiltValueNullFieldError: function BuiltValueNullFieldError(t0, t1) {
      this.type = t0;
      this.field = t1;
    },
    BuiltValueNestedFieldError: function BuiltValueNestedFieldError(t0, t1, t2) {
      this.type = t0;
      this.field = t1;
      this.error = t2;
    },
    JsonObject_JsonObject(value) {
      if (typeof value == "number")
        return new A.NumJsonObject(value);
      else if (typeof value == "string")
        return new A.StringJsonObject(value);
      else if (A._isBool(value))
        return new A.BoolJsonObject(value);
      else if (type$.List_nullable_Object._is(value))
        return new A.ListJsonObject(new A.UnmodifiableListView(value, type$.UnmodifiableListView_nullable_Object));
      else if (type$.Map_of_String_and_nullable_Object._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(value, type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else if (type$.Map_dynamic_dynamic._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(J.cast$2$0$ax(value, type$.String, type$.nullable_Object), type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else
        throw A.wrapException(A.ArgumentError$value(value, "value", "Must be bool, List<Object?>, Map<String?, Object?>, num or String"));
    },
    JsonObject: function JsonObject() {
    },
    BoolJsonObject: function BoolJsonObject(t0) {
      this.value = t0;
    },
    ListJsonObject: function ListJsonObject(t0) {
      this.value = t0;
    },
    MapJsonObject: function MapJsonObject(t0) {
      this.value = t0;
    },
    NumJsonObject: function NumJsonObject(t0) {
      this.value = t0;
    },
    StringJsonObject: function StringJsonObject(t0) {
      this.value = t0;
    },
    Serializers_Serializers() {
      var t1 = type$.Type,
        t2 = type$.Serializer_dynamic,
        t3 = type$.String;
      t2 = new A.BuiltJsonSerializersBuilder(A.MapBuilder_MapBuilder(t1, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(type$.FullType, type$.Function), A.ListBuilder_ListBuilder(B.List_empty, type$.SerializerPlugin));
      t2.add$1(0, new A.BigIntSerializer(A.BuiltList_BuiltList$from([B.Type_BigInt_8OV, A.getRuntimeTypeOfDartObject($.$get$_BigIntImpl_zero())], t1)));
      t2.add$1(0, new A.BoolSerializer(A.BuiltList_BuiltList$from([B.Type_bool_lhE], t1)));
      t3 = type$.Object;
      t2.add$1(0, new A.BuiltListSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltList_iTR, A.getRuntimeTypeOfDartObject(A.BuiltList_BuiltList$from(B.List_empty, t3))], t1)));
      t2.add$1(0, new A.BuiltListMultimapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltListMultimap_2Mt, A.getRuntimeTypeOfDartObject(A.BuiltListMultimap_BuiltListMultimap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltMapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltMap_qd4, A.getRuntimeTypeOfDartObject(A.BuiltMap_BuiltMap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltSetSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltSet_fcN, A.getRuntimeTypeOfDartObject(A.BuiltSet_BuiltSet$from(B.List_empty, t3))], t1)));
      t2.add$1(0, new A.BuiltSetMultimapSerializer(A.BuiltSet_BuiltSet$from([B.Type_BuiltSetMultimap_9Fi], t1)));
      t2.add$1(0, new A.DateTimeSerializer(A.BuiltList_BuiltList$from([B.Type_DateTime_8AS], t1)));
      t2.add$1(0, new A.DoubleSerializer(A.BuiltList_BuiltList$from([B.Type_double_K1J], t1)));
      t2.add$1(0, new A.DurationSerializer(A.BuiltList_BuiltList$from([B.Type_Duration_SnA], t1)));
      t2.add$1(0, new A.IntSerializer(A.BuiltList_BuiltList$from([B.Type_int_tHn], t1)));
      t2.add$1(0, new A.Int32Serializer(A.BuiltList_BuiltList$from([B.Type_Int32_Mhf], t1)));
      t2.add$1(0, new A.Int64Serializer(A.BuiltList_BuiltList$from([B.Type_Int64_ww8], t1)));
      t2.add$1(0, new A.JsonObjectSerializer(A.BuiltList_BuiltList$from([B.Type_JsonObject_gyf, B.Type_BoolJsonObject_8HQ, B.Type_ListJsonObject_yPV, B.Type_MapJsonObject_bBG, B.Type_NumJsonObject_H9C, B.Type_StringJsonObject_GAC], t1)));
      t2.add$1(0, new A.NullSerializer(A.BuiltList_BuiltList$from([B.Type_Null_Yyn], t1)));
      t2.add$1(0, new A.NumSerializer(A.BuiltList_BuiltList$from([B.Type_num_cv7], t1)));
      t2.add$1(0, new A.RegExpSerializer(A.BuiltList_BuiltList$from([B.Type_RegExp_Eeh, $.$get$_runtimeType()], t1)));
      t2.add$1(0, new A.StringSerializer(A.BuiltList_BuiltList$from([B.Type_String_k8F], t1)));
      t2.add$1(0, new A.Uint8ListSerializer());
      t2.add$1(0, new A.UriSerializer(A.BuiltList_BuiltList$from([B.Type_Uri_EFX, A.getRuntimeTypeOfDartObject(A.Uri_parse("http://example.com")), A.getRuntimeTypeOfDartObject(A.Uri_parse("http://example.com:"))], t1)));
      t2.addBuilderFactory$2(B.FullType_WUY, new A.Serializers_Serializers_closure());
      t2.addBuilderFactory$2(B.FullType_fA4, new A.Serializers_Serializers_closure0());
      t2.addBuilderFactory$2(B.FullType_6Ps, new A.Serializers_Serializers_closure1());
      t2.addBuilderFactory$2(B.FullType_KVM, new A.Serializers_Serializers_closure2());
      t2.addBuilderFactory$2(B.FullType_gsm, new A.Serializers_Serializers_closure3());
      return t2.build$0();
    },
    FullType__getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    DeserializationError_DeserializationError(json, type, error) {
      var limitedJson = J.toString$0$(json),
        t1 = limitedJson.length;
      if (t1 > 80)
        B.JSString_methods.replaceRange$3(limitedJson, 77, t1, "...");
      return new A.DeserializationError(type, error);
    },
    Serializers_Serializers_closure: function Serializers_Serializers_closure() {
    },
    Serializers_Serializers_closure0: function Serializers_Serializers_closure0() {
    },
    Serializers_Serializers_closure1: function Serializers_Serializers_closure1() {
    },
    Serializers_Serializers_closure2: function Serializers_Serializers_closure2() {
    },
    Serializers_Serializers_closure3: function Serializers_Serializers_closure3() {
    },
    FullType: function FullType(t0, t1, t2) {
      this.root = t0;
      this.parameters = t1;
      this.nullable = t2;
    },
    DeserializationError: function DeserializationError(t0, t1) {
      this.type = t0;
      this.error = t1;
    },
    BigIntSerializer: function BigIntSerializer(t0) {
      this.types = t0;
    },
    BoolSerializer: function BoolSerializer(t0) {
      this.types = t0;
    },
    BuiltJsonSerializersBuilder$_(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins) {
      return new A.BuiltJsonSerializersBuilder(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins);
    },
    _getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    _noSerializerMessageFor(typeName) {
      var maybeRecordAdvice = B.JSString_methods.contains$1(typeName, "(") ? " Note that record types are not automatically serializable, please write and install your own `Serializer`." : "";
      return "No serializer for '" + typeName + "'." + maybeRecordAdvice;
    },
    BuiltJsonSerializers: function BuiltJsonSerializers(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _.builderFactories = t3;
      _.serializerPlugins = t4;
    },
    BuiltJsonSerializersBuilder: function BuiltJsonSerializersBuilder(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _._builderFactories = t3;
      _._plugins = t4;
    },
    BuiltListMultimapSerializer: function BuiltListMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltListMultimapSerializer_serialize_closure: function BuiltListMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListMultimapSerializer_deserialize_closure: function BuiltListMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListSerializer: function BuiltListSerializer(t0) {
      this.types = t0;
    },
    BuiltListSerializer_serialize_closure: function BuiltListSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltListSerializer_deserialize_closure: function BuiltListSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltMapSerializer: function BuiltMapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer: function BuiltSetMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer_serialize_closure: function BuiltSetMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetMultimapSerializer_deserialize_closure: function BuiltSetMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetSerializer: function BuiltSetSerializer(t0) {
      this.types = t0;
    },
    BuiltSetSerializer_serialize_closure: function BuiltSetSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltSetSerializer_deserialize_closure: function BuiltSetSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    DateTimeSerializer: function DateTimeSerializer(t0) {
      this.types = t0;
    },
    DoubleSerializer: function DoubleSerializer(t0) {
      this.types = t0;
    },
    DurationSerializer: function DurationSerializer(t0) {
      this.types = t0;
    },
    Int32Serializer: function Int32Serializer(t0) {
      this.types = t0;
    },
    Int64Serializer: function Int64Serializer(t0) {
      this.types = t0;
    },
    IntSerializer: function IntSerializer(t0) {
      this.types = t0;
    },
    JsonObjectSerializer: function JsonObjectSerializer(t0) {
      this.types = t0;
    },
    NullSerializer: function NullSerializer(t0) {
      this.types = t0;
    },
    NumSerializer: function NumSerializer(t0) {
      this.types = t0;
    },
    RegExpSerializer: function RegExpSerializer(t0) {
      this.types = t0;
    },
    StringSerializer: function StringSerializer(t0) {
      this.types = t0;
    },
    Uint8ListSerializer: function Uint8ListSerializer() {
    },
    UriSerializer: function UriSerializer(t0) {
      this.types = t0;
    },
    DefaultEquality: function DefaultEquality(t0) {
      this.$ti = t0;
    },
    IterableEquality: function IterableEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    ListEquality: function ListEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _UnorderedEquality: function _UnorderedEquality() {
    },
    SetEquality: function SetEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _MapEntry: function _MapEntry(t0, t1, t2) {
      this.equality = t0;
      this.key = t1;
      this.value = t2;
    },
    MapEquality: function MapEquality(t0, t1, t2) {
      this._keyEquality = t0;
      this._valueEquality = t1;
      this.$ti = t2;
    },
    DeepCollectionEquality: function DeepCollectionEquality() {
    },
    QueueList__computeInitialCapacity(initialCapacity) {
      return 8;
    },
    QueueList: function QueueList(t0, t1, t2, t3) {
      var _ = this;
      _._queue_list$_table = t0;
      _._queue_list$_head = t1;
      _._queue_list$_tail = t2;
      _.$ti = t3;
    },
    _CastQueueList: function _CastQueueList(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue_list$_delegate = t0;
      _._queue_list$_table = t1;
      _._queue_list$_head = t2;
      _._queue_list$_tail = t3;
      _.$ti = t4;
    },
    _QueueList_Object_ListMixin: function _QueueList_Object_ListMixin() {
    },
    _$valueOf($name) {
      switch ($name) {
        case "started":
          return B.BuildStatus_started;
        case "succeeded":
          return B.BuildStatus_succeeded;
        case "failed":
          return B.BuildStatus_failed;
        default:
          throw A.wrapException(A.ArgumentError$($name, null));
      }
    },
    BuildStatus: function BuildStatus(t0) {
      this.name = t0;
    },
    BuildResult: function BuildResult() {
    },
    _$BuildStatusSerializer: function _$BuildStatusSerializer() {
    },
    _$BuildResultSerializer: function _$BuildResultSerializer() {
    },
    _$BuildResult: function _$BuildResult(t0) {
      this.status = t0;
    },
    BuildResultBuilder: function BuildResultBuilder() {
      this._status = this._build_result$_$v = null;
    },
    ConnectRequest: function ConnectRequest() {
    },
    _$ConnectRequestSerializer: function _$ConnectRequestSerializer() {
    },
    _$ConnectRequest: function _$ConnectRequest(t0, t1, t2) {
      this.appId = t0;
      this.instanceId = t1;
      this.entrypointPath = t2;
    },
    ConnectRequestBuilder: function ConnectRequestBuilder() {
      var _ = this;
      _._entrypointPath = _._instanceId = _._appId = _._$v = null;
    },
    DebugEvent: function DebugEvent() {
    },
    BatchedDebugEvents: function BatchedDebugEvents() {
    },
    _$DebugEventSerializer: function _$DebugEventSerializer() {
    },
    _$BatchedDebugEventsSerializer: function _$BatchedDebugEventsSerializer() {
    },
    _$DebugEvent: function _$DebugEvent(t0, t1, t2) {
      this.kind = t0;
      this.eventData = t1;
      this.timestamp = t2;
    },
    DebugEventBuilder: function DebugEventBuilder() {
      var _ = this;
      _._timestamp = _._eventData = _._debug_event$_kind = _._debug_event$_$v = null;
    },
    _$BatchedDebugEvents: function _$BatchedDebugEvents(t0) {
      this.events = t0;
    },
    BatchedDebugEventsBuilder: function BatchedDebugEventsBuilder() {
      this._events = this._debug_event$_$v = null;
    },
    DebugInfo: function DebugInfo() {
    },
    _$DebugInfoSerializer: function _$DebugInfoSerializer() {
    },
    _$DebugInfo: function _$DebugInfo(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.appEntrypointPath = t0;
      _.appId = t1;
      _.appInstanceId = t2;
      _.appOrigin = t3;
      _.appUrl = t4;
      _.authUrl = t5;
      _.dwdsVersion = t6;
      _.extensionUrl = t7;
      _.isInternalBuild = t8;
      _.isFlutterApp = t9;
      _.workspaceName = t10;
      _.tabUrl = t11;
      _.tabId = t12;
    },
    DebugInfoBuilder: function DebugInfoBuilder() {
      var _ = this;
      _._tabId = _._tabUrl = _._workspaceName = _._isFlutterApp = _._isInternalBuild = _._extensionUrl = _._dwdsVersion = _._authUrl = _._appUrl = _._appOrigin = _._appInstanceId = _._debug_info$_appId = _._appEntrypointPath = _._debug_info$_$v = null;
    },
    DevToolsRequest: function DevToolsRequest() {
    },
    DevToolsResponse: function DevToolsResponse() {
    },
    _$DevToolsRequestSerializer: function _$DevToolsRequestSerializer() {
    },
    _$DevToolsResponseSerializer: function _$DevToolsResponseSerializer() {
    },
    _$DevToolsRequest: function _$DevToolsRequest(t0, t1, t2, t3, t4) {
      var _ = this;
      _.appId = t0;
      _.instanceId = t1;
      _.contextId = t2;
      _.tabUrl = t3;
      _.uriOnly = t4;
    },
    DevToolsRequestBuilder: function DevToolsRequestBuilder() {
      var _ = this;
      _._uriOnly = _._devtools_request$_tabUrl = _._contextId = _._devtools_request$_instanceId = _._devtools_request$_appId = _._devtools_request$_$v = null;
    },
    _$DevToolsResponse: function _$DevToolsResponse(t0, t1, t2) {
      this.success = t0;
      this.promptExtension = t1;
      this.error = t2;
    },
    DevToolsResponseBuilder: function DevToolsResponseBuilder() {
      var _ = this;
      _._error = _._promptExtension = _._success = _._devtools_request$_$v = null;
    },
    ErrorResponse: function ErrorResponse() {
    },
    _$ErrorResponseSerializer: function _$ErrorResponseSerializer() {
    },
    _$ErrorResponse: function _$ErrorResponse(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ErrorResponseBuilder: function ErrorResponseBuilder() {
      this._error_response$_stackTrace = this._error_response$_error = this._error_response$_$v = null;
    },
    ExtensionRequest: function ExtensionRequest() {
    },
    ExtensionResponse: function ExtensionResponse() {
    },
    ExtensionEvent: function ExtensionEvent() {
    },
    BatchedEvents: function BatchedEvents() {
    },
    _$ExtensionRequestSerializer: function _$ExtensionRequestSerializer() {
    },
    _$ExtensionResponseSerializer: function _$ExtensionResponseSerializer() {
    },
    _$ExtensionEventSerializer: function _$ExtensionEventSerializer() {
    },
    _$BatchedEventsSerializer: function _$BatchedEventsSerializer() {
    },
    _$ExtensionRequest: function _$ExtensionRequest(t0, t1, t2) {
      this.id = t0;
      this.command = t1;
      this.commandParams = t2;
    },
    ExtensionRequestBuilder: function ExtensionRequestBuilder() {
      var _ = this;
      _._commandParams = _._command = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionResponse: function _$ExtensionResponse(t0, t1, t2, t3) {
      var _ = this;
      _.id = t0;
      _.success = t1;
      _.result = t2;
      _.error = t3;
    },
    ExtensionResponseBuilder: function ExtensionResponseBuilder() {
      var _ = this;
      _._extension_request$_error = _._extension_request$_result = _._extension_request$_success = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionEvent: function _$ExtensionEvent(t0, t1) {
      this.params = t0;
      this.method = t1;
    },
    ExtensionEventBuilder: function ExtensionEventBuilder() {
      this._extension_request$_method = this._params = this._extension_request$_$v = null;
    },
    _$BatchedEvents: function _$BatchedEvents(t0) {
      this.events = t0;
    },
    BatchedEventsBuilder: function BatchedEventsBuilder() {
      this._extension_request$_events = this._extension_request$_$v = null;
    },
    IsolateExit: function IsolateExit() {
    },
    IsolateStart: function IsolateStart() {
    },
    _$IsolateExitSerializer: function _$IsolateExitSerializer() {
    },
    _$IsolateStartSerializer: function _$IsolateStartSerializer() {
    },
    _$IsolateExit: function _$IsolateExit() {
    },
    IsolateExitBuilder: function IsolateExitBuilder() {
      this._isolate_events$_$v = null;
    },
    _$IsolateStart: function _$IsolateStart() {
    },
    IsolateStartBuilder: function IsolateStartBuilder() {
      this._isolate_events$_$v = null;
    },
    RegisterEvent: function RegisterEvent() {
    },
    _$RegisterEventSerializer: function _$RegisterEventSerializer() {
    },
    _$RegisterEvent: function _$RegisterEvent(t0, t1) {
      this.eventData = t0;
      this.timestamp = t1;
    },
    RegisterEventBuilder: function RegisterEventBuilder() {
      this._register_event$_timestamp = this._register_event$_eventData = this._register_event$_$v = null;
    },
    RunRequest: function RunRequest() {
    },
    _$RunRequestSerializer: function _$RunRequestSerializer() {
    },
    _$RunRequest: function _$RunRequest() {
    },
    _$serializers_closure: function _$serializers_closure() {
    },
    _$serializers_closure0: function _$serializers_closure0() {
    },
    BatchedStreamController: function BatchedStreamController(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._checkDelayMilliseconds = t0;
      _._batchDelayMilliseconds = t1;
      _._inputController = t2;
      _.__BatchedStreamController__inputQueue_A = $;
      _._outputController = t3;
      _._completer = t4;
      _.$ti = t5;
    },
    BatchedStreamController__hasEventOrTimeOut_closure: function BatchedStreamController__hasEventOrTimeOut_closure() {
    },
    BatchedStreamController__hasEventDuring_closure: function BatchedStreamController__hasEventDuring_closure() {
    },
    SocketClient: function SocketClient() {
    },
    SseSocketClient: function SseSocketClient(t0) {
      this._sockets$_client = t0;
    },
    WebSocketClient: function WebSocketClient(t0) {
      this._channel = t0;
    },
    WebSocketClient_stream_closure: function WebSocketClient_stream_closure() {
    },
    safeUnawaited(future) {
      future.catchError$1(new A.safeUnawaited_closure());
    },
    safeUnawaited_closure: function safeUnawaited_closure() {
    },
    Int32: function Int32(t0) {
      this._i = t0;
    },
    Int64__parseRadix(s, radix, throwOnError) {
      var i, negative, t1, d0, d1, d2, digit, d00, d10;
      if (B.JSString_methods.startsWith$1(s, "-")) {
        i = 1;
        negative = true;
      } else {
        i = 0;
        negative = false;
      }
      t1 = s.length;
      if (i >= t1)
        throw A.wrapException(A.FormatException$("No digits", s, i));
      for (d0 = 0, d1 = 0, d2 = 0; i < t1; ++i, d1 = d10, d0 = d00) {
        digit = A.decodeDigit(s.charCodeAt(i));
        if (digit < radix) {
          d0 = d0 * radix + digit;
          d00 = d0 & 4194303;
          d1 = d1 * radix + B.JSInt_methods._shrOtherPositive$1(d0, 22);
          d10 = d1 & 4194303;
          d2 = d2 * radix + (d1 >>> 22) & 1048575;
        } else
          throw A.wrapException(A.FormatException$("Not radix digit", s, i));
      }
      if (negative)
        return A.Int64__sub(0, 0, 0, d0, d1, d2);
      return new A.Int64(d0 & 4194303, d1 & 4194303, d2 & 1048575);
    },
    Int64_Int64(value) {
      var negative, v2, v1, t1, t2, t3;
      if (value < 0) {
        value = -value;
        negative = true;
      } else
        negative = false;
      v2 = B.JSInt_methods._tdivFast$1(value, 17592186044416);
      value -= v2 * 17592186044416;
      v1 = B.JSInt_methods._tdivFast$1(value, 4194304);
      t1 = value - v1 * 4194304 & 4194303;
      t2 = v1 & 4194303;
      t3 = v2 & 1048575;
      return negative ? A.Int64__sub(0, 0, 0, t1, t2, t3) : new A.Int64(t1, t2, t3);
    },
    Int64__promote(value) {
      if (value instanceof A.Int64)
        return value;
      else if (A._isInt(value))
        return A.Int64_Int64(value);
      else if (value instanceof A.Int32)
        return A.Int64_Int64(value._i);
      throw A.wrapException(A.ArgumentError$value(value, "other", "not an int, Int32 or Int64"));
    },
    Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign) {
      var d4, d3, fatRadix, chunk1, chunk2, chunk3, q, q0, q1, q2, q3, chunk10, residue;
      if (d0 === 0 && d1 === 0 && d2 === 0)
        return "0";
      d4 = (d2 << 4 | d1 >>> 18) >>> 0;
      d3 = d1 >>> 8 & 1023;
      d2 = (d1 << 2 | d0 >>> 20) & 1023;
      d1 = d0 >>> 10 & 1023;
      d0 &= 1023;
      if (!(radix < 37))
        return A.ioore(B.List_Icz, radix);
      fatRadix = B.List_Icz[radix];
      chunk1 = "";
      chunk2 = "";
      chunk3 = "";
      while (true) {
        if (!!(d4 === 0 && d3 === 0))
          break;
        q = B.JSInt_methods.$tdiv(d4, fatRadix);
        d3 += d4 - q * fatRadix << 10 >>> 0;
        q0 = B.JSInt_methods.$tdiv(d3, fatRadix);
        d2 += d3 - q0 * fatRadix << 10 >>> 0;
        q1 = B.JSInt_methods.$tdiv(d2, fatRadix);
        d1 += d2 - q1 * fatRadix << 10 >>> 0;
        q2 = B.JSInt_methods.$tdiv(d1, fatRadix);
        d0 += d1 - q2 * fatRadix << 10 >>> 0;
        q3 = B.JSInt_methods.$tdiv(d0, fatRadix);
        chunk10 = B.JSString_methods.substring$1(B.JSInt_methods.toRadixString$1(fatRadix + (d0 - q3 * fatRadix), radix), 1);
        chunk3 = chunk2;
        chunk2 = chunk1;
        chunk1 = chunk10;
        d3 = q0;
        d4 = q;
        d2 = q1;
        d1 = q2;
        d0 = q3;
      }
      residue = (d2 << 20 >>> 0) + (d1 << 10 >>> 0) + d0;
      return sign + (residue === 0 ? "" : B.JSInt_methods.toRadixString$1(residue, radix)) + chunk1 + chunk2 + chunk3;
    },
    Int64__sub(a0, a1, a2, b0, b1, b2) {
      var diff0 = a0 - b0,
        diff1 = a1 - b1 - (B.JSInt_methods._shrOtherPositive$1(diff0, 22) & 1);
      return new A.Int64(diff0 & 4194303, diff1 & 4194303, a2 - b2 - (B.JSInt_methods._shrOtherPositive$1(diff1, 22) & 1) & 1048575);
    },
    Int64: function Int64(t0, t1, t2) {
      this._l = t0;
      this._m = t1;
      this._h = t2;
    },
    stronglyConnectedComponents(nodes, edges, $T) {
      var t2, t3, _i, t4, index, t5, state, node, iterator, index0, lowLink, t6, next, component, t7, result0, _null = null,
        result = A._setArrayType([], $T._eval$1("JSArray<List<0>>")),
        t1 = type$.int,
        lowLinks = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        indexes = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        onStack = A.HashSet_HashSet(_null, _null, $T),
        lastVisited = A.ListQueue$($T);
      t1 = A._setArrayType([], $T._eval$1("JSArray<_StackState<0>>"));
      for (t2 = nodes.length, t3 = $T._eval$1("_StackState<0>"), _i = 0; _i < nodes.length; nodes.length === t2 || (0, A.throwConcurrentModificationError)(nodes), ++_i)
        t1.push(new A._StackState(nodes[_i], _null, t3));
      $label0$0:
        for (t2 = lastVisited.$ti._precomputed1, t4 = $T._eval$1("JSArray<0>"), index = 0; t5 = t1.length, t5 !== 0;) {
          if (0 >= t5)
            return A.ioore(t1, -1);
          state = t1.pop();
          node = state.node;
          iterator = state.iterator;
          if (iterator == null) {
            if (indexes.containsKey$1(0, node))
              continue $label0$0;
            indexes.$indexSet(0, node, index);
            lowLinks.$indexSet(0, node, index);
            index0 = index + 1;
            iterator = J.get$iterator$ax(edges.call$1(node));
            if (!iterator.moveNext$0()) {
              B.JSArray_methods.add$1(result, A._setArrayType([node], t4));
              index = index0;
              continue $label0$0;
            }
            lastVisited._collection$_add$1(0, t2._as(node));
            onStack.add$1(0, node);
            lowLink = index;
            index = index0;
          } else {
            t5 = lowLinks.$index(0, node);
            t5.toString;
            t6 = lowLinks.$index(0, iterator.get$current(iterator));
            t6.toString;
            lowLink = Math.min(A.checkNum(t5), A.checkNum(t6));
          }
          do {
            next = iterator.get$current(iterator);
            if (!indexes.containsKey$1(0, next)) {
              B.JSArray_methods.add$1(t1, new A._StackState(node, iterator, t3));
              B.JSArray_methods.add$1(t1, new A._StackState(next, _null, t3));
              continue $label0$0;
            } else if (onStack.contains$1(0, next)) {
              t5 = indexes.$index(0, next);
              t5.toString;
              lowLink = Math.min(lowLink, A.checkNum(t5));
              lowLinks.$indexSet(0, node, lowLink);
            }
          } while (iterator.moveNext$0());
          if (lowLink === indexes.$index(0, node)) {
            component = A._setArrayType([], t4);
            do {
              t5 = lastVisited._head;
              t6 = lastVisited._tail;
              if (t5 === t6)
                A.throwExpression(A.IterableElementError_noElement());
              ++lastVisited._modificationCount;
              t5 = lastVisited._table;
              t7 = t5.length;
              t6 = (t6 - 1 & t7 - 1) >>> 0;
              lastVisited._tail = t6;
              if (!(t6 >= 0 && t6 < t7))
                return A.ioore(t5, t6);
              result0 = t5[t6];
              if (result0 == null)
                result0 = t2._as(result0);
              B.JSArray_methods.$indexSet(t5, t6, _null);
              onStack.remove$1(0, result0);
              B.JSArray_methods.add$1(component, result0);
            } while (!A.boolConversionCheck(A._defaultEquals(result0, node)));
            B.JSArray_methods.add$1(result, component);
          }
        }
      return result;
    },
    _defaultEquals(a, b) {
      return J.$eq$(a, b);
    },
    _StackState: function _StackState(t0, t1, t2) {
      this.node = t0;
      this.iterator = t1;
      this.$ti = t2;
    },
    Level: function Level(t0, t1) {
      this.name = t0;
      this.value = t1;
    },
    LogRecord: function LogRecord(t0, t1, t2) {
      this.level = t0;
      this.message = t1;
      this.loggerName = t2;
    },
    Logger_Logger($name) {
      return $.Logger__loggers.putIfAbsent$2(0, $name, new A.Logger_Logger_closure($name));
    },
    Logger: function Logger(t0, t1, t2) {
      var _ = this;
      _.name = t0;
      _.parent = t1;
      _._level = null;
      _._children = t2;
    },
    Logger_Logger_closure: function Logger_Logger_closure(t0) {
      this.name = t0;
    },
    Pool: function Pool(t0, t1, t2, t3, t4) {
      var _ = this;
      _._requestedResources = t0;
      _._onReleaseCallbacks = t1;
      _._onReleaseCompleters = t2;
      _._maxAllocatedResources = t3;
      _._allocatedResources = 0;
      _._timer = null;
      _._closeMemo = t4;
    },
    Pool__runOnRelease_closure: function Pool__runOnRelease_closure(t0) {
      this.$this = t0;
    },
    Pool__runOnRelease_closure0: function Pool__runOnRelease_closure0(t0) {
      this.$this = t0;
    },
    PoolResource: function PoolResource(t0) {
      this._pool = t0;
      this._released = false;
    },
    SseClient$(serverUrl, debugKey) {
      var t3, t4, t5, _null = null,
        t1 = type$.String,
        t2 = A.StreamController_StreamController(_null, _null, false, t1);
      t1 = A.StreamController_StreamController(_null, _null, false, t1);
      t3 = A.Logger_Logger("SseClient");
      t4 = $.Zone__current;
      t5 = A.generateUuidV4();
      t1 = new A.SseClient(debugKey + "-" + t5, t2, t1, t3, new A._AsyncCompleter(new A._Future(t4, type$._Future_void), type$._AsyncCompleter_void));
      t1.SseClient$2$debugKey(serverUrl, debugKey);
      return t1;
    },
    SseClient: function SseClient(t0, t1, t2, t3, t4) {
      var _ = this;
      _._clientId = t0;
      _._incomingController = t1;
      _._outgoingController = t2;
      _._logger = t3;
      _._onConnected = t4;
      _._lastMessageId = -1;
      _.__SseClient__serverUrl_A = _.__SseClient__eventSource_A = $;
      _._errorTimer = null;
    },
    SseClient_closure: function SseClient_closure(t0) {
      this.$this = t0;
    },
    SseClient_closure0: function SseClient_closure0(t0) {
      this.$this = t0;
    },
    SseClient_closure1: function SseClient_closure1(t0) {
      this.$this = t0;
    },
    SseClient__closure: function SseClient__closure(t0, t1) {
      this.$this = t0;
      this.error = t1;
    },
    SseClient__onOutgoingMessage_closure: function SseClient__onOutgoingMessage_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.message = t2;
    },
    generateUuidV4() {
      var t1 = new A.generateUuidV4_printDigits(),
        t2 = new A.generateUuidV4_bitsDigits(t1, new A.generateUuidV4_generateBits(B.C__JSRandom)),
        t3 = B.C__JSRandom.nextInt$1(4);
      return A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + "-" + A.S(t2.call$2(16, 4)) + "-4" + A.S(t2.call$2(12, 3)) + "-" + A.S(t1.call$2(8 + t3, 1)) + A.S(t2.call$2(12, 3)) + "-" + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4));
    },
    generateUuidV4_generateBits: function generateUuidV4_generateBits(t0) {
      this.random = t0;
    },
    generateUuidV4_printDigits: function generateUuidV4_printDigits() {
    },
    generateUuidV4_bitsDigits: function generateUuidV4_bitsDigits(t0, t1) {
      this.printDigits = t0;
      this.generateBits = t1;
    },
    GuaranteeChannel$(innerStream, innerSink, allowSinkErrors, $T) {
      var t2, t1 = {};
      t1.innerStream = innerStream;
      t2 = new A.GuaranteeChannel($T._eval$1("GuaranteeChannel<0>"));
      t2.GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, t1, $T);
      return t2;
    },
    GuaranteeChannel: function GuaranteeChannel(t0) {
      var _ = this;
      _.__GuaranteeChannel__streamController_F = _.__GuaranteeChannel__sink_F = $;
      _._guarantee_channel$_subscription = null;
      _._disconnected = false;
      _.$ti = t0;
    },
    GuaranteeChannel_closure: function GuaranteeChannel_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.T = t2;
    },
    GuaranteeChannel__closure: function GuaranteeChannel__closure(t0) {
      this.$this = t0;
    },
    _GuaranteeSink: function _GuaranteeSink(t0, t1, t2, t3, t4) {
      var _ = this;
      _._inner = t0;
      _._guarantee_channel$_channel = t1;
      _._doneCompleter = t2;
      _._closed = _._disconnected = false;
      _._addStreamCompleter = _._addStreamSubscription = null;
      _._allowErrors = t3;
      _.$ti = t4;
    },
    _GuaranteeSink__addError_closure: function _GuaranteeSink__addError_closure() {
    },
    StreamChannelController: function StreamChannelController(t0) {
      this.__StreamChannelController__foreign_F = this.__StreamChannelController__local_F = $;
      this.$ti = t0;
    },
    StreamChannelMixin: function StreamChannelMixin() {
    },
    Uuid: function Uuid() {
    },
    _EventStreamSubscription$0(_target, _eventType, onData, _useCapture, $T) {
      var t1;
      if (onData == null)
        t1 = null;
      else {
        t1 = A._wrapZone0(new A._EventStreamSubscription_closure0(onData), type$.JavaScriptObject);
        t1 = t1 == null ? null : A.allowInterop(t1, type$.Function);
      }
      t1 = new A._EventStreamSubscription0(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription0<0>"));
      t1._streams$_tryResume$0();
      return t1;
    },
    _wrapZone0(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    EventStreamProvider0: function EventStreamProvider0(t0, t1) {
      this._streams$_eventType = t0;
      this.$ti = t1;
    },
    _EventStream: function _EventStream(t0, t1, t2, t3) {
      var _ = this;
      _._streams$_target = t0;
      _._streams$_eventType = t1;
      _._streams$_useCapture = t2;
      _.$ti = t3;
    },
    _EventStreamSubscription0: function _EventStreamSubscription0(t0, t1, t2, t3, t4) {
      var _ = this;
      _._streams$_pauseCount = 0;
      _._streams$_target = t0;
      _._streams$_eventType = t1;
      _._streams$_onData = t2;
      _._streams$_useCapture = t3;
      _.$ti = t4;
    },
    _EventStreamSubscription_closure0: function _EventStreamSubscription_closure0(t0) {
      this.onData = t0;
    },
    _EventStreamSubscription_onData_closure: function _EventStreamSubscription_onData_closure(t0) {
      this.handleData = t0;
    },
    HtmlWebSocketChannel$connect(url, protocols) {
      var t4, localToForeignController, foreignToLocalController, t5, t6, _null = null,
        t1 = self,
        t2 = t1.WebSocket,
        t3 = url.toString$0(0);
      t1 = type$.List_nullable_Object._as(new t1.Array());
      t4 = type$.JavaScriptObject;
      t1 = t4._as(new t2(t3, t1));
      t1.binaryType = "arraybuffer";
      t2 = new A.StreamChannelController(type$.StreamChannelController_nullable_Object);
      t3 = type$.nullable_Object;
      localToForeignController = A.StreamController_StreamController(_null, _null, true, t3);
      foreignToLocalController = A.StreamController_StreamController(_null, _null, true, t3);
      t5 = A._instanceType(foreignToLocalController);
      t6 = A._instanceType(localToForeignController);
      t2.set$__StreamChannelController__local_F(A.GuaranteeChannel$(new A._ControllerStream(foreignToLocalController, t5._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(localToForeignController, t6._eval$1("_StreamSinkWrapper<1>")), true, t3));
      t3 = A.GuaranteeChannel$(new A._ControllerStream(localToForeignController, t6._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(foreignToLocalController, t5._eval$1("_StreamSinkWrapper<1>")), false, t3);
      t2.__StreamChannelController__foreign_F !== $ && A.throwLateFieldAI("_foreign");
      t2.set$__StreamChannelController__foreign_F(t3);
      t4._as(t1);
      t2 = new A.HtmlWebSocketChannel(t1, t2);
      t2.HtmlWebSocketChannel$1(t1);
      return t2;
    },
    HtmlWebSocketChannel: function HtmlWebSocketChannel(t0, t1) {
      var _ = this;
      _.innerWebSocket = t0;
      _._localCloseReason = _._localCloseCode = null;
      _.__HtmlWebSocketChannel__readyCompleter_A = $;
      _._html$_controller = t1;
      _.__HtmlWebSocketChannel_sink_FI = $;
    },
    HtmlWebSocketChannel_closure: function HtmlWebSocketChannel_closure(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure0: function HtmlWebSocketChannel_closure0(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure1: function HtmlWebSocketChannel_closure1(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel__listen_closure: function HtmlWebSocketChannel__listen_closure(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel__listen_closure0: function HtmlWebSocketChannel__listen_closure0(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel__listen__closure: function HtmlWebSocketChannel__listen__closure(t0) {
      this._0_0 = t0;
    },
    HtmlWebSocketChannel__listen__closure0: function HtmlWebSocketChannel__listen__closure0(t0) {
      this._0_0 = t0;
    },
    _HtmlWebSocketSink: function _HtmlWebSocketSink(t0, t1) {
      this._html$_channel = t0;
      this._sink = t1;
    },
    WebSocketChannel: function WebSocketChannel(t0, t1) {
      this._webSocket = t0;
      this.ready = t1;
    },
    WebSocketChannelException: function WebSocketChannelException(t0) {
      this.message = t0;
    },
    main() {
      return A.runZonedGuarded(new A.main_closure(), new A.main_closure0(), type$.Future_void);
    },
    _trySendEvent(sink, serialized, $T) {
      var exception;
      try {
        sink.add$1(0, serialized);
      } catch (exception) {
        if (A.unwrapException(exception) instanceof A.StateError)
          A.print("Cannot send event " + A.S(serialized) + ". Injected client connection is closed.");
        else
          throw exception;
      }
    },
    _launchCommunicationWithDebugExtension() {
      var t1, t2;
      A._listenForDebugExtensionAuthRequest();
      t1 = $.$get$serializers();
      t2 = new A.DebugInfoBuilder();
      type$.nullable_void_Function_DebugInfoBuilder._as(new A._launchCommunicationWithDebugExtension_closure()).call$1(t2);
      self.window.top.document.dispatchEvent(A.CustomEvent_CustomEvent("dart-app-ready", B.C_JsonCodec.encode$2$toEncodable(t1.serialize$1(t2._debug_info$_build$0()), null)));
    },
    _listenForDebugExtensionAuthRequest() {
      var t1 = window;
      t1.toString;
      B.Window_methods.addEventListener$2(t1, "message", A.allowInterop(new A._listenForDebugExtensionAuthRequest_closure(), type$.dynamic_Function_Event));
    },
    _authenticateUser(authUrl) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, responseText;
      var $async$_authenticateUser = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = 3;
              return A._asyncAwait(A.HttpRequest_request(authUrl, "GET", null, true), $async$_authenticateUser);
            case 3:
              // returning from await.
              responseText = $async$result.responseText;
              $async$returnValue = B.JSString_methods.contains$1(responseText == null ? "" : responseText, "Dart Debug Authentication Success!");
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_authenticateUser, $async$completer);
    },
    _authUrl() {
      var extensionUrl, authUrl,
        t1 = window;
      t1.toString;
      extensionUrl = A._asStringQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$dartExtensionUri"));
      if (extensionUrl == null)
        return null;
      authUrl = A.Uri_parse(extensionUrl).replace$1$path(0, "$dwdsExtensionAuthentication");
      switch (authUrl.scheme) {
        case "ws":
          return authUrl.replace$1$scheme(0, "http").get$_text();
        case "wss":
          return authUrl.replace$1$scheme(0, "https").get$_text();
        default:
          return authUrl.get$_text();
      }
    },
    main_closure: function main_closure() {
    },
    main__closure: function main__closure(t0) {
      this.manager = t0;
    },
    main__closure0: function main__closure0(t0) {
      this.client = t0;
    },
    main___closure2: function main___closure2(t0) {
      this.events = t0;
    },
    main__closure1: function main__closure1(t0) {
      this.debugEventController = t0;
    },
    main___closure1: function main___closure1(t0, t1) {
      this.kind = t0;
      this.eventData = t1;
    },
    main__closure2: function main__closure2(t0) {
      this.client = t0;
    },
    main___closure0: function main___closure0(t0) {
      this.eventData = t0;
    },
    main__closure3: function main__closure3(t0) {
      this.client = t0;
    },
    main___closure: function main___closure() {
    },
    main__closure4: function main__closure4(t0) {
      this.manager = t0;
    },
    main__closure5: function main__closure5() {
    },
    main__closure6: function main__closure6() {
    },
    main__closure7: function main__closure7() {
    },
    main_closure0: function main_closure0() {
    },
    _launchCommunicationWithDebugExtension_closure: function _launchCommunicationWithDebugExtension_closure() {
    },
    _listenForDebugExtensionAuthRequest_closure: function _listenForDebugExtensionAuthRequest_closure() {
    },
    LegacyRestarter: function LegacyRestarter() {
    },
    LegacyRestarter_restart_closure0: function LegacyRestarter_restart_closure0(t0) {
      this.reloadCompleter = t0;
    },
    LegacyRestarter_restart_closure: function LegacyRestarter_restart_closure(t0) {
      this.sub = t0;
    },
    ReloadingManager: function ReloadingManager(t0, t1) {
      this._client = t0;
      this._restarter = t1;
    },
    toPromise(future, $T) {
      return new self.Promise(A.allowInterop(new A.toPromise_closure(future, $T), $T._eval$1("~(~(0),~(@))")), $T);
    },
    toFuture(promise, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new A._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      J.then$2$x(promise, A.allowInterop($T._eval$1("~([0/?])")._as(completer.get$complete(completer)), $T._eval$1("@(0)")), A.allowInterop(new A.toFuture_closure(completer), type$.dynamic_Function_dynamic));
      return t1;
    },
    Promise: function Promise() {
    },
    toPromise_closure: function toPromise_closure(t0, t1) {
      this.future = t0;
      this.T = t1;
    },
    toFuture_closure: function toFuture_closure(t0) {
      this.completer = t0;
    },
    HotReloadFailedException$(_s) {
      return new A.HotReloadFailedException(_s);
    },
    RequireRestarter_create() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.RequireRestarter),
        $async$returnValue, reloader, t1, t2, t3;
      var $async$RequireRestarter_create = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.String;
              t2 = A.HashMap_HashMap(null, null, null, t1, type$.int);
              t3 = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_bool), type$._AsyncCompleter_bool);
              t3.complete$1(0, true);
              reloader = new A.RequireRestarter(t2, t3);
              reloader.set$__RequireRestarter__dirtyModules_A(type$.SplayTreeSet_String._as(A.SplayTreeSet$(reloader.get$_moduleTopologicalCompare(), null, t1)));
              $async$goto = 3;
              return A._asyncAwait(reloader._initialize$0(), $async$RequireRestarter_create);
            case 3:
              // returning from await.
              $async$returnValue = reloader;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$RequireRestarter_create, $async$completer);
    },
    RequireLoader: function RequireLoader() {
    },
    HotReloadFailedException: function HotReloadFailedException(t0) {
      this._s = t0;
    },
    JsError: function JsError() {
    },
    JsMap: function JsMap() {
    },
    RequireRestarter: function RequireRestarter(t0, t1) {
      this._moduleOrdering = t0;
      this.__RequireRestarter__dirtyModules_A = $;
      this._running = t1;
    },
    RequireRestarter__reload_closure: function RequireRestarter__reload_closure(t0) {
      this.childModule = t0;
    },
    RequireRestarter__reloadModule_closure: function RequireRestarter__reloadModule_closure(t0, t1) {
      this.completer = t0;
      this.stackTrace = t1;
    },
    _findNonce() {
      var t2, elements, t3, t4, nonceValue,
        t1 = window.document;
      t1.toString;
      t2 = type$.Element;
      A.checkTypeBound(t2, t2, "T", "querySelectorAll");
      t1 = t1.querySelectorAll("script");
      t1.toString;
      t2 = type$._FrozenElementList_Element;
      elements = new A._FrozenElementList(t1, t2);
      for (t1 = new A.ListIterator(elements, elements.get$length(elements), t2._eval$1("ListIterator<ListBase.E>")), t3 = type$.HtmlElement, t2 = t2._eval$1("ListBase.E"); t1.moveNext$0();) {
        t4 = t1.__internal$_current;
        t4 = t3._as(t4 == null ? t2._as(t4) : t4);
        nonceValue = t4.nonce;
        if (nonceValue == null)
          nonceValue = t4.getAttribute("nonce");
        if (nonceValue != null) {
          t4 = $.$get$_noncePattern();
          t4 = t4._nativeRegExp.test(nonceValue);
        } else
          t4 = false;
        if (t4)
          return nonceValue;
      }
      return null;
    },
    runMain() {
      var scriptElement = $.$get$_createScript().call$0(),
        t1 = J.getInterceptor$x(scriptElement);
      t1.setInnerHtml$1(scriptElement, "window.$dartRunMain();");
      document.body.appendChild(scriptElement).toString;
      A.Future_Future$microtask(t1.get$remove(scriptElement), type$.void);
    },
    _createScript_closure: function _createScript_closure() {
    },
    _createScript__closure: function _createScript__closure(t0) {
      this.nonce = t0;
    },
    isBrowserObject(o) {
      return type$.Blob._is(o) || type$.Event._is(o) || type$.KeyRange._is(o) || type$.ImageData._is(o) || type$.Node._is(o) || type$.Window._is(o) || type$.WorkerGlobalScope._is(o);
    },
    printString(string) {
      if (typeof dartPrint == "function") {
        dartPrint(string);
        return;
      }
      if (typeof console == "object" && typeof console.log != "undefined") {
        console.log(string);
        return;
      }
      if (typeof print == "function") {
        print(string);
        return;
      }
      throw "Unable to print message: " + String(string);
    },
    decodeDigit(c) {
      var letter,
        digit = c ^ 48;
      if (digit < 10)
        return digit;
      letter = (c | 32) - 97;
      if (letter >= 0)
        return letter + 10;
      else
        return 255;
    },
    UuidUtil_mathRNG() {
      var i, t1,
        b = new Uint8Array(16),
        rand = $.$get$UuidUtil__random();
      for (i = 0; i < 16; ++i) {
        t1 = rand.nextInt$1(256);
        if (!(i < 16))
          return A.ioore(b, i);
        b[i] = t1;
      }
      return b;
    }
  },
  B = {};
  var holders = [A, J, B];
  var $ = {};
  A.JS_CONST.prototype = {};
  J.Interceptor.prototype = {
    $eq(receiver, other) {
      return receiver === other;
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    toString$0(receiver) {
      return "Instance of '" + A.Primitives_objectTypeName(receiver) + "'";
    },
    noSuchMethod$1(receiver, invocation) {
      throw A.wrapException(A.NoSuchMethodError_NoSuchMethodError$withInvocation(receiver, type$.Invocation._as(invocation)));
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(A._instanceTypeFromConstructor(this));
    }
  };
  J.JSBool.prototype = {
    toString$0(receiver) {
      return String(receiver);
    },
    get$hashCode(receiver) {
      return receiver ? 519018 : 218159;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.bool);
    },
    $isTrustedGetRuntimeType: 1,
    $isbool: 1
  };
  J.JSNull.prototype = {
    $eq(receiver, other) {
      return null == other;
    },
    toString$0(receiver) {
      return "null";
    },
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.Null);
    },
    $isTrustedGetRuntimeType: 1,
    $isNull: 1
  };
  J.JavaScriptObject.prototype = {$isJSObject: 1};
  J.LegacyJavaScriptObject.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return B.Type_JSObject_8k0;
    },
    toString$0(receiver) {
      return String(receiver);
    },
    $isPromise: 1,
    $isJsError: 1,
    then$1$1(receiver, p0) {
      return receiver.then(p0);
    },
    then$2(receiver, p0, p1) {
      return receiver.then(p0, p1);
    },
    get$digestsPath(obj) {
      return obj.digestsPath;
    },
    get$moduleParentsGraph(obj) {
      return obj.moduleParentsGraph;
    },
    forceLoadModule$3(receiver, p0, p1, p2) {
      return receiver.forceLoadModule(p0, p1, p2);
    },
    get$message(obj) {
      return obj.message;
    },
    $get$1(receiver, p0) {
      return receiver.get(p0);
    },
    get$keys(obj) {
      return obj.keys;
    },
    keys$0(receiver) {
      return receiver.keys();
    }
  };
  J.PlainJavaScriptObject.prototype = {};
  J.UnknownJavaScriptObject.prototype = {};
  J.JavaScriptFunction.prototype = {
    toString$0(receiver) {
      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
      if (dartClosure == null)
        return this.super$LegacyJavaScriptObject$toString(receiver);
      return "JavaScript function for " + J.toString$0$(dartClosure);
    },
    $isFunction: 1
  };
  J.JavaScriptBigInt.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.JavaScriptSymbol.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.JSArray.prototype = {
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    add$1(receiver, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("add"));
      receiver.push(value);
    },
    addAll$1(receiver, collection) {
      var t1;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("addAll"));
      if (Array.isArray(collection)) {
        this._addAllFromArray$1(receiver, collection);
        return;
      }
      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
        receiver.push(t1.get$current(t1));
    },
    _addAllFromArray$1(receiver, array) {
      var len, i;
      type$.JSArray_dynamic._as(array);
      len = array.length;
      if (len === 0)
        return;
      if (receiver === array)
        throw A.wrapException(A.ConcurrentModificationError$(receiver));
      for (i = 0; i < len; ++i)
        receiver.push(array[i]);
    },
    clear$0(receiver) {
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("clear"));
      receiver.length = 0;
    },
    map$1$1(receiver, f, $T) {
      var t1 = A._arrayInstanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    join$1(receiver, separator) {
      var i,
        list = A.List_List$filled(receiver.length, "", false, type$.String);
      for (i = 0; i < receiver.length; ++i)
        this.$indexSet(list, i, A.S(receiver[i]));
      return list.join(separator);
    },
    skip$1(receiver, n) {
      return A.SubListIterable$(receiver, n, null, A._arrayInstanceType(receiver)._precomputed1);
    },
    fold$1$2(receiver, initialValue, combine, $T) {
      var $length, value, i;
      $T._as(initialValue);
      A._arrayInstanceType(receiver)._bind$1($T)._eval$1("1(1,2)")._as(combine);
      $length = receiver.length;
      for (value = initialValue, i = 0; i < $length; ++i) {
        value = combine.call$2(value, receiver[i]);
        if (receiver.length !== $length)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return value;
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      var t1 = receiver.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, "start", null));
      if (start === t1)
        return A._setArrayType([], A._arrayInstanceType(receiver));
      return A._setArrayType(receiver.slice(start, t1), A._arrayInstanceType(receiver));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, receiver.length);
      return A.SubListIterable$(receiver, start, end, A._arrayInstanceType(receiver)._precomputed1);
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    get$last(receiver) {
      var t1 = receiver.length;
      if (t1 > 0)
        return receiver[t1 - 1];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    setRange$4(receiver, start, end, iterable, skipCount) {
      var $length, otherList, otherStart, t1, i;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("setRange"));
      A.RangeError_checkValidRange(start, end, receiver.length);
      $length = end - start;
      if ($length === 0)
        return;
      A.RangeError_checkNotNegative(skipCount, "skipCount");
      if (type$.List_dynamic._is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
        otherStart = 0;
      }
      t1 = J.getInterceptor$asx(otherList);
      if (otherStart + $length > t1.get$length(otherList))
        throw A.wrapException(A.IterableElementError_tooFew());
      if (otherStart < start)
        for (i = $length - 1; i >= 0; --i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
      else
        for (i = 0; i < $length; ++i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
    },
    any$1(receiver, test) {
      var end, i;
      A._arrayInstanceType(receiver)._eval$1("bool(1)")._as(test);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        if (A.boolConversionCheck(test.call$1(receiver[i])))
          return true;
        if (receiver.length !== end)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    sort$1(receiver, compare) {
      var len, a, b, undefineds, i,
        t1 = A._arrayInstanceType(receiver);
      t1._eval$1("int(1,1)?")._as(compare);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("sort"));
      len = receiver.length;
      if (len < 2)
        return;
      if (compare == null)
        compare = J._interceptors_JSArray__compareAny$closure();
      if (len === 2) {
        a = receiver[0];
        b = receiver[1];
        t1 = compare.call$2(a, b);
        if (typeof t1 !== "number")
          return t1.$gt();
        if (t1 > 0) {
          receiver[0] = b;
          receiver[1] = a;
        }
        return;
      }
      if (t1._precomputed1._is(null)) {
        for (undefineds = 0, i = 0; i < receiver.length; ++i)
          if (receiver[i] === void 0) {
            receiver[i] = null;
            ++undefineds;
          }
      } else
        undefineds = 0;
      receiver.sort(A.convertDartClosureToJS(compare, 2));
      if (undefineds > 0)
        this._replaceSomeNullsWithUndefined$1(receiver, undefineds);
    },
    sort$0($receiver) {
      return this.sort$1($receiver, null);
    },
    _replaceSomeNullsWithUndefined$1(receiver, count) {
      var i0,
        i = receiver.length;
      for (; i0 = i - 1, i > 0; i = i0)
        if (receiver[i0] === null) {
          receiver[i0] = void 0;
          --count;
          if (count === 0)
            break;
        }
    },
    contains$1(receiver, other) {
      var i;
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], other))
          return true;
      return false;
    },
    get$isEmpty(receiver) {
      return receiver.length === 0;
    },
    get$isNotEmpty(receiver) {
      return receiver.length !== 0;
    },
    toString$0(receiver) {
      return A.Iterable_iterableToFullString(receiver, "[", "]");
    },
    toList$1$growable(receiver, growable) {
      var t1 = A._setArrayType(receiver.slice(0), A._arrayInstanceType(receiver));
      return t1;
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$iterator(receiver) {
      return new J.ArrayIterator(receiver, receiver.length, A._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("indexed set"));
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      receiver[index] = value;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(A._arrayInstanceType(receiver));
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  J.JSUnmodifiableArray.prototype = {};
  J.ArrayIterator.prototype = {
    get$current(_) {
      var t1 = this.__interceptors$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t2, _this = this,
        t1 = _this._iterable,
        $length = t1.length;
      if (_this.__interceptors$_length !== $length) {
        t1 = A.throwConcurrentModificationError(t1);
        throw A.wrapException(t1);
      }
      t2 = _this._index;
      if (t2 >= $length) {
        _this.set$__interceptors$_current(null);
        return false;
      }
      _this.set$__interceptors$_current(t1[t2]);
      ++_this._index;
      return true;
    },
    set$__interceptors$_current(_current) {
      this.__interceptors$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  J.JSNumber.prototype = {
    compareTo$1(receiver, b) {
      var bIsNegative;
      A._asNum(b);
      if (receiver < b)
        return -1;
      else if (receiver > b)
        return 1;
      else if (receiver === b) {
        if (receiver === 0) {
          bIsNegative = this.get$isNegative(b);
          if (this.get$isNegative(receiver) === bIsNegative)
            return 0;
          if (this.get$isNegative(receiver))
            return -1;
          return 1;
        }
        return 0;
      } else if (isNaN(receiver)) {
        if (isNaN(b))
          return 0;
        return 1;
      } else
        return -1;
    },
    get$isNegative(receiver) {
      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
    },
    ceil$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647) {
          truncated = receiver | 0;
          return receiver === truncated ? truncated : truncated + 1;
        }
      } else if (receiver >= -2147483648)
        return receiver | 0;
      d = Math.ceil(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".ceil()"));
    },
    floor$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647)
          return receiver | 0;
      } else if (receiver >= -2147483648) {
        truncated = receiver | 0;
        return receiver === truncated ? truncated : truncated - 1;
      }
      d = Math.floor(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".floor()"));
    },
    round$0(receiver) {
      if (receiver > 0) {
        if (receiver !== 1 / 0)
          return Math.round(receiver);
      } else if (receiver > -1 / 0)
        return 0 - Math.round(0 - receiver);
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".round()"));
    },
    toRadixString$1(receiver, radix) {
      var result, t1, t2, match, exponent;
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", null));
      result = receiver.toString(radix);
      t1 = result.length;
      t2 = t1 - 1;
      if (!(t2 >= 0))
        return A.ioore(result, t2);
      if (result.charCodeAt(t2) !== 41)
        return result;
      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null)
        A.throwExpression(A.UnsupportedError$("Unexpected toString result: " + result));
      t1 = match.length;
      if (1 >= t1)
        return A.ioore(match, 1);
      result = match[1];
      if (3 >= t1)
        return A.ioore(match, 3);
      exponent = +match[3];
      t1 = match[2];
      if (t1 != null) {
        result += t1;
        exponent -= t1.length;
      }
      return result + B.JSString_methods.$mul("0", exponent);
    },
    toString$0(receiver) {
      if (receiver === 0 && 1 / receiver < 0)
        return "-0.0";
      else
        return "" + receiver;
    },
    get$hashCode(receiver) {
      var absolute, floorLog2, factor, scaled,
        intValue = receiver | 0;
      if (receiver === intValue)
        return intValue & 536870911;
      absolute = Math.abs(receiver);
      floorLog2 = Math.log(absolute) / 0.6931471805599453 | 0;
      factor = Math.pow(2, floorLog2);
      scaled = absolute < 1 ? absolute / factor : factor / absolute;
      return ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259 & 536870911;
    },
    $mod(receiver, other) {
      var result = receiver % other;
      if (result === 0)
        return 0;
      if (result > 0)
        return result;
      return result + other;
    },
    $tdiv(receiver, other) {
      if ((receiver | 0) === receiver)
        if (other >= 1 || other < -1)
          return receiver / other | 0;
      return this._tdivSlow$1(receiver, other);
    },
    _tdivFast$1(receiver, other) {
      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
    },
    _tdivSlow$1(receiver, other) {
      var quotient = receiver / other;
      if (quotient >= -2147483648 && quotient <= 2147483647)
        return quotient | 0;
      if (quotient > 0) {
        if (quotient !== 1 / 0)
          return Math.floor(quotient);
      } else if (quotient > -1 / 0)
        return Math.ceil(quotient);
      throw A.wrapException(A.UnsupportedError$("Result of truncating division is " + A.S(quotient) + ": " + A.S(receiver) + " ~/ " + other));
    },
    $shl(receiver, other) {
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    _shlPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    $shr(receiver, other) {
      var t1;
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrOtherPositive$1(receiver, other) {
      var t1;
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrReceiverPositive$1(receiver, other) {
      if (0 > other)
        throw A.wrapException(A.argumentErrorValue(other));
      return this._shrBothPositive$1(receiver, other);
    },
    _shrBothPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver >>> other;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.num);
    },
    $isComparable: 1,
    $isdouble: 1,
    $isnum: 1
  };
  J.JSInt.prototype = {
    get$bitLength(receiver) {
      var wordBits,
        t1 = receiver < 0 ? -receiver - 1 : receiver,
        nonneg = t1;
      for (wordBits = 32; nonneg >= 4294967296;) {
        nonneg = this._tdivFast$1(nonneg, 4294967296);
        wordBits += 32;
      }
      return wordBits - Math.clz32(nonneg);
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.int);
    },
    $isTrustedGetRuntimeType: 1,
    $isint: 1
  };
  J.JSNumNotInt.prototype = {
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.double);
    },
    $isTrustedGetRuntimeType: 1
  };
  J.JSString.prototype = {
    allMatches$2(receiver, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._StringAllMatchesIterable(string, receiver, start);
    },
    allMatches$1($receiver, string) {
      return this.allMatches$2($receiver, string, 0);
    },
    matchAsPrefix$2(receiver, string, start) {
      var t1, t2, i, t3, _null = null;
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, _null, _null));
      t1 = receiver.length;
      t2 = string.length;
      if (start + t1 > t2)
        return _null;
      for (i = 0; i < t1; ++i) {
        t3 = start + i;
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(string, t3);
        if (string.charCodeAt(t3) !== receiver.charCodeAt(i))
          return _null;
      }
      return new A.StringMatch(start, receiver);
    },
    $add(receiver, other) {
      return receiver + other;
    },
    endsWith$1(receiver, other) {
      var otherLength = other.length,
        t1 = receiver.length;
      if (otherLength > t1)
        return false;
      return other === this.substring$1(receiver, t1 - otherLength);
    },
    replaceRange$3(receiver, start, end, replacement) {
      var e = A.RangeError_checkValidRange(start, end, receiver.length);
      return A.stringReplaceRangeUnchecked(receiver, start, e, replacement);
    },
    startsWith$2(receiver, pattern, index) {
      var endIndex;
      if (index < 0 || index > receiver.length)
        throw A.wrapException(A.RangeError$range(index, 0, receiver.length, null, null));
      if (typeof pattern == "string") {
        endIndex = index + pattern.length;
        if (endIndex > receiver.length)
          return false;
        return pattern === receiver.substring(index, endIndex);
      }
      return J.matchAsPrefix$2$s(pattern, receiver, index) != null;
    },
    startsWith$1($receiver, pattern) {
      return this.startsWith$2($receiver, pattern, 0);
    },
    substring$2(receiver, start, end) {
      return receiver.substring(start, A.RangeError_checkValidRange(start, end, receiver.length));
    },
    substring$1($receiver, start) {
      return this.substring$2($receiver, start, null);
    },
    toLowerCase$0(receiver) {
      return receiver.toLowerCase();
    },
    $mul(receiver, times) {
      var s, result;
      if (0 >= times)
        return "";
      if (times === 1 || receiver.length === 0)
        return receiver;
      if (times !== times >>> 0)
        throw A.wrapException(B.C_OutOfMemoryError);
      for (s = receiver, result = ""; true;) {
        if ((times & 1) === 1)
          result = s + result;
        times = times >>> 1;
        if (times === 0)
          break;
        s += s;
      }
      return result;
    },
    padLeft$2(receiver, width, padding) {
      var delta = width - receiver.length;
      if (delta <= 0)
        return receiver;
      return this.$mul(padding, delta) + receiver;
    },
    indexOf$2(receiver, pattern, start) {
      var t1;
      if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = receiver.indexOf(pattern, start);
      return t1;
    },
    indexOf$1($receiver, pattern) {
      return this.indexOf$2($receiver, pattern, 0);
    },
    lastIndexOf$2(receiver, pattern, start) {
      var t1, t2;
      if (start == null)
        start = receiver.length;
      else if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = pattern.length;
      t2 = receiver.length;
      if (start + t1 > t2)
        start = t2 - t1;
      return receiver.lastIndexOf(pattern, start);
    },
    lastIndexOf$1($receiver, pattern) {
      return this.lastIndexOf$2($receiver, pattern, null);
    },
    contains$1(receiver, other) {
      return A.stringContainsUnchecked(receiver, other, 0);
    },
    compareTo$1(receiver, other) {
      var t1;
      A._asString(other);
      if (receiver === other)
        t1 = 0;
      else
        t1 = receiver < other ? -1 : 1;
      return t1;
    },
    toString$0(receiver) {
      return receiver;
    },
    get$hashCode(receiver) {
      var t1, hash, i;
      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
        hash = hash + receiver.charCodeAt(i) & 536870911;
        hash = hash + ((hash & 524287) << 10) & 536870911;
        hash ^= hash >> 6;
      }
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.String);
    },
    get$length(receiver) {
      return receiver.length;
    },
    $isTrustedGetRuntimeType: 1,
    $isComparable: 1,
    $isPattern: 1,
    $isString: 1
  };
  A._CastIterableBase.prototype = {
    get$iterator(_) {
      var t1 = A._instanceType(this);
      return new A.CastIterator(J.get$iterator$ax(this.get$__internal$_source()), t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("CastIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.get$__internal$_source());
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.get$__internal$_source());
    },
    get$isNotEmpty(_) {
      return J.get$isNotEmpty$asx(this.get$__internal$_source());
    },
    skip$1(_, count) {
      var t1 = A._instanceType(this);
      return A.CastIterable_CastIterable(J.skip$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    elementAt$1(_, index) {
      return A._instanceType(this)._rest[1]._as(J.elementAt$1$ax(this.get$__internal$_source(), index));
    },
    get$first(_) {
      return A._instanceType(this)._rest[1]._as(J.get$first$ax(this.get$__internal$_source()));
    },
    contains$1(_, other) {
      return J.contains$1$asx(this.get$__internal$_source(), other);
    },
    toString$0(_) {
      return J.toString$0$(this.get$__internal$_source());
    }
  };
  A.CastIterator.prototype = {
    moveNext$0() {
      return this.__internal$_source.moveNext$0();
    },
    get$current(_) {
      var t1 = this.__internal$_source;
      return this.$ti._rest[1]._as(t1.get$current(t1));
    },
    $isIterator: 1
  };
  A.CastIterable.prototype = {
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A._EfficientLengthCastIterable.prototype = {$isEfficientLengthIterable: 1};
  A._CastListBase.prototype = {
    $index(_, index) {
      return this.$ti._rest[1]._as(J.$index$asx(this.__internal$_source, index));
    },
    $indexSet(_, index, value) {
      var t1 = this.$ti;
      J.$indexSet$ax(this.__internal$_source, index, t1._precomputed1._as(t1._rest[1]._as(value)));
    },
    sort$1(_, compare) {
      var t1;
      this.$ti._eval$1("int(2,2)?")._as(compare);
      t1 = compare == null ? null : new A._CastListBase_sort_closure(this, compare);
      J.sort$1$ax(this.__internal$_source, t1);
    },
    getRange$2(_, start, end) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.getRange$2$ax(this.__internal$_source, start, end), t1._precomputed1, t1._rest[1]);
    },
    $isEfficientLengthIterable: 1,
    $isList: 1
  };
  A._CastListBase_sort_closure.prototype = {
    call$2(v1, v2) {
      var t1 = this.$this.$ti,
        t2 = t1._precomputed1;
      t2._as(v1);
      t2._as(v2);
      t1 = t1._rest[1];
      return this.compare.call$2(t1._as(v1), t1._as(v2));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1,1)");
    }
  };
  A.CastList.prototype = {
    cast$1$0(_, $R) {
      return new A.CastList(this.__internal$_source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A.CastMap.prototype = {
    cast$2$0(_, RK, RV) {
      var t1 = this.$ti;
      return new A.CastMap(this.__internal$_source, t1._eval$1("@<1>")._bind$1(t1._rest[1])._bind$1(RK)._bind$1(RV)._eval$1("CastMap<1,2,3,4>"));
    },
    containsKey$1(_, key) {
      return J.containsKey$1$x(this.__internal$_source, key);
    },
    $index(_, key) {
      return this.$ti._eval$1("4?")._as(J.$index$asx(this.__internal$_source, key));
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      t1._rest[2]._as(key);
      t1._rest[3]._as(value);
      J.$indexSet$ax(this.__internal$_source, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    forEach$1(_, f) {
      J.forEach$1$x(this.__internal$_source, new A.CastMap_forEach_closure(this, this.$ti._eval$1("~(3,4)")._as(f)));
    },
    get$keys(_) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.get$keys$x(this.__internal$_source), t1._precomputed1, t1._rest[2]);
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_source);
    }
  };
  A.CastMap_forEach_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      this.f.call$2(t1._rest[2]._as(key), t1._rest[3]._as(value));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1,2)");
    }
  };
  A.LateError.prototype = {
    toString$0(_) {
      return "LateInitializationError: " + this._message;
    }
  };
  A.nullFuture_closure.prototype = {
    call$0() {
      return A.Future_Future$value(null, type$.Null);
    },
    $signature: 28
  };
  A.SentinelValue.prototype = {};
  A.EfficientLengthIterable.prototype = {};
  A.ListIterable.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A.ListIterator(_this, _this.get$length(_this), A._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$first(_) {
      if (this.get$length(this) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.elementAt$1(0, 0);
    },
    contains$1(_, element) {
      var i, _this = this,
        $length = _this.get$length(_this);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(_this.elementAt$1(0, i), element))
          return true;
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return false;
    },
    join$1(_, separator) {
      var first, t1, i, _this = this,
        $length = _this.get$length(_this);
      if (separator.length !== 0) {
        if ($length === 0)
          return "";
        first = A.S(_this.elementAt$1(0, 0));
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        for (t1 = first, i = 1; i < $length; ++i) {
          t1 = t1 + separator + A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      } else {
        for (i = 0, t1 = ""; i < $length; ++i) {
          t1 += A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      }
    },
    join$0($receiver) {
      return this.join$1($receiver, "");
    },
    where$1(_, test) {
      return this.super$Iterable$where(0, A._instanceType(this)._eval$1("bool(ListIterable.E)")._as(test));
    },
    map$1$1(_, toElement, $T) {
      var t1 = A._instanceType(this);
      return new A.MappedListIterable(this, t1._bind$1($T)._eval$1("1(ListIterable.E)")._as(toElement), t1._eval$1("@<ListIterable.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      return A.SubListIterable$(this, count, null, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, true, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    }
  };
  A.SubListIterable.prototype = {
    get$_endIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength > $length)
        return $length;
      return endOrLength;
    },
    get$_startIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this.__internal$_start;
      if (t1 > $length)
        return $length;
      return t1;
    },
    get$length(_) {
      var endOrLength,
        $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this.__internal$_start;
      if (t1 >= $length)
        return 0;
      endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength >= $length)
        return $length - t1;
      if (typeof endOrLength !== "number")
        return endOrLength.$sub();
      return endOrLength - t1;
    },
    elementAt$1(_, index) {
      var _this = this,
        realIndex = _this.get$_startIndex() + index;
      if (index < 0 || realIndex >= _this.get$_endIndex())
        throw A.wrapException(A.IndexError$withLength(index, _this.get$length(_this), _this, null, "index"));
      return J.elementAt$1$ax(_this.__internal$_iterable, realIndex);
    },
    skip$1(_, count) {
      var newStart, endOrLength, _this = this;
      A.RangeError_checkNotNegative(count, "count");
      newStart = _this.__internal$_start + count;
      endOrLength = _this._endOrLength;
      if (endOrLength != null && newStart >= endOrLength)
        return new A.EmptyIterable(_this.$ti._eval$1("EmptyIterable<1>"));
      return A.SubListIterable$(_this.__internal$_iterable, newStart, endOrLength, _this.$ti._precomputed1);
    },
    toList$1$growable(_, growable) {
      var $length, result, i, _this = this,
        start = _this.__internal$_start,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        end = t2.get$length(t1),
        endOrLength = _this._endOrLength;
      if (endOrLength != null && endOrLength < end)
        end = endOrLength;
      $length = end - start;
      if ($length <= 0) {
        t1 = J.JSArray_JSArray$fixed(0, _this.$ti._precomputed1);
        return t1;
      }
      result = A.List_List$filled($length, t2.elementAt$1(t1, start), false, _this.$ti._precomputed1);
      for (i = 1; i < $length; ++i) {
        B.JSArray_methods.$indexSet(result, i, t2.elementAt$1(t1, start + i));
        if (t2.get$length(t1) < end)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return result;
    }
  };
  A.ListIterator.prototype = {
    get$current(_) {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t3, _this = this,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        $length = t2.get$length(t1);
      if (_this.__internal$_length !== $length)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      t3 = _this.__internal$_index;
      if (t3 >= $length) {
        _this.set$__internal$_current(null);
        return false;
      }
      _this.set$__internal$_current(t2.elementAt$1(t1, t3));
      ++_this.__internal$_index;
      return true;
    },
    set$__internal$_current(_current) {
      this.__internal$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.MappedIterable.prototype = {
    get$iterator(_) {
      var t1 = A._instanceType(this);
      return new A.MappedIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MappedIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_iterable);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_iterable);
    },
    get$first(_) {
      return this._f.call$1(J.get$first$ax(this.__internal$_iterable));
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_iterable, index));
    }
  };
  A.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
  A.MappedIterator.prototype = {
    moveNext$0() {
      var _this = this,
        t1 = _this._iterator;
      if (t1.moveNext$0()) {
        _this.set$__internal$_current(_this._f.call$1(t1.get$current(t1)));
        return true;
      }
      _this.set$__internal$_current(null);
      return false;
    },
    get$current(_) {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._rest[1]._as(t1) : t1;
    },
    set$__internal$_current(_current) {
      this.__internal$_current = this.$ti._eval$1("2?")._as(_current);
    },
    $isIterator: 1
  };
  A.MappedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_source, index));
    }
  };
  A.WhereIterable.prototype = {
    get$iterator(_) {
      return new A.WhereIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, this.$ti._eval$1("WhereIterator<1>"));
    },
    map$1$1(_, toElement, $T) {
      var t1 = this.$ti;
      return new A.MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(toElement), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    }
  };
  A.WhereIterator.prototype = {
    moveNext$0() {
      var t1, t2;
      for (t1 = this._iterator, t2 = this._f; t1.moveNext$0();)
        if (A.boolConversionCheck(t2.call$1(t1.get$current(t1))))
          return true;
      return false;
    },
    get$current(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    },
    $isIterator: 1
  };
  A.SkipIterable.prototype = {
    skip$1(_, count) {
      A.ArgumentError_checkNotNull(count, "count", type$.int);
      A.RangeError_checkNotNegative(count, "count");
      return new A.SkipIterable(this.__internal$_iterable, this._skipCount + count, A._instanceType(this)._eval$1("SkipIterable<1>"));
    },
    get$iterator(_) {
      return new A.SkipIterator(J.get$iterator$ax(this.__internal$_iterable), this._skipCount, A._instanceType(this)._eval$1("SkipIterator<1>"));
    }
  };
  A.EfficientLengthSkipIterable.prototype = {
    get$length(_) {
      var $length = J.get$length$asx(this.__internal$_iterable) - this._skipCount;
      if ($length >= 0)
        return $length;
      return 0;
    },
    skip$1(_, count) {
      A.ArgumentError_checkNotNull(count, "count", type$.int);
      A.RangeError_checkNotNegative(count, "count");
      return new A.EfficientLengthSkipIterable(this.__internal$_iterable, this._skipCount + count, this.$ti);
    },
    $isEfficientLengthIterable: 1
  };
  A.SkipIterator.prototype = {
    moveNext$0() {
      var t1, i;
      for (t1 = this._iterator, i = 0; i < this._skipCount; ++i)
        t1.moveNext$0();
      this._skipCount = 0;
      return t1.moveNext$0();
    },
    get$current(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    },
    $isIterator: 1
  };
  A.EmptyIterable.prototype = {
    get$iterator(_) {
      return B.C_EmptyIterator;
    },
    get$isEmpty(_) {
      return true;
    },
    get$length(_) {
      return 0;
    },
    get$first(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    elementAt$1(_, index) {
      throw A.wrapException(A.RangeError$range(index, 0, 0, "index", null));
    },
    contains$1(_, element) {
      return false;
    },
    map$1$1(_, toElement, $T) {
      this.$ti._bind$1($T)._eval$1("1(2)")._as(toElement);
      return new A.EmptyIterable($T._eval$1("EmptyIterable<0>"));
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return this;
    }
  };
  A.EmptyIterator.prototype = {
    moveNext$0() {
      return false;
    },
    get$current(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    $isIterator: 1
  };
  A.FixedLengthListMixin.prototype = {};
  A.UnmodifiableListMixin.prototype = {
    $indexSet(_, index, value) {
      A._instanceType(this)._eval$1("UnmodifiableListMixin.E")._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    },
    sort$1(_, compare) {
      A._instanceType(this)._eval$1("int(UnmodifiableListMixin.E,UnmodifiableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    }
  };
  A.UnmodifiableListBase.prototype = {};
  A.ReversedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      var t1 = this.__internal$_source,
        t2 = J.getInterceptor$asx(t1);
      return t2.elementAt$1(t1, t2.get$length(t1) - 1 - index);
    }
  };
  A.Symbol.prototype = {
    get$hashCode(_) {
      var hash = this._hashCode;
      if (hash != null)
        return hash;
      hash = 664597 * B.JSString_methods.get$hashCode(this._name) & 536870911;
      this._hashCode = hash;
      return hash;
    },
    toString$0(_) {
      return 'Symbol("' + this._name + '")';
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Symbol && this._name === other._name;
    },
    $isSymbol0: 1
  };
  A.__CastListBase__CastIterableBase_ListMixin.prototype = {};
  A._Record_2.prototype = {$recipe: "+(1,2)", $shape: 1};
  A.ConstantMapView.prototype = {};
  A.ConstantMap.prototype = {
    cast$2$0(_, RK, RV) {
      var t1 = A._instanceType(this);
      return A.Map_castFrom(this, t1._precomputed1, t1._rest[1], RK, RV);
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      A.ConstantMap__throwUnmodifiable();
    },
    map$2$1(_, transform, K2, V2) {
      var result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      this.forEach$1(0, new A.ConstantMap_map_closure(this, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result));
      return result;
    },
    map$1($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  A.ConstantMap_map_closure.prototype = {
    call$2(key, value) {
      var t1 = A._instanceType(this.$this),
        entry = this.transform.call$2(t1._precomputed1._as(key), t1._rest[1]._as(value));
      this.result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.ConstantStringMap.prototype = {
    get$length(_) {
      return this._values.length;
    },
    get$__js_helper$_keys() {
      var keys = this.$keys;
      if (keys == null) {
        keys = Object.keys(this._jsIndex);
        this.$keys = keys;
      }
      return keys;
    },
    containsKey$1(_, key) {
      if (typeof key != "string")
        return false;
      if ("__proto__" === key)
        return false;
      return this._jsIndex.hasOwnProperty(key);
    },
    $index(_, key) {
      if (!this.containsKey$1(0, key))
        return null;
      return this._values[this._jsIndex[key]];
    },
    forEach$1(_, f) {
      var keys, values, t1, i;
      this.$ti._eval$1("~(1,2)")._as(f);
      keys = this.get$__js_helper$_keys();
      values = this._values;
      for (t1 = keys.length, i = 0; i < t1; ++i)
        f.call$2(keys[i], values[i]);
    },
    get$keys(_) {
      return new A._KeysOrValues(this.get$__js_helper$_keys(), this.$ti._eval$1("_KeysOrValues<1>"));
    }
  };
  A._KeysOrValues.prototype = {
    get$length(_) {
      return this._elements.length;
    },
    get$isEmpty(_) {
      return 0 === this._elements.length;
    },
    get$isNotEmpty(_) {
      return 0 !== this._elements.length;
    },
    get$iterator(_) {
      var t1 = this._elements;
      return new A._KeysOrValuesOrElementsIterator(t1, t1.length, this.$ti._eval$1("_KeysOrValuesOrElementsIterator<1>"));
    }
  };
  A._KeysOrValuesOrElementsIterator.prototype = {
    get$current(_) {
      var t1 = this.__js_helper$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        t1 = _this.__js_helper$_index;
      if (t1 >= _this.__js_helper$_length) {
        _this.set$__js_helper$_current(null);
        return false;
      }
      _this.set$__js_helper$_current(_this._elements[t1]);
      ++_this.__js_helper$_index;
      return true;
    },
    set$__js_helper$_current(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.JSInvocationMirror.prototype = {
    get$memberName() {
      var t1 = this._memberName;
      return t1;
    },
    get$positionalArguments() {
      var t1, argumentCount, list, index, _this = this;
      if (_this.__js_helper$_kind === 1)
        return B.List_empty;
      t1 = _this._arguments;
      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
      if (argumentCount === 0)
        return B.List_empty;
      list = [];
      for (index = 0; index < argumentCount; ++index) {
        if (!(index < t1.length))
          return A.ioore(t1, index);
        list.push(t1[index]);
      }
      return J.JSArray_markUnmodifiableList(list);
    },
    get$namedArguments() {
      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4, _this = this;
      if (_this.__js_helper$_kind !== 0)
        return B.Map_empty;
      t1 = _this._namedArgumentNames;
      namedArgumentCount = t1.length;
      t2 = _this._arguments;
      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
      if (namedArgumentCount === 0)
        return B.Map_empty;
      map = new A.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
      for (i = 0; i < namedArgumentCount; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t3 = t1[i];
        t4 = namedArgumentsStartIndex + i;
        if (!(t4 >= 0 && t4 < t2.length))
          return A.ioore(t2, t4);
        map.$indexSet(0, new A.Symbol(t3), t2[t4]);
      }
      return new A.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
    },
    $isInvocation: 1
  };
  A.Primitives_functionNoSuchMethod_closure.prototype = {
    call$2($name, argument) {
      var t1;
      A._asString($name);
      t1 = this._box_0;
      t1.names = t1.names + "$" + $name;
      B.JSArray_methods.add$1(this.namedArgumentList, $name);
      B.JSArray_methods.add$1(this.$arguments, argument);
      ++t1.argumentCount;
    },
    $signature: 5
  };
  A.TypeErrorDecoder.prototype = {
    matchTypeError$1(message) {
      var result, t1, _this = this,
        match = new RegExp(_this._pattern).exec(message);
      if (match == null)
        return null;
      result = Object.create(null);
      t1 = _this._arguments;
      if (t1 !== -1)
        result.arguments = match[t1 + 1];
      t1 = _this._argumentsExpr;
      if (t1 !== -1)
        result.argumentsExpr = match[t1 + 1];
      t1 = _this._expr;
      if (t1 !== -1)
        result.expr = match[t1 + 1];
      t1 = _this._method;
      if (t1 !== -1)
        result.method = match[t1 + 1];
      t1 = _this._receiver;
      if (t1 !== -1)
        result.receiver = match[t1 + 1];
      return result;
    }
  };
  A.NullError.prototype = {
    toString$0(_) {
      return "Null check operator used on a null value";
    }
  };
  A.JsNoSuchMethodError.prototype = {
    toString$0(_) {
      var t2, _this = this,
        _s38_ = "NoSuchMethodError: method not found: '",
        t1 = _this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + _this.__js_helper$_message;
      t2 = _this._receiver;
      if (t2 == null)
        return _s38_ + t1 + "' (" + _this.__js_helper$_message + ")";
      return _s38_ + t1 + "' on '" + t2 + "' (" + _this.__js_helper$_message + ")";
    }
  };
  A.UnknownJsTypeError.prototype = {
    toString$0(_) {
      var t1 = this.__js_helper$_message;
      return t1.length === 0 ? "Error" : "Error: " + t1;
    }
  };
  A.NullThrownFromJavaScriptException.prototype = {
    toString$0(_) {
      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
    }
  };
  A.ExceptionAndStackTrace.prototype = {};
  A._StackTrace.prototype = {
    toString$0(_) {
      var trace,
        t1 = this._trace;
      if (t1 != null)
        return t1;
      t1 = this._exception;
      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
      return this._trace = trace == null ? "" : trace;
    },
    $isStackTrace: 1
  };
  A.Closure.prototype = {
    toString$0(_) {
      var $constructor = this.constructor,
        $name = $constructor == null ? null : $constructor.name;
      return "Closure '" + A.unminifyOrTag($name == null ? "unknown" : $name) + "'";
    },
    get$runtimeType(_) {
      var rti = A.closureFunctionType(this);
      return A.createRuntimeType(rti == null ? A.instanceType(this) : rti);
    },
    $isFunction: 1,
    get$$call() {
      return this;
    },
    "call*": "call$1",
    $requiredArgCount: 1,
    $defaultValues: null
  };
  A.Closure0Args.prototype = {"call*": "call$0", $requiredArgCount: 0};
  A.Closure2Args.prototype = {"call*": "call$2", $requiredArgCount: 2};
  A.TearOffClosure.prototype = {};
  A.StaticClosure.prototype = {
    toString$0(_) {
      var $name = this.$static_name;
      if ($name == null)
        return "Closure of unknown static method";
      return "Closure '" + A.unminifyOrTag($name) + "'";
    }
  };
  A.BoundClosure.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      if (!(other instanceof A.BoundClosure))
        return false;
      return this.$_target === other.$_target && this._receiver === other._receiver;
    },
    get$hashCode(_) {
      return (A.objectHashCode(this._receiver) ^ A.Primitives_objectHashCode(this.$_target)) >>> 0;
    },
    toString$0(_) {
      return "Closure '" + this.$_name + "' of " + ("Instance of '" + A.Primitives_objectTypeName(this._receiver) + "'");
    }
  };
  A._CyclicInitializationError.prototype = {
    toString$0(_) {
      return "Reading static variable '" + this.variableName + "' during its initialization";
    }
  };
  A.RuntimeError.prototype = {
    toString$0(_) {
      return "RuntimeError: " + this.message;
    }
  };
  A._AssertionError.prototype = {
    toString$0(_) {
      return "Assertion failed: " + A.Error_safeToString(this.message);
    }
  };
  A._Required.prototype = {};
  A.JsLinkedHashMap.prototype = {
    get$length(_) {
      return this.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this.__js_helper$_length === 0;
    },
    get$keys(_) {
      return new A.LinkedHashMapKeyIterable(this, A._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
    },
    containsKey$1(_, key) {
      var strings, nums;
      if (typeof key == "string") {
        strings = this._strings;
        if (strings == null)
          return false;
        return strings[key] != null;
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = this._nums;
        if (nums == null)
          return false;
        return nums[key] != null;
      } else
        return this.internalContainsKey$1(key);
    },
    internalContainsKey$1(key) {
      var rest = this.__js_helper$_rest;
      if (rest == null)
        return false;
      return this.internalFindBucketIndex$2(rest[this.internalComputeHashCode$1(key)], key) >= 0;
    },
    addAll$1(_, other) {
      A._instanceType(this)._eval$1("Map<1,2>")._as(other).forEach$1(0, new A.JsLinkedHashMap_addAll_closure(this));
    },
    $index(_, key) {
      var strings, cell, t1, nums, _null = null;
      if (typeof key == "string") {
        strings = this._strings;
        if (strings == null)
          return _null;
        cell = strings[key];
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = this._nums;
        if (nums == null)
          return _null;
        cell = nums[key];
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else
        return this.internalGet$1(key);
    },
    internalGet$1(key) {
      var bucket, index,
        rest = this.__js_helper$_rest;
      if (rest == null)
        return null;
      bucket = rest[this.internalComputeHashCode$1(key)];
      index = this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      return bucket[index].hashMapCellValue;
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string") {
        strings = _this._strings;
        _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value);
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = _this._nums;
        _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value);
      } else
        _this.internalSet$2(key, value);
    },
    internalSet$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this.__js_helper$_rest;
      if (rest == null)
        rest = _this.__js_helper$_rest = _this._newHashTable$0();
      hash = _this.internalComputeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._newLinkedCell$2(key, value)];
      else {
        index = _this.internalFindBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index].hashMapCellValue = value;
        else
          bucket.push(_this._newLinkedCell$2(key, value));
      }
    },
    putIfAbsent$2(_, key, ifAbsent) {
      var t2, value, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._eval$1("2()")._as(ifAbsent);
      if (_this.containsKey$1(0, key)) {
        t2 = _this.$index(0, key);
        return t2 == null ? t1._rest[1]._as(t2) : t2;
      }
      value = ifAbsent.call$0();
      _this.$indexSet(0, key, value);
      return value;
    },
    remove$1(_, key) {
      var _this = this;
      if (typeof key == "string")
        return _this._removeHashTableEntry$2(_this._strings, key);
      else if (typeof key == "number" && (key & 0x3fffffff) === key)
        return _this._removeHashTableEntry$2(_this._nums, key);
      else
        return _this.internalRemove$1(key);
    },
    internalRemove$1(key) {
      var hash, bucket, index, cell, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      hash = _this.internalComputeHashCode$1(key);
      bucket = rest[hash];
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      cell = bucket.splice(index, 1)[0];
      _this._unlinkCell$1(cell);
      if (bucket.length === 0)
        delete rest[hash];
      return cell.hashMapCellValue;
    },
    forEach$1(_, action) {
      var cell, modifications, _this = this;
      A._instanceType(_this)._eval$1("~(1,2)")._as(action);
      cell = _this._first;
      modifications = _this._modifications;
      for (; cell != null;) {
        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
        if (modifications !== _this._modifications)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        cell = cell._next;
      }
    },
    _addHashTableEntry$3(table, key, value) {
      var cell,
        t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      cell = table[key];
      if (cell == null)
        table[key] = this._newLinkedCell$2(key, value);
      else
        cell.hashMapCellValue = value;
    },
    _removeHashTableEntry$2(table, key) {
      var cell;
      if (table == null)
        return null;
      cell = table[key];
      if (cell == null)
        return null;
      this._unlinkCell$1(cell);
      delete table[key];
      return cell.hashMapCellValue;
    },
    _modified$0() {
      this._modifications = this._modifications + 1 & 1073741823;
    },
    _newLinkedCell$2(key, value) {
      var _this = this,
        t1 = A._instanceType(_this),
        cell = new A.LinkedHashMapCell(t1._precomputed1._as(key), t1._rest[1]._as(value));
      if (_this._first == null)
        _this._first = _this._last = cell;
      else {
        t1 = _this._last;
        t1.toString;
        cell._previous = t1;
        _this._last = t1._next = cell;
      }
      ++_this.__js_helper$_length;
      _this._modified$0();
      return cell;
    },
    _unlinkCell$1(cell) {
      var _this = this,
        previous = cell._previous,
        next = cell._next;
      if (previous == null)
        _this._first = next;
      else
        previous._next = next;
      if (next == null)
        _this._last = previous;
      else
        next._previous = previous;
      --_this.__js_helper$_length;
      _this._modified$0();
    },
    internalComputeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i].hashMapCellKey, key))
          return i;
      return -1;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    _newHashTable$0() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    $isLinkedHashMap: 1
  };
  A.JsLinkedHashMap_addAll_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this,
        t2 = A._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.LinkedHashMapCell.prototype = {};
  A.LinkedHashMapKeyIterable.prototype = {
    get$length(_) {
      return this._map.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this._map.__js_helper$_length === 0;
    },
    get$iterator(_) {
      var t1 = this._map,
        t2 = new A.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
      t2._cell = t1._first;
      return t2;
    },
    contains$1(_, element) {
      return this._map.containsKey$1(0, element);
    }
  };
  A.LinkedHashMapKeyIterator.prototype = {
    get$current(_) {
      return this.__js_helper$_current;
    },
    moveNext$0() {
      var cell, _this = this,
        t1 = _this._map;
      if (_this._modifications !== t1._modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.set$__js_helper$_current(null);
        return false;
      } else {
        _this.set$__js_helper$_current(cell.hashMapCellKey);
        _this._cell = cell._next;
        return true;
      }
    },
    set$__js_helper$_current(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.initHooks_closure.prototype = {
    call$1(o) {
      return this.getTag(o);
    },
    $signature: 1
  };
  A.initHooks_closure0.prototype = {
    call$2(o, tag) {
      return this.getUnknownTag(o, tag);
    },
    $signature: 54
  };
  A.initHooks_closure1.prototype = {
    call$1(tag) {
      return this.prototypeForTag(A._asString(tag));
    },
    $signature: 53
  };
  A._Record.prototype = {
    get$runtimeType(_) {
      return A.createRuntimeType(this._getRti$0());
    },
    _getRti$0() {
      return A.evaluateRtiForRecord(this.$recipe, this._getFieldValues$0());
    },
    toString$0(_) {
      return this._toString$1(false);
    },
    _toString$1(safe) {
      var t2, separator, i, key, value,
        keys = this._fieldKeys$0(),
        values = this._getFieldValues$0(),
        t1 = (safe ? "" + "Record " : "") + "(";
      for (t2 = keys.length, separator = "", i = 0; i < t2; ++i, separator = ", ") {
        t1 += separator;
        key = keys[i];
        if (typeof key == "string")
          t1 = t1 + key + ": ";
        if (!(i < values.length))
          return A.ioore(values, i);
        value = values[i];
        t1 = safe ? t1 + A.Primitives_safeToString(value) : t1 + A.S(value);
      }
      t1 += ")";
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _fieldKeys$0() {
      var t1,
        shapeTag = this.$shape;
      for (; $._Record__computedFieldKeys.length <= shapeTag;)
        B.JSArray_methods.add$1($._Record__computedFieldKeys, null);
      t1 = $._Record__computedFieldKeys[shapeTag];
      if (t1 == null) {
        t1 = this._computeFieldKeys$0();
        B.JSArray_methods.$indexSet($._Record__computedFieldKeys, shapeTag, t1);
      }
      return t1;
    },
    _computeFieldKeys$0() {
      var i, names, last,
        recipe = this.$recipe,
        position = recipe.indexOf("("),
        joinedNames = recipe.substring(1, position),
        fields = recipe.substring(position),
        arity = fields === "()" ? 0 : fields.replace(/[^,]/g, "").length + 1,
        t1 = type$.Object,
        result = J.JSArray_JSArray$allocateGrowable(arity, t1);
      for (i = 0; i < arity; ++i)
        result[i] = i;
      if (joinedNames !== "") {
        names = joinedNames.split(",");
        i = names.length;
        for (last = arity; i > 0;) {
          --last;
          --i;
          B.JSArray_methods.$indexSet(result, last, names[i]);
        }
      }
      return A.List_List$unmodifiable(result, t1);
    }
  };
  A._Record2.prototype = {
    _getFieldValues$0() {
      return [this._0, this._1];
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A._Record2 && this.$shape === other.$shape && J.$eq$(this._0, other._0) && J.$eq$(this._1, other._1);
    },
    get$hashCode(_) {
      return A.Object_hash(this.$shape, this._0, this._1, B.C_SentinelValue);
    }
  };
  A.JSSyntaxRegExp.prototype = {
    toString$0(_) {
      return "RegExp/" + this.pattern + "/" + this._nativeRegExp.flags;
    },
    get$_nativeGlobalVersion() {
      var _this = this,
        t1 = _this._nativeGlobalRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeGlobalRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern, t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
    },
    get$_nativeAnchoredVersion() {
      var _this = this,
        t1 = _this._nativeAnchoredRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeAnchoredRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern + "|()", t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
    },
    firstMatch$1(string) {
      var m = this._nativeRegExp.exec(string);
      if (m == null)
        return null;
      return new A._MatchImplementation(m);
    },
    allMatches$2(_, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._AllMatchesIterable(this, string, start);
    },
    allMatches$1($receiver, string) {
      return this.allMatches$2($receiver, string, 0);
    },
    _execGlobal$2(string, start) {
      var match,
        regexp = this.get$_nativeGlobalVersion();
      if (regexp == null)
        regexp = type$.Object._as(regexp);
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      return new A._MatchImplementation(match);
    },
    _execAnchored$2(string, start) {
      var match,
        regexp = this.get$_nativeAnchoredVersion();
      if (regexp == null)
        regexp = type$.Object._as(regexp);
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      if (0 >= match.length)
        return A.ioore(match, -1);
      if (match.pop() != null)
        return null;
      return new A._MatchImplementation(match);
    },
    matchAsPrefix$2(_, string, start) {
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, null, null));
      return this._execAnchored$2(string, start);
    },
    $isPattern: 1,
    $isRegExp: 1
  };
  A._MatchImplementation.prototype = {
    get$end(_) {
      var t1 = this._match;
      return t1.index + t1[0].length;
    },
    $isMatch: 1,
    $isRegExpMatch: 1
  };
  A._AllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._AllMatchesIterator(this._re, this._string, this._start);
    }
  };
  A._AllMatchesIterator.prototype = {
    get$current(_) {
      var t1 = this.__js_helper$_current;
      return t1 == null ? type$.RegExpMatch._as(t1) : t1;
    },
    moveNext$0() {
      var t1, t2, t3, match, nextIndex, _this = this,
        string = _this._string;
      if (string == null)
        return false;
      t1 = _this._nextIndex;
      t2 = string.length;
      if (t1 <= t2) {
        t3 = _this._regExp;
        match = t3._execGlobal$2(string, t1);
        if (match != null) {
          _this.__js_helper$_current = match;
          nextIndex = match.get$end(match);
          if (match._match.index === nextIndex) {
            if (t3._nativeRegExp.unicode) {
              t1 = _this._nextIndex;
              t3 = t1 + 1;
              if (t3 < t2) {
                if (!(t1 >= 0 && t1 < t2))
                  return A.ioore(string, t1);
                t1 = string.charCodeAt(t1);
                if (t1 >= 55296 && t1 <= 56319) {
                  if (!(t3 >= 0))
                    return A.ioore(string, t3);
                  t1 = string.charCodeAt(t3);
                  t1 = t1 >= 56320 && t1 <= 57343;
                } else
                  t1 = false;
              } else
                t1 = false;
            } else
              t1 = false;
            nextIndex = (t1 ? nextIndex + 1 : nextIndex) + 1;
          }
          _this._nextIndex = nextIndex;
          return true;
        }
      }
      _this._string = _this.__js_helper$_current = null;
      return false;
    },
    $isIterator: 1
  };
  A.StringMatch.prototype = {$isMatch: 1};
  A._StringAllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._StringAllMatchesIterator(this._input, this._pattern, this.__js_helper$_index);
    },
    get$first(_) {
      var t1 = this._pattern,
        index = this._input.indexOf(t1, this.__js_helper$_index);
      if (index >= 0)
        return new A.StringMatch(index, t1);
      throw A.wrapException(A.IterableElementError_noElement());
    }
  };
  A._StringAllMatchesIterator.prototype = {
    moveNext$0() {
      var index, end, _this = this,
        t1 = _this.__js_helper$_index,
        t2 = _this._pattern,
        t3 = t2.length,
        t4 = _this._input,
        t5 = t4.length;
      if (t1 + t3 > t5) {
        _this.__js_helper$_current = null;
        return false;
      }
      index = t4.indexOf(t2, t1);
      if (index < 0) {
        _this.__js_helper$_index = t5 + 1;
        _this.__js_helper$_current = null;
        return false;
      }
      end = index + t3;
      _this.__js_helper$_current = new A.StringMatch(index, t2);
      _this.__js_helper$_index = end === _this.__js_helper$_index ? end + 1 : end;
      return true;
    },
    get$current(_) {
      var t1 = this.__js_helper$_current;
      t1.toString;
      return t1;
    },
    $isIterator: 1
  };
  A._Cell.prototype = {
    readLocal$1$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        A.throwExpression(new A.LateError("Local '" + this.__late_helper$_name + "' has not been initialized."));
      return t1;
    },
    readLocal$0() {
      return this.readLocal$1$0(type$.dynamic);
    },
    _readField$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        throw A.wrapException(A.LateError$fieldNI(this.__late_helper$_name));
      return t1;
    }
  };
  A._InitializedCell.prototype = {
    _readFinal$0() {
      var result, _this = this,
        t1 = _this.__late_helper$_value;
      if (t1 === _this) {
        result = _this._initializer.call$0();
        if (_this.__late_helper$_value !== _this)
          throw A.wrapException(new A.LateError("Local '" + _this.__late_helper$_name + string$.__has_));
        _this.__late_helper$_value = result;
        t1 = result;
      }
      return t1;
    }
  };
  A.NativeByteBuffer.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteBuffer_RkP;
    },
    $isTrustedGetRuntimeType: 1,
    $isNativeByteBuffer: 1,
    $isByteBuffer: 1
  };
  A.NativeTypedData.prototype = {$isNativeTypedData: 1, $isTypedData: 1};
  A.NativeByteData.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteData_zNC;
    },
    $isTrustedGetRuntimeType: 1,
    $isByteData: 1
  };
  A.NativeTypedArray.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isJavaScriptIndexingBehavior: 1
  };
  A.NativeTypedArrayOfDouble.prototype = {
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asDouble(value);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeTypedArrayOfInt.prototype = {
    $indexSet(receiver, index, value) {
      A._asInt(value);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeFloat32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float32List_LB7;
    },
    sublist$2(receiver, start, end) {
      return new Float32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isFloat32List: 1
  };
  A.NativeFloat64List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float64List_LB7;
    },
    sublist$2(receiver, start, end) {
      return new Float64Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isFloat64List: 1
  };
  A.NativeInt16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int16List_uXf;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isInt16List: 1
  };
  A.NativeInt32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int32List_O50;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isInt32List: 1
  };
  A.NativeInt8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int8List_ekJ;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isInt8List: 1
  };
  A.NativeUint16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint16List_2bx;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint16List: 1
  };
  A.NativeUint32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint32List_2bx;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint32List: 1
  };
  A.NativeUint8ClampedList.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8ClampedList_Jik;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8ClampedArray(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint8ClampedList: 1
  };
  A.NativeUint8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8List_WLA;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isNativeUint8List: 1,
    $isUint8List: 1
  };
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A.Rti.prototype = {
    _eval$1(recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
    },
    _bind$1(typeOrTuple) {
      return A._Universe_bind(init.typeUniverse, this, typeOrTuple);
    }
  };
  A._FunctionParameters.prototype = {};
  A._Type.prototype = {
    toString$0(_) {
      return A._rtiToString(this._rti, null);
    },
    $isType: 1
  };
  A._Error.prototype = {
    toString$0(_) {
      return this.__rti$_message;
    }
  };
  A._TypeError.prototype = {$isTypeError: 1};
  A._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
    call$1(_) {
      var t1 = this._box_0,
        f = t1.storedCallback;
      t1.storedCallback = null;
      f.call$0();
    },
    $signature: 6
  };
  A._AsyncRun__initializeScheduleImmediate_closure.prototype = {
    call$1(callback) {
      var t1, t2;
      this._box_0.storedCallback = type$.void_Function._as(callback);
      t1 = this.div;
      t2 = this.span;
      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
    },
    $signature: 64
  };
  A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 4
  };
  A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 4
  };
  A._TimerImpl.prototype = {
    _TimerImpl$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setTimeout(A.convertDartClosureToJS(new A._TimerImpl_internalCallback(this, callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("`setTimeout()` not found."));
    },
    _TimerImpl$periodic$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setInterval(A.convertDartClosureToJS(new A._TimerImpl$periodic_closure(this, milliseconds, Date.now(), callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("Periodic timer."));
    },
    get$isActive() {
      return this._handle != null;
    },
    cancel$0(_) {
      var t1;
      if (self.setTimeout != null) {
        t1 = this._handle;
        if (t1 == null)
          return;
        if (this._once)
          self.clearTimeout(t1);
        else
          self.clearInterval(t1);
        this._handle = null;
      } else
        throw A.wrapException(A.UnsupportedError$("Canceling a timer."));
    },
    $isTimer: 1
  };
  A._TimerImpl_internalCallback.prototype = {
    call$0() {
      var t1 = this.$this;
      t1._handle = null;
      t1._tick = 1;
      this.callback.call$0();
    },
    $signature: 0
  };
  A._TimerImpl$periodic_closure.prototype = {
    call$0() {
      var duration, _this = this,
        t1 = _this.$this,
        tick = t1._tick + 1,
        t2 = _this.milliseconds;
      if (t2 > 0) {
        duration = Date.now() - _this.start;
        if (duration > (tick + 1) * t2)
          tick = B.JSInt_methods.$tdiv(duration, t2);
      }
      t1._tick = tick;
      _this.callback.call$1(t1);
    },
    $signature: 4
  };
  A._AsyncAwaitCompleter.prototype = {
    complete$1(_, value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/?")._as(value);
      if (value == null)
        value = t1._precomputed1._as(value);
      if (!_this.isSync)
        _this._future._asyncComplete$1(value);
      else {
        t2 = _this._future;
        if (t1._eval$1("Future<1>")._is(value))
          t2._chainFuture$1(value);
        else
          t2._completeWithValue$1(value);
      }
    },
    completeError$2(e, st) {
      var t1 = this._future;
      if (this.isSync)
        t1._completeError$2(e, st);
      else
        t1._asyncCompleteError$2(e, st);
    },
    $isCompleter: 1
  };
  A._awaitOnObject_closure.prototype = {
    call$1(result) {
      return this.bodyFunction.call$2(0, result);
    },
    $signature: 7
  };
  A._awaitOnObject_closure0.prototype = {
    call$2(error, stackTrace) {
      this.bodyFunction.call$2(1, new A.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
    },
    $signature: 86
  };
  A._wrapJsFunctionForAsync_closure.prototype = {
    call$2(errorCode, result) {
      this.$protected(A._asInt(errorCode), result);
    },
    $signature: 44
  };
  A.AsyncError.prototype = {
    toString$0(_) {
      return A.S(this.error);
    },
    $isError: 1,
    get$stackTrace() {
      return this.stackTrace;
    }
  };
  A.Future_Future$microtask_closure.prototype = {
    call$0() {
      var e, s, exception;
      try {
        this.result._complete$1(this.computation.call$0());
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._completeWithErrorCallback(this.result, e, s);
      }
    },
    $signature: 0
  };
  A._Completer.prototype = {
    completeError$2(error, stackTrace) {
      var replacement;
      A.checkNotNullable(error, "error", type$.Object);
      if ((this.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      this._completeError$2(error, stackTrace);
    },
    completeError$1(error) {
      return this.completeError$2(error, null);
    },
    $isCompleter: 1
  };
  A._AsyncCompleter.prototype = {
    complete$1(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
    },
    complete$0($receiver) {
      return this.complete$1($receiver, null);
    },
    _completeError$2(error, stackTrace) {
      this.future._asyncCompleteError$2(error, stackTrace);
    }
  };
  A._SyncCompleter.prototype = {
    complete$1(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._complete$1(t1._eval$1("1/")._as(value));
    },
    _completeError$2(error, stackTrace) {
      this.future._completeError$2(error, stackTrace);
    }
  };
  A._FutureListener.prototype = {
    matchesErrorTest$1(asyncError) {
      if ((this.state & 15) !== 6)
        return true;
      return this.result._zone.runUnary$2$2(type$.bool_Function_Object._as(this.callback), asyncError.error, type$.bool, type$.Object);
    },
    handleError$1(asyncError) {
      var exception, _this = this,
        errorCallback = _this.errorCallback,
        result = null,
        t1 = type$.dynamic,
        t2 = type$.Object,
        t3 = asyncError.error,
        t4 = _this.result._zone;
      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
        result = t4.runBinary$3$3(errorCallback, t3, asyncError.stackTrace, t1, t2, type$.StackTrace);
      else
        result = t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), t3, t1, t2);
      try {
        t1 = _this.$ti._eval$1("2/")._as(result);
        return t1;
      } catch (exception) {
        if (type$.TypeError._is(A.unwrapException(exception))) {
          if ((_this.state & 1) !== 0)
            throw A.wrapException(A.ArgumentError$("The error handler of Future.then must return a value of the returned future's type", "onError"));
          throw A.wrapException(A.ArgumentError$("The error handler of Future.catchError must return a value of the future's type", "onError"));
        } else
          throw exception;
      }
    }
  };
  A._Future.prototype = {
    _setChained$1(source) {
      this._state = this._state & 1 | 4;
      this._resultOrListeners = source;
    },
    then$1$2$onError(_, f, onError, $R) {
      var currentZone, result, t2,
        t1 = this.$ti;
      t1._bind$1($R)._eval$1("1/(2)")._as(f);
      currentZone = $.Zone__current;
      if (currentZone === B.C__RootZone) {
        if (onError != null && !type$.dynamic_Function_Object_StackTrace._is(onError) && !type$.dynamic_Function_Object._is(onError))
          throw A.wrapException(A.ArgumentError$value(onError, "onError", string$.Error_));
      } else {
        f = currentZone.registerUnaryCallback$2$1(f, $R._eval$1("0/"), t1._precomputed1);
        if (onError != null)
          onError = A._registerErrorHandler(onError, currentZone);
      }
      result = new A._Future($.Zone__current, $R._eval$1("_Future<0>"));
      t2 = onError == null ? 1 : 3;
      this._addListener$1(new A._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    then$1$1($receiver, f, $R) {
      return this.then$1$2$onError($receiver, f, null, $R);
    },
    _thenAwait$1$2(f, onError, $E) {
      var result,
        t1 = this.$ti;
      t1._bind$1($E)._eval$1("1/(2)")._as(f);
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this._addListener$1(new A._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    catchError$1(onError) {
      var t1 = this.$ti,
        t2 = $.Zone__current,
        result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        onError = A._registerErrorHandler(onError, t2);
      this._addListener$1(new A._FutureListener(result, 2, null, onError, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    whenComplete$1(action) {
      var t1, t2, result;
      type$.dynamic_Function._as(action);
      t1 = this.$ti;
      t2 = $.Zone__current;
      result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        action = t2.registerCallback$1$1(action, type$.dynamic);
      this._addListener$1(new A._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    _setErrorObject$1(error) {
      this._state = this._state & 1 | 16;
      this._resultOrListeners = error;
    },
    _cloneResult$1(source) {
      this._state = source._state & 30 | this._state & 1;
      this._resultOrListeners = source._resultOrListeners;
    },
    _addListener$1(listener) {
      var source, _this = this,
        t1 = _this._state;
      if (t1 <= 3) {
        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listener;
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._addListener$1(listener);
            return;
          }
          _this._cloneResult$1(source);
        }
        _this._zone.scheduleMicrotask$1(new A._Future__addListener_closure(_this, listener));
      }
    },
    _prependListeners$1(listeners) {
      var t1, existingListeners, next, cursor, next0, source, _this = this, _box_0 = {};
      _box_0.listeners = listeners;
      if (listeners == null)
        return;
      t1 = _this._state;
      if (t1 <= 3) {
        existingListeners = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listeners;
        if (existingListeners != null) {
          next = listeners._nextListener;
          for (cursor = listeners; next != null; cursor = next, next = next0)
            next0 = next._nextListener;
          cursor._nextListener = existingListeners;
        }
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._prependListeners$1(listeners);
            return;
          }
          _this._cloneResult$1(source);
        }
        _box_0.listeners = _this._reverseListeners$1(listeners);
        _this._zone.scheduleMicrotask$1(new A._Future__prependListeners_closure(_box_0, _this));
      }
    },
    _removeListeners$0() {
      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
      this._resultOrListeners = null;
      return this._reverseListeners$1(current);
    },
    _reverseListeners$1(listeners) {
      var current, prev, next;
      for (current = listeners, prev = null; current != null; prev = current, current = next) {
        next = current._nextListener;
        current._nextListener = prev;
      }
      return prev;
    },
    _chainForeignFuture$1(source) {
      var e, s, exception, _this = this;
      _this._state ^= 2;
      try {
        source.then$1$2$onError(0, new A._Future__chainForeignFuture_closure(_this), new A._Future__chainForeignFuture_closure0(_this), type$.Null);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A.scheduleMicrotask(new A._Future__chainForeignFuture_closure1(_this, e, s));
      }
    },
    _complete$1(value) {
      var listeners, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value))
        if (t1._is(value))
          A._Future__chainCoreFutureSync(value, _this);
        else
          _this._chainForeignFuture$1(value);
      else {
        listeners = _this._removeListeners$0();
        t1._precomputed1._as(value);
        _this._state = 8;
        _this._resultOrListeners = value;
        A._Future__propagateToListeners(_this, listeners);
      }
    },
    _completeWithValue$1(value) {
      var listeners, _this = this;
      _this.$ti._precomputed1._as(value);
      listeners = _this._removeListeners$0();
      _this._state = 8;
      _this._resultOrListeners = value;
      A._Future__propagateToListeners(_this, listeners);
    },
    _completeError$2(error, stackTrace) {
      var listeners;
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      listeners = this._removeListeners$0();
      this._setErrorObject$1(A.AsyncError$(error, stackTrace));
      A._Future__propagateToListeners(this, listeners);
    },
    _asyncComplete$1(value) {
      var t1 = this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value)) {
        this._chainFuture$1(value);
        return;
      }
      this._asyncCompleteWithValue$1(value);
    },
    _asyncCompleteWithValue$1(value) {
      var _this = this;
      _this.$ti._precomputed1._as(value);
      _this._state ^= 2;
      _this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteWithValue_closure(_this, value));
    },
    _chainFuture$1(value) {
      var t1 = this.$ti;
      t1._eval$1("Future<1>")._as(value);
      if (t1._is(value)) {
        A._Future__chainCoreFutureAsync(value, this);
        return;
      }
      this._chainForeignFuture$1(value);
    },
    _asyncCompleteError$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._state ^= 2;
      this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteError_closure(this, error, stackTrace));
    },
    timeout$2$onTimeout(_, timeLimit, onTimeout) {
      var t3, _future, _this = this, t1 = {},
        t2 = _this.$ti;
      t2._eval$1("1/()?")._as(onTimeout);
      if ((_this._state & 24) !== 0) {
        t1 = new A._Future($.Zone__current, t2);
        t1._asyncComplete$1(_this);
        return t1;
      }
      t3 = $.Zone__current;
      _future = new A._Future(t3, t2);
      t1.timer = null;
      t1.timer = A.Timer_Timer(timeLimit, new A._Future_timeout_closure(_this, _future, t3, t3.registerCallback$1$1(onTimeout, t2._eval$1("1/"))));
      _this.then$1$2$onError(0, new A._Future_timeout_closure0(t1, _this, _future), new A._Future_timeout_closure1(t1, _future), type$.Null);
      return _future;
    },
    $isFuture: 1
  };
  A._Future__addListener_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this.listener);
    },
    $signature: 0
  };
  A._Future__prependListeners_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this._box_0.listeners);
    },
    $signature: 0
  };
  A._Future__chainForeignFuture_closure.prototype = {
    call$1(value) {
      var error, stackTrace, exception,
        t1 = this.$this;
      t1._state ^= 2;
      try {
        t1._completeWithValue$1(t1.$ti._precomputed1._as(value));
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1._completeError$2(error, stackTrace);
      }
    },
    $signature: 6
  };
  A._Future__chainForeignFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      this.$this._completeError$2(type$.Object._as(error), type$.StackTrace._as(stackTrace));
    },
    $signature: 8
  };
  A._Future__chainForeignFuture_closure1.prototype = {
    call$0() {
      this.$this._completeError$2(this.e, this.s);
    },
    $signature: 0
  };
  A._Future__chainCoreFutureAsync_closure.prototype = {
    call$0() {
      A._Future__chainCoreFutureSync(this._box_0.source, this.target);
    },
    $signature: 0
  };
  A._Future__asyncCompleteWithValue_closure.prototype = {
    call$0() {
      this.$this._completeWithValue$1(this.value);
    },
    $signature: 0
  };
  A._Future__asyncCompleteError_closure.prototype = {
    call$0() {
      this.$this._completeError$2(this.error, this.stackTrace);
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
    call$0() {
      var e, s, t1, exception, t2, originalSource, _this = this, completeResult = null;
      try {
        t1 = _this._box_0.listener;
        completeResult = t1.result._zone.run$1$1(type$.dynamic_Function._as(t1.callback), type$.dynamic);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = _this.hasError && type$.AsyncError._as(_this._box_1.source._resultOrListeners).error === e;
        t2 = _this._box_0;
        if (t1)
          t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        else
          t2.listenerValueOrError = A.AsyncError$(e, s);
        t2.listenerHasError = true;
        return;
      }
      if (completeResult instanceof A._Future && (completeResult._state & 24) !== 0) {
        if ((completeResult._state & 16) !== 0) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
          t1.listenerHasError = true;
        }
        return;
      }
      if (completeResult instanceof A._Future) {
        originalSource = _this._box_1.source;
        t1 = _this._box_0;
        t1.listenerValueOrError = J.then$1$1$x(completeResult, new A._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
        t1.listenerHasError = false;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
    call$1(_) {
      return this.originalSource;
    },
    $signature: 61
  };
  A._Future__propagateToListeners_handleValueCallback.prototype = {
    call$0() {
      var e, s, t1, t2, t3, t4, t5, exception;
      try {
        t1 = this._box_0;
        t2 = t1.listener;
        t3 = t2.$ti;
        t4 = t3._precomputed1;
        t5 = t4._as(this.sourceResult);
        t1.listenerValueOrError = t2.result._zone.runUnary$2$2(t3._eval$1("2/(1)")._as(t2.callback), t5, t3._eval$1("2/"), t4);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = this._box_0;
        t1.listenerValueOrError = A.AsyncError$(e, s);
        t1.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleError.prototype = {
    call$0() {
      var asyncError, e, s, t1, exception, t2, _this = this;
      try {
        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t1 = _this._box_0;
        if (t1.listener.matchesErrorTest$1(asyncError) && t1.listener.errorCallback != null) {
          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
          t1.listenerHasError = false;
        }
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t2 = _this._box_0;
        if (t1.error === e)
          t2.listenerValueOrError = t1;
        else
          t2.listenerValueOrError = A.AsyncError$(e, s);
        t2.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future_timeout_closure.prototype = {
    call$0() {
      var e, s, exception, _this = this;
      try {
        _this._future._complete$1(_this.zone.run$1$1(_this.onTimeoutHandler, _this.$this.$ti._eval$1("1/")));
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        _this._future._completeError$2(e, s);
      }
    },
    $signature: 0
  };
  A._Future_timeout_closure0.prototype = {
    call$1(v) {
      var t1;
      this.$this.$ti._precomputed1._as(v);
      t1 = this._box_0;
      if (t1.timer.get$isActive()) {
        t1.timer.cancel$0(0);
        this._future._completeWithValue$1(v);
      }
    },
    $signature() {
      return this.$this.$ti._eval$1("Null(1)");
    }
  };
  A._Future_timeout_closure1.prototype = {
    call$2(e, s) {
      var t1;
      type$.Object._as(e);
      type$.StackTrace._as(s);
      t1 = this._box_0;
      if (t1.timer.get$isActive()) {
        t1.timer.cancel$0(0);
        this._future._completeError$2(e, s);
      }
    },
    $signature: 8
  };
  A._AsyncCallbackEntry.prototype = {};
  A.Stream.prototype = {
    map$1$1(_, convert, $S) {
      var t1 = A._instanceType(this);
      return new A._MapStream(t1._bind$1($S)._eval$1("1(Stream.T)")._as(convert), this, t1._eval$1("@<Stream.T>")._bind$1($S)._eval$1("_MapStream<1,2>"));
    },
    map$1($receiver, convert) {
      return this.map$1$1($receiver, convert, type$.dynamic);
    },
    get$length(_) {
      var t1 = {},
        future = new A._Future($.Zone__current, type$._Future_int);
      t1.count = 0;
      this.listen$4$cancelOnError$onDone$onError(new A.Stream_length_closure(t1, this), true, new A.Stream_length_closure0(t1, future), future.get$_completeError());
      return future;
    },
    get$first(_) {
      var future = new A._Future($.Zone__current, A._instanceType(this)._eval$1("_Future<Stream.T>")),
        subscription = this.listen$4$cancelOnError$onDone$onError(null, true, new A.Stream_first_closure(future), future.get$_completeError());
      subscription.onData$1(new A.Stream_first_closure0(this, subscription, future));
      return future;
    }
  };
  A.Stream_length_closure.prototype = {
    call$1(_) {
      A._instanceType(this.$this)._eval$1("Stream.T")._as(_);
      ++this._box_0.count;
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A.Stream_length_closure0.prototype = {
    call$0() {
      this.future._complete$1(this._box_0.count);
    },
    $signature: 0
  };
  A.Stream_first_closure.prototype = {
    call$0() {
      var e, s, t1, exception;
      try {
        t1 = A.IterableElementError_noElement();
        throw A.wrapException(t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._completeWithErrorCallback(this.future, e, s);
      }
    },
    $signature: 0
  };
  A.Stream_first_closure0.prototype = {
    call$1(value) {
      A._cancelAndValue(this.subscription, this.future, A._instanceType(this.$this)._eval$1("Stream.T")._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A._StreamController.prototype = {
    get$_pendingEvents() {
      var t1, _this = this;
      if ((_this._state & 8) === 0)
        return A._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
      t1 = A._instanceType(_this);
      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData());
    },
    _ensurePendingEvents$0() {
      var events, t1, _this = this;
      if ((_this._state & 8) === 0) {
        events = _this._varData;
        if (events == null)
          events = _this._varData = new A._PendingEvents(A._instanceType(_this)._eval$1("_PendingEvents<1>"));
        return A._instanceType(_this)._eval$1("_PendingEvents<1>")._as(events);
      }
      t1 = A._instanceType(_this);
      events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData();
      return t1._eval$1("_PendingEvents<1>")._as(events);
    },
    get$_subscription() {
      var varData = this._varData;
      if ((this._state & 8) !== 0)
        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$varData();
      return A._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
    },
    _badEventState$0() {
      if ((this._state & 4) !== 0)
        return new A.StateError("Cannot add event after closing");
      return new A.StateError("Cannot add event while adding a stream");
    },
    _ensureDoneFuture$0() {
      var t1 = this._doneFuture;
      if (t1 == null)
        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new A._Future($.Zone__current, type$._Future_void);
      return t1;
    },
    add$1(_, value) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(value);
      t2 = _this._state;
      if (t2 >= 4)
        throw A.wrapException(_this._badEventState$0());
      if ((t2 & 1) !== 0)
        _this._sendData$1(value);
      else if ((t2 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedData(value, t1._eval$1("_DelayedData<1>")));
    },
    addError$2(error, stackTrace) {
      var replacement, _this = this,
        t1 = type$.Object;
      t1._as(error);
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", t1);
      if (_this._state >= 4)
        throw A.wrapException(_this._badEventState$0());
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      t1 = _this._state;
      if ((t1 & 1) !== 0)
        _this._sendError$2(error, stackTrace);
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedError(error, stackTrace));
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    close$0(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 4) !== 0)
        return _this._ensureDoneFuture$0();
      if (t1 >= 4)
        throw A.wrapException(_this._badEventState$0());
      t1 = _this._state = t1 | 4;
      if ((t1 & 1) !== 0)
        _this._sendDone$0();
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, B.C__DelayedDone);
      return _this._ensureDoneFuture$0();
    },
    _subscribe$4(onData, onError, onDone, cancelOnError) {
      var t2, t3, t4, t5, t6, subscription, pendingEvents, addState, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 3) !== 0)
        throw A.wrapException(A.StateError$("Stream has already been listened to."));
      t2 = $.Zone__current;
      t3 = cancelOnError ? 1 : 0;
      t4 = A._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
      t5 = A._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t6 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      subscription = new A._ControllerSubscription(_this, t4, t5, t2.registerCallback$1$1(t6, type$.void), t2, t3, t1._eval$1("_ControllerSubscription<1>"));
      pendingEvents = _this.get$_pendingEvents();
      t3 = _this._state |= 1;
      if ((t3 & 8) !== 0) {
        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
        addState.set$varData(subscription);
        addState.resume$0(0);
      } else
        _this._varData = subscription;
      subscription._setPendingEvents$1(pendingEvents);
      subscription._guardCallback$1(new A._StreamController__subscribe_closure(_this));
      return subscription;
    },
    _recordCancel$1(subscription) {
      var result, onCancel, cancelResult, e, s, exception, result0, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("StreamSubscription<1>")._as(subscription);
      result = null;
      if ((_this._state & 8) !== 0)
        result = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).cancel$0(0);
      _this._varData = null;
      _this._state = _this._state & 4294967286 | 2;
      onCancel = _this.onCancel;
      if (onCancel != null)
        if (result == null)
          try {
            cancelResult = onCancel.call$0();
            if (cancelResult instanceof A._Future)
              result = cancelResult;
          } catch (exception) {
            e = A.unwrapException(exception);
            s = A.getTraceFromException(exception);
            result0 = new A._Future($.Zone__current, type$._Future_void);
            result0._asyncCompleteError$2(e, s);
            result = result0;
          }
        else
          result = result.whenComplete$1(onCancel);
      t1 = new A._StreamController__recordCancel_complete(_this);
      if (result != null)
        result = result.whenComplete$1(t1);
      else
        t1.call$0();
      return result;
    },
    $isStreamSink: 1,
    $isStreamController: 1,
    $is_StreamControllerLifecycle: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._StreamController__subscribe_closure.prototype = {
    call$0() {
      A._runGuarded(this.$this.onListen);
    },
    $signature: 0
  };
  A._StreamController__recordCancel_complete.prototype = {
    call$0() {
      var doneFuture = this.$this._doneFuture;
      if (doneFuture != null && (doneFuture._state & 30) === 0)
        doneFuture._asyncComplete$1(null);
    },
    $signature: 0
  };
  A._SyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      this.$ti._precomputed1._as(data);
      this.get$_subscription()._add$1(0, data);
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addError$2(error, stackTrace);
    },
    _sendDone$0() {
      this.get$_subscription()._close$0();
    }
  };
  A._AsyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      var t1 = this.$ti;
      t1._precomputed1._as(data);
      this.get$_subscription()._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<1>")));
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _sendDone$0() {
      this.get$_subscription()._addPending$1(B.C__DelayedDone);
    }
  };
  A._AsyncStreamController.prototype = {};
  A._SyncStreamController.prototype = {};
  A._ControllerStream.prototype = {
    get$hashCode(_) {
      return (A.Primitives_objectHashCode(this._controller) ^ 892482866) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return other instanceof A._ControllerStream && other._controller === this._controller;
    }
  };
  A._ControllerSubscription.prototype = {
    _onCancel$0() {
      return this._controller._recordCancel$1(this);
    },
    _onPause$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).pause$0(0);
      A._runGuarded(t1.onPause);
    },
    _onResume$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).resume$0(0);
      A._runGuarded(t1.onResume);
    }
  };
  A._StreamSinkWrapper.prototype = {
    add$1(_, data) {
      this._async$_target.add$1(0, this.$ti._precomputed1._as(data));
    },
    $isStreamSink: 1
  };
  A._BufferingStreamSubscription.prototype = {
    _setPendingEvents$1(pendingEvents) {
      var _this = this;
      A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(pendingEvents);
      if (pendingEvents == null)
        return;
      _this.set$_pending(pendingEvents);
      if (pendingEvents.lastPendingEvent != null) {
        _this._state = (_this._state | 64) >>> 0;
        pendingEvents.schedule$1(_this);
      }
    },
    onData$1(handleData) {
      var t1 = A._instanceType(this);
      this.set$_async$_onData(A._BufferingStreamSubscription__registerDataHandler(this._zone, t1._eval$1("~(_BufferingStreamSubscription.T)?")._as(handleData), t1._eval$1("_BufferingStreamSubscription.T")));
    },
    pause$0(_) {
      var t2, t3, _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t2 = (t1 + 128 | 4) >>> 0;
      _this._state = t2;
      if (t1 < 128) {
        t3 = _this._pending;
        if (t3 != null)
          if (t3._state === 1)
            t3._state = 3;
      }
      if ((t1 & 4) === 0 && (t2 & 32) === 0)
        _this._guardCallback$1(_this.get$_onPause());
    },
    resume$0(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 >= 128) {
        t1 = _this._state = t1 - 128;
        if (t1 < 128)
          if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent != null)
            _this._pending.schedule$1(_this);
          else {
            t1 = (t1 & 4294967291) >>> 0;
            _this._state = t1;
            if ((t1 & 32) === 0)
              _this._guardCallback$1(_this.get$_onResume());
          }
      }
    },
    cancel$0(_) {
      var _this = this,
        t1 = (_this._state & 4294967279) >>> 0;
      _this._state = t1;
      if ((t1 & 8) === 0)
        _this._cancel$0();
      t1 = _this._cancelFuture;
      return t1 == null ? $.$get$Future__nullFuture() : t1;
    },
    asFuture$1$1(futureValue, $E) {
      var result, t1 = {};
      t1.resultValue = null;
      if (!$E._is(null))
        throw A.wrapException(A.ArgumentError$notNull("futureValue"));
      $E._as(futureValue);
      t1.resultValue = futureValue;
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this.set$_onDone(new A._BufferingStreamSubscription_asFuture_closure(t1, result));
      this._onError = new A._BufferingStreamSubscription_asFuture_closure0(this, result);
      return result;
    },
    _cancel$0() {
      var t2, _this = this,
        t1 = _this._state = (_this._state | 8) >>> 0;
      if ((t1 & 64) !== 0) {
        t2 = _this._pending;
        if (t2._state === 1)
          t2._state = 3;
      }
      if ((t1 & 32) === 0)
        _this.set$_pending(null);
      _this._cancelFuture = _this._onCancel$0();
    },
    _add$1(_, data) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("_BufferingStreamSubscription.T")._as(data);
      t2 = _this._state;
      if ((t2 & 8) !== 0)
        return;
      if (t2 < 32)
        _this._sendData$1(data);
      else
        _this._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<_BufferingStreamSubscription.T>")));
    },
    _addError$2(error, stackTrace) {
      var t1 = this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 < 32)
        this._sendError$2(error, stackTrace);
      else
        this._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _close$0() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t1 = (t1 | 2) >>> 0;
      _this._state = t1;
      if (t1 < 32)
        _this._sendDone$0();
      else
        _this._addPending$1(B.C__DelayedDone);
    },
    _onPause$0() {
    },
    _onResume$0() {
    },
    _onCancel$0() {
      return null;
    },
    _addPending$1($event) {
      var t1, _this = this,
        pending = _this._pending;
      if (pending == null) {
        pending = new A._PendingEvents(A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>"));
        _this.set$_pending(pending);
      }
      pending.add$1(0, $event);
      t1 = _this._state;
      if ((t1 & 64) === 0) {
        t1 = (t1 | 64) >>> 0;
        _this._state = t1;
        if (t1 < 128)
          pending.schedule$1(_this);
      }
    },
    _sendData$1(data) {
      var t2, _this = this,
        t1 = A._instanceType(_this)._eval$1("_BufferingStreamSubscription.T");
      t1._as(data);
      t2 = _this._state;
      _this._state = (t2 | 32) >>> 0;
      _this._zone.runUnaryGuarded$1$2(_this._async$_onData, data, t1);
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t2 & 4) !== 0);
    },
    _sendError$2(error, stackTrace) {
      var cancelFuture, _this = this,
        t1 = _this._state,
        t2 = new A._BufferingStreamSubscription__sendError_sendError(_this, error, stackTrace);
      if ((t1 & 1) !== 0) {
        _this._state = (t1 | 16) >>> 0;
        _this._cancel$0();
        cancelFuture = _this._cancelFuture;
        if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
          cancelFuture.whenComplete$1(t2);
        else
          t2.call$0();
      } else {
        t2.call$0();
        _this._checkState$1((t1 & 4) !== 0);
      }
    },
    _sendDone$0() {
      var cancelFuture, _this = this,
        t1 = new A._BufferingStreamSubscription__sendDone_sendDone(_this);
      _this._cancel$0();
      _this._state = (_this._state | 16) >>> 0;
      cancelFuture = _this._cancelFuture;
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(t1);
      else
        t1.call$0();
    },
    _guardCallback$1(callback) {
      var t1, _this = this;
      type$.void_Function._as(callback);
      t1 = _this._state;
      _this._state = (t1 | 32) >>> 0;
      callback.call$0();
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t1 & 4) !== 0);
    },
    _checkState$1(wasInputPaused) {
      var t2, isInputPaused, _this = this,
        t1 = _this._state;
      if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent == null) {
        t1 = _this._state = (t1 & 4294967231) >>> 0;
        if ((t1 & 4) !== 0)
          if (t1 < 128) {
            t2 = _this._pending;
            t2 = t2 == null ? null : t2.lastPendingEvent == null;
            t2 = t2 !== false;
          } else
            t2 = false;
        else
          t2 = false;
        if (t2) {
          t1 = (t1 & 4294967291) >>> 0;
          _this._state = t1;
        }
      }
      for (; true; wasInputPaused = isInputPaused) {
        if ((t1 & 8) !== 0) {
          _this.set$_pending(null);
          return;
        }
        isInputPaused = (t1 & 4) !== 0;
        if (wasInputPaused === isInputPaused)
          break;
        _this._state = (t1 ^ 32) >>> 0;
        if (isInputPaused)
          _this._onPause$0();
        else
          _this._onResume$0();
        t1 = (_this._state & 4294967263) >>> 0;
        _this._state = t1;
      }
      if ((t1 & 64) !== 0 && t1 < 128)
        _this._pending.schedule$1(_this);
    },
    set$_async$_onData(_onData) {
      this._async$_onData = A._instanceType(this)._eval$1("~(_BufferingStreamSubscription.T)")._as(_onData);
    },
    set$_onDone(_onDone) {
      this._onDone = type$.void_Function._as(_onDone);
    },
    set$_pending(_pending) {
      this._pending = A._instanceType(this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(_pending);
    },
    $isStreamSubscription: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._BufferingStreamSubscription_asFuture_closure.prototype = {
    call$0() {
      this.result._complete$1(this._box_0.resultValue);
    },
    $signature: 0
  };
  A._BufferingStreamSubscription_asFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      var cancelFuture, t1;
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      cancelFuture = this.$this.cancel$0(0);
      t1 = this.result;
      if (cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new A._BufferingStreamSubscription_asFuture__closure(t1, error, stackTrace));
      else
        t1._completeError$2(error, stackTrace);
    },
    $signature: 8
  };
  A._BufferingStreamSubscription_asFuture__closure.prototype = {
    call$0() {
      this.result._completeError$2(this.error, this.stackTrace);
    },
    $signature: 4
  };
  A._BufferingStreamSubscription__sendError_sendError.prototype = {
    call$0() {
      var onError, t3, t4,
        t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
        return;
      t1._state = (t2 | 32) >>> 0;
      onError = t1._onError;
      t2 = this.error;
      t3 = type$.Object;
      t4 = t1._zone;
      if (type$.void_Function_Object_StackTrace._is(onError))
        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, type$.StackTrace);
      else
        t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    $signature: 0
  };
  A._BufferingStreamSubscription__sendDone_sendDone.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 16) === 0)
        return;
      t1._state = (t2 | 42) >>> 0;
      t1._zone.runGuarded$1(t1._onDone);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    $signature: 0
  };
  A._StreamImpl.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return this._controller._subscribe$4(t1._eval$1("~(1)?")._as(onData), onError, onDone, cancelOnError === true);
    },
    listen$1(onData) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    },
    listen$2$cancelOnError(onData, cancelOnError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, cancelOnError, null, null);
    },
    listen$2$onDone(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    }
  };
  A._DelayedEvent.prototype = {
    set$next(_, next) {
      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
    },
    get$next(receiver) {
      return this.next;
    }
  };
  A._DelayedData.prototype = {
    perform$1(dispatch) {
      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
    }
  };
  A._DelayedError.prototype = {
    perform$1(dispatch) {
      dispatch._sendError$2(this.error, this.stackTrace);
    }
  };
  A._DelayedDone.prototype = {
    perform$1(dispatch) {
      dispatch._sendDone$0();
    },
    get$next(_) {
      return null;
    },
    set$next(_, _0) {
      throw A.wrapException(A.StateError$("No events after a done."));
    },
    $is_DelayedEvent: 1
  };
  A._PendingEvents.prototype = {
    schedule$1(dispatch) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventDispatch<1>")._as(dispatch);
      t1 = _this._state;
      if (t1 === 1)
        return;
      if (t1 >= 1) {
        _this._state = 1;
        return;
      }
      A.scheduleMicrotask(new A._PendingEvents_schedule_closure(_this, dispatch));
      _this._state = 1;
    },
    add$1(_, $event) {
      var _this = this,
        lastEvent = _this.lastPendingEvent;
      if (lastEvent == null)
        _this.firstPendingEvent = _this.lastPendingEvent = $event;
      else {
        lastEvent.set$next(0, $event);
        _this.lastPendingEvent = $event;
      }
    }
  };
  A._PendingEvents_schedule_closure.prototype = {
    call$0() {
      var t2, $event, nextEvent,
        t1 = this.$this,
        oldState = t1._state;
      t1._state = 0;
      if (oldState === 3)
        return;
      t2 = t1.$ti._eval$1("_EventDispatch<1>")._as(this.dispatch);
      $event = t1.firstPendingEvent;
      nextEvent = $event.get$next($event);
      t1.firstPendingEvent = nextEvent;
      if (nextEvent == null)
        t1.lastPendingEvent = null;
      $event.perform$1(t2);
    },
    $signature: 0
  };
  A._StreamIterator.prototype = {};
  A._cancelAndValue_closure.prototype = {
    call$0() {
      return this.future._complete$1(this.value);
    },
    $signature: 0
  };
  A._ForwardingStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t2, t3, t4, t5, t6, t7,
        t1 = this.$ti;
      t1._eval$1("~(2)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      t2 = t1._rest[1];
      t3 = $.Zone__current;
      t4 = cancelOnError === true ? 1 : 0;
      t5 = A._BufferingStreamSubscription__registerDataHandler(t3, onData, t2);
      t6 = A._BufferingStreamSubscription__registerErrorHandler(t3, onError);
      t7 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      t2 = new A._ForwardingStreamSubscription(this, t5, t6, t3.registerCallback$1$1(t7, type$.void), t3, t4, t1._eval$1("@<1>")._bind$1(t2)._eval$1("_ForwardingStreamSubscription<1,2>"));
      t2.set$_subscription(this._source.listen$3$onDone$onError(t2.get$_handleData(), t2.get$_handleDone(), t2.get$_handleError()));
      return t2;
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._ForwardingStreamSubscription.prototype = {
    _add$1(_, data) {
      this.$ti._rest[1]._as(data);
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_add(0, data);
    },
    _addError$2(error, stackTrace) {
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
    },
    _onPause$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.pause$0(0);
    },
    _onResume$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.resume$0(0);
    },
    _onCancel$0() {
      var subscription = this._subscription;
      if (subscription != null) {
        this.set$_subscription(null);
        return subscription.cancel$0(0);
      }
      return null;
    },
    _handleData$1(data) {
      this._stream._handleData$2(this.$ti._precomputed1._as(data), this);
    },
    _handleError$2(error, stackTrace) {
      var t1;
      type$.StackTrace._as(stackTrace);
      t1 = error == null ? type$.Object._as(error) : error;
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(t1, stackTrace);
    },
    _handleDone$0() {
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._close$0();
    },
    set$_subscription(_subscription) {
      this._subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A._MapStream.prototype = {
    _handleData$2(inputEvent, sink) {
      var outputEvent, e, s, exception, error, stackTrace, replacement,
        t1 = this.$ti;
      t1._precomputed1._as(inputEvent);
      t1._eval$1("_EventSink<2>")._as(sink);
      outputEvent = null;
      try {
        outputEvent = this._transform.call$1(inputEvent);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        error = e;
        stackTrace = s;
        replacement = $.Zone__current.errorCallback$2(error, stackTrace);
        if (replacement != null) {
          error = replacement.error;
          stackTrace = replacement.stackTrace;
        }
        sink._addError$2(error, stackTrace);
        return;
      }
      sink._add$1(0, outputEvent);
    }
  };
  A._ZoneFunction.prototype = {};
  A._ZoneSpecification.prototype = {$isZoneSpecification: 1};
  A._ZoneDelegate.prototype = {$isZoneDelegate: 1};
  A._Zone.prototype = {
    _processUncaughtError$3(zone, error, stackTrace) {
      var implZone, handler, parentDelegate, parentZone, currentZone, e, s, implementation, t1, exception;
      type$.StackTrace._as(stackTrace);
      implementation = this.get$_handleUncaughtError();
      implZone = implementation.zone;
      if (implZone === B.C__RootZone) {
        A._rootHandleError(error, stackTrace);
        return;
      }
      handler = implementation.$function;
      parentDelegate = implZone.get$_parentDelegate();
      t1 = J.get$parent$z(implZone);
      t1.toString;
      parentZone = t1;
      currentZone = $.Zone__current;
      try {
        $.Zone__current = parentZone;
        handler.call$5(implZone, parentDelegate, zone, error, stackTrace);
        $.Zone__current = currentZone;
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current = currentZone;
        t1 = error === e ? stackTrace : s;
        parentZone._processUncaughtError$3(implZone, e, t1);
      }
    },
    $isZone: 1
  };
  A._CustomZone.prototype = {
    get$_delegate() {
      var t1 = this._delegateCache;
      return t1 == null ? this._delegateCache = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      return this.parent.get$_delegate();
    },
    get$errorZone() {
      return this._handleUncaughtError.zone;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        this.run$1$1(f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        this.runUnary$2$2(f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) {
      var e, s, exception;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        this.runBinary$3$3(f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._CustomZone_bindCallback_closure(this, this.registerCallback$1$1($R._eval$1("0()")._as(f), $R), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._CustomZone_bindUnaryCallback_closure(this, this.registerUnaryCallback$2$1($R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $R, $T), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._CustomZone_bindCallbackGuarded_closure(this, this.registerCallback$1$1(type$.void_Function._as(f), type$.void));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._CustomZone_bindUnaryCallbackGuarded_closure(this, this.registerUnaryCallback$2$1($T._eval$1("~(0)")._as(f), type$.void, $T), $T);
    },
    handleUncaughtError$2(error, stackTrace) {
      this._processUncaughtError$3(this, error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      var implementation = this._fork,
        t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(f);
      implementation = this._run;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      implementation = this._runUnary;
      t1 = implementation.zone;
      return implementation.$function.call$2$5(t1, t1.get$_parentDelegate(), this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, T1, T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      implementation = this._runBinary;
      t1 = implementation.zone;
      return implementation.$function.call$3$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1(callback, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(callback);
      implementation = this._registerCallback;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, callback, $R);
    },
    registerUnaryCallback$2$1(callback, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(callback);
      implementation = this._registerUnaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$2$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T);
    },
    registerBinaryCallback$3$1(callback, $R, T1, T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(callback);
      implementation = this._registerBinaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$3$4(t1, t1.get$_parentDelegate(), this, callback, $R, T1, T2);
    },
    errorCallback$2(error, stackTrace) {
      var implementation, implementationZone;
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", type$.Object);
      implementation = this._errorCallback;
      implementationZone = implementation.zone;
      if (implementationZone === B.C__RootZone)
        return null;
      return implementation.$function.call$5(implementationZone, implementationZone.get$_parentDelegate(), this, error, stackTrace);
    },
    scheduleMicrotask$1(f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._scheduleMicrotask;
      t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, f);
    },
    createTimer$2(duration, f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._createTimer;
      t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, duration, f);
    },
    print$1(_, line) {
      var implementation = this._print,
        t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, line);
    },
    set$_handleUncaughtError(_handleUncaughtError) {
      this._handleUncaughtError = type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace._as(_handleUncaughtError);
    },
    get$_run() {
      return this._run;
    },
    get$_runUnary() {
      return this._runUnary;
    },
    get$_runBinary() {
      return this._runBinary;
    },
    get$_registerCallback() {
      return this._registerCallback;
    },
    get$_registerUnaryCallback() {
      return this._registerUnaryCallback;
    },
    get$_registerBinaryCallback() {
      return this._registerBinaryCallback;
    },
    get$_errorCallback() {
      return this._errorCallback;
    },
    get$_scheduleMicrotask() {
      return this._scheduleMicrotask;
    },
    get$_createTimer() {
      return this._createTimer;
    },
    get$_createPeriodicTimer() {
      return this._createPeriodicTimer;
    },
    get$_print() {
      return this._print;
    },
    get$_fork() {
      return this._fork;
    },
    get$_handleUncaughtError() {
      return this._handleUncaughtError;
    },
    get$parent(receiver) {
      return this.parent;
    },
    get$_async$_map() {
      return this._async$_map;
    }
  };
  A._CustomZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.registered, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._CustomZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.registered, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._CustomZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.registered);
    },
    $signature: 0
  };
  A._CustomZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.registered, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A._rootHandleError_closure.prototype = {
    call$0() {
      A.Error_throwWithStackTrace(this.error, this.stackTrace);
    },
    $signature: 0
  };
  A._RootZone.prototype = {
    get$_run() {
      return B._ZoneFunction__RootZone__rootRun;
    },
    get$_runUnary() {
      return B._ZoneFunction__RootZone__rootRunUnary;
    },
    get$_runBinary() {
      return B._ZoneFunction__RootZone__rootRunBinary;
    },
    get$_registerCallback() {
      return B._ZoneFunction__RootZone__rootRegisterCallback;
    },
    get$_registerUnaryCallback() {
      return B._ZoneFunction_Eeh;
    },
    get$_registerBinaryCallback() {
      return B._ZoneFunction_7G2;
    },
    get$_errorCallback() {
      return B._ZoneFunction__RootZone__rootErrorCallback;
    },
    get$_scheduleMicrotask() {
      return B._ZoneFunction__RootZone__rootScheduleMicrotask;
    },
    get$_createTimer() {
      return B._ZoneFunction__RootZone__rootCreateTimer;
    },
    get$_createPeriodicTimer() {
      return B._ZoneFunction_3bB;
    },
    get$_print() {
      return B._ZoneFunction__RootZone__rootPrint;
    },
    get$_fork() {
      return B._ZoneFunction__RootZone__rootFork;
    },
    get$_handleUncaughtError() {
      return B._ZoneFunction_NMc;
    },
    get$parent(_) {
      return null;
    },
    get$_async$_map() {
      return $.$get$_RootZone__rootMap();
    },
    get$_delegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$errorZone() {
      return this;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$0();
          return;
        }
        A._rootRun(null, null, this, f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$1(arg);
          return;
        }
        A._rootRunUnary(null, null, this, f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) {
      var e, s, exception;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$2(arg1, arg2);
          return;
        }
        A._rootRunBinary(null, null, this, f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._RootZone_bindUnaryCallback_closure(this, $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
    },
    handleUncaughtError$2(error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      return A._rootFork(null, null, this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      $R._eval$1("0()")._as(f);
      if ($.Zone__current === B.C__RootZone)
        return f.call$0();
      return A._rootRun(null, null, this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      if ($.Zone__current === B.C__RootZone)
        return f.call$1(arg);
      return A._rootRunUnary(null, null, this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, T1, T2) {
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      if ($.Zone__current === B.C__RootZone)
        return f.call$2(arg1, arg2);
      return A._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1(f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    registerUnaryCallback$2$1(f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    registerBinaryCallback$3$1(f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    errorCallback$2(error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    scheduleMicrotask$1(f) {
      A._rootScheduleMicrotask(null, null, this, type$.void_Function._as(f));
    },
    createTimer$2(duration, f) {
      return A.Timer__createTimer(duration, type$.void_Function._as(f));
    },
    print$1(_, line) {
      A.printString(line);
    }
  };
  A._RootZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.f, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._RootZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.f, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._RootZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.f);
    },
    $signature: 0
  };
  A._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A.runZonedGuarded_closure.prototype = {
    call$5($self, $parent, zone, error, stackTrace) {
      var e, s, exception, t2,
        t1 = type$.StackTrace;
      t1._as(stackTrace);
      try {
        this.parentZone.runBinary$3$3(this.onError, error, stackTrace, type$.void, type$.Object, t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t2 = $parent._delegationTarget;
        if (e === error)
          t2._processUncaughtError$3(zone, error, stackTrace);
        else
          t2._processUncaughtError$3(zone, type$.Object._as(e), t1._as(s));
      }
    },
    $signature: 46
  };
  A._HashMap.prototype = {
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$keys(_) {
      return new A._HashMapKeyIterable(this, A._instanceType(this)._eval$1("_HashMapKeyIterable<1>"));
    },
    containsKey$1(_, key) {
      var strings, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[key] != null;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[key] != null;
      } else
        return this._containsKey$1(key);
    },
    _containsKey$1(key) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(this._getBucket$2(rest, key), key) >= 0;
    },
    $index(_, key) {
      var strings, t1, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        t1 = strings == null ? null : A._HashMap__getTableEntry(strings, key);
        return t1;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        t1 = nums == null ? null : A._HashMap__getTableEntry(nums, key);
        return t1;
      } else
        return this._get$1(0, key);
    },
    _get$1(_, key) {
      var bucket, index,
        rest = this._collection$_rest;
      if (rest == null)
        return null;
      bucket = this._getBucket$2(rest, key);
      index = this._findBucketIndex$2(bucket, key);
      return index < 0 ? null : bucket[index + 1];
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string" && key !== "__proto__") {
        strings = _this._collection$_strings;
        _this._collection$_addHashTableEntry$3(strings == null ? _this._collection$_strings = A._HashMap__newHashTable() : strings, key, value);
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = _this._collection$_nums;
        _this._collection$_addHashTableEntry$3(nums == null ? _this._collection$_nums = A._HashMap__newHashTable() : nums, key, value);
      } else
        _this._set$2(key, value);
    },
    _set$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashMap__newHashTable();
      hash = _this._computeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null) {
        A._HashMap__setTableEntry(rest, hash, [key, value]);
        ++_this._collection$_length;
        _this._keys = null;
      } else {
        index = _this._findBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index + 1] = value;
        else {
          bucket.push(key, value);
          ++_this._collection$_length;
          _this._keys = null;
        }
      }
    },
    forEach$1(_, action) {
      var keys, $length, t2, i, key, t3, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1,2)")._as(action);
      keys = _this._computeKeys$0();
      for ($length = keys.length, t2 = t1._precomputed1, t1 = t1._rest[1], i = 0; i < $length; ++i) {
        key = keys[i];
        t2._as(key);
        t3 = _this.$index(0, key);
        action.call$2(key, t3 == null ? t1._as(t3) : t3);
        if (keys !== _this._keys)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _computeKeys$0() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._keys;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_strings;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (index = 0, i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      } else
        index = 0;
      nums = _this._collection$_nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_rest;
      if (rest != null) {
        names = Object.getOwnPropertyNames(rest);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          bucket = rest[names[i]];
          $length = bucket.length;
          for (i0 = 0; i0 < $length; i0 += 2) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._keys = result;
    },
    _collection$_addHashTableEntry$3(table, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (table[key] == null) {
        ++this._collection$_length;
        this._keys = null;
      }
      A._HashMap__setTableEntry(table, key, value);
    },
    _computeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    _getBucket$2(table, key) {
      return table[this._computeHashCode$1(key)];
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2)
        if (J.$eq$(bucket[i], key))
          return i;
      return -1;
    },
    $isHashMap: 1
  };
  A._IdentityHashMap.prototype = {
    _computeHashCode$1(key) {
      return A.objectHashCode(key) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i, t1;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2) {
        t1 = bucket[i];
        if (t1 == null ? key == null : t1 === key)
          return i;
      }
      return -1;
    }
  };
  A._CustomHashMap.prototype = {
    $index(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return null;
      return this.super$_HashMap$_get(0, key);
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      this.super$_HashMap$_set(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return false;
      return this.super$_HashMap$_containsKey(key);
    },
    _computeHashCode$1(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, t1, t2, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (t1 = this.$ti._precomputed1, t2 = this._equals, i = 0; i < $length; i += 2)
        if (A.boolConversionCheck(t2.call$2(bucket[i], t1._as(key))))
          return i;
      return -1;
    }
  };
  A._CustomHashMap_closure.prototype = {
    call$1(v) {
      return this.K._is(v);
    },
    $signature: 20
  };
  A._HashMapKeyIterable.prototype = {
    get$length(_) {
      return this._collection$_map._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_map._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_map._collection$_length !== 0;
    },
    get$iterator(_) {
      var t1 = this._collection$_map;
      return new A._HashMapKeyIterator(t1, t1._computeKeys$0(), this.$ti._eval$1("_HashMapKeyIterator<1>"));
    },
    contains$1(_, element) {
      return this._collection$_map.containsKey$1(0, element);
    }
  };
  A._HashMapKeyIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        keys = _this._keys,
        offset = _this._offset,
        t1 = _this._collection$_map;
      if (keys !== t1._keys)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= keys.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(keys[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._HashSet.prototype = {
    get$iterator(_) {
      return new A._HashSetIterator(this, this._computeElements$0(), A._instanceType(this)._eval$1("_HashSetIterator<1>"));
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[object] != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[object] != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._HashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._HashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1(_, element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [element];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(element);
      }
      ++_this._collection$_length;
      _this._collection$_elements = null;
      return true;
    },
    remove$1(_, object) {
      var _this = this;
      if (typeof object == "string" && object !== "__proto__")
        return _this._collection$_removeHashTableEntry$2(_this._collection$_strings, object);
      else if (typeof object == "number" && (object & 1073741823) === object)
        return _this._collection$_removeHashTableEntry$2(_this._collection$_nums, object);
      else
        return _this._remove$1(0, object);
    },
    _remove$1(_, object) {
      var hash, bucket, index, _this = this,
        rest = _this._collection$_rest;
      if (rest == null)
        return false;
      hash = _this._computeHashCode$1(object);
      bucket = rest[hash];
      index = _this._findBucketIndex$2(bucket, object);
      if (index < 0)
        return false;
      --_this._collection$_length;
      _this._collection$_elements = null;
      bucket.splice(index, 1);
      if (0 === bucket.length)
        delete rest[hash];
      return true;
    },
    _computeElements$0() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._collection$_elements;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_strings;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (index = 0, i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      } else
        index = 0;
      nums = _this._collection$_nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_rest;
      if (rest != null) {
        names = Object.getOwnPropertyNames(rest);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          bucket = rest[names[i]];
          $length = bucket.length;
          for (i0 = 0; i0 < $length; ++i0) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._collection$_elements = result;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (table[element] != null)
        return false;
      table[element] = 0;
      ++this._collection$_length;
      this._collection$_elements = null;
      return true;
    },
    _collection$_removeHashTableEntry$2(table, element) {
      if (table != null && table[element] != null) {
        delete table[element];
        --this._collection$_length;
        this._collection$_elements = null;
        return true;
      } else
        return false;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i], element))
          return i;
      return -1;
    }
  };
  A._HashSetIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        elements = _this._collection$_elements,
        offset = _this._offset,
        t1 = _this._set;
      if (elements !== t1._collection$_elements)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= elements.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(elements[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._LinkedHashSet.prototype = {
    get$iterator(_) {
      var _this = this,
        t1 = new A._LinkedHashSetIterator(_this, _this._collection$_modifications, A._instanceType(_this)._eval$1("_LinkedHashSetIterator<1>"));
      t1._collection$_cell = _this._collection$_first;
      return t1;
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        if (strings == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(strings[object]) != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        if (nums == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(nums[object]) != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    get$first(_) {
      var first = this._collection$_first;
      if (first == null)
        throw A.wrapException(A.StateError$("No elements"));
      return A._instanceType(this)._precomputed1._as(first._collection$_element);
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._LinkedHashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._LinkedHashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1(_, element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._LinkedHashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._collection$_newLinkedCell$1(element)];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(_this._collection$_newLinkedCell$1(element));
      }
      return true;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (type$.nullable__LinkedHashSetCell._as(table[element]) != null)
        return false;
      table[element] = this._collection$_newLinkedCell$1(element);
      return true;
    },
    _collection$_newLinkedCell$1(element) {
      var _this = this,
        cell = new A._LinkedHashSetCell(A._instanceType(_this)._precomputed1._as(element));
      if (_this._collection$_first == null)
        _this._collection$_first = _this._collection$_last = cell;
      else
        _this._collection$_last = _this._collection$_last._collection$_next = cell;
      ++_this._collection$_length;
      _this._collection$_modifications = _this._collection$_modifications + 1 & 1073741823;
      return cell;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i]._collection$_element, element))
          return i;
      return -1;
    }
  };
  A._LinkedHashSetCell.prototype = {};
  A._LinkedHashSetIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        cell = _this._collection$_cell,
        t1 = _this._set;
      if (_this._collection$_modifications !== t1._collection$_modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (cell == null) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(_this.$ti._eval$1("1?")._as(cell._collection$_element));
        _this._collection$_cell = cell._collection$_next;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.UnmodifiableListView.prototype = {
    cast$1$0(_, $R) {
      return new A.UnmodifiableListView(J.cast$1$0$ax(this._collection$_source, $R), $R._eval$1("UnmodifiableListView<0>"));
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_source);
    },
    $index(_, index) {
      return J.elementAt$1$ax(this._collection$_source, index);
    }
  };
  A.LinkedHashMap_LinkedHashMap$from_closure.prototype = {
    call$2(k, v) {
      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
    },
    $signature: 13
  };
  A.ListBase.prototype = {
    get$iterator(receiver) {
      return new A.ListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("ListIterator<ListBase.E>"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    get$isEmpty(receiver) {
      return this.get$length(receiver) === 0;
    },
    get$isNotEmpty(receiver) {
      return !this.get$isEmpty(receiver);
    },
    get$first(receiver) {
      if (this.get$length(receiver) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.$index(receiver, 0);
    },
    contains$1(receiver, element) {
      var i,
        $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(this.$index(receiver, i), element))
          return true;
        if ($length !== this.get$length(receiver))
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    map$1$1(receiver, f, $T) {
      var t1 = A.instanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(ListBase.E)")._as(f), t1._eval$1("@<ListBase.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    skip$1(receiver, count) {
      return A.SubListIterable$(receiver, count, null, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A.instanceType(receiver)._eval$1("@<ListBase.E>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    sort$1(receiver, compare) {
      var t2,
        t1 = A.instanceType(receiver);
      t1._eval$1("int(ListBase.E,ListBase.E)?")._as(compare);
      t2 = compare == null ? A.collection_ListBase__compareAny$closure() : compare;
      A.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, t2, t1._eval$1("ListBase.E"));
    },
    sublist$2(receiver, start, end) {
      var listLength = this.get$length(receiver);
      if (end == null)
        end = listLength;
      A.RangeError_checkValidRange(start, end, listLength);
      return A.List_List$from(this.getRange$2(receiver, start, end), true, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      return A.SubListIterable$(receiver, start, end, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    fillRange$3(receiver, start, end, fill) {
      var value, i,
        t1 = A.instanceType(receiver);
      t1._eval$1("ListBase.E?")._as(fill);
      value = fill == null ? t1._eval$1("ListBase.E")._as(fill) : fill;
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      for (i = start; i < end; ++i)
        this.$indexSet(receiver, i, value);
    },
    toString$0(receiver) {
      return A.Iterable_iterableToFullString(receiver, "[", "]");
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.MapBase.prototype = {
    cast$2$0(receiver, RK, RV) {
      var t1 = A.instanceType(receiver);
      return A.Map_castFrom(receiver, t1._eval$1("MapBase.K"), t1._eval$1("MapBase.V"), RK, RV);
    },
    forEach$1(receiver, action) {
      var t2, key, t3,
        t1 = A.instanceType(receiver);
      t1._eval$1("~(MapBase.K,MapBase.V)")._as(action);
      for (t2 = J.get$iterator$ax(this.get$keys(receiver)), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) {
        key = t2.get$current(t2);
        t3 = this.$index(receiver, key);
        action.call$2(key, t3 == null ? t1._as(t3) : t3);
      }
    },
    map$2$1(receiver, transform, K2, V2) {
      var result, t2, key, t3, entry,
        t1 = A.instanceType(receiver);
      t1._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(MapBase.K,MapBase.V)")._as(transform);
      result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      for (t2 = J.get$iterator$ax(this.get$keys(receiver)), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) {
        key = t2.get$current(t2);
        t3 = this.$index(receiver, key);
        entry = transform.call$2(key, t3 == null ? t1._as(t3) : t3);
        result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
      }
      return result;
    },
    map$1($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    containsKey$1(receiver, key) {
      return J.contains$1$asx(this.get$keys(receiver), key);
    },
    get$length(receiver) {
      return J.get$length$asx(this.get$keys(receiver));
    },
    get$isEmpty(receiver) {
      return J.get$isEmpty$asx(this.get$keys(receiver));
    },
    toString$0(receiver) {
      return A.MapBase_mapToString(receiver);
    },
    $isMap: 1
  };
  A.MapBase_mapToString_closure.prototype = {
    call$2(k, v) {
      var t2,
        t1 = this._box_0;
      if (!t1.first)
        this.result._contents += ", ";
      t1.first = false;
      t1 = this.result;
      t2 = t1._contents += A.S(k);
      t1._contents = t2 + ": ";
      t1._contents += A.S(v);
    },
    $signature: 21
  };
  A._UnmodifiableMapMixin.prototype = {
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable map"));
    }
  };
  A.MapView.prototype = {
    cast$2$0(_, RK, RV) {
      return J.cast$2$0$ax(this._collection$_map, RK, RV);
    },
    $index(_, key) {
      return J.$index$asx(this._collection$_map, key);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      J.$indexSet$ax(this._collection$_map, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      return J.containsKey$1$x(this._collection$_map, key);
    },
    forEach$1(_, action) {
      J.forEach$1$x(this._collection$_map, A._instanceType(this)._eval$1("~(1,2)")._as(action));
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this._collection$_map);
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_map);
    },
    get$keys(_) {
      return J.get$keys$x(this._collection$_map);
    },
    toString$0(_) {
      return J.toString$0$(this._collection$_map);
    },
    map$2$1(_, transform, K2, V2) {
      return J.map$2$1$ax(this._collection$_map, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2);
    },
    map$1($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  A.UnmodifiableMapView.prototype = {
    cast$2$0(_, RK, RV) {
      return new A.UnmodifiableMapView(J.cast$2$0$ax(this._collection$_map, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>"));
    }
  };
  A.ListQueue.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A._ListQueueIterator(_this, _this._tail, _this._modificationCount, _this._head, _this.$ti._eval$1("_ListQueueIterator<1>"));
    },
    get$isEmpty(_) {
      return this._head === this._tail;
    },
    get$length(_) {
      return (this._tail - this._head & this._table.length - 1) >>> 0;
    },
    get$first(_) {
      var t2, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      t1 = t2[t1];
      return t1 == null ? _this.$ti._precomputed1._as(t1) : t1;
    },
    elementAt$1(_, index) {
      var t2, t3, _this = this,
        t1 = _this.get$length(_this);
      if (0 > index || index >= t1)
        A.throwExpression(A.IndexError$withLength(index, t1, _this, null, "index"));
      t1 = _this._table;
      t2 = t1.length;
      t3 = (_this._head + index & t2 - 1) >>> 0;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(t1, t3);
      t3 = t1[t3];
      return t3 == null ? _this.$ti._precomputed1._as(t3) : t3;
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    removeFirst$0() {
      var t2, result, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      ++_this._modificationCount;
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      result = t2[t1];
      if (result == null)
        result = _this.$ti._precomputed1._as(result);
      B.JSArray_methods.$indexSet(t2, t1, null);
      _this._head = (_this._head + 1 & _this._table.length - 1) >>> 0;
      return result;
    },
    _collection$_add$1(_, element) {
      var t2, t3, newTable, split, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(element);
      B.JSArray_methods.$indexSet(_this._table, _this._tail, element);
      t2 = _this._tail;
      t3 = _this._table.length;
      t2 = (t2 + 1 & t3 - 1) >>> 0;
      _this._tail = t2;
      if (_this._head === t2) {
        newTable = A.List_List$filled(t3 * 2, null, false, t1._eval$1("1?"));
        t1 = _this._table;
        t2 = _this._head;
        split = t1.length - t2;
        B.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
        B.JSArray_methods.setRange$4(newTable, split, split + _this._head, _this._table, 0);
        _this._head = 0;
        _this._tail = _this._table.length;
        _this.set$_table(newTable);
      }
      ++_this._modificationCount;
    },
    set$_table(_table) {
      this._table = this.$ti._eval$1("List<1?>")._as(_table);
    },
    $isQueue: 1
  };
  A._ListQueueIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t2, t3, _this = this,
        t1 = _this._queue;
      if (_this._modificationCount !== t1._modificationCount)
        A.throwExpression(A.ConcurrentModificationError$(t1));
      t2 = _this._collection$_position;
      if (t2 === _this._end) {
        _this.set$_collection$_current(null);
        return false;
      }
      t3 = t1._table;
      if (!(t2 < t3.length))
        return A.ioore(t3, t2);
      _this.set$_collection$_current(t3[t2]);
      _this._collection$_position = (_this._collection$_position + 1 & t1._table.length - 1) >>> 0;
      return true;
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.SetBase.prototype = {
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$isNotEmpty(_) {
      return this.get$length(this) !== 0;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(A._instanceType(this)._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this.add$1(0, t1.get$current(t1));
    },
    containsAll$1(other) {
      var t1, t2, o;
      for (t1 = other._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1), t2 = t1.$ti._precomputed1; t1.moveNext$0();) {
        o = t1._collection$_current;
        if (!this.contains$1(0, o == null ? t2._as(o) : o))
          return false;
      }
      return true;
    },
    map$1$1(_, f, $T) {
      var t1 = A._instanceType(this);
      return new A.EfficientLengthMappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    skip$1(_, n) {
      return A.SkipIterable_SkipIterable(this, n, A._instanceType(this)._precomputed1);
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    elementAt$1(_, index) {
      var iterator, skipCount;
      A.RangeError_checkNotNegative(index, "index");
      iterator = this.get$iterator(this);
      for (skipCount = index; iterator.moveNext$0();) {
        if (skipCount === 0)
          return iterator.get$current(iterator);
        --skipCount;
      }
      throw A.wrapException(A.IndexError$withLength(index, index - skipCount, this, null, "index"));
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isSet: 1
  };
  A._SetBase.prototype = {};
  A._SplayTreeNode.prototype = {
    set$_left(_, _left) {
      this._left = this.$ti._eval$1("_SplayTreeNode.1?")._as(_left);
    },
    set$_right(_, _right) {
      this._right = this.$ti._eval$1("_SplayTreeNode.1?")._as(_right);
    }
  };
  A._SplayTreeSetNode.prototype = {};
  A._SplayTree.prototype = {
    _splay$1(key) {
      var root, compare, comp, current, newTreeLeft, left, newTreeRight, right, currentLeft, currentLeft0, currentRight, currentRight0, _this = this, _null = null;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      root = _this._root;
      if (root == null) {
        _this._compare.call$2(key, key);
        return -1;
      }
      compare = _this._compare;
      for (comp = _null, current = root, newTreeLeft = comp, left = newTreeLeft, newTreeRight = left, right = newTreeRight; true;) {
        comp = compare.call$2(current.key, key);
        if (comp > 0) {
          currentLeft = current._left;
          if (currentLeft == null)
            break;
          comp = compare.call$2(currentLeft.key, key);
          if (comp > 0) {
            current.set$_left(0, currentLeft._right);
            currentLeft.set$_right(0, current);
            currentLeft0 = currentLeft._left;
            if (currentLeft0 == null) {
              current = currentLeft;
              break;
            }
            current = currentLeft;
            currentLeft = currentLeft0;
          }
          if (right == null)
            newTreeRight = current;
          else
            right.set$_left(0, current);
          right = current;
          current = currentLeft;
        } else {
          if (comp < 0) {
            currentRight = current._right;
            if (currentRight == null)
              break;
            comp = compare.call$2(currentRight.key, key);
            if (comp < 0) {
              current.set$_right(0, currentRight._left);
              currentRight.set$_left(0, current);
              currentRight0 = currentRight._right;
              if (currentRight0 == null) {
                current = currentRight;
                break;
              }
              current = currentRight;
              currentRight = currentRight0;
            }
            if (left == null)
              newTreeLeft = current;
            else
              left.set$_right(0, current);
          } else
            break;
          left = current;
          current = currentRight;
        }
      }
      if (left != null) {
        left.set$_right(0, current._left);
        current.set$_left(0, newTreeLeft);
      }
      if (right != null) {
        right.set$_left(0, current._right);
        current.set$_right(0, newTreeRight);
      }
      if (_this._root !== current) {
        _this.set$_root(current);
        ++_this._splayCount;
      }
      return comp;
    },
    _splayMin$1(node) {
      var nextLeft, current, nextLeft0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextLeft = node._left;
      for (current = node; nextLeft != null; current = nextLeft, nextLeft = nextLeft0) {
        current.set$_left(0, nextLeft._right);
        nextLeft.set$_right(0, current);
        nextLeft0 = nextLeft._left;
      }
      return current;
    },
    _splayMax$1(node) {
      var nextRight, current, nextRight0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextRight = node._right;
      for (current = node; nextRight != null; current = nextRight, nextRight = nextRight0) {
        current.set$_right(0, nextRight._left);
        nextRight.set$_left(0, current);
        nextRight0 = nextRight._right;
      }
      return current;
    },
    _remove$1(_, key) {
      var root, left, t1, root0, _this = this;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      if (_this._root == null)
        return null;
      if (_this._splay$1(key) !== 0)
        return null;
      root = _this._root;
      left = root._left;
      --_this._count;
      t1 = root._right;
      if (left == null)
        _this.set$_root(t1);
      else {
        root0 = _this._splayMax$1(left);
        root0.set$_right(0, t1);
        _this.set$_root(root0);
      }
      ++_this._modificationCount;
      return root;
    },
    _addNewRoot$2(node, comp) {
      var root, _this = this;
      _this.$ti._eval$1("_SplayTree.1")._as(node);
      ++_this._count;
      ++_this._modificationCount;
      root = _this._root;
      if (root == null) {
        _this.set$_root(node);
        return;
      }
      if (comp < 0) {
        node.set$_left(0, root);
        node.set$_right(0, root._right);
        root.set$_right(0, null);
      } else {
        node.set$_right(0, root);
        node.set$_left(0, root._left);
        root.set$_left(0, null);
      }
      _this.set$_root(node);
    },
    get$_collection$_first() {
      var _this = this,
        root = _this._root;
      if (root == null)
        return null;
      _this.set$_root(_this._splayMin$1(root));
      return _this._root;
    }
  };
  A._SplayTreeIterator.prototype = {
    get$current(_) {
      var t1 = this._path;
      if (t1.length === 0) {
        this.$ti._eval$1("_SplayTreeIterator.T")._as(null);
        return null;
      }
      return this.$ti._rest[1]._as(B.JSArray_methods.get$last(t1)).key;
    },
    moveNext$0() {
      var node, next, _this = this,
        t1 = _this._modificationCount,
        t2 = _this._tree,
        t3 = t2._modificationCount;
      if (t1 !== t3) {
        if (t1 == null) {
          _this._modificationCount = t3;
          node = t2._root;
          for (t1 = _this._path; node != null;) {
            B.JSArray_methods.add$1(t1, node);
            node = node._left;
          }
          return t1.length !== 0;
        }
        throw A.wrapException(A.ConcurrentModificationError$(t2));
      }
      t1 = _this._path;
      if (t1.length === 0)
        return false;
      if (_this._splayCount !== t2._splayCount) {
        t3 = _this.$ti._eval$1("_SplayTreeIterator.K")._as(B.JSArray_methods.get$last(t1).key);
        B.JSArray_methods.clear$0(t1);
        t2._splay$1(t3);
        t3 = t2._root;
        t3.toString;
        B.JSArray_methods.add$1(t1, t3);
        _this._splayCount = t2._splayCount;
      }
      node = B.JSArray_methods.get$last(t1);
      next = node._right;
      if (next != null) {
        for (; next != null;) {
          B.JSArray_methods.add$1(t1, next);
          next = next._left;
        }
        return true;
      }
      if (0 >= t1.length)
        return A.ioore(t1, -1);
      t1.pop();
      while (true) {
        if (!(t1.length !== 0 && B.JSArray_methods.get$last(t1)._right === node))
          break;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        node = t1.pop();
      }
      return t1.length !== 0;
    },
    $isIterator: 1
  };
  A._SplayTreeKeyIterator.prototype = {};
  A.SplayTreeSet.prototype = {
    get$iterator(_) {
      var t1 = this.$ti;
      return new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
    },
    get$length(_) {
      return this._count;
    },
    get$isEmpty(_) {
      return this._root == null;
    },
    get$isNotEmpty(_) {
      return this._root != null;
    },
    get$first(_) {
      if (this._count === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.get$_collection$_first().key;
    },
    contains$1(_, element) {
      return A.boolConversionCheck(this._validKey.call$1(element)) && this._splay$1(this.$ti._precomputed1._as(element)) === 0;
    },
    add$1(_, element) {
      return this._collection$_add$1(0, this.$ti._precomputed1._as(element));
    },
    _collection$_add$1(_, element) {
      var compare,
        t1 = this.$ti;
      t1._precomputed1._as(element);
      compare = this._splay$1(element);
      if (compare === 0)
        return false;
      this._addNewRoot$2(new A._SplayTreeSetNode(element, t1._eval$1("_SplayTreeSetNode<1>")), compare);
      return true;
    },
    remove$1(_, object) {
      if (!A.boolConversionCheck(this._validKey.call$1(object)))
        return false;
      return this._remove$1(0, this.$ti._precomputed1._as(object)) != null;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(this.$ti._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this._collection$_add$1(0, t1.get$current(t1));
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    set$_root(_root) {
      this._root = this.$ti._eval$1("_SplayTreeSetNode<1>?")._as(_root);
    },
    $isEfficientLengthIterable: 1,
    $isSet: 1
  };
  A.SplayTreeSet_closure.prototype = {
    call$1(v) {
      return this.E._is(v);
    },
    $signature: 20
  };
  A._SplayTreeSet__SplayTree_Iterable.prototype = {};
  A._SplayTreeSet__SplayTree_Iterable_SetMixin.prototype = {};
  A._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
  A._JsonMap.prototype = {
    $index(_, key) {
      var result,
        t1 = this._processed;
      if (t1 == null)
        return this._data.$index(0, key);
      else if (typeof key != "string")
        return null;
      else {
        result = t1[key];
        return typeof result == "undefined" ? this._process$1(key) : result;
      }
    },
    get$length(_) {
      return this._processed == null ? this._data.__js_helper$_length : this._convert$_computeKeys$0().length;
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$keys(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        return new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>"));
      }
      return new A._JsonMapKeyIterable(this);
    },
    $indexSet(_, key, value) {
      var processed, original, _this = this;
      A._asString(key);
      if (_this._processed == null)
        _this._data.$indexSet(0, key, value);
      else if (_this.containsKey$1(0, key)) {
        processed = _this._processed;
        processed[key] = value;
        original = _this._original;
        if (original == null ? processed != null : original !== processed)
          original[key] = null;
      } else
        _this._upgrade$0().$indexSet(0, key, value);
    },
    containsKey$1(_, key) {
      if (this._processed == null)
        return this._data.containsKey$1(0, key);
      if (typeof key != "string")
        return false;
      return Object.prototype.hasOwnProperty.call(this._original, key);
    },
    forEach$1(_, f) {
      var keys, i, key, value, _this = this;
      type$.void_Function_String_dynamic._as(f);
      if (_this._processed == null)
        return _this._data.forEach$1(0, f);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; i < keys.length; ++i) {
        key = keys[i];
        value = _this._processed[key];
        if (typeof value == "undefined") {
          value = A._convertJsonToDartLazy(_this._original[key]);
          _this._processed[key] = value;
        }
        f.call$2(key, value);
        if (keys !== _this._data)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _convert$_computeKeys$0() {
      var keys = type$.nullable_List_dynamic._as(this._data);
      if (keys == null)
        keys = this._data = A._setArrayType(Object.keys(this._original), type$.JSArray_String);
      return keys;
    },
    _upgrade$0() {
      var result, keys, i, t1, key, _this = this;
      if (_this._processed == null)
        return _this._data;
      result = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; t1 = keys.length, i < t1; ++i) {
        key = keys[i];
        result.$indexSet(0, key, _this.$index(0, key));
      }
      if (t1 === 0)
        B.JSArray_methods.add$1(keys, "");
      else
        B.JSArray_methods.clear$0(keys);
      _this._original = _this._processed = null;
      return _this._data = result;
    },
    _process$1(key) {
      var result;
      if (!Object.prototype.hasOwnProperty.call(this._original, key))
        return null;
      result = A._convertJsonToDartLazy(this._original[key]);
      return this._processed[key] = result;
    }
  };
  A._JsonMapKeyIterable.prototype = {
    get$length(_) {
      var t1 = this._parent;
      return t1.get$length(t1);
    },
    elementAt$1(_, index) {
      var t1 = this._parent;
      if (t1._processed == null)
        t1 = t1.get$keys(t1).elementAt$1(0, index);
      else {
        t1 = t1._convert$_computeKeys$0();
        if (!(index >= 0 && index < t1.length))
          return A.ioore(t1, index);
        t1 = t1[index];
      }
      return t1;
    },
    get$iterator(_) {
      var t1 = this._parent;
      if (t1._processed == null) {
        t1 = t1.get$keys(t1);
        t1 = t1.get$iterator(t1);
      } else {
        t1 = t1._convert$_computeKeys$0();
        t1 = new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
      }
      return t1;
    },
    contains$1(_, key) {
      return this._parent.containsKey$1(0, key);
    }
  };
  A.Base64Codec.prototype = {
    get$encoder() {
      return B.C_Base64Encoder;
    },
    normalize$3(_, source, start, end) {
      var inverseAlphabet, t2, i, sliceStart, buffer, firstPadding, firstPaddingSourceIndex, paddingCount, i0, char, i1, digit1, t3, digit2, char0, value, endLength, $length,
        _s64_ = string$.ABCDEF,
        _s31_ = "Invalid base64 encoding length ",
        t1 = source.length;
      end = A.RangeError_checkValidRange(start, end, t1);
      inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (t2 = inverseAlphabet.length, i = start, sliceStart = i, buffer = null, firstPadding = -1, firstPaddingSourceIndex = -1, paddingCount = 0; i < end; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(source, i);
        char = source.charCodeAt(i);
        if (char === 37) {
          i1 = i0 + 2;
          if (i1 <= end) {
            if (!(i0 < t1))
              return A.ioore(source, i0);
            digit1 = A.hexDigitValue(source.charCodeAt(i0));
            t3 = i0 + 1;
            if (!(t3 < t1))
              return A.ioore(source, t3);
            digit2 = A.hexDigitValue(source.charCodeAt(t3));
            char0 = digit1 * 16 + digit2 - (digit2 & 256);
            if (char0 === 37)
              char0 = -1;
            i0 = i1;
          } else
            char0 = -1;
        } else
          char0 = char;
        if (0 <= char0 && char0 <= 127) {
          if (!(char0 >= 0 && char0 < t2))
            return A.ioore(inverseAlphabet, char0);
          value = inverseAlphabet[char0];
          if (value >= 0) {
            if (!(value < 64))
              return A.ioore(_s64_, value);
            char0 = _s64_.charCodeAt(value);
            if (char0 === char)
              continue;
            char = char0;
          } else {
            if (value === -1) {
              if (firstPadding < 0) {
                t3 = buffer == null ? null : buffer._contents.length;
                if (t3 == null)
                  t3 = 0;
                firstPadding = t3 + (i - sliceStart);
                firstPaddingSourceIndex = i;
              }
              ++paddingCount;
              if (char === 61)
                continue;
            }
            char = char0;
          }
          if (value !== -2) {
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t3 = buffer;
            } else
              t3 = buffer;
            t3._contents += B.JSString_methods.substring$2(source, sliceStart, i);
            t3._contents += A.Primitives_stringFromCharCode(char);
            sliceStart = i0;
            continue;
          }
        }
        throw A.wrapException(A.FormatException$("Invalid base64 data", source, i));
      }
      if (buffer != null) {
        t1 = buffer._contents += B.JSString_methods.substring$2(source, sliceStart, end);
        t2 = t1.length;
        if (firstPadding >= 0)
          A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, t2);
        else {
          endLength = B.JSInt_methods.$mod(t2 - 1, 4) + 1;
          if (endLength === 1)
            throw A.wrapException(A.FormatException$(_s31_, source, end));
          for (; endLength < 4;) {
            t1 += "=";
            buffer._contents = t1;
            ++endLength;
          }
        }
        t1 = buffer._contents;
        return B.JSString_methods.replaceRange$3(source, start, end, t1.charCodeAt(0) == 0 ? t1 : t1);
      }
      $length = end - start;
      if (firstPadding >= 0)
        A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, $length);
      else {
        endLength = B.JSInt_methods.$mod($length, 4);
        if (endLength === 1)
          throw A.wrapException(A.FormatException$(_s31_, source, end));
        if (endLength > 1)
          source = B.JSString_methods.replaceRange$3(source, end, end, endLength === 2 ? "==" : "=");
      }
      return source;
    }
  };
  A.Base64Encoder.prototype = {
    convert$1(input) {
      var t1;
      type$.List_int._as(input);
      t1 = J.getInterceptor$asx(input);
      if (t1.get$isEmpty(input))
        return "";
      t1 = new A._Base64Encoder(string$.ABCDEF).encode$4(input, 0, t1.get$length(input), true);
      t1.toString;
      return A.String_String$fromCharCodes(t1, 0, null);
    }
  };
  A._Base64Encoder.prototype = {
    createBuffer$1(_, bufferLength) {
      return new Uint8Array(bufferLength);
    },
    encode$4(bytes, start, end, isLast) {
      var byteCount, fullChunks, bufferLength, output, _this = this;
      type$.List_int._as(bytes);
      byteCount = (_this._convert$_state & 3) + (end - start);
      fullChunks = B.JSInt_methods._tdivFast$1(byteCount, 3);
      bufferLength = fullChunks * 4;
      if (isLast && byteCount - fullChunks * 3 > 0)
        bufferLength += 4;
      output = _this.createBuffer$1(0, bufferLength);
      _this._convert$_state = A._Base64Encoder_encodeChunk(_this._alphabet, bytes, start, end, isLast, output, 0, _this._convert$_state);
      if (bufferLength > 0)
        return output;
      return null;
    }
  };
  A.Base64Decoder.prototype = {
    convert$1(input) {
      var end, decoder, t1;
      A._asString(input);
      end = A.RangeError_checkValidRange(0, null, input.length);
      if (0 === end)
        return new Uint8Array(0);
      decoder = new A._Base64Decoder();
      t1 = decoder.decode$3(0, input, 0, end);
      t1.toString;
      decoder.close$2(0, input, end);
      return t1;
    }
  };
  A._Base64Decoder.prototype = {
    decode$3(_, input, start, end) {
      var buffer, _this = this,
        t1 = _this._convert$_state;
      if (t1 < 0) {
        _this._convert$_state = A._Base64Decoder__checkPadding(input, start, end, t1);
        return null;
      }
      if (start === end)
        return new Uint8Array(0);
      buffer = A._Base64Decoder__allocateBuffer(input, start, end, t1);
      _this._convert$_state = A._Base64Decoder_decodeChunk(input, start, end, buffer, 0, _this._convert$_state);
      return buffer;
    },
    close$2(_, input, end) {
      var t1 = this._convert$_state;
      if (t1 < -1)
        throw A.wrapException(A.FormatException$("Missing padding character", input, end));
      if (t1 > 0)
        throw A.wrapException(A.FormatException$("Invalid length, must be multiple of four", input, end));
      this._convert$_state = -1;
    }
  };
  A.Codec.prototype = {};
  A.Converter.prototype = {$isStreamTransformer: 1};
  A.Encoding.prototype = {};
  A.JsonUnsupportedObjectError.prototype = {
    toString$0(_) {
      var safeString = A.Error_safeToString(this.unsupportedObject);
      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
    }
  };
  A.JsonCyclicError.prototype = {
    toString$0(_) {
      return "Cyclic error in JSON stringify";
    }
  };
  A.JsonCodec.prototype = {
    decode$2$reviver(_, source, reviver) {
      var t1 = A._parseJson(source, this.get$decoder()._reviver);
      return t1;
    },
    encode$2$toEncodable(value, toEncodable) {
      var t1 = A._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
      return t1;
    },
    get$encoder() {
      return B.JsonEncoder_null;
    },
    get$decoder() {
      return B.JsonDecoder_null;
    }
  };
  A.JsonEncoder.prototype = {};
  A.JsonDecoder.prototype = {};
  A._JsonStringifier.prototype = {
    writeStringContent$1(s) {
      var offset, i, charCode, t1, t2, _this = this,
        $length = s.length;
      for (offset = 0, i = 0; i < $length; ++i) {
        charCode = s.charCodeAt(i);
        if (charCode > 92) {
          if (charCode >= 55296) {
            t1 = charCode & 64512;
            if (t1 === 55296) {
              t2 = i + 1;
              t2 = !(t2 < $length && (s.charCodeAt(t2) & 64512) === 56320);
            } else
              t2 = false;
            if (!t2)
              if (t1 === 56320) {
                t1 = i - 1;
                t1 = !(t1 >= 0 && (s.charCodeAt(t1) & 64512) === 55296);
              } else
                t1 = false;
            else
              t1 = true;
            if (t1) {
              if (i > offset)
                _this.writeStringSlice$3(s, offset, i);
              offset = i + 1;
              _this.writeCharCode$1(92);
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(100);
              t1 = charCode >>> 8 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
            }
          }
          continue;
        }
        if (charCode < 32) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          switch (charCode) {
            case 8:
              _this.writeCharCode$1(98);
              break;
            case 9:
              _this.writeCharCode$1(116);
              break;
            case 10:
              _this.writeCharCode$1(110);
              break;
            case 12:
              _this.writeCharCode$1(102);
              break;
            case 13:
              _this.writeCharCode$1(114);
              break;
            default:
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(48);
              _this.writeCharCode$1(48);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              break;
          }
        } else if (charCode === 34 || charCode === 92) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          _this.writeCharCode$1(charCode);
        }
      }
      if (offset === 0)
        _this.writeString$1(s);
      else if (offset < $length)
        _this.writeStringSlice$3(s, offset, $length);
    },
    _checkCycle$1(object) {
      var t1, t2, i, t3;
      for (t1 = this._seen, t2 = t1.length, i = 0; i < t2; ++i) {
        t3 = t1[i];
        if (object == null ? t3 == null : object === t3)
          throw A.wrapException(new A.JsonCyclicError(object, null));
      }
      B.JSArray_methods.add$1(t1, object);
    },
    writeObject$1(object) {
      var customJson, e, t1, exception, _this = this;
      if (_this.writeJsonValue$1(object))
        return;
      _this._checkCycle$1(object);
      try {
        customJson = _this._toEncodable.call$1(object);
        if (!_this.writeJsonValue$1(customJson)) {
          t1 = A.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
          throw A.wrapException(t1);
        }
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
        throw A.wrapException(t1);
      }
    },
    writeJsonValue$1(object) {
      var t1, success, _this = this;
      if (typeof object == "number") {
        if (!isFinite(object))
          return false;
        _this.writeNumber$1(object);
        return true;
      } else if (object === true) {
        _this.writeString$1("true");
        return true;
      } else if (object === false) {
        _this.writeString$1("false");
        return true;
      } else if (object == null) {
        _this.writeString$1("null");
        return true;
      } else if (typeof object == "string") {
        _this.writeString$1('"');
        _this.writeStringContent$1(object);
        _this.writeString$1('"');
        return true;
      } else if (type$.List_dynamic._is(object)) {
        _this._checkCycle$1(object);
        _this.writeList$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return true;
      } else if (type$.Map_dynamic_dynamic._is(object)) {
        _this._checkCycle$1(object);
        success = _this.writeMap$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return success;
      } else
        return false;
    },
    writeList$1(list) {
      var t1, i, _this = this;
      _this.writeString$1("[");
      t1 = J.getInterceptor$asx(list);
      if (t1.get$isNotEmpty(list)) {
        _this.writeObject$1(t1.$index(list, 0));
        for (i = 1; i < t1.get$length(list); ++i) {
          _this.writeString$1(",");
          _this.writeObject$1(t1.$index(list, i));
        }
      }
      _this.writeString$1("]");
    },
    writeMap$1(map) {
      var t2, keyValueList, i, separator, _this = this, _box_0 = {},
        t1 = J.getInterceptor$asx(map);
      if (t1.get$isEmpty(map)) {
        _this.writeString$1("{}");
        return true;
      }
      t2 = t1.get$length(map) * 2;
      keyValueList = A.List_List$filled(t2, null, false, type$.nullable_Object);
      i = _box_0.i = 0;
      _box_0.allStringKeys = true;
      t1.forEach$1(map, new A._JsonStringifier_writeMap_closure(_box_0, keyValueList));
      if (!_box_0.allStringKeys)
        return false;
      _this.writeString$1("{");
      for (separator = '"'; i < t2; i += 2, separator = ',"') {
        _this.writeString$1(separator);
        _this.writeStringContent$1(A._asString(keyValueList[i]));
        _this.writeString$1('":');
        t1 = i + 1;
        if (!(t1 < t2))
          return A.ioore(keyValueList, t1);
        _this.writeObject$1(keyValueList[t1]);
      }
      _this.writeString$1("}");
      return true;
    }
  };
  A._JsonStringifier_writeMap_closure.prototype = {
    call$2(key, value) {
      var t1, t2;
      if (typeof key != "string")
        this._box_0.allStringKeys = false;
      t1 = this.keyValueList;
      t2 = this._box_0;
      B.JSArray_methods.$indexSet(t1, t2.i++, key);
      B.JSArray_methods.$indexSet(t1, t2.i++, value);
    },
    $signature: 21
  };
  A._JsonStringStringifier.prototype = {
    get$_partialResult() {
      var t1 = this._convert$_sink;
      return t1 instanceof A.StringBuffer ? t1.toString$0(0) : null;
    },
    writeNumber$1(number) {
      this._convert$_sink.write$1(0, B.JSNumber_methods.toString$0(number));
    },
    writeString$1(string) {
      this._convert$_sink.write$1(0, string);
    },
    writeStringSlice$3(string, start, end) {
      this._convert$_sink.write$1(0, B.JSString_methods.substring$2(string, start, end));
    },
    writeCharCode$1(charCode) {
      this._convert$_sink.writeCharCode$1(charCode);
    }
  };
  A.Utf8Codec.prototype = {};
  A.Utf8Encoder.prototype = {
    convert$1(string) {
      var stringLength, end, $length, t1, encoder, t2;
      A._asString(string);
      stringLength = string.length;
      end = A.RangeError_checkValidRange(0, null, stringLength);
      $length = end - 0;
      if ($length === 0)
        return new Uint8Array(0);
      t1 = new Uint8Array($length * 3);
      encoder = new A._Utf8Encoder(t1);
      if (encoder._fillBuffer$3(string, 0, end) !== end) {
        t2 = end - 1;
        if (!(t2 >= 0 && t2 < stringLength))
          return A.ioore(string, t2);
        encoder._writeReplacementCharacter$0();
      }
      return B.NativeUint8List_methods.sublist$2(t1, 0, encoder._bufferIndex);
    }
  };
  A._Utf8Encoder.prototype = {
    _writeReplacementCharacter$0() {
      var _this = this,
        t1 = _this._buffer,
        t2 = _this._bufferIndex,
        t3 = _this._bufferIndex = t2 + 1,
        t4 = t1.length;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 239;
      t2 = _this._bufferIndex = t3 + 1;
      if (!(t3 < t4))
        return A.ioore(t1, t3);
      t1[t3] = 191;
      _this._bufferIndex = t2 + 1;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 189;
    },
    _writeSurrogate$2(leadingSurrogate, nextCodeUnit) {
      var rune, t1, t2, t3, t4, _this = this;
      if ((nextCodeUnit & 64512) === 56320) {
        rune = 65536 + ((leadingSurrogate & 1023) << 10) | nextCodeUnit & 1023;
        t1 = _this._buffer;
        t2 = _this._bufferIndex;
        t3 = _this._bufferIndex = t2 + 1;
        t4 = t1.length;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 18 | 240;
        t2 = _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune >>> 12 & 63 | 128;
        t3 = _this._bufferIndex = t2 + 1;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 6 & 63 | 128;
        _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune & 63 | 128;
        return true;
      } else {
        _this._writeReplacementCharacter$0();
        return false;
      }
    },
    _fillBuffer$3(str, start, end) {
      var t1, t2, t3, stringIndex, codeUnit, t4, t5, _this = this;
      if (start !== end) {
        t1 = end - 1;
        if (!(t1 >= 0 && t1 < str.length))
          return A.ioore(str, t1);
        t1 = (str.charCodeAt(t1) & 64512) === 55296;
      } else
        t1 = false;
      if (t1)
        --end;
      for (t1 = _this._buffer, t2 = t1.length, t3 = str.length, stringIndex = start; stringIndex < end; ++stringIndex) {
        if (!(stringIndex < t3))
          return A.ioore(str, stringIndex);
        codeUnit = str.charCodeAt(stringIndex);
        if (codeUnit <= 127) {
          t4 = _this._bufferIndex;
          if (t4 >= t2)
            break;
          _this._bufferIndex = t4 + 1;
          t1[t4] = codeUnit;
        } else {
          t4 = codeUnit & 64512;
          if (t4 === 55296) {
            if (_this._bufferIndex + 4 > t2)
              break;
            t4 = stringIndex + 1;
            if (!(t4 < t3))
              return A.ioore(str, t4);
            if (_this._writeSurrogate$2(codeUnit, str.charCodeAt(t4)))
              stringIndex = t4;
          } else if (t4 === 56320) {
            if (_this._bufferIndex + 3 > t2)
              break;
            _this._writeReplacementCharacter$0();
          } else if (codeUnit <= 2047) {
            t4 = _this._bufferIndex;
            t5 = t4 + 1;
            if (t5 >= t2)
              break;
            _this._bufferIndex = t5;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit >>> 6 | 192;
            _this._bufferIndex = t5 + 1;
            t1[t5] = codeUnit & 63 | 128;
          } else {
            t4 = _this._bufferIndex;
            if (t4 + 2 >= t2)
              break;
            t5 = _this._bufferIndex = t4 + 1;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit >>> 12 | 224;
            t4 = _this._bufferIndex = t5 + 1;
            if (!(t5 < t2))
              return A.ioore(t1, t5);
            t1[t5] = codeUnit >>> 6 & 63 | 128;
            _this._bufferIndex = t4 + 1;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit & 63 | 128;
          }
        }
      }
      return stringIndex;
    }
  };
  A._BigIntImpl.prototype = {
    $negate(_) {
      var t2, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return _this;
      t2 = !_this._isNegative;
      t3 = _this._digits;
      t1 = A._BigIntImpl__normalize(t1, t3);
      return new A._BigIntImpl(t1 === 0 ? false : t2, t3, t1);
    },
    _drShift$1(n) {
      var resultUsed, digits, resultDigits, t1, i, t2, t3, result, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used - n;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = digits.length, i = n; i < used; ++i) {
        t2 = i - n;
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        t3 = digits[i];
        if (!(t2 < resultUsed))
          return A.ioore(resultDigits, t2);
        resultDigits[t2] = t3;
      }
      t2 = _this._isNegative;
      t3 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t3 === 0 ? false : t2, resultDigits, t3);
      if (t2)
        for (i = 0; i < n; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      return result;
    },
    $shr(_, shiftAmount) {
      var t1, digitShift, bitShift, resultUsed, digits, resultDigits, t2, result, i, _this = this;
      if (shiftAmount < 0)
        throw A.wrapException(A.ArgumentError$("shift-amount must be posititve " + shiftAmount, null));
      t1 = _this._used;
      if (t1 === 0)
        return _this;
      digitShift = B.JSInt_methods._tdivFast$1(shiftAmount, 16);
      bitShift = B.JSInt_methods.$mod(shiftAmount, 16);
      if (bitShift === 0)
        return _this._drShift$1(digitShift);
      resultUsed = t1 - digitShift;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__rsh(digits, t1, shiftAmount, resultDigits);
      t1 = _this._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
      if (t1) {
        t1 = digits.length;
        if (!(digitShift >= 0 && digitShift < t1))
          return A.ioore(digits, digitShift);
        if ((digits[digitShift] & B.JSInt_methods.$shl(1, bitShift) - 1) >>> 0 !== 0)
          return result.$sub(0, $.$get$_BigIntImpl_one());
        for (i = 0; i < digitShift; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      }
      return result;
    },
    compareTo$1(_, other) {
      var t1, result;
      type$._BigIntImpl._as(other);
      t1 = this._isNegative;
      if (t1 === other._isNegative) {
        result = A._BigIntImpl__compareDigits(this._digits, this._used, other._digits, other._used);
        return t1 ? 0 - result : result;
      }
      return t1 ? -1 : 1;
    },
    _absAddSetSign$2(other, isNegative) {
      var resultUsed, resultDigits, t1, _this = this,
        used = _this._used,
        otherUsed = other._used;
      if (used < otherUsed)
        return other._absAddSetSign$2(_this, isNegative);
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultUsed = used + 1;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__absAdd(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    _absSubSetSign$2(other, isNegative) {
      var otherUsed, resultDigits, t1, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      otherUsed = other._used;
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultDigits = new Uint16Array(used);
      A._BigIntImpl__absSub(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(used, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    $add(_, other) {
      var t2, isNegative, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return other;
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative === other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $sub(_, other) {
      var t2, isNegative, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return other.$negate(0);
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative !== other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $mul(_, other) {
      var resultUsed, digits, otherDigits, resultDigits, t1, i, t2,
        used = this._used,
        otherUsed = other._used;
      if (used === 0 || otherUsed === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used + otherUsed;
      digits = this._digits;
      otherDigits = other._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = otherDigits.length, i = 0; i < otherUsed;) {
        if (!(i < t1))
          return A.ioore(otherDigits, i);
        A._BigIntImpl__mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
        ++i;
      }
      t1 = this._isNegative !== other._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
    },
    _div$1(other) {
      var lastQuo_used, quo_digits, t1, quo;
      if (this._used < other._used)
        return $.$get$_BigIntImpl_zero();
      this._divRem$1(other);
      lastQuo_used = $._BigIntImpl____lastQuoRemUsed._readField$0() - $._BigIntImpl____lastRemUsed._readField$0();
      quo_digits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastQuoRemUsed._readField$0(), lastQuo_used);
      t1 = A._BigIntImpl__normalize(lastQuo_used, quo_digits);
      quo = new A._BigIntImpl(false, quo_digits, t1);
      return this._isNegative !== other._isNegative && t1 > 0 ? quo.$negate(0) : quo;
    },
    _rem$1(other) {
      var remDigits, t1, rem, _this = this;
      if (_this._used < other._used)
        return _this;
      _this._divRem$1(other);
      remDigits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), 0, $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastRemUsed._readField$0());
      t1 = A._BigIntImpl__normalize($._BigIntImpl____lastRemUsed._readField$0(), remDigits);
      rem = new A._BigIntImpl(false, remDigits, t1);
      if ($._BigIntImpl____lastRem_nsh._readField$0() > 0)
        rem = rem.$shr(0, $._BigIntImpl____lastRem_nsh._readField$0());
      return _this._isNegative && rem._used > 0 ? rem.$negate(0) : rem;
    },
    _divRem$1(other) {
      var yDigits, yUsed, t1, nsh, yDigits0, yUsed0, resultDigits, resultUsed0, topDigitDivisor, j, tmpDigits, tmpUsed, resultUsed1, t2, nyDigits, i, estimatedQuotientDigit, _this = this,
        resultUsed = _this._used;
      if (resultUsed === $._BigIntImpl__lastDividendUsed && other._used === $._BigIntImpl__lastDivisorUsed && _this._digits === $._BigIntImpl__lastDividendDigits && other._digits === $._BigIntImpl__lastDivisorDigits)
        return;
      yDigits = other._digits;
      yUsed = other._used;
      t1 = yUsed - 1;
      if (!(t1 >= 0 && t1 < yDigits.length))
        return A.ioore(yDigits, t1);
      nsh = 16 - B.JSInt_methods.get$bitLength(yDigits[t1]);
      if (nsh > 0) {
        yDigits0 = new Uint16Array(yUsed + 5);
        yUsed0 = A._BigIntImpl__lShiftDigits(yDigits, yUsed, nsh, yDigits0);
        resultDigits = new Uint16Array(resultUsed + 5);
        resultUsed0 = A._BigIntImpl__lShiftDigits(_this._digits, resultUsed, nsh, resultDigits);
      } else {
        resultDigits = A._BigIntImpl__cloneDigits(_this._digits, 0, resultUsed, resultUsed + 2);
        yUsed0 = yUsed;
        yDigits0 = yDigits;
        resultUsed0 = resultUsed;
      }
      t1 = yUsed0 - 1;
      if (!(t1 >= 0 && t1 < yDigits0.length))
        return A.ioore(yDigits0, t1);
      topDigitDivisor = yDigits0[t1];
      j = resultUsed0 - yUsed0;
      tmpDigits = new Uint16Array(resultUsed0);
      tmpUsed = A._BigIntImpl__dlShiftDigits(yDigits0, yUsed0, j, tmpDigits);
      resultUsed1 = resultUsed0 + 1;
      t1 = resultDigits.length;
      if (A._BigIntImpl__compareDigits(resultDigits, resultUsed0, tmpDigits, tmpUsed) >= 0) {
        if (!(resultUsed0 >= 0 && resultUsed0 < t1))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 1;
        A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
      } else {
        if (!(resultUsed0 >= 0 && resultUsed0 < t1))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 0;
      }
      t2 = yUsed0 + 2;
      nyDigits = new Uint16Array(t2);
      if (!(yUsed0 >= 0 && yUsed0 < t2))
        return A.ioore(nyDigits, yUsed0);
      nyDigits[yUsed0] = 1;
      A._BigIntImpl__absSub(nyDigits, yUsed0 + 1, yDigits0, yUsed0, nyDigits);
      i = resultUsed0 - 1;
      for (; j > 0;) {
        estimatedQuotientDigit = A._BigIntImpl__estimateQuotientDigit(topDigitDivisor, resultDigits, i);
        --j;
        A._BigIntImpl__mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed0);
        if (!(i >= 0 && i < t1))
          return A.ioore(resultDigits, i);
        if (resultDigits[i] < estimatedQuotientDigit) {
          tmpUsed = A._BigIntImpl__dlShiftDigits(nyDigits, yUsed0, j, tmpDigits);
          A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
          for (; --estimatedQuotientDigit, resultDigits[i] < estimatedQuotientDigit;)
            A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
        }
        --i;
      }
      $._BigIntImpl__lastDividendDigits = _this._digits;
      $._BigIntImpl__lastDividendUsed = resultUsed;
      $._BigIntImpl__lastDivisorDigits = yDigits;
      $._BigIntImpl__lastDivisorUsed = yUsed;
      $._BigIntImpl____lastQuoRemDigits.__late_helper$_value = resultDigits;
      $._BigIntImpl____lastQuoRemUsed.__late_helper$_value = resultUsed1;
      $._BigIntImpl____lastRemUsed.__late_helper$_value = yUsed0;
      $._BigIntImpl____lastRem_nsh.__late_helper$_value = nsh;
    },
    get$hashCode(_) {
      var hash, t2, t3, i,
        combine = new A._BigIntImpl_hashCode_combine(),
        t1 = this._used;
      if (t1 === 0)
        return 6707;
      hash = this._isNegative ? 83585 : 429689;
      for (t2 = this._digits, t3 = t2.length, i = 0; i < t1; ++i) {
        if (!(i < t3))
          return A.ioore(t2, i);
        hash = combine.call$2(hash, t2[i]);
      }
      return new A._BigIntImpl_hashCode_finish().call$1(hash);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A._BigIntImpl && this.compareTo$1(0, other) === 0;
    },
    toString$0(_) {
      var decimalDigitChunks, rest, t2, digits4, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return "0";
      if (t1 === 1) {
        if (_this._isNegative) {
          t1 = _this._digits;
          if (0 >= t1.length)
            return A.ioore(t1, 0);
          return B.JSInt_methods.toString$0(-t1[0]);
        }
        t1 = _this._digits;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        return B.JSInt_methods.toString$0(t1[0]);
      }
      decimalDigitChunks = A._setArrayType([], type$.JSArray_String);
      t1 = _this._isNegative;
      rest = t1 ? _this.$negate(0) : _this;
      for (; rest._used > 1;) {
        t2 = $.$get$_BigIntImpl__bigInt10000();
        if (t2._used === 0)
          A.throwExpression(B.C_IntegerDivisionByZeroException);
        digits4 = rest._rem$1(t2).toString$0(0);
        B.JSArray_methods.add$1(decimalDigitChunks, digits4);
        t3 = digits4.length;
        if (t3 === 1)
          B.JSArray_methods.add$1(decimalDigitChunks, "000");
        if (t3 === 2)
          B.JSArray_methods.add$1(decimalDigitChunks, "00");
        if (t3 === 3)
          B.JSArray_methods.add$1(decimalDigitChunks, "0");
        rest = rest._div$1(t2);
      }
      t2 = rest._digits;
      if (0 >= t2.length)
        return A.ioore(t2, 0);
      B.JSArray_methods.add$1(decimalDigitChunks, B.JSInt_methods.toString$0(t2[0]));
      if (t1)
        B.JSArray_methods.add$1(decimalDigitChunks, "-");
      return new A.ReversedListIterable(decimalDigitChunks, type$.ReversedListIterable_String).join$0(0);
    },
    $isBigInt: 1,
    $isComparable: 1
  };
  A._BigIntImpl_hashCode_combine.prototype = {
    call$2(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $signature: 22
  };
  A._BigIntImpl_hashCode_finish.prototype = {
    call$1(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    $signature: 23
  };
  A._symbolMapToStringMap_closure.prototype = {
    call$2(key, value) {
      this.result.$indexSet(0, type$.Symbol._as(key)._name, value);
    },
    $signature: 24
  };
  A.NoSuchMethodError_toString_closure.prototype = {
    call$2(key, value) {
      var t1, t2, t3;
      type$.Symbol._as(key);
      t1 = this.sb;
      t2 = this._box_0;
      t3 = t1._contents += t2.comma;
      t3 += key._name;
      t1._contents = t3;
      t1._contents = t3 + ": ";
      t1._contents += A.Error_safeToString(value);
      t2.comma = ", ";
    },
    $signature: 24
  };
  A.DateTime.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.DateTime && this._value === other._value && this.isUtc === other.isUtc;
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._value, type$.DateTime._as(other)._value);
    },
    get$hashCode(_) {
      var t1 = this._value;
      return (t1 ^ B.JSInt_methods._shrOtherPositive$1(t1, 30)) & 1073741823;
    },
    toString$0(_) {
      var _this = this,
        y = A.DateTime__fourDigits(A.Primitives_getYear(_this)),
        m = A.DateTime__twoDigits(A.Primitives_getMonth(_this)),
        d = A.DateTime__twoDigits(A.Primitives_getDay(_this)),
        h = A.DateTime__twoDigits(A.Primitives_getHours(_this)),
        min = A.DateTime__twoDigits(A.Primitives_getMinutes(_this)),
        sec = A.DateTime__twoDigits(A.Primitives_getSeconds(_this)),
        ms = A.DateTime__threeDigits(A.Primitives_getMilliseconds(_this)),
        t1 = y + "-" + m;
      if (_this.isUtc)
        return t1 + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
      else
        return t1 + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
    },
    $isComparable: 1
  };
  A.Duration.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Duration && this._duration === other._duration;
    },
    get$hashCode(_) {
      return B.JSInt_methods.get$hashCode(this._duration);
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._duration, type$.Duration._as(other)._duration);
    },
    toString$0(_) {
      var sign, minutes, minutesPadding, seconds, secondsPadding,
        microseconds = this._duration,
        hours = B.JSInt_methods._tdivFast$1(microseconds, 3600000000),
        microseconds0 = microseconds % 3600000000;
      if (microseconds < 0) {
        hours = 0 - hours;
        microseconds = 0 - microseconds0;
        sign = "-";
      } else {
        microseconds = microseconds0;
        sign = "";
      }
      minutes = B.JSInt_methods._tdivFast$1(microseconds, 60000000);
      microseconds %= 60000000;
      minutesPadding = minutes < 10 ? "0" : "";
      seconds = B.JSInt_methods._tdivFast$1(microseconds, 1000000);
      secondsPadding = seconds < 10 ? "0" : "";
      return sign + hours + ":" + minutesPadding + minutes + ":" + secondsPadding + seconds + "." + B.JSString_methods.padLeft$2(B.JSInt_methods.toString$0(microseconds % 1000000), 6, "0");
    },
    $isComparable: 1
  };
  A.Error.prototype = {
    get$stackTrace() {
      return A.getTraceFromException(this.$thrownJsError);
    }
  };
  A.AssertionError.prototype = {
    toString$0(_) {
      var t1 = this.message;
      if (t1 != null)
        return "Assertion failed: " + A.Error_safeToString(t1);
      return "Assertion failed";
    }
  };
  A.TypeError.prototype = {};
  A.ArgumentError.prototype = {
    get$_errorName() {
      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
    },
    get$_errorExplanation() {
      return "";
    },
    toString$0(_) {
      var _this = this,
        $name = _this.name,
        nameString = $name == null ? "" : " (" + $name + ")",
        message = _this.message,
        messageString = message == null ? "" : ": " + A.S(message),
        prefix = _this.get$_errorName() + nameString + messageString;
      if (!_this._hasValue)
        return prefix;
      return prefix + _this.get$_errorExplanation() + ": " + A.Error_safeToString(_this.get$invalidValue());
    },
    get$invalidValue() {
      return this.invalidValue;
    }
  };
  A.RangeError.prototype = {
    get$invalidValue() {
      return A._asNumQ(this.invalidValue);
    },
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      var explanation,
        start = this.start,
        end = this.end;
      if (start == null)
        explanation = end != null ? ": Not less than or equal to " + A.S(end) : "";
      else if (end == null)
        explanation = ": Not greater than or equal to " + A.S(start);
      else if (end > start)
        explanation = ": Not in inclusive range " + A.S(start) + ".." + A.S(end);
      else
        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + A.S(start);
      return explanation;
    }
  };
  A.IndexError.prototype = {
    get$invalidValue() {
      return A._asInt(this.invalidValue);
    },
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      if (A._asInt(this.invalidValue) < 0)
        return ": index must not be negative";
      var t1 = this.length;
      if (t1 === 0)
        return ": no indices are valid";
      return ": index should be less than " + t1;
    },
    get$length(receiver) {
      return this.length;
    }
  };
  A.NoSuchMethodError.prototype = {
    toString$0(_) {
      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
        sb = new A.StringBuffer("");
      _box_0.comma = "";
      $arguments = _this._core$_arguments;
      for (t1 = $arguments.length, _i = 0, t2 = "", t3 = ""; _i < t1; ++_i, t3 = ", ") {
        argument = $arguments[_i];
        sb._contents = t2 + t3;
        t2 = sb._contents += A.Error_safeToString(argument);
        _box_0.comma = ", ";
      }
      _this._namedArguments.forEach$1(0, new A.NoSuchMethodError_toString_closure(_box_0, sb));
      receiverText = A.Error_safeToString(_this._core$_receiver);
      actualParameters = sb.toString$0(0);
      return "NoSuchMethodError: method not found: '" + _this._core$_memberName._name + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
    }
  };
  A.UnsupportedError.prototype = {
    toString$0(_) {
      return "Unsupported operation: " + this.message;
    }
  };
  A.UnimplementedError.prototype = {
    toString$0(_) {
      var message = this.message;
      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
    }
  };
  A.StateError.prototype = {
    toString$0(_) {
      return "Bad state: " + this.message;
    }
  };
  A.ConcurrentModificationError.prototype = {
    toString$0(_) {
      var t1 = this.modifiedObject;
      if (t1 == null)
        return "Concurrent modification during iteration.";
      return "Concurrent modification during iteration: " + A.Error_safeToString(t1) + ".";
    }
  };
  A.OutOfMemoryError.prototype = {
    toString$0(_) {
      return "Out of Memory";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A.StackOverflowError.prototype = {
    toString$0(_) {
      return "Stack Overflow";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A._Exception.prototype = {
    toString$0(_) {
      return "Exception: " + this.message;
    }
  };
  A.FormatException.prototype = {
    toString$0(_) {
      var t1, lineEnd, lineNum, lineStart, previousCharWasCR, i, char, end, start, prefix, postfix,
        message = this.message,
        report = "" !== message ? "FormatException: " + message : "FormatException",
        offset = this.offset,
        source = this.source;
      if (typeof source == "string") {
        if (offset != null)
          t1 = offset < 0 || offset > source.length;
        else
          t1 = false;
        if (t1)
          offset = null;
        if (offset == null) {
          if (source.length > 78)
            source = B.JSString_methods.substring$2(source, 0, 75) + "...";
          return report + "\n" + source;
        }
        for (lineEnd = source.length, lineNum = 1, lineStart = 0, previousCharWasCR = false, i = 0; i < offset; ++i) {
          if (!(i < lineEnd))
            return A.ioore(source, i);
          char = source.charCodeAt(i);
          if (char === 10) {
            if (lineStart !== i || !previousCharWasCR)
              ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = false;
          } else if (char === 13) {
            ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = true;
          }
        }
        report = lineNum > 1 ? report + (" (at line " + lineNum + ", character " + (offset - lineStart + 1) + ")\n") : report + (" (at character " + (offset + 1) + ")\n");
        for (i = offset; i < lineEnd; ++i) {
          if (!(i >= 0))
            return A.ioore(source, i);
          char = source.charCodeAt(i);
          if (char === 10 || char === 13) {
            lineEnd = i;
            break;
          }
        }
        if (lineEnd - lineStart > 78)
          if (offset - lineStart < 75) {
            end = lineStart + 75;
            start = lineStart;
            prefix = "";
            postfix = "...";
          } else {
            if (lineEnd - offset < 75) {
              start = lineEnd - 75;
              end = lineEnd;
              postfix = "";
            } else {
              start = offset - 36;
              end = offset + 36;
              postfix = "...";
            }
            prefix = "...";
          }
        else {
          end = lineEnd;
          start = lineStart;
          prefix = "";
          postfix = "";
        }
        return report + prefix + B.JSString_methods.substring$2(source, start, end) + postfix + "\n" + B.JSString_methods.$mul(" ", offset - start + prefix.length) + "^\n";
      } else
        return offset != null ? report + (" (at offset " + A.S(offset) + ")") : report;
    }
  };
  A.IntegerDivisionByZeroException.prototype = {
    get$stackTrace() {
      return null;
    },
    toString$0(_) {
      return "IntegerDivisionByZeroException";
    },
    $isError: 1
  };
  A.Iterable.prototype = {
    cast$1$0(_, $R) {
      return A.CastIterable_CastIterable(this, A.instanceType(this)._eval$1("Iterable.E"), $R);
    },
    map$1$1(_, toElement, $T) {
      var t1 = A.instanceType(this);
      return A.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(Iterable.E)")._as(toElement), t1._eval$1("Iterable.E"), $T);
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    where$1(_, test) {
      var t1 = A.instanceType(this);
      return new A.WhereIterable(this, t1._eval$1("bool(Iterable.E)")._as(test), t1._eval$1("WhereIterable<Iterable.E>"));
    },
    contains$1(_, element) {
      var t1;
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(t1), element))
          return true;
      return false;
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, growable, A.instanceType(this)._eval$1("Iterable.E"));
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$length(_) {
      var count,
        it = this.get$iterator(this);
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty(_) {
      return !this.get$iterator(this).moveNext$0();
    },
    get$isNotEmpty(_) {
      return !this.get$isEmpty(this);
    },
    skip$1(_, count) {
      return A.SkipIterable_SkipIterable(this, count, A.instanceType(this)._eval$1("Iterable.E"));
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    get$single(_) {
      var result,
        it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      result = it.get$current(it);
      if (it.moveNext$0())
        throw A.wrapException(A.IterableElementError_tooMany());
      return result;
    },
    elementAt$1(_, index) {
      var iterator, skipCount;
      A.RangeError_checkNotNegative(index, "index");
      iterator = this.get$iterator(this);
      for (skipCount = index; iterator.moveNext$0();) {
        if (skipCount === 0)
          return iterator.get$current(iterator);
        --skipCount;
      }
      throw A.wrapException(A.IndexError$withLength(index, index - skipCount, this, null, "index"));
    },
    toString$0(_) {
      return A.Iterable_iterableToShortString(this, "(", ")");
    }
  };
  A.Null.prototype = {
    get$hashCode(_) {
      return A.Object.prototype.get$hashCode.call(this, this);
    },
    toString$0(_) {
      return "null";
    }
  };
  A.Object.prototype = {$isObject: 1,
    $eq(_, other) {
      return this === other;
    },
    get$hashCode(_) {
      return A.Primitives_objectHashCode(this);
    },
    toString$0(_) {
      return "Instance of '" + A.Primitives_objectTypeName(this) + "'";
    },
    noSuchMethod$1(_, invocation) {
      throw A.wrapException(A.NoSuchMethodError_NoSuchMethodError$withInvocation(this, type$.Invocation._as(invocation)));
    },
    get$runtimeType(_) {
      return A.getRuntimeTypeOfDartObject(this);
    },
    toString() {
      return this.toString$0(this);
    }
  };
  A._StringStackTrace.prototype = {
    toString$0(_) {
      return this._stackTrace;
    },
    $isStackTrace: 1
  };
  A.StringBuffer.prototype = {
    get$length(_) {
      return this._contents.length;
    },
    write$1(_, obj) {
      this._contents += A.S(obj);
    },
    writeCharCode$1(charCode) {
      this._contents += A.Primitives_stringFromCharCode(charCode);
    },
    toString$0(_) {
      var t1 = this._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    $isStringSink: 1
  };
  A.Uri__parseIPv4Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv4 address, " + msg, this.host, position));
    },
    $signature: 85
  };
  A.Uri_parseIPv6Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv6 address, " + msg, this.host, position));
    },
    $signature: 67
  };
  A.Uri_parseIPv6Address_parseHex.prototype = {
    call$2(start, end) {
      var value;
      if (end - start > 4)
        this.error.call$2("an IPv6 part can only contain a maximum of 4 hex digits", start);
      value = A.int_parse(B.JSString_methods.substring$2(this.host, start, end), 16);
      if (value < 0 || value > 65535)
        this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start);
      return value;
    },
    $signature: 22
  };
  A._Uri.prototype = {
    get$_text() {
      var t1, t2, t3, t4, _this = this,
        value = _this.___Uri__text_FI;
      if (value === $) {
        t1 = _this.scheme;
        t2 = t1.length !== 0 ? "" + t1 + ":" : "";
        t3 = _this._host;
        t4 = t3 == null;
        if (!t4 || t1 === "file") {
          t1 = t2 + "//";
          t2 = _this._userInfo;
          if (t2.length !== 0)
            t1 = t1 + t2 + "@";
          if (!t4)
            t1 += t3;
          t2 = _this._port;
          if (t2 != null)
            t1 = t1 + ":" + A.S(t2);
        } else
          t1 = t2;
        t1 += _this.path;
        t2 = _this._query;
        if (t2 != null)
          t1 = t1 + "?" + t2;
        t2 = _this._fragment;
        if (t2 != null)
          t1 = t1 + "#" + t2;
        value !== $ && A.throwLateFieldADI("_text");
        value = _this.___Uri__text_FI = t1.charCodeAt(0) == 0 ? t1 : t1;
      }
      return value;
    },
    get$hashCode(_) {
      var result, _this = this,
        value = _this.___Uri_hashCode_FI;
      if (value === $) {
        result = B.JSString_methods.get$hashCode(_this.get$_text());
        _this.___Uri_hashCode_FI !== $ && A.throwLateFieldADI("hashCode");
        _this.___Uri_hashCode_FI = result;
        value = result;
      }
      return value;
    },
    get$userInfo() {
      return this._userInfo;
    },
    get$host(_) {
      var host = this._host;
      if (host == null)
        return "";
      if (B.JSString_methods.startsWith$1(host, "["))
        return B.JSString_methods.substring$2(host, 1, host.length - 1);
      return host;
    },
    get$port(_) {
      var t1 = this._port;
      return t1 == null ? A._Uri__defaultPort(this.scheme) : t1;
    },
    get$query(_) {
      var t1 = this._query;
      return t1 == null ? "" : t1;
    },
    get$fragment() {
      var t1 = this._fragment;
      return t1 == null ? "" : t1;
    },
    isScheme$1(scheme) {
      var thisScheme = this.scheme;
      if (scheme.length !== thisScheme.length)
        return false;
      return A._caseInsensitiveCompareStart(scheme, thisScheme, 0) >= 0;
    },
    replace$2$path$scheme(_, path, scheme) {
      var schemeChanged, isFile, userInfo, port, host, hasAuthority, t1, currentPath, _this = this,
        scheme0 = _this.scheme;
      if (scheme != null) {
        scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
        schemeChanged = scheme !== scheme0;
      } else {
        scheme = scheme0;
        schemeChanged = false;
      }
      isFile = scheme === "file";
      userInfo = _this._userInfo;
      port = _this._port;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      host = _this._host;
      if (!(host != null))
        host = userInfo.length !== 0 || port != null || isFile ? "" : null;
      hasAuthority = host != null;
      t1 = path == null;
      if (!t1 || false)
        path = A._Uri__makePath(path, 0, t1 ? 0 : path.length, null, scheme, hasAuthority);
      else {
        currentPath = _this.path;
        if (!isFile)
          t1 = hasAuthority && currentPath.length !== 0;
        else
          t1 = true;
        if (t1 && !B.JSString_methods.startsWith$1(currentPath, "/"))
          currentPath = "/" + currentPath;
        path = currentPath;
      }
      return A._Uri$_internal(scheme, userInfo, host, port, path, _this._query, _this._fragment);
    },
    replace$1$scheme($receiver, scheme) {
      return this.replace$2$path$scheme($receiver, null, scheme);
    },
    replace$1$path($receiver, path) {
      return this.replace$2$path$scheme($receiver, path, null);
    },
    get$hasAuthority() {
      return this._host != null;
    },
    get$hasQuery() {
      return this._query != null;
    },
    get$hasFragment() {
      return this._fragment != null;
    },
    toString$0(_) {
      return this.get$_text();
    },
    $eq(_, other) {
      var t1, t2, _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      if (type$.Uri._is(other))
        if (_this.scheme === other.get$scheme())
          if (_this._host != null === other.get$hasAuthority())
            if (_this._userInfo === other.get$userInfo())
              if (_this.get$host(_this) === other.get$host(other))
                if (_this.get$port(_this) === other.get$port(other))
                  if (_this.path === other.get$path(other)) {
                    t1 = _this._query;
                    t2 = t1 == null;
                    if (!t2 === other.get$hasQuery()) {
                      if (t2)
                        t1 = "";
                      if (t1 === other.get$query(other)) {
                        t1 = _this._fragment;
                        t2 = t1 == null;
                        if (!t2 === other.get$hasFragment()) {
                          if (t2)
                            t1 = "";
                          t1 = t1 === other.get$fragment();
                        } else
                          t1 = false;
                      } else
                        t1 = false;
                    } else
                      t1 = false;
                  } else
                    t1 = false;
                else
                  t1 = false;
              else
                t1 = false;
            else
              t1 = false;
          else
            t1 = false;
        else
          t1 = false;
      else
        t1 = false;
      return t1;
    },
    $isUri: 1,
    get$scheme() {
      return this.scheme;
    },
    get$path(receiver) {
      return this.path;
    }
  };
  A._Uri__makePath_closure.prototype = {
    call$1(s) {
      return A._Uri__uriEncode(B.List_XRg0, A._asString(s), B.C_Utf8Codec, false);
    },
    $signature: 25
  };
  A.UriData.prototype = {
    get$uri() {
      var t2, queryIndex, end, query, _this = this, _null = null,
        t1 = _this._uriCache;
      if (t1 == null) {
        t1 = _this._separatorIndices;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        t2 = _this._text;
        t1 = t1[0] + 1;
        queryIndex = B.JSString_methods.indexOf$2(t2, "?", t1);
        end = t2.length;
        if (queryIndex >= 0) {
          query = A._Uri__normalizeOrSubstring(t2, queryIndex + 1, end, B.List_oFp, false, false);
          end = queryIndex;
        } else
          query = _null;
        t1 = _this._uriCache = new A._DataUri("data", "", _null, _null, A._Uri__normalizeOrSubstring(t2, t1, end, B.List_XRg, false, false), query, _null);
      }
      return t1;
    },
    toString$0(_) {
      var t2,
        t1 = this._separatorIndices;
      if (0 >= t1.length)
        return A.ioore(t1, 0);
      t2 = this._text;
      return t1[0] === -1 ? "data:" + t2 : t2;
    }
  };
  A._createTables_build.prototype = {
    call$2(state, defaultTransition) {
      var t1 = this.tables;
      if (!(state < t1.length))
        return A.ioore(t1, state);
      t1 = t1[state];
      B.NativeUint8List_methods.fillRange$3(t1, 0, 96, defaultTransition);
      return t1;
    },
    $signature: 63
  };
  A._createTables_setChars.prototype = {
    call$3(target, chars, transition) {
      var t1, i, t2;
      for (t1 = chars.length, i = 0; i < t1; ++i) {
        t2 = chars.charCodeAt(i) ^ 96;
        if (!(t2 < 96))
          return A.ioore(target, t2);
        target[t2] = transition;
      }
    },
    $signature: 26
  };
  A._createTables_setRange.prototype = {
    call$3(target, range, transition) {
      var i, n,
        t1 = range.length;
      if (0 >= t1)
        return A.ioore(range, 0);
      i = range.charCodeAt(0);
      if (1 >= t1)
        return A.ioore(range, 1);
      n = range.charCodeAt(1);
      for (; i <= n; ++i) {
        t1 = (i ^ 96) >>> 0;
        if (!(t1 < 96))
          return A.ioore(target, t1);
        target[t1] = transition;
      }
    },
    $signature: 26
  };
  A._SimpleUri.prototype = {
    get$hasAuthority() {
      return this._hostStart > 0;
    },
    get$hasPort() {
      return this._hostStart > 0 && this._portStart + 1 < this._pathStart;
    },
    get$hasQuery() {
      return this._queryStart < this._fragmentStart;
    },
    get$hasFragment() {
      return this._fragmentStart < this._uri.length;
    },
    isScheme$1(scheme) {
      var t1 = scheme.length;
      if (t1 === 0)
        return this._schemeEnd < 0;
      if (t1 !== this._schemeEnd)
        return false;
      return A._caseInsensitiveCompareStart(scheme, this._uri, 0) >= 0;
    },
    get$scheme() {
      var t1 = this._schemeCache;
      return t1 == null ? this._schemeCache = this._computeScheme$0() : t1;
    },
    _computeScheme$0() {
      var t2, _this = this,
        t1 = _this._schemeEnd;
      if (t1 <= 0)
        return "";
      t2 = t1 === 4;
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return "http";
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return "https";
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "file"))
        return "file";
      if (t1 === 7 && B.JSString_methods.startsWith$1(_this._uri, "package"))
        return "package";
      return B.JSString_methods.substring$2(_this._uri, 0, t1);
    },
    get$userInfo() {
      var t1 = this._hostStart,
        t2 = this._schemeEnd + 3;
      return t1 > t2 ? B.JSString_methods.substring$2(this._uri, t2, t1 - 1) : "";
    },
    get$host(_) {
      var t1 = this._hostStart;
      return t1 > 0 ? B.JSString_methods.substring$2(this._uri, t1, this._portStart) : "";
    },
    get$port(_) {
      var t1, _this = this;
      if (_this.get$hasPort())
        return A.int_parse(B.JSString_methods.substring$2(_this._uri, _this._portStart + 1, _this._pathStart), null);
      t1 = _this._schemeEnd;
      if (t1 === 4 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return 80;
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return 443;
      return 0;
    },
    get$path(_) {
      return B.JSString_methods.substring$2(this._uri, this._pathStart, this._queryStart);
    },
    get$query(_) {
      var t1 = this._queryStart,
        t2 = this._fragmentStart;
      return t1 < t2 ? B.JSString_methods.substring$2(this._uri, t1 + 1, t2) : "";
    },
    get$fragment() {
      var t1 = this._fragmentStart,
        t2 = this._uri;
      return t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : "";
    },
    replace$2$path$scheme(_, path, scheme) {
      var schemeChanged, isFile, t1, userInfo, port, host, hasAuthority, t2, query, fragment, _this = this, _null = null;
      if (scheme != null) {
        scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
        schemeChanged = !(_this._schemeEnd === scheme.length && B.JSString_methods.startsWith$1(_this._uri, scheme));
      } else {
        scheme = _this.get$scheme();
        schemeChanged = false;
      }
      isFile = scheme === "file";
      t1 = _this._hostStart;
      userInfo = t1 > 0 ? B.JSString_methods.substring$2(_this._uri, _this._schemeEnd + 3, t1) : "";
      port = _this.get$hasPort() ? _this.get$port(_this) : _null;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      t1 = _this._hostStart;
      if (t1 > 0)
        host = B.JSString_methods.substring$2(_this._uri, t1, _this._portStart);
      else
        host = userInfo.length !== 0 || port != null || isFile ? "" : _null;
      hasAuthority = host != null;
      t1 = path == null;
      if (!t1 || false)
        path = A._Uri__makePath(path, 0, t1 ? 0 : path.length, _null, scheme, hasAuthority);
      else {
        path = B.JSString_methods.substring$2(_this._uri, _this._pathStart, _this._queryStart);
        if (!isFile)
          t1 = hasAuthority && path.length !== 0;
        else
          t1 = true;
        if (t1 && !B.JSString_methods.startsWith$1(path, "/"))
          path = "/" + path;
      }
      t1 = _this._queryStart;
      t2 = _this._fragmentStart;
      query = t1 < t2 ? B.JSString_methods.substring$2(_this._uri, t1 + 1, t2) : _null;
      t1 = _this._fragmentStart;
      t2 = _this._uri;
      fragment = t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragment);
    },
    replace$1$scheme($receiver, scheme) {
      return this.replace$2$path$scheme($receiver, null, scheme);
    },
    replace$1$path($receiver, path) {
      return this.replace$2$path$scheme($receiver, path, null);
    },
    get$hashCode(_) {
      var t1 = this._hashCodeCache;
      return t1 == null ? this._hashCodeCache = B.JSString_methods.get$hashCode(this._uri) : t1;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return type$.Uri._is(other) && this._uri === other.toString$0(0);
    },
    toString$0(_) {
      return this._uri;
    },
    $isUri: 1
  };
  A._DataUri.prototype = {};
  A.Expando.prototype = {
    toString$0(_) {
      return "Expando:null";
    }
  };
  A.HtmlElement.prototype = {$isHtmlElement: 1};
  A.AccessibleNodeList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.AnchorElement.prototype = {
    set$href(receiver, value) {
      receiver.href = value;
    },
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    },
    $isAnchorElement: 1
  };
  A.AreaElement.prototype = {
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    }
  };
  A.BaseElement.prototype = {$isBaseElement: 1};
  A.Blob.prototype = {$isBlob: 1};
  A.BodyElement.prototype = {$isBodyElement: 1};
  A.CharacterData.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssPerspective.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssRule.prototype = {$isCssRule: 1};
  A.CssStyleDeclaration.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A.CssStyleDeclarationBase.prototype = {};
  A.CssStyleValue.prototype = {};
  A.CssTransformComponent.prototype = {};
  A.CssTransformValue.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssUnparsedValue.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CustomEvent.prototype = {
    _initCustomEvent$4(receiver, type, bubbles, cancelable, detail) {
      return receiver.initCustomEvent(type, true, true, detail);
    },
    $isCustomEvent: 1
  };
  A.DataTransferItemList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Document.prototype = {$isDocument: 1};
  A.DomException.prototype = {
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    }
  };
  A.DomImplementation.prototype = {
    createHtmlDocument$1(receiver, title) {
      var t1 = receiver.createHTMLDocument(title);
      t1.toString;
      return t1;
    }
  };
  A.DomRectList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Rectangle_num._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.DomRectReadOnly.prototype = {
    toString$0(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      return "Rectangle (" + A.S(t1) + ", " + A.S(t2) + ") " + A.S(this.get$width(receiver)) + " x " + A.S(this.get$height(receiver));
    },
    $eq(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = J.getInterceptor$x(other);
            t1 = this.get$width(receiver) === t1.get$width(other) && this.get$height(receiver) === t1.get$height(other);
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      return A.Object_hash(t1, t2, this.get$width(receiver), this.get$height(receiver));
    },
    get$_height(receiver) {
      return receiver.height;
    },
    get$height(receiver) {
      var t1 = this.get$_height(receiver);
      t1.toString;
      return t1;
    },
    get$_width(receiver) {
      return receiver.width;
    },
    get$width(receiver) {
      var t1 = this.get$_width(receiver);
      t1.toString;
      return t1;
    },
    $isRectangle: 1
  };
  A.DomStringList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      A._asString(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.DomTokenList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A._FrozenElementList.prototype = {
    get$length(_) {
      return this._nodeList.length;
    },
    $index(_, index) {
      var t1 = this._nodeList;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return this.$ti._precomputed1._as(t1[index]);
    },
    $indexSet(_, index, value) {
      this.$ti._precomputed1._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify list"));
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort list"));
    },
    get$first(_) {
      return this.$ti._precomputed1._as(B.NodeList_methods.get$first(this._nodeList));
    }
  };
  A.Element.prototype = {
    get$attributes(receiver) {
      return new A._ElementAttributeMap(receiver);
    },
    toString$0(receiver) {
      var t1 = receiver.localName;
      t1.toString;
      return t1;
    },
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t1, t2, contextElement, fragment;
      if (treeSanitizer == null) {
        t1 = $.Element__defaultValidator;
        if (t1 == null) {
          t1 = A._setArrayType([], type$.JSArray_NodeValidator);
          t2 = new A.NodeValidatorBuilder(t1);
          B.JSArray_methods.add$1(t1, A._Html5NodeValidator$(null));
          B.JSArray_methods.add$1(t1, A._TemplatingNodeValidator$());
          $.Element__defaultValidator = t2;
          validator = t2;
        } else
          validator = t1;
        t1 = $.Element__defaultSanitizer;
        if (t1 == null) {
          validator.toString;
          t1 = new A._ValidatingTreeSanitizer(validator);
          $.Element__defaultSanitizer = t1;
          treeSanitizer = t1;
        } else {
          validator.toString;
          t1.validator = validator;
          treeSanitizer = t1;
        }
      }
      if ($.Element__parseDocument == null) {
        t1 = document;
        t2 = t1.implementation;
        t2.toString;
        t2 = B.DomImplementation_methods.createHtmlDocument$1(t2, "");
        $.Element__parseDocument = t2;
        t2 = t2.createRange();
        t2.toString;
        $.Element__parseRange = t2;
        t2 = $.Element__parseDocument.createElement("base");
        type$.BaseElement._as(t2);
        t1 = t1.baseURI;
        t1.toString;
        t2.href = t1;
        $.Element__parseDocument.head.appendChild(t2).toString;
      }
      t1 = $.Element__parseDocument;
      if (t1.body == null) {
        t2 = t1.createElement("body");
        B.HtmlDocument_methods.set$body(t1, type$.BodyElement._as(t2));
      }
      t1 = $.Element__parseDocument;
      if (type$.BodyElement._is(receiver)) {
        t1 = t1.body;
        t1.toString;
        contextElement = t1;
      } else {
        t1.toString;
        t2 = receiver.tagName;
        t2.toString;
        contextElement = t1.createElement(t2);
        $.Element__parseDocument.body.appendChild(contextElement).toString;
      }
      t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1) {
        t1 = receiver.tagName;
        t1.toString;
        t1 = !B.JSArray_methods.contains$1(B.List_ME0, t1);
      } else
        t1 = false;
      if (t1) {
        $.Element__parseRange.selectNodeContents(contextElement);
        t1 = $.Element__parseRange;
        t1 = t1.createContextualFragment(html);
        t1.toString;
        fragment = t1;
      } else {
        J.set$_innerHtml$x(contextElement, html);
        t1 = $.Element__parseDocument.createDocumentFragment();
        t1.toString;
        for (; t2 = contextElement.firstChild, t2 != null;)
          t1.appendChild(t2).toString;
        fragment = t1;
      }
      if (contextElement !== $.Element__parseDocument.body)
        J.remove$0$x(contextElement);
      treeSanitizer.sanitizeTree$1(fragment);
      document.adoptNode(fragment).toString;
      return fragment;
    },
    createFragment$2$treeSanitizer($receiver, html, treeSanitizer) {
      return this.createFragment$3$treeSanitizer$validator($receiver, html, treeSanitizer, null);
    },
    setInnerHtml$1(receiver, html) {
      this.set$text(receiver, null);
      receiver.appendChild(this.createFragment$3$treeSanitizer$validator(receiver, html, null, null)).toString;
    },
    set$_innerHtml(receiver, value) {
      receiver.innerHTML = value;
    },
    $isElement: 1
  };
  A.Element_Element$html_closure.prototype = {
    call$1(e) {
      return type$.Element._is(type$.Node._as(e));
    },
    $signature: 58
  };
  A.Event.prototype = {$isEvent: 1};
  A.EventTarget.prototype = {
    addEventListener$3(receiver, type, listener, useCapture) {
      type$.nullable_dynamic_Function_Event._as(listener);
      if (listener != null)
        this._addEventListener$3(receiver, type, listener, useCapture);
    },
    addEventListener$2($receiver, type, listener) {
      return this.addEventListener$3($receiver, type, listener, null);
    },
    _addEventListener$3(receiver, type, listener, options) {
      return receiver.addEventListener(type, A.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), options);
    },
    _removeEventListener$3(receiver, type, listener, options) {
      return receiver.removeEventListener(type, A.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), false);
    },
    $isEventTarget: 1
  };
  A.File.prototype = {$isFile: 1};
  A.FileList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.File._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1,
    $isFileList: 1
  };
  A.FileWriter.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.FormElement.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Gamepad.prototype = {$isGamepad: 1};
  A.History.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A.HtmlCollection.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.HtmlDocument.prototype = {
    set$body(receiver, value) {
      receiver.body = value;
    }
  };
  A.HttpRequest.prototype = {
    open$3$async(receiver, method, url, async) {
      return receiver.open(method, url, true);
    },
    set$withCredentials(receiver, value) {
      receiver.withCredentials = true;
    },
    $isHttpRequest: 1
  };
  A.HttpRequest_request_closure.prototype = {
    call$1(e) {
      var t1, t2, accepted, unknownRedirect, t3;
      type$.ProgressEvent._as(e);
      t1 = this.xhr;
      t2 = t1.status;
      t2.toString;
      accepted = t2 >= 200 && t2 < 300;
      unknownRedirect = t2 > 307 && t2 < 400;
      t2 = accepted || t2 === 0 || t2 === 304 || unknownRedirect;
      t3 = this.completer;
      if (t2)
        t3.complete$1(0, t1);
      else
        t3.completeError$1(e);
    },
    $signature: 100
  };
  A.HttpRequestEventTarget.prototype = {};
  A.ImageData.prototype = {$isImageData: 1};
  A.KeyboardEvent.prototype = {$isKeyboardEvent: 1};
  A.Location.prototype = {
    get$origin(receiver) {
      var t2,
        t1 = "origin" in receiver;
      t1.toString;
      if (t1) {
        t1 = receiver.origin;
        t1.toString;
        return t1;
      }
      t1 = receiver.protocol;
      t1.toString;
      t2 = receiver.host;
      t2.toString;
      return t1 + "//" + t2;
    },
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    },
    $isLocation: 1
  };
  A.MediaList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.MessageEvent.prototype = {$isMessageEvent: 1};
  A.MessagePort.prototype = {$isMessagePort: 1};
  A.MidiInputMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.MidiInputMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.MidiInputMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 5
  };
  A.MidiOutputMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.MidiOutputMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.MidiOutputMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 5
  };
  A.MimeType.prototype = {$isMimeType: 1};
  A.MimeTypeArray.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.MimeType._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._ChildNodeListLazy.prototype = {
    get$first(_) {
      var result = this._this.firstChild;
      if (result == null)
        throw A.wrapException(A.StateError$("No elements"));
      return result;
    },
    get$single(_) {
      var t1 = this._this,
        l = t1.childNodes.length;
      if (l === 0)
        throw A.wrapException(A.StateError$("No elements"));
      if (l > 1)
        throw A.wrapException(A.StateError$("More than one element"));
      t1 = t1.firstChild;
      t1.toString;
      return t1;
    },
    addAll$1(_, iterable) {
      var t1, t2, len, i, t3;
      type$.Iterable_Node._as(iterable);
      if (iterable instanceof A._ChildNodeListLazy) {
        t1 = iterable._this;
        t2 = this._this;
        if (t1 !== t2)
          for (len = t1.childNodes.length, i = 0; i < len; ++i) {
            t3 = t1.firstChild;
            t3.toString;
            t2.appendChild(t3).toString;
          }
        return;
      }
      for (t1 = iterable.get$iterator(iterable), t2 = this._this; t1.moveNext$0();)
        t2.appendChild(t1.get$current(t1)).toString;
    },
    $indexSet(_, index, value) {
      var t1, t2;
      type$.Node._as(value);
      t1 = this._this;
      t2 = t1.childNodes;
      if (!(index >= 0 && index < t2.length))
        return A.ioore(t2, index);
      t1.replaceChild(value, t2[index]).toString;
    },
    get$iterator(_) {
      var t1 = this._this.childNodes;
      return new A.FixedSizeListIterator(t1, t1.length, A.instanceType(t1)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1(_, compare) {
      type$.nullable_int_Function_Node_Node._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort Node list"));
    },
    get$length(_) {
      return this._this.childNodes.length;
    },
    $index(_, index) {
      var t1 = this._this.childNodes;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    }
  };
  A.Node.prototype = {
    remove$0(receiver) {
      var t1 = receiver.parentNode;
      if (t1 != null)
        t1.removeChild(receiver).toString;
    },
    _clearChildren$0(receiver) {
      var t1;
      for (; t1 = receiver.firstChild, t1 != null;)
        receiver.removeChild(t1).toString;
    },
    toString$0(receiver) {
      var value = receiver.nodeValue;
      return value == null ? this.super$Interceptor$toString(receiver) : value;
    },
    set$text(receiver, value) {
      receiver.textContent = value;
    },
    $isNode: 1
  };
  A.NodeList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.Plugin.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isPlugin: 1
  };
  A.PluginArray.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Plugin._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.ProgressEvent.prototype = {$isProgressEvent: 1};
  A.RtcStatsReport.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.RtcStatsReport_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.RtcStatsReport_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 5
  };
  A.ScriptElement.prototype = {$isScriptElement: 1};
  A.SelectElement.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.SharedArrayBuffer.prototype = {$isSharedArrayBuffer: 1};
  A.SourceBuffer.prototype = {$isSourceBuffer: 1};
  A.SourceBufferList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.SourceBuffer._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SpeechGrammar.prototype = {$isSpeechGrammar: 1};
  A.SpeechGrammarList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.SpeechGrammar._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SpeechRecognitionResult.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isSpeechRecognitionResult: 1
  };
  A.Storage.prototype = {
    containsKey$1(receiver, key) {
      return receiver.getItem(key) != null;
    },
    $index(receiver, key) {
      return receiver.getItem(A._asString(key));
    },
    $indexSet(receiver, key, value) {
      receiver.setItem(A._asString(key), A._asString(value));
    },
    forEach$1(receiver, f) {
      var i, key, t1;
      type$.void_Function_String_String._as(f);
      for (i = 0; true; ++i) {
        key = receiver.key(i);
        if (key == null)
          return;
        t1 = receiver.getItem(key);
        t1.toString;
        f.call$2(key, t1);
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.Storage_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      return receiver.key(0) == null;
    },
    $isMap: 1
  };
  A.Storage_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 18
  };
  A.StyleSheet.prototype = {$isStyleSheet: 1};
  A.TableElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var table,
        t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      table = A.Element_Element$html("<table>" + html + "</table>", treeSanitizer, validator);
      t1 = document.createDocumentFragment();
      t1.toString;
      new A._ChildNodeListLazy(t1).addAll$1(0, new A._ChildNodeListLazy(table));
      return t1;
    }
  };
  A.TableRowElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t2,
        t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      t2 = t1.createDocumentFragment();
      t2.toString;
      t1 = t1.createElement("table");
      t1.toString;
      t1 = new A._ChildNodeListLazy(B.TableElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator));
      t1 = new A._ChildNodeListLazy(t1.get$single(t1));
      new A._ChildNodeListLazy(t2).addAll$1(0, new A._ChildNodeListLazy(t1.get$single(t1)));
      return t2;
    }
  };
  A.TableSectionElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t2,
        t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      t2 = t1.createDocumentFragment();
      t2.toString;
      t1 = t1.createElement("table");
      t1.toString;
      t1 = new A._ChildNodeListLazy(B.TableElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator));
      new A._ChildNodeListLazy(t2).addAll$1(0, new A._ChildNodeListLazy(t1.get$single(t1)));
      return t2;
    }
  };
  A.TemplateElement.prototype = {
    setInnerHtml$1(receiver, html) {
      var t1, fragment;
      this.set$text(receiver, null);
      t1 = receiver.content;
      t1.toString;
      J._clearChildren$0$x(t1);
      fragment = this.createFragment$3$treeSanitizer$validator(receiver, html, null, null);
      receiver.content.appendChild(fragment).toString;
    },
    $isTemplateElement: 1
  };
  A.TextTrack.prototype = {$isTextTrack: 1};
  A.TextTrackCue.prototype = {$isTextTrackCue: 1};
  A.TextTrackCueList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.TextTrackCue._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TextTrackList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.TextTrack._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TimeRanges.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A.Touch.prototype = {$isTouch: 1};
  A.TouchList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Touch._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TrackDefaultList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.UIEvent.prototype = {};
  A.Url.prototype = {
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    }
  };
  A.VideoTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Window.prototype = {
    alert$1(receiver, message) {
      return receiver.alert(message);
    },
    confirm$1(receiver, message) {
      var t1 = receiver.confirm(message);
      t1.toString;
      return t1;
    },
    $isWindow: 1,
    $isWindowBase: 1
  };
  A.WorkerGlobalScope.prototype = {$isWorkerGlobalScope: 1};
  A._Attr.prototype = {$is_Attr: 1};
  A._CssRuleList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.CssRule._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._DomRect.prototype = {
    toString$0(receiver) {
      var t2, t3, t4,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      t3 = receiver.width;
      t3.toString;
      t4 = receiver.height;
      t4.toString;
      return "Rectangle (" + A.S(t1) + ", " + A.S(t2) + ") " + A.S(t3) + " x " + A.S(t4);
    },
    $eq(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = receiver.width;
            t1.toString;
            t2 = J.getInterceptor$x(other);
            if (t1 === t2.get$width(other)) {
              t1 = receiver.height;
              t1.toString;
              t2 = t1 === t2.get$height(other);
              t1 = t2;
            } else
              t1 = false;
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode(receiver) {
      var t2, t3, t4,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      t3 = receiver.width;
      t3.toString;
      t4 = receiver.height;
      t4.toString;
      return A.Object_hash(t1, t2, t3, t4);
    },
    get$_height(receiver) {
      return receiver.height;
    },
    get$height(receiver) {
      var t1 = receiver.height;
      t1.toString;
      return t1;
    },
    get$_width(receiver) {
      return receiver.width;
    },
    get$width(receiver) {
      var t1 = receiver.width;
      t1.toString;
      return t1;
    }
  };
  A._GamepadList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      type$.nullable_Gamepad._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._NamedNodeMap.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._SpeechRecognitionResultList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.SpeechRecognitionResult._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._StyleSheetList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.StyleSheet._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._AttributeMap.prototype = {
    cast$2$0(_, $K, $V) {
      var t1 = type$.String;
      return A.Map_castFrom(this, t1, t1, $K, $V);
    },
    forEach$1(_, f) {
      var t1, t2, t3, _i, t4, value;
      type$.void_Function_String_String._as(f);
      for (t1 = this.get$keys(this), t2 = t1.length, t3 = this._element, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        t4 = A._asString(t1[_i]);
        value = t3.getAttribute(t4);
        f.call$2(t4, value == null ? A._asString(value) : value);
      }
    },
    get$keys(_) {
      var keys, len, t2, i, attr, t3,
        t1 = this._element.attributes;
      t1.toString;
      keys = A._setArrayType([], type$.JSArray_String);
      for (len = t1.length, t2 = type$._Attr, i = 0; i < len; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        attr = t2._as(t1[i]);
        if (attr.namespaceURI == null) {
          t3 = attr.name;
          t3.toString;
          B.JSArray_methods.add$1(keys, t3);
        }
      }
      return keys;
    },
    get$isEmpty(_) {
      return this.get$keys(this).length === 0;
    }
  };
  A._ElementAttributeMap.prototype = {
    containsKey$1(_, key) {
      var t1 = this._element.hasAttribute(key);
      t1.toString;
      return t1;
    },
    $index(_, key) {
      return this._element.getAttribute(A._asString(key));
    },
    $indexSet(_, key, value) {
      this._element.setAttribute(A._asString(key), A._asString(value));
    },
    get$length(_) {
      return this.get$keys(this).length;
    }
  };
  A.EventStreamProvider.prototype = {};
  A._EventStream0.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return A._EventStreamSubscription$(this._target, this._eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._EventStreamSubscription.prototype = {
    cancel$0(_) {
      var _this = this;
      if (_this._target == null)
        return $.$get$nullFuture();
      _this._unlisten$0();
      _this._target = null;
      _this.set$_onData(null);
      return $.$get$nullFuture();
    },
    onData$1(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._target == null)
        throw A.wrapException(A.StateError$("Subscription has been canceled."));
      _this._unlisten$0();
      t1 = A._wrapZone(new A._EventStreamSubscription_onData_closure0(handleData), type$.Event);
      _this.set$_onData(t1);
      _this._tryResume$0();
    },
    pause$0(_) {
      if (this._target == null)
        return;
      ++this._pauseCount;
      this._unlisten$0();
    },
    resume$0(_) {
      var _this = this;
      if (_this._target == null || _this._pauseCount <= 0)
        return;
      --_this._pauseCount;
      _this._tryResume$0();
    },
    _tryResume$0() {
      var t2, _this = this,
        t1 = _this._onData;
      if (t1 != null && _this._pauseCount <= 0) {
        t2 = _this._target;
        t2.toString;
        J.addEventListener$3$x(t2, _this._eventType, t1, false);
      }
    },
    _unlisten$0() {
      var t2,
        t1 = this._onData;
      if (t1 != null) {
        t2 = this._target;
        t2.toString;
        J._removeEventListener$3$x(t2, this._eventType, type$.nullable_dynamic_Function_Event._as(t1), false);
      }
    },
    set$_onData(_onData) {
      this._onData = type$.nullable_dynamic_Function_Event._as(_onData);
    },
    $isStreamSubscription: 1
  };
  A._EventStreamSubscription_closure.prototype = {
    call$1(e) {
      return this.onData.call$1(type$.Event._as(e));
    },
    $signature: 14
  };
  A._EventStreamSubscription_onData_closure0.prototype = {
    call$1(e) {
      return this.handleData.call$1(type$.Event._as(e));
    },
    $signature: 14
  };
  A._Html5NodeValidator.prototype = {
    _Html5NodeValidator$1$uriPolicy(uriPolicy) {
      var _i;
      if ($._Html5NodeValidator__attributeValidators.__js_helper$_length === 0) {
        for (_i = 0; _i < 262; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, B.List_uzK[_i], A.html0__Html5NodeValidator__standardAttributeValidator$closure());
        for (_i = 0; _i < 12; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, B.List_Jwp[_i], A.html0__Html5NodeValidator__uriAttributeValidator$closure());
      }
    },
    allowsElement$1(element) {
      return $.$get$_Html5NodeValidator__allowedElements().contains$1(0, A.Element__safeTagName(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      var validator = $._Html5NodeValidator__attributeValidators.$index(0, A.Element__safeTagName(element) + "::" + attributeName);
      if (validator == null)
        validator = $._Html5NodeValidator__attributeValidators.$index(0, "*::" + attributeName);
      if (validator == null)
        return false;
      return A._asBool(validator.call$4(element, attributeName, value, this));
    },
    $isNodeValidator: 1
  };
  A.ImmutableListMixin.prototype = {
    get$iterator(receiver) {
      return new A.FixedSizeListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1(receiver, compare) {
      A.instanceType(receiver)._eval$1("int(ImmutableListMixin.E,ImmutableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort immutable List."));
    }
  };
  A.NodeValidatorBuilder.prototype = {
    allowsElement$1(element) {
      return B.JSArray_methods.any$1(this._validators, new A.NodeValidatorBuilder_allowsElement_closure(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      return B.JSArray_methods.any$1(this._validators, new A.NodeValidatorBuilder_allowsAttribute_closure(element, attributeName, value));
    },
    $isNodeValidator: 1
  };
  A.NodeValidatorBuilder_allowsElement_closure.prototype = {
    call$1(v) {
      return type$.NodeValidator._as(v).allowsElement$1(this.element);
    },
    $signature: 29
  };
  A.NodeValidatorBuilder_allowsAttribute_closure.prototype = {
    call$1(v) {
      return type$.NodeValidator._as(v).allowsAttribute$3(this.element, this.attributeName, this.value);
    },
    $signature: 29
  };
  A._SimpleNodeValidator.prototype = {
    _SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(uriPolicy, allowedAttributes, allowedElements, allowedUriAttributes) {
      var legalAttributes, extraUriAttributes, t1;
      this.allowedElements.addAll$1(0, allowedElements);
      legalAttributes = allowedAttributes.where$1(0, new A._SimpleNodeValidator_closure());
      extraUriAttributes = allowedAttributes.where$1(0, new A._SimpleNodeValidator_closure0());
      this.allowedAttributes.addAll$1(0, legalAttributes);
      t1 = this.allowedUriAttributes;
      t1.addAll$1(0, B.List_empty0);
      t1.addAll$1(0, extraUriAttributes);
    },
    allowsElement$1(element) {
      return this.allowedElements.contains$1(0, A.Element__safeTagName(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      var t3, _this = this,
        tagName = A.Element__safeTagName(element),
        t1 = _this.allowedUriAttributes,
        t2 = tagName + "::" + attributeName;
      if (t1.contains$1(0, t2))
        return _this.uriPolicy.allowsUri$1(value);
      else {
        t3 = "*::" + attributeName;
        if (t1.contains$1(0, t3))
          return _this.uriPolicy.allowsUri$1(value);
        else {
          t1 = _this.allowedAttributes;
          if (t1.contains$1(0, t2))
            return true;
          else if (t1.contains$1(0, t3))
            return true;
          else if (t1.contains$1(0, tagName + "::*"))
            return true;
          else if (t1.contains$1(0, "*::*"))
            return true;
        }
      }
      return false;
    },
    $isNodeValidator: 1
  };
  A._SimpleNodeValidator_closure.prototype = {
    call$1(x) {
      return !B.JSArray_methods.contains$1(B.List_Jwp, A._asString(x));
    },
    $signature: 30
  };
  A._SimpleNodeValidator_closure0.prototype = {
    call$1(x) {
      return B.JSArray_methods.contains$1(B.List_Jwp, A._asString(x));
    },
    $signature: 30
  };
  A._TemplatingNodeValidator.prototype = {
    allowsAttribute$3(element, attributeName, value) {
      if (this.super$_SimpleNodeValidator$allowsAttribute(element, attributeName, value))
        return true;
      if (attributeName === "template" && value === "")
        return true;
      if (element.getAttribute("template") === "")
        return this._templateAttrs.contains$1(0, attributeName);
      return false;
    }
  };
  A._TemplatingNodeValidator_closure.prototype = {
    call$1(attr) {
      return "TEMPLATE::" + A._asString(attr);
    },
    $signature: 25
  };
  A._SvgNodeValidator.prototype = {
    allowsElement$1(element) {
      var t1;
      if (type$.ScriptElement._is(element))
        return false;
      t1 = type$.SvgElement._is(element);
      if (t1 && A.Element__safeTagName(element) === "foreignObject")
        return false;
      if (t1)
        return true;
      return false;
    },
    allowsAttribute$3(element, attributeName, value) {
      if (attributeName === "is" || B.JSString_methods.startsWith$1(attributeName, "on"))
        return false;
      return this.allowsElement$1(element);
    },
    $isNodeValidator: 1
  };
  A.FixedSizeListIterator.prototype = {
    moveNext$0() {
      var _this = this,
        nextPosition = _this._position + 1,
        t1 = _this._length;
      if (nextPosition < t1) {
        _this.set$_current(J.$index$asx(_this._array, nextPosition));
        _this._position = nextPosition;
        return true;
      }
      _this.set$_current(null);
      _this._position = t1;
      return false;
    },
    get$current(_) {
      var t1 = this._current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    set$_current(_current) {
      this._current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._DOMWindowCrossFrame.prototype = {$isJSObject: 1, $isJavaScriptObject: 1, $isEventTarget: 1, $isWindowBase: 1};
  A._SameOriginUriPolicy.prototype = {$isUriPolicy: 1};
  A._ValidatingTreeSanitizer.prototype = {
    sanitizeTree$1(node) {
      var previousTreeModifications,
        walk = new A._ValidatingTreeSanitizer_sanitizeTree_walk(this);
      do {
        previousTreeModifications = this.numTreeModifications;
        walk.call$2(node, null);
      } while (previousTreeModifications !== this.numTreeModifications);
    },
    _removeNode$2(node, $parent) {
      ++this.numTreeModifications;
      if ($parent == null || $parent !== node.parentNode)
        J.remove$0$x(node);
      else
        $parent.removeChild(node).toString;
    },
    _sanitizeUntrustedElement$2(element, $parent) {
      var corruptedTest1, elementText, elementTagName, t1, corrupted0, exception, t2,
        corrupted = true,
        attrs = null, isAttr = null;
      try {
        attrs = J.get$attributes$x(element);
        isAttr = attrs._element.getAttribute("is");
        type$.Element._as(element);
        t1 = function(element) {
          if (!(element.attributes instanceof NamedNodeMap))
            return true;
          if (element.id == "lastChild" || element.name == "lastChild" || element.id == "previousSibling" || element.name == "previousSibling" || element.id == "children" || element.name == "children")
            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 == "previousSibling" || child.name == "previousSibling" || child.id == "children" || child.name == "children")
              return true;
          }
          return false;
        }(element);
        t1.toString;
        corruptedTest1 = t1;
        if (A.boolConversionCheck(corruptedTest1))
          corrupted0 = true;
        else {
          t1 = !(element.attributes instanceof NamedNodeMap);
          t1.toString;
          corrupted0 = t1;
        }
        corrupted = corrupted0;
      } catch (exception) {
      }
      elementText = "element unprintable";
      try {
        elementText = J.toString$0$(element);
      } catch (exception) {
      }
      try {
        type$.Element._as(element);
        elementTagName = A.Element__safeTagName(element);
        this._sanitizeElement$7(element, $parent, corrupted, elementText, elementTagName, type$.Map_dynamic_dynamic._as(attrs), A._asStringQ(isAttr));
      } catch (exception) {
        if (A.unwrapException(exception) instanceof A.ArgumentError)
          throw exception;
        else {
          this._removeNode$2(element, $parent);
          window.toString;
          t1 = A.S(elementText);
          t2 = typeof console != "undefined";
          t2.toString;
          if (t2)
            window.console.warn("Removing corrupted element " + t1);
        }
      }
    },
    _sanitizeElement$7(element, $parent, corrupted, text, tag, attrs, isAttr) {
      var t1, t2, keys, i, $name, t3, t4, _this = this;
      if (corrupted) {
        _this._removeNode$2(element, $parent);
        window.toString;
        t1 = typeof console != "undefined";
        t1.toString;
        if (t1)
          window.console.warn("Removing element due to corrupted attributes on <" + text + ">");
        return;
      }
      if (!_this.validator.allowsElement$1(element)) {
        _this._removeNode$2(element, $parent);
        window.toString;
        t1 = A.S($parent);
        t2 = typeof console != "undefined";
        t2.toString;
        if (t2)
          window.console.warn("Removing disallowed element <" + tag + "> from " + t1);
        return;
      }
      if (isAttr != null)
        if (!_this.validator.allowsAttribute$3(element, "is", isAttr)) {
          _this._removeNode$2(element, $parent);
          window.toString;
          t1 = typeof console != "undefined";
          t1.toString;
          if (t1)
            window.console.warn("Removing disallowed type extension <" + tag + ' is="' + isAttr + '">');
          return;
        }
      t1 = attrs.get$keys(attrs);
      keys = A._setArrayType(t1.slice(0), A._arrayInstanceType(t1));
      for (i = attrs.get$keys(attrs).length - 1, t1 = attrs._element, t2 = "Removing disallowed attribute <" + tag + " "; i >= 0; --i) {
        if (!(i < keys.length))
          return A.ioore(keys, i);
        $name = keys[i];
        t3 = _this.validator;
        t4 = J.toLowerCase$0$s($name);
        A._asString($name);
        if (!t3.allowsAttribute$3(element, t4, A._asString(t1.getAttribute($name)))) {
          window.toString;
          t3 = t1.getAttribute($name);
          t4 = typeof console != "undefined";
          t4.toString;
          if (t4)
            window.console.warn(t2 + $name + '="' + A.S(t3) + '">');
          t1.removeAttribute($name);
        }
      }
      if (type$.TemplateElement._is(element)) {
        t1 = element.content;
        t1.toString;
        _this.sanitizeTree$1(t1);
      }
    },
    sanitizeNode$2(node, $parent) {
      var t1 = node.nodeType;
      t1.toString;
      switch (t1) {
        case 1:
          this._sanitizeUntrustedElement$2(node, $parent);
          break;
        case 8:
        case 11:
        case 3:
        case 4:
          break;
        default:
          this._removeNode$2(node, $parent);
      }
    },
    $isNodeTreeSanitizer: 1
  };
  A._ValidatingTreeSanitizer_sanitizeTree_walk.prototype = {
    call$2(node, $parent) {
      var child, nextChild, t2, t3, t4, exception,
        t1 = this.$this;
      t1.sanitizeNode$2(node, $parent);
      child = node.lastChild;
      for (t2 = type$.Node; child != null;) {
        nextChild = null;
        try {
          nextChild = child.previousSibling;
          if (nextChild != null) {
            t3 = nextChild.nextSibling;
            t4 = child;
            t4 = t3 == null ? t4 != null : t3 !== t4;
            t3 = t4;
          } else
            t3 = false;
          if (t3) {
            t3 = A.StateError$("Corrupt HTML");
            throw A.wrapException(t3);
          }
        } catch (exception) {
          t3 = t2._as(child);
          ++t1.numTreeModifications;
          t4 = t3.parentNode;
          if (node !== t4) {
            if (t4 != null)
              t4.removeChild(t3).toString;
          } else
            node.removeChild(t3).toString;
          child = null;
          nextChild = node.lastChild;
        }
        if (child != null)
          this.call$2(child, node);
        child = nextChild;
      }
    },
    $signature: 37
  };
  A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase.prototype = {};
  A._DomRectList_JavaScriptObject_ListMixin.prototype = {};
  A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._DomStringList_JavaScriptObject_ListMixin.prototype = {};
  A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._FileList_JavaScriptObject_ListMixin.prototype = {};
  A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._HtmlCollection_JavaScriptObject_ListMixin.prototype = {};
  A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._MidiInputMap_JavaScriptObject_MapMixin.prototype = {};
  A._MidiOutputMap_JavaScriptObject_MapMixin.prototype = {};
  A._MimeTypeArray_JavaScriptObject_ListMixin.prototype = {};
  A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._NodeList_JavaScriptObject_ListMixin.prototype = {};
  A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._PluginArray_JavaScriptObject_ListMixin.prototype = {};
  A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._RtcStatsReport_JavaScriptObject_MapMixin.prototype = {};
  A._SourceBufferList_EventTarget_ListMixin.prototype = {};
  A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  A._SpeechGrammarList_JavaScriptObject_ListMixin.prototype = {};
  A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._Storage_JavaScriptObject_MapMixin.prototype = {};
  A._TextTrackCueList_JavaScriptObject_ListMixin.prototype = {};
  A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._TextTrackList_EventTarget_ListMixin.prototype = {};
  A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  A._TouchList_JavaScriptObject_ListMixin.prototype = {};
  A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__CssRuleList_JavaScriptObject_ListMixin.prototype = {};
  A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__GamepadList_JavaScriptObject_ListMixin.prototype = {};
  A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__NamedNodeMap_JavaScriptObject_ListMixin.prototype = {};
  A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin.prototype = {};
  A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__StyleSheetList_JavaScriptObject_ListMixin.prototype = {};
  A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._StructuredClone.prototype = {
    findSlot$1(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      B.JSArray_methods.add$1(t1, value);
      B.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1(e) {
      var slot, t2, copy, t3, _this = this, t1 = {};
      if (e == null)
        return e;
      if (A._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      if (e instanceof A.DateTime)
        return new Date(e._value);
      if (e instanceof A.JSSyntaxRegExp)
        throw A.wrapException(A.UnimplementedError$("structured clone of RegExp"));
      if (type$.File._is(e))
        return e;
      if (type$.Blob._is(e))
        return e;
      if (type$.FileList._is(e))
        return e;
      if (type$.ImageData._is(e))
        return e;
      if (type$.NativeByteBuffer._is(e) || type$.NativeTypedData._is(e) || type$.MessagePort._is(e) || type$.SharedArrayBuffer._is(e))
        return e;
      if (type$.Map_dynamic_dynamic._is(e)) {
        slot = _this.findSlot$1(e);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t1.copy = t2[slot];
        if (copy != null)
          return copy;
        copy = {};
        t1.copy = copy;
        B.JSArray_methods.$indexSet(t2, slot, copy);
        J.forEach$1$x(e, new A._StructuredClone_walk_closure(t1, _this));
        return t1.copy;
      }
      if (type$.List_dynamic._is(e)) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        return _this.copyList$2(e, slot);
      }
      if (type$.JSObject._is(e)) {
        slot = _this.findSlot$1(e);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t1.copy = t2[slot];
        if (copy != null)
          return copy;
        t3 = {};
        t3.toString;
        t1.copy = t3;
        B.JSArray_methods.$indexSet(t2, slot, t3);
        _this.forEachObjectKey$2(e, new A._StructuredClone_walk_closure0(t1, _this));
        return t1.copy;
      }
      throw A.wrapException(A.UnimplementedError$("structured clone of other type"));
    },
    copyList$2(e, slot) {
      var i,
        t1 = J.getInterceptor$asx(e),
        $length = t1.get$length(e),
        t2 = new Array($length);
      t2.toString;
      B.JSArray_methods.$indexSet(this.copies, slot, t2);
      for (i = 0; i < $length; ++i)
        B.JSArray_methods.$indexSet(t2, i, this.walk$1(t1.$index(e, i)));
      return t2;
    }
  };
  A._StructuredClone_walk_closure.prototype = {
    call$2(key, value) {
      this._box_0.copy[key] = this.$this.walk$1(value);
    },
    $signature: 13
  };
  A._StructuredClone_walk_closure0.prototype = {
    call$2(key, value) {
      this._box_0.copy[key] = this.$this.walk$1(value);
    },
    $signature: 38
  };
  A._AcceptStructuredClone.prototype = {
    findSlot$1(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      B.JSArray_methods.add$1(t1, value);
      B.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1(e) {
      var t1, slot, copy, t2, map, t3, $length, t4, i, _this = this;
      if (e == null)
        return e;
      if (A._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      t1 = e instanceof Date;
      t1.toString;
      if (t1) {
        t1 = e.getTime();
        t1.toString;
        return A.DateTime$fromMillisecondsSinceEpoch(t1, true);
      }
      t1 = e instanceof RegExp;
      t1.toString;
      if (t1)
        throw A.wrapException(A.UnimplementedError$("structured clone of RegExp"));
      t1 = typeof Promise != "undefined" && e instanceof Promise;
      t1.toString;
      if (t1)
        return A.promiseToFuture(e, type$.dynamic);
      if (A.isJavaScriptSimpleObject(e)) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = type$.dynamic;
        map = A.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        B.JSArray_methods.$indexSet(t1, slot, map);
        _this.forEachJsField$2(e, new A._AcceptStructuredClone_walk_closure(_this, map));
        return map;
      }
      t1 = e instanceof Array;
      t1.toString;
      if (t1) {
        t1 = e;
        t1.toString;
        slot = _this.findSlot$1(t1);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t2[slot];
        if (copy != null)
          return copy;
        t3 = J.getInterceptor$asx(t1);
        $length = t3.get$length(t1);
        if (_this.mustCopy) {
          t4 = new Array($length);
          t4.toString;
          copy = t4;
        } else
          copy = t1;
        B.JSArray_methods.$indexSet(t2, slot, copy);
        for (t2 = J.getInterceptor$ax(copy), i = 0; i < $length; ++i)
          t2.$indexSet(copy, i, _this.walk$1(t3.$index(t1, i)));
        return copy;
      }
      return e;
    },
    convertNativeToDart_AcceptStructuredClone$2$mustCopy(object, mustCopy) {
      this.mustCopy = true;
      return this.walk$1(object);
    }
  };
  A._AcceptStructuredClone_walk_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.walk$1(value);
      this.map.$indexSet(0, key, t1);
      return t1;
    },
    $signature: 39
  };
  A._StructuredCloneDart2Js.prototype = {
    forEachObjectKey$2(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  A._AcceptStructuredCloneDart2Js.prototype = {
    forEachJsField$2(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  A.KeyRange.prototype = {$isKeyRange: 1};
  A.JsObject__convertDataTree__convert.prototype = {
    call$1(o) {
      var convertedMap, t2, key, convertedList,
        t1 = this._convertedObjects;
      if (t1.containsKey$1(0, o))
        return t1.$index(0, o);
      if (type$.Map_dynamic_dynamic._is(o)) {
        convertedMap = {};
        t1.$indexSet(0, o, convertedMap);
        for (t1 = J.getInterceptor$x(o), t2 = J.get$iterator$ax(t1.get$keys(o)); t2.moveNext$0();) {
          key = t2.get$current(t2);
          convertedMap[key] = this.call$1(t1.$index(o, key));
        }
        return convertedMap;
      } else if (type$.Iterable_dynamic._is(o)) {
        convertedList = [];
        t1.$indexSet(0, o, convertedList);
        B.JSArray_methods.addAll$1(convertedList, J.map$1$1$ax(o, this, type$.dynamic));
        return convertedList;
      } else
        return A._convertToJS(o);
    },
    $signature: 40
  };
  A._convertToJS_closure.prototype = {
    call$1(o) {
      var jsFunction;
      type$.Function._as(o);
      jsFunction = function(_call, f, captureThis) {
        return function() {
          return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
        };
      }(A._callDartFunction, o, false);
      A._defineProperty(jsFunction, $.$get$DART_CLOSURE_PROPERTY_NAME(), o);
      return jsFunction;
    },
    $signature: 1
  };
  A._convertToJS_closure0.prototype = {
    call$1(o) {
      return new this.ctor(o);
    },
    $signature: 1
  };
  A._wrapToDart_closure.prototype = {
    call$1(o) {
      return new A.JsFunction(o == null ? type$.Object._as(o) : o);
    },
    $signature: 41
  };
  A._wrapToDart_closure0.prototype = {
    call$1(o) {
      var t1 = o == null ? type$.Object._as(o) : o;
      return new A.JsArray(t1, type$.JsArray_dynamic);
    },
    $signature: 42
  };
  A._wrapToDart_closure1.prototype = {
    call$1(o) {
      return new A.JsObject(o == null ? type$.Object._as(o) : o);
    },
    $signature: 43
  };
  A.JsObject.prototype = {
    $index(_, property) {
      if (typeof property != "string" && typeof property != "number")
        throw A.wrapException(A.ArgumentError$("property is not a String or num", null));
      return A._convertToDart(this._jsObject[property]);
    },
    $indexSet(_, property, value) {
      if (typeof property != "string" && typeof property != "number")
        throw A.wrapException(A.ArgumentError$("property is not a String or num", null));
      this._jsObject[property] = A._convertToJS(value);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.JsObject && this._jsObject === other._jsObject;
    },
    toString$0(_) {
      var t1, exception;
      try {
        t1 = String(this._jsObject);
        return t1;
      } catch (exception) {
        t1 = this.super$Object$toString(0);
        return t1;
      }
    },
    callMethod$2(method, args) {
      var t2,
        t1 = this._jsObject;
      if (args == null)
        t2 = null;
      else {
        t2 = A._arrayInstanceType(args);
        t2 = A.List_List$from(new A.MappedListIterable(args, t2._eval$1("@(1)")._as(A.js___convertToJS$closure()), t2._eval$1("MappedListIterable<1,@>")), true, type$.dynamic);
      }
      return A._convertToDart(t1[method].apply(t1, t2));
    },
    callMethod$1(method) {
      return this.callMethod$2(method, null);
    },
    get$hashCode(_) {
      return 0;
    }
  };
  A.JsFunction.prototype = {};
  A.JsArray.prototype = {
    _checkIndex$1(index) {
      var _this = this,
        t1 = index < 0 || index >= _this.get$length(_this);
      if (t1)
        throw A.wrapException(A.RangeError$range(index, 0, _this.get$length(_this), null, null));
    },
    $index(_, index) {
      if (A._isInt(index))
        this._checkIndex$1(index);
      return this.$ti._precomputed1._as(this.super$JsObject$$index(0, index));
    },
    $indexSet(_, index, value) {
      this._checkIndex$1(index);
      this.super$_JsArray_JsObject_ListMixin$$indexSet(0, index, value);
    },
    get$length(_) {
      var len = this._jsObject.length;
      if (typeof len === "number" && len >>> 0 === len)
        return len;
      throw A.wrapException(A.StateError$("Bad JsArray length"));
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      this.callMethod$2("sort", compare == null ? [] : [compare]);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._JsArray_JsObject_ListMixin.prototype = {
    $indexSet(_, property, value) {
      return this.super$JsObject$$indexSet(0, property, value);
    }
  };
  A.jsify__convert.prototype = {
    call$1(o) {
      var t1, convertedMap, t2, key, convertedList;
      if (A._noJsifyRequired(o))
        return o;
      t1 = this._convertedObjects;
      if (t1.containsKey$1(0, o))
        return t1.$index(0, o);
      if (type$.Map_of_nullable_Object_and_nullable_Object._is(o)) {
        convertedMap = {};
        t1.$indexSet(0, o, convertedMap);
        for (t1 = J.getInterceptor$x(o), t2 = J.get$iterator$ax(t1.get$keys(o)); t2.moveNext$0();) {
          key = t2.get$current(t2);
          convertedMap[key] = this.call$1(t1.$index(o, key));
        }
        return convertedMap;
      } else if (type$.Iterable_nullable_Object._is(o)) {
        convertedList = [];
        t1.$indexSet(0, o, convertedList);
        B.JSArray_methods.addAll$1(convertedList, J.map$1$1$ax(o, this, type$.dynamic));
        return convertedList;
      } else
        return o;
    },
    $signature: 9
  };
  A.promiseToFuture_closure.prototype = {
    call$1(r) {
      return this.completer.complete$1(0, this.T._eval$1("0/?")._as(r));
    },
    $signature: 7
  };
  A.promiseToFuture_closure0.prototype = {
    call$1(e) {
      if (e == null)
        return this.completer.completeError$1(new A.NullRejectionException(e === undefined));
      return this.completer.completeError$1(e);
    },
    $signature: 7
  };
  A.dartify_convert.prototype = {
    call$1(o) {
      var t1, proto, t2, dartObject, originalKeys, dartKeys, i, jsKey, dartKey, l, $length;
      if (A._noDartifyRequired(o))
        return o;
      t1 = this._convertedObjects;
      o.toString;
      if (t1.containsKey$1(0, o))
        return t1.$index(0, o);
      if (o instanceof Date)
        return A.DateTime$fromMillisecondsSinceEpoch(o.getTime(), true);
      if (o instanceof RegExp)
        throw A.wrapException(A.ArgumentError$("structured clone of RegExp", null));
      if (typeof Promise != "undefined" && o instanceof Promise)
        return A.promiseToFuture(o, type$.nullable_Object);
      proto = Object.getPrototypeOf(o);
      if (proto === Object.prototype || proto === null) {
        t2 = type$.nullable_Object;
        dartObject = A.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        t1.$indexSet(0, o, dartObject);
        originalKeys = Object.keys(o);
        dartKeys = [];
        for (t1 = J.getInterceptor$ax(originalKeys), t2 = t1.get$iterator(originalKeys); t2.moveNext$0();)
          dartKeys.push(A.dartify(t2.get$current(t2)));
        for (i = 0; i < t1.get$length(originalKeys); ++i) {
          jsKey = t1.$index(originalKeys, i);
          if (!(i < dartKeys.length))
            return A.ioore(dartKeys, i);
          dartKey = dartKeys[i];
          if (jsKey != null)
            dartObject.$indexSet(0, dartKey, this.call$1(o[jsKey]));
        }
        return dartObject;
      }
      if (o instanceof Array) {
        l = o;
        dartObject = [];
        t1.$indexSet(0, o, dartObject);
        $length = A._asInt(o.length);
        for (t1 = J.getInterceptor$asx(l), i = 0; i < $length; ++i)
          dartObject.push(this.call$1(t1.$index(l, i)));
        return dartObject;
      }
      return o;
    },
    $signature: 9
  };
  A.NullRejectionException.prototype = {
    toString$0(_) {
      return "Promise was rejected with a value of `" + (this.isUndefined ? "undefined" : "null") + "`.";
    }
  };
  A._JSRandom.prototype = {
    nextInt$1(max) {
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      return Math.random() * max >>> 0;
    }
  };
  A._Random.prototype = {
    _Random$1(seed) {
      var low, high, tmplow, low0, t1, t2, t3, _this = this, _4294967296 = 4294967296,
        empty_seed = seed < 0 ? -1 : 0;
      do {
        low = seed >>> 0;
        seed = B.JSInt_methods._tdivFast$1(seed - low, _4294967296);
        high = seed >>> 0;
        seed = B.JSInt_methods._tdivFast$1(seed - high, _4294967296);
        tmplow = (~low >>> 0) + (low << 21 >>> 0);
        low0 = tmplow >>> 0;
        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + B.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296) >>> 0;
        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 24) >>> 0) * 265 + B.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 14) >>> 0) * 21 + B.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
        high = (high ^ high >>> 28) >>> 0;
        tmplow = (low << 31 >>> 0) + low;
        low0 = tmplow >>> 0;
        t1 = B.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296);
        tmplow = _this._lo * 1037;
        t2 = _this._lo = tmplow >>> 0;
        t3 = _this._hi * 1037 + B.JSInt_methods._tdivFast$1(tmplow - t2, _4294967296) >>> 0;
        _this._hi = t3;
        t2 = (t2 ^ low0) >>> 0;
        _this._lo = t2;
        t1 = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 >>> 0) >>> 0;
        _this._hi = t1;
      } while (seed !== empty_seed);
      if (t1 === 0 && t2 === 0)
        _this._lo = 23063;
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
    },
    _nextState$0() {
      var _this = this,
        t1 = _this._lo,
        tmpHi = 4294901760 * t1,
        tmpHiLo = tmpHi >>> 0,
        tmpLo = 55905 * t1,
        tmpLoLo = tmpLo >>> 0,
        newLo = tmpLoLo + tmpHiLo + _this._hi;
      t1 = newLo >>> 0;
      _this._lo = t1;
      _this._hi = B.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) >>> 0;
    },
    nextInt$1(max) {
      var t1, rnd32, result, _this = this;
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      t1 = max - 1;
      if ((max & t1) >>> 0 === 0) {
        _this._nextState$0();
        return (_this._lo & t1) >>> 0;
      }
      do {
        _this._nextState$0();
        rnd32 = _this._lo;
        result = rnd32 % max;
      } while (rnd32 - result + max >= 4294967296);
      return result;
    }
  };
  A.Length.prototype = {$isLength: 1};
  A.LengthList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Length._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.Number.prototype = {$isNumber: 1};
  A.NumberList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Number._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.PointList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.ScriptElement0.prototype = {$isScriptElement0: 1};
  A.StringList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      A._asString(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SvgElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, svg, treeSanitizer, validator) {
      var t2, fragment, root,
        t1 = A._setArrayType([], type$.JSArray_NodeValidator);
      B.JSArray_methods.add$1(t1, A._Html5NodeValidator$(null));
      B.JSArray_methods.add$1(t1, A._TemplatingNodeValidator$());
      B.JSArray_methods.add$1(t1, new A._SvgNodeValidator());
      treeSanitizer = new A._ValidatingTreeSanitizer(new A.NodeValidatorBuilder(t1));
      t1 = document;
      t2 = t1.body;
      t2.toString;
      fragment = B.BodyElement_methods.createFragment$2$treeSanitizer(t2, '<svg version="1.1">' + svg + "</svg>", treeSanitizer);
      t1 = t1.createDocumentFragment();
      t1.toString;
      t2 = new A._ChildNodeListLazy(fragment);
      root = t2.get$single(t2);
      for (; t2 = root.firstChild, t2 != null;)
        t1.appendChild(t2).toString;
      return t1;
    },
    $isSvgElement: 1
  };
  A.Transform.prototype = {$isTransform: 1};
  A.TransformList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Transform._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._LengthList_JavaScriptObject_ListMixin.prototype = {};
  A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._NumberList_JavaScriptObject_ListMixin.prototype = {};
  A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._StringList_JavaScriptObject_ListMixin.prototype = {};
  A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._TransformList_JavaScriptObject_ListMixin.prototype = {};
  A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.AudioBuffer.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.AudioParamMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.AudioParamMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.AudioParamMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 5
  };
  A.AudioTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.BaseAudioContext.prototype = {};
  A.OfflineAudioContext.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A._AudioParamMap_JavaScriptObject_MapMixin.prototype = {};
  A.AsyncMemoizer.prototype = {};
  A.DelegatingStreamSink.prototype = {
    add$1(_, data) {
      this._sink.add$1(0, A._instanceType(this)._eval$1("DelegatingStreamSink.T")._as(data));
    },
    $isStreamSink: 1
  };
  A.ErrorResult.prototype = {
    complete$1(_, completer) {
      completer.completeError$2(this.error, this.stackTrace);
    },
    get$hashCode(_) {
      return (J.get$hashCode$(this.error) ^ A.Primitives_objectHashCode(this.stackTrace) ^ 492929599) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.ErrorResult && J.$eq$(this.error, other.error) && this.stackTrace === other.stackTrace;
    },
    $isResult: 1
  };
  A.ValueResult.prototype = {
    complete$1(_, completer) {
      this.$ti._eval$1("Completer<1>")._as(completer).complete$1(0, this.value);
    },
    get$hashCode(_) {
      return (J.get$hashCode$(this.value) ^ 842997089) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.ValueResult && J.$eq$(this.value, other.value);
    },
    $isResult: 1
  };
  A.StreamQueue.prototype = {
    get$hasNext() {
      var t1 = new A._Future($.Zone__current, type$._Future_bool);
      this._addRequest$1(new A._HasNextRequest(new A._AsyncCompleter(t1, type$._AsyncCompleter_bool), this.$ti._eval$1("_HasNextRequest<1>")));
      return t1;
    },
    _updateRequests$0() {
      var t1, t2, t3, t4, t5, _this = this;
      for (t1 = _this._requestQueue, t2 = _this._eventQueue, t3 = t1.$ti._precomputed1; !t1.get$isEmpty(t1);) {
        t4 = t1._head;
        if (t4 === t1._tail)
          A.throwExpression(A.IterableElementError_noElement());
        t5 = t1._table;
        if (!(t4 < t5.length))
          return A.ioore(t5, t4);
        t4 = t5[t4];
        if (t4 == null)
          t4 = t3._as(t4);
        if (J.update$2$z(t4, t2, _this._isDone))
          t1.removeFirst$0();
        else
          return;
      }
      if (!_this._isDone)
        _this._stream_queue$_subscription.pause$0(0);
    },
    _ensureListening$0() {
      var t1, _this = this;
      if (_this._isDone)
        return;
      t1 = _this._stream_queue$_subscription;
      if (t1 == null)
        _this.set$_stream_queue$_subscription(_this._stream_queue$_source.listen$3$onDone$onError(new A.StreamQueue__ensureListening_closure(_this), new A.StreamQueue__ensureListening_closure0(_this), new A.StreamQueue__ensureListening_closure1(_this)));
      else
        t1.resume$0(0);
    },
    _addResult$1(result) {
      var t1, _this = this;
      _this.$ti._eval$1("Result<1>")._as(result);
      ++_this._eventsReceived;
      t1 = _this._eventQueue;
      t1._queue_list$_add$1(0, t1.$ti._eval$1("QueueList.E")._as(result));
      _this._updateRequests$0();
    },
    _addRequest$1(request) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventRequest<1>")._as(request);
      t1 = _this._requestQueue;
      if (t1._head === t1._tail) {
        if (request.update$2(0, _this._eventQueue, _this._isDone))
          return;
        _this._ensureListening$0();
      }
      t1._collection$_add$1(0, t1.$ti._precomputed1._as(request));
    },
    set$_stream_queue$_subscription(_subscription) {
      this._stream_queue$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A.StreamQueue__ensureListening_closure.prototype = {
    call$1(data) {
      var t1 = this.$this,
        t2 = t1.$ti;
      t1._addResult$1(new A.ValueResult(t2._precomputed1._as(data), t2._eval$1("ValueResult<1>")));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1)");
    }
  };
  A.StreamQueue__ensureListening_closure1.prototype = {
    call$2(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      this.$this._addResult$1(new A.ErrorResult(error, stackTrace));
    },
    $signature: 8
  };
  A.StreamQueue__ensureListening_closure0.prototype = {
    call$0() {
      var t1 = this.$this;
      t1.set$_stream_queue$_subscription(null);
      t1._isDone = true;
      t1._updateRequests$0();
    },
    $signature: 0
  };
  A._NextRequest.prototype = {
    update$2(_, events, isDone) {
      var t1, result;
      this.$ti._eval$1("QueueList<Result<1>>")._as(events);
      if (!events.get$isEmpty(events)) {
        t1 = events._queue_list$_head;
        if (t1 === events._queue_list$_tail)
          A.throwExpression(A.StateError$("No element"));
        result = J.$index$asx(events._queue_list$_table, t1);
        if (result == null)
          result = events.$ti._eval$1("QueueList.E")._as(result);
        J.$indexSet$ax(events._queue_list$_table, events._queue_list$_head, null);
        events._queue_list$_head = (events._queue_list$_head + 1 & J.get$length$asx(events._queue_list$_table) - 1) >>> 0;
        J.complete$1$z(result, this._stream_queue$_completer);
        return true;
      }
      if (isDone) {
        this._stream_queue$_completer.completeError$2(new A.StateError("No elements"), A.StackTrace_current());
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  A._HasNextRequest.prototype = {
    update$2(_, events, isDone) {
      this.$ti._eval$1("QueueList<Result<1>>")._as(events);
      if (!events.get$isEmpty(events)) {
        this._stream_queue$_completer.complete$1(0, true);
        return true;
      }
      if (isDone) {
        this._stream_queue$_completer.complete$1(0, false);
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  A.hashObjects_closure.prototype = {
    call$2(h, i) {
      return A._combine(A._asInt(h), J.get$hashCode$(i));
    },
    $signature: 45
  };
  A.BuiltList.prototype = {
    toBuilder$0() {
      return A.ListBuilder_ListBuilder(this, this.$ti._precomputed1);
    },
    get$hashCode(_) {
      var t1 = this._list$_hashCode;
      return t1 == null ? this._list$_hashCode = A.hashObjects(this._list) : t1;
    },
    $eq(_, other) {
      var t1, t2, i, t3, t4, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltList))
        return false;
      t1 = other._list;
      t2 = _this._list;
      if (t1.length !== t2.length)
        return false;
      if (other.get$hashCode(other) !== _this.get$hashCode(_this))
        return false;
      for (i = 0; t3 = t2.length, i !== t3; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t4 = t1[i];
        if (!(i < t3))
          return A.ioore(t2, i);
        if (!J.$eq$(t4, t2[i]))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this._list, "[", "]");
    },
    get$length(_) {
      return this._list.length;
    },
    get$iterator(_) {
      var t1 = this._list;
      return new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    map$1$1(_, f, $T) {
      var t1 = this._list,
        t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1(_, element) {
      return B.JSArray_methods.contains$1(this._list, element);
    },
    get$isEmpty(_) {
      return this._list.length === 0;
    },
    get$isNotEmpty(_) {
      return this._list.length !== 0;
    },
    skip$1(_, n) {
      var t1 = this._list;
      return A.SubListIterable$(t1, n, null, A._arrayInstanceType(t1)._precomputed1);
    },
    get$first(_) {
      return B.JSArray_methods.get$first(this._list);
    },
    elementAt$1(_, index) {
      var t1 = this._list;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $isIterable: 1
  };
  A._BuiltList.prototype = {
    _list$_maybeCheckForNull$0() {
      var t1, t2, _i;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._list, t2 = t1.length, _i = 0; _i < t2; ++_i)
        if (t1[_i] == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
    }
  };
  A.ListBuilder.prototype = {
    build$0() {
      var t1, t2, t3, _this = this;
      if (_this._listOwner == null) {
        t1 = _this.__ListBuilder__list_A;
        t1 === $ && A.throwLateFieldNI("_list");
        t2 = _this.$ti;
        t3 = t2._eval$1("_BuiltList<1>");
        t3 = t3._as(new A._BuiltList(t1, t3));
        _this.set$__ListBuilder__list_A(t2._eval$1("List<1>")._as(t1));
        _this.set$_listOwner(t3);
      }
      t1 = _this._listOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, iterable) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_BuiltList<1>"),
        t3 = t1._eval$1("List<1>");
      if (t2._is(iterable)) {
        t2._as(iterable);
        _this.set$__ListBuilder__list_A(t3._as(iterable._list));
        _this.set$_listOwner(iterable);
      } else {
        _this.set$__ListBuilder__list_A(t3._as(A.List_List$from(iterable, true, t1._precomputed1)));
        _this.set$_listOwner(null);
      }
    },
    get$length(_) {
      var t1 = this.__ListBuilder__list_A;
      t1 === $ && A.throwLateFieldNI("_list");
      return t1.length;
    },
    map$1(_, f) {
      var t2, t3, t4, t5, result, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      t2 = _this.__ListBuilder__list_A;
      t2 === $ && A.throwLateFieldNI("_list");
      t3 = t1._precomputed1;
      t4 = A._arrayInstanceType(t2);
      t5 = t4._eval$1("@<1>")._bind$1(t3)._eval$1("MappedListIterable<1,2>");
      result = A.List_List$of(new A.MappedListIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t5), true, t5._eval$1("ListIterable.E"));
      _this._list$_maybeCheckElements$1(result);
      _this.set$__ListBuilder__list_A(t1._eval$1("List<1>")._as(result));
      _this.set$_listOwner(null);
    },
    _list$_maybeCheckElements$1(elements) {
      var t2, _i,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = elements.length, t1 = t1._precomputed1, _i = 0; _i < t2; ++_i)
        if (t1._as(elements[_i]) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
    },
    set$__ListBuilder__list_A(__ListBuilder__list_A) {
      this.__ListBuilder__list_A = this.$ti._eval$1("List<1>")._as(__ListBuilder__list_A);
    },
    set$_listOwner(_listOwner) {
      this._listOwner = this.$ti._eval$1("_BuiltList<1>?")._as(_listOwner);
    }
  };
  A.BuiltListMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._list_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._list_multimap$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeyIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltListMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._list_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltListMultimap))
        return false;
      t1 = other._list_multimap$_map;
      t2 = _this._list_multimap$_map;
      if (t1.__js_helper$_length !== t2.__js_helper$_length)
        return false;
      if (other.get$hashCode(other) !== _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t4 = t3._map, t3 = A.LinkedHashMapKeyIterator$(t4, t4._modifications, t3.$ti._precomputed1), t4 = other._emptyList, t5 = _this._emptyList; t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._list_multimap$_map);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._list_multimap$_keys == null) {
        t1 = _this._list_multimap$_map;
        _this.set$_list_multimap$_keys(new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")));
      }
      t1 = _this._list_multimap$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      return this._list_multimap$_map.__js_helper$_length;
    },
    set$_list_multimap$_keys(_keys) {
      this._list_multimap$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltListMultimap_BuiltListMultimap_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltListMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._list_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltListMultimap.prototype = {
    _BuiltListMultimap$copy$2(keys, lookup, $K, $V) {
      var t1, t2, t3, key;
      for (t1 = J.get$iterator$ax(keys), t2 = this._list_multimap$_map, t3 = type$.Iterable_dynamic; t1.moveNext$0();) {
        key = t1.get$current(t1);
        if ($K._is(key))
          t2.$indexSet(0, key, A.BuiltList_BuiltList$from(t3._as(lookup.call$1(key)), $V));
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.ListMultimapBuilder.prototype = {
    build$0() {
      var t1, key, t2, t3, t4, t5, builtList, _this = this,
        _s9_ = "_builtMap";
      if (_this._list_multimap$_builtMapOwner == null) {
        t1 = _this.__ListMultimapBuilder__builderMap_A;
        t1 === $ && A.throwLateFieldNI("_builderMap");
        t1 = A.LinkedHashMapKeyIterator$(t1, t1._modifications, A._instanceType(t1)._precomputed1);
        for (; t1.moveNext$0();) {
          key = t1.__js_helper$_current;
          t2 = _this.__ListMultimapBuilder__builderMap_A.$index(0, key);
          if (t2._listOwner == null) {
            t3 = t2.__ListBuilder__list_A;
            t3 === $ && A.throwLateFieldNI("_list");
            t4 = A._instanceType(t2);
            t5 = t4._eval$1("_BuiltList<1>");
            t5 = t5._as(new A._BuiltList(t3, t5));
            t2.set$__ListBuilder__list_A(t4._eval$1("List<1>")._as(t3));
            t2.set$_listOwner(t5);
          }
          builtList = t2._listOwner;
          t2 = builtList._list.length;
          t3 = _this.__ListMultimapBuilder__builtMap_A;
          if (t2 === 0) {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.remove$1(0, key);
          } else {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.$indexSet(0, key, builtList);
          }
        }
        t1 = _this.__ListMultimapBuilder__builtMap_A;
        t1 === $ && A.throwLateFieldNI(_s9_);
        t2 = _this.$ti;
        t3 = t2._rest[1];
        _this.set$_list_multimap$_builtMapOwner(new A._BuiltListMultimap(t1, A.BuiltList_BuiltList$from(B.List_empty, t3), t2._eval$1("@<1>")._bind$1(t3)._eval$1("_BuiltListMultimap<1,2>")));
      }
      t1 = _this._list_multimap$_builtMapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, multimap) {
      this._list_multimap$_setWithCopyAndCheck$2(multimap.get$keys(multimap), new A.ListMultimapBuilder_replace_closure(multimap));
    },
    _list_multimap$_getValuesBuilder$1(key) {
      var t2, result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t2 = _this.__ListMultimapBuilder__builderMap_A;
      t2 === $ && A.throwLateFieldNI("_builderMap");
      result = t2.$index(0, key);
      if (result == null) {
        t2 = _this.__ListMultimapBuilder__builtMap_A;
        t2 === $ && A.throwLateFieldNI("_builtMap");
        builtValues = t2.$index(0, key);
        result = builtValues == null ? A.ListBuilder_ListBuilder(B.List_empty, t1._rest[1]) : A.ListBuilder_ListBuilder(builtValues, builtValues.$ti._precomputed1);
        _this.__ListMultimapBuilder__builderMap_A.$indexSet(0, key, result);
      }
      return result;
    },
    _list_multimap$_setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, t10, t11, _this = this, _null = null;
      _this.set$_list_multimap$_builtMapOwner(_null);
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltList<2>");
      t4 = t1._eval$1("Map<1,BuiltList<2>>");
      _this.set$__ListMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3)));
      _this.set$__ListMultimapBuilder__builderMap_A(t1._eval$1("Map<1,ListBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("ListBuilder<2>"))));
      for (t5 = J.get$iterator$ax(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current(t7);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._list_multimap$_builtMapOwner != null) {
                t8 = _this.__ListMultimapBuilder__builtMap_A;
                t8 === $ && A.throwLateFieldNI("_builtMap");
                _this.set$__ListMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$from(t8, t2, t3)));
                _this.set$_list_multimap$_builtMapOwner(_null);
              }
              _this._list_multimap$_checkKey$1(key);
              _this._list_multimap$_checkValue$1(value);
              t8 = _this._list_multimap$_getValuesBuilder$1(key);
              t9 = t8.$ti;
              t10 = t9._precomputed1;
              t10._as(value);
              if (!$.$get$isSoundMode() && !t10._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", _null));
              if (t8._listOwner != null) {
                t11 = t8.__ListBuilder__list_A;
                t11 === $ && A.throwLateFieldNI("_list");
                t8.set$__ListBuilder__list_A(t9._eval$1("List<1>")._as(A.List_List$from(t11, true, t10)));
                t8.set$_listOwner(_null);
              }
              t8 = t8.__ListBuilder__list_A;
              t8 === $ && A.throwLateFieldNI("_list");
              B.JSArray_methods.add$1(t8, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), _null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), _null));
      }
    },
    _list_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _list_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    },
    set$__ListMultimapBuilder__builtMap_A(__ListMultimapBuilder__builtMap_A) {
      this.__ListMultimapBuilder__builtMap_A = this.$ti._eval$1("Map<1,BuiltList<2>>")._as(__ListMultimapBuilder__builtMap_A);
    },
    set$_list_multimap$_builtMapOwner(_builtMapOwner) {
      this._list_multimap$_builtMapOwner = this.$ti._eval$1("_BuiltListMultimap<1,2>?")._as(_builtMapOwner);
    },
    set$__ListMultimapBuilder__builderMap_A(__ListMultimapBuilder__builderMap_A) {
      this.__ListMultimapBuilder__builderMap_A = this.$ti._eval$1("Map<1,ListBuilder<2>>")._as(__ListMultimapBuilder__builderMap_A);
    }
  };
  A.ListMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltMap.prototype = {
    toBuilder$0() {
      var t1 = this.$ti;
      t1._eval$1("_BuiltMap<1,2>")._as(this);
      return new A.MapBuilder(this._mapFactory, this._map$_map, this, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MapBuilder<1,2>"));
    },
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._map$_hashCode;
      if (t1 == null) {
        t1 = _this._map$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeyIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltMap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._map$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, key, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltMap))
        return false;
      t1 = other._map$_map;
      t2 = _this._map$_map;
      if (t1.__js_helper$_length !== t2.__js_helper$_length)
        return false;
      if (other.get$hashCode(other) !== _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t4 = t3._map, t3 = A.LinkedHashMapKeyIterator$(t4, t4._modifications, t3.$ti._precomputed1); t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        if (!J.$eq$(t1.$index(0, key), t2.$index(0, key)))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._map$_map);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._map$_keys == null) {
        t1 = _this._map$_map;
        _this.set$_map$_keys(new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")));
      }
      t1 = _this._map$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      return this._map$_map.__js_helper$_length;
    },
    map$1(_, f) {
      var t1 = type$.dynamic,
        t2 = this._map$_map;
      return new A._BuiltMap(null, t2.map$2$1(t2, this.$ti._eval$1("MapEntry<@,@>(1,2)")._as(f), t1, t1), type$._BuiltMap_dynamic_dynamic);
    },
    set$_map$_keys(_keys) {
      this._map$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltMap_BuiltMap_closure.prototype = {
    call$1(k) {
      return this.map.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltMap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._map$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltMap.prototype = {
    _BuiltMap$copyAndCheckTypes$2(keys, lookup, $K, $V) {
      var t1, t2, key, value;
      for (t1 = J.get$iterator$ax(keys), t2 = this._map$_map; t1.moveNext$0();) {
        key = t1.get$current(t1);
        if ($K._is(key)) {
          value = lookup.call$1(key);
          if ($V._is(value))
            t2.$indexSet(0, key, value);
          else
            throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value), null));
        } else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.MapBuilder.prototype = {
    build$0() {
      var t1, t2, _this = this;
      if (_this._mapOwner == null) {
        t1 = _this.__MapBuilder__map_A;
        t1 === $ && A.throwLateFieldNI("_map");
        t2 = _this.$ti;
        _this.set$_mapOwner(new A._BuiltMap(_this._mapFactory, t1, t2._eval$1("@<1>")._bind$1(t2._rest[1])._eval$1("_BuiltMap<1,2>")));
      }
      t1 = _this._mapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, map) {
      var _this = this,
        replacement = _this._createMap$0();
      map.forEach$1(0, new A.MapBuilder_replace_closure(_this, replacement));
      _this.$ti._eval$1("Map<1,2>")._as(replacement);
      _this.set$_mapOwner(null);
      _this.set$__MapBuilder__map_A(replacement);
    },
    $indexSet(_, key, value) {
      var t2, t3, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      _this._checkKey$1(key);
      _this._checkValue$1(value);
      if (_this._mapOwner != null) {
        t2 = _this._createMap$0();
        t3 = _this.__MapBuilder__map_A;
        t3 === $ && A.throwLateFieldNI("_map");
        t2.addAll$1(0, t3);
        _this.set$__MapBuilder__map_A(t1._eval$1("Map<1,2>")._as(t2));
        _this.set$_mapOwner(null);
      }
      t1 = _this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      t1.$indexSet(0, key, value);
    },
    get$length(_) {
      var t1 = this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      return t1.__js_helper$_length;
    },
    get$_safeMap() {
      var t1, t2, _this = this;
      if (_this._mapOwner != null) {
        t1 = _this._createMap$0();
        t2 = _this.__MapBuilder__map_A;
        t2 === $ && A.throwLateFieldNI("_map");
        t1.addAll$1(0, t2);
        _this.set$__MapBuilder__map_A(_this.$ti._eval$1("Map<1,2>")._as(t1));
        _this.set$_mapOwner(null);
      }
      t1 = _this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      return t1;
    },
    _createMap$0() {
      var t1 = this.$ti;
      return A.LinkedHashMap_LinkedHashMap$_empty(t1._precomputed1, t1._rest[1]);
    },
    _checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    },
    set$__MapBuilder__map_A(__MapBuilder__map_A) {
      this.__MapBuilder__map_A = this.$ti._eval$1("Map<1,2>")._as(__MapBuilder__map_A);
    },
    set$_mapOwner(_mapOwner) {
      this._mapOwner = this.$ti._eval$1("_BuiltMap<1,2>?")._as(_mapOwner);
    }
  };
  A.MapBuilder_replace_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      this.replacement.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    $signature: 13
  };
  A.BuiltSet.prototype = {
    get$hashCode(_) {
      var t2, t3, _this = this,
        t1 = _this._set$_hashCode;
      if (t1 == null) {
        t1 = _this._set$_set;
        t2 = A._instanceType(t1);
        t3 = t2._eval$1("EfficientLengthMappedIterable<1,int>");
        t3 = A.List_List$of(new A.EfficientLengthMappedIterable(t1, t2._eval$1("int(1)")._as(new A.BuiltSet_hashCode_closure(_this)), t3), false, t3._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t3);
        t3 = _this._set$_hashCode = A.hashObjects(t3);
        t1 = t3;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltSet))
        return false;
      t1 = _this._set$_set;
      if (other._set$_set._collection$_length !== t1._collection$_length)
        return false;
      if (other.get$hashCode(other) !== _this.get$hashCode(_this))
        return false;
      return t1.containsAll$1(other);
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this._set$_set, "{", "}");
    },
    get$length(_) {
      return this._set$_set._collection$_length;
    },
    get$iterator(_) {
      var t1 = this._set$_set;
      return A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1);
    },
    map$1$1(_, f, $T) {
      var t1 = this._set$_set,
        t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1(_, element) {
      return this._set$_set.contains$1(0, element);
    },
    get$isEmpty(_) {
      return this._set$_set._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._set$_set._collection$_length !== 0;
    },
    skip$1(_, n) {
      var t1 = this._set$_set;
      return A.SkipIterable_SkipIterable(t1, n, A._instanceType(t1)._precomputed1);
    },
    get$first(_) {
      var t1 = this._set$_set;
      return t1.get$first(t1);
    },
    elementAt$1(_, index) {
      return this._set$_set.elementAt$1(0, index);
    },
    $isIterable: 1
  };
  A.BuiltSet_hashCode_closure.prototype = {
    call$1(e) {
      return J.get$hashCode$(this.$this.$ti._precomputed1._as(e));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSet.prototype = {
    _maybeCheckForNull$0() {
      var t1, t2, element;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1), t2 = t1.$ti._precomputed1; t1.moveNext$0();) {
        element = t1._collection$_current;
        if ((element == null ? t2._as(element) : element) == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
      }
    }
  };
  A.SetBuilder.prototype = {
    build$0() {
      var t1, _this = this;
      if (_this._setOwner == null) {
        t1 = _this.__SetBuilder__set_A;
        t1 === $ && A.throwLateFieldNI("_set");
        _this.set$_setOwner(new A._BuiltSet(_this._setFactory, t1, _this.$ti._eval$1("_BuiltSet<1>")));
      }
      t1 = _this._setOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, iterable) {
      var t1, t2, t3, element, _this = this,
        set = _this._createSet$0();
      for (t1 = J.get$iterator$ax(iterable), t2 = _this.$ti, t3 = t2._precomputed1; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (t3._is(element))
          set.add$1(0, element);
        else
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: " + A.S(element), null));
      }
      t2._eval$1("Set<1>")._as(set);
      _this.set$_setOwner(null);
      _this.set$__SetBuilder__set_A(set);
    },
    get$length(_) {
      var t1 = this.__SetBuilder__set_A;
      t1 === $ && A.throwLateFieldNI("_set");
      return t1._collection$_length;
    },
    map$1(_, f) {
      var result, t2, t3, t4, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      result = _this._createSet$0();
      t2 = _this.__SetBuilder__set_A;
      t2 === $ && A.throwLateFieldNI("_set");
      t3 = t1._precomputed1;
      t4 = A._instanceType(t2);
      result.addAll$1(0, new A.EfficientLengthMappedIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t4._eval$1("@<1>")._bind$1(t3)._eval$1("EfficientLengthMappedIterable<1,2>")));
      _this._maybeCheckElements$1(result);
      t1._eval$1("Set<1>")._as(result);
      _this.set$_setOwner(null);
      _this.set$__SetBuilder__set_A(result);
    },
    get$_safeSet() {
      var t1, t2, _this = this;
      if (_this._setOwner != null) {
        t1 = _this._createSet$0();
        t2 = _this.__SetBuilder__set_A;
        t2 === $ && A.throwLateFieldNI("_set");
        t1.addAll$1(0, t2);
        _this.set$__SetBuilder__set_A(_this.$ti._eval$1("Set<1>")._as(t1));
        _this.set$_setOwner(null);
      }
      t1 = _this.__SetBuilder__set_A;
      t1 === $ && A.throwLateFieldNI("_set");
      return t1;
    },
    _createSet$0() {
      return A.LinkedHashSet_LinkedHashSet$_empty(this.$ti._precomputed1);
    },
    _maybeCheckElements$1(elements) {
      var t2, t3, element,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = A._LinkedHashSetIterator$(elements, elements._collection$_modifications, A._instanceType(elements)._precomputed1), t1 = t1._precomputed1, t3 = t2.$ti._precomputed1; t2.moveNext$0();) {
        element = t2._collection$_current;
        if (t1._as(element == null ? t3._as(element) : element) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
      }
    },
    set$__SetBuilder__set_A(__SetBuilder__set_A) {
      this.__SetBuilder__set_A = this.$ti._eval$1("Set<1>")._as(__SetBuilder__set_A);
    },
    set$_setOwner(_setOwner) {
      this._setOwner = this.$ti._eval$1("_BuiltSet<1>?")._as(_setOwner);
    }
  };
  A.BuiltSetMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._set_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._set_multimap$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeyIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltSetMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._set_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltSetMultimap))
        return false;
      t1 = other._set_multimap$_map;
      t2 = _this._set_multimap$_map;
      if (t1.__js_helper$_length !== t2.__js_helper$_length)
        return false;
      if (other.get$hashCode(other) !== _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t4 = t3._map, t3 = A.LinkedHashMapKeyIterator$(t4, t4._modifications, t3.$ti._precomputed1), t4 = other._emptySet, t5 = _this._emptySet; t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._set_multimap$_map);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._set_multimap$_keys == null) {
        t1 = _this._set_multimap$_map;
        _this.set$_set_multimap$_keys(new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")));
      }
      t1 = _this._set_multimap$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      return this._set_multimap$_map.__js_helper$_length;
    },
    set$_set_multimap$_keys(_keys) {
      this._set_multimap$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltSetMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._set_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSetMultimap.prototype = {};
  A.SetMultimapBuilder.prototype = {
    build$0() {
      var t1, key, t2, t3, t4, builtSet, _this = this,
        _s9_ = "_builtMap";
      if (_this._builtMapOwner == null) {
        t1 = _this.__SetMultimapBuilder__builderMap_A;
        t1 === $ && A.throwLateFieldNI("_builderMap");
        t1 = A.LinkedHashMapKeyIterator$(t1, t1._modifications, A._instanceType(t1)._precomputed1);
        for (; t1.moveNext$0();) {
          key = t1.__js_helper$_current;
          t2 = _this.__SetMultimapBuilder__builderMap_A.$index(0, key);
          if (t2._setOwner == null) {
            t3 = t2._setFactory;
            t4 = t2.__SetBuilder__set_A;
            t4 === $ && A.throwLateFieldNI("_set");
            t2.set$_setOwner(new A._BuiltSet(t3, t4, A._instanceType(t2)._eval$1("_BuiltSet<1>")));
          }
          builtSet = t2._setOwner;
          t2 = builtSet._set$_set._collection$_length;
          t3 = _this.__SetMultimapBuilder__builtMap_A;
          if (t2 === 0) {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.remove$1(0, key);
          } else {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.$indexSet(0, key, builtSet);
          }
        }
        t1 = _this.__SetMultimapBuilder__builtMap_A;
        t1 === $ && A.throwLateFieldNI(_s9_);
        t2 = _this.$ti;
        t3 = t2._rest[1];
        _this.set$_builtMapOwner(new A._BuiltSetMultimap(t1, A.BuiltSet_BuiltSet$from(B.List_empty, t3), t2._eval$1("@<1>")._bind$1(t3)._eval$1("_BuiltSetMultimap<1,2>")));
      }
      t1 = _this._builtMapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, multimap) {
      this._setWithCopyAndCheck$2(multimap.get$keys(multimap), new A.SetMultimapBuilder_replace_closure(multimap));
    },
    _getValuesBuilder$1(key) {
      var t2, result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t2 = _this.__SetMultimapBuilder__builderMap_A;
      t2 === $ && A.throwLateFieldNI("_builderMap");
      result = t2.$index(0, key);
      if (result == null) {
        t2 = _this.__SetMultimapBuilder__builtMap_A;
        t2 === $ && A.throwLateFieldNI("_builtMap");
        builtValues = t2.$index(0, key);
        if (builtValues == null)
          result = A.SetBuilder_SetBuilder(t1._rest[1]);
        else {
          t1 = builtValues.$ti;
          t1._eval$1("_BuiltSet<1>")._as(builtValues);
          result = new A.SetBuilder(builtValues._setFactory, builtValues._set$_set, builtValues, t1._eval$1("SetBuilder<1>"));
        }
        _this.__SetMultimapBuilder__builderMap_A.$indexSet(0, key, result);
      }
      return result;
    },
    _setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, _this = this, _null = null;
      _this.set$_builtMapOwner(_null);
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltSet<2>");
      t4 = t1._eval$1("Map<1,BuiltSet<2>>");
      _this.set$__SetMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3)));
      _this.set$__SetMultimapBuilder__builderMap_A(t1._eval$1("Map<1,SetBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("SetBuilder<2>"))));
      for (t5 = J.get$iterator$ax(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current(t7);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._builtMapOwner != null) {
                t8 = _this.__SetMultimapBuilder__builtMap_A;
                t8 === $ && A.throwLateFieldNI("_builtMap");
                _this.set$__SetMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$from(t8, t2, t3)));
                _this.set$_builtMapOwner(_null);
              }
              _this._set_multimap$_checkKey$1(key);
              _this._set_multimap$_checkValue$1(value);
              t8 = _this._getValuesBuilder$1(key);
              t9 = t8.$ti._precomputed1;
              t9._as(value);
              if (!$.$get$isSoundMode() && !t9._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", _null));
              t8.get$_safeSet().add$1(0, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), _null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), _null));
      }
    },
    _set_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("invalid key: " + A.S(key), null));
    },
    _set_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("invalid value: " + A.S(value), null));
    },
    set$__SetMultimapBuilder__builtMap_A(__SetMultimapBuilder__builtMap_A) {
      this.__SetMultimapBuilder__builtMap_A = this.$ti._eval$1("Map<1,BuiltSet<2>>")._as(__SetMultimapBuilder__builtMap_A);
    },
    set$_builtMapOwner(_builtMapOwner) {
      this._builtMapOwner = this.$ti._eval$1("_BuiltSetMultimap<1,2>?")._as(_builtMapOwner);
    },
    set$__SetMultimapBuilder__builderMap_A(__SetMultimapBuilder__builderMap_A) {
      this.__SetMultimapBuilder__builderMap_A = this.$ti._eval$1("Map<1,SetBuilder<2>>")._as(__SetMultimapBuilder__builderMap_A);
    }
  };
  A.SetMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.EnumClass.prototype = {
    toString$0(_) {
      return this.name;
    }
  };
  A.newBuiltValueToStringHelper_closure.prototype = {
    call$1(className) {
      var t1 = new A.StringBuffer(""),
        t2 = "" + className;
      t1._contents = t2;
      t1._contents = t2 + " {\n";
      $._indentingBuiltValueToStringHelperIndent = $._indentingBuiltValueToStringHelperIndent + 2;
      return new A.IndentingBuiltValueToStringHelper(t1);
    },
    $signature: 87
  };
  A.IndentingBuiltValueToStringHelper.prototype = {
    add$2(_, field, value) {
      var t1, t2;
      if (value != null) {
        t1 = this._result;
        t1.toString;
        t2 = t1._contents += B.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent);
        t2 += field;
        t1._contents = t2;
        t1._contents = t2 + "=";
        t2 = t1._contents += A.S(value);
        t1._contents = t2 + ",\n";
      }
    },
    toString$0(_) {
      var t2, stringResult,
        t1 = $._indentingBuiltValueToStringHelperIndent - 2;
      $._indentingBuiltValueToStringHelperIndent = t1;
      t2 = this._result;
      t2.toString;
      t1 = t2._contents += B.JSString_methods.$mul(" ", t1);
      t2._contents = t1 + "}";
      stringResult = J.toString$0$(this._result);
      this._result = null;
      return stringResult;
    }
  };
  A.BuiltValueNullFieldError.prototype = {
    toString$0(_) {
      return 'Tried to construct class "' + this.type + '" with null for non-nullable field "' + this.field + '".';
    }
  };
  A.BuiltValueNestedFieldError.prototype = {
    toString$0(_) {
      return 'Tried to build class "' + this.type + '" but nested builder for field "' + this.field + '" threw: ' + this.error;
    }
  };
  A.JsonObject.prototype = {
    toString$0(_) {
      return J.toString$0$(this.get$value(this));
    }
  };
  A.BoolJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.BoolJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSBool_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.ListJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.ListJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.MapJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.MapJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.NumJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.NumJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSNumber_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.StringJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.StringJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSString_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.Serializers_Serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty, type$.Object);
    },
    $signature: 47
  };
  A.Serializers_Serializers_closure0.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.ListMultimapBuilder_ListMultimapBuilder(t1, t1);
    },
    $signature: 48
  };
  A.Serializers_Serializers_closure1.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.MapBuilder_MapBuilder(t1, t1);
    },
    $signature: 49
  };
  A.Serializers_Serializers_closure2.prototype = {
    call$0() {
      return A.SetBuilder_SetBuilder(type$.Object);
    },
    $signature: 50
  };
  A.Serializers_Serializers_closure3.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.SetMultimapBuilder_SetMultimapBuilder(t1, t1);
    },
    $signature: 51
  };
  A.FullType.prototype = {
    $eq(_, other) {
      var t1, t2, t3, t4, i, t5, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.FullType))
        return false;
      if (_this.root != other.root)
        return false;
      if (_this.nullable !== other.nullable)
        return false;
      t1 = _this.parameters;
      t2 = t1.length;
      t3 = other.parameters;
      t4 = t3.length;
      if (t2 !== t4)
        return false;
      for (i = 0; i !== t2; ++i) {
        if (!(i < t2))
          return A.ioore(t1, i);
        t5 = t1[i];
        if (!(i < t4))
          return A.ioore(t3, i);
        if (!t5.$eq(0, t3[i]))
          return false;
      }
      return true;
    },
    get$hashCode(_) {
      var t1 = A.hashObjects(this.parameters);
      t1 = A._finish(A._combine(A._combine(0, J.get$hashCode$(this.root)), B.JSInt_methods.get$hashCode(t1)));
      return t1 ^ (this.nullable ? 1768878041 : 0);
    },
    toString$0(_) {
      var t2,
        t1 = this.root;
      if (t1 == null)
        t1 = "unspecified";
      else {
        t2 = this.parameters;
        t1 = t2.length === 0 ? A.FullType__getRawName(t1) : A.FullType__getRawName(t1) + "<" + B.JSArray_methods.join$1(t2, ", ") + ">";
        t1 += this.nullable ? "?" : "";
      }
      return t1;
    }
  };
  A.DeserializationError.prototype = {
    toString$0(_) {
      return "Deserializing to '" + this.type.toString$0(0) + "' failed due to: " + this.error.toString$0(0);
    }
  };
  A.BigIntSerializer.prototype = {
    serialize$3$specifiedType(serializers, bigInt, specifiedType) {
      return type$.BigInt._as(bigInt).toString$0(0);
    },
    serialize$2(serializers, bigInt) {
      return this.serialize$3$specifiedType(serializers, bigInt, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var result;
      A._asString(serialized);
      result = A._BigIntImpl__tryParse(serialized, null);
      if (result == null)
        A.throwExpression(A.FormatException$("Could not parse BigInt", serialized, null));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "BigInt";
    }
  };
  A.BoolSerializer.prototype = {
    serialize$3$specifiedType(serializers, boolean, specifiedType) {
      return A._asBool(boolean);
    },
    serialize$2(serializers, boolean) {
      return this.serialize$3$specifiedType(serializers, boolean, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asBool(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "bool";
    }
  };
  A.BuiltJsonSerializers.prototype = {
    serialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, t4, transformedObject, t5, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1), t3 = t2._eval$1("ArrayIterator<1>"), t4 = new J.ArrayIterator(t1, t1.length, t3), t2 = t2._precomputed1, transformedObject = object; t4.moveNext$0();) {
        t5 = t4.__interceptors$_current;
        transformedObject = (t5 == null ? t2._as(t5) : t5).beforeSerialize$2(transformedObject, specifiedType);
      }
      result = this._serialize$2(transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t3); t1.moveNext$0();) {
        t3 = t1.__interceptors$_current;
        result = (t3 == null ? t2._as(t3) : t3).afterSerialize$2(result, specifiedType);
      }
      return result;
    },
    serialize$1(object) {
      return this.serialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _serialize$2(object, specifiedType) {
      var serializer, result, _this = this,
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        t1 = J.getInterceptor$(object);
        serializer = _this.serializerForType$1(t1.get$runtimeType(object));
        if (serializer == null)
          throw A.wrapException(A.StateError$(A._noSerializerMessageFor(t1.get$runtimeType(object).toString$0(0))));
        if (type$.StructuredSerializer_dynamic._is(serializer)) {
          result = [serializer.get$wireName()];
          B.JSArray_methods.addAll$1(result, serializer.serialize$2(_this, object));
          return result;
        } else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? [serializer.get$wireName(), null] : A._setArrayType([serializer.get$wireName(), serializer.serialize$2(_this, object)], type$.JSArray_Object);
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer = _this.serializerForType$1(t1);
        if (serializer == null)
          return _this.serialize$1(object);
        if (type$.StructuredSerializer_dynamic._is(serializer))
          return object == null ? null : J.toList$0$ax(serializer.serialize$3$specifiedType(_this, object, specifiedType));
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? null : serializer.serialize$3$specifiedType(_this, object, specifiedType);
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    deserialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, t4, transformedObject, t5, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1), t3 = t2._eval$1("ArrayIterator<1>"), t4 = new J.ArrayIterator(t1, t1.length, t3), t2 = t2._precomputed1, transformedObject = object; t4.moveNext$0();) {
        t5 = t4.__interceptors$_current;
        transformedObject = (t5 == null ? t2._as(t5) : t5).beforeDeserialize$2(transformedObject, specifiedType);
      }
      result = this._deserialize$3(object, transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t3); t1.moveNext$0();) {
        t3 = t1.__interceptors$_current;
        result = (t3 == null ? t2._as(t3) : t3).afterDeserialize$2(result, specifiedType);
      }
      return result;
    },
    deserialize$1(object) {
      return this.deserialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _deserialize$3(objectBeforePlugins, object, specifiedType) {
      var serializer, error, primitive, error0, serializer0, error1, error2, wireName, exception, _this = this,
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        type$.List_nullable_Object._as(object);
        t1 = J.getInterceptor$ax(object);
        wireName = A._asString(t1.get$first(object));
        serializer = _this._wireNameToSerializer._map$_map.$index(0, wireName);
        if (serializer == null)
          throw A.wrapException(A.StateError$(A._noSerializerMessageFor(wireName)));
        if (type$.StructuredSerializer_dynamic._is(serializer))
          try {
            t1 = serializer.deserialize$2(_this, t1.sublist$1(object, 1));
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          try {
            primitive = t1.$index(object, 1);
            t1 = primitive == null ? null : serializer.deserialize$2(_this, primitive);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error0 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error0));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer0 = _this.serializerForType$1(t1);
        if (serializer0 == null)
          if (type$.List_dynamic._is(object) && typeof J.get$first$ax(object) == "string")
            return _this.deserialize$1(objectBeforePlugins);
          else
            throw A.wrapException(A.StateError$(A._noSerializerMessageFor(t1.toString$0(0))));
        if (type$.StructuredSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, type$.Iterable_nullable_Object._as(object), specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error1 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error1));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, object, specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error2 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error2));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    serializerForType$1(type) {
      var t1 = this._typeToSerializer._map$_map.$index(0, type);
      return t1 == null ? this._typeNameToSerializer._map$_map.$index(0, A._getRawName(type)) : t1;
    },
    newBuilder$1(fullType) {
      var t1,
        builderFactory = this.builderFactories._map$_map.$index(0, fullType);
      if (builderFactory == null)
        this._throwMissingBuilderFactory$1(fullType);
      t1 = builderFactory.call$0();
      return t1 == null ? type$.Object._as(t1) : t1;
    },
    _throwMissingBuilderFactory$1(fullType) {
      throw A.wrapException(A.StateError$("No builder factory for " + fullType.toString$0(0) + ". Fix by adding one, see SerializersBuilder.addBuilderFactory."));
    },
    $isSerializers: 1
  };
  A.BuiltJsonSerializersBuilder.prototype = {
    add$1(_, serializer) {
      var t1, t2, t3, t4, t5, t6, $name, genericsStart, t7;
      if (!type$.StructuredSerializer_dynamic._is(serializer) && !type$.PrimitiveSerializer_dynamic._is(serializer))
        throw A.wrapException(A.ArgumentError$(string$.serial, null));
      this._wireNameToSerializer.$indexSet(0, serializer.get$wireName(), serializer);
      for (t1 = J.get$iterator$ax(serializer.get$types(serializer)), t2 = this._typeToSerializer, t3 = t2.$ti, t4 = t3._precomputed1, t3 = t3._rest[1], t5 = this._typeNameToSerializer; t1.moveNext$0();) {
        t6 = t1.get$current(t1);
        t4._as(t6);
        t3._as(serializer);
        t2._checkKey$1(t6);
        t2._checkValue$1(serializer);
        t2.get$_safeMap().$indexSet(0, t6, serializer);
        $name = t6.toString$0(0);
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
        t6 = genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
        t7 = t5.$ti;
        t7._precomputed1._as(t6);
        t7._rest[1]._as(serializer);
        t5._checkKey$1(t6);
        t5._checkValue$1(serializer);
        t5.get$_safeMap().$indexSet(0, t6, serializer);
      }
    },
    addBuilderFactory$2(types, $function) {
      var t2, t3,
        t1 = this._builderFactories;
      t1.$indexSet(0, types, $function);
      t2 = types.root;
      t3 = types.parameters;
      t1.$indexSet(0, !types.nullable ? new A.FullType(t2, t3, true) : new A.FullType(t2, t3, false), $function);
    },
    build$0() {
      var _this = this;
      return new A.BuiltJsonSerializers(_this._typeToSerializer.build$0(), _this._wireNameToSerializer.build$0(), _this._typeNameToSerializer.build$0(), _this._builderFactories.build$0(), _this._plugins.build$0());
    }
  };
  A.BuiltListMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtListMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltListMultimap_dynamic_dynamic._as(builtListMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtListMultimap.get$keys(builtListMultimap), t2 = t1._map, t1 = A.LinkedHashMapKeyIterator$(t2, t2._modifications, t1.$ti._precomputed1), t2 = builtListMultimap._list_multimap$_map, t3 = builtListMultimap._emptyList; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._list;
        t6 = A._arrayInstanceType(t5);
        t7 = t6._eval$1("MappedListIterable<1,Object?>");
        result.push(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltListMultimapSerializer_serialize_closure(serializers, valueType))), t7), true, t7._eval$1("ListIterable.E")));
      }
      return result;
    },
    serialize$2(serializers, builtListMultimap) {
      return this.serialize$3$specifiedType(serializers, builtListMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, t5, t6, t7, i, key, values, t8, value, t9, t10, t11, t12, _null = null,
        t1 = type$.Iterable_nullable_Object;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.ListMultimapBuilder_ListMultimapBuilder(t2, t2);
      } else
        result = type$.ListMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", _null));
      for (t3 = result.$ti, t4 = t3._precomputed1, t5 = t3._rest[1], t6 = t3._eval$1("BuiltList<2>"), t3 = t3._eval$1("Map<1,BuiltList<2>>"), t7 = type$.nullable_Object, i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        values = J.map$1$1$ax(t1._as(t2.elementAt$1(serialized, i + 1)), new A.BuiltListMultimapSerializer_deserialize_closure(serializers, valueType), t7);
        for (t8 = values.get$iterator(values); t8.moveNext$0();) {
          value = t8.get$current(t8);
          t4._as(key);
          t5._as(value);
          if (result._list_multimap$_builtMapOwner != null) {
            t9 = result.__ListMultimapBuilder__builtMap_A;
            t9 === $ && A.throwLateFieldNI("_builtMap");
            result.set$__ListMultimapBuilder__builtMap_A(t3._as(A.LinkedHashMap_LinkedHashMap$from(t9, t4, t6)));
            result.set$_list_multimap$_builtMapOwner(_null);
          }
          result._list_multimap$_checkKey$1(key);
          result._list_multimap$_checkValue$1(value);
          t9 = result._list_multimap$_getValuesBuilder$1(key);
          t10 = t9.$ti;
          t11 = t10._precomputed1;
          t11._as(value);
          if (!$.$get$isSoundMode() && !t11._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", _null));
          if (t9._listOwner != null) {
            t12 = t9.__ListBuilder__list_A;
            t12 === $ && A.throwLateFieldNI("_list");
            t9.set$__ListBuilder__list_A(t10._eval$1("List<1>")._as(A.List_List$from(t12, true, t11)));
            t9.set$_listOwner(_null);
          }
          t9 = t9.__ListBuilder__list_A;
          t9 === $ && A.throwLateFieldNI("_list");
          B.JSArray_methods.add$1(t9, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "listMultimap";
    }
  };
  A.BuiltListMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 2
  };
  A.BuiltListMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 9
  };
  A.BuiltListSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtList, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltList_dynamic._as(builtList);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      t1 = builtList._list;
      t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._eval$1("Object?(1)")._as(builtList.$ti._eval$1("Object?(1)")._as(new A.BuiltListSerializer_serialize_closure(serializers, elementType))), t2._eval$1("MappedListIterable<1,Object?>"));
    },
    serialize$2(serializers, builtList) {
      return this.serialize$3$specifiedType(serializers, builtList, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.ListBuilder_ListBuilder(B.List_empty, type$.Object) : type$.ListBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new A.BuiltListSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "list";
    }
  };
  A.BuiltListSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.BuiltListSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.BuiltMapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtMap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key;
      type$.BuiltMap_dynamic_dynamic._as(builtMap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtMap.get$keys(builtMap), t2 = t1._map, t1 = A.LinkedHashMapKeyIterator$(t2, t2._modifications, t1.$ti._precomputed1), t2 = builtMap._map$_map; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result.push(serializers.serialize$2$specifiedType(t2.$index(0, key), valueType));
      }
      return result;
    },
    serialize$2(serializers, builtMap) {
      return this.serialize$3$specifiedType(serializers, builtMap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, t3, keyType, valueType, result, i, key, value;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      if (isUnderspecified) {
        t1 = type$.Object;
        result = A.MapBuilder_MapBuilder(t1, t1);
      } else
        result = type$.MapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t1 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t1.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t2 = result.$ti, t3 = t2._precomputed1, t2 = t2._rest[1], i = 0; i !== t1.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i), keyType);
        value = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i + 1), valueType);
        t3._as(key);
        t2._as(value);
        result._checkKey$1(key);
        result._checkValue$1(value);
        result.get$_safeMap().$indexSet(0, key, value);
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "map";
    }
  };
  A.BuiltSetMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSetMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltSetMultimap_dynamic_dynamic._as(builtSetMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtSetMultimap.get$keys(builtSetMultimap), t2 = t1._map, t1 = A.LinkedHashMapKeyIterator$(t2, t2._modifications, t1.$ti._precomputed1), t2 = builtSetMultimap._set_multimap$_map, t3 = builtSetMultimap._emptySet; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._set$_set;
        t6 = A._instanceType(t5);
        t7 = t6._eval$1("EfficientLengthMappedIterable<1,Object?>");
        result.push(A.List_List$of(new A.EfficientLengthMappedIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltSetMultimapSerializer_serialize_closure(serializers, valueType))), t7), true, t7._eval$1("Iterable.E")));
      }
      return result;
    },
    serialize$2(serializers, builtSetMultimap) {
      return this.serialize$3$specifiedType(serializers, builtSetMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, t5, t6, i, key, t7, value, t8, t9,
        t1 = type$.Iterable_dynamic;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.SetMultimapBuilder_SetMultimapBuilder(t2, t2);
      } else
        result = type$.SetMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t3 = result.$ti, t4 = t3._precomputed1, t5 = t3._rest[1], t6 = t3._eval$1("BuiltSet<2>"), t3 = t3._eval$1("Map<1,BuiltSet<2>>"), i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        for (t7 = J.get$iterator$ax(t1._as(J.map$1$ax(t2.elementAt$1(serialized, i + 1), new A.BuiltSetMultimapSerializer_deserialize_closure(serializers, valueType)))); t7.moveNext$0();) {
          value = t7.get$current(t7);
          t4._as(key);
          t5._as(value);
          if (result._builtMapOwner != null) {
            t8 = result.__SetMultimapBuilder__builtMap_A;
            t8 === $ && A.throwLateFieldNI("_builtMap");
            result.set$__SetMultimapBuilder__builtMap_A(t3._as(A.LinkedHashMap_LinkedHashMap$from(t8, t4, t6)));
            result.set$_builtMapOwner(null);
          }
          result._set_multimap$_checkKey$1(key);
          result._set_multimap$_checkValue$1(value);
          t8 = result._getValuesBuilder$1(key);
          t9 = t8.$ti._precomputed1;
          t9._as(value);
          if (!$.$get$isSoundMode() && !t9._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", null));
          t8.get$_safeSet().add$1(0, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "setMultimap";
    }
  };
  A.BuiltSetMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 2
  };
  A.BuiltSetMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 2
  };
  A.BuiltSetSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSet, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltSet_dynamic._as(builtSet);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      t1 = builtSet._set$_set;
      t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._eval$1("Object?(1)")._as(builtSet.$ti._eval$1("Object?(1)")._as(new A.BuiltSetSerializer_serialize_closure(serializers, elementType))), t2._eval$1("EfficientLengthMappedIterable<1,Object?>"));
    },
    serialize$2(serializers, builtSet) {
      return this.serialize$3$specifiedType(serializers, builtSet, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.SetBuilder_SetBuilder(type$.Object) : type$.SetBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new A.BuiltSetSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "set";
    }
  };
  A.BuiltSetSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.BuiltSetSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.DateTimeSerializer.prototype = {
    serialize$3$specifiedType(serializers, dateTime, specifiedType) {
      type$.DateTime._as(dateTime);
      if (!dateTime.isUtc)
        throw A.wrapException(A.ArgumentError$value(dateTime, "dateTime", "Must be in utc for serialization."));
      return 1000 * dateTime._value;
    },
    serialize$2(serializers, dateTime) {
      return this.serialize$3$specifiedType(serializers, dateTime, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t2,
        t1 = B.JSNumber_methods.round$0(A._asInt(serialized) / 1000);
      if (Math.abs(t1) <= 864e13)
        t2 = false;
      else
        t2 = true;
      if (t2)
        A.throwExpression(A.ArgumentError$("DateTime is outside valid range: " + t1, null));
      A.checkNotNullable(true, "isUtc", type$.bool);
      return new A.DateTime(t1, true);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "DateTime";
    }
  };
  A.DoubleSerializer.prototype = {
    serialize$3$specifiedType(serializers, aDouble, specifiedType) {
      A._asDouble(aDouble);
      if (isNaN(aDouble))
        return "NaN";
      else if (aDouble == 1 / 0 || aDouble == -1 / 0)
        return B.JSNumber_methods.get$isNegative(aDouble) ? "-INF" : "INF";
      else
        return aDouble;
    },
    serialize$2(serializers, aDouble) {
      return this.serialize$3$specifiedType(serializers, aDouble, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNum(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "double";
    }
  };
  A.DurationSerializer.prototype = {
    serialize$3$specifiedType(serializers, duration, specifiedType) {
      return type$.Duration._as(duration)._duration;
    },
    serialize$2(serializers, duration) {
      return this.serialize$3$specifiedType(serializers, duration, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Duration$(A._asInt(serialized), 0);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Duration";
    }
  };
  A.Int32Serializer.prototype = {
    serialize$3$specifiedType(serializers, int32, specifiedType) {
      return type$.Int32._as(int32)._i;
    },
    serialize$2(serializers, int32) {
      return this.serialize$3$specifiedType(serializers, int32, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      A._asInt(serialized);
      return new A.Int32((serialized & 2147483647) - ((serialized & 2147483648) >>> 0));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Int32";
    }
  };
  A.Int64Serializer.prototype = {
    serialize$3$specifiedType(serializers, int64, specifiedType) {
      return type$.Int64._as(int64)._toRadixString$1(10);
    },
    serialize$2(serializers, int64) {
      return this.serialize$3$specifiedType(serializers, int64, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = A.Int64__parseRadix(A._asString(serialized), 10, true);
      t1.toString;
      return t1;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Int64";
    }
  };
  A.IntSerializer.prototype = {
    serialize$3$specifiedType(serializers, integer, specifiedType) {
      return A._asInt(integer);
    },
    serialize$2(serializers, integer) {
      return this.serialize$3$specifiedType(serializers, integer, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asInt(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "int";
    }
  };
  A.JsonObjectSerializer.prototype = {
    serialize$3$specifiedType(serializers, jsonObject, specifiedType) {
      type$.JsonObject._as(jsonObject);
      return jsonObject.get$value(jsonObject);
    },
    serialize$2(serializers, jsonObject) {
      return this.serialize$3$specifiedType(serializers, jsonObject, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.JsonObject_JsonObject(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "JsonObject";
    }
  };
  A.NullSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      type$.Null._as(value);
      throw A.wrapException(A.UnimplementedError$(null));
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      throw A.wrapException(A.UnimplementedError$(null));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Null";
    }
  };
  A.NumSerializer.prototype = {
    serialize$3$specifiedType(serializers, number, specifiedType) {
      A._asNum(number);
      if (isNaN(number))
        return "NaN";
      else if (number == 1 / 0 || number == -1 / 0)
        return B.JSNumber_methods.get$isNegative(number) ? "-INF" : "INF";
      else
        return number;
    },
    serialize$2(serializers, number) {
      return this.serialize$3$specifiedType(serializers, number, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNum(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "num";
    }
  };
  A.RegExpSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      return type$.RegExp._as(value).pattern;
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.RegExp_RegExp(A._asString(serialized), true, false);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "RegExp";
    }
  };
  A.StringSerializer.prototype = {
    serialize$3$specifiedType(serializers, string, specifiedType) {
      return A._asString(string);
    },
    serialize$2(serializers, string) {
      return this.serialize$3$specifiedType(serializers, string, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asString(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "String";
    }
  };
  A.Uint8ListSerializer.prototype = {
    serialize$3$specifiedType(serializers, uint8list, specifiedType) {
      uint8list = type$.Base64Codec._eval$1("Codec.S")._as(type$.Uint8List._as(uint8list));
      return B.C_Base64Codec.get$encoder().convert$1(uint8list);
    },
    serialize$2(serializers, uint8list) {
      return this.serialize$3$specifiedType(serializers, uint8list, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return B.C_Base64Decoder.convert$1(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    get$types(_) {
      return A.BuiltList_BuiltList$from([B.Type_Uint8List_WLA], type$.Type);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$wireName() {
      return "UInt8List";
    }
  };
  A.UriSerializer.prototype = {
    serialize$3$specifiedType(serializers, uri, specifiedType) {
      return type$.Uri._as(uri).toString$0(0);
    },
    serialize$2(serializers, uri) {
      return this.serialize$3$specifiedType(serializers, uri, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Uri_parse(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Uri";
    }
  };
  A.DefaultEquality.prototype = {$isEquality: 1};
  A.IterableEquality.prototype = {
    equals$2(elements1, elements2) {
      var it1, it2, hasNext,
        t1 = this.$ti._eval$1("Iterable<1>?");
      t1._as(elements1);
      t1._as(elements2);
      if (elements1 === elements2)
        return true;
      it1 = J.get$iterator$ax(elements1);
      it2 = J.get$iterator$ax(elements2);
      for (t1 = this._elementEquality; true;) {
        hasNext = it1.moveNext$0();
        if (hasNext !== it2.moveNext$0())
          return false;
        if (!hasNext)
          return true;
        if (!t1.equals$2(it1.get$current(it1), it2.get$current(it2)))
          return false;
      }
    },
    hash$1(_, elements) {
      var t1, t2, hash;
      this.$ti._eval$1("Iterable<1>?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        hash = hash + t2.hash$1(0, t1.get$current(t1)) & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.ListEquality.prototype = {
    equals$2(list1, list2) {
      var $length, t2, t3, i,
        t1 = this.$ti._eval$1("List<1>?");
      t1._as(list1);
      t1._as(list2);
      if (list1 === list2)
        return true;
      t1 = J.getInterceptor$asx(list1);
      $length = t1.get$length(list1);
      t2 = J.getInterceptor$asx(list2);
      if ($length !== t2.get$length(list2))
        return false;
      for (t3 = this._elementEquality, i = 0; i < $length; ++i)
        if (!t3.equals$2(t1.$index(list1, i), t2.$index(list2, i)))
          return false;
      return true;
    },
    hash$1(_, list) {
      var t1, t2, hash, i;
      this.$ti._eval$1("List<1>?")._as(list);
      for (t1 = J.getInterceptor$asx(list), t2 = this._elementEquality, hash = 0, i = 0; i < t1.get$length(list); ++i) {
        hash = hash + t2.hash$1(0, t1.$index(list, i)) & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A._UnorderedEquality.prototype = {
    equals$2(elements1, elements2) {
      var counts, $length, e, count,
        t1 = A._instanceType(this),
        t2 = t1._eval$1("_UnorderedEquality.T?");
      t2._as(elements1);
      t2._as(elements2);
      if (elements1 === elements2)
        return true;
      t2 = this._elementEquality;
      counts = A.HashMap_HashMap(t1._eval$1("bool(_UnorderedEquality.E,_UnorderedEquality.E)")._as(t2.get$equals()), t1._eval$1("int(_UnorderedEquality.E)")._as(t2.get$hash(t2)), t2.get$isValidKey(), t1._eval$1("_UnorderedEquality.E"), type$.int);
      for (t1 = J.get$iterator$ax(elements1), $length = 0; t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        counts.$indexSet(0, e, (count == null ? 0 : count) + 1);
        ++$length;
      }
      for (t1 = J.get$iterator$ax(elements2); t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        if (count == null || count === 0)
          return false;
        if (typeof count !== "number")
          return count.$sub();
        counts.$indexSet(0, e, count - 1);
        --$length;
      }
      return $length === 0;
    },
    hash$1(_, elements) {
      var t1, t2, hash;
      A._instanceType(this)._eval$1("_UnorderedEquality.T?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();)
        hash = hash + t2.hash$1(0, t1.get$current(t1)) & 2147483647;
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.SetEquality.prototype = {};
  A._MapEntry.prototype = {
    get$hashCode(_) {
      var t1 = this.equality;
      return 3 * t1._keyEquality.hash$1(0, this.key) + 7 * t1._valueEquality.hash$1(0, this.value) & 2147483647;
    },
    $eq(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other instanceof A._MapEntry) {
        t1 = this.equality;
        t1 = t1._keyEquality.equals$2(this.key, other.key) && t1._valueEquality.equals$2(this.value, other.value);
      } else
        t1 = false;
      return t1;
    }
  };
  A.MapEquality.prototype = {
    equals$2(map1, map2) {
      var t2, equalElementCounts, t3, key, entry, count,
        t1 = this.$ti._eval$1("Map<1,2>?");
      t1._as(map1);
      t1._as(map2);
      if (map1 === map2)
        return true;
      t1 = J.getInterceptor$asx(map1);
      t2 = J.getInterceptor$asx(map2);
      if (t1.get$length(map1) !== t2.get$length(map2))
        return false;
      equalElementCounts = A.HashMap_HashMap(null, null, null, type$._MapEntry, type$.int);
      for (t3 = J.get$iterator$ax(t1.get$keys(map1)); t3.moveNext$0();) {
        key = t3.get$current(t3);
        entry = new A._MapEntry(this, key, t1.$index(map1, key));
        count = equalElementCounts.$index(0, entry);
        equalElementCounts.$indexSet(0, entry, (count == null ? 0 : count) + 1);
      }
      for (t1 = J.get$iterator$ax(t2.get$keys(map2)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        entry = new A._MapEntry(this, key, t2.$index(map2, key));
        count = equalElementCounts.$index(0, entry);
        if (count == null || count === 0)
          return false;
        if (typeof count !== "number")
          return count.$sub();
        equalElementCounts.$indexSet(0, entry, count - 1);
      }
      return true;
    },
    hash$1(_, map) {
      var t2, t3, t4, t5, hash, key, keyHash, t6,
        t1 = this.$ti;
      t1._eval$1("Map<1,2>?")._as(map);
      for (t2 = J.getInterceptor$x(map), t3 = J.get$iterator$ax(t2.get$keys(map)), t4 = this._keyEquality, t5 = this._valueEquality, t1 = t1._rest[1], hash = 0; t3.moveNext$0();) {
        key = t3.get$current(t3);
        keyHash = t4.hash$1(0, key);
        t6 = t2.$index(map, key);
        hash = hash + 3 * keyHash + 7 * t5.hash$1(0, t6 == null ? t1._as(t6) : t6) & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.DeepCollectionEquality.prototype = {
    equals$2(e1, e2) {
      var _this = this,
        t1 = type$.Set_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.SetEquality(_this, type$.SetEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Map_dynamic_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).equals$2(e1, e2);
      t1 = type$.List_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.ListEquality(_this, type$.ListEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Iterable_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.IterableEquality(_this, type$.IterableEquality_dynamic).equals$2(e1, e2);
      return J.$eq$(e1, e2);
    },
    hash$1(_, o) {
      var _this = this;
      if (type$.Set_dynamic._is(o))
        return new A.SetEquality(_this, type$.SetEquality_dynamic).hash$1(0, o);
      if (type$.Map_dynamic_dynamic._is(o))
        return new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).hash$1(0, o);
      if (type$.List_dynamic._is(o))
        return new A.ListEquality(_this, type$.ListEquality_dynamic).hash$1(0, o);
      if (type$.Iterable_dynamic._is(o))
        return new A.IterableEquality(_this, type$.IterableEquality_dynamic).hash$1(0, o);
      return J.get$hashCode$(o);
    },
    isValidKey$1(o) {
      !type$.Iterable_dynamic._is(o);
      return true;
    },
    $isEquality: 1
  };
  A.QueueList.prototype = {
    cast$1$0(_, $T) {
      return new A._CastQueueList(this, J.cast$1$0$ax(this._queue_list$_table, $T), -1, -1, A._instanceType(this)._eval$1("@<QueueList.E>")._bind$1($T)._eval$1("_CastQueueList<1,2>"));
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    get$length(_) {
      var _this = this;
      return (_this.get$_queue_list$_tail() - _this.get$_queue_list$_head(_this) & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0;
    },
    $index(_, index) {
      var t1, _this = this;
      if (index < 0 || index >= _this.get$length(_this))
        throw A.wrapException(A.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(_this) + ")."));
      t1 = J.$index$asx(_this._queue_list$_table, (_this.get$_queue_list$_head(_this) + index & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
      return t1 == null ? A._instanceType(_this)._eval$1("QueueList.E")._as(t1) : t1;
    },
    $indexSet(_, index, value) {
      var _this = this;
      A._instanceType(_this)._eval$1("QueueList.E")._as(value);
      if (index < 0 || index >= _this.get$length(_this))
        throw A.wrapException(A.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(_this) + ")."));
      J.$indexSet$ax(_this._queue_list$_table, (_this.get$_queue_list$_head(_this) + index & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0, value);
    },
    _queue_list$_add$1(_, element) {
      var newTable, split, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("QueueList.E")._as(element);
      J.$indexSet$ax(_this._queue_list$_table, _this.get$_queue_list$_tail(), element);
      _this.set$_queue_list$_tail((_this.get$_queue_list$_tail() + 1 & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
      if (_this.get$_queue_list$_head(_this) === _this.get$_queue_list$_tail()) {
        newTable = A.List_List$filled(J.get$length$asx(_this._queue_list$_table) * 2, null, false, t1._eval$1("QueueList.E?"));
        split = J.get$length$asx(_this._queue_list$_table) - _this.get$_queue_list$_head(_this);
        B.JSArray_methods.setRange$4(newTable, 0, split, _this._queue_list$_table, _this.get$_queue_list$_head(_this));
        B.JSArray_methods.setRange$4(newTable, split, split + _this.get$_queue_list$_head(_this), _this._queue_list$_table, 0);
        _this.set$_queue_list$_head(0, 0);
        _this.set$_queue_list$_tail(J.get$length$asx(_this._queue_list$_table));
        _this.set$_queue_list$_table(newTable);
      }
    },
    set$_queue_list$_table(_table) {
      this._queue_list$_table = A._instanceType(this)._eval$1("List<QueueList.E?>")._as(_table);
    },
    set$_queue_list$_head(_, _head) {
      this._queue_list$_head = A._asInt(_head);
    },
    set$_queue_list$_tail(_tail) {
      this._queue_list$_tail = A._asInt(_tail);
    },
    $isEfficientLengthIterable: 1,
    $isQueue: 1,
    $isIterable: 1,
    $isList: 1,
    get$_queue_list$_head(receiver) {
      return this._queue_list$_head;
    },
    get$_queue_list$_tail() {
      return this._queue_list$_tail;
    }
  };
  A._CastQueueList.prototype = {
    get$_queue_list$_head(_) {
      var t1 = this._queue_list$_delegate;
      return t1.get$_queue_list$_head(t1);
    },
    set$_queue_list$_head(_, value) {
      this._queue_list$_delegate.set$_queue_list$_head(0, value);
    },
    get$_queue_list$_tail() {
      return this._queue_list$_delegate.get$_queue_list$_tail();
    },
    set$_queue_list$_tail(value) {
      this._queue_list$_delegate.set$_queue_list$_tail(value);
    }
  };
  A._QueueList_Object_ListMixin.prototype = {};
  A.BuildStatus.prototype = {};
  A.BuildResult.prototype = {};
  A._$BuildStatusSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return type$.BuildStatus._as(object).name;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._$valueOf(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return B.List_Type_BuildStatus_ahk;
    },
    get$wireName() {
      return "BuildStatus";
    }
  };
  A._$BuildResultSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["status", serializers.serialize$2$specifiedType(type$.BuildResult._as(object).status, B.FullType_FuN)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, value, $$v, _$result,
        _s11_ = "BuildResult",
        result = new A.BuildResultBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuildStatus; iterator.moveNext$0();) {
        t2 = iterator.get$current(iterator);
        t2.toString;
        A._asString(t2);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t2) {
          case "status":
            t2 = serializers.deserialize$2$specifiedType(value, B.FullType_FuN);
            t2.toString;
            t1._as(t2);
            $$v = result._build_result$_$v;
            if ($$v != null) {
              result._status = $$v.status;
              result._build_result$_$v = null;
            }
            result._status = t2;
            break;
        }
      }
      _$result = result._build_result$_$v;
      if (_$result == null) {
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_build_result$_$this()._status, _s11_, "status", t1);
        _$result = new A._$BuildResult(t2);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s11_, "status", t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.BuildResult);
      return result._build_result$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_kqK;
    },
    get$wireName() {
      return "BuildResult";
    }
  };
  A._$BuildResult.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BuildResult && this.status === other.status;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, A.Primitives_objectHashCode(this.status)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BuildResult"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "status", this.status);
      return t2.toString$0(t1);
    }
  };
  A.BuildResultBuilder.prototype = {
    get$_build_result$_$this() {
      var _this = this,
        $$v = _this._build_result$_$v;
      if ($$v != null) {
        _this._status = $$v.status;
        _this._build_result$_$v = null;
      }
      return _this;
    }
  };
  A.ConnectRequest.prototype = {};
  A._$ConnectRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ConnectRequest._as(object);
      return ["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_h8g), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_h8g), "entrypointPath", serializers.serialize$2$specifiedType(object.entrypointPath, B.FullType_h8g)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.ConnectRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "appId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._appId = t1;
            break;
          case "instanceId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._instanceId = t1;
            break;
          case "entrypointPath":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._entrypointPath = t1;
            break;
        }
      }
      return result._build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_muk;
    },
    get$wireName() {
      return "ConnectRequest";
    }
  };
  A._$ConnectRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ConnectRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.entrypointPath === other.entrypointPath;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.appId)), B.JSString_methods.get$hashCode(this.instanceId)), B.JSString_methods.get$hashCode(this.entrypointPath)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ConnectRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", this.appId);
      t2.add$2(t1, "instanceId", this.instanceId);
      t2.add$2(t1, "entrypointPath", this.entrypointPath);
      return t2.toString$0(t1);
    }
  };
  A.ConnectRequestBuilder.prototype = {
    get$_connect_request$_$this() {
      var _this = this,
        $$v = _this._$v;
      if ($$v != null) {
        _this._appId = $$v.appId;
        _this._instanceId = $$v.instanceId;
        _this._entrypointPath = $$v.entrypointPath;
        _this._$v = null;
      }
      return _this;
    },
    _build$0() {
      var t1, t2, t3, t4, _this = this,
        _s14_ = "ConnectRequest",
        _s10_ = "instanceId",
        _s14_0 = "entrypointPath",
        _$result = _this._$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._appId, _s14_, "appId", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._instanceId, _s14_, _s10_, t1);
        t4 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._entrypointPath, _s14_, _s14_0, t1);
        _$result = new A._$ConnectRequest(t2, t3, t4);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s14_, "appId", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s14_, _s10_, t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s14_, _s14_0, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ConnectRequest);
      return _this._$v = _$result;
    }
  };
  A.DebugEvent.prototype = {};
  A.BatchedDebugEvents.prototype = {};
  A._$DebugEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.DebugEvent._as(object);
      return ["kind", serializers.serialize$2$specifiedType(object.kind, B.FullType_h8g), "eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_h8g), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_kjq)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DebugEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "kind":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_debug_event$_$this()._debug_event$_kind = t1;
            break;
          case "eventData":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_debug_event$_$this()._eventData = t1;
            break;
          case "timestamp":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            result.get$_debug_event$_$this()._timestamp = t1;
            break;
        }
      }
      return result._debug_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_8h5;
    },
    get$wireName() {
      return "DebugEvent";
    }
  };
  A._$BatchedDebugEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["events", serializers.serialize$2$specifiedType(type$.BatchedDebugEvents._as(object).events, B.FullType_EGl)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, t5, value, $$v, t6, t7, t8, t9,
        result = new A.BatchedDebugEventsBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuiltList_nullable_Object, t2 = type$.DebugEvent, t3 = type$.List_DebugEvent, t4 = type$.ListBuilder_DebugEvent; iterator.moveNext$0();) {
        t5 = iterator.get$current(iterator);
        t5.toString;
        A._asString(t5);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t5) {
          case "events":
            $$v = result._debug_event$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.set$__ListBuilder__list_A(t9._as(t5._list));
                t7.set$_listOwner(t5);
              } else {
                t7.set$__ListBuilder__list_A(t9._as(A.List_List$from(t5, true, t6._precomputed1)));
                t7.set$_listOwner(null);
              }
              result.set$_events(t7);
              result._debug_event$_$v = null;
            }
            t5 = result._events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.set$__ListBuilder__list_A(t3._as(A.List_List$from(B.List_empty, true, t2)));
              t5.set$_listOwner(null);
              result.set$_events(t5);
            }
            t6 = serializers.deserialize$2$specifiedType(value, B.FullType_EGl);
            t6.toString;
            t1._as(t6);
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.set$__ListBuilder__list_A(t9._as(t6._list));
              t5.set$_listOwner(t6);
            } else {
              t5.set$__ListBuilder__list_A(t9._as(A.List_List$from(t6, true, t7._precomputed1)));
              t5.set$_listOwner(null);
            }
            break;
        }
      }
      return result._debug_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_Jeh;
    },
    get$wireName() {
      return "BatchedDebugEvents";
    }
  };
  A._$DebugEvent.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DebugEvent && _this.kind === other.kind && _this.eventData === other.eventData && _this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.kind)), B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "kind", this.kind);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.DebugEventBuilder.prototype = {
    get$_debug_event$_$this() {
      var _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        _this._debug_event$_kind = $$v.kind;
        _this._eventData = $$v.eventData;
        _this._timestamp = $$v.timestamp;
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    _debug_event$_build$0() {
      var t1, t2, t3, t4, t5, _this = this,
        _s10_ = "DebugEvent",
        _s9_ = "eventData",
        _s9_0 = "timestamp",
        _$result = _this._debug_event$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._debug_event$_kind, _s10_, "kind", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._eventData, _s10_, _s9_, t1);
        t4 = type$.int;
        t5 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._timestamp, _s10_, _s9_0, t4);
        _$result = new A._$DebugEvent(t2, t3, t5);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s10_, "kind", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s10_, _s9_, t1);
        A.BuiltValueNullFieldError_checkNotNull(t5, _s10_, _s9_0, t4);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.DebugEvent);
      return _this._debug_event$_$v = _$result;
    }
  };
  A._$BatchedDebugEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BatchedDebugEvents && this.events.$eq(0, other.events);
    },
    get$hashCode(_) {
      var t1 = this.events;
      return A.$jf(A.$jc(0, t1.get$hashCode(t1)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedDebugEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedDebugEventsBuilder.prototype = {
    get$events() {
      var t1 = this.get$_debug_event$_$this(),
        t2 = t1._events;
      if (t2 == null) {
        t2 = A.ListBuilder_ListBuilder(B.List_empty, type$.DebugEvent);
        t1.set$_events(t2);
        t1 = t2;
      } else
        t1 = t2;
      return t1;
    },
    get$_debug_event$_$this() {
      var t1, _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        _this.set$_events(A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1));
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    _debug_event$_build$0() {
      var _$failedField, e, _$result0, t1, exception, t2, _this = this,
        _s18_ = "BatchedDebugEvents",
        _$result = null;
      try {
        _$result0 = _this._debug_event$_$v;
        if (_$result0 == null) {
          t1 = _this.get$events().build$0();
          _$result0 = new A._$BatchedDebugEvents(t1);
          A.BuiltValueNullFieldError_checkNotNull(t1, _s18_, "events", type$.BuiltList_DebugEvent);
        }
        _$result = _$result0;
      } catch (exception) {
        _$failedField = A._Cell$named("_$failedField");
        try {
          _$failedField.__late_helper$_value = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = A.BuiltValueNestedFieldError$(_s18_, _$failedField.readLocal$0(), J.toString$0$(e));
          throw A.wrapException(t1);
        }
        throw exception;
      }
      t1 = type$.BatchedDebugEvents;
      t2 = t1._as(_$result);
      A.ArgumentError_checkNotNull(t2, "other", t1);
      _this._debug_event$_$v = t2;
      return _$result;
    },
    set$_events(_events) {
      this._events = type$.nullable_ListBuilder_DebugEvent._as(_events);
    }
  };
  A.DebugInfo.prototype = {};
  A._$DebugInfoSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DebugInfo._as(object);
      result = [];
      value = object.appEntrypointPath;
      if (value != null) {
        result.push("appEntrypointPath");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appId;
      if (value != null) {
        result.push("appId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appInstanceId;
      if (value != null) {
        result.push("appInstanceId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appOrigin;
      if (value != null) {
        result.push("appOrigin");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appUrl;
      if (value != null) {
        result.push("appUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.authUrl;
      if (value != null) {
        result.push("authUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.dwdsVersion;
      if (value != null) {
        result.push("dwdsVersion");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.extensionUrl;
      if (value != null) {
        result.push("extensionUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.isInternalBuild;
      if (value != null) {
        result.push("isInternalBuild");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_MtR));
      }
      value = object.isFlutterApp;
      if (value != null) {
        result.push("isFlutterApp");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_MtR));
      }
      value = object.workspaceName;
      if (value != null) {
        result.push("workspaceName");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.tabUrl;
      if (value != null) {
        result.push("tabUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.tabId;
      if (value != null) {
        result.push("tabId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_kjq));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DebugInfoBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "appEntrypointPath":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appEntrypointPath = t1;
            break;
          case "appId":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._debug_info$_appId = t1;
            break;
          case "appInstanceId":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appInstanceId = t1;
            break;
          case "appOrigin":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appOrigin = t1;
            break;
          case "appUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appUrl = t1;
            break;
          case "authUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._authUrl = t1;
            break;
          case "dwdsVersion":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._dwdsVersion = t1;
            break;
          case "extensionUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._extensionUrl = t1;
            break;
          case "isInternalBuild":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_$this()._isInternalBuild = t1;
            break;
          case "isFlutterApp":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_$this()._isFlutterApp = t1;
            break;
          case "workspaceName":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._workspaceName = t1;
            break;
          case "tabUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._tabUrl = t1;
            break;
          case "tabId":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_$this()._tabId = t1;
            break;
        }
      }
      return result._debug_info$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_IMr;
    },
    get$wireName() {
      return "DebugInfo";
    }
  };
  A._$DebugInfo.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DebugInfo && _this.appEntrypointPath == other.appEntrypointPath && _this.appId == other.appId && _this.appInstanceId == other.appInstanceId && _this.appOrigin == other.appOrigin && _this.appUrl == other.appUrl && _this.authUrl == other.authUrl && _this.dwdsVersion == other.dwdsVersion && _this.extensionUrl == other.extensionUrl && _this.isInternalBuild == other.isInternalBuild && _this.isFlutterApp == other.isFlutterApp && _this.workspaceName == other.workspaceName && _this.tabUrl == other.tabUrl && _this.tabId == other.tabId;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, J.get$hashCode$(_this.appEntrypointPath)), J.get$hashCode$(_this.appId)), J.get$hashCode$(_this.appInstanceId)), J.get$hashCode$(_this.appOrigin)), J.get$hashCode$(_this.appUrl)), J.get$hashCode$(_this.authUrl)), J.get$hashCode$(_this.dwdsVersion)), J.get$hashCode$(_this.extensionUrl)), J.get$hashCode$(_this.isInternalBuild)), J.get$hashCode$(_this.isFlutterApp)), J.get$hashCode$(_this.workspaceName)), J.get$hashCode$(_this.tabUrl)), J.get$hashCode$(_this.tabId)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugInfo"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appEntrypointPath", _this.appEntrypointPath);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "appInstanceId", _this.appInstanceId);
      t2.add$2(t1, "appOrigin", _this.appOrigin);
      t2.add$2(t1, "appUrl", _this.appUrl);
      t2.add$2(t1, "authUrl", _this.authUrl);
      t2.add$2(t1, "dwdsVersion", _this.dwdsVersion);
      t2.add$2(t1, "extensionUrl", _this.extensionUrl);
      t2.add$2(t1, "isInternalBuild", _this.isInternalBuild);
      t2.add$2(t1, "isFlutterApp", _this.isFlutterApp);
      t2.add$2(t1, "workspaceName", _this.workspaceName);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      t2.add$2(t1, "tabId", _this.tabId);
      return t2.toString$0(t1);
    }
  };
  A.DebugInfoBuilder.prototype = {
    get$_$this() {
      var _this = this,
        $$v = _this._debug_info$_$v;
      if ($$v != null) {
        _this._appEntrypointPath = $$v.appEntrypointPath;
        _this._debug_info$_appId = $$v.appId;
        _this._appInstanceId = $$v.appInstanceId;
        _this._appOrigin = $$v.appOrigin;
        _this._appUrl = $$v.appUrl;
        _this._authUrl = $$v.authUrl;
        _this._dwdsVersion = $$v.dwdsVersion;
        _this._extensionUrl = $$v.extensionUrl;
        _this._isInternalBuild = $$v.isInternalBuild;
        _this._isFlutterApp = $$v.isFlutterApp;
        _this._workspaceName = $$v.workspaceName;
        _this._tabUrl = $$v.tabUrl;
        _this._tabId = $$v.tabId;
        _this._debug_info$_$v = null;
      }
      return _this;
    },
    _debug_info$_build$0() {
      var _this = this,
        _$result = _this._debug_info$_$v;
      if (_$result == null)
        _$result = new A._$DebugInfo(_this.get$_$this()._appEntrypointPath, _this.get$_$this()._debug_info$_appId, _this.get$_$this()._appInstanceId, _this.get$_$this()._appOrigin, _this.get$_$this()._appUrl, _this.get$_$this()._authUrl, _this.get$_$this()._dwdsVersion, _this.get$_$this()._extensionUrl, _this.get$_$this()._isInternalBuild, _this.get$_$this()._isFlutterApp, _this.get$_$this()._workspaceName, _this.get$_$this()._tabUrl, _this.get$_$this()._tabId);
      A.ArgumentError_checkNotNull(_$result, "other", type$.DebugInfo);
      return _this._debug_info$_$v = _$result;
    }
  };
  A.DevToolsRequest.prototype = {};
  A.DevToolsResponse.prototype = {};
  A._$DevToolsRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DevToolsRequest._as(object);
      result = ["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_h8g), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_h8g)];
      value = object.contextId;
      if (value != null) {
        result.push("contextId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_kjq));
      }
      value = object.tabUrl;
      if (value != null) {
        result.push("tabUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.uriOnly;
      if (value != null) {
        result.push("uriOnly");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_MtR));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DevToolsRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "appId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_devtools_request$_$this()._devtools_request$_appId = t1;
            break;
          case "instanceId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
            break;
          case "contextId":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_devtools_request$_$this()._contextId = t1;
            break;
          case "tabUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._devtools_request$_tabUrl = t1;
            break;
          case "uriOnly":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_devtools_request$_$this()._uriOnly = t1;
            break;
        }
      }
      return result._devtools_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_yT3;
    },
    get$wireName() {
      return "DevToolsRequest";
    }
  };
  A._$DevToolsResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DevToolsResponse._as(object);
      result = ["success", serializers.serialize$2$specifiedType(object.success, B.FullType_MtR), "promptExtension", serializers.serialize$2$specifiedType(object.promptExtension, B.FullType_MtR)];
      value = object.error;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result, t2, t3,
        _s15_ = "promptExtension",
        _s16_ = "DevToolsResponse",
        result = new A.DevToolsResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_MtR);
            t1.toString;
            A._asBool(t1);
            result.get$_devtools_request$_$this()._success = t1;
            break;
          case "promptExtension":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_MtR);
            t1.toString;
            A._asBool(t1);
            result.get$_devtools_request$_$this()._promptExtension = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._error = t1;
            break;
        }
      }
      _$result = result._devtools_request$_$v;
      if (_$result == null) {
        t1 = type$.bool;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_devtools_request$_$this()._success, _s16_, "success", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_devtools_request$_$this()._promptExtension, _s16_, _s15_, t1);
        _$result = new A._$DevToolsResponse(t2, t3, result.get$_devtools_request$_$this()._error);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s16_, "success", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s16_, _s15_, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.DevToolsResponse);
      return result._devtools_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_aRS;
    },
    get$wireName() {
      return "DevToolsResponse";
    }
  };
  A._$DevToolsRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DevToolsRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.contextId == other.contextId && _this.tabUrl == other.tabUrl && _this.uriOnly == other.uriOnly;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(_this.appId)), B.JSString_methods.get$hashCode(_this.instanceId)), J.get$hashCode$(_this.contextId)), J.get$hashCode$(_this.tabUrl)), J.get$hashCode$(_this.uriOnly)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "instanceId", _this.instanceId);
      t2.add$2(t1, "contextId", _this.contextId);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      t2.add$2(t1, "uriOnly", _this.uriOnly);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsRequestBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._devtools_request$_appId = $$v.appId;
        _this._devtools_request$_instanceId = $$v.instanceId;
        _this._contextId = $$v.contextId;
        _this._devtools_request$_tabUrl = $$v.tabUrl;
        _this._uriOnly = $$v.uriOnly;
        _this._devtools_request$_$v = null;
      }
      return _this;
    },
    _devtools_request$_build$0() {
      var t1, t2, t3, _this = this,
        _s15_ = "DevToolsRequest",
        _s10_ = "instanceId",
        _$result = _this._devtools_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_devtools_request$_$this()._devtools_request$_appId, _s15_, "appId", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_devtools_request$_$this()._devtools_request$_instanceId, _s15_, _s10_, t1);
        _$result = new A._$DevToolsRequest(t2, t3, _this.get$_devtools_request$_$this()._contextId, _this.get$_devtools_request$_$this()._devtools_request$_tabUrl, _this.get$_devtools_request$_$this()._uriOnly);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s15_, "appId", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s15_, _s10_, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.DevToolsRequest);
      return _this._devtools_request$_$v = _$result;
    }
  };
  A._$DevToolsResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DevToolsResponse && _this.success === other.success && _this.promptExtension === other.promptExtension && _this.error == other.error;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSBool_methods.get$hashCode(this.success)), B.JSBool_methods.get$hashCode(this.promptExtension)), J.get$hashCode$(this.error)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "success", this.success);
      t2.add$2(t1, "promptExtension", this.promptExtension);
      t2.add$2(t1, "error", this.error);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsResponseBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._success = $$v.success;
        _this._promptExtension = $$v.promptExtension;
        _this._error = $$v.error;
        _this._devtools_request$_$v = null;
      }
      return _this;
    }
  };
  A.ErrorResponse.prototype = {};
  A._$ErrorResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ErrorResponse._as(object);
      return ["error", serializers.serialize$2$specifiedType(object.error, B.FullType_h8g), "stackTrace", serializers.serialize$2$specifiedType(object.stackTrace, B.FullType_h8g)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result, t2, t3,
        _s10_ = "stackTrace",
        _s13_ = "ErrorResponse",
        result = new A.ErrorResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "error":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_error = t1;
            break;
          case "stackTrace":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_stackTrace = t1;
            break;
        }
      }
      _$result = result._error_response$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_error_response$_$this()._error_response$_error, _s13_, "error", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_error_response$_$this()._error_response$_stackTrace, _s13_, _s10_, t1);
        _$result = new A._$ErrorResponse(t2, t3);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s13_, "error", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s13_, _s10_, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ErrorResponse);
      return result._error_response$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_6Bz;
    },
    get$wireName() {
      return "ErrorResponse";
    }
  };
  A._$ErrorResponse.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$ErrorResponse && this.error === other.error && this.stackTrace === other.stackTrace;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.error)), B.JSString_methods.get$hashCode(this.stackTrace)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ErrorResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "error", this.error);
      t2.add$2(t1, "stackTrace", this.stackTrace);
      return t2.toString$0(t1);
    }
  };
  A.ErrorResponseBuilder.prototype = {
    get$_error_response$_$this() {
      var _this = this,
        $$v = _this._error_response$_$v;
      if ($$v != null) {
        _this._error_response$_error = $$v.error;
        _this._error_response$_stackTrace = $$v.stackTrace;
        _this._error_response$_$v = null;
      }
      return _this;
    }
  };
  A.ExtensionRequest.prototype = {};
  A.ExtensionResponse.prototype = {};
  A.ExtensionEvent.prototype = {};
  A.BatchedEvents.prototype = {};
  A._$ExtensionRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ExtensionRequest._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_kjq), "command", serializers.serialize$2$specifiedType(object.command, B.FullType_h8g)];
      value = object.commandParams;
      if (value != null) {
        result.push("commandParams");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result, t2, t3, t4,
        _s16_ = "ExtensionRequest",
        result = new A.ExtensionRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "command":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_extension_request$_$this()._command = t1;
            break;
          case "commandParams":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._commandParams = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.int;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._id, _s16_, "id", t1);
        t3 = type$.String;
        t4 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._command, _s16_, "command", t3);
        _$result = new A._$ExtensionRequest(t2, t4, result.get$_extension_request$_$this()._commandParams);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s16_, "id", t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s16_, "command", t3);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ExtensionRequest);
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_0YD;
    },
    get$wireName() {
      return "ExtensionRequest";
    }
  };
  A._$ExtensionResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ExtensionResponse._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_kjq), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_MtR), "result", serializers.serialize$2$specifiedType(object.result, B.FullType_h8g)];
      value = object.error;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result, t2, t3, t4, t5, t6,
        _s17_ = "ExtensionResponse",
        result = new A.ExtensionResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_MtR);
            t1.toString;
            A._asBool(t1);
            result.get$_extension_request$_$this()._extension_request$_success = t1;
            break;
          case "result":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_extension_request$_$this()._extension_request$_result = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._extension_request$_error = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.int;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._id, _s17_, "id", t1);
        t3 = type$.bool;
        t4 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_success, _s17_, "success", t3);
        t5 = type$.String;
        t6 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_result, _s17_, "result", t5);
        _$result = new A._$ExtensionResponse(t2, t4, t6, result.get$_extension_request$_$this()._extension_request$_error);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s17_, "id", t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s17_, "success", t3);
        A.BuiltValueNullFieldError_checkNotNull(t6, _s17_, "result", t5);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ExtensionResponse);
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_bhs;
    },
    get$wireName() {
      return "ExtensionResponse";
    }
  };
  A._$ExtensionEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ExtensionEvent._as(object);
      return ["params", serializers.serialize$2$specifiedType(object.params, B.FullType_h8g), "method", serializers.serialize$2$specifiedType(object.method, B.FullType_h8g)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result, t2, t3,
        _s14_ = "ExtensionEvent",
        result = new A.ExtensionEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "params":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._params = t1;
            break;
          case "method":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._extension_request$_method = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._params, _s14_, "params", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_method, _s14_, "method", t1);
        _$result = new A._$ExtensionEvent(t2, t3);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s14_, "params", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s14_, "method", t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ExtensionEvent);
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_e7M;
    },
    get$wireName() {
      return "ExtensionEvent";
    }
  };
  A._$BatchedEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["events", serializers.serialize$2$specifiedType(type$.BatchedEvents._as(object).events, B.FullType_NIe)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, t5, value, $$v, t6, t7, t8, t9,
        result = new A.BatchedEventsBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuiltList_nullable_Object, t2 = type$.ExtensionEvent, t3 = type$.List_ExtensionEvent, t4 = type$.ListBuilder_ExtensionEvent; iterator.moveNext$0();) {
        t5 = iterator.get$current(iterator);
        t5.toString;
        A._asString(t5);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t5) {
          case "events":
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.set$__ListBuilder__list_A(t9._as(t5._list));
                t7.set$_listOwner(t5);
              } else {
                t7.set$__ListBuilder__list_A(t9._as(A.List_List$from(t5, true, t6._precomputed1)));
                t7.set$_listOwner(null);
              }
              result.set$_extension_request$_events(t7);
              result._extension_request$_$v = null;
            }
            t5 = result._extension_request$_events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.set$__ListBuilder__list_A(t3._as(A.List_List$from(B.List_empty, true, t2)));
              t5.set$_listOwner(null);
              result.set$_extension_request$_events(t5);
            }
            t6 = serializers.deserialize$2$specifiedType(value, B.FullType_NIe);
            t6.toString;
            t1._as(t6);
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.set$__ListBuilder__list_A(t9._as(t6._list));
              t5.set$_listOwner(t6);
            } else {
              t5.set$__ListBuilder__list_A(t9._as(A.List_List$from(t6, true, t7._precomputed1)));
              t5.set$_listOwner(null);
            }
            break;
        }
      }
      return result._extension_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_oyn;
    },
    get$wireName() {
      return "BatchedEvents";
    }
  };
  A._$ExtensionRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ExtensionRequest && _this.id === other.id && _this.command === other.command && _this.commandParams == other.commandParams;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(this.id)), B.JSString_methods.get$hashCode(this.command)), J.get$hashCode$(this.commandParams)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "command", this.command);
      t2.add$2(t1, "commandParams", this.commandParams);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionRequestBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._command = $$v.command;
        _this._commandParams = $$v.commandParams;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ExtensionResponse && _this.id === other.id && _this.success === other.success && _this.result === other.result && _this.error == other.error;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(_this.id)), B.JSBool_methods.get$hashCode(_this.success)), B.JSString_methods.get$hashCode(_this.result)), J.get$hashCode$(_this.error)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", _this.id);
      t2.add$2(t1, "success", _this.success);
      t2.add$2(t1, "result", _this.result);
      t2.add$2(t1, "error", _this.error);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionResponseBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._extension_request$_success = $$v.success;
        _this._extension_request$_result = $$v.result;
        _this._extension_request$_error = $$v.error;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$ExtensionEvent && this.params === other.params && this.method === other.method;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.params)), B.JSString_methods.get$hashCode(this.method)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "params", this.params);
      t2.add$2(t1, "method", this.method);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionEventBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._params = $$v.params;
        _this._extension_request$_method = $$v.method;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$BatchedEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BatchedEvents && this.events.$eq(0, other.events);
    },
    get$hashCode(_) {
      var t1 = this.events;
      return A.$jf(A.$jc(0, t1.get$hashCode(t1)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedEventsBuilder.prototype = {
    get$events() {
      var t1, _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        _this.set$_extension_request$_events(A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1));
        _this._extension_request$_$v = null;
      }
      t1 = _this._extension_request$_events;
      if (t1 == null) {
        t1 = A.ListBuilder_ListBuilder(B.List_empty, type$.ExtensionEvent);
        _this.set$_extension_request$_events(t1);
      }
      return t1;
    },
    _extension_request$_build$0() {
      var _$failedField, e, _$result0, t1, exception, t2, _this = this,
        _s13_ = "BatchedEvents",
        _$result = null;
      try {
        _$result0 = _this._extension_request$_$v;
        if (_$result0 == null) {
          t1 = _this.get$events().build$0();
          _$result0 = new A._$BatchedEvents(t1);
          A.BuiltValueNullFieldError_checkNotNull(t1, _s13_, "events", type$.BuiltList_ExtensionEvent);
        }
        _$result = _$result0;
      } catch (exception) {
        _$failedField = A._Cell$named("_$failedField");
        try {
          _$failedField.__late_helper$_value = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = A.BuiltValueNestedFieldError$(_s13_, _$failedField.readLocal$0(), J.toString$0$(e));
          throw A.wrapException(t1);
        }
        throw exception;
      }
      t1 = type$.BatchedEvents;
      t2 = t1._as(_$result);
      A.ArgumentError_checkNotNull(t2, "other", t1);
      _this._extension_request$_$v = t2;
      return _$result;
    },
    set$_extension_request$_events(_events) {
      this._extension_request$_events = type$.nullable_ListBuilder_ExtensionEvent._as(_events);
    }
  };
  A.IsolateExit.prototype = {};
  A.IsolateStart.prototype = {};
  A._$IsolateExitSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.IsolateExit._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A.IsolateExitBuilder()._isolate_events$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_J12;
    },
    get$wireName() {
      return "IsolateExit";
    }
  };
  A._$IsolateStartSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.IsolateStart._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A.IsolateStartBuilder()._isolate_events$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_00;
    },
    get$wireName() {
      return "IsolateStart";
    }
  };
  A._$IsolateExit.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$IsolateExit;
    },
    get$hashCode(_) {
      return 814065794;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit"));
    }
  };
  A.IsolateExitBuilder.prototype = {
    _isolate_events$_build$0() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new A._$IsolateExit();
      A.ArgumentError_checkNotNull(_$result, "other", type$.IsolateExit);
      return this._isolate_events$_$v = _$result;
    }
  };
  A._$IsolateStart.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$IsolateStart;
    },
    get$hashCode(_) {
      return 97463111;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateStart"));
    }
  };
  A.IsolateStartBuilder.prototype = {
    _isolate_events$_build$0() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new A._$IsolateStart();
      A.ArgumentError_checkNotNull(_$result, "other", type$.IsolateStart);
      return this._isolate_events$_$v = _$result;
    }
  };
  A.RegisterEvent.prototype = {};
  A._$RegisterEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.RegisterEvent._as(object);
      return ["eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_h8g), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_kjq)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v,
        result = new A.RegisterEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "eventData":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_eventData = t1;
            break;
          case "timestamp":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_timestamp = t1;
            break;
        }
      }
      return result._register_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_ASY;
    },
    get$wireName() {
      return "RegisterEvent";
    }
  };
  A._$RegisterEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$RegisterEvent && this.eventData === other.eventData && this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("RegisterEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.RegisterEventBuilder.prototype = {
    get$_register_event$_$this() {
      var _this = this,
        $$v = _this._register_event$_$v;
      if ($$v != null) {
        _this._register_event$_eventData = $$v.eventData;
        _this._register_event$_timestamp = $$v.timestamp;
        _this._register_event$_$v = null;
      }
      return _this;
    },
    _register_event$_build$0() {
      var t1, t2, t3, t4, _this = this,
        _s13_ = "RegisterEvent",
        _s9_ = "eventData",
        _s9_0 = "timestamp",
        _$result = _this._register_event$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_register_event$_$this()._register_event$_eventData, _s13_, _s9_, t1);
        t3 = type$.int;
        t4 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_register_event$_$this()._register_event$_timestamp, _s13_, _s9_0, t3);
        _$result = new A._$RegisterEvent(t2, t4);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s13_, _s9_, t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s13_, _s9_0, t3);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.RegisterEvent);
      return _this._register_event$_$v = _$result;
    }
  };
  A.RunRequest.prototype = {};
  A._$RunRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.RunRequest._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var _$result;
      type$.Iterable_nullable_Object._as(serialized);
      _$result = new A._$RunRequest();
      A.ArgumentError_checkNotNull(_$result, "other", type$.RunRequest);
      return _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_7pl;
    },
    get$wireName() {
      return "RunRequest";
    }
  };
  A._$RunRequest.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$RunRequest;
    },
    get$hashCode(_) {
      return 248087772;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("RunRequest"));
    }
  };
  A._$serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty, type$.DebugEvent);
    },
    $signature: 56
  };
  A._$serializers_closure0.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty, type$.ExtensionEvent);
    },
    $signature: 57
  };
  A.BatchedStreamController.prototype = {
    _batchAndSendEvents$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t2, t3, t4, t5, t6, t7, t8, lastSendTime0, lastEvent, duration, t1, buffer, lastSendTime, $async$temp1, $async$temp2;
      var $async$_batchAndSendEvents$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              duration = A.Duration$(0, $async$self._checkDelayMilliseconds);
              t1 = $async$self.$ti;
              buffer = A._setArrayType([], t1._eval$1("JSArray<1>"));
              lastSendTime = Date.now();
              t2 = $async$self._batchDelayMilliseconds, t3 = $async$self._outputController, t4 = A._instanceType(t3), t1 = t1._precomputed1, t5 = t4._precomputed1, t4 = t4._eval$1("_DelayedData<1>");
            case 2:
              // for condition
              $async$temp1 = A;
              $async$goto = 4;
              return A._asyncAwait($async$self._hasEventOrTimeOut$1(duration), $async$_batchAndSendEvents$0);
            case 4:
              // returning from await.
              if (!$async$temp1.boolConversionCheck($async$result)) {
                // goto after for
                $async$goto = 3;
                break;
              }
              $async$temp1 = A;
              $async$goto = 7;
              return A._asyncAwait($async$self._hasEventDuring$1(duration), $async$_batchAndSendEvents$0);
            case 7:
              // returning from await.
              $async$goto = $async$temp1.boolConversionCheck($async$result) ? 5 : 6;
              break;
            case 5:
              // then
              t6 = $async$self.__BatchedStreamController__inputQueue_A;
              t6 === $ && A.throwLateFieldNI("_inputQueue");
              t7 = t6.$ti;
              t8 = new A._Future($.Zone__current, t7._eval$1("_Future<1>"));
              t6._addRequest$1(new A._NextRequest(new A._AsyncCompleter(t8, t7._eval$1("_AsyncCompleter<1>")), t7._eval$1("_NextRequest<1>")));
              $async$temp1 = B.JSArray_methods;
              $async$temp2 = buffer;
              $async$goto = 8;
              return A._asyncAwait(t8, $async$_batchAndSendEvents$0);
            case 8:
              // returning from await.
              $async$temp1.add$1($async$temp2, $async$result);
            case 6:
              // join
              lastSendTime0 = Date.now();
              if (lastSendTime0 > lastSendTime + t2) {
                if (buffer.length !== 0) {
                  t6 = t5._as(A.List_List$of(buffer, true, t1));
                  t7 = t3._state;
                  if (t7 >= 4)
                    A.throwExpression(t3._badEventState$0());
                  if ((t7 & 1) !== 0)
                    t3._sendData$1(t6);
                  else if ((t7 & 3) === 0) {
                    t7 = t3._ensurePendingEvents$0();
                    t6 = new A._DelayedData(t6, t4);
                    lastEvent = t7.lastPendingEvent;
                    if (lastEvent == null)
                      t7.firstPendingEvent = t7.lastPendingEvent = t6;
                    else {
                      lastEvent.set$next(0, t6);
                      t7.lastPendingEvent = t6;
                    }
                  }
                  B.JSArray_methods.clear$0(buffer);
                }
                lastSendTime = lastSendTime0;
              }
              // goto for condition
              $async$goto = 2;
              break;
            case 3:
              // after for
              if (buffer.length !== 0)
                t3.add$1(0, t5._as(A.List_List$of(buffer, true, t1)));
              $async$self._completer.complete$1(0, true);
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_batchAndSendEvents$0, $async$completer);
    },
    _hasEventOrTimeOut$1(duration) {
      var t1 = this.__BatchedStreamController__inputQueue_A;
      t1 === $ && A.throwLateFieldNI("_inputQueue");
      return t1.get$hasNext().timeout$2$onTimeout(0, duration, new A.BatchedStreamController__hasEventOrTimeOut_closure());
    },
    _hasEventDuring$1(duration) {
      var t1 = this.__BatchedStreamController__inputQueue_A;
      t1 === $ && A.throwLateFieldNI("_inputQueue");
      return t1.get$hasNext().timeout$2$onTimeout(0, duration, new A.BatchedStreamController__hasEventDuring_closure());
    },
    set$__BatchedStreamController__inputQueue_A(__BatchedStreamController__inputQueue_A) {
      this.__BatchedStreamController__inputQueue_A = this.$ti._eval$1("StreamQueue<1>")._as(__BatchedStreamController__inputQueue_A);
    }
  };
  A.BatchedStreamController__hasEventOrTimeOut_closure.prototype = {
    call$0() {
      return true;
    },
    $signature: 31
  };
  A.BatchedStreamController__hasEventDuring_closure.prototype = {
    call$0() {
      return false;
    },
    $signature: 31
  };
  A.SocketClient.prototype = {};
  A.SseSocketClient.prototype = {
    get$sink() {
      var t1 = this._sockets$_client._outgoingController;
      return new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>"));
    },
    get$stream(_) {
      var t1 = this._sockets$_client._incomingController;
      return new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>"));
    }
  };
  A.WebSocketClient.prototype = {
    get$sink() {
      var t2,
        t1 = this._channel,
        value = t1.__HtmlWebSocketChannel_sink_FI;
      if (value === $) {
        t2 = t1._html$_controller.__StreamChannelController__foreign_F;
        t2 === $ && A.throwLateFieldNI("_foreign");
        t2 = t2.__GuaranteeChannel__sink_F;
        t2 === $ && A.throwLateFieldNI("_sink");
        value !== $ && A.throwLateFieldADI("sink");
        value = t1.__HtmlWebSocketChannel_sink_FI = new A._HtmlWebSocketSink(t1, t2);
      }
      return value;
    },
    get$stream(_) {
      var t2,
        t1 = this._channel._html$_controller.__StreamChannelController__foreign_F;
      t1 === $ && A.throwLateFieldNI("_foreign");
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t2 = A._instanceType(t1)._eval$1("_ControllerStream<1>");
      return new A._MapStream(t2._eval$1("String(Stream.T)")._as(new A.WebSocketClient_stream_closure()), new A._ControllerStream(t1, t2), t2._eval$1("_MapStream<Stream.T,String>"));
    }
  };
  A.WebSocketClient_stream_closure.prototype = {
    call$1(o) {
      return J.toString$0$(o);
    },
    $signature: 59
  };
  A.safeUnawaited_closure.prototype = {
    call$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      return $.$get$_logger().log$4(B.Level_WARNING_900, "Error in unawaited Future:", error, stackTrace);
    },
    $signature: 19
  };
  A.Int32.prototype = {
    _toInt$1(val) {
      if (val instanceof A.Int32)
        return val._i;
      else if (A._isInt(val))
        return val;
      throw A.wrapException(A.ArgumentError$value(val, "other", "Not an int, Int32 or Int64"));
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (other instanceof A.Int32)
        return this._i === other._i;
      else if (other instanceof A.Int64)
        return A.Int64_Int64(this._i).$eq(0, other);
      else if (A._isInt(other))
        return this._i === other;
      return false;
    },
    compareTo$1(_, other) {
      if (other instanceof A.Int64)
        return A.Int64_Int64(this._i)._compareTo$1(other);
      return B.JSInt_methods.compareTo$1(this._i, this._toInt$1(other));
    },
    get$hashCode(_) {
      return this._i;
    },
    toString$0(_) {
      return B.JSInt_methods.toString$0(this._i);
    },
    $isComparable: 1
  };
  A.Int64.prototype = {
    $eq(_, other) {
      var o, _this = this;
      if (other == null)
        return false;
      if (other instanceof A.Int64)
        o = other;
      else if (A._isInt(other)) {
        if (_this._h === 0 && _this._m === 0)
          return _this._l === other;
        if ((other & 4194303) === other)
          return false;
        o = A.Int64_Int64(other);
      } else
        o = other instanceof A.Int32 ? A.Int64_Int64(other._i) : null;
      if (o != null)
        return _this._l === o._l && _this._m === o._m && _this._h === o._h;
      return false;
    },
    compareTo$1(_, other) {
      return this._compareTo$1(other);
    },
    _compareTo$1(other) {
      var o = A.Int64__promote(other),
        t1 = this._h,
        signa = t1 >>> 19,
        t2 = o._h;
      if (signa !== t2 >>> 19)
        return signa === 0 ? 1 : -1;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._m;
      t2 = o._m;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._l;
      t2 = o._l;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      return 0;
    },
    get$hashCode(_) {
      var t1 = this._m;
      return (((t1 & 1023) << 22 | this._l) ^ (this._h << 12 | t1 >>> 10 & 4095)) >>> 0;
    },
    toString$0(_) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(10, d0, d1, d2, sign);
    },
    _toRadixString$1(radix) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign);
    },
    $isComparable: 1
  };
  A._StackState.prototype = {};
  A.Level.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Level && this.value === other.value;
    },
    compareTo$1(_, other) {
      return this.value - type$.Level._as(other).value;
    },
    get$hashCode(_) {
      return this.value;
    },
    toString$0(_) {
      return this.name;
    },
    $isComparable: 1
  };
  A.LogRecord.prototype = {
    toString$0(_) {
      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
    }
  };
  A.Logger.prototype = {
    get$fullName() {
      var t1 = this.parent,
        t2 = t1 == null ? null : t1.name.length !== 0,
        t3 = this.name;
      return t2 === true ? t1.get$fullName() + "." + t3 : t3;
    },
    get$level(_) {
      var t1, effectiveLevel;
      if (this.parent == null) {
        t1 = this._level;
        t1.toString;
        effectiveLevel = t1;
      } else {
        t1 = $.$get$Logger_root()._level;
        t1.toString;
        effectiveLevel = t1;
      }
      return effectiveLevel;
    },
    log$4(logLevel, message, error, stackTrace) {
      var record, _this = this,
        t1 = logLevel.value;
      if (t1 >= _this.get$level(_this).value) {
        if (stackTrace == null && t1 >= 2000) {
          A.StackTrace_current();
          if (error == null)
            logLevel.toString$0(0);
        }
        t1 = _this.get$fullName();
        Date.now();
        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
        record = new A.LogRecord(logLevel, message, t1);
        if (_this.parent == null)
          _this._publish$1(record);
        else
          $.$get$Logger_root()._publish$1(record);
      }
    },
    _publish$1(record) {
      return null;
    }
  };
  A.Logger_Logger_closure.prototype = {
    call$0() {
      var dot, $parent, t1,
        thisName = this.name;
      if (B.JSString_methods.startsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't start with a '.'", null));
      if (B.JSString_methods.endsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't end with a '.'", null));
      dot = B.JSString_methods.lastIndexOf$1(thisName, ".");
      if (dot === -1)
        $parent = thisName !== "" ? A.Logger_Logger("") : null;
      else {
        $parent = A.Logger_Logger(B.JSString_methods.substring$2(thisName, 0, dot));
        thisName = B.JSString_methods.substring$1(thisName, dot + 1);
      }
      t1 = new A.Logger(thisName, $parent, A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger));
      if ($parent == null)
        t1._level = B.Level_INFO_800;
      else
        $parent._children.$indexSet(0, thisName, t1);
      return t1;
    },
    $signature: 60
  };
  A.Pool.prototype = {
    request$0(_) {
      var t1, t2, _this = this;
      if ((_this._closeMemo._async_memoizer$_completer.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("request() may not be called on a closed Pool."));
      t1 = _this._allocatedResources;
      if (t1 < _this._maxAllocatedResources) {
        _this._allocatedResources = t1 + 1;
        return A.Future_Future$value(new A.PoolResource(_this), type$.PoolResource);
      } else {
        t1 = _this._onReleaseCallbacks;
        if (!t1.get$isEmpty(t1))
          return _this._runOnRelease$1(t1.removeFirst$0());
        else {
          t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
          t2 = _this._requestedResources;
          t2._collection$_add$1(0, t2.$ti._precomputed1._as(new A._AsyncCompleter(t1, type$._AsyncCompleter_PoolResource)));
          _this._resetTimer$0();
          return t1;
        }
      }
    },
    withResource$1$1(callback, $T) {
      return this.withResource$body$Pool($T._eval$1("0/()")._as(callback), $T, $T);
    },
    withResource$body$Pool(callback, $T, $async$type) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter($async$type),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, resource, t1, t2;
      var $async$withResource$1$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (($async$self._closeMemo._async_memoizer$_completer.future._state & 30) !== 0)
                throw A.wrapException(A.StateError$("withResource() may not be called on a closed Pool."));
              $async$goto = 3;
              return A._asyncAwait($async$self.request$0(0), $async$withResource$1$1);
            case 3:
              // returning from await.
              resource = $async$result;
              $async$handler = 4;
              t1 = callback.call$0();
              $async$goto = 7;
              return A._asyncAwait($T._eval$1("Future<0>")._is(t1) ? t1 : A._Future$value($T._as(t1), $T), $async$withResource$1$1);
            case 7:
              // returning from await.
              t1 = $async$result;
              $async$returnValue = t1;
              $async$next = [1];
              // goto finally
              $async$goto = 5;
              break;
              $async$next.push(6);
              // goto finally
              $async$goto = 5;
              break;
            case 4:
              // uncaught
              $async$next = [2];
            case 5:
              // finally
              $async$handler = 2;
              t1 = resource;
              if (t1._released)
                A.throwExpression(A.StateError$("A PoolResource may only be released once."));
              t1._released = true;
              t1 = t1._pool;
              t1._resetTimer$0();
              t2 = t1._requestedResources;
              if (!t2.get$isEmpty(t2))
                t2.removeFirst$0().complete$1(0, new A.PoolResource(t1));
              else {
                t2 = --t1._allocatedResources;
                if ((t1._closeMemo._async_memoizer$_completer.future._state & 30) !== 0 && t2 === 0)
                  null.close$0(0);
              }
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 6:
              // after finally
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$withResource$1$1, $async$completer);
    },
    _runOnRelease$1(onRelease) {
      var t1, t2;
      A.Future_Future$sync(type$.dynamic_Function._as(onRelease), type$.dynamic).then$1$1(0, new A.Pool__runOnRelease_closure(this), type$.Null).catchError$1(new A.Pool__runOnRelease_closure0(this));
      t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
      t2 = this._onReleaseCompleters;
      t2._collection$_add$1(0, t2.$ti._precomputed1._as(new A._SyncCompleter(t1, type$._SyncCompleter_PoolResource)));
      return t1;
    },
    _resetTimer$0() {
      var t2,
        t1 = this._timer;
      if (t1 == null)
        return;
      t2 = this._requestedResources;
      if (t2._head === t2._tail)
        t1._restartable_timer$_timer.cancel$0(0);
      else {
        t1._restartable_timer$_timer.cancel$0(0);
        t1._restartable_timer$_timer = A.Timer_Timer(t1._restartable_timer$_duration, t1._callback);
      }
    }
  };
  A.Pool__runOnRelease_closure.prototype = {
    call$1(value) {
      var t1 = this.$this;
      J.complete$1$z(t1._onReleaseCompleters.removeFirst$0(), new A.PoolResource(t1));
    },
    $signature: 6
  };
  A.Pool__runOnRelease_closure0.prototype = {
    call$2(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      this.$this._onReleaseCompleters.removeFirst$0().completeError$2(error, stackTrace);
    },
    $signature: 8
  };
  A.PoolResource.prototype = {};
  A.SseClient.prototype = {
    SseClient$2$debugKey(serverUrl, debugKey) {
      var t2, _this = this,
        t1 = serverUrl + "?sseClientId=" + _this._clientId;
      _this.__SseClient__serverUrl_A = t1;
      t2 = type$.JavaScriptObject;
      t1 = t2._as(new self.EventSource(t1, t2._as({withCredentials: true})));
      _this.__SseClient__eventSource_A = t1;
      t1 = new A._EventStream(t1, "open", false, type$._EventStream_JavaScriptObject);
      t1.get$first(t1).whenComplete$1(new A.SseClient_closure(_this));
      t1 = type$.Function;
      _this.__SseClient__eventSource_A.addEventListener("message", A.allowInterop(_this.get$_onIncomingMessage(), t1));
      _this.__SseClient__eventSource_A.addEventListener("control", A.allowInterop(_this.get$_onIncomingControlMessage(), t1));
      t1 = type$.nullable_void_Function_JavaScriptObject;
      A._EventStreamSubscription$0(_this.__SseClient__eventSource_A, "open", t1._as(new A.SseClient_closure0(_this)), false, t2);
      A._EventStreamSubscription$0(_this.__SseClient__eventSource_A, "error", t1._as(new A.SseClient_closure1(_this)), false, t2);
    },
    close$0(_) {
      var _this = this,
        t1 = _this.__SseClient__eventSource_A;
      t1 === $ && A.throwLateFieldNI("_eventSource");
      t1.close();
      if ((_this._onConnected.future._state & 30) === 0) {
        t1 = _this._outgoingController;
        new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$cancelOnError(null, true).asFuture$1$1(null, type$.void);
      }
      _this._incomingController.close$0(0);
      _this._outgoingController.close$0(0);
    },
    _closeWithError$1(error) {
      var t1;
      this._incomingController.addError$1(error);
      this.close$0(0);
      t1 = this._onConnected;
      if ((t1.future._state & 30) === 0)
        t1.completeError$1(error);
    },
    _onIncomingControlMessage$1(message) {
      var data = type$.JavaScriptObject._as(message).data;
      if (J.$eq$(A.dartify(data), "close"))
        this.close$0(0);
      else
        throw A.wrapException(A.UnsupportedError$("[" + this._clientId + '] Illegal Control Message "' + A.S(data) + '"'));
    },
    _onIncomingMessage$1(message) {
      this._incomingController.add$1(0, A._asString(B.C_JsonCodec.decode$2$reviver(0, A._asString(type$.JavaScriptObject._as(message).data), null)));
    },
    _onOutgoingDone$0() {
      this.close$0(0);
    },
    _onOutgoingMessage$1(message) {
      return this._onOutgoingMessage$body$SseClient(A._asStringQ(message));
    },
    _onOutgoingMessage$body$SseClient(message) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.dynamic),
        $async$self = this, t1;
      var $async$_onOutgoingMessage$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = {};
              t1.encodedMessage = null;
              $async$goto = 2;
              return A._asyncAwait($.$get$_requestPool().withResource$1$1(new A.SseClient__onOutgoingMessage_closure(t1, $async$self, message), type$.Null), $async$_onOutgoingMessage$1);
            case 2:
              // returning from await.
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
    }
  };
  A.SseClient_closure.prototype = {
    call$0() {
      var t2,
        t1 = this.$this;
      t1._onConnected.complete$0(0);
      t2 = t1._outgoingController;
      new A._ControllerStream(t2, A._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$2$onDone(t1.get$_onOutgoingMessage(), t1.get$_onOutgoingDone());
    },
    $signature: 4
  };
  A.SseClient_closure0.prototype = {
    call$1(_) {
      var t1 = this.$this._errorTimer;
      if (t1 != null)
        t1.cancel$0(0);
    },
    $signature: 3
  };
  A.SseClient_closure1.prototype = {
    call$1(error) {
      var t1 = this.$this,
        t2 = t1._errorTimer;
      t2 = t2 == null ? null : t2.get$isActive();
      if (t2 !== true)
        t1._errorTimer = A.Timer_Timer(B.Duration_5000000, new A.SseClient__closure(t1, error));
    },
    $signature: 3
  };
  A.SseClient__closure.prototype = {
    call$0() {
      this.$this._closeWithError$1(this.error);
    },
    $signature: 0
  };
  A.SseClient__onOutgoingMessage_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$handler = 1, $async$currentError, $async$self = this, e, e0, url, error, augmentedError, exception, t1, t2, $async$exception;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              try {
                $async$self._box_0.encodedMessage = B.C_JsonCodec.encode$2$toEncodable($async$self.message, null);
              } catch (exception) {
                t1 = A.unwrapException(exception);
                if (t1 instanceof A.JsonUnsupportedObjectError) {
                  e = t1;
                  t1 = $async$self.$this;
                  t1._logger.log$4(B.Level_WARNING_900, "[" + t1._clientId + "] Unable to encode outgoing message: " + A.S(e), null, null);
                } else if (t1 instanceof A.ArgumentError) {
                  e0 = t1;
                  t1 = $async$self.$this;
                  t1._logger.log$4(B.Level_WARNING_900, "[" + t1._clientId + "] Invalid argument: " + A.S(e0), null, null);
                } else
                  throw exception;
              }
              $async$handler = 3;
              t1 = $async$self.$this;
              t2 = t1.__SseClient__serverUrl_A;
              t2 === $ && A.throwLateFieldNI("_serverUrl");
              url = t2 + "&messageId=" + ++t1._lastMessageId;
              t1 = $async$self._box_0.encodedMessage;
              if (t1 == null)
                t1 = null;
              t2 = type$.JavaScriptObject;
              t1 = t2._as({method: "POST", body: t1, credentials: "include"});
              $async$goto = 6;
              return A._asyncAwait(A.promiseToFuture(type$.JSObject._as(t2._as(self.window).fetch(url, t1)), type$.nullable_Object), $async$call$0);
            case 6:
              // returning from await.
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$currentError;
              error = A.unwrapException($async$exception);
              t1 = $async$self.$this;
              augmentedError = "[" + t1._clientId + "] SSE client failed to send " + A.S($async$self.message) + ":\n " + A.S(error);
              t1._logger.log$4(B.Level_SEVERE_1000, augmentedError, null, null);
              t1._closeWithError$1(augmentedError);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 28
  };
  A.generateUuidV4_generateBits.prototype = {
    call$1(bitCount) {
      return this.random.nextInt$1(B.JSInt_methods._shlPositive$1(1, bitCount));
    },
    $signature: 23
  };
  A.generateUuidV4_printDigits.prototype = {
    call$2(value, count) {
      return B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(value, 16), count, "0");
    },
    $signature: 35
  };
  A.generateUuidV4_bitsDigits.prototype = {
    call$2(bitCount, digitCount) {
      return this.printDigits.call$2(this.generateBits.call$1(bitCount), digitCount);
    },
    $signature: 35
  };
  A.GuaranteeChannel.prototype = {
    GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, _box_0, $T) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_GuaranteeSink<1>")._as(new A._GuaranteeSink(innerSink, _this, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>")));
      _this.__GuaranteeChannel__sink_F !== $ && A.throwLateFieldAI("_sink");
      _this.set$__GuaranteeChannel__sink_F(t2);
      t1 = t1._eval$1("StreamController<1>")._as(A.StreamController_StreamController(null, new A.GuaranteeChannel_closure(_box_0, _this, $T), true, $T));
      _this.__GuaranteeChannel__streamController_F !== $ && A.throwLateFieldAI("_streamController");
      _this.set$__GuaranteeChannel__streamController_F(t1);
    },
    _onSinkDisconnected$0() {
      var subscription, t1;
      this._disconnected = true;
      subscription = this._guarantee_channel$_subscription;
      if (subscription != null)
        subscription.cancel$0(0);
      t1 = this.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t1.close$0(0);
    },
    set$__GuaranteeChannel__sink_F(__GuaranteeChannel__sink_F) {
      this.__GuaranteeChannel__sink_F = this.$ti._eval$1("_GuaranteeSink<1>")._as(__GuaranteeChannel__sink_F);
    },
    set$__GuaranteeChannel__streamController_F(__GuaranteeChannel__streamController_F) {
      this.__GuaranteeChannel__streamController_F = this.$ti._eval$1("StreamController<1>")._as(__GuaranteeChannel__streamController_F);
    },
    set$_guarantee_channel$_subscription(_subscription) {
      this._guarantee_channel$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A.GuaranteeChannel_closure.prototype = {
    call$0() {
      var t2, t3,
        t1 = this.$this;
      if (t1._disconnected)
        return;
      t2 = this._box_0.innerStream;
      t3 = t1.__GuaranteeChannel__streamController_F;
      t3 === $ && A.throwLateFieldNI("_streamController");
      t1.set$_guarantee_channel$_subscription(t2.listen$3$onDone$onError(this.T._eval$1("~(0)")._as(t3.get$add(t3)), new A.GuaranteeChannel__closure(t1), t3.get$addError()));
    },
    $signature: 0
  };
  A.GuaranteeChannel__closure.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1.__GuaranteeChannel__sink_F;
      t2 === $ && A.throwLateFieldNI("_sink");
      t2._onStreamDisconnected$0();
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t1.close$0(0);
    },
    $signature: 0
  };
  A._GuaranteeSink.prototype = {
    add$1(_, data) {
      var t1, _this = this;
      _this.$ti._precomputed1._as(data);
      if (_this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (_this._disconnected)
        return;
      t1 = _this._inner;
      t1._async$_target.add$1(0, t1.$ti._precomputed1._as(data));
    },
    addError$2(error, stackTrace) {
      if (this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (this._disconnected)
        return;
      this._guarantee_channel$_addError$2(error, stackTrace);
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    _guarantee_channel$_addError$2(error, stackTrace) {
      var _this = this;
      if (_this._allowErrors) {
        _this._inner._async$_target.addError$2(error, stackTrace);
        return;
      }
      _this._doneCompleter.completeError$2(error, stackTrace);
      _this._onStreamDisconnected$0();
      _this._guarantee_channel$_channel._onSinkDisconnected$0();
      _this._inner._async$_target.close$0(0).catchError$1(new A._GuaranteeSink__addError_closure());
    },
    close$0(_) {
      var _this = this;
      if (_this._closed)
        return _this._doneCompleter.future;
      _this._closed = true;
      if (!_this._disconnected) {
        _this._guarantee_channel$_channel._onSinkDisconnected$0();
        _this._doneCompleter.complete$1(0, _this._inner._async$_target.close$0(0));
      }
      return _this._doneCompleter.future;
    },
    _onStreamDisconnected$0() {
      this._disconnected = true;
      var t1 = this._doneCompleter;
      if ((t1.future._state & 30) === 0)
        t1.complete$0(0);
      return;
    },
    $isStreamSink: 1
  };
  A._GuaranteeSink__addError_closure.prototype = {
    call$1(_) {
    },
    $signature: 6
  };
  A.StreamChannelController.prototype = {
    set$__StreamChannelController__local_F(__StreamChannelController__local_F) {
      this.__StreamChannelController__local_F = this.$ti._eval$1("StreamChannel<1>")._as(__StreamChannelController__local_F);
    },
    set$__StreamChannelController__foreign_F(__StreamChannelController__foreign_F) {
      this.__StreamChannelController__foreign_F = this.$ti._eval$1("StreamChannel<1>")._as(__StreamChannelController__foreign_F);
    }
  };
  A.StreamChannelMixin.prototype = {$isStreamChannel: 1};
  A.Uuid.prototype = {
    get$_uuid$_state() {
      var t2, t3,
        t1 = $.$get$Uuid__stateExpando();
      A.Expando__checkType(this);
      t2 = t1._jsWeakMap;
      t3 = t2.get(this);
      if (t3 == null) {
        t3 = A.LinkedHashMap_LinkedHashMap$_literal(["seedBytes", null, "node", null, "clockSeq", null, "mSecs", 0, "nSecs", 0, "hasInitV1", false, "hasInitV4", false], type$.String, type$.dynamic);
        t1.$ti._eval$1("1?")._as(t3);
        t2.set(this, t3);
        t1 = t3;
      } else
        t1 = t3;
      return t1;
    },
    v1$0() {
      var seedBytes, nodeId, t2, t3, t4, clockSeq, mSecs, nSecs, tl, tmh, node, n, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, _this = this,
        _s9_ = "hasInitV1",
        _s9_0 = "seedBytes",
        _s4_ = "node",
        _s8_ = "clockSeq",
        _s5_ = "mSecs", _s5_0 = "nSecs",
        buf = new Uint8Array(16),
        options = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic),
        t1 = J.$index$asx(_this.get$_uuid$_state(), _s9_);
      t1.toString;
      if (!A._asBool(t1)) {
        seedBytes = A.UuidUtil_mathRNG();
        if (J.$index$asx(_this.get$_uuid$_state(), _s9_0) != null)
          J.$index$asx(_this.get$_uuid$_state(), _s9_0);
        else
          J.$indexSet$ax(_this.get$_uuid$_state(), _s9_0, seedBytes);
        nodeId = A._setArrayType([seedBytes[0] | 1, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]], type$.JSArray_int);
        if (J.$index$asx(_this.get$_uuid$_state(), _s4_) != null)
          J.$index$asx(_this.get$_uuid$_state(), _s4_);
        else
          J.$indexSet$ax(_this.get$_uuid$_state(), _s4_, nodeId);
        t1 = seedBytes[6];
        t2 = seedBytes[7];
        t3 = _this.get$_uuid$_state();
        t4 = J.getInterceptor$asx(t3);
        if (t4.$index(t3, _s8_) == null)
          t4.$indexSet(t3, _s8_, (t1 << 8 | t2) & 262143);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s5_, 0);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s5_0, 0);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s9_, true);
      }
      options.$index(0, _s8_);
      clockSeq = A._asInt(J.$index$asx(_this.get$_uuid$_state(), _s8_));
      options.$index(0, _s5_);
      mSecs = Date.now();
      options.$index(0, _s5_0);
      t1 = J.$index$asx(_this.get$_uuid$_state(), _s5_0);
      t1.toString;
      nSecs = A._asInt(t1) + 1;
      t1 = mSecs - A._asNum(J.$index$asx(_this.get$_uuid$_state(), _s5_)) + (nSecs - A._asNum(J.$index$asx(_this.get$_uuid$_state(), _s5_0))) / 10000 < 0;
      if (t1) {
        options.$index(0, _s8_);
        t2 = true;
      } else
        t2 = false;
      if (t2)
        clockSeq = clockSeq + 1 & 16383;
      if (t1 || mSecs > A._asNum(J.$index$asx(_this.get$_uuid$_state(), _s5_))) {
        options.$index(0, _s5_0);
        t1 = true;
      } else
        t1 = false;
      if (t1)
        nSecs = 0;
      if (nSecs >= 10000)
        throw A.wrapException(A.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
      J.$indexSet$ax(_this.get$_uuid$_state(), _s5_, mSecs);
      J.$indexSet$ax(_this.get$_uuid$_state(), _s5_0, nSecs);
      J.$indexSet$ax(_this.get$_uuid$_state(), _s8_, clockSeq);
      mSecs += 122192928e5;
      tl = B.JSInt_methods.$mod((mSecs & 268435455) * 10000 + nSecs, 4294967296);
      buf[0] = B.JSInt_methods._shrOtherPositive$1(tl, 24) & 255;
      buf[1] = B.JSInt_methods._shrOtherPositive$1(tl, 16) & 255;
      buf[2] = B.JSInt_methods._shrOtherPositive$1(tl, 8) & 255;
      buf[3] = tl & 255;
      tmh = B.JSNumber_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
      buf[4] = tmh >>> 8 & 255;
      buf[5] = tmh & 255;
      buf[6] = tmh >>> 24 & 15 | 16;
      buf[7] = tmh >>> 16 & 255;
      buf[8] = clockSeq >>> 8 & 63 | 128;
      buf[9] = clockSeq & 255;
      options.$index(0, _s4_);
      node = type$.List_dynamic._as(J.$index$asx(_this.get$_uuid$_state(), _s4_));
      for (t1 = J.getInterceptor$asx(node), n = 0; n < 6; ++n)
        buf[10 + n] = A._asInt(t1.$index(node, n));
      t1 = $.$get$Uuid__byteToHex();
      t2 = buf[0];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t1[t2];
      t3 = buf[1];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t1[t3];
      t4 = buf[2];
      if (!(t4 < 256))
        return A.ioore(t1, t4);
      t4 = t1[t4];
      t5 = buf[3];
      if (!(t5 < 256))
        return A.ioore(t1, t5);
      t5 = t1[t5];
      t6 = buf[4];
      if (!(t6 < 256))
        return A.ioore(t1, t6);
      t6 = t1[t6];
      t7 = buf[5];
      if (!(t7 < 256))
        return A.ioore(t1, t7);
      t7 = t1[t7];
      t8 = buf[6];
      if (!(t8 < 256))
        return A.ioore(t1, t8);
      t8 = t1[t8];
      t9 = buf[7];
      if (!(t9 < 256))
        return A.ioore(t1, t9);
      t9 = t1[t9];
      t10 = buf[8];
      if (!(t10 < 256))
        return A.ioore(t1, t10);
      t10 = t1[t10];
      t11 = buf[9];
      if (!(t11 < 256))
        return A.ioore(t1, t11);
      t11 = t1[t11];
      t12 = buf[10];
      if (!(t12 < 256))
        return A.ioore(t1, t12);
      t12 = t1[t12];
      t13 = buf[11];
      if (!(t13 < 256))
        return A.ioore(t1, t13);
      t13 = t1[t13];
      t14 = buf[12];
      if (!(t14 < 256))
        return A.ioore(t1, t14);
      t14 = t1[t14];
      t15 = buf[13];
      if (!(t15 < 256))
        return A.ioore(t1, t15);
      t15 = t1[t15];
      t16 = buf[14];
      if (!(t16 < 256))
        return A.ioore(t1, t16);
      t16 = t1[t16];
      t17 = buf[15];
      if (!(t17 < 256))
        return A.ioore(t1, t17);
      return t2 + t3 + t4 + t5 + "-" + t6 + t7 + "-" + t8 + t9 + "-" + t10 + t11 + "-" + t12 + t13 + t14 + t15 + t16 + t1[t17];
    }
  };
  A.EventStreamProvider0.prototype = {};
  A._EventStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return A._EventStreamSubscription$0(this._streams$_target, this._streams$_eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._EventStreamSubscription0.prototype = {
    cancel$0(_) {
      var _this = this,
        emptyFuture = A.Future_Future$value(null, type$.void);
      if (_this._streams$_target == null)
        return emptyFuture;
      _this._streams$_unlisten$0();
      _this._streams$_onData = _this._streams$_target = null;
      return emptyFuture;
    },
    onData$1(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._streams$_target == null)
        throw A.wrapException(A.StateError$("Subscription has been canceled."));
      _this._streams$_unlisten$0();
      t1 = A._wrapZone0(new A._EventStreamSubscription_onData_closure(handleData), type$.JavaScriptObject);
      t1 = t1 == null ? null : A.allowInterop(t1, type$.Function);
      _this._streams$_onData = t1;
      _this._streams$_tryResume$0();
    },
    pause$0(_) {
      if (this._streams$_target == null)
        return;
      ++this._streams$_pauseCount;
      this._streams$_unlisten$0();
    },
    resume$0(_) {
      var _this = this;
      if (_this._streams$_target == null || _this._streams$_pauseCount <= 0)
        return;
      --_this._streams$_pauseCount;
      _this._streams$_tryResume$0();
    },
    _streams$_tryResume$0() {
      var _this = this,
        t1 = _this._streams$_onData;
      if (t1 != null && _this._streams$_pauseCount <= 0)
        _this._streams$_target.addEventListener(_this._streams$_eventType, t1, false);
    },
    _streams$_unlisten$0() {
      var t1 = this._streams$_onData;
      if (t1 != null)
        this._streams$_target.removeEventListener(this._streams$_eventType, t1, false);
    },
    $isStreamSubscription: 1
  };
  A._EventStreamSubscription_closure0.prototype = {
    call$1(e) {
      return this.onData.call$1(type$.JavaScriptObject._as(e));
    },
    $signature: 3
  };
  A._EventStreamSubscription_onData_closure.prototype = {
    call$1(e) {
      return this.handleData.call$1(type$.JavaScriptObject._as(e));
    },
    $signature: 3
  };
  A.HtmlWebSocketChannel.prototype = {
    HtmlWebSocketChannel$1(webSocket) {
      var _this = this,
        t1 = _this.__HtmlWebSocketChannel__readyCompleter_A = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_void), type$._AsyncCompleter_void),
        t2 = _this.innerWebSocket,
        t3 = A._asInt(t2.readyState),
        t4 = self;
      if (t3 === A._asInt(t4.WebSocket.OPEN)) {
        t1.complete$0(0);
        _this._listen$0();
      } else {
        if (A._asInt(t2.readyState) === A._asInt(t4.WebSocket.CLOSING) || A._asInt(t2.readyState) === A._asInt(t4.WebSocket.CLOSED))
          t1.completeError$1(new A.WebSocketChannelException("WebSocket state error: " + A._asInt(t2.readyState)));
        t1 = new A._EventStream(t2, "open", false, type$._EventStream_JavaScriptObject);
        t1.get$first(t1).then$1$1(0, new A.HtmlWebSocketChannel_closure(_this), type$.Null);
      }
      t1 = type$._EventStream_JavaScriptObject;
      t3 = new A._EventStream(t2, "error", false, t1);
      t4 = type$.Null;
      t3.get$first(t3).then$1$1(0, new A.HtmlWebSocketChannel_closure0(_this), t4);
      A._EventStreamSubscription$0(t2, "message", type$.nullable_void_Function_JavaScriptObject._as(_this.get$_innerListen()), false, type$.JavaScriptObject);
      t1 = new A._EventStream(t2, "close", false, t1);
      t1.get$first(t1).then$1$1(0, new A.HtmlWebSocketChannel_closure1(_this), t4);
    },
    _innerListen$1($event) {
      var data, t1, $constructor,
        eventData = $event.data;
      if (typeof eventData === "string") {
        A._asString(eventData);
        data = eventData;
      } else {
        if (typeof eventData === "object") {
          t1 = type$.JSObject;
          t1._as(eventData);
          $constructor = type$.nullable_Function._as(t1._as(self).ArrayBuffer);
          t1 = $constructor != null && eventData instanceof $constructor;
        } else
          t1 = false;
        data = t1 ? A.NativeUint8List_NativeUint8List$view(type$.ByteBuffer._as(eventData), 0, null) : eventData;
      }
      t1 = this._html$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.add$1(0, data);
    },
    _listen$0() {
      var t1 = this._html$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$onDone(new A.HtmlWebSocketChannel__listen_closure(this), new A.HtmlWebSocketChannel__listen_closure0(this));
    },
    $isWebSocketChannel: 1
  };
  A.HtmlWebSocketChannel_closure.prototype = {
    call$1(_) {
      var t1, t2;
      type$.JavaScriptObject._as(_);
      t1 = this.$this;
      t2 = t1.__HtmlWebSocketChannel__readyCompleter_A;
      t2 === $ && A.throwLateFieldNI("_readyCompleter");
      t2.complete$0(0);
      t1._listen$0();
    },
    $signature: 17
  };
  A.HtmlWebSocketChannel_closure0.prototype = {
    call$1(_) {
      var error, t1, t2;
      type$.JavaScriptObject._as(_);
      error = new A.WebSocketChannelException("WebSocket connection failed.");
      t1 = this.$this;
      t2 = t1.__HtmlWebSocketChannel__readyCompleter_A;
      t2 === $ && A.throwLateFieldNI("_readyCompleter");
      if ((t2.future._state & 30) === 0)
        t2.completeError$1(error);
      t1 = t1._html$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t2 = t1.__GuaranteeChannel__sink_F;
      t2 === $ && A.throwLateFieldNI("_sink");
      t2.addError$1(error);
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.close$0(0);
    },
    $signature: 17
  };
  A.HtmlWebSocketChannel_closure1.prototype = {
    call$1($event) {
      var t1;
      type$.JavaScriptObject._as($event);
      A._asInt($event.code);
      A._asString($event.reason);
      t1 = this.$this._html$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.close$0(0);
    },
    $signature: 17
  };
  A.HtmlWebSocketChannel__listen_closure.prototype = {
    call$1(obj) {
      var t1;
      obj.toString;
      t1 = A.jsify(obj);
      t1.toString;
      return this.$this.innerWebSocket.send(t1);
    },
    $signature: 12
  };
  A.HtmlWebSocketChannel__listen_closure0.prototype = {
    call$0() {
      var closeCode, t2, closeReason,
        t1 = this.$this,
        _0_0 = new A._Record_2(t1._localCloseCode, t1._localCloseReason),
        _0_1 = A._InitializedCell$named("#0#1", new A.HtmlWebSocketChannel__listen__closure(_0_0)),
        _0_3 = A._InitializedCell$named("#0#3", new A.HtmlWebSocketChannel__listen__closure0(_0_0));
      if (_0_1._readFinal$0() != null) {
        closeCode = _0_1._readFinal$0();
        t2 = true;
      } else {
        closeCode = null;
        t2 = false;
      }
      if (t2)
        if (_0_3._readFinal$0() != null) {
          closeReason = _0_3._readFinal$0();
          t2 = true;
        } else {
          closeReason = null;
          t2 = false;
        }
      else {
        closeReason = null;
        t2 = false;
      }
      if (t2)
        t1.innerWebSocket.close(closeCode, closeReason);
      else
        t1.innerWebSocket.close();
    },
    $signature: 0
  };
  A.HtmlWebSocketChannel__listen__closure.prototype = {
    call$0() {
      return this._0_0._0;
    },
    $signature: 65
  };
  A.HtmlWebSocketChannel__listen__closure0.prototype = {
    call$0() {
      return this._0_0._1;
    },
    $signature: 66
  };
  A._HtmlWebSocketSink.prototype = {$isWebSocketSink: 1};
  A.WebSocketChannel.prototype = {};
  A.WebSocketChannelException.prototype = {
    toString$0(_) {
      return "WebSocketChannelException: " + this.message;
    }
  };
  A.main_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        uri, t1, t2, fixedPath, fixedUri, client, restarter, manager, t3, t4, debugEventController, t5;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (self.$dartAppInstanceId == null)
                self.$dartAppInstanceId = B.C_Uuid.v1$0();
              uri = A.Uri_parse(self.$dwdsDevHandlerPath);
              t1 = type$.Location;
              t2 = t1._as(window.location).protocol;
              t2.toString;
              if (t2 === "https:" && uri.get$scheme() === "http" && uri.get$host(uri) !== "localhost")
                uri = uri.replace$1$scheme(0, "https");
              else {
                t1 = t1._as(window.location).protocol;
                t1.toString;
                if (t1 === "wss:" && uri.get$scheme() === "ws" && uri.get$host(uri) !== "localhost")
                  uri = uri.replace$1$scheme(0, "wss");
              }
              fixedPath = uri.toString$0(0);
              fixedUri = A.Uri_parse(fixedPath);
              client = fixedUri.isScheme$1("ws") || fixedUri.isScheme$1("wss") ? new A.WebSocketClient(A.HtmlWebSocketChannel$connect(fixedUri, null)) : new A.SseSocketClient(A.SseClient$(fixedPath, "InjectedClient"));
              $async$goto = J.$eq$(self.$dartModuleStrategy, "require-js") ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = 5;
              return A._asyncAwait(A.RequireRestarter_create(), $async$call$0);
            case 5:
              // returning from await.
              restarter = $async$result;
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if (J.$eq$(self.$dartModuleStrategy, "legacy"))
                restarter = new A.LegacyRestarter();
              else
                throw A.wrapException(A.StateError$("Unknown module strategy: " + A.S(self.$dartModuleStrategy)));
            case 3:
              // join
              manager = new A.ReloadingManager(client, restarter);
              self.$dartHotRestartDwds = A.allowInterop(new A.main__closure(manager), type$.Promise_bool_Function_String);
              t1 = $.Zone__current;
              t2 = Math.max(100, 1);
              t3 = A.StreamController_StreamController(null, null, false, type$.DebugEvent);
              t4 = A.StreamController_StreamController(null, null, false, type$.List_DebugEvent);
              debugEventController = new A.BatchedStreamController(t2, 1000, t3, t4, new A._AsyncCompleter(new A._Future(t1, type$._Future_bool), type$._AsyncCompleter_bool), type$.BatchedStreamController_DebugEvent);
              t1 = A.List_List$filled(A.QueueList__computeInitialCapacity(null), null, false, type$.nullable_Result_DebugEvent);
              t2 = A.ListQueue$(type$._EventRequest_dynamic);
              t5 = type$.StreamQueue_DebugEvent;
              debugEventController.set$__BatchedStreamController__inputQueue_A(t5._as(new A.StreamQueue(new A._ControllerStream(t3, A._instanceType(t3)._eval$1("_ControllerStream<1>")), new A.QueueList(t1, 0, 0, type$.QueueList_Result_DebugEvent), t2, t5)));
              A.safeUnawaited(debugEventController._batchAndSendEvents$0());
              new A._ControllerStream(t4, A._instanceType(t4)._eval$1("_ControllerStream<1>")).listen$1(new A.main__closure0(client));
              self.$emitDebugEvent = A.allowInterop(new A.main__closure1(debugEventController), type$.void_Function_String_String);
              self.$emitRegisterEvent = A.allowInterop(new A.main__closure2(client), type$.void_Function_String);
              self.$launchDevTools = A.allowInterop(new A.main__closure3(client), type$.void_Function);
              client.get$stream(client).listen$2$onError(new A.main__closure4(manager), new A.main__closure5());
              if (A.boolConversionCheck(self.$dwdsEnableDevToolsLaunch)) {
                t1 = window;
                t1.toString;
                A._EventStreamSubscription$(t1, "keydown", type$.nullable_void_Function_KeyboardEvent._as(new A.main__closure6()), false, type$.KeyboardEvent);
              }
              t1 = window.navigator.vendor;
              t1.toString;
              if (B.JSString_methods.contains$1(t1, "Google")) {
                t1 = client.get$sink();
                t2 = $.$get$serializers();
                t3 = new A.ConnectRequestBuilder();
                type$.nullable_void_Function_ConnectRequestBuilder._as(new A.main__closure7()).call$1(t3);
                A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._build$0()), null), type$.dynamic);
              } else
                A.runMain();
              A._launchCommunicationWithDebugExtension();
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 101
  };
  A.main__closure.prototype = {
    call$1(runId) {
      return A.toPromise(this.manager.hotRestart$1$runId(A._asString(runId)), type$.bool);
    },
    $signature: 68
  };
  A.main__closure0.prototype = {
    call$1(events) {
      var t1, t2, t3;
      type$.List_DebugEvent._as(events);
      if (A.boolConversionCheck(self.$dartEmitDebugEvents)) {
        t1 = this.client.get$sink();
        t2 = $.$get$serializers();
        t3 = new A.BatchedDebugEventsBuilder();
        type$.nullable_void_Function_BatchedDebugEventsBuilder._as(new A.main___closure2(events)).call$1(t3);
        A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._debug_event$_build$0()), null), type$.dynamic);
      }
    },
    $signature: 69
  };
  A.main___closure2.prototype = {
    call$1(b) {
      var t1 = A.ListBuilder_ListBuilder(this.events, type$.DebugEvent);
      type$.nullable_ListBuilder_DebugEvent._as(t1);
      b.get$_debug_event$_$this().set$_events(t1);
      return t1;
    },
    $signature: 70
  };
  A.main__closure1.prototype = {
    call$2(kind, eventData) {
      var t1, t2;
      A._asString(kind);
      A._asString(eventData);
      if (A.boolConversionCheck(self.$dartEmitDebugEvents)) {
        t1 = this.debugEventController._inputController;
        t2 = new A.DebugEventBuilder();
        type$.nullable_void_Function_DebugEventBuilder._as(new A.main___closure1(kind, eventData)).call$1(t2);
        A._trySendEvent(new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>")), t2._debug_event$_build$0(), type$.DebugEvent);
      }
    },
    $signature: 18
  };
  A.main___closure1.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_debug_event$_$this()._timestamp = t1;
      b.get$_debug_event$_$this()._debug_event$_kind = this.kind;
      b.get$_debug_event$_$this()._eventData = this.eventData;
      return b;
    },
    $signature: 71
  };
  A.main__closure2.prototype = {
    call$1(eventData) {
      var t1, t2, t3;
      A._asString(eventData);
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.RegisterEventBuilder();
      type$.nullable_void_Function_RegisterEventBuilder._as(new A.main___closure0(eventData)).call$1(t3);
      A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._register_event$_build$0()), null), type$.dynamic);
    },
    $signature: 27
  };
  A.main___closure0.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_register_event$_$this()._register_event$_timestamp = t1;
      b.get$_register_event$_$this()._register_event$_eventData = this.eventData;
      return b;
    },
    $signature: 73
  };
  A.main__closure3.prototype = {
    call$0() {
      var t2, t3,
        t1 = window.navigator.vendor;
      t1.toString;
      if (!B.JSString_methods.contains$1(t1, "Google")) {
        t1 = window;
        t1.toString;
        B.Window_methods.alert$1(t1, "Dart DevTools is only supported on Chromium based browsers.");
        return;
      }
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.DevToolsRequestBuilder();
      type$.nullable_void_Function_DevToolsRequestBuilder._as(new A.main___closure()).call$1(t3);
      A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._devtools_request$_build$0()), null), type$.dynamic);
    },
    $signature: 0
  };
  A.main___closure.prototype = {
    call$1(b) {
      var t1 = A._asStringQ(self.$dartAppId);
      b.get$_devtools_request$_$this()._devtools_request$_appId = t1;
      t1 = A._asStringQ(self.$dartAppInstanceId);
      b.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
      return b;
    },
    $signature: 74
  };
  A.main__closure4.prototype = {
    call$1(serialized) {
      return this.$call$body$main__closure(A._asString(serialized));
    },
    $call$body$main__closure(serialized) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $alert, t1, win, t2, t3, $event;
      var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $event = $.$get$serializers().deserialize$1(B.C_JsonCodec.decode$2$reviver(0, serialized, null));
              $async$goto = $event instanceof A._$BuildResult ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.liveReload") ? 5 : 7;
              break;
            case 5:
              // then
              type$.Location._as(window.location).reload();
              // goto join
              $async$goto = 6;
              break;
            case 7:
              // else
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotRestart") ? 8 : 10;
              break;
            case 8:
              // then
              $async$goto = 11;
              return A._asyncAwait($async$self.manager.hotRestart$0(), $async$call$1);
            case 11:
              // returning from await.
              // goto join
              $async$goto = 9;
              break;
            case 10:
              // else
              if (J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotReload"))
                A.print("Hot reload is currently unsupported. Ignoring change.");
            case 9:
              // join
            case 6:
              // join
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if ($event instanceof A._$DevToolsResponse) {
                if (!$event.success) {
                  $alert = "DevTools failed to open with:\n" + A.S($event.error);
                  if ($event.promptExtension) {
                    t1 = window;
                    t1.toString;
                    t1 = B.Window_methods.confirm$1(t1, $alert);
                  } else
                    t1 = false;
                  if (t1) {
                    win = window.open("https://goo.gle/dart-debug-extension", "_blank");
                    A._DOMWindowCrossFrame__createSafe(win);
                  } else {
                    t1 = window;
                    t1.toString;
                    B.Window_methods.alert$1(t1, $alert);
                  }
                }
              } else if ($event instanceof A._$RunRequest)
                A.runMain();
              else if ($event instanceof A._$ErrorResponse) {
                window.toString;
                t1 = $event.error;
                t2 = $event.stackTrace;
                t3 = typeof console != "undefined";
                t3.toString;
                if (t3)
                  window.console.error("Error from backend:\n\nError: " + t1 + "\n\nStack Trace:\n" + t2);
              }
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 75
  };
  A.main__closure5.prototype = {
    call$1(error) {
    },
    $signature: 6
  };
  A.main__closure6.prototype = {
    call$1(e) {
      var t1;
      if (type$.KeyboardEvent._is(e))
        if (B.JSArray_methods.contains$1(B.List_er0, e.key)) {
          t1 = e.altKey;
          t1.toString;
          if (t1) {
            t1 = e.ctrlKey;
            t1.toString;
            if (!t1) {
              t1 = e.metaKey;
              t1.toString;
              t1 = !t1;
            } else
              t1 = false;
          } else
            t1 = false;
        } else
          t1 = false;
      else
        t1 = false;
      if (t1) {
        e.preventDefault();
        self.$launchDevTools.call$0();
      }
    },
    $signature: 14
  };
  A.main__closure7.prototype = {
    call$1(b) {
      var t1 = A._asStringQ(self.$dartAppId);
      b.get$_connect_request$_$this()._appId = t1;
      t1 = A._asStringQ(self.$dartAppInstanceId);
      b.get$_connect_request$_$this()._instanceId = t1;
      t1 = A._asStringQ(self.$dartEntrypointPath);
      b.get$_connect_request$_$this()._entrypointPath = t1;
      return b;
    },
    $signature: 76
  };
  A.main_closure0.prototype = {
    call$2(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      A.print("Unhandled error detected in the injected client.js script.\n\nYou can disable this script in webdev by passing --no-injected-client if it\nis preventing your app from loading, but note that this will also prevent\nall debugging and hot reload/restart functionality from working.\n\nThe original error is below, please file an issue at\nhttps://github.com/dart-lang/webdev/issues/new and attach this output:\n\n" + A.S(error) + "\n" + stackTrace.toString$0(0) + "\n");
    },
    $signature: 11
  };
  A._launchCommunicationWithDebugExtension_closure.prototype = {
    call$1(b) {
      var t2,
        t1 = A._asStringQ(self.$dartEntrypointPath);
      b.get$_$this()._appEntrypointPath = t1;
      t1 = window;
      t1.toString;
      t1 = A._asStringQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$dartAppId"));
      b.get$_$this()._debug_info$_appId = t1;
      t1 = A._asStringQ(self.$dartAppInstanceId);
      b.get$_$this()._appInstanceId = t1;
      t1 = type$.Location;
      t2 = B.Location_methods.get$origin(t1._as(window.location));
      b.get$_$this()._appOrigin = t2;
      t1 = t1._as(window.location).href;
      t1.toString;
      b.get$_$this()._appUrl = t1;
      t1 = A._authUrl();
      b.get$_$this()._authUrl = t1;
      t1 = window;
      t1.toString;
      t1 = A._asStringQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$dartExtensionUri"));
      b.get$_$this()._extensionUrl = t1;
      t1 = window;
      t1.toString;
      t1 = A._asBoolQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$isInternalBuild"));
      b.get$_$this()._isInternalBuild = t1;
      t1 = window;
      t1.toString;
      t1 = A._asBoolQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$isFlutterApp"));
      b.get$_$this()._isFlutterApp = t1;
      t1 = A._asStringQ(self.$dartWorkspaceName);
      b.get$_$this()._workspaceName = t1;
      return b;
    },
    $signature: 77
  };
  A._listenForDebugExtensionAuthRequest_closure.prototype = {
    call$1($event) {
      return this.$call$body$_listenForDebugExtensionAuthRequest_closure(type$.Event._as($event));
    },
    $call$body$_listenForDebugExtensionAuthRequest_closure($event) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$returnValue, t1, $async$temp1, $async$temp2, $async$temp3, $async$temp4;
      var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              type$.MessageEvent._as($event);
              if (typeof new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy($event.data, true) != "string") {
                // goto return
                $async$goto = 1;
                break;
              }
              if (A._asString(new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy($event.data, true)) !== "dart-auth-request") {
                // goto return
                $async$goto = 1;
                break;
              }
              $async$goto = A._authUrl() != null ? 3 : 4;
              break;
            case 3:
              // then
              t1 = A._authUrl();
              t1.toString;
              $async$temp1 = self.window.top.document;
              $async$temp2 = A;
              $async$temp3 = "dart-auth-response";
              $async$temp4 = A;
              $async$goto = 5;
              return A._asyncAwait(A._authenticateUser(t1), $async$call$1);
            case 5:
              // returning from await.
              $async$temp1.dispatchEvent($async$temp2.CustomEvent_CustomEvent($async$temp3, $async$temp4.S($async$result)));
            case 4:
              // join
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 78
  };
  A.LegacyRestarter.prototype = {
    restart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, t1, t2, dartLibrary;
      var $async$restart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              dartLibrary = type$.JsObject._as($.$get$_context().$index(0, "dart_library"));
              if (runId == null)
                dartLibrary.callMethod$1("reload");
              else {
                t1 = type$.String;
                t1 = A.LinkedHashMap_LinkedHashMap$_literal(["runId", runId], t1, t1);
                dartLibrary.callMethod$2("reload", [A._wrapToDart(A.JsObject__convertDataTree(t1))]);
              }
              t1 = new A._Future($.Zone__current, type$._Future_bool);
              t2 = window;
              t2.toString;
              $async$returnValue = t1.then$1$1(0, new A.LegacyRestarter_restart_closure(A._EventStreamSubscription$(t2, "message", type$.nullable_void_Function_MessageEvent._as(new A.LegacyRestarter_restart_closure0(new A._AsyncCompleter(t1, type$._AsyncCompleter_bool))), false, type$.MessageEvent)), type$.bool);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$1$runId, $async$completer);
    },
    $isRestarter: 1
  };
  A.LegacyRestarter_restart_closure0.prototype = {
    call$1($event) {
      var t1,
        message = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as($event).data, true);
      if (type$.Map_dynamic_dynamic._is(message)) {
        t1 = J.getInterceptor$asx(message);
        t1 = J.$eq$(t1.$index(message, "type"), "DDC_STATE_CHANGE") && J.$eq$(t1.$index(message, "state"), "restart_end");
      } else
        t1 = false;
      if (t1)
        this.reloadCompleter.complete$1(0, true);
    },
    $signature: 79
  };
  A.LegacyRestarter_restart_closure.prototype = {
    call$1(value) {
      A._asBool(value);
      this.sub.cancel$0(0);
      return value;
    },
    $signature: 80
  };
  A.ReloadingManager.prototype = {
    hotRestart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$self = this, result, t1, t2;
      var $async$hotRestart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._client.get$sink();
              t2 = $.$get$serializers();
              t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateExitBuilder()._isolate_events$_build$0()), null));
              $async$goto = 3;
              return A._asyncAwait($async$self._restarter.restart$1$runId(runId), $async$hotRestart$1$runId);
            case 3:
              // returning from await.
              result = $async$result;
              $async$self._afterRestart$1(result);
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotRestart$1$runId, $async$completer);
    },
    hotRestart$0() {
      return this.hotRestart$1$runId(null);
    },
    _afterRestart$1(succeeded) {
      var t1, t2;
      if (!succeeded)
        return;
      t1 = this._client.get$sink();
      t2 = $.$get$serializers();
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateStartBuilder()._isolate_events$_build$0()), null));
    }
  };
  A.Promise.prototype = {};
  A.toPromise_closure.prototype = {
    call$2(resolve, reject) {
      this.T._eval$1("~(0)")._as(resolve);
      type$.void_Function_dynamic._as(reject);
      this.future.then$1$1(0, resolve, type$.void).catchError$1(reject);
    },
    $signature() {
      return this.T._eval$1("~(~(0),~(@))");
    }
  };
  A.toFuture_closure.prototype = {
    call$1(e) {
      var t1 = e == null ? type$.Object._as(e) : e;
      return this.completer.completeError$2(t1, A.StackTrace_current());
    },
    $signature: 7
  };
  A.RequireLoader.prototype = {};
  A.HotReloadFailedException.prototype = {
    toString$0(_) {
      return "HotReloadFailedException: '" + this._s + "'";
    }
  };
  A.JsError.prototype = {};
  A.JsMap.prototype = {};
  A.RequireRestarter.prototype = {
    restart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$self = this, newDigests, modulesToLoad, t4, t5, t6, t7, line, toZone, t8, result, developer, t1, t2, t3;
      var $async$restart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              developer = self.$loadModuleConfig.call$1("dart_sdk").developer;
              t1 = developer == null;
              t2 = t1 ? type$.Object._as(developer) : developer;
              t3 = type$.Object;
              $async$goto = A._asBool(t3._as(t2._extensions).containsKey("ext.flutter.disassemble")) ? 3 : 4;
              break;
            case 3:
              // then
              t1 = t1 ? t3._as(developer) : developer;
              $async$goto = 5;
              return A._asyncAwait(A.toFuture(type$.Promise_void._as(t1.invokeExtension("ext.flutter.disassemble", "{}")), type$.void), $async$restart$1$runId);
            case 5:
              // returning from await.
            case 4:
              // join
              $async$goto = 6;
              return A._asyncAwait($async$self._getDigests$0(), $async$restart$1$runId);
            case 6:
              // returning from await.
              newDigests = $async$result;
              modulesToLoad = A._setArrayType([], type$.JSArray_String);
              for (t1 = J.getInterceptor$x(newDigests), t2 = J.get$iterator$ax(t1.get$keys(newDigests)), t4 = $.___lastKnownDigests.__late_helper$_name, t5 = type$.Location; t2.moveNext$0();) {
                t6 = t2.get$current(t2);
                t7 = $.___lastKnownDigests.__late_helper$_value;
                if (t7 === $.___lastKnownDigests)
                  A.throwExpression(A.LateError$fieldNI(t4));
                if (!J.containsKey$1$x(t7, t6)) {
                  line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + t6 + ".";
                  toZone = $.printToZone;
                  if (toZone == null)
                    A.printString(line);
                  else
                    toZone.call$1(line);
                  t5._as(window.location).reload();
                } else {
                  t7 = $.___lastKnownDigests.__late_helper$_value;
                  if (t7 === $.___lastKnownDigests)
                    A.throwExpression(A.LateError$fieldNI(t4));
                  if (!J.$eq$(J.$index$asx(t7, t6), t1.$index(newDigests, t6))) {
                    t7 = $.___lastKnownDigests.__late_helper$_value;
                    if (t7 === $.___lastKnownDigests)
                      A.throwExpression(A.LateError$fieldNI(t4));
                    t8 = t1.$index(newDigests, t6);
                    t8.toString;
                    J.$indexSet$ax(t7, t6, t8);
                    B.JSArray_methods.add$1(modulesToLoad, t6);
                  }
                }
              }
              $async$goto = modulesToLoad.length !== 0 ? 7 : 9;
              break;
            case 7:
              // then
              $async$self._updateGraph$0();
              $async$goto = 10;
              return A._asyncAwait($async$self._reload$1(modulesToLoad), $async$restart$1$runId);
            case 10:
              // returning from await.
              result = $async$result;
              // goto join
              $async$goto = 8;
              break;
            case 9:
              // else
              result = true;
            case 8:
              // join
              t3._as(self.$loadModuleConfig.call$1("dart_sdk").dart).hotRestart();
              A.runMain();
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$1$runId, $async$completer);
    },
    _getDigests$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Map_String_String),
        $async$returnValue, t1, $async$temp1, $async$temp2, $async$temp3;
      var $async$_getDigests$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.String;
              $async$temp1 = J;
              $async$temp2 = type$.Map_dynamic_dynamic;
              $async$temp3 = A;
              $async$goto = 3;
              return A._asyncAwait(A.HttpRequest_request(J.get$digestsPath$x(self.$requireLoader), "GET", "json", null), $async$_getDigests$0);
            case 3:
              // returning from await.
              $async$returnValue = $async$temp1.cast$2$0$ax($async$temp2._as($async$temp3._convertNativeToDart_XHR_Response($async$result.response)), t1, t1);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_getDigests$0, $async$completer);
    },
    _initialize$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $async$temp1;
      var $async$_initialize$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$temp1 = $.___lastKnownDigests;
              $async$goto = 2;
              return A._asyncAwait($async$self._getDigests$0(), $async$_initialize$0);
            case 2:
              // returning from await.
              $async$temp1.__late_helper$_value = $async$result;
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_initialize$0, $async$completer);
    },
    _moduleParents$1(module) {
      var t1;
      A._asString(module);
      t1 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), module);
      t1 = t1 == null ? null : J.cast$1$0$ax(t1, type$.String);
      return t1 == null ? A._setArrayType([], type$.JSArray_String) : t1;
    },
    _moduleTopologicalCompare$2(module1, module2) {
      var t1, order1, order2, t2, topological;
      A._asString(module1);
      A._asString(module2);
      t1 = this._moduleOrdering;
      order1 = t1.$index(0, module1);
      order2 = t1.$index(0, module2);
      t2 = order1 == null;
      if (t2 || order2 == null)
        throw A.wrapException(A.HotReloadFailedException$("Unable to fetch ordering info for module: " + (t2 ? module1 : module2)));
      t2 = t1.$index(0, module2);
      t2.toString;
      t1 = t1.$index(0, module1);
      t1.toString;
      topological = J.compareTo$1$ns(t2, t1);
      return topological === 0 ? B.JSString_methods.compareTo$1(module1, module2) : topological;
    },
    _reload$1(modules) {
      return this._reload$body$RequireRestarter(type$.List_String._as(modules));
    },
    _reload$body$RequireRestarter(modules) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$self = this, reloadedModules, previousModuleId, moduleId, parentIds, childModule, e, t2, t3, t4, t5, t6, exception, t1, $async$exception;
      var $async$_reload$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._running.future;
              $async$goto = (t1._state & 30) === 0 ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return A._asyncAwait(t1, $async$_reload$1);
            case 5:
              // returning from await.
              $async$returnValue = $async$result;
              // goto return
              $async$goto = 1;
              break;
            case 4:
              // join
              $async$self.set$_running(new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_bool), type$._AsyncCompleter_bool));
              reloadedModules = 0;
              $async$handler = 7;
              t1 = $async$self.__RequireRestarter__dirtyModules_A;
              t1 === $ && A.throwLateFieldNI("_dirtyModules");
              t1.addAll$1(0, modules);
              previousModuleId = null;
              t1 = $async$self.get$_moduleTopologicalCompare(), t2 = type$.String, t3 = type$.JSArray_String, t4 = type$.Object, t5 = type$.dynamic_Function;
            case 10:
              // for condition
              if (!(t6 = $async$self.__RequireRestarter__dirtyModules_A, t6._root != null)) {
                // goto after for
                $async$goto = 11;
                break;
              }
              if (t6._count === 0)
                A.throwExpression(A.IterableElementError_noElement());
              moduleId = t6.get$_collection$_first().key;
              $async$self.__RequireRestarter__dirtyModules_A.remove$1(0, moduleId);
              t6 = A._asString(moduleId);
              t6 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), t6);
              t6 = t6 == null ? null : J.cast$1$0$ax(t6, t2);
              parentIds = t6 == null ? A._setArrayType([], t3) : t6;
              $async$goto = J.get$isEmpty$asx(parentIds) ? 12 : 14;
              break;
            case 12:
              // then
              childModule = t4._as(self.$loadModuleConfig.call$1("dart_sdk").dart).getModuleLibraries(previousModuleId);
              self.$dartRunMain = A.allowInterop(new A.RequireRestarter__reload_closure(childModule), t5);
              // goto join
              $async$goto = 13;
              break;
            case 14:
              // else
              t6 = reloadedModules;
              if (typeof t6 !== "number") {
                $async$returnValue = t6.$add();
                // goto return
                $async$goto = 1;
                break;
              }
              reloadedModules = t6 + 1;
              $async$goto = 15;
              return A._asyncAwait($async$self._reloadModule$1(moduleId), $async$_reload$1);
            case 15:
              // returning from await.
              J.sort$1$ax(parentIds, t1);
              $async$self.__RequireRestarter__dirtyModules_A.addAll$1(0, parentIds);
              previousModuleId = moduleId;
            case 13:
              // join
              // goto for condition
              $async$goto = 10;
              break;
            case 11:
              // after for
              A.print(A.S(reloadedModules) + " module(s) were hot-reloaded.");
              $async$self._running.complete$1(0, true);
              $async$handler = 2;
              // goto after finally
              $async$goto = 9;
              break;
            case 7:
              // catch
              $async$handler = 6;
              $async$exception = $async$currentError;
              t1 = A.unwrapException($async$exception);
              if (t1 instanceof A.HotReloadFailedException) {
                e = t1;
                A.print("Error during script reloading. Firing full page reload. " + A.S(e));
                type$.Location._as(window.location).reload();
                $async$self._running.complete$1(0, false);
              } else
                throw $async$exception;
              // goto after finally
              $async$goto = 9;
              break;
            case 6:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 9:
              // after finally
              $async$returnValue = $async$self._running.future;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$_reload$1, $async$completer);
    },
    _reloadModule$1(moduleId) {
      var t1 = new A._Future($.Zone__current, type$._Future_dynamic),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_dynamic),
        stackTrace = A.StackTrace_current();
      J.forceLoadModule$3$x(self.$requireLoader, moduleId, A.allowInterop(type$.void_Function_$opt_dynamic._as(completer.get$complete(completer)), type$.void_Function), A.allowInterop(new A.RequireRestarter__reloadModule_closure(completer, stackTrace), type$.void_Function_JsError));
      return t1;
    },
    _updateGraph$0() {
      var i, t2, t3, _i,
        t1 = type$.String,
        stronglyConnectedComponents = A.stronglyConnectedComponents(A.List_List$from(self.Array.from(J.keys$0$x(J.get$moduleParentsGraph$x(self.$requireLoader))), true, t1), this.get$_moduleParents(), t1);
      t1 = this._moduleOrdering;
      if (t1._collection$_length > 0) {
        t1._collection$_strings = t1._collection$_nums = t1._collection$_rest = t1._keys = null;
        t1._collection$_length = 0;
      }
      for (i = 0; i < stronglyConnectedComponents.length; ++i)
        for (t2 = stronglyConnectedComponents[i], t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, A.throwConcurrentModificationError)(t2), ++_i)
          t1.$indexSet(0, t2[_i], i);
    },
    set$__RequireRestarter__dirtyModules_A(__RequireRestarter__dirtyModules_A) {
      this.__RequireRestarter__dirtyModules_A = type$.SplayTreeSet_String._as(__RequireRestarter__dirtyModules_A);
    },
    set$_running(_running) {
      this._running = type$.Completer_bool._as(_running);
    },
    $isRestarter: 1
  };
  A.RequireRestarter__reload_closure.prototype = {
    call$0() {
      var t1 = this.childModule;
      t1 = J.get$first$ax(self.Object.values(t1 == null ? type$.Object._as(t1) : t1));
      if (t1 == null)
        t1 = type$.Object._as(t1);
      t1.main();
    },
    $signature: 4
  };
  A.RequireRestarter__reloadModule_closure.prototype = {
    call$1(e) {
      this.completer.completeError$2(new A.HotReloadFailedException(J.get$message$x(type$.JsError._as(e))), this.stackTrace);
    },
    $signature: 83
  };
  A._createScript_closure.prototype = {
    call$0() {
      var nonce = A._findNonce();
      if (nonce == null)
        return A.html0_ScriptElement___new_tearOff$closure();
      return new A._createScript__closure(nonce);
    },
    $signature: 84
  };
  A._createScript__closure.prototype = {
    call$0() {
      var t1 = document.createElement("script");
      t1.setAttribute("nonce", this.nonce);
      return t1;
    },
    $signature: 36
  };
  (function aliases() {
    var _ = J.Interceptor.prototype;
    _.super$Interceptor$toString = _.toString$0;
    _ = J.LegacyJavaScriptObject.prototype;
    _.super$LegacyJavaScriptObject$toString = _.toString$0;
    _ = A._BufferingStreamSubscription.prototype;
    _.super$_BufferingStreamSubscription$_add = _._add$1;
    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
    _ = A._HashMap.prototype;
    _.super$_HashMap$_containsKey = _._containsKey$1;
    _.super$_HashMap$_get = _._get$1;
    _.super$_HashMap$_set = _._set$2;
    _ = A.Iterable.prototype;
    _.super$Iterable$where = _.where$1;
    _ = A.Object.prototype;
    _.super$Object$toString = _.toString$0;
    _ = A.Element.prototype;
    _.super$Element$createFragment = _.createFragment$3$treeSanitizer$validator;
    _ = A._SimpleNodeValidator.prototype;
    _.super$_SimpleNodeValidator$allowsAttribute = _.allowsAttribute$3;
    _ = A.JsObject.prototype;
    _.super$JsObject$$index = _.$index;
    _.super$JsObject$$indexSet = _.$indexSet;
    _ = A._JsArray_JsObject_ListMixin.prototype;
    _.super$_JsArray_JsObject_ListMixin$$indexSet = _.$indexSet;
  })();
  (function installTearOffs() {
    var _static_2 = hunkHelpers._static_2,
      _static_1 = hunkHelpers._static_1,
      _static_0 = hunkHelpers._static_0,
      _static = hunkHelpers.installStaticTearOff,
      _instance = hunkHelpers.installInstanceTearOff,
      _instance_2_u = hunkHelpers._instance_2u,
      _instance_1_i = hunkHelpers._instance_1i,
      _instance_0_u = hunkHelpers._instance_0u,
      _instance_1_u = hunkHelpers._instance_1u,
      _instance_0_i = hunkHelpers._instance_0i;
    _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 33);
    _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 10);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 10);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 10);
    _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
    _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 7);
    _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 11);
    _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
    _static(A, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 88, 0);
    _static(A, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) {
      return A._rootRun($self, $parent, zone, f, type$.dynamic);
    }], 89, 1);
    _static(A, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) {
      return A._rootRunUnary($self, $parent, zone, f, arg, type$.dynamic, type$.dynamic);
    }], 90, 1);
    _static(A, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) {
      return A._rootRunBinary($self, $parent, zone, f, arg1, arg2, type$.dynamic, type$.dynamic, type$.dynamic);
    }], 91, 1);
    _static(A, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) {
      return A._rootRegisterCallback($self, $parent, zone, f, type$.dynamic);
    }], 92, 0);
    _static(A, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) {
      return A._rootRegisterUnaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic);
    }], 93, 0);
    _static(A, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) {
      return A._rootRegisterBinaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic, type$.dynamic);
    }], 94, 0);
    _static(A, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 95, 0);
    _static(A, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 96, 0);
    _static(A, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 97, 0);
    _static(A, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 98, 0);
    _static(A, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 99, 0);
    _static_1(A, "async___printToZone$closure", "_printToZone", 27);
    _static(A, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 72, 0);
    _instance(A._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 34, 0, 0);
    _instance(A._AsyncCompleter.prototype, "get$complete", 1, 0, function() {
      return [null];
    }, ["call$1", "call$0"], ["complete$1", "complete$0"], 52, 0, 0);
    _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 11);
    var _;
    _instance_1_i(_ = A._StreamController.prototype, "get$add", "add$1", 12);
    _instance(_, "get$addError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["addError$2", "addError$1"], 34, 0, 0);
    _instance_0_u(_ = A._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._ForwardingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_1_u(_, "get$_handleData", "_handleData$1", 12);
    _instance_2_u(_, "get$_handleError", "_handleError$2", 19);
    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0);
    _static_2(A, "collection___defaultEquals$closure", "_defaultEquals0", 15);
    _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 16);
    _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 33);
    _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 1);
    _static_1(A, "core__identityHashCode$closure", "identityHashCode", 16);
    _static_2(A, "core__identical$closure", "identical", 15);
    _static_0(A, "html0_ScriptElement___new_tearOff$closure", "ScriptElement___new_tearOff", 36);
    _static(A, "html0__Html5NodeValidator__standardAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__standardAttributeValidator"], 32, 0);
    _static(A, "html0__Html5NodeValidator__uriAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__uriAttributeValidator"], 32, 0);
    _instance_0_i(A.Node.prototype, "get$remove", "remove$0", 0);
    _static_1(A, "js___convertToJS$closure", "_convertToJS", 9);
    _static_1(A, "js___convertToDart$closure", "_convertToDart", 2);
    _instance_2_u(_ = A.DeepCollectionEquality.prototype, "get$equals", "equals$2", 15);
    _instance_1_i(_, "get$hash", "hash$1", 16);
    _instance_1_u(_, "get$isValidKey", "isValidKey$1", 55);
    _instance_1_u(_ = A.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 3);
    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 3);
    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 62);
    _instance_1_u(A.HtmlWebSocketChannel.prototype, "get$_innerListen", "_innerListen$1", 3);
    _instance_1_u(_ = A.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 81);
    _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 82);
  })();
  (function inheritance() {
    var _mixin = hunkHelpers.mixin,
      _mixinHard = hunkHelpers.mixinHard,
      _inherit = hunkHelpers.inherit,
      _inheritMany = hunkHelpers.inheritMany;
    _inherit(A.Object, null);
    _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, J.ArrayIterator, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.SkipIterator, A.EmptyIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A.ListBase, A.Symbol, A._Record, A.MapView, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.JSInvocationMirror, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A._Required, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A._InitializedCell, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A.AsyncError, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A.Stream, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._StreamIterator, A._ZoneFunction, A._ZoneSpecification, A._ZoneDelegate, A._Zone, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._UnmodifiableMapMixin, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A._JsonStringifier, A._Utf8Encoder, A._BigIntImpl, A.DateTime, A.Duration, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.Expando, A.CssStyleDeclarationBase, A.EventStreamProvider, A._EventStreamSubscription, A._Html5NodeValidator, A.ImmutableListMixin, A.NodeValidatorBuilder, A._SimpleNodeValidator, A._SvgNodeValidator, A.FixedSizeListIterator, A._DOMWindowCrossFrame, A._SameOriginUriPolicy, A._ValidatingTreeSanitizer, A._StructuredClone, A._AcceptStructuredClone, A.JsObject, A.NullRejectionException, A._JSRandom, A._Random, A.AsyncMemoizer, A.DelegatingStreamSink, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.BuiltList, A.ListBuilder, A.BuiltListMultimap, A.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, A.BuiltSet, A.SetBuilder, A.BuiltSetMultimap, A.SetMultimapBuilder, A.EnumClass, A.IndentingBuiltValueToStringHelper, A.JsonObject, A.FullType, A.BigIntSerializer, A.BoolSerializer, A.BuiltJsonSerializers, A.BuiltJsonSerializersBuilder, A.BuiltListMultimapSerializer, A.BuiltListSerializer, A.BuiltMapSerializer, A.BuiltSetMultimapSerializer, A.BuiltSetSerializer, A.DateTimeSerializer, A.DoubleSerializer, A.DurationSerializer, A.Int32Serializer, A.Int64Serializer, A.IntSerializer, A.JsonObjectSerializer, A.NullSerializer, A.NumSerializer, A.RegExpSerializer, A.StringSerializer, A.Uint8ListSerializer, A.UriSerializer, A.DefaultEquality, A.IterableEquality, A.ListEquality, A._UnorderedEquality, A._MapEntry, A.MapEquality, A.DeepCollectionEquality, A._QueueList_Object_ListMixin, A.BuildResult, A._$BuildStatusSerializer, A._$BuildResultSerializer, A.BuildResultBuilder, A.ConnectRequest, A._$ConnectRequestSerializer, A.ConnectRequestBuilder, A.DebugEvent, A.BatchedDebugEvents, A._$DebugEventSerializer, A._$BatchedDebugEventsSerializer, A.DebugEventBuilder, A.BatchedDebugEventsBuilder, A.DebugInfo, A._$DebugInfoSerializer, A.DebugInfoBuilder, A.DevToolsRequest, A.DevToolsResponse, A._$DevToolsRequestSerializer, A._$DevToolsResponseSerializer, A.DevToolsRequestBuilder, A.DevToolsResponseBuilder, A.ErrorResponse, A._$ErrorResponseSerializer, A.ErrorResponseBuilder, A.ExtensionRequest, A.ExtensionResponse, A.ExtensionEvent, A.BatchedEvents, A._$ExtensionRequestSerializer, A._$ExtensionResponseSerializer, A._$ExtensionEventSerializer, A._$BatchedEventsSerializer, A.ExtensionRequestBuilder, A.ExtensionResponseBuilder, A.ExtensionEventBuilder, A.BatchedEventsBuilder, A.IsolateExit, A.IsolateStart, A._$IsolateExitSerializer, A._$IsolateStartSerializer, A.IsolateExitBuilder, A.IsolateStartBuilder, A.RegisterEvent, A._$RegisterEventSerializer, A.RegisterEventBuilder, A.RunRequest, A._$RunRequestSerializer, A.BatchedStreamController, A.SocketClient, A.Int32, A.Int64, A._StackState, A.Level, A.LogRecord, A.Logger, A.Pool, A.PoolResource, A.StreamChannelMixin, A._GuaranteeSink, A.StreamChannelController, A.Uuid, A.EventStreamProvider0, A._EventStreamSubscription0, A.WebSocketChannelException, A.LegacyRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]);
    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JavaScriptBigInt, J.JavaScriptSymbol, J.JSNumber, J.JSString]);
    _inheritMany(J.JavaScriptObject, [J.LegacyJavaScriptObject, J.JSArray, A.NativeByteBuffer, A.NativeTypedData, A.EventTarget, A.AccessibleNodeList, A.Blob, A.CssTransformComponent, A.CssRule, A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase, A.CssStyleValue, A.Event, A.DataTransferItemList, A.DomException, A.DomImplementation, A._DomRectList_JavaScriptObject_ListMixin, A.DomRectReadOnly, A._DomStringList_JavaScriptObject_ListMixin, A.DomTokenList, A._FileList_JavaScriptObject_ListMixin, A.Gamepad, A.History, A._HtmlCollection_JavaScriptObject_ListMixin, A.ImageData, A.Location, A.MediaList, A._MidiInputMap_JavaScriptObject_MapMixin, A._MidiOutputMap_JavaScriptObject_MapMixin, A.MimeType, A._MimeTypeArray_JavaScriptObject_ListMixin, A._NodeList_JavaScriptObject_ListMixin, A.Plugin, A._PluginArray_JavaScriptObject_ListMixin, A._RtcStatsReport_JavaScriptObject_MapMixin, A.SharedArrayBuffer, A.SpeechGrammar, A._SpeechGrammarList_JavaScriptObject_ListMixin, A.SpeechRecognitionResult, A._Storage_JavaScriptObject_MapMixin, A.StyleSheet, A._TextTrackCueList_JavaScriptObject_ListMixin, A.TimeRanges, A.Touch, A._TouchList_JavaScriptObject_ListMixin, A.TrackDefaultList, A.Url, A.__CssRuleList_JavaScriptObject_ListMixin, A.__GamepadList_JavaScriptObject_ListMixin, A.__NamedNodeMap_JavaScriptObject_ListMixin, A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin, A.__StyleSheetList_JavaScriptObject_ListMixin, A.KeyRange, A.Length, A._LengthList_JavaScriptObject_ListMixin, A.Number, A._NumberList_JavaScriptObject_ListMixin, A.PointList, A._StringList_JavaScriptObject_ListMixin, A.Transform, A._TransformList_JavaScriptObject_ListMixin, A.AudioBuffer, A._AudioParamMap_JavaScriptObject_MapMixin]);
    _inheritMany(J.LegacyJavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction, A.Promise, A.RequireLoader, A.JsError, A.JsMap]);
    _inherit(J.JSUnmodifiableArray, J.JSArray);
    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);
    _inheritMany(A.Iterable, [A._CastIterableBase, A.EfficientLengthIterable, A.MappedIterable, A.WhereIterable, A.SkipIterable, A._KeysOrValues, A._AllMatchesIterable, A._StringAllMatchesIterable]);
    _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]);
    _inherit(A._EfficientLengthCastIterable, A.CastIterable);
    _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin);
    _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__chainForeignFuture_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._CustomHashMap_closure, A.SplayTreeSet_closure, A._BigIntImpl_hashCode_finish, A._Uri__makePath_closure, A._createTables_setChars, A._createTables_setRange, A.Element_Element$html_closure, A.HttpRequest_request_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure0, A.NodeValidatorBuilder_allowsElement_closure, A.NodeValidatorBuilder_allowsAttribute_closure, A._SimpleNodeValidator_closure, A._SimpleNodeValidator_closure0, A._TemplatingNodeValidator_closure, A.JsObject__convertDataTree__convert, A._convertToJS_closure, A._convertToJS_closure0, A._wrapToDart_closure, A._wrapToDart_closure0, A._wrapToDart_closure1, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.StreamQueue__ensureListening_closure, A.BuiltListMultimap_BuiltListMultimap_closure, A.BuiltListMultimap_hashCode_closure, A.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.BuiltSet_hashCode_closure, A.BuiltSetMultimap_hashCode_closure, A.SetMultimapBuilder_replace_closure, A.newBuiltValueToStringHelper_closure, A.BuiltListMultimapSerializer_serialize_closure, A.BuiltListMultimapSerializer_deserialize_closure, A.BuiltListSerializer_serialize_closure, A.BuiltListSerializer_deserialize_closure, A.BuiltSetMultimapSerializer_serialize_closure, A.BuiltSetMultimapSerializer_deserialize_closure, A.BuiltSetSerializer_serialize_closure, A.BuiltSetSerializer_deserialize_closure, A.WebSocketClient_stream_closure, A.Pool__runOnRelease_closure, A.SseClient_closure0, A.SseClient_closure1, A.generateUuidV4_generateBits, A._GuaranteeSink__addError_closure, A._EventStreamSubscription_closure0, A._EventStreamSubscription_onData_closure, A.HtmlWebSocketChannel_closure, A.HtmlWebSocketChannel_closure0, A.HtmlWebSocketChannel_closure1, A.HtmlWebSocketChannel__listen_closure, A.main__closure, A.main__closure0, A.main___closure2, A.main___closure1, A.main__closure2, A.main___closure0, A.main___closure, A.main__closure4, A.main__closure5, A.main__closure6, A.main__closure7, A._launchCommunicationWithDebugExtension_closure, A._listenForDebugExtensionAuthRequest_closure, A.LegacyRestarter_restart_closure0, A.LegacyRestarter_restart_closure, A.toFuture_closure, A.RequireRestarter__reloadModule_closure]);
    _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.Primitives_functionNoSuchMethod_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__chainForeignFuture_closure0, A._Future_timeout_closure1, A._BufferingStreamSubscription_asFuture_closure0, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A._symbolMapToStringMap_closure, A.NoSuchMethodError_toString_closure, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_error, A.Uri_parseIPv6Address_parseHex, A._createTables_build, A.MidiInputMap_keys_closure, A.MidiOutputMap_keys_closure, A.RtcStatsReport_keys_closure, A.Storage_keys_closure, A._ValidatingTreeSanitizer_sanitizeTree_walk, A._StructuredClone_walk_closure, A._StructuredClone_walk_closure0, A._AcceptStructuredClone_walk_closure, A.AudioParamMap_keys_closure, A.StreamQueue__ensureListening_closure1, A.hashObjects_closure, A.MapBuilder_replace_closure, A.safeUnawaited_closure, A.Pool__runOnRelease_closure0, A.generateUuidV4_printDigits, A.generateUuidV4_bitsDigits, A.main__closure1, A.main_closure0, A.toPromise_closure]);
    _inherit(A.CastList, A._CastListBase);
    _inheritMany(A.MapBase, [A.CastMap, A.JsLinkedHashMap, A._HashMap, A._JsonMap, A._AttributeMap]);
    _inheritMany(A.Error, [A.LateError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A._CyclicInitializationError, A.RuntimeError, A.AssertionError, A._Error, A.JsonUnsupportedObjectError, A.ArgumentError, A.NoSuchMethodError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError, A.BuiltValueNullFieldError, A.BuiltValueNestedFieldError, A.DeserializationError]);
    _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl$periodic_closure, A.Future_Future$microtask_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__chainCoreFutureAsync_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteError_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A.StreamQueue__ensureListening_closure0, A.Serializers_Serializers_closure, A.Serializers_Serializers_closure0, A.Serializers_Serializers_closure1, A.Serializers_Serializers_closure2, A.Serializers_Serializers_closure3, A._$serializers_closure, A._$serializers_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A.Logger_Logger_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.GuaranteeChannel_closure, A.GuaranteeChannel__closure, A.HtmlWebSocketChannel__listen_closure0, A.HtmlWebSocketChannel__listen__closure, A.HtmlWebSocketChannel__listen__closure0, A.main_closure, A.main__closure3, A.RequireRestarter__reload_closure, A._createScript_closure, A._createScript__closure]);
    _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeyIterable, A._HashMapKeyIterable]);
    _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A.ReversedListIterable, A.ListQueue, A._JsonMapKeyIterable]);
    _inherit(A.EfficientLengthMappedIterable, A.MappedIterable);
    _inherit(A.EfficientLengthSkipIterable, A.SkipIterable);
    _inheritMany(A.ListBase, [A.UnmodifiableListBase, A._FrozenElementList, A._ChildNodeListLazy]);
    _inherit(A._Record2, A._Record);
    _inherit(A._Record_2, A._Record2);
    _inherit(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A.MapView);
    _inherit(A.UnmodifiableMapView, A._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
    _inherit(A.ConstantMapView, A.UnmodifiableMapView);
    _inherit(A.ConstantStringMap, A.ConstantMap);
    _inherit(A.NullError, A.TypeError);
    _inheritMany(A.TearOffClosure, [A.StaticClosure, A.BoundClosure]);
    _inherit(A._AssertionError, A.AssertionError);
    _inheritMany(A.NativeTypedData, [A.NativeByteData, A.NativeTypedArray]);
    _inheritMany(A.NativeTypedArray, [A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
    _inherit(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfDouble, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inherit(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfInt, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inheritMany(A.NativeTypedArrayOfDouble, [A.NativeFloat32List, A.NativeFloat64List]);
    _inheritMany(A.NativeTypedArrayOfInt, [A.NativeInt16List, A.NativeInt32List, A.NativeInt8List, A.NativeUint16List, A.NativeUint32List, A.NativeUint8ClampedList, A.NativeUint8List]);
    _inherit(A._TypeError, A._Error);
    _inheritMany(A._Completer, [A._AsyncCompleter, A._SyncCompleter]);
    _inheritMany(A._StreamController, [A._AsyncStreamController, A._SyncStreamController]);
    _inheritMany(A.Stream, [A._StreamImpl, A._ForwardingStream, A._EventStream0, A._EventStream]);
    _inherit(A._ControllerStream, A._StreamImpl);
    _inheritMany(A._BufferingStreamSubscription, [A._ControllerSubscription, A._ForwardingStreamSubscription]);
    _inheritMany(A._DelayedEvent, [A._DelayedData, A._DelayedError]);
    _inherit(A._MapStream, A._ForwardingStream);
    _inheritMany(A._Zone, [A._CustomZone, A._RootZone]);
    _inheritMany(A._HashMap, [A._IdentityHashMap, A._CustomHashMap]);
    _inherit(A._SetBase, A.SetBase);
    _inheritMany(A._SetBase, [A._HashSet, A._LinkedHashSet]);
    _inherit(A.UnmodifiableListView, A.UnmodifiableListBase);
    _inherit(A._SplayTreeSetNode, A._SplayTreeNode);
    _inherit(A._SplayTreeKeyIterator, A._SplayTreeIterator);
    _inherit(A._SplayTreeSet__SplayTree_Iterable, A._SplayTree);
    _inherit(A._SplayTreeSet__SplayTree_Iterable_SetMixin, A._SplayTreeSet__SplayTree_Iterable);
    _inherit(A.SplayTreeSet, A._SplayTreeSet__SplayTree_Iterable_SetMixin);
    _inheritMany(A.Codec, [A.Base64Codec, A.Encoding, A.JsonCodec]);
    _inheritMany(A.Converter, [A.Base64Encoder, A.Base64Decoder, A.JsonEncoder, A.JsonDecoder, A.Utf8Encoder]);
    _inherit(A.JsonCyclicError, A.JsonUnsupportedObjectError);
    _inherit(A._JsonStringStringifier, A._JsonStringifier);
    _inherit(A.Utf8Codec, A.Encoding);
    _inheritMany(A.ArgumentError, [A.RangeError, A.IndexError]);
    _inherit(A._DataUri, A._Uri);
    _inheritMany(A.EventTarget, [A.Node, A.FileWriter, A.HttpRequestEventTarget, A.MessagePort, A.SourceBuffer, A._SourceBufferList_EventTarget_ListMixin, A.TextTrack, A.TextTrackCue, A._TextTrackList_EventTarget_ListMixin, A.VideoTrackList, A.Window, A.WorkerGlobalScope, A.AudioTrackList, A.BaseAudioContext]);
    _inheritMany(A.Node, [A.Element, A.CharacterData, A.Document, A._Attr]);
    _inheritMany(A.Element, [A.HtmlElement, A.SvgElement]);
    _inheritMany(A.HtmlElement, [A.AnchorElement, A.AreaElement, A.BaseElement, A.BodyElement, A.FormElement, A.ScriptElement, A.SelectElement, A.TableElement, A.TableRowElement, A.TableSectionElement, A.TemplateElement]);
    _inherit(A.CssPerspective, A.CssTransformComponent);
    _inherit(A.CssStyleDeclaration, A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase);
    _inheritMany(A.CssStyleValue, [A.CssTransformValue, A.CssUnparsedValue]);
    _inheritMany(A.Event, [A.CustomEvent, A.UIEvent, A.MessageEvent, A.ProgressEvent]);
    _inherit(A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin, A._DomRectList_JavaScriptObject_ListMixin);
    _inherit(A.DomRectList, A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin, A._DomStringList_JavaScriptObject_ListMixin);
    _inherit(A.DomStringList, A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.File, A.Blob);
    _inherit(A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin, A._FileList_JavaScriptObject_ListMixin);
    _inherit(A.FileList, A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin, A._HtmlCollection_JavaScriptObject_ListMixin);
    _inherit(A.HtmlCollection, A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.HtmlDocument, A.Document);
    _inherit(A.HttpRequest, A.HttpRequestEventTarget);
    _inherit(A.KeyboardEvent, A.UIEvent);
    _inherit(A.MidiInputMap, A._MidiInputMap_JavaScriptObject_MapMixin);
    _inherit(A.MidiOutputMap, A._MidiOutputMap_JavaScriptObject_MapMixin);
    _inherit(A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin, A._MimeTypeArray_JavaScriptObject_ListMixin);
    _inherit(A.MimeTypeArray, A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin, A._NodeList_JavaScriptObject_ListMixin);
    _inherit(A.NodeList, A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin, A._PluginArray_JavaScriptObject_ListMixin);
    _inherit(A.PluginArray, A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.RtcStatsReport, A._RtcStatsReport_JavaScriptObject_MapMixin);
    _inherit(A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, A._SourceBufferList_EventTarget_ListMixin);
    _inherit(A.SourceBufferList, A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin, A._SpeechGrammarList_JavaScriptObject_ListMixin);
    _inherit(A.SpeechGrammarList, A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.Storage, A._Storage_JavaScriptObject_MapMixin);
    _inherit(A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin, A._TextTrackCueList_JavaScriptObject_ListMixin);
    _inherit(A.TextTrackCueList, A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, A._TextTrackList_EventTarget_ListMixin);
    _inherit(A.TextTrackList, A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin, A._TouchList_JavaScriptObject_ListMixin);
    _inherit(A.TouchList, A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__CssRuleList_JavaScriptObject_ListMixin);
    _inherit(A._CssRuleList, A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._DomRect, A.DomRectReadOnly);
    _inherit(A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__GamepadList_JavaScriptObject_ListMixin);
    _inherit(A._GamepadList, A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin, A.__NamedNodeMap_JavaScriptObject_ListMixin);
    _inherit(A._NamedNodeMap, A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin);
    _inherit(A._SpeechRecognitionResultList, A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__StyleSheetList_JavaScriptObject_ListMixin);
    _inherit(A._StyleSheetList, A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._ElementAttributeMap, A._AttributeMap);
    _inherit(A._TemplatingNodeValidator, A._SimpleNodeValidator);
    _inherit(A._StructuredCloneDart2Js, A._StructuredClone);
    _inherit(A._AcceptStructuredCloneDart2Js, A._AcceptStructuredClone);
    _inheritMany(A.JsObject, [A.JsFunction, A._JsArray_JsObject_ListMixin]);
    _inherit(A.JsArray, A._JsArray_JsObject_ListMixin);
    _inherit(A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin, A._LengthList_JavaScriptObject_ListMixin);
    _inherit(A.LengthList, A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin, A._NumberList_JavaScriptObject_ListMixin);
    _inherit(A.NumberList, A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.ScriptElement0, A.SvgElement);
    _inherit(A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin, A._StringList_JavaScriptObject_ListMixin);
    _inherit(A.StringList, A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin, A._TransformList_JavaScriptObject_ListMixin);
    _inherit(A.TransformList, A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.AudioParamMap, A._AudioParamMap_JavaScriptObject_MapMixin);
    _inherit(A.OfflineAudioContext, A.BaseAudioContext);
    _inherit(A._BuiltList, A.BuiltList);
    _inherit(A._BuiltListMultimap, A.BuiltListMultimap);
    _inherit(A._BuiltMap, A.BuiltMap);
    _inherit(A._BuiltSet, A.BuiltSet);
    _inherit(A._BuiltSetMultimap, A.BuiltSetMultimap);
    _inheritMany(A.JsonObject, [A.BoolJsonObject, A.ListJsonObject, A.MapJsonObject, A.NumJsonObject, A.StringJsonObject]);
    _inherit(A.SetEquality, A._UnorderedEquality);
    _inherit(A.QueueList, A._QueueList_Object_ListMixin);
    _inherit(A._CastQueueList, A.QueueList);
    _inherit(A.BuildStatus, A.EnumClass);
    _inherit(A._$BuildResult, A.BuildResult);
    _inherit(A._$ConnectRequest, A.ConnectRequest);
    _inherit(A._$DebugEvent, A.DebugEvent);
    _inherit(A._$BatchedDebugEvents, A.BatchedDebugEvents);
    _inherit(A._$DebugInfo, A.DebugInfo);
    _inherit(A._$DevToolsRequest, A.DevToolsRequest);
    _inherit(A._$DevToolsResponse, A.DevToolsResponse);
    _inherit(A._$ErrorResponse, A.ErrorResponse);
    _inherit(A._$ExtensionRequest, A.ExtensionRequest);
    _inherit(A._$ExtensionResponse, A.ExtensionResponse);
    _inherit(A._$ExtensionEvent, A.ExtensionEvent);
    _inherit(A._$BatchedEvents, A.BatchedEvents);
    _inherit(A._$IsolateExit, A.IsolateExit);
    _inherit(A._$IsolateStart, A.IsolateStart);
    _inherit(A._$RegisterEvent, A.RegisterEvent);
    _inherit(A._$RunRequest, A.RunRequest);
    _inheritMany(A.SocketClient, [A.SseSocketClient, A.WebSocketClient]);
    _inheritMany(A.StreamChannelMixin, [A.SseClient, A.GuaranteeChannel, A.HtmlWebSocketChannel, A.WebSocketChannel]);
    _inherit(A._HtmlWebSocketSink, A.DelegatingStreamSink);
    _mixin(A.UnmodifiableListBase, A.UnmodifiableListMixin);
    _mixin(A.__CastListBase__CastIterableBase_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._AsyncStreamController, A._AsyncStreamControllerDispatch);
    _mixin(A._SyncStreamController, A._SyncStreamControllerDispatch);
    _mixin(A._SplayTreeSet__SplayTree_Iterable, A.Iterable);
    _mixin(A._SplayTreeSet__SplayTree_Iterable_SetMixin, A.SetBase);
    _mixin(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A._UnmodifiableMapMixin);
    _mixin(A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase, A.CssStyleDeclarationBase);
    _mixin(A._DomRectList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._DomStringList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._FileList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._HtmlCollection_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._MidiInputMap_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._MidiOutputMap_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._MimeTypeArray_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._NodeList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._PluginArray_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._RtcStatsReport_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._SourceBufferList_EventTarget_ListMixin, A.ListBase);
    _mixin(A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._SpeechGrammarList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._Storage_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._TextTrackCueList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TextTrackList_EventTarget_ListMixin, A.ListBase);
    _mixin(A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TouchList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__CssRuleList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__GamepadList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__NamedNodeMap_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__StyleSheetList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixinHard(A._JsArray_JsObject_ListMixin, A.ListBase);
    _mixin(A._LengthList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._NumberList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._StringList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TransformList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._AudioParamMap_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._QueueList_Object_ListMixin, A.ListBase);
  })();
  var init = {
    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List"},
    mangledNames: {},
    types: ["~()", "@(@)", "Object?(@)", "~(JavaScriptObject)", "Null()", "~(String,@)", "Null(@)", "~(@)", "Null(Object,StackTrace)", "Object?(Object?)", "~(~())", "~(Object,StackTrace)", "~(Object?)", "~(@,@)", "~(Event)", "bool(Object?,Object?)", "int(Object?)", "Null(JavaScriptObject)", "~(String,String)", "~(@,StackTrace)", "bool(@)", "~(Object?,Object?)", "int(int,int)", "int(int)", "~(Symbol0,@)", "String(String)", "~(Uint8List,String,int)", "~(String)", "Future<Null>()", "bool(NodeValidator)", "bool(String)", "bool()", "bool(Element,String,String,_Html5NodeValidator)", "int(@,@)", "~(Object[StackTrace?])", "String(int,int)", "ScriptElement()", "~(Node,Node?)", "Null(@,@)", "@(@,@)", "@(Object?)", "JsFunction(@)", "JsArray<@>(@)", "JsObject(@)", "~(int,@)", "int(int,@)", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "ListBuilder<Object>()", "ListMultimapBuilder<Object,Object>()", "MapBuilder<Object,Object>()", "SetBuilder<Object>()", "SetMultimapBuilder<Object,Object>()", "~([Object?])", "@(String)", "@(@,String)", "bool(Object?)", "ListBuilder<DebugEvent>()", "ListBuilder<ExtensionEvent>()", "bool(Node)", "String(@)", "Logger()", "_Future<@>(@)", "~(String?)", "Uint8List(@,@)", "Null(~())", "int?()", "String?()", "~(String,int?)", "Promise<1&>(String)", "~(List<DebugEvent>)", "ListBuilder<DebugEvent>(BatchedDebugEventsBuilder)", "DebugEventBuilder(DebugEventBuilder)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)", "RegisterEventBuilder(RegisterEventBuilder)", "DevToolsRequestBuilder(DevToolsRequestBuilder)", "Future<~>(String)", "ConnectRequestBuilder(ConnectRequestBuilder)", "DebugInfoBuilder(DebugInfoBuilder)", "Future<Null>(Event)", "~(MessageEvent)", "bool(bool)", "List<String>(String)", "int(String,String)", "~(JsError)", "ScriptElement()()", "~(String,int)", "Null(@,StackTrace)", "IndentingBuiltValueToStringHelper(String)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?,Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>", "0^()(Zone,ZoneDelegate,Zone,0^())<Object?>", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "~(ProgressEvent)", "Future<~>()"],
    interceptorsByTag: null,
    leafTags: null,
    arrayRti: Symbol("$ti"),
    rttc: {
      "2;": (t1, t2) => o => o instanceof A._Record_2 && t1._is(o._0) && t2._is(o._1)
    }
  };
  A._Universe_addRules(init.typeUniverse, JSON.parse('{"PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","JavaScriptFunction":"LegacyJavaScriptObject","Promise":"LegacyJavaScriptObject","JsError":"LegacyJavaScriptObject","RequireLoader":"LegacyJavaScriptObject","JsMap":"LegacyJavaScriptObject","KeyframeEffect":"JavaScriptObject","KeyframeEffectReadOnly":"JavaScriptObject","AnimationEffectReadOnly":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AudioContext":"BaseAudioContext","AbsoluteOrientationSensor":"EventTarget","OrientationSensor":"EventTarget","Sensor":"EventTarget","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","ShadowRoot":"Node","DocumentFragment":"Node","XmlDocument":"Document","VttCue":"TextTrackCue","CompositionEvent":"UIEvent","DedicatedWorkerGlobalScope":"WorkerGlobalScope","CDataSection":"CharacterData","Text":"CharacterData","MathMLElement":"Element","HttpRequestUpload":"HttpRequestEventTarget","HtmlFormControlsCollection":"HtmlCollection","CssCharsetRule":"CssRule","CssMatrixComponent":"CssTransformComponent","CssStyleSheet":"StyleSheet","CssurlImageValue":"CssStyleValue","CssImageValue":"CssStyleValue","CssResourceValue":"CssStyleValue","JavaScriptObject":{"JSObject":[]},"JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"LegacyJavaScriptObject":{"JavaScriptObject":[],"JSObject":[],"Promise":["1&"],"JsError":[]},"JSArray":{"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"Iterable.E":"1"},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"Iterable.E":"1"},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"TrustedGetRuntimeType":[]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"Symbol":{"Symbol0":[]},"_Record_2":{"_Record2":[],"_Record":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"JSInvocationMirror":{"Invocation":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Function":[]},"Closure2Args":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"_CyclicInitializationError":{"Error":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"_Record2":{"_Record":[]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JavaScriptObject":[],"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JavaScriptObject":[],"JSObject":[],"TypedData":[]},"NativeByteData":{"NativeTypedData":[],"JavaScriptObject":[],"ByteData":[],"JSObject":[],"TypedData":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"NativeTypedData":[],"JavaScriptIndexingBehavior":["1"],"JavaScriptObject":[],"JSObject":[],"TypedData":[]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"List":["double"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"ListBase":["double"],"Float32List":[],"List":["double"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double"},"NativeFloat64List":{"ListBase":["double"],"Float64List":[],"List":["double"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double"},"NativeInt16List":{"ListBase":["int"],"Int16List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeInt32List":{"ListBase":["int"],"Int32List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeInt8List":{"ListBase":["int"],"Int8List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint16List":{"ListBase":["int"],"Uint16List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint32List":{"ListBase":["int"],"Uint32List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint8ClampedList":{"ListBase":["int"],"Uint8ClampedList":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint8List":{"ListBase":["int"],"Uint8List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"AsyncError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_StreamController":{"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamSinkWrapper":{"StreamSink":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"_Zone":[],"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_SplayTreeSetNode":{"_SplayTreeNode":["1","_SplayTreeSetNode<1>"],"_SplayTreeNode.1":"_SplayTreeSetNode<1>","_SplayTreeNode.K":"1"},"_HashMap":{"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_HashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1","UnmodifiableListMixin.E":"1"},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"Queue":["1"],"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.K":"1","_SplayTreeIterator.T":"1","_SplayTreeIterator.1":"2"},"SplayTreeSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"Iterable.E":"1","_SplayTree.1":"_SplayTreeSetNode<1>","_SplayTree.K":"1"},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"Base64Codec":{"Codec":["List<int>","String"],"Codec.S":"List<int>"},"Base64Encoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Base64Decoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"Converter":{"StreamTransformer":["1","2"]},"Encoding":{"Codec":["String","List<int>"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"Utf8Codec":{"Codec":["String","List<int>"],"Codec.S":"String"},"Utf8Encoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExp":{"Pattern":[]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"NoSuchMethodError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"IntegerDivisionByZeroException":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"CssRule":{"JavaScriptObject":[],"JSObject":[]},"Element":{"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"Event":{"JavaScriptObject":[],"JSObject":[]},"File":{"Blob":[],"JavaScriptObject":[],"JSObject":[]},"Gamepad":{"JavaScriptObject":[],"JSObject":[]},"HttpRequest":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"KeyboardEvent":{"Event":[],"JavaScriptObject":[],"JSObject":[]},"MessageEvent":{"Event":[],"JavaScriptObject":[],"JSObject":[]},"MimeType":{"JavaScriptObject":[],"JSObject":[]},"Node":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"Plugin":{"JavaScriptObject":[],"JSObject":[]},"ProgressEvent":{"Event":[],"JavaScriptObject":[],"JSObject":[]},"ScriptElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"SourceBuffer":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"SpeechGrammar":{"JavaScriptObject":[],"JSObject":[]},"SpeechRecognitionResult":{"JavaScriptObject":[],"JSObject":[]},"StyleSheet":{"JavaScriptObject":[],"JSObject":[]},"TextTrack":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"TextTrackCue":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"Touch":{"JavaScriptObject":[],"JSObject":[]},"_Html5NodeValidator":{"NodeValidator":[]},"HtmlElement":{"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"AccessibleNodeList":{"JavaScriptObject":[],"JSObject":[]},"AnchorElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"AreaElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"BaseElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"Blob":{"JavaScriptObject":[],"JSObject":[]},"BodyElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"CharacterData":{"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"CssPerspective":{"JavaScriptObject":[],"JSObject":[]},"CssStyleDeclaration":{"JavaScriptObject":[],"JSObject":[]},"CssStyleValue":{"JavaScriptObject":[],"JSObject":[]},"CssTransformComponent":{"JavaScriptObject":[],"JSObject":[]},"CssTransformValue":{"JavaScriptObject":[],"JSObject":[]},"CssUnparsedValue":{"JavaScriptObject":[],"JSObject":[]},"CustomEvent":{"Event":[],"JavaScriptObject":[],"JSObject":[]},"DataTransferItemList":{"JavaScriptObject":[],"JSObject":[]},"Document":{"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"DomException":{"JavaScriptObject":[],"JSObject":[]},"DomImplementation":{"JavaScriptObject":[],"JSObject":[]},"DomRectList":{"ListBase":["Rectangle<num>"],"ImmutableListMixin":["Rectangle<num>"],"List":["Rectangle<num>"],"JavaScriptIndexingBehavior":["Rectangle<num>"],"JavaScriptObject":[],"EfficientLengthIterable":["Rectangle<num>"],"JSObject":[],"Iterable":["Rectangle<num>"],"ImmutableListMixin.E":"Rectangle<num>","ListBase.E":"Rectangle<num>","Iterable.E":"Rectangle<num>"},"DomRectReadOnly":{"JavaScriptObject":[],"Rectangle":["num"],"JSObject":[]},"DomStringList":{"ListBase":["String"],"ImmutableListMixin":["String"],"List":["String"],"JavaScriptIndexingBehavior":["String"],"JavaScriptObject":[],"EfficientLengthIterable":["String"],"JSObject":[],"Iterable":["String"],"ImmutableListMixin.E":"String","ListBase.E":"String","Iterable.E":"String"},"DomTokenList":{"JavaScriptObject":[],"JSObject":[]},"_FrozenElementList":{"ListBase":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1"},"EventTarget":{"JavaScriptObject":[],"JSObject":[]},"FileList":{"ListBase":["File"],"ImmutableListMixin":["File"],"List":["File"],"JavaScriptIndexingBehavior":["File"],"JavaScriptObject":[],"EfficientLengthIterable":["File"],"JSObject":[],"Iterable":["File"],"ImmutableListMixin.E":"File","ListBase.E":"File","Iterable.E":"File"},"FileWriter":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"FormElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"History":{"JavaScriptObject":[],"JSObject":[]},"HtmlCollection":{"ListBase":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"JavaScriptObject":[],"EfficientLengthIterable":["Node"],"JSObject":[],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListBase.E":"Node","Iterable.E":"Node"},"HtmlDocument":{"Document":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"HttpRequestEventTarget":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"ImageData":{"JavaScriptObject":[],"JSObject":[]},"Location":{"JavaScriptObject":[],"JSObject":[]},"MediaList":{"JavaScriptObject":[],"JSObject":[]},"MessagePort":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"MidiInputMap":{"JavaScriptObject":[],"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"MidiOutputMap":{"JavaScriptObject":[],"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"MimeTypeArray":{"ListBase":["MimeType"],"ImmutableListMixin":["MimeType"],"List":["MimeType"],"JavaScriptIndexingBehavior":["MimeType"],"JavaScriptObject":[],"EfficientLengthIterable":["MimeType"],"JSObject":[],"Iterable":["MimeType"],"ImmutableListMixin.E":"MimeType","ListBase.E":"MimeType","Iterable.E":"MimeType"},"_ChildNodeListLazy":{"ListBase":["Node"],"List":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ListBase.E":"Node","Iterable.E":"Node"},"NodeList":{"ListBase":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"JavaScriptObject":[],"EfficientLengthIterable":["Node"],"JSObject":[],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListBase.E":"Node","Iterable.E":"Node"},"PluginArray":{"ListBase":["Plugin"],"ImmutableListMixin":["Plugin"],"List":["Plugin"],"JavaScriptIndexingBehavior":["Plugin"],"JavaScriptObject":[],"EfficientLengthIterable":["Plugin"],"JSObject":[],"Iterable":["Plugin"],"ImmutableListMixin.E":"Plugin","ListBase.E":"Plugin","Iterable.E":"Plugin"},"RtcStatsReport":{"JavaScriptObject":[],"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"SelectElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"SharedArrayBuffer":{"JavaScriptObject":[],"JSObject":[]},"SourceBufferList":{"ListBase":["SourceBuffer"],"ImmutableListMixin":["SourceBuffer"],"List":["SourceBuffer"],"EventTarget":[],"JavaScriptIndexingBehavior":["SourceBuffer"],"JavaScriptObject":[],"EfficientLengthIterable":["SourceBuffer"],"JSObject":[],"Iterable":["SourceBuffer"],"ImmutableListMixin.E":"SourceBuffer","ListBase.E":"SourceBuffer","Iterable.E":"SourceBuffer"},"SpeechGrammarList":{"ListBase":["SpeechGrammar"],"ImmutableListMixin":["SpeechGrammar"],"List":["SpeechGrammar"],"JavaScriptIndexingBehavior":["SpeechGrammar"],"JavaScriptObject":[],"EfficientLengthIterable":["SpeechGrammar"],"JSObject":[],"Iterable":["SpeechGrammar"],"ImmutableListMixin.E":"SpeechGrammar","ListBase.E":"SpeechGrammar","Iterable.E":"SpeechGrammar"},"Storage":{"JavaScriptObject":[],"MapBase":["String","String"],"JSObject":[],"Map":["String","String"],"MapBase.K":"String","MapBase.V":"String"},"TableElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"TableRowElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"TableSectionElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"TemplateElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"TextTrackCueList":{"ListBase":["TextTrackCue"],"ImmutableListMixin":["TextTrackCue"],"List":["TextTrackCue"],"JavaScriptIndexingBehavior":["TextTrackCue"],"JavaScriptObject":[],"EfficientLengthIterable":["TextTrackCue"],"JSObject":[],"Iterable":["TextTrackCue"],"ImmutableListMixin.E":"TextTrackCue","ListBase.E":"TextTrackCue","Iterable.E":"TextTrackCue"},"TextTrackList":{"ListBase":["TextTrack"],"ImmutableListMixin":["TextTrack"],"List":["TextTrack"],"EventTarget":[],"JavaScriptIndexingBehavior":["TextTrack"],"JavaScriptObject":[],"EfficientLengthIterable":["TextTrack"],"JSObject":[],"Iterable":["TextTrack"],"ImmutableListMixin.E":"TextTrack","ListBase.E":"TextTrack","Iterable.E":"TextTrack"},"TimeRanges":{"JavaScriptObject":[],"JSObject":[]},"TouchList":{"ListBase":["Touch"],"ImmutableListMixin":["Touch"],"List":["Touch"],"JavaScriptIndexingBehavior":["Touch"],"JavaScriptObject":[],"EfficientLengthIterable":["Touch"],"JSObject":[],"Iterable":["Touch"],"ImmutableListMixin.E":"Touch","ListBase.E":"Touch","Iterable.E":"Touch"},"TrackDefaultList":{"JavaScriptObject":[],"JSObject":[]},"UIEvent":{"Event":[],"JavaScriptObject":[],"JSObject":[]},"Url":{"JavaScriptObject":[],"JSObject":[]},"VideoTrackList":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"Window":{"WindowBase":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"WorkerGlobalScope":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"_Attr":{"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"_CssRuleList":{"ListBase":["CssRule"],"ImmutableListMixin":["CssRule"],"List":["CssRule"],"JavaScriptIndexingBehavior":["CssRule"],"JavaScriptObject":[],"EfficientLengthIterable":["CssRule"],"JSObject":[],"Iterable":["CssRule"],"ImmutableListMixin.E":"CssRule","ListBase.E":"CssRule","Iterable.E":"CssRule"},"_DomRect":{"JavaScriptObject":[],"Rectangle":["num"],"JSObject":[]},"_GamepadList":{"ListBase":["Gamepad?"],"ImmutableListMixin":["Gamepad?"],"List":["Gamepad?"],"JavaScriptIndexingBehavior":["Gamepad?"],"JavaScriptObject":[],"EfficientLengthIterable":["Gamepad?"],"JSObject":[],"Iterable":["Gamepad?"],"ImmutableListMixin.E":"Gamepad?","ListBase.E":"Gamepad?","Iterable.E":"Gamepad?"},"_NamedNodeMap":{"ListBase":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"JavaScriptObject":[],"EfficientLengthIterable":["Node"],"JSObject":[],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListBase.E":"Node","Iterable.E":"Node"},"_SpeechRecognitionResultList":{"ListBase":["SpeechRecognitionResult"],"ImmutableListMixin":["SpeechRecognitionResult"],"List":["SpeechRecognitionResult"],"JavaScriptIndexingBehavior":["SpeechRecognitionResult"],"JavaScriptObject":[],"EfficientLengthIterable":["SpeechRecognitionResult"],"JSObject":[],"Iterable":["SpeechRecognitionResult"],"ImmutableListMixin.E":"SpeechRecognitionResult","ListBase.E":"SpeechRecognitionResult","Iterable.E":"SpeechRecognitionResult"},"_StyleSheetList":{"ListBase":["StyleSheet"],"ImmutableListMixin":["StyleSheet"],"List":["StyleSheet"],"JavaScriptIndexingBehavior":["StyleSheet"],"JavaScriptObject":[],"EfficientLengthIterable":["StyleSheet"],"JSObject":[],"Iterable":["StyleSheet"],"ImmutableListMixin.E":"StyleSheet","ListBase.E":"StyleSheet","Iterable.E":"StyleSheet"},"_AttributeMap":{"MapBase":["String","String"],"Map":["String","String"]},"_ElementAttributeMap":{"MapBase":["String","String"],"Map":["String","String"],"MapBase.K":"String","MapBase.V":"String"},"_EventStream0":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"NodeValidatorBuilder":{"NodeValidator":[]},"_SimpleNodeValidator":{"NodeValidator":[]},"_TemplatingNodeValidator":{"NodeValidator":[]},"_SvgNodeValidator":{"NodeValidator":[]},"FixedSizeListIterator":{"Iterator":["1"]},"_DOMWindowCrossFrame":{"WindowBase":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"_SameOriginUriPolicy":{"UriPolicy":[]},"_ValidatingTreeSanitizer":{"NodeTreeSanitizer":[]},"KeyRange":{"JavaScriptObject":[],"JSObject":[]},"JsFunction":{"JsObject":[]},"JsArray":{"ListBase":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JsObject":[],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1"},"Length":{"JavaScriptObject":[],"JSObject":[]},"Number":{"JavaScriptObject":[],"JSObject":[]},"Transform":{"JavaScriptObject":[],"JSObject":[]},"LengthList":{"ListBase":["Length"],"ImmutableListMixin":["Length"],"List":["Length"],"JavaScriptObject":[],"EfficientLengthIterable":["Length"],"JSObject":[],"Iterable":["Length"],"ImmutableListMixin.E":"Length","ListBase.E":"Length","Iterable.E":"Length"},"NumberList":{"ListBase":["Number"],"ImmutableListMixin":["Number"],"List":["Number"],"JavaScriptObject":[],"EfficientLengthIterable":["Number"],"JSObject":[],"Iterable":["Number"],"ImmutableListMixin.E":"Number","ListBase.E":"Number","Iterable.E":"Number"},"PointList":{"JavaScriptObject":[],"JSObject":[]},"ScriptElement0":{"SvgElement":[],"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"StringList":{"ListBase":["String"],"ImmutableListMixin":["String"],"List":["String"],"JavaScriptObject":[],"EfficientLengthIterable":["String"],"JSObject":[],"Iterable":["String"],"ImmutableListMixin.E":"String","ListBase.E":"String","Iterable.E":"String"},"SvgElement":{"Element":[],"Node":[],"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"TransformList":{"ListBase":["Transform"],"ImmutableListMixin":["Transform"],"List":["Transform"],"JavaScriptObject":[],"EfficientLengthIterable":["Transform"],"JSObject":[],"Iterable":["Transform"],"ImmutableListMixin.E":"Transform","ListBase.E":"Transform","Iterable.E":"Transform"},"AudioBuffer":{"JavaScriptObject":[],"JSObject":[]},"AudioParamMap":{"JavaScriptObject":[],"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"AudioTrackList":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"BaseAudioContext":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"OfflineAudioContext":{"EventTarget":[],"JavaScriptObject":[],"JSObject":[]},"DelegatingStreamSink":{"StreamSink":["1"]},"ErrorResult":{"Result":["0&"]},"ValueResult":{"Result":["1"]},"_NextRequest":{"_EventRequest":["1"]},"_HasNextRequest":{"_EventRequest":["1"]},"BuiltList":{"Iterable":["1"]},"_BuiltList":{"BuiltList":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltListMultimap":{"BuiltListMultimap":["1","2"]},"_BuiltMap":{"BuiltMap":["1","2"]},"BuiltSet":{"Iterable":["1"]},"_BuiltSet":{"BuiltSet":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltSetMultimap":{"BuiltSetMultimap":["1","2"]},"BuiltValueNullFieldError":{"Error":[]},"BuiltValueNestedFieldError":{"Error":[]},"BoolJsonObject":{"JsonObject":[]},"ListJsonObject":{"JsonObject":[]},"MapJsonObject":{"JsonObject":[]},"NumJsonObject":{"JsonObject":[]},"StringJsonObject":{"JsonObject":[]},"DeserializationError":{"Error":[]},"BigIntSerializer":{"PrimitiveSerializer":["BigInt"],"Serializer":["BigInt"]},"BoolSerializer":{"PrimitiveSerializer":["bool"],"Serializer":["bool"]},"BuiltJsonSerializers":{"Serializers":[]},"BuiltListMultimapSerializer":{"StructuredSerializer":["BuiltListMultimap<@,@>"],"Serializer":["BuiltListMultimap<@,@>"]},"BuiltListSerializer":{"StructuredSerializer":["BuiltList<@>"],"Serializer":["BuiltList<@>"]},"BuiltMapSerializer":{"StructuredSerializer":["BuiltMap<@,@>"],"Serializer":["BuiltMap<@,@>"]},"BuiltSetMultimapSerializer":{"StructuredSerializer":["BuiltSetMultimap<@,@>"],"Serializer":["BuiltSetMultimap<@,@>"]},"BuiltSetSerializer":{"StructuredSerializer":["BuiltSet<@>"],"Serializer":["BuiltSet<@>"]},"DateTimeSerializer":{"PrimitiveSerializer":["DateTime"],"Serializer":["DateTime"]},"DoubleSerializer":{"PrimitiveSerializer":["double"],"Serializer":["double"]},"DurationSerializer":{"PrimitiveSerializer":["Duration"],"Serializer":["Duration"]},"Int32Serializer":{"PrimitiveSerializer":["Int32"],"Serializer":["Int32"]},"Int64Serializer":{"PrimitiveSerializer":["Int64"],"Serializer":["Int64"]},"IntSerializer":{"PrimitiveSerializer":["int"],"Serializer":["int"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject"],"Serializer":["JsonObject"]},"NullSerializer":{"PrimitiveSerializer":["Null"],"Serializer":["Null"]},"NumSerializer":{"PrimitiveSerializer":["num"],"Serializer":["num"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp"],"Serializer":["RegExp"]},"StringSerializer":{"PrimitiveSerializer":["String"],"Serializer":["String"]},"Uint8ListSerializer":{"PrimitiveSerializer":["Uint8List"],"Serializer":["Uint8List"]},"UriSerializer":{"PrimitiveSerializer":["Uri"],"Serializer":["Uri"]},"DefaultEquality":{"Equality":["1"]},"IterableEquality":{"Equality":["Iterable<1>"]},"ListEquality":{"Equality":["List<1>"]},"_UnorderedEquality":{"Equality":["2"]},"SetEquality":{"_UnorderedEquality":["1","Set<1>"],"Equality":["Set<1>"],"_UnorderedEquality.E":"1","_UnorderedEquality.T":"Set<1>"},"MapEquality":{"Equality":["Map<1,2>"]},"DeepCollectionEquality":{"Equality":["@"]},"QueueList":{"ListBase":["1"],"List":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","QueueList.E":"1","Iterable.E":"1"},"_CastQueueList":{"QueueList":["2"],"ListBase":["2"],"List":["2"],"Queue":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","QueueList.E":"2","Iterable.E":"2"},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus"],"Serializer":["BuildStatus"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult"],"Serializer":["BuildResult"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest"],"Serializer":["ConnectRequest"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$DebugEventSerializer":{"StructuredSerializer":["DebugEvent"],"Serializer":["DebugEvent"]},"_$BatchedDebugEventsSerializer":{"StructuredSerializer":["BatchedDebugEvents"],"Serializer":["BatchedDebugEvents"]},"_$DebugEvent":{"DebugEvent":[]},"_$BatchedDebugEvents":{"BatchedDebugEvents":[]},"_$DebugInfoSerializer":{"StructuredSerializer":["DebugInfo"],"Serializer":["DebugInfo"]},"_$DebugInfo":{"DebugInfo":[]},"_$DevToolsRequestSerializer":{"StructuredSerializer":["DevToolsRequest"],"Serializer":["DevToolsRequest"]},"_$DevToolsResponseSerializer":{"StructuredSerializer":["DevToolsResponse"],"Serializer":["DevToolsResponse"]},"_$DevToolsRequest":{"DevToolsRequest":[]},"_$DevToolsResponse":{"DevToolsResponse":[]},"_$ErrorResponseSerializer":{"StructuredSerializer":["ErrorResponse"],"Serializer":["ErrorResponse"]},"_$ErrorResponse":{"ErrorResponse":[]},"_$ExtensionRequestSerializer":{"StructuredSerializer":["ExtensionRequest"],"Serializer":["ExtensionRequest"]},"_$ExtensionResponseSerializer":{"StructuredSerializer":["ExtensionResponse"],"Serializer":["ExtensionResponse"]},"_$ExtensionEventSerializer":{"StructuredSerializer":["ExtensionEvent"],"Serializer":["ExtensionEvent"]},"_$BatchedEventsSerializer":{"StructuredSerializer":["BatchedEvents"],"Serializer":["BatchedEvents"]},"_$ExtensionRequest":{"ExtensionRequest":[]},"_$ExtensionResponse":{"ExtensionResponse":[]},"_$ExtensionEvent":{"ExtensionEvent":[]},"_$BatchedEvents":{"BatchedEvents":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit"],"Serializer":["IsolateExit"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart"],"Serializer":["IsolateStart"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RegisterEventSerializer":{"StructuredSerializer":["RegisterEvent"],"Serializer":["RegisterEvent"]},"_$RegisterEvent":{"RegisterEvent":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest"],"Serializer":["RunRequest"]},"_$RunRequest":{"RunRequest":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int32":{"Comparable":["Object"]},"Int64":{"Comparable":["Object"]},"Level":{"Comparable":["Level"]},"SseClient":{"StreamChannel":["String?"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription0":{"StreamSubscription":["1"]},"HtmlWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_HtmlWebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannel":{"StreamChannel":["@"]},"LegacyRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"ByteData":{"TypedData":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]}}'));
  A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"_DelayedEvent":1,"_SplayTreeSet__SplayTree_Iterable":1,"_SplayTreeSet__SplayTree_Iterable_SetMixin":1,"MapEntry":2,"_JsArray_JsObject_ListMixin":1,"_QueueList_Object_ListMixin":1,"StreamChannelMixin":1}'));
  var string$ = {
    __has_: "' has been assigned during initialization.",
    ABCDEF: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    Error_: "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",
    max_mu: "max must be in range 0 < max \u2264 2^32, was ",
    serial: "serializer must be StructuredSerializer or PrimitiveSerializer"
  };
  var type$ = (function rtii() {
    var findType = A.findType;
    return {
      AsyncError: findType("AsyncError"),
      Base64Codec: findType("Base64Codec"),
      BaseElement: findType("BaseElement"),
      BatchedDebugEvents: findType("BatchedDebugEvents"),
      BatchedEvents: findType("BatchedEvents"),
      BatchedStreamController_DebugEvent: findType("BatchedStreamController<DebugEvent>"),
      BigInt: findType("BigInt"),
      Blob: findType("Blob"),
      BodyElement: findType("BodyElement"),
      BuildResult: findType("BuildResult"),
      BuildStatus: findType("BuildStatus"),
      BuiltListMultimap_dynamic_dynamic: findType("BuiltListMultimap<@,@>"),
      BuiltList_DebugEvent: findType("BuiltList<DebugEvent>"),
      BuiltList_ExtensionEvent: findType("BuiltList<ExtensionEvent>"),
      BuiltList_dynamic: findType("BuiltList<@>"),
      BuiltList_nullable_Object: findType("BuiltList<Object?>"),
      BuiltMap_dynamic_dynamic: findType("BuiltMap<@,@>"),
      BuiltSetMultimap_dynamic_dynamic: findType("BuiltSetMultimap<@,@>"),
      BuiltSet_dynamic: findType("BuiltSet<@>"),
      ByteBuffer: findType("ByteBuffer"),
      ByteData: findType("ByteData"),
      Comparable_dynamic: findType("Comparable<@>"),
      Completer_bool: findType("Completer<bool>"),
      ConnectRequest: findType("ConnectRequest"),
      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
      CssRule: findType("CssRule"),
      CustomEvent: findType("CustomEvent"),
      DateTime: findType("DateTime"),
      DebugEvent: findType("DebugEvent"),
      DebugInfo: findType("DebugInfo"),
      DevToolsRequest: findType("DevToolsRequest"),
      DevToolsResponse: findType("DevToolsResponse"),
      Document: findType("Document"),
      Duration: findType("Duration"),
      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
      Element: findType("Element"),
      Error: findType("Error"),
      ErrorResponse: findType("ErrorResponse"),
      Event: findType("Event"),
      ExtensionEvent: findType("ExtensionEvent"),
      ExtensionRequest: findType("ExtensionRequest"),
      ExtensionResponse: findType("ExtensionResponse"),
      File: findType("File"),
      FileList: findType("FileList"),
      Float32List: findType("Float32List"),
      Float64List: findType("Float64List"),
      FullType: findType("FullType"),
      Function: findType("Function"),
      Future_dynamic: findType("Future<@>"),
      Future_void: findType("Future<~>"),
      HtmlElement: findType("HtmlElement"),
      ImageData: findType("ImageData"),
      Int16List: findType("Int16List"),
      Int32: findType("Int32"),
      Int32List: findType("Int32List"),
      Int64: findType("Int64"),
      Int8List: findType("Int8List"),
      Invocation: findType("Invocation"),
      IsolateExit: findType("IsolateExit"),
      IsolateStart: findType("IsolateStart"),
      IterableEquality_dynamic: findType("IterableEquality<@>"),
      Iterable_Node: findType("Iterable<Node>"),
      Iterable_dynamic: findType("Iterable<@>"),
      Iterable_nullable_Object: findType("Iterable<Object?>"),
      JSArray_FullType: findType("JSArray<FullType>"),
      JSArray_NodeValidator: findType("JSArray<NodeValidator>"),
      JSArray_Object: findType("JSArray<Object>"),
      JSArray_String: findType("JSArray<String>"),
      JSArray_Type: findType("JSArray<Type>"),
      JSArray_dynamic: findType("JSArray<@>"),
      JSArray_int: findType("JSArray<int>"),
      JSNull: findType("JSNull"),
      JSObject: findType("JSObject"),
      JavaScriptFunction: findType("JavaScriptFunction"),
      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
      JavaScriptObject: findType("JavaScriptObject"),
      JsArray_dynamic: findType("JsArray<@>"),
      JsError: findType("JsError"),
      JsLinkedHashMap_String_dynamic: findType("JsLinkedHashMap<String,@>"),
      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
      JsObject: findType("JsObject"),
      JsonObject: findType("JsonObject"),
      KeyRange: findType("KeyRange"),
      KeyboardEvent: findType("KeyboardEvent"),
      Length: findType("Length"),
      Level: findType("Level"),
      ListBuilder_DebugEvent: findType("ListBuilder<DebugEvent>"),
      ListBuilder_ExtensionEvent: findType("ListBuilder<ExtensionEvent>"),
      ListBuilder_dynamic: findType("ListBuilder<@>"),
      ListEquality_dynamic: findType("ListEquality<@>"),
      ListMultimapBuilder_dynamic_dynamic: findType("ListMultimapBuilder<@,@>"),
      List_DebugEvent: findType("List<DebugEvent>"),
      List_ExtensionEvent: findType("List<ExtensionEvent>"),
      List_String: findType("List<String>"),
      List_dynamic: findType("List<@>"),
      List_int: findType("List<int>"),
      List_nullable_Object: findType("List<Object?>"),
      Location: findType("Location"),
      Logger: findType("Logger"),
      MapBuilder_dynamic_dynamic: findType("MapBuilder<@,@>"),
      MapEquality_dynamic_dynamic: findType("MapEquality<@,@>"),
      Map_String_String: findType("Map<String,String>"),
      Map_dynamic_dynamic: findType("Map<@,@>"),
      Map_of_String_and_nullable_Object: findType("Map<String,Object?>"),
      Map_of_nullable_Object_and_nullable_Object: findType("Map<Object?,Object?>"),
      MappedListIterable_String_String: findType("MappedListIterable<String,String>"),
      MessageEvent: findType("MessageEvent"),
      MessagePort: findType("MessagePort"),
      MimeType: findType("MimeType"),
      NativeByteBuffer: findType("NativeByteBuffer"),
      NativeTypedData: findType("NativeTypedData"),
      NativeUint8List: findType("NativeUint8List"),
      Node: findType("Node"),
      NodeValidator: findType("NodeValidator"),
      Null: findType("Null"),
      Number: findType("Number"),
      Object: findType("Object"),
      Plugin: findType("Plugin"),
      PoolResource: findType("PoolResource"),
      PrimitiveSerializer_dynamic: findType("PrimitiveSerializer<@>"),
      ProgressEvent: findType("ProgressEvent"),
      Promise_bool_Function_String: findType("Promise<1&>(String)"),
      Promise_void: findType("Promise<1&>"),
      QueueList_Result_DebugEvent: findType("QueueList<Result<DebugEvent>>"),
      Record: findType("Record"),
      Record_0: findType("+()"),
      Rectangle_num: findType("Rectangle<num>"),
      RegExp: findType("RegExp"),
      RegExpMatch: findType("RegExpMatch"),
      RegisterEvent: findType("RegisterEvent"),
      RequireRestarter: findType("RequireRestarter"),
      ReversedListIterable_String: findType("ReversedListIterable<String>"),
      RunRequest: findType("RunRequest"),
      ScriptElement: findType("ScriptElement0"),
      SerializerPlugin: findType("SerializerPlugin"),
      Serializer_dynamic: findType("Serializer<@>"),
      SetBuilder_dynamic: findType("SetBuilder<@>"),
      SetEquality_dynamic: findType("SetEquality<@>"),
      SetMultimapBuilder_dynamic_dynamic: findType("SetMultimapBuilder<@,@>"),
      Set_dynamic: findType("Set<@>"),
      SharedArrayBuffer: findType("SharedArrayBuffer"),
      SourceBuffer: findType("SourceBuffer"),
      SpeechGrammar: findType("SpeechGrammar"),
      SpeechRecognitionResult: findType("SpeechRecognitionResult"),
      SplayTreeSet_String: findType("SplayTreeSet<String>"),
      StackTrace: findType("StackTrace"),
      StreamChannelController_nullable_Object: findType("StreamChannelController<Object?>"),
      StreamQueue_DebugEvent: findType("StreamQueue<DebugEvent>"),
      String: findType("String"),
      String_Function_String: findType("String(String)"),
      StructuredSerializer_dynamic: findType("StructuredSerializer<@>"),
      StyleSheet: findType("StyleSheet"),
      SvgElement: findType("SvgElement"),
      Symbol: findType("Symbol0"),
      TemplateElement: findType("TemplateElement"),
      TextTrack: findType("TextTrack"),
      TextTrackCue: findType("TextTrackCue"),
      Timer: findType("Timer"),
      Touch: findType("Touch"),
      Transform: findType("Transform"),
      TrustedGetRuntimeType: findType("TrustedGetRuntimeType"),
      Type: findType("Type"),
      TypeError: findType("TypeError"),
      TypedData: findType("TypedData"),
      Uint16List: findType("Uint16List"),
      Uint32List: findType("Uint32List"),
      Uint8ClampedList: findType("Uint8ClampedList"),
      Uint8List: findType("Uint8List"),
      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
      UnmodifiableListView_nullable_Object: findType("UnmodifiableListView<Object?>"),
      UnmodifiableMapView_of_String_and_nullable_Object: findType("UnmodifiableMapView<String,Object?>"),
      Uri: findType("Uri"),
      Window: findType("Window"),
      WindowBase: findType("WindowBase"),
      WorkerGlobalScope: findType("WorkerGlobalScope"),
      Zone: findType("Zone"),
      _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
      _AsyncCompleter_PoolResource: findType("_AsyncCompleter<PoolResource>"),
      _AsyncCompleter_bool: findType("_AsyncCompleter<bool>"),
      _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
      _AsyncCompleter_void: findType("_AsyncCompleter<~>"),
      _Attr: findType("_Attr"),
      _BigIntImpl: findType("_BigIntImpl"),
      _BuiltMap_dynamic_dynamic: findType("_BuiltMap<@,@>"),
      _ChildNodeListLazy: findType("_ChildNodeListLazy"),
      _EventRequest_dynamic: findType("_EventRequest<@>"),
      _EventStream_JavaScriptObject: findType("_EventStream<JavaScriptObject>"),
      _FrozenElementList_Element: findType("_FrozenElementList<Element>"),
      _Future_HttpRequest: findType("_Future<HttpRequest>"),
      _Future_PoolResource: findType("_Future<PoolResource>"),
      _Future_bool: findType("_Future<bool>"),
      _Future_dynamic: findType("_Future<@>"),
      _Future_int: findType("_Future<int>"),
      _Future_void: findType("_Future<~>"),
      _Html5NodeValidator: findType("_Html5NodeValidator"),
      _IdentityHashMap_dynamic_dynamic: findType("_IdentityHashMap<@,@>"),
      _IdentityHashMap_of_nullable_Object_and_nullable_Object: findType("_IdentityHashMap<Object?,Object?>"),
      _MapEntry: findType("_MapEntry"),
      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
      _SyncCompleter_PoolResource: findType("_SyncCompleter<PoolResource>"),
      _ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace: findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,Object,StackTrace)>"),
      bool: findType("bool"),
      bool_Function_Object: findType("bool(Object)"),
      double: findType("double"),
      dynamic: findType("@"),
      dynamic_Function: findType("@()"),
      dynamic_Function_Event: findType("@(Event)"),
      dynamic_Function_Object: findType("@(Object)"),
      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
      dynamic_Function_dynamic: findType("@(@)"),
      dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
      int: findType("int"),
      legacy_Never: findType("0&*"),
      legacy_Object: findType("Object*"),
      nullable_Function: findType("Function?"),
      nullable_Future_Null: findType("Future<Null>?"),
      nullable_Gamepad: findType("Gamepad?"),
      nullable_ListBuilder_DebugEvent: findType("ListBuilder<DebugEvent>?"),
      nullable_ListBuilder_ExtensionEvent: findType("ListBuilder<ExtensionEvent>?"),
      nullable_List_dynamic: findType("List<@>?"),
      nullable_Map_of_nullable_Object_and_nullable_Object: findType("Map<Object?,Object?>?"),
      nullable_Object: findType("Object?"),
      nullable_Result_DebugEvent: findType("Result<DebugEvent>?"),
      nullable_StackTrace: findType("StackTrace?"),
      nullable_Zone: findType("Zone?"),
      nullable_ZoneDelegate: findType("ZoneDelegate?"),
      nullable_ZoneSpecification: findType("ZoneSpecification?"),
      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
      nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"),
      nullable_dynamic_Function_Event: findType("@(Event)?"),
      nullable_int_Function_Node_Node: findType("int(Node,Node)?"),
      nullable_void_Function: findType("~()?"),
      nullable_void_Function_BatchedDebugEventsBuilder: findType("~(BatchedDebugEventsBuilder)?"),
      nullable_void_Function_ConnectRequestBuilder: findType("~(ConnectRequestBuilder)?"),
      nullable_void_Function_DebugEventBuilder: findType("~(DebugEventBuilder)?"),
      nullable_void_Function_DebugInfoBuilder: findType("~(DebugInfoBuilder)?"),
      nullable_void_Function_DevToolsRequestBuilder: findType("~(DevToolsRequestBuilder)?"),
      nullable_void_Function_JavaScriptObject: findType("~(JavaScriptObject)?"),
      nullable_void_Function_KeyboardEvent: findType("~(KeyboardEvent)?"),
      nullable_void_Function_MessageEvent: findType("~(MessageEvent)?"),
      nullable_void_Function_ProgressEvent: findType("~(ProgressEvent)?"),
      nullable_void_Function_RegisterEventBuilder: findType("~(RegisterEventBuilder)?"),
      num: findType("num"),
      void: findType("~"),
      void_Function: findType("~()"),
      void_Function_$opt_dynamic: findType("~([@])"),
      void_Function_JsError: findType("~(JsError)"),
      void_Function_Object: findType("~(Object)"),
      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
      void_Function_String: findType("~(String)"),
      void_Function_String_String: findType("~(String,String)"),
      void_Function_String_dynamic: findType("~(String,@)"),
      void_Function_Timer: findType("~(Timer)"),
      void_Function_dynamic: findType("~(@)")
    };
  })();
  (function constants() {
    var makeConstList = hunkHelpers.makeConstList;
    B.AnchorElement_methods = A.AnchorElement.prototype;
    B.BodyElement_methods = A.BodyElement.prototype;
    B.DomImplementation_methods = A.DomImplementation.prototype;
    B.HtmlDocument_methods = A.HtmlDocument.prototype;
    B.HttpRequest_methods = A.HttpRequest.prototype;
    B.Interceptor_methods = J.Interceptor.prototype;
    B.JSArray_methods = J.JSArray.prototype;
    B.JSBool_methods = J.JSBool.prototype;
    B.JSInt_methods = J.JSInt.prototype;
    B.JSNumber_methods = J.JSNumber.prototype;
    B.JSString_methods = J.JSString.prototype;
    B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
    B.JavaScriptObject_methods = J.JavaScriptObject.prototype;
    B.Location_methods = A.Location.prototype;
    B.NativeUint8List_methods = A.NativeUint8List.prototype;
    B.NodeList_methods = A.NodeList.prototype;
    B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
    B.TableElement_methods = A.TableElement.prototype;
    B.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
    B.Window_methods = A.Window.prototype;
    B.BuildStatus_failed = new A.BuildStatus("failed");
    B.BuildStatus_started = new A.BuildStatus("started");
    B.BuildStatus_succeeded = new A.BuildStatus("succeeded");
    B.C_Base64Encoder = new A.Base64Encoder();
    B.C_Base64Codec = new A.Base64Codec();
    B.C_Base64Decoder = new A.Base64Decoder();
    B.C_DefaultEquality = new A.DefaultEquality(A.findType("DefaultEquality<0&>"));
    B.C_DeepCollectionEquality = new A.DeepCollectionEquality();
    B.C_EmptyIterator = new A.EmptyIterator(A.findType("EmptyIterator<0&>"));
    B.C_IntegerDivisionByZeroException = new A.IntegerDivisionByZeroException();
    B.C_JS_CONST = function getTagFallback(o) {
  var s = Object.prototype.toString.call(o);
  return s.substring(8, s.length - 1);
};
    B.C_JS_CONST0 = function() {
  var toStringFunction = Object.prototype.toString;
  function getTag(o) {
    var s = toStringFunction.call(o);
    return s.substring(8, s.length - 1);
  }
  function getUnknownTag(object, tag) {
    if (/^HTML[A-Z].*Element$/.test(tag)) {
      var name = toStringFunction.call(object);
      if (name == "[object Object]") return null;
      return "HTMLElement";
    }
  }
  function getUnknownTagGenericBrowser(object, tag) {
    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
    return getUnknownTag(object, tag);
  }
  function prototypeForTag(tag) {
    if (typeof window == "undefined") return null;
    if (typeof window[tag] == "undefined") return null;
    var constructor = window[tag];
    if (typeof constructor != "function") return null;
    return constructor.prototype;
  }
  function discriminator(tag) { return null; }
  var isBrowser = typeof navigator == "object";
  return {
    getTag: getTag,
    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
    prototypeForTag: prototypeForTag,
    discriminator: discriminator };
};
    B.C_JS_CONST6 = function(getTagFallback) {
  return function(hooks) {
    if (typeof navigator != "object") return hooks;
    var ua = navigator.userAgent;
    if (ua.indexOf("DumpRenderTree") >= 0) return hooks;
    if (ua.indexOf("Chrome") >= 0) {
      function confirm(p) {
        return typeof window == "object" && window[p] && window[p].name == p;
      }
      if (confirm("Window") && confirm("HTMLElement")) return hooks;
    }
    hooks.getTag = getTagFallback;
  };
};
    B.C_JS_CONST1 = function(hooks) {
  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
};
    B.C_JS_CONST2 = function(hooks) {
  var getTag = hooks.getTag;
  var prototypeForTag = hooks.prototypeForTag;
  function getTagFixed(o) {
    var tag = getTag(o);
    if (tag == "Document") {
      if (!!o.xmlVersion) return "!Document";
      return "!HTMLDocument";
    }
    return tag;
  }
  function prototypeForTagFixed(tag) {
    if (tag == "Document") return null;
    return prototypeForTag(tag);
  }
  hooks.getTag = getTagFixed;
  hooks.prototypeForTag = prototypeForTagFixed;
};
    B.C_JS_CONST5 = function(hooks) {
  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
  if (userAgent.indexOf("Firefox") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "GeoGeolocation": "Geolocation",
    "Location": "!Location",
    "WorkerMessageEvent": "MessageEvent",
    "XMLDocument": "!Document"};
  function getTagFirefox(o) {
    var tag = getTag(o);
    return quickMap[tag] || tag;
  }
  hooks.getTag = getTagFirefox;
};
    B.C_JS_CONST4 = function(hooks) {
  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
  if (userAgent.indexOf("Trident/") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "HTMLDDElement": "HTMLElement",
    "HTMLDTElement": "HTMLElement",
    "HTMLPhraseElement": "HTMLElement",
    "Position": "Geoposition"
  };
  function getTagIE(o) {
    var tag = getTag(o);
    var newTag = quickMap[tag];
    if (newTag) return newTag;
    if (tag == "Object") {
      if (window.DataView && (o instanceof window.DataView)) return "DataView";
    }
    return tag;
  }
  function prototypeForTagIE(tag) {
    var constructor = window[tag];
    if (constructor == null) return null;
    return constructor.prototype;
  }
  hooks.getTag = getTagIE;
  hooks.prototypeForTag = prototypeForTagIE;
};
    B.C_JS_CONST3 = function(hooks) { return hooks; }
;
    B.C_JsonCodec = new A.JsonCodec();
    B.C_OutOfMemoryError = new A.OutOfMemoryError();
    B.C_SentinelValue = new A.SentinelValue();
    B.C_Utf8Codec = new A.Utf8Codec();
    B.C_Utf8Encoder = new A.Utf8Encoder();
    B.C_Uuid = new A.Uuid();
    B.C__DelayedDone = new A._DelayedDone();
    B.C__JSRandom = new A._JSRandom();
    B.C__Required = new A._Required();
    B.C__RootZone = new A._RootZone();
    B.Duration_0 = new A.Duration(0);
    B.Duration_5000000 = new A.Duration(5000000);
    B.Type_BuiltMap_qd4 = A.typeLiteral("BuiltMap<@,@>");
    B.Type_Object_xQ6 = A.typeLiteral("Object");
    B.List_empty1 = A._setArrayType(makeConstList([]), type$.JSArray_FullType);
    B.FullType_1MH = new A.FullType(B.Type_Object_xQ6, B.List_empty1, false);
    B.List_4AN = A._setArrayType(makeConstList([B.FullType_1MH, B.FullType_1MH]), type$.JSArray_FullType);
    B.FullType_6Ps = new A.FullType(B.Type_BuiltMap_qd4, B.List_4AN, false);
    B.Type_BuiltList_iTR = A.typeLiteral("BuiltList<@>");
    B.Type_DebugEvent_sSr = A.typeLiteral("DebugEvent");
    B.FullType_Dx1 = new A.FullType(B.Type_DebugEvent_sSr, B.List_empty1, false);
    B.List_luS = A._setArrayType(makeConstList([B.FullType_Dx1]), type$.JSArray_FullType);
    B.FullType_EGl = new A.FullType(B.Type_BuiltList_iTR, B.List_luS, false);
    B.Type_BuildStatus_ahk = A.typeLiteral("BuildStatus");
    B.FullType_FuN = new A.FullType(B.Type_BuildStatus_ahk, B.List_empty1, false);
    B.Type_BuiltSet_fcN = A.typeLiteral("BuiltSet<@>");
    B.List_3wP = A._setArrayType(makeConstList([B.FullType_1MH]), type$.JSArray_FullType);
    B.FullType_KVM = new A.FullType(B.Type_BuiltSet_fcN, B.List_3wP, false);
    B.Type_bool_lhE = A.typeLiteral("bool");
    B.FullType_MtR = new A.FullType(B.Type_bool_lhE, B.List_empty1, false);
    B.Type_ExtensionEvent_gsm = A.typeLiteral("ExtensionEvent");
    B.FullType_Ktb = new A.FullType(B.Type_ExtensionEvent_gsm, B.List_empty1, false);
    B.List_0 = A._setArrayType(makeConstList([B.FullType_Ktb]), type$.JSArray_FullType);
    B.FullType_NIe = new A.FullType(B.Type_BuiltList_iTR, B.List_0, false);
    B.FullType_WUY = new A.FullType(B.Type_BuiltList_iTR, B.List_3wP, false);
    B.Type_BuiltListMultimap_2Mt = A.typeLiteral("BuiltListMultimap<@,@>");
    B.FullType_fA4 = new A.FullType(B.Type_BuiltListMultimap_2Mt, B.List_4AN, false);
    B.Type_BuiltSetMultimap_9Fi = A.typeLiteral("BuiltSetMultimap<@,@>");
    B.FullType_gsm = new A.FullType(B.Type_BuiltSetMultimap_9Fi, B.List_4AN, false);
    B.Type_String_k8F = A.typeLiteral("String");
    B.FullType_h8g = new A.FullType(B.Type_String_k8F, B.List_empty1, false);
    B.Type_int_tHn = A.typeLiteral("int");
    B.FullType_kjq = new A.FullType(B.Type_int_tHn, B.List_empty1, false);
    B.FullType_null_List_empty_false = new A.FullType(null, B.List_empty1, false);
    B.JsonDecoder_null = new A.JsonDecoder(null);
    B.JsonEncoder_null = new A.JsonEncoder(null);
    B.Level_INFO_800 = new A.Level("INFO", 800);
    B.Level_SEVERE_1000 = new A.Level("SEVERE", 1000);
    B.Level_WARNING_900 = new A.Level("WARNING", 900);
    B.Type_IsolateStart_0 = A.typeLiteral("IsolateStart");
    B.Type__$IsolateStart_o3b = A.typeLiteral("_$IsolateStart");
    B.List_00 = A._setArrayType(makeConstList([B.Type_IsolateStart_0, B.Type__$IsolateStart_o3b]), type$.JSArray_Type);
    B.Type_ExtensionRequest_BMe = A.typeLiteral("ExtensionRequest");
    B.Type__$ExtensionRequest_1Ej = A.typeLiteral("_$ExtensionRequest");
    B.List_0YD = A._setArrayType(makeConstList([B.Type_ExtensionRequest_BMe, B.Type__$ExtensionRequest_1Ej]), type$.JSArray_Type);
    B.Type_ErrorResponse_Q43 = A.typeLiteral("ErrorResponse");
    B.Type__$ErrorResponse_xV7 = A.typeLiteral("_$ErrorResponse");
    B.List_6Bz = A._setArrayType(makeConstList([B.Type_ErrorResponse_Q43, B.Type__$ErrorResponse_xV7]), type$.JSArray_Type);
    B.Type_RunRequest_Pkw = A.typeLiteral("RunRequest");
    B.Type__$RunRequest_Im4 = A.typeLiteral("_$RunRequest");
    B.List_7pl = A._setArrayType(makeConstList([B.Type_RunRequest_Pkw, B.Type__$RunRequest_Im4]), type$.JSArray_Type);
    B.Type__$DebugEvent_EmR = A.typeLiteral("_$DebugEvent");
    B.List_8h5 = A._setArrayType(makeConstList([B.Type_DebugEvent_sSr, B.Type__$DebugEvent_EmR]), type$.JSArray_Type);
    B.Type_RegisterEvent_0zQ = A.typeLiteral("RegisterEvent");
    B.Type__$RegisterEvent_SY6 = A.typeLiteral("_$RegisterEvent");
    B.List_ASY = A._setArrayType(makeConstList([B.Type_RegisterEvent_0zQ, B.Type__$RegisterEvent_SY6]), type$.JSArray_Type);
    B.List_AuK = A._setArrayType(makeConstList(["bind", "if", "ref", "repeat", "syntax"]), type$.JSArray_String);
    B.Type_DebugInfo_gg4 = A.typeLiteral("DebugInfo");
    B.Type__$DebugInfo_Eoc = A.typeLiteral("_$DebugInfo");
    B.List_IMr = A._setArrayType(makeConstList([B.Type_DebugInfo_gg4, B.Type__$DebugInfo_Eoc]), type$.JSArray_Type);
    B.List_Icz = A._setArrayType(makeConstList([0, 0, 1048576, 531441, 1048576, 390625, 279936, 823543, 262144, 531441, 1000000, 161051, 248832, 371293, 537824, 759375, 1048576, 83521, 104976, 130321, 160000, 194481, 234256, 279841, 331776, 390625, 456976, 531441, 614656, 707281, 810000, 923521, 1048576, 35937, 39304, 42875, 46656]), type$.JSArray_int);
    B.Type_IsolateExit_D1o = A.typeLiteral("IsolateExit");
    B.Type__$IsolateExit_eWg = A.typeLiteral("_$IsolateExit");
    B.List_J12 = A._setArrayType(makeConstList([B.Type_IsolateExit_D1o, B.Type__$IsolateExit_eWg]), type$.JSArray_Type);
    B.Type_BatchedDebugEvents_I6f = A.typeLiteral("BatchedDebugEvents");
    B.Type__$BatchedDebugEvents_aD9 = A.typeLiteral("_$BatchedDebugEvents");
    B.List_Jeh = A._setArrayType(makeConstList([B.Type_BatchedDebugEvents_I6f, B.Type__$BatchedDebugEvents_aD9]), type$.JSArray_Type);
    B.List_Jwp = A._setArrayType(makeConstList(["A::href", "AREA::href", "BLOCKQUOTE::cite", "BODY::background", "COMMAND::icon", "DEL::cite", "FORM::action", "IMG::src", "INPUT::src", "INS::cite", "Q::cite", "VIDEO::poster"]), type$.JSArray_String);
    B.List_M1A = A._setArrayType(makeConstList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_ME0 = A._setArrayType(makeConstList(["HEAD", "AREA", "BASE", "BASEFONT", "BR", "COL", "COLGROUP", "EMBED", "FRAME", "FRAMESET", "HR", "IMAGE", "IMG", "INPUT", "ISINDEX", "LINK", "META", "PARAM", "SOURCE", "STYLE", "TITLE", "WBR"]), type$.JSArray_String);
    B.List_MMm = A._setArrayType(makeConstList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]), type$.JSArray_int);
    B.List_OL3 = A._setArrayType(makeConstList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_Type_BuildStatus_ahk = A._setArrayType(makeConstList([B.Type_BuildStatus_ahk]), type$.JSArray_Type);
    B.List_XRg0 = A._setArrayType(makeConstList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_XRg = A._setArrayType(makeConstList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_YmH = A._setArrayType(makeConstList([0, 0, 32776, 33792, 1, 10240, 0, 0]), type$.JSArray_int);
    B.Type_DevToolsResponse_Hhy = A.typeLiteral("DevToolsResponse");
    B.Type__$DevToolsResponse_23h = A.typeLiteral("_$DevToolsResponse");
    B.List_aRS = A._setArrayType(makeConstList([B.Type_DevToolsResponse_Hhy, B.Type__$DevToolsResponse_23h]), type$.JSArray_Type);
    B.Type_ExtensionResponse_CC0 = A.typeLiteral("ExtensionResponse");
    B.Type__$ExtensionResponse_Ddl = A.typeLiteral("_$ExtensionResponse");
    B.List_bhs = A._setArrayType(makeConstList([B.Type_ExtensionResponse_CC0, B.Type__$ExtensionResponse_Ddl]), type$.JSArray_Type);
    B.Type__$ExtensionEvent_XOq = A.typeLiteral("_$ExtensionEvent");
    B.List_e7M = A._setArrayType(makeConstList([B.Type_ExtensionEvent_gsm, B.Type__$ExtensionEvent_XOq]), type$.JSArray_Type);
    B.List_ejq = A._setArrayType(makeConstList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_empty0 = A._setArrayType(makeConstList([]), type$.JSArray_String);
    B.List_empty = A._setArrayType(makeConstList([]), type$.JSArray_dynamic);
    B.List_er0 = A._setArrayType(makeConstList(["d", "D", "\u2202", "\xce"]), type$.JSArray_String);
    B.Type_BuildResult_dEV = A.typeLiteral("BuildResult");
    B.Type__$BuildResult_knt = A.typeLiteral("_$BuildResult");
    B.List_kqK = A._setArrayType(makeConstList([B.Type_BuildResult_dEV, B.Type__$BuildResult_knt]), type$.JSArray_Type);
    B.Type_ConnectRequest_UGQ = A.typeLiteral("ConnectRequest");
    B.Type__$ConnectRequest_cJC = A.typeLiteral("_$ConnectRequest");
    B.List_muk = A._setArrayType(makeConstList([B.Type_ConnectRequest_UGQ, B.Type__$ConnectRequest_cJC]), type$.JSArray_Type);
    B.List_oFp = A._setArrayType(makeConstList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431]), type$.JSArray_int);
    B.Type_BatchedEvents_gDG = A.typeLiteral("BatchedEvents");
    B.Type__$BatchedEvents_qxo = A.typeLiteral("_$BatchedEvents");
    B.List_oyn = A._setArrayType(makeConstList([B.Type_BatchedEvents_gDG, B.Type__$BatchedEvents_qxo]), type$.JSArray_Type);
    B.List_uzK = A._setArrayType(makeConstList(["*::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"]), type$.JSArray_String);
    B.Type_DevToolsRequest_A0n = A.typeLiteral("DevToolsRequest");
    B.Type__$DevToolsRequest_cDy = A.typeLiteral("_$DevToolsRequest");
    B.List_yT3 = A._setArrayType(makeConstList([B.Type_DevToolsRequest_A0n, B.Type__$DevToolsRequest_cDy]), type$.JSArray_Type);
    B.Object_empty = {};
    B.Map_empty = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap<Symbol0,@>"));
    B.Map_empty0 = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap<@,@>"));
    B.Symbol_call = new A.Symbol("call");
    B.Type_BigInt_8OV = A.typeLiteral("BigInt");
    B.Type_BoolJsonObject_8HQ = A.typeLiteral("BoolJsonObject");
    B.Type_ByteBuffer_RkP = A.typeLiteral("ByteBuffer");
    B.Type_ByteData_zNC = A.typeLiteral("ByteData");
    B.Type_DateTime_8AS = A.typeLiteral("DateTime");
    B.Type_Duration_SnA = A.typeLiteral("Duration");
    B.Type_Float32List_LB7 = A.typeLiteral("Float32List");
    B.Type_Float64List_LB7 = A.typeLiteral("Float64List");
    B.Type_Int16List_uXf = A.typeLiteral("Int16List");
    B.Type_Int32List_O50 = A.typeLiteral("Int32List");
    B.Type_Int32_Mhf = A.typeLiteral("Int32");
    B.Type_Int64_ww8 = A.typeLiteral("Int64");
    B.Type_Int8List_ekJ = A.typeLiteral("Int8List");
    B.Type_JSObject_8k0 = A.typeLiteral("JSObject");
    B.Type_JsonObject_gyf = A.typeLiteral("JsonObject");
    B.Type_ListJsonObject_yPV = A.typeLiteral("ListJsonObject");
    B.Type_MapJsonObject_bBG = A.typeLiteral("MapJsonObject");
    B.Type_Null_Yyn = A.typeLiteral("Null");
    B.Type_NumJsonObject_H9C = A.typeLiteral("NumJsonObject");
    B.Type_RegExp_Eeh = A.typeLiteral("RegExp");
    B.Type_StringJsonObject_GAC = A.typeLiteral("StringJsonObject");
    B.Type_Uint16List_2bx = A.typeLiteral("Uint16List");
    B.Type_Uint32List_2bx = A.typeLiteral("Uint32List");
    B.Type_Uint8ClampedList_Jik = A.typeLiteral("Uint8ClampedList");
    B.Type_Uint8List_WLA = A.typeLiteral("Uint8List");
    B.Type_Uri_EFX = A.typeLiteral("Uri");
    B.Type_double_K1J = A.typeLiteral("double");
    B.Type_num_cv7 = A.typeLiteral("num");
    B._StringStackTrace_3uE = new A._StringStackTrace("");
    B._ZoneFunction_3bB = new A._ZoneFunction(B.C__RootZone, A.async___rootCreatePeriodicTimer$closure(), A.findType("_ZoneFunction<Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))>"));
    B._ZoneFunction_7G2 = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterBinaryCallback$closure(), A.findType("_ZoneFunction<0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>>"));
    B._ZoneFunction_Eeh = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterUnaryCallback$closure(), A.findType("_ZoneFunction<0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>>"));
    B._ZoneFunction_NMc = new A._ZoneFunction(B.C__RootZone, A.async___rootHandleUncaughtError$closure(), type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace);
    B._ZoneFunction__RootZone__rootCreateTimer = new A._ZoneFunction(B.C__RootZone, A.async___rootCreateTimer$closure(), A.findType("_ZoneFunction<Timer(Zone,ZoneDelegate,Zone,Duration,~())>"));
    B._ZoneFunction__RootZone__rootErrorCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootErrorCallback$closure(), A.findType("_ZoneFunction<AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)>"));
    B._ZoneFunction__RootZone__rootFork = new A._ZoneFunction(B.C__RootZone, A.async___rootFork$closure(), A.findType("_ZoneFunction<Zone(Zone,ZoneDelegate,Zone,ZoneSpecification?,Map<Object?,Object?>?)>"));
    B._ZoneFunction__RootZone__rootPrint = new A._ZoneFunction(B.C__RootZone, A.async___rootPrint$closure(), A.findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,String)>"));
    B._ZoneFunction__RootZone__rootRegisterCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterCallback$closure(), A.findType("_ZoneFunction<0^()(Zone,ZoneDelegate,Zone,0^())<Object?>>"));
    B._ZoneFunction__RootZone__rootRun = new A._ZoneFunction(B.C__RootZone, A.async___rootRun$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^())<Object?>>"));
    B._ZoneFunction__RootZone__rootRunBinary = new A._ZoneFunction(B.C__RootZone, A.async___rootRunBinary$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootRunUnary = new A._ZoneFunction(B.C__RootZone, A.async___rootRunUnary$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^(1^),1^)<Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootScheduleMicrotask = new A._ZoneFunction(B.C__RootZone, A.async___rootScheduleMicrotask$closure(), A.findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,~())>"));
  })();
  (function staticFields() {
    $._JS_INTEROP_INTERCEPTOR_TAG = null;
    $.toStringVisiting = A._setArrayType([], type$.JSArray_Object);
    $.printToZone = null;
    $.Primitives__identityHashCodeProperty = null;
    $.BoundClosure__receiverFieldNameCache = null;
    $.BoundClosure__interceptorFieldNameCache = null;
    $.getTagFunction = null;
    $.alternateTagFunction = null;
    $.prototypeForTagFunction = null;
    $.dispatchRecordsForInstanceTags = null;
    $.interceptorsForUncacheableTags = null;
    $.initNativeDispatchFlag = null;
    $._Record__computedFieldKeys = A._setArrayType([], A.findType("JSArray<List<Object>?>"));
    $._nextCallback = null;
    $._lastCallback = null;
    $._lastPriorityCallback = null;
    $._isInCallbackLoop = false;
    $.Zone__current = B.C__RootZone;
    $._RootZone__rootDelegate = null;
    $._BigIntImpl__lastDividendDigits = null;
    $._BigIntImpl__lastDividendUsed = null;
    $._BigIntImpl__lastDivisorDigits = null;
    $._BigIntImpl__lastDivisorUsed = null;
    $._BigIntImpl____lastQuoRemDigits = A._Cell$named("_lastQuoRemDigits");
    $._BigIntImpl____lastQuoRemUsed = A._Cell$named("_lastQuoRemUsed");
    $._BigIntImpl____lastRemUsed = A._Cell$named("_lastRemUsed");
    $._BigIntImpl____lastRem_nsh = A._Cell$named("_lastRem_nsh");
    $.Element__parseDocument = null;
    $.Element__parseRange = null;
    $.Element__defaultValidator = null;
    $.Element__defaultSanitizer = null;
    $._Html5NodeValidator__attributeValidators = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Function);
    $._indentingBuiltValueToStringHelperIndent = 0;
    $.LogRecord__nextNumber = 0;
    $.Logger__loggers = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger);
    $.___lastKnownDigests = A._Cell$named("_lastKnownDigests");
  })();
  (function lazyInitializers() {
    var _lazyFinal = hunkHelpers.lazyFinal,
      _lazy = hunkHelpers.lazy;
    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartClosure"));
    _lazyFinal($, "nullFuture", "$get$nullFuture", () => B.C__RootZone.run$1$1(new A.nullFuture_closure(), A.findType("Future<Null>")));
    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        null.$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        (void 0).$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        null.$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        (void 0).$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", () => A._AsyncRun__initializeScheduleImmediate());
    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", () => A.findType("_Future<Null>")._as($.$get$nullFuture()));
    _lazyFinal($, "_RootZone__rootMap", "$get$_RootZone__rootMap", () => {
      var t1 = type$.dynamic;
      return A.HashMap_HashMap(null, null, null, t1, t1);
    });
    _lazyFinal($, "_Base64Decoder__inverseAlphabet", "$get$_Base64Decoder__inverseAlphabet", () => A.NativeInt8List__create1(A._ensureNativeList(A._setArrayType([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -1, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2], type$.JSArray_int))));
    _lazy($, "_Base64Decoder__emptyBuffer", "$get$_Base64Decoder__emptyBuffer", () => A.NativeUint8List_NativeUint8List(0));
    _lazyFinal($, "_BigIntImpl_zero", "$get$_BigIntImpl_zero", () => A._BigIntImpl__BigIntImpl$_fromInt(0));
    _lazyFinal($, "_BigIntImpl_one", "$get$_BigIntImpl_one", () => A._BigIntImpl__BigIntImpl$_fromInt(1));
    _lazyFinal($, "_BigIntImpl__minusOne", "$get$_BigIntImpl__minusOne", () => $.$get$_BigIntImpl_one().$negate(0));
    _lazyFinal($, "_BigIntImpl__bigInt10000", "$get$_BigIntImpl__bigInt10000", () => A._BigIntImpl__BigIntImpl$_fromInt(10000));
    _lazy($, "_BigIntImpl__parseRE", "$get$_BigIntImpl__parseRE", () => A.RegExp_RegExp("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$", false, false));
    _lazyFinal($, "_Uri__needsNoEncoding", "$get$_Uri__needsNoEncoding", () => A.RegExp_RegExp("^[\\-\\.0-9A-Z_a-z~]*$", true, false));
    _lazyFinal($, "_hashSeed", "$get$_hashSeed", () => A.objectHashCode(B.Type_Object_xQ6));
    _lazyFinal($, "_scannerTables", "$get$_scannerTables", () => A._createTables());
    _lazyFinal($, "_Html5NodeValidator__allowedElements", "$get$_Html5NodeValidator__allowedElements", () => A.LinkedHashSet_LinkedHashSet$from(["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"], type$.String));
    _lazyFinal($, "_context", "$get$_context", () => A._castToJsObject(A._wrapToDart(self)));
    _lazyFinal($, "_DART_OBJECT_PROPERTY_NAME", "$get$_DART_OBJECT_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartObject"));
    _lazyFinal($, "_dartProxyCtor", "$get$_dartProxyCtor", () => function DartObject(o) {
      this.o = o;
    });
    _lazyFinal($, "isSoundMode", "$get$isSoundMode", () => !type$.List_int._is(A._setArrayType([], A.findType("JSArray<int?>"))));
    _lazy($, "newBuiltValueToStringHelper", "$get$newBuiltValueToStringHelper", () => new A.newBuiltValueToStringHelper_closure());
    _lazyFinal($, "_runtimeType", "$get$_runtimeType", () => A.getRuntimeTypeOfDartObject(A.RegExp_RegExp("", true, false)));
    _lazy($, "_$buildStatusSerializer", "$get$_$buildStatusSerializer", () => new A._$BuildStatusSerializer());
    _lazy($, "_$buildResultSerializer", "$get$_$buildResultSerializer", () => new A._$BuildResultSerializer());
    _lazy($, "_$connectRequestSerializer", "$get$_$connectRequestSerializer", () => new A._$ConnectRequestSerializer());
    _lazy($, "_$debugEventSerializer", "$get$_$debugEventSerializer", () => new A._$DebugEventSerializer());
    _lazy($, "_$batchedDebugEventsSerializer", "$get$_$batchedDebugEventsSerializer", () => new A._$BatchedDebugEventsSerializer());
    _lazy($, "_$debugInfoSerializer", "$get$_$debugInfoSerializer", () => new A._$DebugInfoSerializer());
    _lazy($, "_$devToolsRequestSerializer", "$get$_$devToolsRequestSerializer", () => new A._$DevToolsRequestSerializer());
    _lazy($, "_$devToolsResponseSerializer", "$get$_$devToolsResponseSerializer", () => new A._$DevToolsResponseSerializer());
    _lazy($, "_$errorResponseSerializer", "$get$_$errorResponseSerializer", () => new A._$ErrorResponseSerializer());
    _lazy($, "_$extensionRequestSerializer", "$get$_$extensionRequestSerializer", () => new A._$ExtensionRequestSerializer());
    _lazy($, "_$extensionResponseSerializer", "$get$_$extensionResponseSerializer", () => new A._$ExtensionResponseSerializer());
    _lazy($, "_$extensionEventSerializer", "$get$_$extensionEventSerializer", () => new A._$ExtensionEventSerializer());
    _lazy($, "_$batchedEventsSerializer", "$get$_$batchedEventsSerializer", () => new A._$BatchedEventsSerializer());
    _lazy($, "_$isolateExitSerializer", "$get$_$isolateExitSerializer", () => new A._$IsolateExitSerializer());
    _lazy($, "_$isolateStartSerializer", "$get$_$isolateStartSerializer", () => new A._$IsolateStartSerializer());
    _lazy($, "_$registerEventSerializer", "$get$_$registerEventSerializer", () => new A._$RegisterEventSerializer());
    _lazy($, "_$runRequestSerializer", "$get$_$runRequestSerializer", () => new A._$RunRequestSerializer());
    _lazyFinal($, "serializers", "$get$serializers", () => $.$get$_$serializers());
    _lazy($, "_$serializers", "$get$_$serializers", () => {
      var t1 = A.Serializers_Serializers();
      t1 = A.BuiltJsonSerializersBuilder$_(t1._typeToSerializer.toBuilder$0(), t1._wireNameToSerializer.toBuilder$0(), t1._typeNameToSerializer.toBuilder$0(), t1.builderFactories.toBuilder$0(), t1.serializerPlugins.toBuilder$0());
      t1.add$1(0, $.$get$_$batchedDebugEventsSerializer());
      t1.add$1(0, $.$get$_$batchedEventsSerializer());
      t1.add$1(0, $.$get$_$buildResultSerializer());
      t1.add$1(0, $.$get$_$buildStatusSerializer());
      t1.add$1(0, $.$get$_$connectRequestSerializer());
      t1.add$1(0, $.$get$_$debugEventSerializer());
      t1.add$1(0, $.$get$_$debugInfoSerializer());
      t1.add$1(0, $.$get$_$devToolsRequestSerializer());
      t1.add$1(0, $.$get$_$devToolsResponseSerializer());
      t1.add$1(0, $.$get$_$errorResponseSerializer());
      t1.add$1(0, $.$get$_$extensionEventSerializer());
      t1.add$1(0, $.$get$_$extensionRequestSerializer());
      t1.add$1(0, $.$get$_$extensionResponseSerializer());
      t1.add$1(0, $.$get$_$isolateExitSerializer());
      t1.add$1(0, $.$get$_$isolateStartSerializer());
      t1.add$1(0, $.$get$_$registerEventSerializer());
      t1.add$1(0, $.$get$_$runRequestSerializer());
      t1.addBuilderFactory$2(B.FullType_EGl, new A._$serializers_closure());
      t1.addBuilderFactory$2(B.FullType_NIe, new A._$serializers_closure0());
      return t1.build$0();
    });
    _lazyFinal($, "_logger", "$get$_logger", () => A.Logger_Logger("Utilities"));
    _lazyFinal($, "Logger_root", "$get$Logger_root", () => A.Logger_Logger(""));
    _lazyFinal($, "_requestPool", "$get$_requestPool", () => {
      var t4,
        t1 = A.findType("Completer<PoolResource>"),
        t2 = A.ListQueue$(t1),
        t3 = A.ListQueue$(type$.void_Function);
      t1 = A.ListQueue$(t1);
      t4 = A.Completer_Completer(type$.dynamic);
      return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType("AsyncMemoizer<@>")));
    });
    _lazyFinal($, "Uuid__byteToHex", "$get$Uuid__byteToHex", () => {
      var i,
        _list = J.JSArray_JSArray$allocateGrowable(256, type$.String);
      for (i = 0; i < 256; ++i)
        _list[i] = B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(i, 16), 2, "0");
      return _list;
    });
    _lazyFinal($, "Uuid__stateExpando", "$get$Uuid__stateExpando", () => new A.Expando(new WeakMap(), A.findType("Expando<Map<String,@>>")));
    _lazyFinal($, "UuidUtil__random", "$get$UuidUtil__random", () => A.Random_Random(null));
    _lazyFinal($, "_createScript", "$get$_createScript", () => new A._createScript_closure().call$0());
    _lazyFinal($, "_noncePattern", "$get$_noncePattern", () => A.RegExp_RegExp("^[\\w+/_-]+[=]{0,2}$", true, false));
  })();
  (function nativeSupport() {
    !function() {
      var intern = function(s) {
        var o = {};
        o[s] = 1;
        return Object.keys(hunkHelpers.convertToFastObject(o))[0];
      };
      init.getIsolateTag = function(name) {
        return intern("___dart_" + name + init.isolateTag);
      };
      var tableProperty = "___dart_isolate_tags_";
      var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
      var rootProperty = "_ZxYxX";
      for (var i = 0;; i++) {
        var property = intern(rootProperty + "_" + i + "_");
        if (!(property in usedProperties)) {
          usedProperties[property] = 1;
          init.isolateTag = property;
          break;
        }
      }
      init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
    }();
    hunkHelpers.setOrUpdateInterceptorsByTag({WebGL: J.Interceptor, AnimationEffectReadOnly: J.JavaScriptObject, AnimationEffectTiming: J.JavaScriptObject, AnimationEffectTimingReadOnly: J.JavaScriptObject, AnimationTimeline: J.JavaScriptObject, AnimationWorkletGlobalScope: J.JavaScriptObject, AuthenticatorAssertionResponse: J.JavaScriptObject, AuthenticatorAttestationResponse: J.JavaScriptObject, AuthenticatorResponse: J.JavaScriptObject, BackgroundFetchFetch: J.JavaScriptObject, BackgroundFetchManager: J.JavaScriptObject, BackgroundFetchSettledFetch: J.JavaScriptObject, BarProp: J.JavaScriptObject, BarcodeDetector: J.JavaScriptObject, BluetoothRemoteGATTDescriptor: J.JavaScriptObject, Body: J.JavaScriptObject, BudgetState: J.JavaScriptObject, CacheStorage: J.JavaScriptObject, CanvasGradient: J.JavaScriptObject, CanvasPattern: J.JavaScriptObject, CanvasRenderingContext2D: J.JavaScriptObject, Client: J.JavaScriptObject, Clients: J.JavaScriptObject, CookieStore: J.JavaScriptObject, Coordinates: J.JavaScriptObject, Credential: J.JavaScriptObject, CredentialUserData: J.JavaScriptObject, CredentialsContainer: J.JavaScriptObject, Crypto: J.JavaScriptObject, CryptoKey: J.JavaScriptObject, CSS: J.JavaScriptObject, CSSVariableReferenceValue: J.JavaScriptObject, CustomElementRegistry: J.JavaScriptObject, DataTransfer: J.JavaScriptObject, DataTransferItem: J.JavaScriptObject, DeprecatedStorageInfo: J.JavaScriptObject, DeprecatedStorageQuota: J.JavaScriptObject, DeprecationReport: J.JavaScriptObject, DetectedBarcode: J.JavaScriptObject, DetectedFace: J.JavaScriptObject, DetectedText: J.JavaScriptObject, DeviceAcceleration: J.JavaScriptObject, DeviceRotationRate: J.JavaScriptObject, DirectoryEntry: J.JavaScriptObject, webkitFileSystemDirectoryEntry: J.JavaScriptObject, FileSystemDirectoryEntry: J.JavaScriptObject, DirectoryReader: J.JavaScriptObject, WebKitDirectoryReader: J.JavaScriptObject, webkitFileSystemDirectoryReader: J.JavaScriptObject, FileSystemDirectoryReader: J.JavaScriptObject, DocumentOrShadowRoot: J.JavaScriptObject, DocumentTimeline: J.JavaScriptObject, DOMError: J.JavaScriptObject, Iterator: J.JavaScriptObject, DOMMatrix: J.JavaScriptObject, DOMMatrixReadOnly: J.JavaScriptObject, DOMParser: J.JavaScriptObject, DOMPoint: J.JavaScriptObject, DOMPointReadOnly: J.JavaScriptObject, DOMQuad: J.JavaScriptObject, DOMStringMap: J.JavaScriptObject, Entry: J.JavaScriptObject, webkitFileSystemEntry: J.JavaScriptObject, FileSystemEntry: J.JavaScriptObject, External: J.JavaScriptObject, FaceDetector: J.JavaScriptObject, FederatedCredential: J.JavaScriptObject, FileEntry: J.JavaScriptObject, webkitFileSystemFileEntry: J.JavaScriptObject, FileSystemFileEntry: J.JavaScriptObject, DOMFileSystem: J.JavaScriptObject, WebKitFileSystem: J.JavaScriptObject, webkitFileSystem: J.JavaScriptObject, FileSystem: J.JavaScriptObject, FontFace: J.JavaScriptObject, FontFaceSource: J.JavaScriptObject, FormData: J.JavaScriptObject, GamepadButton: J.JavaScriptObject, GamepadPose: J.JavaScriptObject, Geolocation: J.JavaScriptObject, Position: J.JavaScriptObject, GeolocationPosition: J.JavaScriptObject, Headers: J.JavaScriptObject, HTMLHyperlinkElementUtils: J.JavaScriptObject, IdleDeadline: J.JavaScriptObject, ImageBitmap: J.JavaScriptObject, ImageBitmapRenderingContext: J.JavaScriptObject, ImageCapture: J.JavaScriptObject, InputDeviceCapabilities: J.JavaScriptObject, IntersectionObserver: J.JavaScriptObject, IntersectionObserverEntry: J.JavaScriptObject, InterventionReport: J.JavaScriptObject, KeyframeEffect: J.JavaScriptObject, KeyframeEffectReadOnly: J.JavaScriptObject, MediaCapabilities: J.JavaScriptObject, MediaCapabilitiesInfo: J.JavaScriptObject, MediaDeviceInfo: J.JavaScriptObject, MediaError: J.JavaScriptObject, MediaKeyStatusMap: J.JavaScriptObject, MediaKeySystemAccess: J.JavaScriptObject, MediaKeys: J.JavaScriptObject, MediaKeysPolicy: J.JavaScriptObject, MediaMetadata: J.JavaScriptObject, MediaSession: J.JavaScriptObject, MediaSettingsRange: J.JavaScriptObject, MemoryInfo: J.JavaScriptObject, MessageChannel: J.JavaScriptObject, Metadata: J.JavaScriptObject, MutationObserver: J.JavaScriptObject, WebKitMutationObserver: J.JavaScriptObject, MutationRecord: J.JavaScriptObject, NavigationPreloadManager: J.JavaScriptObject, Navigator: J.JavaScriptObject, NavigatorAutomationInformation: J.JavaScriptObject, NavigatorConcurrentHardware: J.JavaScriptObject, NavigatorCookies: J.JavaScriptObject, NavigatorUserMediaError: J.JavaScriptObject, NodeFilter: J.JavaScriptObject, NodeIterator: J.JavaScriptObject, NonDocumentTypeChildNode: J.JavaScriptObject, NonElementParentNode: J.JavaScriptObject, NoncedElement: J.JavaScriptObject, OffscreenCanvasRenderingContext2D: J.JavaScriptObject, OverconstrainedError: J.JavaScriptObject, PaintRenderingContext2D: J.JavaScriptObject, PaintSize: J.JavaScriptObject, PaintWorkletGlobalScope: J.JavaScriptObject, PasswordCredential: J.JavaScriptObject, Path2D: J.JavaScriptObject, PaymentAddress: J.JavaScriptObject, PaymentInstruments: J.JavaScriptObject, PaymentManager: J.JavaScriptObject, PaymentResponse: J.JavaScriptObject, PerformanceEntry: J.JavaScriptObject, PerformanceLongTaskTiming: J.JavaScriptObject, PerformanceMark: J.JavaScriptObject, PerformanceMeasure: J.JavaScriptObject, PerformanceNavigation: J.JavaScriptObject, PerformanceNavigationTiming: J.JavaScriptObject, PerformanceObserver: J.JavaScriptObject, PerformanceObserverEntryList: J.JavaScriptObject, PerformancePaintTiming: J.JavaScriptObject, PerformanceResourceTiming: J.JavaScriptObject, PerformanceServerTiming: J.JavaScriptObject, PerformanceTiming: J.JavaScriptObject, Permissions: J.JavaScriptObject, PhotoCapabilities: J.JavaScriptObject, PositionError: J.JavaScriptObject, GeolocationPositionError: J.JavaScriptObject, Presentation: J.JavaScriptObject, PresentationReceiver: J.JavaScriptObject, PublicKeyCredential: J.JavaScriptObject, PushManager: J.JavaScriptObject, PushMessageData: J.JavaScriptObject, PushSubscription: J.JavaScriptObject, PushSubscriptionOptions: J.JavaScriptObject, Range: J.JavaScriptObject, RelatedApplication: J.JavaScriptObject, ReportBody: J.JavaScriptObject, ReportingObserver: J.JavaScriptObject, ResizeObserver: J.JavaScriptObject, ResizeObserverEntry: J.JavaScriptObject, RTCCertificate: J.JavaScriptObject, RTCIceCandidate: J.JavaScriptObject, mozRTCIceCandidate: J.JavaScriptObject, RTCLegacyStatsReport: J.JavaScriptObject, RTCRtpContributingSource: J.JavaScriptObject, RTCRtpReceiver: J.JavaScriptObject, RTCRtpSender: J.JavaScriptObject, RTCSessionDescription: J.JavaScriptObject, mozRTCSessionDescription: J.JavaScriptObject, RTCStatsResponse: J.JavaScriptObject, Screen: J.JavaScriptObject, ScrollState: J.JavaScriptObject, ScrollTimeline: J.JavaScriptObject, Selection: J.JavaScriptObject, SpeechRecognitionAlternative: J.JavaScriptObject, SpeechSynthesisVoice: J.JavaScriptObject, StaticRange: J.JavaScriptObject, StorageManager: J.JavaScriptObject, StyleMedia: J.JavaScriptObject, StylePropertyMap: J.JavaScriptObject, StylePropertyMapReadonly: J.JavaScriptObject, SyncManager: J.JavaScriptObject, TaskAttributionTiming: J.JavaScriptObject, TextDetector: J.JavaScriptObject, TextMetrics: J.JavaScriptObject, TrackDefault: J.JavaScriptObject, TreeWalker: J.JavaScriptObject, TrustedHTML: J.JavaScriptObject, TrustedScriptURL: J.JavaScriptObject, TrustedURL: J.JavaScriptObject, UnderlyingSourceBase: J.JavaScriptObject, URLSearchParams: J.JavaScriptObject, VRCoordinateSystem: J.JavaScriptObject, VRDisplayCapabilities: J.JavaScriptObject, VREyeParameters: J.JavaScriptObject, VRFrameData: J.JavaScriptObject, VRFrameOfReference: J.JavaScriptObject, VRPose: J.JavaScriptObject, VRStageBounds: J.JavaScriptObject, VRStageBoundsPoint: J.JavaScriptObject, VRStageParameters: J.JavaScriptObject, ValidityState: J.JavaScriptObject, VideoPlaybackQuality: J.JavaScriptObject, VideoTrack: J.JavaScriptObject, VTTRegion: J.JavaScriptObject, WindowClient: J.JavaScriptObject, WorkletAnimation: J.JavaScriptObject, WorkletGlobalScope: J.JavaScriptObject, XPathEvaluator: J.JavaScriptObject, XPathExpression: J.JavaScriptObject, XPathNSResolver: J.JavaScriptObject, XPathResult: J.JavaScriptObject, XMLSerializer: J.JavaScriptObject, XSLTProcessor: J.JavaScriptObject, Bluetooth: J.JavaScriptObject, BluetoothCharacteristicProperties: J.JavaScriptObject, BluetoothRemoteGATTServer: J.JavaScriptObject, BluetoothRemoteGATTService: J.JavaScriptObject, BluetoothUUID: J.JavaScriptObject, BudgetService: J.JavaScriptObject, Cache: J.JavaScriptObject, DOMFileSystemSync: J.JavaScriptObject, DirectoryEntrySync: J.JavaScriptObject, DirectoryReaderSync: J.JavaScriptObject, EntrySync: J.JavaScriptObject, FileEntrySync: J.JavaScriptObject, FileReaderSync: J.JavaScriptObject, FileWriterSync: J.JavaScriptObject, HTMLAllCollection: J.JavaScriptObject, Mojo: J.JavaScriptObject, MojoHandle: J.JavaScriptObject, MojoWatcher: J.JavaScriptObject, NFC: J.JavaScriptObject, PagePopupController: J.JavaScriptObject, Report: J.JavaScriptObject, Request: J.JavaScriptObject, Response: J.JavaScriptObject, SubtleCrypto: J.JavaScriptObject, USBAlternateInterface: J.JavaScriptObject, USBConfiguration: J.JavaScriptObject, USBDevice: J.JavaScriptObject, USBEndpoint: J.JavaScriptObject, USBInTransferResult: J.JavaScriptObject, USBInterface: J.JavaScriptObject, USBIsochronousInTransferPacket: J.JavaScriptObject, USBIsochronousInTransferResult: J.JavaScriptObject, USBIsochronousOutTransferPacket: J.JavaScriptObject, USBIsochronousOutTransferResult: J.JavaScriptObject, USBOutTransferResult: J.JavaScriptObject, WorkerLocation: J.JavaScriptObject, WorkerNavigator: J.JavaScriptObject, Worklet: J.JavaScriptObject, IDBCursor: J.JavaScriptObject, IDBCursorWithValue: J.JavaScriptObject, IDBFactory: J.JavaScriptObject, IDBIndex: J.JavaScriptObject, IDBObjectStore: J.JavaScriptObject, IDBObservation: J.JavaScriptObject, IDBObserver: J.JavaScriptObject, IDBObserverChanges: J.JavaScriptObject, SVGAngle: J.JavaScriptObject, SVGAnimatedAngle: J.JavaScriptObject, SVGAnimatedBoolean: J.JavaScriptObject, SVGAnimatedEnumeration: J.JavaScriptObject, SVGAnimatedInteger: J.JavaScriptObject, SVGAnimatedLength: J.JavaScriptObject, SVGAnimatedLengthList: J.JavaScriptObject, SVGAnimatedNumber: J.JavaScriptObject, SVGAnimatedNumberList: J.JavaScriptObject, SVGAnimatedPreserveAspectRatio: J.JavaScriptObject, SVGAnimatedRect: J.JavaScriptObject, SVGAnimatedString: J.JavaScriptObject, SVGAnimatedTransformList: J.JavaScriptObject, SVGMatrix: J.JavaScriptObject, SVGPoint: J.JavaScriptObject, SVGPreserveAspectRatio: J.JavaScriptObject, SVGRect: J.JavaScriptObject, SVGUnitTypes: J.JavaScriptObject, AudioListener: J.JavaScriptObject, AudioParam: J.JavaScriptObject, AudioTrack: J.JavaScriptObject, AudioWorkletGlobalScope: J.JavaScriptObject, AudioWorkletProcessor: J.JavaScriptObject, PeriodicWave: J.JavaScriptObject, WebGLActiveInfo: J.JavaScriptObject, ANGLEInstancedArrays: J.JavaScriptObject, ANGLE_instanced_arrays: J.JavaScriptObject, WebGLBuffer: J.JavaScriptObject, WebGLCanvas: J.JavaScriptObject, WebGLColorBufferFloat: J.JavaScriptObject, WebGLCompressedTextureASTC: J.JavaScriptObject, WebGLCompressedTextureATC: J.JavaScriptObject, WEBGL_compressed_texture_atc: J.JavaScriptObject, WebGLCompressedTextureETC1: J.JavaScriptObject, WEBGL_compressed_texture_etc1: J.JavaScriptObject, WebGLCompressedTextureETC: J.JavaScriptObject, WebGLCompressedTexturePVRTC: J.JavaScriptObject, WEBGL_compressed_texture_pvrtc: J.JavaScriptObject, WebGLCompressedTextureS3TC: J.JavaScriptObject, WEBGL_compressed_texture_s3tc: J.JavaScriptObject, WebGLCompressedTextureS3TCsRGB: J.JavaScriptObject, WebGLDebugRendererInfo: J.JavaScriptObject, WEBGL_debug_renderer_info: J.JavaScriptObject, WebGLDebugShaders: J.JavaScriptObject, WEBGL_debug_shaders: J.JavaScriptObject, WebGLDepthTexture: J.JavaScriptObject, WEBGL_depth_texture: J.JavaScriptObject, WebGLDrawBuffers: J.JavaScriptObject, WEBGL_draw_buffers: J.JavaScriptObject, EXTsRGB: J.JavaScriptObject, EXT_sRGB: J.JavaScriptObject, EXTBlendMinMax: J.JavaScriptObject, EXT_blend_minmax: J.JavaScriptObject, EXTColorBufferFloat: J.JavaScriptObject, EXTColorBufferHalfFloat: J.JavaScriptObject, EXTDisjointTimerQuery: J.JavaScriptObject, EXTDisjointTimerQueryWebGL2: J.JavaScriptObject, EXTFragDepth: J.JavaScriptObject, EXT_frag_depth: J.JavaScriptObject, EXTShaderTextureLOD: J.JavaScriptObject, EXT_shader_texture_lod: J.JavaScriptObject, EXTTextureFilterAnisotropic: J.JavaScriptObject, EXT_texture_filter_anisotropic: J.JavaScriptObject, WebGLFramebuffer: J.JavaScriptObject, WebGLGetBufferSubDataAsync: J.JavaScriptObject, WebGLLoseContext: J.JavaScriptObject, WebGLExtensionLoseContext: J.JavaScriptObject, WEBGL_lose_context: J.JavaScriptObject, OESElementIndexUint: J.JavaScriptObject, OES_element_index_uint: J.JavaScriptObject, OESStandardDerivatives: J.JavaScriptObject, OES_standard_derivatives: J.JavaScriptObject, OESTextureFloat: J.JavaScriptObject, OES_texture_float: J.JavaScriptObject, OESTextureFloatLinear: J.JavaScriptObject, OES_texture_float_linear: J.JavaScriptObject, OESTextureHalfFloat: J.JavaScriptObject, OES_texture_half_float: J.JavaScriptObject, OESTextureHalfFloatLinear: J.JavaScriptObject, OES_texture_half_float_linear: J.JavaScriptObject, OESVertexArrayObject: J.JavaScriptObject, OES_vertex_array_object: J.JavaScriptObject, WebGLProgram: J.JavaScriptObject, WebGLQuery: J.JavaScriptObject, WebGLRenderbuffer: J.JavaScriptObject, WebGLRenderingContext: J.JavaScriptObject, WebGL2RenderingContext: J.JavaScriptObject, WebGLSampler: J.JavaScriptObject, WebGLShader: J.JavaScriptObject, WebGLShaderPrecisionFormat: J.JavaScriptObject, WebGLSync: J.JavaScriptObject, WebGLTexture: J.JavaScriptObject, WebGLTimerQueryEXT: J.JavaScriptObject, WebGLTransformFeedback: J.JavaScriptObject, WebGLUniformLocation: J.JavaScriptObject, WebGLVertexArrayObject: J.JavaScriptObject, WebGLVertexArrayObjectOES: J.JavaScriptObject, WebGL2RenderingContextBase: J.JavaScriptObject, ArrayBuffer: A.NativeByteBuffer, ArrayBufferView: A.NativeTypedData, DataView: A.NativeByteData, Float32Array: A.NativeFloat32List, Float64Array: A.NativeFloat64List, Int16Array: A.NativeInt16List, Int32Array: A.NativeInt32List, Int8Array: A.NativeInt8List, Uint16Array: A.NativeUint16List, Uint32Array: A.NativeUint32List, Uint8ClampedArray: A.NativeUint8ClampedList, CanvasPixelArray: A.NativeUint8ClampedList, Uint8Array: A.NativeUint8List, HTMLAudioElement: A.HtmlElement, HTMLBRElement: A.HtmlElement, HTMLButtonElement: A.HtmlElement, HTMLCanvasElement: A.HtmlElement, HTMLContentElement: A.HtmlElement, HTMLDListElement: A.HtmlElement, HTMLDataElement: A.HtmlElement, HTMLDataListElement: A.HtmlElement, HTMLDetailsElement: A.HtmlElement, HTMLDialogElement: A.HtmlElement, HTMLDivElement: A.HtmlElement, HTMLEmbedElement: A.HtmlElement, HTMLFieldSetElement: A.HtmlElement, HTMLHRElement: A.HtmlElement, HTMLHeadElement: A.HtmlElement, HTMLHeadingElement: A.HtmlElement, HTMLHtmlElement: A.HtmlElement, HTMLIFrameElement: A.HtmlElement, HTMLImageElement: A.HtmlElement, HTMLInputElement: A.HtmlElement, HTMLLIElement: A.HtmlElement, HTMLLabelElement: A.HtmlElement, HTMLLegendElement: A.HtmlElement, HTMLLinkElement: A.HtmlElement, HTMLMapElement: A.HtmlElement, HTMLMediaElement: A.HtmlElement, HTMLMenuElement: A.HtmlElement, HTMLMetaElement: A.HtmlElement, HTMLMeterElement: A.HtmlElement, HTMLModElement: A.HtmlElement, HTMLOListElement: A.HtmlElement, HTMLObjectElement: A.HtmlElement, HTMLOptGroupElement: A.HtmlElement, HTMLOptionElement: A.HtmlElement, HTMLOutputElement: A.HtmlElement, HTMLParagraphElement: A.HtmlElement, HTMLParamElement: A.HtmlElement, HTMLPictureElement: A.HtmlElement, HTMLPreElement: A.HtmlElement, HTMLProgressElement: A.HtmlElement, HTMLQuoteElement: A.HtmlElement, HTMLShadowElement: A.HtmlElement, HTMLSlotElement: A.HtmlElement, HTMLSourceElement: A.HtmlElement, HTMLSpanElement: A.HtmlElement, HTMLStyleElement: A.HtmlElement, HTMLTableCaptionElement: A.HtmlElement, HTMLTableCellElement: A.HtmlElement, HTMLTableDataCellElement: A.HtmlElement, HTMLTableHeaderCellElement: A.HtmlElement, HTMLTableColElement: A.HtmlElement, HTMLTextAreaElement: A.HtmlElement, HTMLTimeElement: A.HtmlElement, HTMLTitleElement: A.HtmlElement, HTMLTrackElement: A.HtmlElement, HTMLUListElement: A.HtmlElement, HTMLUnknownElement: A.HtmlElement, HTMLVideoElement: A.HtmlElement, HTMLDirectoryElement: A.HtmlElement, HTMLFontElement: A.HtmlElement, HTMLFrameElement: A.HtmlElement, HTMLFrameSetElement: A.HtmlElement, HTMLMarqueeElement: A.HtmlElement, HTMLElement: A.HtmlElement, AccessibleNodeList: A.AccessibleNodeList, HTMLAnchorElement: A.AnchorElement, HTMLAreaElement: A.AreaElement, HTMLBaseElement: A.BaseElement, Blob: A.Blob, HTMLBodyElement: A.BodyElement, CDATASection: A.CharacterData, CharacterData: A.CharacterData, Comment: A.CharacterData, ProcessingInstruction: A.CharacterData, Text: A.CharacterData, CSSPerspective: A.CssPerspective, CSSCharsetRule: A.CssRule, CSSConditionRule: A.CssRule, CSSFontFaceRule: A.CssRule, CSSGroupingRule: A.CssRule, CSSImportRule: A.CssRule, CSSKeyframeRule: A.CssRule, MozCSSKeyframeRule: A.CssRule, WebKitCSSKeyframeRule: A.CssRule, CSSKeyframesRule: A.CssRule, MozCSSKeyframesRule: A.CssRule, WebKitCSSKeyframesRule: A.CssRule, CSSMediaRule: A.CssRule, CSSNamespaceRule: A.CssRule, CSSPageRule: A.CssRule, CSSRule: A.CssRule, CSSStyleRule: A.CssRule, CSSSupportsRule: A.CssRule, CSSViewportRule: A.CssRule, CSSStyleDeclaration: A.CssStyleDeclaration, MSStyleCSSProperties: A.CssStyleDeclaration, CSS2Properties: A.CssStyleDeclaration, CSSImageValue: A.CssStyleValue, CSSKeywordValue: A.CssStyleValue, CSSNumericValue: A.CssStyleValue, CSSPositionValue: A.CssStyleValue, CSSResourceValue: A.CssStyleValue, CSSUnitValue: A.CssStyleValue, CSSURLImageValue: A.CssStyleValue, CSSStyleValue: A.CssStyleValue, CSSMatrixComponent: A.CssTransformComponent, CSSRotation: A.CssTransformComponent, CSSScale: A.CssTransformComponent, CSSSkew: A.CssTransformComponent, CSSTranslation: A.CssTransformComponent, CSSTransformComponent: A.CssTransformComponent, CSSTransformValue: A.CssTransformValue, CSSUnparsedValue: A.CssUnparsedValue, CustomEvent: A.CustomEvent, DataTransferItemList: A.DataTransferItemList, XMLDocument: A.Document, Document: A.Document, DOMException: A.DomException, DOMImplementation: A.DomImplementation, ClientRectList: A.DomRectList, DOMRectList: A.DomRectList, DOMRectReadOnly: A.DomRectReadOnly, DOMStringList: A.DomStringList, DOMTokenList: A.DomTokenList, MathMLElement: A.Element, Element: A.Element, AbortPaymentEvent: A.Event, AnimationEvent: A.Event, AnimationPlaybackEvent: A.Event, ApplicationCacheErrorEvent: A.Event, BackgroundFetchClickEvent: A.Event, BackgroundFetchEvent: A.Event, BackgroundFetchFailEvent: A.Event, BackgroundFetchedEvent: A.Event, BeforeInstallPromptEvent: A.Event, BeforeUnloadEvent: A.Event, BlobEvent: A.Event, CanMakePaymentEvent: A.Event, ClipboardEvent: A.Event, CloseEvent: A.Event, DeviceMotionEvent: A.Event, DeviceOrientationEvent: A.Event, ErrorEvent: A.Event, ExtendableEvent: A.Event, ExtendableMessageEvent: A.Event, FetchEvent: A.Event, FontFaceSetLoadEvent: A.Event, ForeignFetchEvent: A.Event, GamepadEvent: A.Event, HashChangeEvent: A.Event, InstallEvent: A.Event, MediaEncryptedEvent: A.Event, MediaKeyMessageEvent: A.Event, MediaQueryListEvent: A.Event, MediaStreamEvent: A.Event, MediaStreamTrackEvent: A.Event, MIDIConnectionEvent: A.Event, MIDIMessageEvent: A.Event, MutationEvent: A.Event, NotificationEvent: A.Event, PageTransitionEvent: A.Event, PaymentRequestEvent: A.Event, PaymentRequestUpdateEvent: A.Event, PopStateEvent: A.Event, PresentationConnectionAvailableEvent: A.Event, PresentationConnectionCloseEvent: A.Event, PromiseRejectionEvent: A.Event, PushEvent: A.Event, RTCDataChannelEvent: A.Event, RTCDTMFToneChangeEvent: A.Event, RTCPeerConnectionIceEvent: A.Event, RTCTrackEvent: A.Event, SecurityPolicyViolationEvent: A.Event, SensorErrorEvent: A.Event, SpeechRecognitionError: A.Event, SpeechRecognitionEvent: A.Event, SpeechSynthesisEvent: A.Event, StorageEvent: A.Event, SyncEvent: A.Event, TrackEvent: A.Event, TransitionEvent: A.Event, WebKitTransitionEvent: A.Event, VRDeviceEvent: A.Event, VRDisplayEvent: A.Event, VRSessionEvent: A.Event, MojoInterfaceRequestEvent: A.Event, USBConnectionEvent: A.Event, IDBVersionChangeEvent: A.Event, AudioProcessingEvent: A.Event, OfflineAudioCompletionEvent: A.Event, WebGLContextEvent: A.Event, Event: A.Event, InputEvent: A.Event, SubmitEvent: A.Event, AbsoluteOrientationSensor: A.EventTarget, Accelerometer: A.EventTarget, AccessibleNode: A.EventTarget, AmbientLightSensor: A.EventTarget, Animation: A.EventTarget, ApplicationCache: A.EventTarget, DOMApplicationCache: A.EventTarget, OfflineResourceList: A.EventTarget, BackgroundFetchRegistration: A.EventTarget, BatteryManager: A.EventTarget, BroadcastChannel: A.EventTarget, CanvasCaptureMediaStreamTrack: A.EventTarget, EventSource: A.EventTarget, FileReader: A.EventTarget, FontFaceSet: A.EventTarget, Gyroscope: A.EventTarget, LinearAccelerationSensor: A.EventTarget, Magnetometer: A.EventTarget, MediaDevices: A.EventTarget, MediaKeySession: A.EventTarget, MediaQueryList: A.EventTarget, MediaRecorder: A.EventTarget, MediaSource: A.EventTarget, MediaStream: A.EventTarget, MediaStreamTrack: A.EventTarget, MIDIAccess: A.EventTarget, MIDIInput: A.EventTarget, MIDIOutput: A.EventTarget, MIDIPort: A.EventTarget, NetworkInformation: A.EventTarget, Notification: A.EventTarget, OffscreenCanvas: A.EventTarget, OrientationSensor: A.EventTarget, PaymentRequest: A.EventTarget, Performance: A.EventTarget, PermissionStatus: A.EventTarget, PresentationAvailability: A.EventTarget, PresentationConnection: A.EventTarget, PresentationConnectionList: A.EventTarget, PresentationRequest: A.EventTarget, RelativeOrientationSensor: A.EventTarget, RemotePlayback: A.EventTarget, RTCDataChannel: A.EventTarget, DataChannel: A.EventTarget, RTCDTMFSender: A.EventTarget, RTCPeerConnection: A.EventTarget, webkitRTCPeerConnection: A.EventTarget, mozRTCPeerConnection: A.EventTarget, ScreenOrientation: A.EventTarget, Sensor: A.EventTarget, ServiceWorker: A.EventTarget, ServiceWorkerContainer: A.EventTarget, ServiceWorkerRegistration: A.EventTarget, SharedWorker: A.EventTarget, SpeechRecognition: A.EventTarget, webkitSpeechRecognition: A.EventTarget, SpeechSynthesis: A.EventTarget, SpeechSynthesisUtterance: A.EventTarget, VR: A.EventTarget, VRDevice: A.EventTarget, VRDisplay: A.EventTarget, VRSession: A.EventTarget, VisualViewport: A.EventTarget, WebSocket: A.EventTarget, Worker: A.EventTarget, WorkerPerformance: A.EventTarget, BluetoothDevice: A.EventTarget, BluetoothRemoteGATTCharacteristic: A.EventTarget, Clipboard: A.EventTarget, MojoInterfaceInterceptor: A.EventTarget, USB: A.EventTarget, IDBDatabase: A.EventTarget, IDBOpenDBRequest: A.EventTarget, IDBVersionChangeRequest: A.EventTarget, IDBRequest: A.EventTarget, IDBTransaction: A.EventTarget, AnalyserNode: A.EventTarget, RealtimeAnalyserNode: A.EventTarget, AudioBufferSourceNode: A.EventTarget, AudioDestinationNode: A.EventTarget, AudioNode: A.EventTarget, AudioScheduledSourceNode: A.EventTarget, AudioWorkletNode: A.EventTarget, BiquadFilterNode: A.EventTarget, ChannelMergerNode: A.EventTarget, AudioChannelMerger: A.EventTarget, ChannelSplitterNode: A.EventTarget, AudioChannelSplitter: A.EventTarget, ConstantSourceNode: A.EventTarget, ConvolverNode: A.EventTarget, DelayNode: A.EventTarget, DynamicsCompressorNode: A.EventTarget, GainNode: A.EventTarget, AudioGainNode: A.EventTarget, IIRFilterNode: A.EventTarget, MediaElementAudioSourceNode: A.EventTarget, MediaStreamAudioDestinationNode: A.EventTarget, MediaStreamAudioSourceNode: A.EventTarget, OscillatorNode: A.EventTarget, Oscillator: A.EventTarget, PannerNode: A.EventTarget, AudioPannerNode: A.EventTarget, webkitAudioPannerNode: A.EventTarget, ScriptProcessorNode: A.EventTarget, JavaScriptAudioNode: A.EventTarget, StereoPannerNode: A.EventTarget, WaveShaperNode: A.EventTarget, EventTarget: A.EventTarget, File: A.File, FileList: A.FileList, FileWriter: A.FileWriter, HTMLFormElement: A.FormElement, Gamepad: A.Gamepad, History: A.History, HTMLCollection: A.HtmlCollection, HTMLFormControlsCollection: A.HtmlCollection, HTMLOptionsCollection: A.HtmlCollection, HTMLDocument: A.HtmlDocument, XMLHttpRequest: A.HttpRequest, XMLHttpRequestUpload: A.HttpRequestEventTarget, XMLHttpRequestEventTarget: A.HttpRequestEventTarget, ImageData: A.ImageData, KeyboardEvent: A.KeyboardEvent, Location: A.Location, MediaList: A.MediaList, MessageEvent: A.MessageEvent, MessagePort: A.MessagePort, MIDIInputMap: A.MidiInputMap, MIDIOutputMap: A.MidiOutputMap, MimeType: A.MimeType, MimeTypeArray: A.MimeTypeArray, DocumentFragment: A.Node, ShadowRoot: A.Node, DocumentType: A.Node, Node: A.Node, NodeList: A.NodeList, RadioNodeList: A.NodeList, Plugin: A.Plugin, PluginArray: A.PluginArray, ProgressEvent: A.ProgressEvent, ResourceProgressEvent: A.ProgressEvent, RTCStatsReport: A.RtcStatsReport, HTMLScriptElement: A.ScriptElement, HTMLSelectElement: A.SelectElement, SharedArrayBuffer: A.SharedArrayBuffer, SourceBuffer: A.SourceBuffer, SourceBufferList: A.SourceBufferList, SpeechGrammar: A.SpeechGrammar, SpeechGrammarList: A.SpeechGrammarList, SpeechRecognitionResult: A.SpeechRecognitionResult, Storage: A.Storage, CSSStyleSheet: A.StyleSheet, StyleSheet: A.StyleSheet, HTMLTableElement: A.TableElement, HTMLTableRowElement: A.TableRowElement, HTMLTableSectionElement: A.TableSectionElement, HTMLTemplateElement: A.TemplateElement, TextTrack: A.TextTrack, TextTrackCue: A.TextTrackCue, VTTCue: A.TextTrackCue, TextTrackCueList: A.TextTrackCueList, TextTrackList: A.TextTrackList, TimeRanges: A.TimeRanges, Touch: A.Touch, TouchList: A.TouchList, TrackDefaultList: A.TrackDefaultList, CompositionEvent: A.UIEvent, FocusEvent: A.UIEvent, MouseEvent: A.UIEvent, DragEvent: A.UIEvent, PointerEvent: A.UIEvent, TextEvent: A.UIEvent, TouchEvent: A.UIEvent, WheelEvent: A.UIEvent, UIEvent: A.UIEvent, URL: A.Url, VideoTrackList: A.VideoTrackList, Window: A.Window, DOMWindow: A.Window, DedicatedWorkerGlobalScope: A.WorkerGlobalScope, ServiceWorkerGlobalScope: A.WorkerGlobalScope, SharedWorkerGlobalScope: A.WorkerGlobalScope, WorkerGlobalScope: A.WorkerGlobalScope, Attr: A._Attr, CSSRuleList: A._CssRuleList, ClientRect: A._DomRect, DOMRect: A._DomRect, GamepadList: A._GamepadList, NamedNodeMap: A._NamedNodeMap, MozNamedAttrMap: A._NamedNodeMap, SpeechRecognitionResultList: A._SpeechRecognitionResultList, StyleSheetList: A._StyleSheetList, IDBKeyRange: A.KeyRange, SVGLength: A.Length, SVGLengthList: A.LengthList, SVGNumber: A.Number, SVGNumberList: A.NumberList, SVGPointList: A.PointList, SVGScriptElement: A.ScriptElement0, SVGStringList: A.StringList, SVGAElement: A.SvgElement, SVGAnimateElement: A.SvgElement, SVGAnimateMotionElement: A.SvgElement, SVGAnimateTransformElement: A.SvgElement, SVGAnimationElement: A.SvgElement, SVGCircleElement: A.SvgElement, SVGClipPathElement: A.SvgElement, SVGDefsElement: A.SvgElement, SVGDescElement: A.SvgElement, SVGDiscardElement: A.SvgElement, SVGEllipseElement: A.SvgElement, SVGFEBlendElement: A.SvgElement, SVGFEColorMatrixElement: A.SvgElement, SVGFEComponentTransferElement: A.SvgElement, SVGFECompositeElement: A.SvgElement, SVGFEConvolveMatrixElement: A.SvgElement, SVGFEDiffuseLightingElement: A.SvgElement, SVGFEDisplacementMapElement: A.SvgElement, SVGFEDistantLightElement: A.SvgElement, SVGFEFloodElement: A.SvgElement, SVGFEFuncAElement: A.SvgElement, SVGFEFuncBElement: A.SvgElement, SVGFEFuncGElement: A.SvgElement, SVGFEFuncRElement: A.SvgElement, SVGFEGaussianBlurElement: A.SvgElement, SVGFEImageElement: A.SvgElement, SVGFEMergeElement: A.SvgElement, SVGFEMergeNodeElement: A.SvgElement, SVGFEMorphologyElement: A.SvgElement, SVGFEOffsetElement: A.SvgElement, SVGFEPointLightElement: A.SvgElement, SVGFESpecularLightingElement: A.SvgElement, SVGFESpotLightElement: A.SvgElement, SVGFETileElement: A.SvgElement, SVGFETurbulenceElement: A.SvgElement, SVGFilterElement: A.SvgElement, SVGForeignObjectElement: A.SvgElement, SVGGElement: A.SvgElement, SVGGeometryElement: A.SvgElement, SVGGraphicsElement: A.SvgElement, SVGImageElement: A.SvgElement, SVGLineElement: A.SvgElement, SVGLinearGradientElement: A.SvgElement, SVGMarkerElement: A.SvgElement, SVGMaskElement: A.SvgElement, SVGMetadataElement: A.SvgElement, SVGPathElement: A.SvgElement, SVGPatternElement: A.SvgElement, SVGPolygonElement: A.SvgElement, SVGPolylineElement: A.SvgElement, SVGRadialGradientElement: A.SvgElement, SVGRectElement: A.SvgElement, SVGSetElement: A.SvgElement, SVGStopElement: A.SvgElement, SVGStyleElement: A.SvgElement, SVGSVGElement: A.SvgElement, SVGSwitchElement: A.SvgElement, SVGSymbolElement: A.SvgElement, SVGTSpanElement: A.SvgElement, SVGTextContentElement: A.SvgElement, SVGTextElement: A.SvgElement, SVGTextPathElement: A.SvgElement, SVGTextPositioningElement: A.SvgElement, SVGTitleElement: A.SvgElement, SVGUseElement: A.SvgElement, SVGViewElement: A.SvgElement, SVGGradientElement: A.SvgElement, SVGComponentTransferFunctionElement: A.SvgElement, SVGFEDropShadowElement: A.SvgElement, SVGMPathElement: A.SvgElement, SVGElement: A.SvgElement, SVGTransform: A.Transform, SVGTransformList: A.TransformList, AudioBuffer: A.AudioBuffer, AudioParamMap: A.AudioParamMap, AudioTrackList: A.AudioTrackList, AudioContext: A.BaseAudioContext, webkitAudioContext: A.BaseAudioContext, BaseAudioContext: A.BaseAudioContext, OfflineAudioContext: A.OfflineAudioContext});
    hunkHelpers.setOrUpdateLeafTags({WebGL: true, AnimationEffectReadOnly: true, AnimationEffectTiming: true, AnimationEffectTimingReadOnly: true, AnimationTimeline: true, AnimationWorkletGlobalScope: true, AuthenticatorAssertionResponse: true, AuthenticatorAttestationResponse: true, AuthenticatorResponse: true, BackgroundFetchFetch: true, BackgroundFetchManager: true, BackgroundFetchSettledFetch: true, BarProp: true, BarcodeDetector: true, BluetoothRemoteGATTDescriptor: true, Body: true, BudgetState: true, CacheStorage: true, CanvasGradient: true, CanvasPattern: true, CanvasRenderingContext2D: true, Client: true, Clients: true, CookieStore: true, Coordinates: true, Credential: true, CredentialUserData: true, CredentialsContainer: true, Crypto: true, CryptoKey: true, CSS: true, CSSVariableReferenceValue: true, CustomElementRegistry: true, DataTransfer: true, DataTransferItem: true, DeprecatedStorageInfo: true, DeprecatedStorageQuota: true, DeprecationReport: true, DetectedBarcode: true, DetectedFace: true, DetectedText: true, DeviceAcceleration: true, DeviceRotationRate: true, DirectoryEntry: true, webkitFileSystemDirectoryEntry: true, FileSystemDirectoryEntry: true, DirectoryReader: true, WebKitDirectoryReader: true, webkitFileSystemDirectoryReader: true, FileSystemDirectoryReader: true, DocumentOrShadowRoot: true, DocumentTimeline: true, DOMError: true, Iterator: true, DOMMatrix: true, DOMMatrixReadOnly: true, DOMParser: true, DOMPoint: true, DOMPointReadOnly: true, DOMQuad: true, DOMStringMap: true, Entry: true, webkitFileSystemEntry: true, FileSystemEntry: true, External: true, FaceDetector: true, FederatedCredential: true, FileEntry: true, webkitFileSystemFileEntry: true, FileSystemFileEntry: true, DOMFileSystem: true, WebKitFileSystem: true, webkitFileSystem: true, FileSystem: true, FontFace: true, FontFaceSource: true, FormData: true, GamepadButton: true, GamepadPose: true, Geolocation: true, Position: true, GeolocationPosition: true, Headers: true, HTMLHyperlinkElementUtils: true, IdleDeadline: true, ImageBitmap: true, ImageBitmapRenderingContext: true, ImageCapture: true, InputDeviceCapabilities: true, IntersectionObserver: true, IntersectionObserverEntry: true, InterventionReport: true, KeyframeEffect: true, KeyframeEffectReadOnly: true, MediaCapabilities: true, MediaCapabilitiesInfo: true, MediaDeviceInfo: true, MediaError: true, MediaKeyStatusMap: true, MediaKeySystemAccess: true, MediaKeys: true, MediaKeysPolicy: true, MediaMetadata: true, MediaSession: true, MediaSettingsRange: true, MemoryInfo: true, MessageChannel: true, Metadata: true, MutationObserver: true, WebKitMutationObserver: true, MutationRecord: true, NavigationPreloadManager: true, Navigator: true, NavigatorAutomationInformation: true, NavigatorConcurrentHardware: true, NavigatorCookies: true, NavigatorUserMediaError: true, NodeFilter: true, NodeIterator: true, NonDocumentTypeChildNode: true, NonElementParentNode: true, NoncedElement: true, OffscreenCanvasRenderingContext2D: true, OverconstrainedError: true, PaintRenderingContext2D: true, PaintSize: true, PaintWorkletGlobalScope: true, PasswordCredential: true, Path2D: true, PaymentAddress: true, PaymentInstruments: true, PaymentManager: true, PaymentResponse: true, PerformanceEntry: true, PerformanceLongTaskTiming: true, PerformanceMark: true, PerformanceMeasure: true, PerformanceNavigation: true, PerformanceNavigationTiming: true, PerformanceObserver: true, PerformanceObserverEntryList: true, PerformancePaintTiming: true, PerformanceResourceTiming: true, PerformanceServerTiming: true, PerformanceTiming: true, Permissions: true, PhotoCapabilities: true, PositionError: true, GeolocationPositionError: true, Presentation: true, PresentationReceiver: true, PublicKeyCredential: true, PushManager: true, PushMessageData: true, PushSubscription: true, PushSubscriptionOptions: true, Range: true, RelatedApplication: true, ReportBody: true, ReportingObserver: true, ResizeObserver: true, ResizeObserverEntry: true, RTCCertificate: true, RTCIceCandidate: true, mozRTCIceCandidate: true, RTCLegacyStatsReport: true, RTCRtpContributingSource: true, RTCRtpReceiver: true, RTCRtpSender: true, RTCSessionDescription: true, mozRTCSessionDescription: true, RTCStatsResponse: true, Screen: true, ScrollState: true, ScrollTimeline: true, Selection: true, SpeechRecognitionAlternative: true, SpeechSynthesisVoice: true, StaticRange: true, StorageManager: true, StyleMedia: true, StylePropertyMap: true, StylePropertyMapReadonly: true, SyncManager: true, TaskAttributionTiming: true, TextDetector: true, TextMetrics: true, TrackDefault: true, TreeWalker: true, TrustedHTML: true, TrustedScriptURL: true, TrustedURL: true, UnderlyingSourceBase: true, URLSearchParams: true, VRCoordinateSystem: true, VRDisplayCapabilities: true, VREyeParameters: true, VRFrameData: true, VRFrameOfReference: true, VRPose: true, VRStageBounds: true, VRStageBoundsPoint: true, VRStageParameters: true, ValidityState: true, VideoPlaybackQuality: true, VideoTrack: true, VTTRegion: true, WindowClient: true, WorkletAnimation: true, WorkletGlobalScope: true, XPathEvaluator: true, XPathExpression: true, XPathNSResolver: true, XPathResult: true, XMLSerializer: true, XSLTProcessor: true, Bluetooth: true, BluetoothCharacteristicProperties: true, BluetoothRemoteGATTServer: true, BluetoothRemoteGATTService: true, BluetoothUUID: true, BudgetService: true, Cache: true, DOMFileSystemSync: true, DirectoryEntrySync: true, DirectoryReaderSync: true, EntrySync: true, FileEntrySync: true, FileReaderSync: true, FileWriterSync: true, HTMLAllCollection: true, Mojo: true, MojoHandle: true, MojoWatcher: true, NFC: true, PagePopupController: true, Report: true, Request: true, Response: true, SubtleCrypto: true, USBAlternateInterface: true, USBConfiguration: true, USBDevice: true, USBEndpoint: true, USBInTransferResult: true, USBInterface: true, USBIsochronousInTransferPacket: true, USBIsochronousInTransferResult: true, USBIsochronousOutTransferPacket: true, USBIsochronousOutTransferResult: true, USBOutTransferResult: true, WorkerLocation: true, WorkerNavigator: true, Worklet: true, IDBCursor: true, IDBCursorWithValue: true, IDBFactory: true, IDBIndex: true, IDBObjectStore: true, IDBObservation: true, IDBObserver: true, IDBObserverChanges: true, SVGAngle: true, SVGAnimatedAngle: true, SVGAnimatedBoolean: true, SVGAnimatedEnumeration: true, SVGAnimatedInteger: true, SVGAnimatedLength: true, SVGAnimatedLengthList: true, SVGAnimatedNumber: true, SVGAnimatedNumberList: true, SVGAnimatedPreserveAspectRatio: true, SVGAnimatedRect: true, SVGAnimatedString: true, SVGAnimatedTransformList: true, SVGMatrix: true, SVGPoint: true, SVGPreserveAspectRatio: true, SVGRect: true, SVGUnitTypes: true, AudioListener: true, AudioParam: true, AudioTrack: true, AudioWorkletGlobalScope: true, AudioWorkletProcessor: true, PeriodicWave: true, WebGLActiveInfo: true, ANGLEInstancedArrays: true, ANGLE_instanced_arrays: true, WebGLBuffer: true, WebGLCanvas: true, WebGLColorBufferFloat: true, WebGLCompressedTextureASTC: true, WebGLCompressedTextureATC: true, WEBGL_compressed_texture_atc: true, WebGLCompressedTextureETC1: true, WEBGL_compressed_texture_etc1: true, WebGLCompressedTextureETC: true, WebGLCompressedTexturePVRTC: true, WEBGL_compressed_texture_pvrtc: true, WebGLCompressedTextureS3TC: true, WEBGL_compressed_texture_s3tc: true, WebGLCompressedTextureS3TCsRGB: true, WebGLDebugRendererInfo: true, WEBGL_debug_renderer_info: true, WebGLDebugShaders: true, WEBGL_debug_shaders: true, WebGLDepthTexture: true, WEBGL_depth_texture: true, WebGLDrawBuffers: true, WEBGL_draw_buffers: true, EXTsRGB: true, EXT_sRGB: true, EXTBlendMinMax: true, EXT_blend_minmax: true, EXTColorBufferFloat: true, EXTColorBufferHalfFloat: true, EXTDisjointTimerQuery: true, EXTDisjointTimerQueryWebGL2: true, EXTFragDepth: true, EXT_frag_depth: true, EXTShaderTextureLOD: true, EXT_shader_texture_lod: true, EXTTextureFilterAnisotropic: true, EXT_texture_filter_anisotropic: true, WebGLFramebuffer: true, WebGLGetBufferSubDataAsync: true, WebGLLoseContext: true, WebGLExtensionLoseContext: true, WEBGL_lose_context: true, OESElementIndexUint: true, OES_element_index_uint: true, OESStandardDerivatives: true, OES_standard_derivatives: true, OESTextureFloat: true, OES_texture_float: true, OESTextureFloatLinear: true, OES_texture_float_linear: true, OESTextureHalfFloat: true, OES_texture_half_float: true, OESTextureHalfFloatLinear: true, OES_texture_half_float_linear: true, OESVertexArrayObject: true, OES_vertex_array_object: true, WebGLProgram: true, WebGLQuery: true, WebGLRenderbuffer: true, WebGLRenderingContext: true, WebGL2RenderingContext: true, WebGLSampler: true, WebGLShader: true, WebGLShaderPrecisionFormat: true, WebGLSync: true, WebGLTexture: true, WebGLTimerQueryEXT: true, WebGLTransformFeedback: true, WebGLUniformLocation: true, WebGLVertexArrayObject: true, WebGLVertexArrayObjectOES: true, WebGL2RenderingContextBase: true, ArrayBuffer: true, ArrayBufferView: false, DataView: true, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false, HTMLAudioElement: true, HTMLBRElement: true, HTMLButtonElement: true, HTMLCanvasElement: true, HTMLContentElement: true, HTMLDListElement: true, HTMLDataElement: true, HTMLDataListElement: true, HTMLDetailsElement: true, HTMLDialogElement: true, HTMLDivElement: true, HTMLEmbedElement: true, HTMLFieldSetElement: true, HTMLHRElement: true, HTMLHeadElement: true, HTMLHeadingElement: true, HTMLHtmlElement: true, HTMLIFrameElement: true, HTMLImageElement: true, HTMLInputElement: true, HTMLLIElement: true, HTMLLabelElement: true, HTMLLegendElement: true, HTMLLinkElement: true, HTMLMapElement: true, HTMLMediaElement: true, HTMLMenuElement: true, HTMLMetaElement: true, HTMLMeterElement: true, HTMLModElement: true, HTMLOListElement: true, HTMLObjectElement: true, HTMLOptGroupElement: true, HTMLOptionElement: true, HTMLOutputElement: true, HTMLParagraphElement: true, HTMLParamElement: true, HTMLPictureElement: true, HTMLPreElement: true, HTMLProgressElement: true, HTMLQuoteElement: true, HTMLShadowElement: true, HTMLSlotElement: true, HTMLSourceElement: true, HTMLSpanElement: true, HTMLStyleElement: true, HTMLTableCaptionElement: true, HTMLTableCellElement: true, HTMLTableDataCellElement: true, HTMLTableHeaderCellElement: true, HTMLTableColElement: true, HTMLTextAreaElement: true, HTMLTimeElement: true, HTMLTitleElement: true, HTMLTrackElement: true, HTMLUListElement: true, HTMLUnknownElement: true, HTMLVideoElement: true, HTMLDirectoryElement: true, HTMLFontElement: true, HTMLFrameElement: true, HTMLFrameSetElement: true, HTMLMarqueeElement: true, HTMLElement: false, AccessibleNodeList: true, HTMLAnchorElement: true, HTMLAreaElement: true, HTMLBaseElement: true, Blob: false, HTMLBodyElement: true, CDATASection: true, CharacterData: true, Comment: true, ProcessingInstruction: true, Text: true, CSSPerspective: true, CSSCharsetRule: true, CSSConditionRule: true, CSSFontFaceRule: true, CSSGroupingRule: true, CSSImportRule: true, CSSKeyframeRule: true, MozCSSKeyframeRule: true, WebKitCSSKeyframeRule: true, CSSKeyframesRule: true, MozCSSKeyframesRule: true, WebKitCSSKeyframesRule: true, CSSMediaRule: true, CSSNamespaceRule: true, CSSPageRule: true, CSSRule: true, CSSStyleRule: true, CSSSupportsRule: true, CSSViewportRule: true, CSSStyleDeclaration: true, MSStyleCSSProperties: true, CSS2Properties: true, CSSImageValue: true, CSSKeywordValue: true, CSSNumericValue: true, CSSPositionValue: true, CSSResourceValue: true, CSSUnitValue: true, CSSURLImageValue: true, CSSStyleValue: false, CSSMatrixComponent: true, CSSRotation: true, CSSScale: true, CSSSkew: true, CSSTranslation: true, CSSTransformComponent: false, CSSTransformValue: true, CSSUnparsedValue: true, CustomEvent: true, DataTransferItemList: true, XMLDocument: true, Document: false, DOMException: true, DOMImplementation: true, ClientRectList: true, DOMRectList: true, DOMRectReadOnly: false, DOMStringList: true, DOMTokenList: true, MathMLElement: true, Element: false, AbortPaymentEvent: true, AnimationEvent: true, AnimationPlaybackEvent: true, ApplicationCacheErrorEvent: true, BackgroundFetchClickEvent: true, BackgroundFetchEvent: true, BackgroundFetchFailEvent: true, BackgroundFetchedEvent: true, BeforeInstallPromptEvent: true, BeforeUnloadEvent: true, BlobEvent: true, CanMakePaymentEvent: true, ClipboardEvent: true, CloseEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PopStateEvent: true, PresentationConnectionAvailableEvent: true, PresentationConnectionCloseEvent: true, PromiseRejectionEvent: true, PushEvent: true, RTCDataChannelEvent: true, RTCDTMFToneChangeEvent: true, RTCPeerConnectionIceEvent: true, RTCTrackEvent: true, SecurityPolicyViolationEvent: true, SensorErrorEvent: true, SpeechRecognitionError: true, SpeechRecognitionEvent: true, SpeechSynthesisEvent: true, StorageEvent: true, SyncEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, SubmitEvent: false, AbsoluteOrientationSensor: true, Accelerometer: true, AccessibleNode: true, AmbientLightSensor: true, Animation: true, ApplicationCache: true, DOMApplicationCache: true, OfflineResourceList: true, BackgroundFetchRegistration: true, BatteryManager: true, BroadcastChannel: true, CanvasCaptureMediaStreamTrack: true, EventSource: true, FileReader: true, FontFaceSet: true, Gyroscope: true, LinearAccelerationSensor: true, Magnetometer: true, MediaDevices: true, MediaKeySession: true, MediaQueryList: true, MediaRecorder: true, MediaSource: true, MediaStream: true, MediaStreamTrack: true, MIDIAccess: true, MIDIInput: true, MIDIOutput: true, MIDIPort: true, NetworkInformation: true, Notification: true, OffscreenCanvas: true, OrientationSensor: true, PaymentRequest: true, Performance: true, PermissionStatus: true, PresentationAvailability: true, PresentationConnection: true, PresentationConnectionList: true, PresentationRequest: true, RelativeOrientationSensor: true, RemotePlayback: true, RTCDataChannel: true, DataChannel: true, RTCDTMFSender: true, RTCPeerConnection: true, webkitRTCPeerConnection: true, mozRTCPeerConnection: true, ScreenOrientation: true, Sensor: true, ServiceWorker: true, ServiceWorkerContainer: true, ServiceWorkerRegistration: true, SharedWorker: true, SpeechRecognition: true, webkitSpeechRecognition: true, SpeechSynthesis: true, SpeechSynthesisUtterance: true, VR: true, VRDevice: true, VRDisplay: true, VRSession: true, VisualViewport: true, WebSocket: true, Worker: true, WorkerPerformance: true, BluetoothDevice: true, BluetoothRemoteGATTCharacteristic: true, Clipboard: true, MojoInterfaceInterceptor: true, USB: true, IDBDatabase: true, IDBOpenDBRequest: true, IDBVersionChangeRequest: true, IDBRequest: true, IDBTransaction: true, AnalyserNode: true, RealtimeAnalyserNode: true, AudioBufferSourceNode: true, AudioDestinationNode: true, AudioNode: true, AudioScheduledSourceNode: true, AudioWorkletNode: true, BiquadFilterNode: true, ChannelMergerNode: true, AudioChannelMerger: true, ChannelSplitterNode: true, AudioChannelSplitter: true, ConstantSourceNode: true, ConvolverNode: true, DelayNode: true, DynamicsCompressorNode: true, GainNode: true, AudioGainNode: true, IIRFilterNode: true, MediaElementAudioSourceNode: true, MediaStreamAudioDestinationNode: true, MediaStreamAudioSourceNode: true, OscillatorNode: true, Oscillator: true, PannerNode: true, AudioPannerNode: true, webkitAudioPannerNode: true, ScriptProcessorNode: true, JavaScriptAudioNode: true, StereoPannerNode: true, WaveShaperNode: true, EventTarget: false, File: true, FileList: true, FileWriter: true, HTMLFormElement: true, Gamepad: true, History: true, HTMLCollection: true, HTMLFormControlsCollection: true, HTMLOptionsCollection: true, HTMLDocument: true, XMLHttpRequest: true, XMLHttpRequestUpload: true, XMLHttpRequestEventTarget: false, ImageData: true, KeyboardEvent: true, Location: true, MediaList: true, MessageEvent: true, MessagePort: true, MIDIInputMap: true, MIDIOutputMap: true, MimeType: true, MimeTypeArray: true, DocumentFragment: true, ShadowRoot: true, DocumentType: true, Node: false, NodeList: true, RadioNodeList: true, Plugin: true, PluginArray: true, ProgressEvent: true, ResourceProgressEvent: true, RTCStatsReport: true, HTMLScriptElement: true, HTMLSelectElement: true, SharedArrayBuffer: true, SourceBuffer: true, SourceBufferList: true, SpeechGrammar: true, SpeechGrammarList: true, SpeechRecognitionResult: true, Storage: true, CSSStyleSheet: true, StyleSheet: true, HTMLTableElement: true, HTMLTableRowElement: true, HTMLTableSectionElement: true, HTMLTemplateElement: true, TextTrack: true, TextTrackCue: true, VTTCue: true, TextTrackCueList: true, TextTrackList: true, TimeRanges: true, Touch: true, TouchList: true, TrackDefaultList: true, CompositionEvent: true, FocusEvent: true, MouseEvent: true, DragEvent: true, PointerEvent: true, TextEvent: true, TouchEvent: true, WheelEvent: true, UIEvent: false, URL: true, VideoTrackList: true, Window: true, DOMWindow: true, DedicatedWorkerGlobalScope: true, ServiceWorkerGlobalScope: true, SharedWorkerGlobalScope: true, WorkerGlobalScope: true, Attr: true, CSSRuleList: true, ClientRect: true, DOMRect: true, GamepadList: true, NamedNodeMap: true, MozNamedAttrMap: true, SpeechRecognitionResultList: true, StyleSheetList: true, IDBKeyRange: true, SVGLength: true, SVGLengthList: true, SVGNumber: true, SVGNumberList: true, SVGPointList: true, SVGScriptElement: true, SVGStringList: true, SVGAElement: true, SVGAnimateElement: true, SVGAnimateMotionElement: true, SVGAnimateTransformElement: true, SVGAnimationElement: true, SVGCircleElement: true, SVGClipPathElement: true, SVGDefsElement: true, SVGDescElement: true, SVGDiscardElement: true, SVGEllipseElement: true, SVGFEBlendElement: true, SVGFEColorMatrixElement: true, SVGFEComponentTransferElement: true, SVGFECompositeElement: true, SVGFEConvolveMatrixElement: true, SVGFEDiffuseLightingElement: true, SVGFEDisplacementMapElement: true, SVGFEDistantLightElement: true, SVGFEFloodElement: true, SVGFEFuncAElement: true, SVGFEFuncBElement: true, SVGFEFuncGElement: true, SVGFEFuncRElement: true, SVGFEGaussianBlurElement: true, SVGFEImageElement: true, SVGFEMergeElement: true, SVGFEMergeNodeElement: true, SVGFEMorphologyElement: true, SVGFEOffsetElement: true, SVGFEPointLightElement: true, SVGFESpecularLightingElement: true, SVGFESpotLightElement: true, SVGFETileElement: true, SVGFETurbulenceElement: true, SVGFilterElement: true, SVGForeignObjectElement: true, SVGGElement: true, SVGGeometryElement: true, SVGGraphicsElement: true, SVGImageElement: true, SVGLineElement: true, SVGLinearGradientElement: true, SVGMarkerElement: true, SVGMaskElement: true, SVGMetadataElement: true, SVGPathElement: true, SVGPatternElement: true, SVGPolygonElement: true, SVGPolylineElement: true, SVGRadialGradientElement: true, SVGRectElement: true, SVGSetElement: true, SVGStopElement: true, SVGStyleElement: true, SVGSVGElement: true, SVGSwitchElement: true, SVGSymbolElement: true, SVGTSpanElement: true, SVGTextContentElement: true, SVGTextElement: true, SVGTextPathElement: true, SVGTextPositioningElement: true, SVGTitleElement: true, SVGUseElement: true, SVGViewElement: true, SVGGradientElement: true, SVGComponentTransferFunctionElement: true, SVGFEDropShadowElement: true, SVGMPathElement: true, SVGElement: false, SVGTransform: true, SVGTransformList: true, AudioBuffer: true, AudioParamMap: true, AudioTrackList: true, AudioContext: true, webkitAudioContext: true, BaseAudioContext: false, OfflineAudioContext: true});
    A.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
    A._SourceBufferList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
    A._TextTrackList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
  })();
  Function.prototype.call$0 = function() {
    return this();
  };
  Function.prototype.call$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$1$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$6 = function(a, b, c, d, e, f) {
    return this(a, b, c, d, e, f);
  };
  Function.prototype.call$1$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$2$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$1$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$0 = function() {
    return this();
  };
  Function.prototype.call$1$0 = function() {
    return this();
  };
  convertAllToFastObject(holders);
  convertToFastObject($);
  (function(callback) {
    if (typeof document === "undefined") {
      callback(null);
      return;
    }
    if (typeof document.currentScript != "undefined") {
      callback(document.currentScript);
      return;
    }
    var scripts = document.scripts;
    function onLoad(event) {
      for (var i = 0; i < scripts.length; ++i)
        scripts[i].removeEventListener("load", onLoad, false);
      callback(event.target);
    }
    for (var i = 0; i < scripts.length; ++i)
      scripts[i].addEventListener("load", onLoad, false);
  })(function(currentScript) {
    init.currentScript = currentScript;
    var callMain = A.main;
    if (typeof dartMainRunner === "function")
      dartMainRunner(callMain, []);
    else
      callMain([]);
  });
})();
